Hay veces que hay ataques que parecen magia. El SMB Relay es uno de esos. Cuando lo ves bien ejecutado, y no sabes que esta pasando por el cacumen de la maquina lo primero que piensas es… ¿Cómo es posible?
Y es que parece un conjuro sacado de algún grimorio polvoriento…un par de comandos en un par de consolas et voila, estamos dentro, como dicen esos hackers de las películas que teclean muy rápido contraseñas como si no tuvieran software que lo haga por ellos, pobrecillos.
Como ya habréis podido deducir, no es un ataque complejo, al menos su realización. Lo que ya requiere darle más a la cabeza es entender que ocurre, el porque esa misteriosa letanía obra tal grato milagro en forma de acceso instantáneo.
Para ello, tenemos que inevitablemente hablar, de protocolos.
Una épica historia en SMB Relay
No os voy a soltar el típico rollo para definir los protocolos implicados, quien quiera algo oficial, puede irse a Wikipedia que esta mucho mejor explicado, pero si voy a contaros que ocurre cuando queremos acceder a un recurso compartido que esta en un equipo que no es el nuestro.
Lo primero que necesita nuestra máquina, es saber como se llega a ese recurso, del cual solo tiene el nombre, y para darle un aire más místico a todo el asunto les daremos unos nombres acorde a las circunstancias.
Dramatis personaje:
FRODO: Nuestra máquina.
GANDALF: El servidor de ficheros.
SAM: El servidor DNS.
GOLLUM: El hacker.
Al principio todo es paz y amor en la Comarca.
FRODO no suele saber por donde anda GANDALF, ya que siempre esta en alguna loma fumando esa hierba que suelen llevar los magos en uno de sus múltiples bolsillos, y para ello le pregunta a SAM, en forma de petición DNS, que siempre sabe donde esta todo el mundo porque es el jardinero del pueblo.
SAM le responde a su amigo FRODO y le indica que este anda por 192.168.0.58. De esta forma cuando FRODO quiere pedirle el anillo único a GANDALF, ya sabe donde ir para solicitarle tan temible joya.
Ahora FRODO ya puede enviarle un mensaje a GANDALF para decirle que quiere el anillo único para “una movida de un volcán”.
Hasta aquí, todo estupendo.
¿Pero que pasa cuando SAM no esta? Aquí la cosa se complica.
Hay muchos motivos por los cuales esto puede ocurrir. Puede ser que aunque SAM es un tipo muy bien informado, nunca haya escrito en su lista donde esta GANDALF.
Si el DNS no tiene en su registro la ip asociada a cierto nombre de domino…no podrá resolverla.
También existe la posibilidad de que alguien este distrayendo a propósito a SAM para que no le de tiempo a contestar a las preguntas de FRODO, o poniendo música a todo trapo al lado de su casa para que este sea incapaz de escuchar sus preguntas.
Denegar el servicio de DNS, ya sea mediante inundación de trafico, o simplemente con un ataque de arp spoofing para que este sea incapaz de contestar, son medidas que alguien con malas intenciones podría realizar.
Finalmente es posible que FRODO entre toda la emoción de ir a pedirle el anillo unico a GANDALF lo llame PANDALF equivocándose en el nombre, y todos sabemos que GANDALF es un mago muy quisquilloso, y si te equivocas en su nombre no te hace ningún caso.
Cuando alguien solicita acceso a un recurso compartido cuyo nombre esta equivocado y no existe, nadie consigue resolver esa entrada.
Entonces repito. ¿Qué ocurre si SAM no esta? La respuesta esta muy clara, a FRODO no le queda otro remedio que ponerse a gritar por todo el pueblo a ver si alguien le contesta.
Esto implica que en ausencia de DNS, pasamos al protocolo LLMNR, que es un protocolo de resolución de broadcast.
Es a partir de aquí cuando entra en juego GOLLUM. En cuanto escucha a FRODO gritar por todos los lados buscando a GANDALF, el pega un grito y responde poniendo voz grave:
-¡Aquí estoy estimado compañero! ¿Qué quieresssss?
Y FRODO responde:
-Please, dame el anillo único.
Y GOLLUM en simultaneo le dice a GANDALF:
-Hooola GANDALF, soy FRODO, dame el tesssoro…quiero decir, el anillo único.
Y GANDALF le responde:
-Si eres FRODO, dime la contraseña que acordamos y usa la palabra “pepinillos” para cifrarla en el lenguaje elfico.
Obteniendo de esta forma el “challenge” necesario para la comunicación.
Entonces con la palabra “pepinillos” en su poder, GOLLUM le dice a FRODO:
-Claaro…amigo. ¿Cuál es la contraseña que acordamos? Cifrala en elfico con la palabra “pepinillos”.
-Claro, aquí tienes, mi contraseña cifrada en elfico es: “[pepinillos]FrodoBolson!”.
Y en este momento, es cuando se obra la magia…el avido GOLLUM le dice a GANDALF:
-Sssssi, mi contrasssseña essss “[pepinillos]FrodoBolson!” .
Con la contraseña cifrada con el challenge adecuado, ya podemos acceder al recurso. Si el usuario tiene privilegios de administrador sobre la máquina, también podrá ejecutar comandos remotamente, los cuales usamos para abrir una shell de sistema.
Y ya lo tenemos. GOLLUM con el anillo único.
El proceso
Como veis, hay un gran trasiego de dimes y diretes, de engaño y suplantación. Y la clave más importante, es que el que solicita un recurso no pueda resolverlo, para que de esta forma, respondiendo a sus paquetes LLMNR de broadcast, nosotros podamos obtener su hash NTLMv2 cifrado con el challenge de la maquina a la que queremos acceder.
Esto puede ocurrir de las formas que hemos citado, ya sea denegando el servicio al DNS, equivocándose el usuario al escribir (os sorprendería la cantidad de veces que esto ocurre) o simplemente teniendo mapeada alguna unidad de red antigua que ahora no esta online.
El proceso para realizar este ataque es mucho menos místico que toda la magia que ocurre por debajo. Para ello haremos uso de las maravillosas herramientas de Laurent Gaffie, las cuales vienen de serie en Kali.
Lo primero que deberemos hacer, será editar /usr/share/responder/Responder.conf para asegurarnos que la parte que muestro en la imagen siguiente, esta de esa manera.
![SMB Relay](https://globalt4e.com/wp-content/uploads/2020/04/SMB-Relay-1.png)
Después, le decimos a Responder que se ponga a la escucha, solo necesitamos saber cual es nuestra interface, en nuestro caso, eth0:
responder -I eth0 -rv exec bash
Después de una pantalla de bienvenida, empezaremos a interceptar peticiones.
![SMB Relay responder](https://globalt4e.com/wp-content/uploads/2020/04/SMB-Relay-responder-1.png)
Estas peticiones de broadcast son las que Responder se encarga de interceptar y responder (tal y como su nombre indica) solicitándole la password para que la victima filtre sus credenciales NTLMv2:
![SMB Relay broadcast](https://globalt4e.com/wp-content/uploads/2020/04/SMB-Relay-broadcast.png)
Una vez montado todo esto, necesitamos algo que se encargue de reinsertar esas credenciales en la maquina víctima. Para eso esta Multirelay.
Lo tenemos en /usr/share/responder/tools/ y el recibirá las credenciales interceptadas y las reinsertará en la maquina a nuestra elección.
Para lanzarlo únicamente debemos usar la siguiente sintaxis:
python MultiRelay.py -t DIRECCION_IP_VICTIMA -u ALL
¿Pero como elegimos adecuadamente la victima? La forma más sencilla es utilizar otra de las herramientas disponibles, disponible en /usr/share/responder/tools/ : RunFinger. Esta herramienta busca en el segmento de red que le digamos, maquinas que tengan SMB Signing desactivado, que son aquellas que no van a exigir medidas adicionales de autenticación que impedirían realizar este ataque.
python RunFinger.py -i SEGMENTO_A_BUSCAR
Eso nos mostrará una lista con todas las maquinas de la red disponibles y dirá, entre otras cosas, si poseen SMB signing o no. Esto nos permitirá elegir una en la que el ataque sea viable. Normalmente suele estar desactivado por defecto, excepto en aquellas maquinas que poseen el rol de controlador de dominio.
![SMB Relay runfinger](https://globalt4e.com/wp-content/uploads/2020/04/SMB-Relay-runfinger-1.png)
![SMB Relay MultiRelay](https://globalt4e.com/wp-content/uploads/2020/04/SMB-Relay-MultiRelay-1.png)
Una vez hecho esto, solo queda esperar. Esperar que alguien envíe una petición LLMNR en busca de un recurso que no ha podido resolver, porque de esta manera, podremos responder nosotros y pedirle las credenciales.
![SMB Relay](https://globalt4e.com/wp-content/uploads/2020/04/SMB-Relay-2-1.png)
![SMB Relay](https://globalt4e.com/wp-content/uploads/2020/04/SMB-Relay-3-1.png)
Esto es lo que recibe el incauto que se ha equivocado al escribir. Nada muy raro. Pero esto es lo que en realidad ocurre entre bambalinas. La petición es interceptada por nosotros y respondida, solicitando que las credenciales sean cifradas con el challenge de la maquina a la que queremos acceder.
![SMB Relay](https://globalt4e.com/wp-content/uploads/2020/04/SMB-Relay-4.png)
Y una vez hecho esto, solo resta reinsertarlas felizmente, obteniendo una preciosa shell:
![SMB Relay Shell](https://globalt4e.com/wp-content/uploads/2020/04/SMB-Relay-Shell-1.png)
Ya os dije que no tenía mucho misterio. La clave era entender que había pasado. Una vez alcanzado este nivel de compromiso ya solo queda actuar a gusto del consumidor.
Yo suelo crearme un usuario administrador y meterlo en el grupo de escritorio remoto, pero el limite es vuestra imaginación, jugando con las opciones del Multirelay podéis hacer que en vez de volcaros una shell ejecute un comando en la maquina remota.
Algunos despliegan agentes de Empire de esta manera…pero tal y como diría Michael Ende esa es otra historia que debe ser contada en otra ocasión.
Consultor de Ciberseguridad y Responsable del Departamento de Auditoría y Pentesting en Global Technology