
Внедрить общую библиотеку (т.е. произвольный код) в активный процесс Linux, без ptrace
Внедрение общей библиотеки (т.е. произвольного кода) в работающий процесс Linux без ptrace. Вдохновлено Cexigua и linux-inject, а также другими проектами.
.___.__ .__ __ __
__| _/| | |__| ____ |__| ____ _____/ |_ ______ ___.__.
/ __ | | | | |/ \ | |/ __ \_/ ___\ __\ \____ < | |
/ /_/ | | |_| | | \ | \ ___/\ \___| | | |_> >___ |
\____ | |____/__|___| /\__| |\___ >\___ >__| /\| __// ____|
\/ \/\______| \/ \/ \/|__| \/
source: https://github.com/DavidBuchanan314/dlinject
usage: dlinject.py [-h] [--stopmethod {sigstop,cgroup_freeze,none}]
pid /path/to/lib.so
Inject a shared library into a live process.
positional arguments:
pid The pid of the target process
/path/to/lib.so Path of the shared library to load (note: must be
relative to the target process's cwd, or absolute)
optional arguments:
-h, --help show this help message and exit
--stopmethod {sigstop,cgroup_freeze,none}
How to stop the target process prior to shellcode
injection. SIGSTOP (default) can have side-effects.
cgroup freeze requires root. 'none' is likely to cause
race conditions.
Потому что могу.
Существуют различные анти-ptrace техники, которые данный метод обходит, просто не используя ptrace.
Мне не нравится ptrace.
Использование LD_PRELOAD иногда может быть сложным или невозможным, если процесс, в который вы хотите внедриться, порождается другим процессом с чистым окружением.
Отправка сигнала остановки целевому процессу (опционально).
Поиск символа _dl_open().
Получение RIP и RSP через /proc/[pid]/syscall.
Создание резервной копии части стека и кода, который будет перезаписан шеллкодом, путём чтения из /proc/[pid]/mem.
Генерация буферов первичного и вторичного шеллкода.
Вставка первичного шеллкода по адресу RIP путём записи в /proc/[pid]/mem.
Первичный шеллкод:
mmap().Вторичный шеллкод:
_dl_open() для загрузки указанной пользователем библиотеки. Конструкторы выполняются при загрузке, как обычно.Отправка SIGSTOP может вызвать нежелательные побочные эффекты, например, если другой поток ожидает waitpid(). Опция --stopmethod=cgroup_freeze позволяет этого избежать, но требует прав root (по крайней мере, на большинстве дистрибутивов).
Я не совсем уверен, как это будет взаимодействовать со сложными многопоточными приложениями. Определённо существует вероятность поломок.
Только x86-64 Linux (пока; поддержка 32-битных систем может быть добавлена).
Требуются права root или ослабленная конфигурация YAMA (echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope полезно при тестировании).
Если целевой процесс изолирован (например, с помощью фильтров seccomp), у него может не быть разрешения на mmap() для второго этапа шеллкода или на dlopen() библиотеки.
SIGSTOP