Получи случайную криптовалюту за регистрацию!

Пост Импакта

Логотип телеграм канала @postimpact — Пост Импакта П
Логотип телеграм канала @postimpact — Пост Импакта
Адрес канала: @postimpact
Категории: Технологии
Язык: Русский
Количество подписчиков: 2.21K
Описание канала:

Уникальный контент про кибербезопасность от Импакта (@impact_l) - мысли, полезные ссылки, комментарии к событиям и юмор

Рейтинги и Отзывы

2.50

2 отзыва

Оценить канал postimpact и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

1

3 звезд

0

2 звезд

0

1 звезд

1


Последние сообщения

2022-11-28 13:58:58 Презентация с конференции PDUG (Positive Development User Group)

Будет интересна тем, кто занимается мобильной безопасностью.
2.6K views10:58
Открыть/Комментировать
2022-11-14 13:36:58 #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¶m2=test&...¶m500=test

Проблема здесь заключается в том, что многие серверы будут отдавать 414 URI Too Long, либо банально игнорировать последние 200 параметров. Таким образом, даже если в вашем текстовом файле есть нужный параметр — он не будет найден.

2. Ещё одним важным отличием являются функции сравнения ответов на странице.

Arjun сохраняет тело первого ответа и сравнивает с ответом нового запроса. Если есть разница — выводит сообщение о том что параметр влияет на ответ.

Естественно, проблема здесь очевидна, содержимое в ответе может быть всегда динамическим. Например, в теле ответа иногда встроен datetime.

x8 лишён данной проблемы, из-за наличия специальных тестовых запросов, которые нужны для выявления динамических строк — исключая их таким образом из поиска.

HTTP/1.1 200 OK
Content-Length: 18


- Time 13:36:23



Как видно из примера, строка которая содержит время, исключена и помечена как динамическая.

HTTP/1.1 200 OK
Content-Length: 37


- Time 13:37:48

+

Здесь x8 понимает, что параметр найден из-за изменений в теге id.

3. Arjun поддерживает методы только GET и POST, а Param Miner не умеет искать рекурсивным поиском.

Кроме того, в x8 есть гибкая настройка отправки параметров — концепция шаблонов и injection pointов, которая отсутствует в других инструментах.

Вообще, автор создал табличку, где сравнивает все три решения sh1yo.art/x8stats/
Так можно оценить эффективность работы на реальных сайтах.

Пример использования: x8 -u "https://example.com/" -w
1.3K views10:36
Открыть/Комментировать
2022-08-23 13:00:14 #api #wordlist

Раньше мы выполняли брутфорс только для статических файлов и папок. Но в современных реалиях, мы всё больше встречаем приложения, которые работают посредством конечных точек API. Это означает, что подход должен меняться, давайте рассмотрим специфику.

Возьмём, в качестве примера, запрос на удаление аккаунта пользователя:

DELETE /api/v1/users/ HTTP/2
Host: example.com
Content-Type: application/xml

HTTP/2 200 OK
Connection: close

1. Для того чтобы обнаружить эту конечную точку, в словаре должны быть сущности : api, v1, users
2. Вам нужно в запросе использовать метод DELETE
3. Поставить верный Content-Type
4. В последнем пути — нужно добавить число.

В противном случае ответ будет: 404 Not Found

Из этого следует, что нужен хороший словарь, специфичный для API, а также ротация методов GET, POST, DELETE, etc.

При брутфорсе нас интересуют следующие поля (%s):

%s /api/v1/%s/ HTTP/2
Host: example.com
Content-Type: %s


Поскольку обычные словари не нацелены на API спецификацию, я собрал свой. Для этого использовал замечательный массив данных от Assetnote из 67 500 файлов Swagger, собранных с помощью Google BigQuery.

Нарезал сущности и отфильтровал их по популярности — файл прикреплён к посту.
15.5K viewsedited  10:00
Открыть/Комментировать
2022-08-15 12:37:03 #api #params

> Ничего не могу найти на сайте, может ещё что-то посмотреть?

Иногда встречается сайт, на котором всего лишь несколько конечных точек. Казалось, все параметры были проверены на уязвимости, а в чек-листе отмечены любые возможные проверки на инъекции и логику.

Однако, бывают уязвимости, которые не видны с первого взгляда. Например (CAPEC-460) HTTP Parameter Pollution или (CWE-472) External Control of Assumed-Immutable Web Parameter. Данные ошибки возникают из-за неожиданного поведения в функциях обработки параметров.

Давайте рассмотрим первую атаку HTTP Parameter Pollution, она состоит из возможности добавления повторяющихся параметров с помощью специальных разделителей запроса.

Например, у нас открыт сайт по продаже арбузов в браузере

example.com/profile.jsp?client_id=1

Для кнопки "Открыть профиль" устанавливается динамически в ответе от сервера html:

Открыть профиль" задаётся html:

GetMethod get = new GetMethod("https://example.com/profile");
get.setQueryString("client_id=" + client_id + "&action=" + action);
href_link=get.URL;

Разработчик должен был учесть такое поведение и проверить возможность внедрения параметра action в client_id

Вообще, приоритет и процесс обработки параметров можно взять из этой таблицы ниже:

Technology/HTTP backend | Parsing Result | Example |
---------------------------------------------------------------------
ASP.NET/IIS | All occurrences | par1=val1,val2 |
ASP/IIS | All occurrences | par1=val1,val2 |
PHP/Apache | Last occurrence | par1=val2 |
JSP Servlet/Apache Tomcat | First occurrence | par1=val1 |
JSP Servlet/Oracle Application | First occurrence | par1=val1 |
IBM HTTP Server | First occurrence | par1=val1 |

Так, для Server: Apache Tomcat будет взято значение из первого совпадения action=delete
А для Server: Apache значение уже будет action=view — последний параметр

Но не все сервера используют приоритет порядка, так, например, ASP.NET/IIS конкатенирует значения. Поэтому в случаях, когда выполнению XSS мешает санитизация или WAF, можно составить следующий payload:

example.com/search?param=
Открыть/Комментировать
2022-08-09 20:07:36 #sdlc #apikeys

> хей, подскажите, чем нынче модно искать всякие лики секретов на сайте? для бёрпа или лучше браузера?

Разработчики часто совершают ошибки управления секретами, особенно в незрелом процессе SDLC. В кодовую базу попадают пароли, хардкодятся API-ключи к CI/CD, заносятся учетные данные пользователей. Для того чтобы отслеживать наличие секретов существует ряд утилит:

github.com/eth0izzle/shhgit — отслеживает все коммиты через api GitHub и BitBucket для поиска конфиденциальных данных в режиме реального времени. Однажды нашёл с помощью этой утилиты креды от QA сотрудника Dyson. Как итог удалось скачать сорцы главного сайта и зайти в их Slack. Однако внимательный читатель заметит, что последний коммит был два года назад, верно, автор замутил на основе этого стартап и начал продавать как SaaS.

github.com/zricethezav/gitleaks — инструмент SAST для обнаружения и предотвращения жестко закодированных секретов, таких как пароли, ключи API и токены в репозиториях git. Можно использовать на склонированном репозитории локально.

github.com/hisxo/gitGraber — функциями схож с shhgit, однако есть некий фильтр по компаниям, вообще работает всё это дело так api.github.com/search/code?q=Компания|Yahoo, а затем уже в результатах ищет секреты.

github.com/securing/DumpsterDiver — если предыдущие утилиты искали ключи используя regex, то этот использует метод вычисления энтропии, есть возможность задать порог. Например для Azure Shared ключа порог будет начинаться от 5.1. Из плюсов ищет не только в git, но и в любой папке.

github.com/trufflesecurity/trufflehog — по функционалу ближе всего к gitleaks. Доступен в github actions.

github.com/newrelic/rusty-hog — trufflehog на rust.

github.com/Skyscanner/whispers — ищет секреты используя regex, не только в git, но и в папке/файлах. Прост в установке и может интегрироваться в конвейер CI/CD.

> Хочу искать секреты и вне работы!

Ок, вот тебе Extension TruffleHog под Chromium. Просто гуляя по сайтам, это чудо-расширение будет искать секреты на страницах и выводить alert(apikey) в случаях совпадения. У расширения есть настройки, которые включают автоматические get запросы для файлов .git или .env на сайте.

> И как мне самому узнать, какая утилита лучше всего ищет секреты?

Вот вам файл со специально забытыми api ключами на github.com/sourcegraph-community/no-secrets/blob/main/secret-examples.md

> Нашёл ключ что мне делать?

Тестировать и проверять на действительность используя этот замечательный репозиторий github.com/streaak/keyhacks


> Когда в github добавят нормальный regex?

Уже добавили, вот поиск по всему github используя Regex Facebook key: cs.github.com/?scopeName=All+repos&scope=&q=%2FEAACEdEose0cBA%5B0-9A-Za-z%5D%2B%2F
Но вам придётся запросить у github инвайт в их beta =)
4.4K viewsedited  17:07
Открыть/Комментировать
2022-08-09 20:04:57
2.4K views17:04
Открыть/Комментировать
2022-08-09 20:00:29 #mobile #frameworks

Небольшой пост про анализ защищённости мобильного приложения написанного с использованием фреймворка.
Первым делом начинаем проверку с уровня верификации MASVS-R

Для Реверса React Native:
Если вам повезло и движок Hermes не используется, то вы можете просто взять js из unzipApk/assets/index.android.bundle
Попробуйте проверить версию под iOS может быть там не использован движок и javascript находится в открытом виде.
Если движок использован на обеих платформах, можно взять hbctool — утилита для дизассемблирования байт-кода Hermes.
Также полезно будет прочитать CTF-writeup по реверсу приложения на реакте.

Для Реверса Cordova:
Применить js-beautify на unzipApk/assets/www/
Также статья про дебаг таких приложений

Для реверса Flutter:
Приложение для отладки? Проверьте исходный код в файле unzipApk/assets/flutter_assets/kernel_blob.bin
В случае когда приложение скомпилировано в release и использует AOT Snapshot: флаг obfuscate может быть не использован, тогда из файла libapp.so можно вытащить имена классов и библиотек. Иногда встречал что флаг выставлен на Android, но не на iOS.
Проект reFlutter позволяет использовать уже готовые или создавать собственные движки с патчами.
JEB добавил поддержку некоторых движков.
Несколько интересных статей.

Для реверса Ionic:
Ещё один js, разархивируем apk/ipa

Для реверса Xamarin:
Используем dotPeek на dll файле из распакованного apk
Статья, и заметка

Теперь, после того как мы сообщили владельцу кроссплатформенного приложения, о недостатках в обфускации и дали рекомендации как защищаться от реверса и отладки. Перейдём к уязвимостям в логике кода.

Справедливо можно сказать, что большинство уязвимостей привязано к платформе, а не к движку/языку. Скорее всего это будут такие вещи как IPC или файловый/сетевой ввод-вывод. Действительно, фреймворк позволяет не допускать тех ошибок, которые обычно встречаются в нативе, но это скорее из-за "ограничений" исходящих от фреймворка. Взять хотя бы баги связанные с Intent, для того чтобы передать данные другому приложению: Flutter, React Native, Xamarin им всё равно придётся использовать нативные функции. Например во flutter, чтобы использовать intent реализован пакет android_intent_plus или вот реализация в React Native.
Intent отсылается из кода Dart посредством MethodChannel в Java функцию и в финале всё равно отправляется как android.content.Intent

....

Однажды на проекте попалось Flutter приложение, код авторизации отправлялся посредством deeplink c веб страницы через html.href="myapp://host
Быстро было создано фальшивое приложение принимающее нужную схему и перехватывающее код авторизации раньше чем оригинальное. Как результат использование фреймворка не спасло.

Это был пример IPC.
Давайте обратимся к файловой системе. Вот пример отчёта #1377748 содержащего code execution путём замены lib файла. Evernote скачивает файл на несколько каталогов назад, в папку ../../../lib-1/libjnigraphics.so Приложение слишком доверяет серверу и подставляет недопустимое имя файла вложения из заголовка content-disposition.

Кстати Content Provider тоже используется через MethodChannel и уязвимость связанная с обходом пути в _display_name о которой говорится в отчёте выше также должна работать поскольку в финале у нас всё равно android.content.ContentProvider

Но не всегда баги завязаны на платформе, действительно, возможно в скором времени будут появляться баги связанные непосредственно с фреймворками.
Помните старую багу в Android ОС http://attacker.com\\\\@legitimate.com/ , когда обратный слеш не считался за путь а хост для url был legitimate.com
Эта ошибка была здесь https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/net/Uri.java#497
Функция отвечает за парсинг Uri.
А теперь откроем исходный код flutter, здесь реализована аналогичная функция парсинга Uri, но уже на стороне dart. Разработчик скорее использует её для проверки хоста, чем cделает это на стороне Java. Если здесь допущена уязвимость — issue будет создан в репозитории flutter.
2.4K viewsedited  17:00
Открыть/Комментировать
2022-08-09 19:53:25 Intent intent = (Intent) SelectBankAccountActivity.this.getIntent().getParcelableExtra("select_bank_next_intent_extra");
SelectBankAccountActivity.this.startActivity(intent);
SelectBankAccountActivity.this.finish();

Да, вашему взору предстала стандартная уязвимость когда используя злонамеренное намерение можно получить доступ к защищенным(не экспортированным) компонентам приложения. Смысл в том что приложение забирает из FlowState "объект" который может отправить злоумышленник, а потом запускает.

Ура! Теперь осталось составить PoC:

Intent next = new Intent("android.intent.action.VIEW");
next.setClassName(????)
//...
Intent intent = new Intent("android.intent.action.VIEW");
intent.putExtra("select_bank_next_intent_extra", next);
startActivity(intent);

Но в какую activity отправить злонамеренный intent от имени приложения, если все activity и так уже экспортированы?
Проявляя невероятную находчивость. Мне удалось найти внутри приложения кеш okhttp в котором хранились запросы с access_token.
Недолго думая, я наконец-то придумал содержимое для переменной next

Intent next = new Intent("android.intent.action.VIEW");
next.setClassName(getPackageName(),"com.myclass.Theft");
next.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
next.setData(Uri.parse("content://com.mercado.wallet.provider/images/okhttp/journal"));

Выставив уровень серьёзности High — получил ещё один, залуженный reward. И знаете, там ещё было с десяток таких activity, которые запускали вложенный intent.
Разработчики делали следующий фикс: они убирали запуск вложенного intent и ставили exported="false"
Но даже на 5 отчёте с этой уязвимостью, они не отключили кеш okhttp.

Подводя итоги, нужно найти тонкую грань, где начинается одна уязвимость и заканчивается вторая, чтобы правильно внести исправление.
Разработчики, не делайте такую архитектуру для приложений, не извлекайте из стороннего приложения ParcelableIntent для его последующего запуска. Надеюсь ваш код всегда будет безопасным!
1.6K viewsedited  16:53
Открыть/Комментировать
2022-08-09 19:53:25 #mobile #intent

Когда у нас проходит пентест, на активах иногда обнаруживаются уязвимости одного типа. Чаще всего такие находки также воспроизводятся, имеют одинаковое происхождение и один исходный код. Например: на сайте есть множество полей, которые можно заполнить различными данными, и рядом с каждым полем есть кнопка "сохранить".
А теперь представьте, что каждое поле уязвимо к XSS. "Почему?" - спросите вы.
— Да потому, что каждое поле пусть и имеет разные конечные точки, функция отвечающая за санитизацию параметров у них одна santizeField(input)
В итоге мы наблюдаем в отчёте (особенно когда пентест whitebox), множество и множество разных url адресов, для совершенно разных полей и параметров.
Нельзя упустить ничего, вдруг к одному из url назначена другая функция и пиши пропало. Спасибо пентестеру, что перечислил все.
Или вот, пример, когда XSS одна, а CNAME для этого домена — много https://securitytrails.com/list/cname/tilda.ws

Но лучше вернуться к мобильным приложениям, ибо канал не для веб разработчиков. Что исследователю, который с помощью технологии drag&drop переместил apk в декомпилятор, хочется увидеть больше всего в результате?

Есть такое приложение Mercado Pago, оно предназначено для совершения онлайн платежей пользователями из Латинской Америки.
Платежи — дело важное, нужно защищать пользователей и их средства. Поэтому, для улучшения своих процессов AppSec, компанией было принято решение запустить программу BugBounty. Ну и выложили они там своё мобильное приложение.

Давайте вместе посмотрим из чего оно состоит. Открываем AndroidManifest.xml
Загружается...







...+90
— Невероятно, я не сплю? Это какая-то дичь, 100 экспортированных активностей!, и все они общаются постоянно между собой с помощью android.content.Intent?
Не может быть такого. Наверное, сейчас открою классы и в итоге там внутри окажется заглушка для флаттера.

На самом деле - действительно, вся логика приложения написана на Java (Kotlin).
Все эти 10 разных активити отвечающие за разные webview, открываются с помощью deeplink вида mercadopago://wallet?url=http://google.com
Естественно, я начал писать отчёты в компанию о Невероятной Угрозе Информационной Безопасности Пользователей, каждому отчёту присваивал Средний Уровень Серьёзности , и описывал насколько велика угроза фишинга в виде открытой страницы внутри платёжного приложения.
Главное делать перерывы между отчётами, чтобы они не догадались о том, что уязвимости похожи.

После первого отчёта, и выплаты за него, спустя неделю, они внесли невероятный фикс для одной из десяти WebviewActivity, вот такой : android:exported="false"
Затем, как можно более аккуратно, отправлял один отчёт за другим.
"Золотая жила! Больше мне не придётся работать." — подумал я.

Но жизнь не так проста, после нескольких отчётов они догадались и сразу внесли исправление для нескольких activity.
Проклятье! Ну и ладно, найду что-нибудь другое.
Просматривая классы, обнаружил следующий код в экспортированной активности:
1.3K viewsedited  16:53
Открыть/Комментировать
2022-08-09 19:51:56
940 views16:51
Открыть/Комментировать