В свежей бете телеги интересное обновление есть:
теперь можно смешивать жирный, курсив, подчеркнутый?,зачеркнутый?
Жирный + курсив = жирный курсив.
Жирный + подчеркивание = жирное подчеркивание
Подчеркнутый курсив...
Жирный подчеркнутый курсив?
Жирный подчеркнутый зачеркнутый курсив!
А вот с
теперь можно смешивать жирный, курсив, подчеркнутый?,
моношир?Жирный + курсив = жирный курсив.
Жирный + подчеркивание = жирное подчеркивание
Подчеркнутый курсив...
Жирный подчеркнутый курсив?
А вот с
моноширом не работает(Необычный дуалбут: ноутбук с «двойным дном»
Внезапно, весьма приличная техническая статья на хабре.
Хайлайты: ручками дергаем ATA, реверсим, а потом и патчим прошивку контроллера жесткого диска в памяти, отлаживаем UEFI, пишем уефишный драйвер...
Внезапно, весьма приличная техническая статья на хабре.
Хайлайты: ручками дергаем ATA, реверсим, а потом и патчим прошивку контроллера жесткого диска в памяти, отлаживаем UEFI, пишем уефишный драйвер...
Хабр
Необычный дуалбут: ноутбук с «двойным дном»
Не так давно на Habr Q&A я наткнулся на интересный вопрос — как сделать, чтобы два жестких диска не видели друг друга? Чтобы вирус, попав на одну систему, никоим образом не мог заразить другую. В...
Вечерний вопрос от санитара: каким образом надо комментировать атрибуты классов в python, чтобы VSCode+pylance научился рисовать доки к ним?
Имеющиеся варианты:
1)
Имеющиеся варианты:
1)
class Test:2)
""" class docs """
field: str # docs
class Test:3)
""" class docs """
field: str
""" docs """
class Test:Все три, очевидно, не работают)
""" class docs """
""" docs """
field: str
Forwarded from ZeroNights
CTF-команда kks совместно с новостным порталом CTF News предлагают небольшой хакквест, на котором можно почиллить, порешать таски и получить за это подарочки.
Таски готовы, можно решать! Ссылка на квест: zn.kksctf.ru
Таски готовы, можно решать! Ссылка на квест: zn.kksctf.ru
Прилетела новая бетка десктопной телеги: теперь можно смотреть, кто прочитал твое сообщения в небольших группах.
Что такое небольшая группа - вопрос отдельный, правда, учитывая, что разделение на группы и супергруппы, вроде, ушло в прошлое.
Работает в прошлое, кстати, где-то до 4-5 сентября.
Ну и записывать видосы разрешили (а то раньше при записи звонка на выходе было только аудио)
Что такое небольшая группа - вопрос отдельный, правда, учитывая, что разделение на группы и супергруппы, вроде, ушло в прошлое.
Работает в прошлое, кстати, где-то до 4-5 сентября.
Ну и записывать видосы разрешили (а то раньше при записи звонка на выходе было только аудио)
Продолжая нерегулярную рубрику "а че там с бетой телеги"
Прилетела версия 3.0.5 beta, в которой в дефолтной синей теме поменяли цвет некоторых элементов.
Слева - было; Справа - стало
Вариант вернуть старую синюю тему: t.me/addtheme/h9soEq0wbHH4Co9k. Можно скачать себе файлом и поставить независимую версию)
Прилетела версия 3.0.5 beta, в которой в дефолтной синей теме поменяли цвет некоторых элементов.
Слева - было; Справа - стало
Вариант вернуть старую синюю тему: t.me/addtheme/h9soEq0wbHH4Co9k. Можно скачать себе файлом и поставить независимую версию)
Yet another WSL2 trick
Если хочется получить доступ к сервису, запущенному во втором весле из локальной сети, а не только с тачки с самим веслом - пригодится https://github.com/CzBiX/WSLHostPatcher.
Суть - когда внутри второго весла открывается listen tcp-порт - небольшой бинарь, маппящий всякие взаимодействия между виндой и веслом - wslhost.exe - начинает слушать этот же порт на 127.0.0.1 в винде, фактически выступая в роли tcp-прокси между виндой и веслом.
В итоге для пользователя появляется прозрачный доступ к порту, открытому в весле, но из локалки он не доступен.
Всё, что делает вышеупомянутая утилита - патчит в памяти этот бинарь, чтобы он открывал соединения не на 127.0.0.1, а на 0.0.0.0, слушая его на всех интерфейсах.
Нашел давно, но думал, что это достаточно узкая и частная проблема, а внезапно оказалось, что это не так)
Если хочется получить доступ к сервису, запущенному во втором весле из локальной сети, а не только с тачки с самим веслом - пригодится https://github.com/CzBiX/WSLHostPatcher.
Суть - когда внутри второго весла открывается listen tcp-порт - небольшой бинарь, маппящий всякие взаимодействия между виндой и веслом - wslhost.exe - начинает слушать этот же порт на 127.0.0.1 в винде, фактически выступая в роли tcp-прокси между виндой и веслом.
В итоге для пользователя появляется прозрачный доступ к порту, открытому в весле, но из локалки он не доступен.
Всё, что делает вышеупомянутая утилита - патчит в памяти этот бинарь, чтобы он открывал соединения не на 127.0.0.1, а на 0.0.0.0, слушая его на всех интерфейсах.
Нашел давно, но думал, что это достаточно узкая и частная проблема, а внезапно оказалось, что это не так)
GitHub
GitHub - CzBiX/WSLHostPatcher: Dynamic patch WSL2 to listen port on any interface.
Dynamic patch WSL2 to listen port on any interface. - CzBiX/WSLHostPatcher
В продолжение извращений - есть маленький бинарь на rust, который транслируется все вызовы себя в git в весле.
https://github.com/andy-5/wslgit
У него довольно узкий юзкейс, но вдруг кому-то пригодится)
https://github.com/andy-5/wslgit
У него довольно узкий юзкейс, но вдруг кому-то пригодится)
GitHub
GitHub - andy-5/wslgit: Use Git installed in Bash on Windows/Windows Subsystem for Linux (WSL) from Windows and Visual Studio Code…
Use Git installed in Bash on Windows/Windows Subsystem for Linux (WSL) from Windows and Visual Studio Code (VSCode) - andy-5/wslgit
.рубик
Yet another WSL2 trick Если хочется получить доступ к сервису, запущенному во втором весле из локальной сети, а не только с тачки с самим веслом - пригодится https://github.com/CzBiX/WSLHostPatcher. Суть - когда внутри второго весла открывается listen tcp…
Небольшой upd к этому посту.
Как верно заметили в комментариях, этого же эффекта можно достичь через виндовую утилиту
Работает на какой-то магии внутри сетевого стека винды. На мой взгляд, не так удобно - это лишние правила непонятно чего, которые непонятно где лежат и непонятно когда появятся/отвалятся. Да и чисто одной командой это обычно не сделать, всё же нужен нормальный скрипт.
Как пример, полный такой скрипт, который достает айпишник весла (он меняется периодически, да, это отдельная головная боль) и создает правила для WFP - тут.
Однако!
Народ придумал ещё аж два способа выпихивать весло бриджем в реальную сетку: раз, два (описание второго).
Собственно, весьтред issue с обсуждением проблемы тут: https://github.com/microsoft/WSL/issues/4150
Как верно заметили в комментариях, этого же эффекта можно достичь через виндовую утилиту
netsh:netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=172.18.28.xРаботает на какой-то магии внутри сетевого стека винды. На мой взгляд, не так удобно - это лишние правила непонятно чего, которые непонятно где лежат и непонятно когда появятся/отвалятся. Да и чисто одной командой это обычно не сделать, всё же нужен нормальный скрипт.
Как пример, полный такой скрипт, который достает айпишник весла (он меняется периодически, да, это отдельная головная боль) и создает правила для WFP - тут.
Однако!
Народ придумал ещё аж два способа выпихивать весло бриджем в реальную сетку: раз, два (описание второго).
Собственно, весь
GitHub
[WSL 2] NIC Bridge mode 🖧 (Has TCP Workaround🔨) · Issue #4150 · microsoft/WSL
Issue WSL 2 seems to NAT it's virtual network, instead of making it bridged to the host NIC. My goal is for a service running in Ubuntu in WSL 2 to be accessible from anywhere on my local netwo...
Ещё одна фича особенность WSL2, о которой знают не все)
Каждый раз, когда второе весло запускается - создается новая hyper-v сетка.
Соответственно, и айпишник самого весла, и айпишник винды в этой сетке каждый раз разный.
В итоге, если надо из весла сходить на какой-то сервис (например, иксы) в винде - надо сначала сначала определить этот айпишник
Наиболее простой и стабильный способ это сделать - вот такой вот однострочник для баша, который дергает виндовый netsh.
После определения айпишника достаточно проверить, что сервис слушает не 127.0.0.1, а ip винды/0.0.0.0 - и всё, из весла можно на него сходить, других препятствий нет.
Каждый раз, когда второе весло запускается - создается новая hyper-v сетка.
Соответственно, и айпишник самого весла, и айпишник винды в этой сетке каждый раз разный.
В итоге, если надо из весла сходить на какой-то сервис (например, иксы) в винде - надо сначала сначала определить этот айпишник
Наиболее простой и стабильный способ это сделать - вот такой вот однострочник для баша, который дергает виндовый netsh.
export REAL_WSL_ADDR=`netsh.exe interface ip show ipaddresses "vEthernet (WSL)" | head -n 2 - | tail -n 1 | awk '{ print $2; }'`
Есть ещё один вариант, через /etc/resolv.conf - но у меня весло стабильно криво поднимает DNS, поэтому конфиг резолва со статикой, и этот вариант не подходит.После определения айпишника достаточно проверить, что сервис слушает не 127.0.0.1, а ip винды/0.0.0.0 - и всё, из весла можно на него сходить, других препятствий нет.
.рубик
Ещё одна фича особенность WSL2, о которой знают не все) Каждый раз, когда второе весло запускается - создается новая hyper-v сетка. Соответственно, и айпишник самого весла, и айпишник винды в этой сетке каждый раз разный. В итоге, если надо из весла сходить…
К слову о
Можно также выключить генерацию host'ов, например.
А о других настройках можно тут почитать, можно, например, отключить проброс виндовых бинарей и сломать штуку из предыдущего поста)
Also, там же, но чуть ниже, описано, как настроить то, как весло будет потреблять память.
resolv.conf - чтобы отучить винду от запихивания в весло своего DNS, а равно как и от автоматической генерации конфига при каждом запуске весла, надо прописать в /etc/wsl.conf сие:[network]И не забыть создать свой собственный
generateHosts = true
generateResolvConf = false
resolv.conf, а то весло больно умное, и всё равно будет пытаться создавать его.Можно также выключить генерацию host'ов, например.
А о других настройках можно тут почитать, можно, например, отключить проброс виндовых бинарей и сломать штуку из предыдущего поста)
Also, там же, но чуть ниже, описано, как настроить то, как весло будет потреблять память.
.рубик
Yet another WSL2 trick Если хочется получить доступ к сервису, запущенному во втором весле из локальной сети, а не только с тачки с самим веслом - пригодится https://github.com/CzBiX/WSLHostPatcher. Суть - когда внутри второго весла открывается listen tcp…
BTW, я форкал WSLHostPatch - https://github.com/Rubikoid/WSLHostPatcher, чтобы он пробрасывал только только один порт (захардкожено в коде. Можно сделать по-умному, с гуем и красивостями, но зачем.)
Ну и заодно впилил функцию eject'a патча, если он больше не нужен. Билдов правда нет, так что компилить придётся самому.
И, заканчивая пиар своего гитхаба - есть репо с дотфайлами, где в zshrc лежит ещё пара приколов с веслом, типа проброса SSH-агента от keepass'a внутрь весла.
Ну и заодно впилил функцию eject'a патча, если он больше не нужен. Билдов правда нет, так что компилить придётся самому.
И, заканчивая пиар своего гитхаба - есть репо с дотфайлами, где в zshrc лежит ещё пара приколов с веслом, типа проброса SSH-агента от keepass'a внутрь весла.
GitHub
GitHub - Rubikoid/WSLHostPatcher: Dynamic patch WSL2 to listen port on any interface.
Dynamic patch WSL2 to listen port on any interface. - Rubikoid/WSLHostPatcher
Очередной пост про весло.
На этот раз, правда, с болью: я запустилвесло или не весло, а сам пакман в результате потеряло часть системных файлов.
Их было достаточно много, при этом: например, bash или sudo просто не было, как таковых (они стали размером в 0 байт), а zsh ругался на:
В целом, из оставшихся доступных взаимодействий был маппинг весла по сети, был бинарь
Какое решение всей это проблемы вышло по итогу:
Качается сама либа из пакетов арча:
Либа распаковывается куда-нибудь, а дальше в проводнике открывается сетевой путь до
Распаковать сразу в
Дальше фикшу либу, и можно уже заходить в шелл.
Логичней всего это делать через пакман, но увы - пакман тоже умер, поэтому по старой схеме - качаем https://archlinux.org/packages/core/x86_64/krb5,
распаковываем, накатываем поверх системы.
Ура, пакман появился, но починить всё нам будет мешать неработащий
(можно прописать "
Теперь gpg полностью работает, и можно наконец перенакатывать все пакеты:
Последним этапом можно попробовать поискать по системе мертвые файлы через лютый
UPD: покопался у себя в event viewer, и похоже, что причиной этому был OOM - весло попросило слишком много памяти, и винда убила виртуалку. pacman такое переживает достаточно плохо.
UPDx2: В комментариях подсказали, что восстановление после такого краша описано на арчевики - если вкратце, то половину действий можно упростить при наличии
На этот раз, правда, с болью: я запустил
pacman -Syu, а Их было достаточно много, при этом: например, bash или sudo просто не было, как таковых (они стали размером в 0 байт), а zsh ругался на:
zsh: error while loading shared libraries: /usr/lib/libcap.so.2: file too short
Очевидно, либа тоже была 0 байт.В целом, из оставшихся доступных взаимодействий был маппинг весла по сети, был бинарь
wsl.exe (есть ещё bash, но я проиграл в рулетку, и баш был тоже обнулен).Какое решение всей это проблемы вышло по итогу:
Качается сама либа из пакетов арча:
https://archlinux.org/packages/core/x86_64/libcap/Как-то её придется распаковать, а расжимать zstd скорее всего нечем - поэтому качается разжималка zstd отсюда
Либа распаковывается куда-нибудь, а дальше в проводнике открывается сетевой путь до
tmp внутри весла \\wsl$\Arch\tmp, куда переносится либа. Распаковать сразу в
/usr из винды нельзя - винда ругается на пермишены (и правильно ругается кста).Дальше фикшу либу, и можно уже заходить в шелл.
wsl -u root -e /bin/cp -r /tmp/usr /
Но всё веселье только начинается, надо ж ещё починить систему!Логичней всего это делать через пакман, но увы - пакман тоже умер, поэтому по старой схеме - качаем https://archlinux.org/packages/core/x86_64/krb5,
распаковываем, накатываем поверх системы.
Ура, пакман появился, но починить всё нам будет мешать неработащий
gpgme - его тоже придется накатить поверх системы.(можно прописать "
SigLevel = Never" в /etc/pacman.conf, но переустановить сам gpgme у меня всё равно не вышло - вылезли проблемы с либами).Теперь gpg полностью работает, и можно наконец перенакатывать все пакеты:
pacman -S --overwrite "*" $(pacman -Qnq) Последним этапом можно попробовать поискать по системе мертвые файлы через лютый
find / \( -path '/mnt' -o -path '/sys' -o -path '/proc' -o -path '/dev' -o -path '/run' \) -prune -o -size 0c -print | grep -vE "lock|.gitkeep|__init__.py\$"
Но я у себя ничего не нашел.UPD: покопался у себя в event viewer, и похоже, что причиной этому был OOM - весло попросило слишком много памяти, и винда убила виртуалку. pacman такое переживает достаточно плохо.
UPDx2: В комментариях подсказали, что восстановление после такого краша описано на арчевики - если вкратце, то половину действий можно упростить при наличии
pacman-static (статической версии пакмана), или просто другого работающего арча, например, livecd, хотя в случае с веслом это сложнее. Also, мертвые файлы можно искать менее лютым find /usr/lib -size 0 - поскольку при обновлении пакетов из реп задевается только этот путь.Невероятно годная серия статей о разборе проприетарного формата карт для автомобильной навигационной системы.
Товарищ творит какую-то жесть в 010editor, я и не знал, что темплейты настолько широкие возможности дают.
Да и в целом материал с точки зрения подхода к форензике по данным, о которых ничего не известно - весьма хороший.
Первая часть и вторая часть.
Больше пока нет)
Товарищ творит какую-то жесть в 010editor, я и не знал, что темплейты настолько широкие возможности дают.
Да и в целом материал с точки зрения подхода к форензике по данным, о которых ничего не известно - весьма хороший.
Первая часть и вторая часть.
Больше пока нет)
Хабр
Реверс черного тессеракта. Начало
Система с известной спецификацией реакций на входные воздействия и неизвестным содержимым характеризуется как черный ящик. Когда внутренняя структура, устройство и архитектура системы известны, - ящик...
Forwarded from Ivan's work&life thoughts
В питонячей либе celery нашли забавную CVE, причем я тоже думал о подобной проблеме когда делал таск на кубок CTF России, и как оказывается недокрутил потенциальную CVE.
Давайте попробую рассказать про что там.
Celery - реализация очереди задач для Python. Основной функционал - возможность создавать и планировать задачи (единица исполнения кода), которые потом могут быть выполнены на другом воркере.
Воркер - процесс, который выполняет задачи из очереди. Воркеров может быть много и они могут быть запущены на разных машинах.
Чтобы доставить информацию о задачах на другие машины нужно использовать какое-то внешнее хранилище/брокер, например redis или rabbitmq.
Также celery позволяет хранить информацию о результатах выполнения задачи из коробки в так называемых result backend’ах. Это опять же может быть redis/memcached/бд. [1]
Вопрос, который я задал себе при составлении таска около месяца назад - «а что если мы можем повлиять на хранилище тасков (брокер) или хранилище результатов ?»
Может показаться что такое маловероятно, но достаточно популярный вариант брокера/бэкенда — redis (k-v хранилище).
При этом многие приложения могут использовать редис для кэширования или позволять пользователю хранить там свои данные.
Представить что для простоты деплоя люди будут использовать один и тот же редис для кэширования, хранения данных и celery достаточно легко.
Люди, которые интересуются безопасностью, могут быстро придумать вектор — сериализация (способ кодирования/декодирования объектов в рантайме в байты).
В питоне для сериализации есть очень мощный, но страшный инструмент — pickle. Pickle позволяет сохранить любой питоновский объект в байты, но несет by-design проблему безопасности — десериализовать можно любой объект с мета-поведением, из-за чего при десериализации может быть выполнен произвольный код. [2]
Но разработчики celery прошли этот этап. По-умолчанию в celery используется JSON сериализация. Это накладывает ограничения на объект, который вы можете положить в результат или аргумент задачи, но делает эту историю безопаснее.
Однако вы все еще можете создать свою задачу если имеете доступ к хранилищу задач. Так, если перед вызовом задачи будут какие-то проверки (например права пользователя), то вы сможете их обойти создав свою задачу.
Именно эта идея легла в основу моей задачи на кубок CTF. [3]
А теперь про CVE.
Задача может упасть с ошибкой. Если результатом выполнения задачи будет исключение (exception), то celery честно положит эксепшен в result backend (как строку в случае JSON).
Если приложение захочет получить результат упавшей задачи, то celery прочитает информацию об исключении из брокера и попытается найти/создать тип данных, который задан в строке. [4]
Если немного детальнее, то в случае JSON сериализации в строке будет модуль, тип эксепшена и сообщение.
Передаем модуль - os, тип - system, сообщение - ls.
И celery честно попытается найти модуль os, и сделать вызов конструктора/функции system с аргументом ls.
Красивое RCE.
Fix
В фиксе [5] сейчас проверяется что полученный тип является наследником exception’a или класса ‘type’. Кажется звучит безопасно, но возможно супер-знатоки питона скажут что нет.
[1] https://docs.celeryproject.org/en/stable/getting-started/backends-and-brokers/index.html
[2] https://davidhamann.de/2020/04/05/exploiting-python-pickle/
[3] https://github.com/acisoru/ctfcup-21-quals/tree/main/tasks/web/json-config
[4] https://github.com/celery/celery/blob/c79d5c79c1c212b1f7e5036b7dca18568eae68de/celery/backends/base.py#L405
[5] https://github.com/celery/celery/commit/1f7ad7e6df1e02039b6ab9eec617d283598cad6b
Давайте попробую рассказать про что там.
Celery - реализация очереди задач для Python. Основной функционал - возможность создавать и планировать задачи (единица исполнения кода), которые потом могут быть выполнены на другом воркере.
Воркер - процесс, который выполняет задачи из очереди. Воркеров может быть много и они могут быть запущены на разных машинах.
Чтобы доставить информацию о задачах на другие машины нужно использовать какое-то внешнее хранилище/брокер, например redis или rabbitmq.
Также celery позволяет хранить информацию о результатах выполнения задачи из коробки в так называемых result backend’ах. Это опять же может быть redis/memcached/бд. [1]
Вопрос, который я задал себе при составлении таска около месяца назад - «а что если мы можем повлиять на хранилище тасков (брокер) или хранилище результатов ?»
Может показаться что такое маловероятно, но достаточно популярный вариант брокера/бэкенда — redis (k-v хранилище).
При этом многие приложения могут использовать редис для кэширования или позволять пользователю хранить там свои данные.
Представить что для простоты деплоя люди будут использовать один и тот же редис для кэширования, хранения данных и celery достаточно легко.
Люди, которые интересуются безопасностью, могут быстро придумать вектор — сериализация (способ кодирования/декодирования объектов в рантайме в байты).
В питоне для сериализации есть очень мощный, но страшный инструмент — pickle. Pickle позволяет сохранить любой питоновский объект в байты, но несет by-design проблему безопасности — десериализовать можно любой объект с мета-поведением, из-за чего при десериализации может быть выполнен произвольный код. [2]
Но разработчики celery прошли этот этап. По-умолчанию в celery используется JSON сериализация. Это накладывает ограничения на объект, который вы можете положить в результат или аргумент задачи, но делает эту историю безопаснее.
Однако вы все еще можете создать свою задачу если имеете доступ к хранилищу задач. Так, если перед вызовом задачи будут какие-то проверки (например права пользователя), то вы сможете их обойти создав свою задачу.
Именно эта идея легла в основу моей задачи на кубок CTF. [3]
А теперь про CVE.
Задача может упасть с ошибкой. Если результатом выполнения задачи будет исключение (exception), то celery честно положит эксепшен в result backend (как строку в случае JSON).
Если приложение захочет получить результат упавшей задачи, то celery прочитает информацию об исключении из брокера и попытается найти/создать тип данных, который задан в строке. [4]
Если немного детальнее, то в случае JSON сериализации в строке будет модуль, тип эксепшена и сообщение.
Передаем модуль - os, тип - system, сообщение - ls.
И celery честно попытается найти модуль os, и сделать вызов конструктора/функции system с аргументом ls.
Красивое RCE.
Fix
В фиксе [5] сейчас проверяется что полученный тип является наследником exception’a или класса ‘type’. Кажется звучит безопасно, но возможно супер-знатоки питона скажут что нет.
[1] https://docs.celeryproject.org/en/stable/getting-started/backends-and-brokers/index.html
[2] https://davidhamann.de/2020/04/05/exploiting-python-pickle/
[3] https://github.com/acisoru/ctfcup-21-quals/tree/main/tasks/web/json-config
[4] https://github.com/celery/celery/blob/c79d5c79c1c212b1f7e5036b7dca18568eae68de/celery/backends/base.py#L405
[5] https://github.com/celery/celery/commit/1f7ad7e6df1e02039b6ab9eec617d283598cad6b
David Hamann
Exploiting Python pickles
How unpickling untrusted data can lead to remote code execution.
🔥1
.рубик
Вечерний вопрос от санитара: каким образом надо комментировать атрибуты классов в python, чтобы VSCode+pylance научился рисовать доки к ним? Имеющиеся варианты: 1) class Test: """ class docs """ field: str # docs 2) class Test: """ class…
Ответ на вопрос от санитара полугодовй давности, кстати: работает второй вариант.
Что-то обновилось, и где-то поддержку комментов к филдам завезли.
Дока из
Что-то обновилось, и где-то поддержку комментов к филдам завезли.
Дока из
pydantic.Field, правда, пока не подтягивается, как и наоборот - дока из питоновского коммента в схему.