o
    àý°jS9  ã                
   @   s0  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlZd dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZmZmZmZmZ G dd	„ d	eƒZd
d„ Zdd„ Zdd„ Ze dk�re!ej"ƒ eƒ Z#e $e#j%e#j&¡ e#j' (¡ dkrÆe#j)durÄej* +e#j)¡r¾eddƒZ,e &de#j) ¡ e-e#j)dƒZ.d /e. 0¡ ¡Z1e. 2¡  e, 3e#j)e1¡Z4e, 5e4¡ dS e!dƒ dS dS ee#ƒ\Z6Z7Z8Z9Z:Z;zee#e6e7e8e9e:e;ƒZ<ee<e#j=ƒZ,e, >¡  e, ?e#j@¡ W dS  eA�y ZB ze C¡ jDejEk�re F¡  e GeHeBƒ¡ W Y dZB[BdS dZB[Bww dS )é    N)Úminidom)ÚAES)Úunpad)Úversion)ÚloggerÚutils)ÚSMBConnectionÚSMB2_DIALECT_002ÚSMB2_DIALECT_21ÚSMB_DIALECTÚSessionErrorc                       sR   e Zd ZdZ‡ fdd„Zdd„ Zddd„Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
‡  ZS )ÚGetGPPasswordszdocstring for GetGPPasswords.c                    s   t t| ƒ ¡  || _|| _d S )N)Úsuperr   Ú__init__ÚsmbÚshare)Úselfr   r   ©Ú	__class__© ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/../../../bin/Get-GPPPassword.pyr   +   s   
zGetGPPasswords.__init__c                 C   sj   t  d¡ | j ¡ }g }tt|ƒƒD ]}| || d d d… ¡ td|| d d d…  ƒ qtƒ  d S )NzListing shares...Úshi1_netnameéÿÿÿÿz  - %s)ÚloggingÚinfor   Ú
listSharesÚrangeÚlenÚappendÚprint)r   ÚrespÚsharesÚkr   r   r   Úlist_shares0   s   


zGetGPPasswords.list_sharesÚxmlc           
      C   st  t  d| ¡ g }|d g}t|ƒdkr¸g }|D ]Ž}t  d| ¡ zn| jj| j|d d d�D ]_}| ¡ dvr�| ¡ rOt  d| ¡  ¡ | 	|| ¡  d ¡ q.| ¡  
d	| ¡r„t  d
|| ¡   ¡ |  || ¡  ¡}t|ƒdkrƒ|  |¡ | 	|| ¡  |dœ¡ q.t  d| ¡  ¡ q.W q ty¦ }	 zt  |	¡ W Y d }	~	qd }	~	ww |}t  dt|ƒ ¡ t|ƒdks|S )NzSearching *.%s files...ú/r   zSearching in %s Ú*)Úpassword)Ú.z..zFound directory %s/r(   zFound matching file %s)ÚfilenameÚresultszFound file %szNext iteration with %d folders.)r   r   r   Údebugr   ÚlistPathr   Úget_longnameÚis_directoryr   ÚendswithÚparseÚshowr   )
r   Úbase_dirÚ	extensionÚfilesÚ
searchdirsÚ	next_dirsÚsdirÚ
sharedfiler*   Úer   r   r   Úfind_cpasswords9   s>   

€€ó€ÿêzGetGPPasswords.find_cpasswordsc                 C   s:  g }zòt  |¡}|jd j}dd„ }|dkr_|jD ]B}dd„ |jD ƒ}|D ]5}	|	 d¡D ]-}
| |d||	dƒfd	||
d	ƒfd
||
d
ƒfd|  ||
d
ƒ¡fd||
jdƒfg|dœ¡ q,q%qW |S |dkr¬|jD ]B}dd„ |jD ƒ}|D ]5}	|	 d¡D ]-}
| |d||
dƒfd||
dƒfd
||
d
ƒfd|  ||
d
ƒ¡fd||
jdƒfg|dœ¡ qyqrqfW |S |jD ]B}dd„ |jD ƒ}|D ]5}	|	 d¡D ]-}
| |d||
dƒfd||
dƒfd
||
d
ƒfd|  ||
d
ƒ¡fd||
jdƒfg|dœ¡ qÂq»q¯W |S  t�y } zt	 
¡ jt	jk�r
t ¡  t	 t|ƒ¡ W Y d }~|S d }~ww )Nr   c                 S   s   |   |¡d ur|   |¡S dS )NÚ )ÚgetAttribute)ÚelementÚ	attributer   r   r   Ú<lambda>]   s    z6GetGPPasswords.parse_xmlfile_content.<locals>.<lambda>ÚScheduledTasksc                 S   ó    g | ]}t |tjjjƒr|‘qS r   ©Ú
isinstancer$   Údomr   ÚElement©Ú.0Úcr   r   r   Ú
<listcomp>b   ó     z8GetGPPasswords.parse_xmlfile_content.<locals>.<listcomp>Ú
PropertiesÚnameÚrunAsÚ	cpasswordr'   Úchanged)ÚtagNameÚ
attributesÚfileÚGroupsc                 S   rA   r   rB   rF   r   r   r   rI   r   rJ   ÚnewNameÚuserNamec                 S   rA   r   rB   rF   r   r   r   rI   ‚   rJ   )r   ÚparseStringÚ
childNodesrP   ÚgetElementsByTagNamer   Údecrypt_passwordÚ
parentNodeÚ	Exceptionr   Ú	getLoggerÚlevelÚDEBUGÚ	tracebackÚ	print_excr+   Ústr)r   r)   Úfilecontentr*   ÚrootÚxmltypeÚread_or_emptyÚtopnodeÚ
task_nodesÚtaskÚpropertyr9   r   r   r   Úparse_xmlfile_contentW   sˆ   

û
÷ÿÿþ4Û
û
÷ÿÿþ$
ìû
÷ÿÿþü€üz$GetGPPasswords.parse_xmlfile_contentc              
   C   sú   g }|  dd¡}t ¡ }z| j | j||j¡ W n% ty1 } zt 	|¡ |W  Y d }~S d }~w t
y= } z‚ d }~ww | ¡ }t |¡d }|d urr| |¡ ¡ }d|v rit |¡ |  ||¡}| ¡  |S t d| ¡ |S t d¡ | ¡  |S )Nr%   ú\ÚencodingrN   zNo cpassword was found in %szGOutput cannot be correctly decoded, are you sure the text is readable ?)ÚreplaceÚioÚBytesIOr   ÚgetFiler   Úwriter   r   Úerrorr[   ÚgetvalueÚcharset_normalizerÚdetectÚdecodeÚrstripr+   rj   Úclose)r   r)   r*   Úfhr9   Úoutputrl   rb   r   r   r   r0   —   s6   
€€ÿ
ü
þzGetGPPasswords.parsec                 C   sš   t |ƒdkrFd}d}t |ƒd }|dkr|d d… }n|dks#|dkr+|d	d|  7 }t |¡}t |tj|¡}t| |¡|jƒ}| 	d
¡S t
 d¡ dS )Nr   s    N™èü¶lÉúô“bþèô–èÌy� ›	¤3¶ls                   é   é   r   é   é   ú=z	utf-16-lez,cpassword is empty, cannot decrypt anything.r;   )r   Úbase64Ú	b64decoder   ÚnewÚMODE_CBCr   ÚdecryptÚ
block_sizerv   r   r+   )r   Ú
pw_enc_b64ÚkeyÚivÚpadÚpw_encÚctxÚpw_decr   r   r   rY   ³   s   


zGetGPPasswords.decrypt_passwordc                 C   sh   |D ]/}t  d|d  ¡ t  dd|d f ¡ |d D ]\}}|dkr-t  d||f ¡ qtƒ  qd S )NzFound a %s XML file:rP   z  %-10s: %srR   rQ   rN   )r   r   r   )r   r*   ÚresultÚattrÚvaluer   r   r   r1   Ç   s   €úzGetGPPasswords.show)r$   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r#   r:   rj   r0   rY   r1   Ú__classcell__r   r   r   r   r   (   s    
	@r   c                  C   s8  t jddd�} | jdddd� | jdtd	d d
d� | jdtd	ddd� | jdtd	ddd� | jdddd� | jdddd� |  d¡}|jddddd� |jdddd� |jdddd� |jd dd!d"d� |  d#¡}|jd$dd%d&d� |jd'dd%d(d� |jd)d*d+gd,d+d-d.d/� ttjƒd0kr˜|  ¡  t 	d0¡ |  
¡ S )1NTz8Group Policy Preferences passwords finder and decryptor.)Úadd_helpÚdescriptionÚtargetÚstorezb[[domain/]username[:password]@]<targetName or address> or LOCAL (if you want to parse local files))ÚactionÚhelpz-xmlfileFz+Group Policy Preferences XML files to parse)ÚtypeÚrequiredÚdefaultrš   z-shareÚSYSVOLz	SMB Sharez	-base-dirr%   z#Directory to search in (Default: /)z-tsÚ
store_truez&Adds timestamp to every logging outputz-debugzTurn DEBUG output ONÚauthenticationz-hasheszLMHASH:NTHASHz$NTLM hashes, format is LMHASH:NTHASH)r™   Úmetavarrš   z-no-passz&Don't ask for password (useful for -k)z-kzÁUse Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters. If valid credentials cannot be found, it will use the ones specified in the command linez-aesKeyzhex keyz<AES key to use for Kerberos Authentication (128 or 256 bits)Ú
connectionz-dc-ipz
ip addressztIP Address of the domain controller. If omitted it will use the domain part (FQDN) specified in the target parameterz
-target-ipz£IP Address of the target machine. If omitted it will use whatever was specified as target. This is useful when target is the NetBIOS name and you cannot resolve itz-portÚ139Ú445ú?zdestination portz)Destination port to connect to SMB Server)ÚchoicesÚnargsr�   r¡   rš   r|   )ÚargparseÚArgumentParserÚadd_argumentra   Úadd_argument_groupr   ÚsysÚargvÚ
print_helpÚexitÚ
parse_args)ÚparserÚgroupr   r   r   r°   Ñ   s(   


r°   c                 C   s¾   t  | j¡\}}}}| jd u r|| _|d u rd}t|ƒdkr=t|ƒdkr=| jd u r=| jdu r=| jd u r=ddlm} |dƒ}| jd urEd| _	| jd urS| j 
d¡\}}nd\}}||||||fS )	Nr;   r   F)Úgetpassz	Password:Tú:)r;   r;   )r   Úparse_targetr—   Ú	target_ipr   ÚhashesÚno_passÚaesKeyr³   r"   Úsplit)ÚargsÚdomainÚusernamer'   Úaddressr³   ÚlmhashÚnthashr   r   r   rµ   í   s   
6

rµ   c           	   	   C   sÄ   t || jt| jƒd�}| ¡ }|tkrt d¡ n|tkr#t d¡ n|t	kr-t d¡ nt d¡ | j
du rE| |||||| j| j¡ n	| |||||¡ | ¡ dkr[t d¡ |S t d	¡ |S )
N)Ú	sess_portzSMBv1 dialect usedzSMBv2.0 dialect usedzSMBv2.1 dialect usedzSMBv3.0 dialect usedTr   zGUEST Session GrantedzUSER Session Granted)r   r¶   ÚintÚportÚ
getDialectr   r   r+   r	   r
   r"   ÚkerberosLoginr¹   Údc_ipÚloginÚisGuestSession)	r»   r¼   r½   r'   r¾   r¿   rÀ   Ú	smbClientÚdialectr   r   r   Úinit_smb_session  s"   



ÿrË   Ú__main__ÚLOCALz#Opening %s XML file for reading ...Úrr;   z,[!] File does not exists or is not readable.)Ir¨   r€   r$   rt   r   ÚosÚrer¬   r_   Úxml.domr   rn   ÚCryptodome.Cipherr   ÚCryptodome.Util.Paddingr   Úimpacketr   Úimpacket.examplesr   r   Úimpacket.smbconnectionr   r	   r
   r   r   Úobjectr   r°   rµ   rË   r�   r   ÚBANNERr»   ÚinitÚtsr+   r—   ÚupperÚxmlfileÚpathÚexistsÚgÚopenÚfÚjoinÚ	readlinesÚrawdatarx   rj   r*   r1   r¼   r½   r'   r¾   r¿   rÀ   rÉ   r   r#   r:   r2   r[   r9   r\   r]   r^   r`   rr   ra   r   r   r   r   Ú<module>   sd    *



õ€ýç