
تعزيز رؤية الشبكة من وجهات نظر متعددة لمضيفين آخرين
في الحروب، CornerShot هو سلاح يسمح للجندي بالنظر حول الزاوية (وربما إطلاق النار) دون تعريض نفسه للخطر. بالمثل، تتيح حزمة CornerShot للشخص النظر إلى وصول الشبكة لمضيف بعيد دون الحاجة إلى امتيازات خاصة على ذلك المضيف.
باستخدام CornerShot، يمكن لـ المصدر، الذي لديه وصول شبكي إلى الناقل، تحديد ما إذا كان هناك وصول شبكي بين الناقل والهدف لمنفذ محدد p.
على سبيل المثال، لنفترض أن فريقًا أحمر يحاول الانتشار من مضيف مصدر "مخترق" A، إلى مضيف هدف X، حيث لا يملك المضيف A وصولاً إليه. إذا انتشروا عبر المضيف B، عندها فقط سيكتشفون أنه لا يوجد وصول شبكي بين المضيف B و X.
باستخدام CornerShot، يمكن للفريق اكتشاف أن المضيف C لديه بالفعل وصول إلى الهدف X، لذا يجب أن يتم الانتشار نحو الهدف X عبر المضيف C أولاً.
+-----+ +-----+ +-----+
| | | | filtered | |
| A +--------> B +----X--->(p) X |
| | | | | |
+-----+ +-----+ +-(p)-+
source carrier target
+ ^
| |
| +-----+ |
| | | open |
+---------->+ C +-------------+
| |
+-----+
على غرار nmap، يميز CornerShot بين حالات المنافذ التالية: مفتوح، مغلق، مفلتر و غير معروف (إذا تعذر تحديده).
يوضح العرض التوضيحي التالي تشغيل CornerShot ضد مضيفين ناقلين 172.0.1.12 و 172.0.1.13، لتحديد ما إذا كان لديهما وصول شبكي إلى 192.168.200.1:

اقرأ المزيد هنا.
قد تتطلب المهمة التي تبدو بسيطة لتحديد ما إذا كان المضيف B في الشبكة لديه وصول إلى المضيف C نشرًا كبيرًا لمستشعرات الشبكة، أو عوامل جهاز، أو جمع مجموعة كبيرة من قواعد جدار الحماية، وتكوينات الموجه، وسياسات المضيف.
يمكن لـ CornerShot تبسيط هذه العملية باستخدام عامل واحد (أو عدد قليل جدًا) يمكنه الاستعلام عن المضيفين الآخرين في الشبكة، لتحديد وصولهم إلى المضيفين البعيدين.
تكافح فرق الأمن التي تستخدم BloodHound للعثور على مسارات تصعيد الامتيازات وتخفيفها داخل شبكتها، غالبًا مع ملايين المسارات المنطقية التي يكتشفها BloodHound.
ShotHound هي أداة تدمج CornerShot مع BloodHound، من أجل اكتشاف المسارات العملية التي يدعمها الوصول الشبكي.
يمكن استخدام CornerShot كحزمة، أو كوحدة مستقلة. المتطلبات الوحيدة هي Python 3 وحزمة impacket.
pip install cornershot
يتطلب الاستخدام الأساسي بيانات اعتماد مستخدم مجال صالح، واسم نطاق FQDN، وعنوان IP للناقل وعنوان IP للهدف.
python -m cornershot <user> <password> <domain> <carrier> <target>
لمسح مجموعة من الناقلين ضد مجموعة من الأهداف، يمكن استخدام الشبكات الفرعية أو نطاقات IP مفصولة بفواصل:
python -m cornershot <user> <password> <domain> 192.168.1.10-192.168.1.20 192.168.5.0/24,192.168.6.0/24
بشكل افتراضي، سيحاول CornerShot مسح المنافذ التالية: 135, 445, 3389, 5985, 5986. يمكن للمستخدم توفير قائمة مفصولة بفواصل من المنافذ ونطاقات المنافذ:
python -m cornershot -tp 22,8080,45000-45005 <user> <password> <domain> <carrier> <target>
في الكود، يحتاج المرء إلى إنشاء كائن CornerShot مع اسم المستخدم وكلمة المرور واسم المجال لمستخدم مجال صالح. تتم إضافة الناقلين والأهداف والمنافذ عبر طريقة add_shots. بمجرد الاستعداد، يمكن استدعاء طريقة open_fire، التي تقوم فقط بإجراء استدعاءات RPC ذات الصلة بناءً على المنافذ المطلوبة.
from cornershot import CornerShot
cs = CornerShot("username", "password", "fqdn")
cs.add_shots(carriers=["192.168.1.1"],targets=["192.168.1.2","192.168.1.3"])
results = cs.open_fire()
نتيجة open_fire هي قاموس بمفاتيح الناقلين، ولكل ناقل مجموعة أخرى من المفاتيح للأهداف، وأخيرًا، يحمل كل هدف قاموسًا للمنافذ وحالاتها الخاصة. هذا مثال على تنسيق النتيجة:
{'carrier_1':
{'target_1':
{135: 'unknown', 445: 'filtered', 3389: 'filtered', 5986: 'filtered', 5985: 'filtered'},
'target_2':
{135: 'unknown', 445: 'open', 5985: 'unknown', 5986: 'filtered', 3389: 'open'}
},
'carrier_2':
{'target_1':
{3389: 'filtered', 135: 'filtered', 5985: 'filtered', 445: 'filtered', 5986: 'unknown'},
'target_2':
{5985: 'filtered', 5986: 'filtered', 445: 'filtered', 135: 'filtered', 3389: 'open'}
}
}
يعتمد CornerShot على طرق استدعاء الإجراءات البعيدة (RPC) القياسية والموثقة جيدًا والمستخدمة من قبل خدمات Microsoft المتنوعة. باستخدام طرق تتطلب فقط حسابًا مصادقًا عليه في المجال، يستطيع CornerShot تشغيل حركة مرور شبكة من مضيف ناقل إلى هدف.
يستطيع CornerShot تحديد حالة منفذ البعيد عن طريق قياس الوقت الذي استغرقه استدعاء RPC، واستخدام أكواد خطأ مختلفة لكل طريقة RPC.
قد يكون القارئ على دراية بـ "خلل الطابعة"، الذي اكتشفه Lee Christensen. على الرغم من أنه يسمى خللًا، إلا أنه سلوك موثق جيدًا لخدمة الطباعة، والذي يسمح لأي مستخدم مصادق عليه بإجبار خادم بعيد على المصادقة على أي جهاز، باستخدام طريقة RpcRemoteFindFirstPrinterChangeNotificationEx.
يستخدم CornerShot طرق RPC التالية من عدة بروتوكولات Microsoft (هناك العديد من الطرق الإضافية، سيتم تنفيذها في الإصدارات المستقبلية):
يتم تنفيذ البروتوكولات نفسها عبر حزمة impacket الرائعة.
تستقبل هذه الطريقة printerName كمعامل. يمكن أن يكون اسم printerName مسارًا لملف محلي، أو ملف بعيد، أو حتى طابعة ويب. من خلال توفير اسم يتوافق مع تنسيق WEB_PRINT_SERVER، من الممكن الاستعلام عن أي منفذ بعيد. أحد الأمثلة على اسم خادم طباعة ويب سيؤدي إلى تشغيل حركة مرور HTTP إلى مضيف ومنفذ بعيدين هو: "http://<target_ip>:<target_port>/printers/ppp/.printer".
لاستخدام هذه الطريقة، نحتاج إلى نهج من خطوتين: أولاً، فتح مفتاح تسجيل على المضيف البعيد - مما يؤدي إلى مقبض صالح، وثانيًا، محاولة حفظ نسخة احتياطية من هذا المقبض إلى ملف بعيد. تستقبل طريقة BaseRegSaveKey مسار ملف يمكنها حفظ نسخة احتياطية من السجل فيه، مما يؤدي إلى تشغيل حركة مرور SMB عبر المنفذ 445 (و 135 كاحتياطي) إلى هدف. مفتاح التسجيل الذي يفتحه CornerShot هو HKEY_CURRENT_USER، وهو مفتوح للقراءة افتراضيًا على معظم مضيفات العملاء.
تحاول هذه الوظيفة نسخ أحداث Windows احتياطيًا إلى مسار ملف، يمكن أن يكون بعيدًا - في هذه الحالة، ستحاول الخدمة الوصول إلى المضيف والمسار البعيدين.
على غرار طريقة EVEN، فقط تستخدم هذه الطريقة إصدارًا مختلفًا من بروتوكول أحداث Windows، والذي يتم مباشرة عبر TCP - لا حاجة لفتح منفذ SMB.