Се­год­ня мы с тобой прой­дем путь от базово­го ска­ниро­вания сай­та до экс­плу­ата­ции уяз­вимос­ти типа LFI и заг­рузки шел­ла. Для зах­вата рута нам понадо­бит­ся най­ти уяз­вимость в при­ложе­нии на Java. А упражнять­ся мы будем на сред­ней по слож­ности машине Timing с пло­щад­ки Hack The Box.
 

Разведка

До­бав­ляем IP-адрес машины в /etc/hosts:

10.10.11.135 timing.htb

И запус­каем ска­ниро­вание пор­тов.

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

Наш­ли два откры­тых пор­та:

  • 22 — служ­ба OpenSSH 7.6p1;
  • 80 — веб‑сер­вер Apache 2.4.29.

На SSH нам ловить нечего, про­пус­каем его.

Пос­мотрим, что нам покажет веб‑сер­вер. При обра­щении к нему про­исхо­дит редирект на стра­ницу /login.php, где нас встре­чает фор­ма авто­риза­ции.

Форма авторизации
Фор­ма авто­риза­ции

По­нят­но, что сайт не однос­тра­нич­ный, поэто­му поп­робу­ем най­ти скры­тые стра­ницы. Так как пер­вая стра­ница была в фор­мате PHP, осталь­ные будем переби­рать с таким же рас­ширени­ем. Я для это­го вос­поль­зуюсь ска­нером ffuf.

За­пус­каем его с нуж­ными парамет­рами:

ffuf -uhttp://timing.htb/FUZZ -t 256 -wphp_files_common.txt
Результат сканирования файлов PHP
Ре­зуль­тат ска­ниро­вания фай­лов PHP

Наш­ли мно­го фай­лов, теперь прос­каниру­ем и скры­тые катало­ги.

ffuf -uhttp://timing.htb/FUZZ -t 256 -wdirectory_2.3_medium_lowercase.txt
Результат сканирования скрытых каталогов
Ре­зуль­тат ска­ниро­вания скры­тых катало­гов

В ито­ге находим катало­ги для хра­нения скрип­тов и изоб­ражений. Боль­ше нам ничего не дос­тупно. Ска­ниро­вание фай­лов бэкапов и под­доменов ничего не дало. Но мы еще не поис­кали парамет­ры! Для ска­ниро­вания логич­но выб­рать стра­ницу image.php, которая пред­положи­тель­но дол­жна воз­вра­щать изоб­ражения. Так как мы не зна­ем, что будет переда­но в качес­тве зна­чения парамет­ра, поп­робу­ем передать само наз­вание стра­ницы в надеж­де получить какую‑нибудь ошиб­ку.

ffuf -u http://timing.htb/image.php?FUZZ=../image.php -t 256 -wparameters.txt -fs 0
Результат сканирования параметра
Ре­зуль­тат ска­ниро­вания парамет­ра

Мы наш­ли один параметр — img. То есть мы можем зап­росить файл с кар­тинкой по его наз­ванию. Поп­робу­ем таким спо­собом ута­щить какой‑нибудь сис­темный файл, задав отно­ситель­ный путь.

Сообщение, что обнаружена атака
Со­обще­ние, что обна­руже­на ата­ка

Нас пой­мали за руку!

 

Точка входа

Здесь, судя по все­му, исполь­зуют­ся какие‑то филь­тры, которые меша­ют нам читать любой файл. Я поп­робовал раз­ные вари­анты обер­ток для парамет­ра и обна­ружил, что сра­баты­вает зап­рос вот такого вида:

/image.php?img=php://filter/convert.base64-encode/resource=index.php

Со­дер­жимое этой стра­ницы, получен­ной в ответ, будет закоди­рова­но в Base64. Декоди­ровать мож­но пря­мо Burp, нажав Ctrl-Shift-B.

Получение кода страницы index.php
По­луче­ние кода стра­ницы index.php

Так как мы можем получить код любой стра­ницы, идем по поряд­ку и заг­лядыва­ем в исходный код стра­ницы login.php.

Исходный код login.php
Ис­ходный код login.php

В нем ничего инте­рес­ного нет, кро­ме под­клю­чения фай­ла db_conn.php (стро­ка 10). Здесь мы находим учет­ку для под­клю­чения к базе дан­ных. Конеч­но же, прос­мотрим и его.

Исходный код db_conn.php
Ис­ходный код db_conn.php

Па­роль пока ни к чему не подошел, поэто­му копа­ем даль­ше. Перей­дем к фай­лам, о которых мы уже зна­ем. Нач­нем с upload.php.

Исходный код upload.php
Ис­ходный код upload.php

В самом начале под­клю­чает­ся файл admin_auth_check.php. Затем зада­ются необ­ходимые парамет­ры для заг­ружен­ного фай­ла, в том чис­ле и file_name. Имя фай­ла соз­дает­ся по сле­дующе­му алго­рит­му: берет­ся стро­ка $file_hash, затем добав­ляет­ся текущее вре­мя (резуль­тат выпол­нения фун­кции time()), все это кон­верти­рует­ся в хеш MD5, а даль­ше добав­ляет­ся знак ниж­него под­черки­вания и имя фай­ла, которое исполь­зовалось при заг­рузке. При этом файл дол­жен иметь рас­ширение jpg. А в фай­ле admin_auth_check.php толь­ко срав­нива­ется роль поль­зовате­ля.

Ес­ли бы $file_hash кто‑то по ошиб­ке не обер­нул в кавыч­ки, то под­ста­вилось бы зна­чение перемен­ной, получен­ное от PHP-фун­кции uniqid(). Раз­гадать уни­каль­ный иден­тифика­тор у нас бы не выш­ло, а без него единс­твен­ной прег­радой будет вывод фун­кции time().

Исходный код admin_auth_check.php
Ис­ходный код admin_auth_check.php

Впро­чем, пока что здесь боль­ше ничего не сде­лать, и при­дет­ся бру­тить фор­му авто­риза­ции. Для начала най­дем име­на поль­зовате­лей, к при­меру в фай­ле /etc/passwd.

Содержимое файла /etc/passwd
Со­дер­жимое фай­ла /etc/passwd

Скачать:









Важно:


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





Заходи на mc.foxygame.ru:25565

Советуем прочитать