
حقن مكتبة مشتركة (أي كود عشوائي) في عملية لينكس حية، دون ptrace
حقن مكتبة مشتركة (أي كود عشوائي) في عملية لينكس حية، دون استخدام 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.
عمل نسخة احتياطية لجزء من المكدس، والكود الذي سنقوم باستبداله بـ shellcode، عن طريق القراءة من /proc/[pid]/mem.
توليد مخازن shellcode الأولية والثانوية.
إدراج shellcode الأولي عند RIP، عن طريق الكتابة إلى /proc/[pid]/mem.
shellcode الأولي:
mmap().shellcode الثانوي:
_dl_open() لتحميل المكتبة التي يحددها المستخدم. سيتم تنفيذ أي منشئات عند التحميل، كالمعتاد.SIGSTOP الأصلية.إرسال SIGSTOP قد يسبب آثاراً جانبية غير مرغوب فيها، مثلاً لو كان هناك خيط آخر ينتظر waitpid(). خيار --stopmethod=cgroup_freeze يتجنب ذلك، لكنه يتطلب صلاحيات الجذر (على معظم التوزيعات على الأقل).
لست متأكداً تماماً كيف سيتفاعل هذا مع التطبيقات المعقدة متعددة الخيوط. هناك بالتأكيد احتمالية للتعطل.
يعمل فقط على لينكس x86-64 (في الوقت الحالي - يمكن إضافة دعم 32 بت مستقبلاً).
يتطلب صلاحيات الجذر، أو إعدادات YAMA المخففة (echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope مفيد أثناء الاختبار).
إذا كانت العملية المستهدفة محصورة (مثل مرشحات seccomp)، فقد لا يكون لديها إذن لاستخدام mmap() لـ shellcode الثانوي، أو لاستخدام dlopen() للمكتبة.