HTB TheNotebook. Совершаем побег из Docker, чтобы захватить рут

Содержание статьи

  • Разведка. Сканирование портов
  • Точка входа. Манипуляции JWT
  • Точка опоры. Уязвимость при загрузке файлов
  • Продвижение
  • Локальное повышение привилегий

В этой статье мы на при­мере сред­ней по слож­ности машины TheNotebook с Hack The Box порабо­таем с тех­нологи­ей JSON Web Token, про­экс­плу­ати­руем уяз­вимость при заг­рузке фай­лов на сер­вер и пос­мотрим, как работа­ет одна из тех­ник Docker Breakout — побега из кон­тей­нера Docker.

warning

Под­клю­чать­ся к машинам с HTB рекомен­дует­ся толь­ко через VPN. Не делай это­го с компь­юте­ров, где есть важ­ные для тебя дан­ные, так как ты ока­жешь­ся в общей сети с дру­гими учас­тни­ками.

 

Разведка. Сканирование портов

Ад­рес машины сра­зу же кида­ем в /etc/hosts, что­бы даль­ше набирать толь­ко наз­вание.

10.10.10.230 thenotebook.htb

И, как и любая дру­гая ата­ка, работа над вир­туал­кой начина­ется со ска­ниро­вания пор­тов. При­вожу свой тра­дици­онный скрипт, который дела­ет это в два про­хода при помощи Nmap.

#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1

Ре­зуль­тат работы скрип­та

По резуль­татам ска­ниро­вания име­ем два откры­тых пор­та: 22 (служ­ба SSH) и 80 (веб‑сер­вер nginx 1.14.0). Для начала вни­матель­но осмотрим­ся на сай­те и соберем информа­цию.

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

Глав­ная стра­ница сай­та

Пос­ле авто­риза­ции нам откры­вают­ся фун­кции соз­дания, хра­нения и чте­ния заметок. А это потен­циаль­ная точ­ка вхо­да.

Стра­ница работы с замет­ками

В дан­ном слу­чае сто­ит прос­мотреть все зап­росы к сер­веру и его отве­ты. Не исклю­чено, что таким обра­зом обна­ружат­ся логичес­кие ошиб­ки в при­ложе­нии. Для отло­ва всех зап­росов и отве­тов прок­сиру­ем их через Burp. Нас­тро­ив его, про­ходим пол­ный цикл работы с замет­кой: соз­даем ее и прос­матри­ваем.

Стра­ница соз­дания и запол­нения замет­ки

Стра­ница прос­мотра заметок

А теперь смот­рим исто­рию зап­росов в Burp.

Ис­тория зап­росов Burp

При прос­мотре зап­росов сра­зу обра­тим вни­мание на исполь­зуемые cookie. По фор­мату авто­риза­цион­ная печень­ка уж очень похожа на JWT.

Cookie, переда­ваемые веб‑сер­веру 

Точка входа. Манипуляции JWT

JSON Web Token сос­тоит из трех час­тей: заголов­ка (header), полез­ной наг­рузки (payload) и под­писи. Заголо­вок и полез­ная наг­рузка пред­став­ляют собой объ­екты JSON, а наг­рузка может быть любой — это имен­но те кри­тичес­кие дан­ные, которые переда­ются при­ложе­нию.

За­голо­вок содер­жит поля:

  • alg — алго­ритм, исполь­зуемый для под­писи/шиф­рования. Это обя­затель­ный ключ;
  • typ — тип токена. Дол­жно иметь зна­чение JWT;
  • cty — тип содер­жимого.

Тре­тий эле­мент вычис­ляет­ся на осно­вании пер­вых и зависит от выб­ранно­го алго­рит­ма. Токены могут быть переко­диро­ваны в ком­пак­тное пред­став­ление: к заголов­ку и полез­ной наг­рузке при­меня­ется алго­ритм кодиро­вания Base64-URL, пос­ле чего добав­ляет­ся под­пись и все три эле­мен­та раз­деля­ются точ­ками (как на скрин­шоте выше).

Поп­робу­ем разоб­рать дан­ные. Для это­го нам понадо­бит­ся либо при­ложе­ние jwt_tool, либо онлай­новый сер­вис jwt.io. Я выб­рал jwt.io, что­бы ничего не уста­нав­ливать, и даль­ше буду исполь­зовать его.

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

Раз­бор JWT с помощью jwt.io

Что делать даль­ше, понят­но — нуж­но изме­нить ключ, отве­чающий за наличие при­виле­гий адми­нис­тра­тора, под­писать новые дан­ные, сге­нери­ровать новый JWT и заменить ста­рый на сер­висе заметок. Наличие при­виле­гий адми­нис­тра­тора может дать ряд сво­их пре­иму­ществ — от чте­ния при­ват­ной информа­ции до уста­нов­ки на сер­вис раз­ных допол­нений (что, ско­рее все­го, при­ведет нас к уда­лен­ному выпол­нению кода).

С изме­нени­ем клю­ча admin_cap все ясно, прос­то выс­тавим еди­нич­ку. Но что сде­лать с под­писью? В заголов­ке ука­зан адрес при­ват­ного клю­ча, что натал­кива­ет на идею: сге­нери­ровать свою пару клю­чей для под­писи токена, раз­местить их на сво­ем веб‑сер­вере и затем в заголов­ке ука­зать адрес клю­ча на этом сер­вере. Сна­чала сге­нери­руем пару клю­чей, а потом переве­дем в фор­мат PEM.

ssh-keygen -t rsa -b 4096 -m PEM -f privKey.key
openssl rsa -in privKey.key -pubout -outform PEM -out pubKey.key.pub

Ге­нери­рова­ние пары клю­чей

Те­перь запус­тим в той же дирек­тории прос­той веб‑сер­вер на осно­ве Python 3.

python3 -m http.server

По­ра генери­ровать новый токен. Изме­няем зна­чения по клю­чам admin_cap и kid, во вто­ром слу­чае ука­зыва­ем URL сге­нери­рован­ного клю­ча. Так­же встав­ляем сге­нери­рован­ные пуб­личный и при­ват­ный клю­чи в поля Verify Signature. Если ты все сде­лал пра­виль­но, то ниже токена уви­дишь над­пись Signature Verified.

Соз­дание нового токена

Встав­ляем новый токен в cookie, нап­ример с помощью рас­ширения для бра­узе­ра Cookie Editor, и обновля­ем стра­ницу. В окне запущен­ного веб‑сер­вера уви­дим обра­щение к фай­лу клю­ча, а в бра­узе­ре, если обно­вить стра­ницу, появит­ся ссыл­ка на админ­скую панель.

Ло­ги веб‑сер­вера

Раз­делы сай­ты 

Точка опоры. Уязвимость при загрузке файлов

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

За­мет­ка об исправ­лении кон­фигура­ций

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *