
Ampliar la visibilidad de la red desde múltiples puntos de vista de otros hosts
En la guerra, CornerShot es un arma que permite a un soldado mirar más allá de una esquina (y posiblemente disparar) sin arriesgarse a ser expuesto. De manera similar, el paquete CornerShot permite observar el acceso de red de un host remoto sin necesidad de tener privilegios especiales en ese host.
Usando CornerShot, una fuente, con acceso de red a carrier, puede determinar si existe acceso de red entre el carrier y el target para un puerto específico p.
Por ejemplo, supongamos que un equipo rojo intenta propagarse desde un host fuente A "comprometido" a un host destino X, al cual el host A no tiene acceso. Si se propagan a través del host B, solo entonces descubrirán que no hay acceso de red entre el host B y X.
Usando CornerShot, el equipo puede descubrir que el host C realmente tiene acceso al destino X, por lo que la propagación hacia el destino X debe pasar primero por el host C.
+-----+ +-----+ +-----+
| | | | filtered | |
| A +--------> B +----X--->(p) X |
| | | | | |
+-----+ +-----+ +-(p)-+
source carrier target
+ ^
| |
| +-----+ |
| | | open |
+---------->+ C +-------------+
| |
+-----+
De manera similar a nmap, CornerShot diferencia entre los siguientes estados de puertos: open, closed, filtered y unknown (si no se puede determinar).
La siguiente demostración muestra la ejecución de CornerShot contra dos hosts carriers 172.0.1.12 y 172.0.1.13, para determinar si tienen acceso de red a 192.168.200.1:

Lea más aquí.
La tarea aparentemente simple de identificar si algún host B en la red tiene acceso al host C puede requerir un gran despliegue de sensores de red, agentes de dispositivos o la recopilación de una multitud de reglas de firewall, configuraciones de enrutadores y políticas de host.
CornerShot puede simplificar este proceso usando uno (o muy pocos) agentes que puedan consultar a otros hosts en la red para determinar su acceso a hosts remotos.
Los equipos de seguridad que utilizan BloodHound para encontrar y mitigar rutas de escalada de privilegios dentro de su red a menudo luchan con millones de rutas lógicas descubiertas por BloodHound.
ShotHound es una herramienta que integra CornerShot con BloodHound para descubrir rutas prácticas respaldadas por acceso de red.
CornerShot se puede usar como un paquete o como un módulo independiente. Los únicos requisitos son Python 3 y el paquete impacket.
pip install cornershot
El uso básico requiere credenciales de un usuario de dominio válido, un nombre de dominio FQDN, una IP de carrier y una IP de destino.
python -m cornershot <user> <password> <domain> <carrier> <target>
Para escanear un rango de carriers contra un rango de destinos, se pueden usar subredes o rangos de IP en una lista delimitada por comas:
python -m cornershot <user> <password> <domain> 192.168.1.10-192.168.1.20 192.168.5.0/24,192.168.6.0/24
Por defecto, CornerShot intentará escanear los siguientes puertos: 135, 445, 3389, 5985, 5986. El usuario puede proporcionar una lista delimitada por comas de puertos y rangos de puertos:
python -m cornershot -tp 22,8080,45000-45005 <user> <password> <domain> <carrier> <target>
Dentro del código, es necesario instanciar un objeto CornerShot con el nombre de usuario, contraseña y nombre de dominio de un usuario de dominio válido. Agregar carriers, destinos y puertos se logra mediante el método add_shots. Una vez listo, se puede llamar al método open_fire, que realiza solo las llamadas RPC relevantes según los puertos requeridos.
from cornershot import CornerShot
cs = CornerShot("username", "password", "fqdn")
cs.add_shots(carriers=["192.168.1.1"],targets=["192.168.1.2","192.168.1.3"])
results = cs.open_fire()
El resultado de open_fire es un diccionario con claves de carriers, cada carrier tiene otro conjunto de claves para destinos y, finalmente, cada destino contiene un diccionario de puertos y sus respectivos estados. Este es un formato de ejemplo de un resultado:
{'carrier_1':
{'target_1':
{135: 'unknown', 445: 'filtered', 3389: 'filtered', 5986: 'filtered', 5985: 'filtered'},
'target_2':
{135: 'unknown', 445: 'open', 5985: 'unknown', 5986: 'filtered', 3389: 'open'}
},
'carrier_2':
{'target_1':
{3389: 'filtered', 135: 'filtered', 5985: 'filtered', 445: 'filtered', 5986: 'unknown'},
'target_2':
{5985: 'filtered', 5986: 'filtered', 445: 'filtered', 135: 'filtered', 3389: 'open'}
}
}
CornerShot se basa en varios métodos de Llamada a Procedimiento Remoto (RPC) estándar y bien documentados utilizados por varios servicios de Microsoft. Al usar métodos que solo requieren una cuenta autenticada en el dominio, CornerShot puede desencadenar tráfico de red desde un host carrier hacia un destino.
CornerShot puede determinar el estado del puerto remoto midiendo el tiempo que tomó una llamada RPC y utilizando diferentes códigos de error para cada método RPC.
El lector puede estar familiarizado con el "printer bug", que fue descubierto por Lee Christensen. Aunque se le llama error, es un comportamiento bien documentado del servicio de impresión, que permite a cualquier usuario autenticado coaccionar a un servidor remoto para que se autentique en cualquier máquina usando el método RpcRemoteFindFirstPrinterChangeNotificationEx.
CornerShot utiliza los siguientes métodos RPC de varios protocolos de Microsoft (hay muchos métodos adicionales que se implementarán en versiones futuras):
La implementación de los protocolos en sí se logra mediante el magnífico paquete impacket.