Приветствую, Кодебай! Сегодня мы пройдём линуксовую машину легкой сложности с
HackTheBox
, которая посвящена двум миллионам зарегистрировавшимся пользователям. Приятного чтения Разведка
Как всегда начинаем со сканирования портов. Используем флаг
-sC
, чтобы использовать стандартные скрипты, -sV
, чтобы определить сервисы открытых портов:Когда мы переходим на
80
порт, то нас встречает следующее окно:В таком случае нужно внести
IP
-адрес и домен в /etc/hosts
.Советую вместо
sudo echo
(который не работает):Использовать
echo
вместе с sudo tee
:Теперь мы можем попасть на веб-сервис:
Это оказалась старая версия
HackTheBox
с древним интерфейсом. Тут есть страница логина и регистрации:Страница регистрации требует пригласительного кода:
Насколько я помню раньше на
HackTheBox
нельзя было так просто зарегистрироваться, как на любых других сервисах. Требовалось получить пригласительный код от друга. Это был рэбит хол, то есть никаких кодов у друзей, которые уже зарегистрировались на платформе, нет. Тут нужно искать этот код на самом сайте в js
-файлах.Что ж, приступим. Открываем исходный код страницы
http://2million.htb/register
и видим /js/inviteapi.min.js
:Смотрим исходный код
js
-файла:Весь код зашифрован и идёт в одну строку, следовательно, нам нужно его как-то преобразовать в читаемый для человека вид. Советую использовать любой
JS Beautifier
:После того, как расшифровали код мы получили несколько путей, куда можно отправить
POST
-запрос:/api/v1/invite/verify
- скорее всего для подтверждения invite-кода/api/v1/invite/how/to/generate
- скорее всего инструкция, как сделать, соответственно, этот инвайт-код.Для начала посмотрим инструкцию. Отправим
POST
-запрос с помощью инструмента curl
:
Bash:
curl -X POST http://2million.htb/api/v1/invite/how/to/generate
Вывалился
JSON
в ответе:
JSON:
{
"0": 200,
"success": 1,
"data": {
"data": "Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb /ncv/i1/vaivgr/trarengr",
"enctype": "ROT13"
},
"hint": "Data is encrypted ... We should probbably check the encryption type in order to decrypt it..."
}
Есть
data
- зашифрованная строка и enctype
- алгоритм шифрования ROT13
. Очевидно, что это шифр Цезаря:Нам говорят, что нужно отправить
POST
-запрос на /api/v1/invite/generate
, чтобы сгенерировать invite
-код. Опять же используем curl
:
Bash:
curl -X POST http://2million.htb/api/v1/invite/generate
JSON:
{
"0": 200,
"success": 1,
"data": {
"code": "Mk9QSzAtN1pMUzgtVUxZSUstUTA5WU4=",
"format": "encoded"
}
}
Мы получили код, который был зашифрован в
base64
. Его можно расшифровать через base64
из терминала:
Bash:
echo "Mk9QSzAtN1pMUzgtVUxZSUstUTA5WU4=" | base64 -d
На
/register
ввести код нельзя, следовательно, нужно искать другой путь. Я нашёл страницу /invite
и ввёл код:И меня перенаправило на
/register
с уже введённым кодом:Я ввёл остальные данные - юзернейм, электронную почту и пароль, а затем нажал на кнопку
Register
, после чего меня перенаправило на страницу /login
:После авторизации открылся, опять же, старый интерфейс
HackTheBox
:На
/home/access
мы можем скачать наш VPN
-конфиг или перегенерировать:Давайте посмотрим, что возвращает страница при
GET
-запросе на /api/v1/user/vpn/generate
(кнопка Connection Pack
):Не забываем указать заголовок с куками в курле. Чтобы посмотреть куки, можно нажать кнопку
F12
(Firefox
) и перейти в Storage->Cookies->http://2million.htb
:Теперь указываем опцию
-H
(доп. HTTP
-заголовок) и отправляем запрос на /api/v1/user/vpn/generate
:Видим наш
VPN
-конфиг, пока что ничего полезного.Далее я перешёл для удобства в
BurpSuite
и отправил GET
-запрос на /api/v1
:
JSON:
{
"v1": {
"user": {
"GET": {
"/api/v1": "Route List",
"/api/v1/invite/how/to/generate": "Instructions on invite code generation",
"/api/v1/invite/generate": "Generate invite code",
"/api/v1/invite/verify": "Verify invite code",
"/api/v1/user/auth": "Check if user is authenticated",
"/api/v1/user/vpn/generate": "Generate a new VPN configuration",
"/api/v1/user/vpn/regenerate": "Regenerate VPN configuration",
"/api/v1/user/vpn/download": "Download OVPN file"
},
"POST": {
"/api/v1/user/register": "Register a new user",
"/api/v1/user/login": "Login with existing user"
}
},
"admin": {
"GET": {
"/api/v1/admin/auth": "Check if user is admin"
},
"POST": {
"/api/v1/admin/vpn/generate": "Generate VPN for specific user"
},
"PUT": {
"/api/v1/admin/settings/update": "Update user settings"
}
}
}
}
В ответе были разные
API
-пути. Тут уже примерно стало понятно, как эксплуатировать:- Пути с
/v1/user
нам не нужны. Нужны пути с/v1/admin
. - Есть путь с
GET
-запросом/api/v1/admin/auth
- он, судя по всему, без каких-либо параметров проверяет авторизован ли пользователь как админ (через куки). - Есть путь с
POST
-запросом/api/v1/admin/vpn/generate
- похоже, что с помощью него можно сгенерироватьVPN
-конфиг для любого пользователя от лица, опять же, админа. - Есть путь с
PUT
-запросом/api/v1/admin/settings/update
- он обновляет настройки пользователя. Скорее всего через него мы можем повысить привилегии.
Попробуем обновить настройки для нашего пользователя, отправляем
PUT
-запрос на /api/v1/admin/settings/update
:В ответе нам приходит сообщение, что у нас неправильный
Content-Type
заголовок. Хорошо, добавим его со значением application/json
(т. е. данные мы будем передавать в JSON
-формате):Немного продвинулись, теперь не хватает электронной почты, добавим наш
email
в JSON
'е:И добавим
is_admin
(понять какой тип данных используется можно методом перебора):Отлично, кажется, мы повысили наши привилегии, проверим это:
Супер. Возвращаемся к нашему списку, что мы ещё не заимодействовали?:
Пути с/v1/user
нам не нужны. Нужны пути с/v1/admin
.Есть путь сGET
-запросом/api/v1/admin/auth
- он, судя по всему, без каких-либо параметров проверяет авторизован ли пользователь как админ (через куки).- Есть путь с
POST
-запросом/api/v1/admin/vpn/generate
- похоже, что с помощью него можно сгенерироватьVPN
-конфиг для любого пользователя от лица, опять же, админа. Есть путь сPUT
-запросом/api/v1/admin/settings/update
- он обновляет настройки пользователя. Скорее всего через него мы можем повысить привилегии.
Теперь мы можем сделать
VPN
для юзеров:Опять же, методом тыка проверяем какие параметры используются в
POST
-запросе, хорошо, что респонс нам подсказывает - не хватает юзернейма. Добавляем его:Такой вывод я уже видел ранее (от лица обычного пользователя), но тут мы можем указать юзернейм. Возможно, используется какая-нибудь "опасная" функция, где нет фильтрации и мы можем получить
RCE
?Получили
RCE
. Теперь давайте пробросим шелл (советую для удобства использовать
Ссылка скрыта от гостей
):Шелл получен, сразу апгрейдим оболочку через
python3
:
Bash:
python3 -c 'import pty;pty.spawn("/bin/bash");'
Взятие пользователя
В домашней директории пользователя
www-data
можно обнаружить .env
файл. В нём лежали креды:
Код:
DB_USERNAME=admin
DB_PASSWORD=SuperDuperPass123
Не проверить их на пользователе
admin
через SSH
, который располагается в /home
, было бы глупо:
Bash:
ssh admin@2million.htb
Взятие рута
Мы можем взять флаг пользователя и нужно искать методы повышения привилегий. В
/var/mail/admin
мы можем найти следующее письмо:Тут говорится о нескольких
CVE
для ядра линукс, которые появились в этом году и что-то есть в OverlayFS / Fuse
. Гуглим:CVE-2023-0386
- то, что нам нужно. Так как машина лёгкого уровня, то берём уже готовый эксплоит с GitHub'а
:
GitHub - xkaneiki/CVE-2023-0386: CVE-2023-0386在ubuntu22.04上的提权
CVE-2023-0386在ubuntu22.04上的提权. Contribute to xkaneiki/CVE-2023-0386 development by creating an account on GitHub.
HTTP
-сервер Python'а
(как это делается я рассказывал в прошлых своих статьях - например. прохождение Precious):И по инструкции с
GitHub'а
запускаем эксплоит:Получаем рута:
thank_you.json
В каталоге
/root/
мы можем обнаружить послание от разработчиков HackTheBox
- thank_you.json
:Это
JSON
-код:
JSON:
{
"encoding": "url",
"data": "%7B%22encoding%22:%20%22hex%22,%20%22data%22:%20%227b22656e6372797074696f6e223a2022786f72222c2022656e6372707974696f6e5f6b6579223a20224861636b546865426f78222c2022656e636f64696e67223a2022626173653634222c202264617461223a20224441514347585167424345454c43414549515173534359744168553944776f664c5552765344676461414152446e51634454414746435145423073674230556a4152596e464130494d556745596749584a51514e487a7364466d494345535145454238374267426942685a6f4468595a6441494b4e7830574c526844487a73504144594848547050517a7739484131694268556c424130594d5567504c525a594b513848537a4d614244594744443046426b6430487742694442306b4241455a4e527741596873514c554543434477424144514b4653305046307337446b557743686b7243516f464d306858596749524a41304b424470494679634347546f4b41676b344455553348423036456b4a4c4141414d4d5538524a674952446a41424279344b574334454168393048776f334178786f44777766644141454e4170594b67514742585159436a456345536f4e426b736a41524571414130385151594b4e774246497745636141515644695952525330424857674f42557374427842735a58494f457777476442774e4a30384f4c524d61537a594e4169734246694550424564304941516842437767424345454c45674e497878594b6751474258514b45437344444767554577513653424571436c6771424138434d5135464e67635a50454549425473664353634c4879314245414d31476777734346526f416777484f416b484c52305a5041674d425868494243774c574341414451386e52516f73547830774551595a5051304c495170594b524d47537a49644379594f4653305046776f345342457454776774457841454f676b4a596734574c4545544754734f414445634553635041676430447863744741776754304d2f4f7738414e6763644f6b31444844464944534d5a48576748444267674452636e4331677044304d4f4f68344d4d4141574a51514e48335166445363644857674944515537486751324268636d515263444a6745544a7878594b5138485379634444433444433267414551353041416f734368786d5153594b4e7742464951635a4a41304742544d4e525345414654674e4268387844456c6943686b7243554d474e51734e4b7745646141494d425355644144414b48475242416755775341413043676f78515241415051514a59674d644b524d4e446a424944534d635743734f4452386d4151633347783073515263456442774e4a3038624a773050446a63634444514b57434550467734344241776c4368597242454d6650416b5259676b4e4c51305153794141444446504469454445516f36484555684142556c464130434942464c534755734a304547436a634152534d42484767454651346d45555576436855714242464c4f7735464e67636461436b434344383844536374467a424241415135425241734267777854554d6650416b4c4b5538424a785244445473615253414b4553594751777030474151774731676e42304d6650414557596759574b784d47447a304b435364504569635545515578455574694e68633945304d494f7759524d4159615052554b42446f6252536f4f4469314245414d314741416d5477776742454d644d526f6359676b5a4b684d4b4348514841324941445470424577633148414d744852566f414130506441454c4d5238524f67514853794562525459415743734f445238394268416a4178517851516f464f676354497873646141414e4433514e4579304444693150517a777853415177436c67684441344f4f6873414c685a594f424d4d486a424943695250447941414630736a4455557144673474515149494e7763494d674d524f776b47443351634369554b44434145455564304351736d547738745151594b4d7730584c685a594b513858416a634246534d62485767564377353043776f334151776b424241596441554d4c676f4c5041344e44696449484363625744774f51776737425142735a5849414242454f637874464e67425950416b47537a6f4e48545a504779414145783878476b6c694742417445775a4c497731464e5159554a45454142446f6344437761485767564445736b485259715477776742454d4a4f78304c4a67344b49515151537a734f525345574769305445413433485263724777466b51516f464a78674d4d41705950416b47537a6f4e48545a504879305042686b31484177744156676e42304d4f4941414d4951345561416b434344384e467a464457436b50423073334767416a4778316f41454d634f786f4a4a6b385049415152446e514443793059464330464241353041525a69446873724242415950516f4a4a30384d4a304543427a6847623067344554774a517738784452556e4841786f4268454b494145524e7773645a477470507a774e52516f4f47794d3143773457427831694f78307044413d3d227d%22%7D"
}
В нём есть
encoding
- метод шифрования/кодирования, и data
- сами данные. Раздекодим URL
(советую использовать
Ссылка скрыта от гостей
):Получаем
JSON
-код с data
в хексе, декодим:Мы получили опять
JSON
-код с шифрованием XOR
, а сам data
закодирован в Base64
, выбираем следующие рецепты в
Ссылка скрыта от гостей
:Вот, собственно, послание:
Код:
Dear HackTheBox Community,
We are thrilled to announce a momentous milestone in our journey together. With immense joy and gratitude, we celebrate the achievement of reaching 2 million remarkable users! This incredible feat would not have been possible without each and every one of you.
From the very beginning, HackTheBox has been built upon the belief that knowledge sharing, collaboration, and hands-on experience are fundamental to personal and professional growth. Together, we have fostered an environment where innovation thrives and skills are honed. Each challenge completed, each machine conquered, and every skill learned has contributed to the collective intelligence that fuels this vibrant community.
To each and every member of the HackTheBox community, thank you for being a part of this incredible journey. Your contributions have shaped the very fabric of our platform and inspired us to continually innovate and evolve. We are immensely proud of what we have accomplished together, and we eagerly anticipate the countless milestones yet to come.
Here's to the next chapter, where we will continue to push the boundaries of cybersecurity, inspire the next generation of ethical hackers, and create a world where knowledge is accessible to all.
With deepest gratitude,
The HackTheBox Team
Перевод:
Код:
Уважаемое сообщество HackTheBox,
Мы рады объявить о важной вехе в нашем совместном путешествии. С огромной радостью и благодарностью мы отмечаем достижение 2 миллионов замечательных пользователей! Этот невероятный подвиг был бы невозможен без каждого из вас.
С самого начала HackTheBox был основан на убеждении, что обмен знаниями, сотрудничество и практический опыт являются основополагающими для личного и профессионального роста. Вместе мы создали среду, в которой процветают инновации и оттачиваются навыки. Каждая решенная задача, каждая покоренная машина и каждый приобретенный навык способствуют формированию коллективного разума, который питает это энергичное сообщество.
Спасибо всем и каждому члену сообщества HackTheBox за участие в этом невероятном путешествии. Ваш вклад сформировал саму ткань нашей платформы и вдохновил нас на постоянные инновации и развитие. Мы безмерно гордимся тем, чего мы достигли вместе, и с нетерпением ждем бесчисленных вех, которые еще впереди.
За следующую главу, в которой мы продолжим расширять границы кибербезопасности, вдохновлять новое поколение этичных хакеров и создавать мир, где знания доступны всем.
С глубочайшей благодарностью,
Команда HackTheBox
Большое спасибо, что дочитали мою статью до конца. Если есть какие-то ошибки/неточности, то, пожалуйста, напишите об этом в комментариях
Последнее редактирование модератором: