将共享库(即任意代码)注入到活动的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() 符号。
通过 /proc/[pid]/syscall 获取 RIP 和 RSP。
通过读取 /proc/[pid]/mem,备份部分栈以及我们将要用 shellcode 覆盖的代码。
生成主 shellcode 和次 shellcode 缓冲区。
通过写入 /proc/[pid]/mem,在 RIP 处插入主 shellcode。
主 shellcode:
mmap() 加载次 shellcode。次 shellcode:
_dl_open() 加载用户指定的库。其构造函数将在加载时照常执行。SIGSTOP 时的位置。发送 SIGSTOP 可能会导致不必要的副作用,例如,如果另一个线程正在等待 waitpid()。--stopmethod=cgroup_freeze 选项可以避免这种情况,但需要 root 权限(至少在大多数发行版中是这样)。
我不完全确定这将如何与复杂的多线程应用程序交互。肯定存在破坏的可能性。
仅支持 x86-64 Linux(目前——未来可能会添加 32 位支持)。
需要 root 权限,或放宽的 YAMA 配置(echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope 在测试时很有用)。
如果目标进程被沙盒化(例如 seccomp 过滤器),它可能没有权限对第二阶段的 shellcode 执行 mmap(),或对库执行 dlopen()。