o
    Žõ±j#  ã                   @   sn   d dl Z d dlmZ d dlmZ d dlT G dd„ dƒZG dd„ dƒZed	kr5eƒ Z	e	 
¡ Zeeeƒƒ dS dS )
é    N)Úlogger)ÚLocalWindowsAPI)Ú*c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	TokenInfoc                 C   s"   || _ || _|| _|| _|| _d S ©N©ÚpidÚdomainÚusernameÚsidÚ
token_type)Úselfr   r	   r
   r   r   © r   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/pypykatz/commons/winapi/processmanipulator.pyÚ__init__   s
   
zTokenInfo.__init__c                 C   s   d| j | j| j| j| jf S )Nz%s:%s:%s:%s:%sr   ©r   r   r   r   Ú__str__   s   zTokenInfo.__str__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s    r   c                   @   s†   e Zd ZdZddd„Zd dd„Zd dd	„Zd
d„ Zd dd„Zdd„ Z	dd„ Z
deeefdd„Zd!dd„Zd"dd„Zdd„ Zdd„ ZdS )#ÚProcessManipulatorzú
	High level class to adjust privileges and manipulate tokens
	TODO: Currently only working with the current process, doesn't do remote processes!
	TODO: ther ways to get system, eg. creating a service that will launch the new app? like p s e x e c
	Nc                 C   s$   || _ |d ur|| _d S tƒ | _d S r   )r   r   Úapi)r   r   r   r   r   r   r      s   zProcessManipulator.__init__Fc                 C   s"   t  d| ¡ | jjj|d|d�S )z
		Sets a given privilege
		z)[ProcessManipulator] Setting %s privilegeT©ÚenableÚthread_or_process©r   Údebugr   ÚntdllÚRtlAdjustPrivilege©r   Úprivilige_idr   r   r   r   Úset_privilege!   s   z ProcessManipulator.set_privilegec                 C   s&   t  d| ¡ | jjj|d|d� dS )z
		Drops the given privilege
		z*[ProcessManipulator] Dropping %s privilegeFr   Nr   r   r   r   r   Údrop_privilege(   s   z!ProcessManipulator.drop_privilegec                 C   s   dS )z9
		Lists all available privileges for the current user
		Nr   r   r   r   r   Úlist_privileges/   s   z"ProcessManipulator.list_privilegesc           	      C   sú  t  d¡ z|  t¡}W n ty* } z|du rt  d¡ |‚	 W Y d}~nd}~ww g }| jj ¡ D ]Ç}d}z¶z| jj	 
td|¡}t  dd||f ¡ W n* tyw } zt  dd|t|ƒf ¡ W Y d}~W |durr| jj	 |¡ q3d}~ww d}zYz
| jj |t¡}W n6 ty» } z*t  dd|t|ƒf ¡ W Y d}~W |durª| jj	 |¡ W |dur¶| jj	 |¡ q3d}~ww |  ||¡}| |¡ W |durÓ| jj	 |¡ n|durà| jj	 |¡ w w W |durí| jj	 |¡ q3|durú| jj	 |¡ w w |S )	zo
		iterates trough all available processes, fetches all process tokens, gets user information for all tokens
		z*[ProcessManipulator] Listing all tokens...Fú$Failed to obtain SE_DEBUG privilege!Né   ú2[ProcessManipulator] Proc handle for PID %s is: %sú=[ProcessManipulator] Failed to open process pid %s Reason: %súD[ProcessManipulator] Failed get token from process pid %s Reason: %s)r   r   r!   ÚSE_DEBUGÚ	ExceptionÚerrorr   ÚpsapiÚEnumProcessesÚkernel32ÚOpenProcessÚPROCESS_QUERY_INFORMATIONÚlogÚstrÚCloseHandleÚadvapi32ÚOpenProcessTokenÚTOKEN_MANIP_ACCESSÚget_token_infoÚappend)	r   ÚforceÚresÚeÚtoken_infosr   Úproc_handleÚtoken_handleÚtir   r   r   Úlist_all_tokens6   sh   

€û
€ë€
€ó€ÿÿ€€ÿÿz"ProcessManipulator.list_all_tokensc              
   C   sê   d }zez| j j ¡ }| j j td|¡}W n ty" } z|‚d }~ww z7z(| j j |t¡}|  	||¡W W |d ur?| j j 
|¡ W |d urL| j j 
|¡ S S  tyZ } z|‚d }~ww |d urg| j j 
|¡ w w |d urt| j j 
|¡ w w )NF)r   r.   ÚGetCurrentProcessIdr/   r0   r*   r4   r5   r6   r7   r3   )r   r=   r   r;   r>   r   r   r   Úget_current_token_infoc   s6   €ÿ€ÿú€ÿÿÿz)ProcessManipulator.get_current_token_infoc                 C   sB   | j j |¡}| j j |¡}| j j d |¡\}}}t|||||ƒS r   )r   r4   ÚGetTokenInformation_sidÚConvertSidToStringSidÚLookupAccountSidr   )r   r>   r   Úptr_sidÚsid_strÚnamer	   r   r   r   r   r7   w   s   z!ProcessManipulator.get_token_infoúS-1-5-18c                 c   s  � z|   t¡ W n ty } zt d¡ |‚d}~ww g }| jj ¡ D ]â}d}zÐz| jj 	t
d|¡}t dd||f ¡ W n* tyh } zt dd|t|ƒf ¡ W Y d}~W |durc| jj |¡ q$d}~ww d}	zsz
| jj |t¡}	W n6 ty¬ } z*t dd|t|ƒf ¡ W Y d}~W |	dur›| jj |	¡ W |dur§| jj |¡ q$d}~ww | jj |	¡}
| jj |
¡}||krÒt d¡ | jjj|	|||d	�}|V  W |	durÞ| jj |	¡ n|	durë| jj |	¡ w w W |durø| jj |¡ q$|du�r| jj |¡ w w |S )
zË
		iterates trough all available processes, fetches all process tokens, checks if sid matches for token, duplicates it and yields them
		also leaks a lot of handles, probably should be cleaned up TODO
		r$   NFr%   r&   r'   r(   z1[ProcessManipulator] Found token with target sid!)ÚdwDesiredAccessÚImpersonationLevelÚ	TokenType)r!   r)   r*   r   r+   r   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   rC   rD   r   ÚDuplicateTokenEx)r   Ú
target_sidrJ   rK   rL   r;   r<   r   r=   r>   rF   rG   Úcloned_tokenr   r   r   Úget_token_for_sid}   sx   €
€þ
€â€
€ê
ü€€ÿÿ€€
ÿÿz$ProcessManipulator.get_token_for_sidc                 C   s€   | j |ttB ttd�D ]2}t d¡ z	| jj 	|¡ W n t
y5 } zt dd| ¡ W Y d}~qd}~ww t d¡  dS dS )zt
		assigns the token to the thread specified by threadid, if threadid is none then it will use the current thread
		©rN   rJ   rK   rL   z7[ProcessManipulator] Setting token to current thread...r%   z,Failed changing the thread token. Reason: %sNz>[ProcessManipulator] Sucsessfully set token to current thread!)rP   ÚTOKEN_QUERYÚTOKEN_IMPERSONATEÚSecurityDelegationÚTokenImpersonationr   r   r   r4   ÚSetThreadTokenr*   r1   )r   rN   Útokenr;   r   r   r   Úassign_token_thread_sid±   s   
€þ
÷z*ProcessManipulator.assign_token_thread_sidúC:\Windows\system32\cmd.exeTc                 C   st   | j |tttd�D ].}z
| jj ||¡ W n ty/ } zt 	dd| ¡ W Y d}~q	d}~ww t 
d¡  dS dS )zp
		Creates a new process with the token of the target SID 
		TODO: implement non-interactive functionality :(
		rQ   r%   z;Failed creating process with the token obtained. Reason: %sNz2[ProcessManipulator] Sucsessfully created process!)rP   ÚTOKEN_ALL_ACCESSÚSecurityImpersonationrU   r   r4   ÚCreateProcessWithToken_manipr*   r   r1   r   )r   rN   ÚcmdlineÚinteractiverW   r;   r   r   r   Úcreate_process_for_sidÀ   s   €þ
øz)ProcessManipulator.create_process_for_sidc                 C   s   |   d¡ d S )NrI   )rX   r   r   r   r   Ú	getsystemÏ   s   zProcessManipulator.getsystemc                 C   s   | j j ¡  d S r   )r   r4   ÚRevertToSelfr   r   r   r   Ú
dropsystemÒ   s   zProcessManipulator.dropsystem)NN)F)rI   )rI   rY   T)r   r   r   Ú__doc__r   r!   r"   r#   r@   rB   r7   rZ   r[   rP   rX   r_   r`   rb   r   r   r   r   r      s    



-
4
r   Ú__main__)ÚplatformÚpypykatzr   Ú-pypykatz.commons.winapi.local.localwindowsapir   Ú!pypykatz.commons.winapi.constantsr   r   r   ÚpmrB   r?   Úprintr2   r   r   r   r   Ú<module>   s    ?÷