Digital Security Cat
87 subscribers
65 photos
9 files
38 links
Добро пожаловать на канал кота-инфобезника!
Здесь я делюсь всякими интересностями ;)

Автор: @kglebaa
Download Telegram
Еще при зарождении канала я обещал рассказать про замечательнейший (вероятно, даже must-have) ресурс от PortSwigger по освоению веб-пентестинга – BurpSuite Web Security Academy. Добро пожаловать на образовательный пост! 🐈‍⬛

Авторы ресурса приняли наиболее правильное решение – сфокусировались на одном, пусть и объемном, но все же очень конкретном направлении – и создали masterpiece на основе своего опыта работы и коммуникации с экспертами.
Академия состоит из топиков – для получения сертификации BurpSuite придется пройти их все, но ресурс также можно использовать в качестве шпаргалки. К каждому из топиков прилагается детальный теоретический конспект и набор лаб (вы можете увидеть все темы и количество практических заданий на скриншотах), и, что самое ценное, разборы для каждой из лаб.
Всего на ресурсе порядка 250 лаб – уровня apprentice, practitioner и expert. И они постоянно пополняются!

Еще одним свежим нововведением стали learning paths, организующую всю имеющуюся в Академии информацию в единый курс, по завершении которого можно овладеть всеми ключевыми концептами веб-пентестинга, жизненно необходимыми, например, для решения этой категории CTF'а. Да и в целом, это good start! :)

А еще на платформе существуют так называемые "mystery labs", которые не привязаны к конкретному топику и могут содержать даже несколько подходов – это пространство для вашего творчества и изобретательности. В таком же формате проходит и экзамен-сертификация BurpSuite, ведь он наиболее приближен к реальной практике пентеста.

#education #web_security #vulnerabilities
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥7
Привет! Многие из вас использовали Flask. Более того, многие из вас решали CTFные машинки и научены, что Flask в режиме отладки (debug=True) – дьявол. И, как подобает любому уважающему себя дьяволу, он совершенствует свои навыки искушения. Так, пользователям было предложено защитить свои интерактивные консоли Python 9-ти значным пин-кодом, генерируемым самим приложением. Вот она, безопасность! Или это лишь ловушка, чтобы заманить больше разработчиков в сети уязвимости, которую никто не собирается исправлять? 🐈‍⬛

Сегодня обсудим, как, заполучив уязвимость LFI (Local File Inclusion, когда сервер отдает содержимое своего локального файла в ответ на запрос) на Linux, однозначно восстановить Werkzeug Debugger Pin – и, как следствие, получить RCE (Remote Code Execution)! А еще во вложении вас будет ждать разбор medium-машинки с платформы Hack The Box, в котором используется этот трюк ;D

Но прежде отметем идею брутфорса – ведь миллиард значений для пина могут показаться вполне перебираемыми. Но не для веба. Хваленый Turbo Intruder позволяет организовать эту атаку со скоростью 100 тысяч запросов в минуту – что неплохо, но для наших целей не годится (ETA – неделя). А еще этот показатель может быть уменьшен в несколько порядков добавлением к запросу простенького параметра-подписи, который необходимо было бы пересчитывать перед каждым запросом.

Исследователи обнаружили, что алгоритм генерации пин-кода Werkzeug публичен – он основывается на получении хеша из публичного (имя пользователя, имя модуля, имя приложения и путь до исполняемого файла Flask) и приватного (MAC-адрес интерфейса, уникальный ID ПК и имя внутреннего сервиса) блоков информации. Таким образом, многие поля публичного блока угадываются из опыта (вернемся к этому позже), а приватный блок целиком достается из интересных (и не требующих суперправ для доступа) файлов Linux'а – в частности, /sys/class/net/eth0/address, /etc/machine-id и /proc/self/cgroup – при помощи вышеупомянутого LFI.
В Windows и macOS, справедливости ради, ситуация значительно лучше – там подобные приватные данные хранятся в реестрах, доступ к которым уже требует возможности исполнять команды (формально, пресловутого RCE, ради которого и затевалась вся сегодняшняя игра). Однако не стоит забывать, что в искусственных условиях (например, созданных авторами-инфобезниками машинках для взлома) может быть дан доступ исключительно к определенным фрагментам реестров в рамках Flask-приложения – и тогда игра снова стоит свеч! 🐈‍⬛

И мы наконец переходим к самому интересному – эксплоиту! Полный скрипт можно достать в прикрепленном исследовании Бена Грюэлла или pdf'ке со статьей из Хакера – я же покажу, как может выглядеть конфигурация для ОС Windows и Linux:

usernames = ['John']
modnames = ['flask.app', 'werkzeug.debug']
appnames = ['wsgi_app', 'DebuggedApplication', 'Flask']
flaskpaths = ['C:\\Users\\John\\AppData\\Local\\Programs\\Python\\Python311\\Lib\\site-packages\\flask\\app.py']
nodeuuids = ['345...176']
machineids = ['faf02cd3-...-9da454b0373b']

Разумеется, имя пользователя и используемую версию Python'а придется подправить. Чем еще интересен предоставленный скрипт, так это возможностью указывать несколько опций для каждого из полей – в конечном итоге будут выведены все варианты кодов с использованием itertools.product – таким образом, вручную придется перебрать не больше 6 кодов (appnames даны, кстати, в принципе все возможные в реальном продакшен-использовании Flask'а).

usernames = ['kali']
modnames = ['flask.app', 'werkzeug.debug']
appnames = ['wsgi_app', 'DebuggedApplication', 'Flask']
flaskpaths = ['/usr/lib/python3/dist-packages/flask/app.py']
nodeuuids = ['522...924']
machineids = ['5519...c0d9session-3.scope']

Надеюсь, вам понравился трюк, который я вам сегодня принес =)
Не забудьте заглянуть в статью Хакера – там правда интересная машина!
До скорых встреч ;D
Please open Telegram to view this post
VIEW IN TELEGRAM
4🐳4❤‍🔥2
🐳43
Друзья, привет! Возвращаюсь после долгого-долгого перерыва... Возвращаюсь, чтобы рассказать, чем я вообще был занят – помимо учебы, разумеется.
И с хорошими новостями о том, что я все-таки не забросил канал, а постараюсь на регулярной основе писать о том, что мне нравится =)

Как некоторые из вас знают, мы играем [почти] неизменным составом k1tt3n5, они же котята (пользуясь моментом, ребят, вы очень крутые!)

В ноябре нам довелось поучаствовать в attack-defens'e, организованном menad'ом в Иннополисе (в рамках InnoCTF Junior)
Первое наше серьезное A/D, и, я считаю, достойное выступление – поделили второе место, получили дипломчики и мерч
Кому интересно, что там происходило: https://github.com/hackforces/juniors23finals

Looking forward to выбраться на финал "серьезного" Inno Open
Но он от той "серьезности" и проигрывает – РСОШ устанавливает крайне противные ограничения, вроде того, что в олимпиаде должен присутствовать личный тур, или что результаты участников не могут влиять друг на друга (что на корню отсекает увлекательные форматы вроде A/D)

Тогда же, в ноябре, случился M*CTF для школьников, на котором присутствовали некоторые из моих тасков, чем я, безусловно, очень доволен
Забавный опыт общения с пареньком из Турции (который оказался ни много ни мало security engineer'ом Apple), который нашел соревнование на CTFtim'e и закрыл его приблизительно за ночь
Приятно, что мой таск оказался последним в этом win streak'e 🥰

Fast forward на декабрь
Где мы выступали в Кубке CTF России, организованном C4T BuT S4D ;D
Заняли вновь вторую строчку топа – но, к сожалению, формат Кубка это формат "все или ничего"
Если кому интересны материалы (а некоторые задачки там правда содержательные): гит квалов и гит финалов!

И, наконец, к концу подходят новогодние каникулы, а я заканчиваю пост для Хабра :)

На том – надеюсь – не прощаюсь!)
🐳51👍1
UAC в Python'e (исполнение привилегированных команд Windows)

Все привыкли пользоваться subprocess.Popen, однако порой возникает потребность запустить шелл-команду с root-привилегиями

Для этого можно воспользоваться прямым доступом к функции стандартной библиотеки ОС, удобной реализованной с помощью ctypes:

import ctypes

ctypes.windll.shell32.ShellExecuteW(None, 'runas', executable, args, None, 0)


Первый аргумент отвечает за связанное с операцией окно, следует оставить None (или null в Си)
Второй – за производимую операцию, в данном случае нас интересует runas, или вызов окна UAC
Третий и четвертый аргументы – строки с исполняемым файлом (либо командой, если это бинарник из PATH) и аргументами соответственно
Пятый аргумент – рабочая директория (так же строка, либо None / null в случае, если это не важно для операции)
Последний аргумент – булевая переменная, определяющая, следует ли показывать окно командной строки пользователю
В рамках использования в Python-скрипте предпочтительно устанавливать 0 (False)

#tips
🐳6🤔1👾1
Yet Another CPU Attack: GoFetch

Всем очевидно, что поиск side-channel атак на процессор – вопрос времени. Из самых простых примеров – timing атака, позволяющая извлекать данные из, казалось бы, корректно (но неэффективно) реализованной функции.

На этот раз "отличились" процессора Apple M-серии, причем все поголовно.
Не буду сгущать краски (как это делают многие СМИ!), утверждая, что эта атака повлияет на всех "яблочников" и не может быть исправлена. Это всего лишь PoC, и для успеха должно сойтись слишком много звёзд: час физического доступа к устройству – это немало. Но это ни в коем случае не делает атаку менее вдохновляющей – мне кажется, что это здесь наиболее уместное слово)

Пару дней назад исследователи опубликовали статью, в которой рассказали об уязвимом компоненте Data Memory-Dependent Prefetcher (DMP). Он подгружает в кэш разыменованные адреса памяти процесса, которые "выглядят как указатели".
Важно отметить, что реализация этого компонента не подразумевает constant-time исполнения (общепринятого стандарта защиты от timing атак), поскольку существенно влияет на производительность. Ровно поэтому и утверждается, что уязвимость невозможно закрыть – CPU значительно потеряет в производительности (однако на M3 свитч, отключающий DPM, все же присутствует).

Откуда могла взяться уязвимость? Атакующий может влиять на данные, сохраняемые в памяти процесса (пусть и косвенно, через набор операций над секретом). Каждый этап атаки на DMP определяет, "похож ли на указатель" частично подконтрольный нам фрагмент памяти (подгрузил ли его DMP в кэш). Side-channel атака, раскрывающая данные, хранимые другим процессом (а кэш-то общий!) налицо.

Исследователи сфокусировались на получении криптографических секретов стандартизированных реализаций алгоритмов.
Так, немногим меньше часа потребовалось на то, чтобы корректно восстановить 2048-битный ключ RSA из процесса OpenSSL.
Постквантовый алгоритм (в данном случае CRYSTALS) также под угрозой.

Ссылка на исследование: https://gofetch.fail/files/gofetch.pdf
Мне лично очень интересно найти время для детального осознания атаки)
3🐳1
Немножко о роли магии в программировании, или почему меня должны взять в Хогвартс

https://github.com/kgleba/portable_password_manager/commit/0d9992a7f63010ef6936c8710634d1c5c2be26f1

Решил я для своего проекта контейнеризовать сборку
Что-то в духе GitHub Actions, только локально
Ни в коем случае не претендую ни на какие best practices!! :D

Запущенный контейнер выполняет относительно шаблонные операции – склонировать удаленный репозиторий, подкачать сторонние ассеты, установить библиотечки, зипнуть результат и отдать пользователю в смонтированную папку

Специфика в том, что нужны две версии контейнера – под сборку для винды и линукса
Выполняется все, понятное дело, в рамках единого базового образа Debian'a (до эмуляции kvm'a, на основе которого построен "контейнер" винды, я благо не добрался)

И вот когда пришла пора ставить небезызвестную библиотеку pycryptodome, все и навернулось
Ибо она OS-specific
pip в рамках докера, разумеется, будет ставить Linux-версию, несовместимую с Windows-сборкой
Выход? precompiled .whl файл
Только вот pip наотрез отказался его ставить со словами "дружок, ну ты чего, ну не будет же работать"
Решение: переименовать файл .whl в тот, в котором поставлялась бы аналогичная версия под Linux (в сущности, кажется, избавиться от подстроки win достаточно)
Установил без нареканий.

У меня все
3👏2