Последние посты

BlackFan
9 июл., 13:32изменён
Записали выпуск "Начинаем в багбаунти" по теме мисконфигов при использовании S3 в веб-приложениях (Youtube). Непривычный для меня формат, но надеюсь получилось интересно.Дополнительный материал из выпуска:➖ https://github.com/BlackFan/s3-fingerprint Табличка с популярными облачными и локальными решениями, по которой можно определять с какой именно системой идет взаимодействие на сайте.➖ https://github.com/BlackFan/s3-request-signer Расширение для Burp Suite и Caido, облегчающее работу с подписанными запросами. Добавляет к запросу в Repeater некорректную подпись и подписанные GET/PUT запросы по набору добавленных S3 учеток. Умеет в v2/v4 подписи, v2 можно формировать с помощью Hackvertor тегов. Поддерживает генерацию подписи не только по данным из HTTP запроса, но и тексту ошибки SignatureDoesNotMatch, когда при проксировании в S3 запрос видоизменяется.➖ https://github.com/BlackFaYouTubeНачинаем в багбаунти: S3 misconfigsВ этом выпуске разбираем ошибки конфигураций и уязвимости, связанные с использованием объектного хранилища в веб-приложении, которые могут привести к утечке информации, компрометации учетных данных пользователей и другим серьезным последствиям. Ведущий выпуска…
BlackFan
19 апр., 17:44
Финал Standoff Hacks. Шанхай 🇨🇳GG. Доиграли до конца.Топ-3: 🥇 r0hack — MVP Standoff Hacks 🥈 freeman 🥉 BlackFanMVP по программам: 🏆 BlackFan — Т-Банк 🏆 brain — VK 🏆 hussein98d — «Инфосистемы Джет» 🏆 Antart — Битрикс2430 топовых багхантеров 350+ отчетов 23+ млн ₽ баунтиДве недели интенсивной работы: сотни отчетов, плотный триаж и реальные результаты.




BlackFan
13 мар., 06:28
Попался интересный вариант, когда с помощью JWT секрета, извлеченного из Java приложения, не получается сформировать валидный токен.В проекте использовалась устаревшая библиотека jjwt-0.7.0, которая при использовании строки в качестве секрета неявно декодировала его с помощью Base64, даже если это невалидная base64-строка.В результате, при использовании следующего кода: private static String SECRET = "#%j?_GtEhNS!-WH.Vq!"; private static long EXPIRATION = 3600L;public static String generateToken(String username) { Map<String, Object> claims = new HashMap<>(); claims.put("sub", username); Date exp = new Date(System.currentTimeMillis() + (EXPIRATION 1000));return Jwts.builder() .setClaims(claims) .setExpiration(exp) .signWith(SignatureAlgorithm.HS512, SECRET) .compact(); }
BlackFan
4 мар., 14:43
Раскрыл один из интересных отчетов в программе Мегамаркет, опять же связанный с некорректным проксированием HTTP запросов в S3 систему.Ссылка на отчет: https://bugbounty.standoff365.com/disclosed-reports/37Из интересного - в отчете используется обход Web Application Firewall через разделение XSS нагрузки на части по 5 мегабайт и использование Multipart Upload в S3.А подробнее прочитать о том, из-за чего возникает такой мисконфиг, позволяющий проэксплуатировать уязвимость, можно в этом посте: https://t.me/Black4Fan/15TelegramBlackFanНебольшая заметка про уязвимую конфигурацию nginx при проксировании запросов на S3, которое позволило в том году налутать немного уязвимостей на BugBounty. Объектные хранилища, совместимые с S3 API, используют два варианта указания имени бакета в запросе.…
BlackFan
12 февр., 12:57изменён
Интересная уязвимость, связанная с кэшированием HTTP ответов из S3, может возникнуть если немного перестараться с настройкой.Условия: 1) Сайт хранит статику в S3 и по определенным условиям проксирует туда запросы, либо имеет отдельный поддомен, который проксирует запросы на S3 бакет 2) Чтобы не гонять 10 мегабайтные JavaScript файлы, кэшируется контент из S3 для любого HTTP ответа с кодом 200 3) Так как кэшируется только статика - не включаем в ключ кэша cookie или query-параметрыКазалось бы, все в порядке, но проблема заключается в том, что S3 умеет отвечать с кодом 200 не только возвращая контент файла, но еще и при получении другой информации об объекте. Например, для получения списка тегов достаточно в query-параметры добавить ?tagging, что часто разрешают для неавторизованных запросов.https://site.tld/static/somefile.js?taggingВ результате, вместо контента файла вернется
