CTF Прохождение HackTheBox - TwoMillion (Linux, Easy)

1686736186041.png

Приветствую, Кодебай! Сегодня мы пройдём линуксовую машину легкой сложности с HackTheBox, которая посвящена двум миллионам зарегистрировавшимся пользователям. Приятного чтения :)

Разведка

Как всегда начинаем со сканирования портов. Используем флаг -sC, чтобы использовать стандартные скрипты, -sV, чтобы определить сервисы открытых портов:

1686736328605.png


Когда мы переходим на 80 порт, то нас встречает следующее окно:

1686736425488.png


В таком случае нужно внести IP-адрес и домен в /etc/hosts.

Советую вместо sudo echo (который не работает):

1686737745624.png


Использовать echo вместе с sudo tee:

1686737774748.png


Теперь мы можем попасть на веб-сервис:

1686737920349.png


Это оказалась старая версия HackTheBox с древним интерфейсом. Тут есть страница логина и регистрации:

1686737948470.png


Страница регистрации требует пригласительного кода:

1686738267275.png


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

Что ж, приступим. Открываем исходный код страницы http://2million.htb/register и видим /js/inviteapi.min.js:

1686738351654.png


Смотрим исходный код js-файла:

1686738462716.png


Весь код зашифрован и идёт в одну строку, следовательно, нам нужно его как-то преобразовать в читаемый для человека вид. Советую использовать любой JS Beautifier:

1686738561624.png


После того, как расшифровали код мы получили несколько путей, куда можно отправить 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

1686738620583.png


Вывалился 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. Очевидно, что это шифр Цезаря:

1686738809713.png


Нам говорят, что нужно отправить POST-запрос на /api/v1/invite/generate, чтобы сгенерировать invite-код. Опять же используем curl:

Bash:
curl -X POST http://2million.htb/api/v1/invite/generate

1686739260781.png


JSON:
{
  "0": 200,
  "success": 1,
  "data": {
    "code": "Mk9QSzAtN1pMUzgtVUxZSUstUTA5WU4=",
    "format": "encoded"
  }
}

Мы получили код, который был зашифрован в base64. Его можно расшифровать через base64 из терминала:

Bash:
echo "Mk9QSzAtN1pMUzgtVUxZSUstUTA5WU4=" | base64 -d

На /register ввести код нельзя, следовательно, нужно искать другой путь. Я нашёл страницу /invite и ввёл код:

1686739495204.png


И меня перенаправило на /register с уже введённым кодом:

1686739574193.png


Я ввёл остальные данные - юзернейм, электронную почту и пароль, а затем нажал на кнопку Register, после чего меня перенаправило на страницу /login:

1686739636037.png


После авторизации открылся, опять же, старый интерфейс HackTheBox:

1686739660358.png


На /home/access мы можем скачать наш VPN-конфиг или перегенерировать:

1686739771383.png


Давайте посмотрим, что возвращает страница при GET-запросе на /api/v1/user/vpn/generate (кнопка Connection Pack):

1686739878981.png


Не забываем указать заголовок с куками в курле. Чтобы посмотреть куки, можно нажать кнопку F12 (Firefox) и перейти в Storage->Cookies->http://2million.htb:

1686739912776.png


Теперь указываем опцию -H (доп. HTTP-заголовок) и отправляем запрос на /api/v1/user/vpn/generate:

1686739979840.png


Видим наш VPN-конфиг, пока что ничего полезного.

Далее я перешёл для удобства в BurpSuite и отправил GET-запрос на /api/v1:

1686740117799.png


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-пути. Тут уже примерно стало понятно, как эксплуатировать:
  1. Пути с /v1/user нам не нужны. Нужны пути с /v1/admin.
  2. Есть путь с GET-запросом /api/v1/admin/auth - он, судя по всему, без каких-либо параметров проверяет авторизован ли пользователь как админ (через куки).
  3. Есть путь с POST-запросом /api/v1/admin/vpn/generate - похоже, что с помощью него можно сгенерировать VPN-конфиг для любого пользователя от лица, опять же, админа.
  4. Есть путь с PUT-запросом /api/v1/admin/settings/update - он обновляет настройки пользователя. Скорее всего через него мы можем повысить привилегии.
Взятие www-data

Попробуем обновить настройки для нашего пользователя, отправляем PUT-запрос на /api/v1/admin/settings/update:

1686741320380.png


В ответе нам приходит сообщение, что у нас неправильный Content-Type заголовок. Хорошо, добавим его со значением application/json (т. е. данные мы будем передавать в JSON-формате):

1686741358564.png


Немного продвинулись, теперь не хватает электронной почты, добавим наш email в JSON'е:

1686741468249.png


И добавим is_admin (понять какой тип данных используется можно методом перебора):

1686741498379.png


Отлично, кажется, мы повысили наши привилегии, проверим это:

1686741735919.png


Супер. Возвращаемся к нашему списку, что мы ещё не заимодействовали?:
  1. Пути с /v1/user нам не нужны. Нужны пути с /v1/admin.
  2. Есть путь с GET-запросом /api/v1/admin/auth - он, судя по всему, без каких-либо параметров проверяет авторизован ли пользователь как админ (через куки).
  3. Есть путь с POST-запросом /api/v1/admin/vpn/generate - похоже, что с помощью него можно сгенерировать VPN-конфиг для любого пользователя от лица, опять же, админа.
  4. Есть путь с PUT-запросом /api/v1/admin/settings/update - он обновляет настройки пользователя. Скорее всего через него мы можем повысить привилегии.

Теперь мы можем сделать VPN для юзеров:

1686742053887.png


Опять же, методом тыка проверяем какие параметры используются в POST-запросе, хорошо, что респонс нам подсказывает - не хватает юзернейма. Добавляем его:

1686742124770.png


Такой вывод я уже видел ранее (от лица обычного пользователя), но тут мы можем указать юзернейм. Возможно, используется какая-нибудь "опасная" функция, где нет фильтрации и мы можем получить RCE?

1686742236272.png


Получили RCE. Теперь давайте пробросим шелл (советую для удобства использовать ):

1686742322494.png


Шелл получен, сразу апгрейдим оболочку через python3:

Bash:
python3 -c 'import pty;pty.spawn("/bin/bash");'

1686742471691.png


Взятие пользователя

В домашней директории пользователя www-data можно обнаружить .env файл. В нём лежали креды:

1686745079027.png

Код:
DB_USERNAME=admin
DB_PASSWORD=SuperDuperPass123

Не проверить их на пользователе admin через SSH, который располагается в /home, было бы глупо:

Bash:
ssh admin@2million.htb

1686745183078.png


Взятие рута

Мы можем взять флаг пользователя и нужно искать методы повышения привилегий. В /var/mail/admin мы можем найти следующее письмо:

1686745520768.png


Тут говорится о нескольких CVE для ядра линукс, которые появились в этом году и что-то есть в OverlayFS / Fuse. Гуглим:

1686745606250.png


CVE-2023-0386 - то, что нам нужно. Так как машина лёгкого уровня, то берём уже готовый эксплоит с GitHub'а: Загружаем на машину через HTTP-сервер Python'а (как это делается я рассказывал в прошлых своих статьях - например. прохождение Precious):

1686745971926.png


И по инструкции с GitHub'а запускаем эксплоит:

1686746038827.png


Получаем рута:

1686746081916.png


thank_you.json

В каталоге /root/ мы можем обнаружить послание от разработчиков HackTheBox - thank_you.json:

1686746691266.png


Это JSON-код:

JSON:
{
  "encoding": "url",
  "data": "%7B%22encoding%22:%20%22hex%22,%20%22data%22:%20%227b22656e6372797074696f6e223a2022786f72222c2022656e6372707974696f6e5f6b6579223a20224861636b546865426f78222c2022656e636f64696e67223a2022626173653634222c202264617461223a20224441514347585167424345454c43414549515173534359744168553944776f664c5552765344676461414152446e51634454414746435145423073674230556a4152596e464130494d556745596749584a51514e487a7364466d494345535145454238374267426942685a6f4468595a6441494b4e7830574c526844487a73504144594848547050517a7739484131694268556c424130594d5567504c525a594b513848537a4d614244594744443046426b6430487742694442306b4241455a4e527741596873514c554543434477424144514b4653305046307337446b557743686b7243516f464d306858596749524a41304b424470494679634347546f4b41676b344455553348423036456b4a4c4141414d4d5538524a674952446a41424279344b574334454168393048776f334178786f44777766644141454e4170594b67514742585159436a456345536f4e426b736a41524571414130385151594b4e774246497745636141515644695952525330424857674f42557374427842735a58494f457777476442774e4a30384f4c524d61537a594e4169734246694550424564304941516842437767424345454c45674e497878594b6751474258514b45437344444767554577513653424571436c6771424138434d5135464e67635a50454549425473664353634c4879314245414d31476777734346526f416777484f416b484c52305a5041674d425868494243774c574341414451386e52516f73547830774551595a5051304c495170594b524d47537a49644379594f4653305046776f345342457454776774457841454f676b4a596734574c4545544754734f414445634553635041676430447863744741776754304d2f4f7738414e6763644f6b31444844464944534d5a48576748444267674452636e4331677044304d4f4f68344d4d4141574a51514e48335166445363644857674944515537486751324268636d515263444a6745544a7878594b5138485379634444433444433267414551353041416f734368786d5153594b4e7742464951635a4a41304742544d4e525345414654674e4268387844456c6943686b7243554d474e51734e4b7745646141494d425355644144414b48475242416755775341413043676f78515241415051514a59674d644b524d4e446a424944534d635743734f4452386d4151633347783073515263456442774e4a3038624a773050446a63634444514b57434550467734344241776c4368597242454d6650416b5259676b4e4c51305153794141444446504469454445516f36484555684142556c464130434942464c534755734a304547436a634152534d42484767454651346d45555576436855714242464c4f7735464e67636461436b434344383844536374467a424241415135425241734267777854554d6650416b4c4b5538424a785244445473615253414b4553594751777030474151774731676e42304d6650414557596759574b784d47447a304b435364504569635545515578455574694e68633945304d494f7759524d4159615052554b42446f6252536f4f4469314245414d314741416d5477776742454d644d526f6359676b5a4b684d4b4348514841324941445470424577633148414d744852566f414130506441454c4d5238524f67514853794562525459415743734f445238394268416a4178517851516f464f676354497873646141414e4433514e4579304444693150517a777853415177436c67684441344f4f6873414c685a594f424d4d486a424943695250447941414630736a4455557144673474515149494e7763494d674d524f776b47443351634369554b44434145455564304351736d547738745151594b4d7730584c685a594b513858416a634246534d62485767564377353043776f334151776b424241596441554d4c676f4c5041344e44696449484363625744774f51776737425142735a5849414242454f637874464e67425950416b47537a6f4e48545a504779414145783878476b6c694742417445775a4c497731464e5159554a45454142446f6344437761485767564445736b485259715477776742454d4a4f78304c4a67344b49515151537a734f525345574769305445413433485263724777466b51516f464a78674d4d41705950416b47537a6f4e48545a504879305042686b31484177744156676e42304d4f4941414d4951345561416b434344384e467a464457436b50423073334767416a4778316f41454d634f786f4a4a6b385049415152446e514443793059464330464241353041525a69446873724242415950516f4a4a30384d4a304543427a6847623067344554774a517738784452556e4841786f4268454b494145524e7773645a477470507a774e52516f4f47794d3143773457427831694f78307044413d3d227d%22%7D"
}

В нём есть encoding - метод шифрования/кодирования, и data - сами данные. Раздекодим URL (советую использовать ):

1686746769451.png


Получаем JSON-код с data в хексе, декодим:

1686746875930.png


Мы получили опять JSON-код с шифрованием XOR, а сам data закодирован в Base64, выбираем следующие рецепты в :

1686747032867.png


Вот, собственно, послание:

Код:
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

Большое спасибо, что дочитали мою статью до конца. Если есть какие-то ошибки/неточности, то, пожалуйста, напишите об этом в комментариях :)
 
Последнее редактирование модератором:

Atikan

New member
01.07.2023
2
0
BIT
17
Спасибо большое за статью. Прекрасная работа! Продолжайте в том же духе! Очень интересно наблюдать!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!