o
    #¼hŠT  ã                   @   sÞ   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mZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ ejejdd	 e e¡ZG d
d„ deƒZG dd„ deƒZ dS )é    N)Ú
HTTPServerÚSimpleHTTPRequestHandler)ÚDictÚAnyÚOptionalÚList)ÚDriverPlugin)Ú
RuleEngine)Úget_db_manager)Úsanitize_for_logz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)ÚlevelÚformatc                       sÜ   e Zd ZU dZdZee ed< ddddœ‡ fdd„
Zdd„ Z	d	e
eef fd
d„Zde
eef d	ee
eef  fdd„Zdee
eef  d	ee
eef  fdd„Zdee
eef  fdd„Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚStaticFileHTTPRequestHandleru[   
    è‡ªå®šä¹‰è¯·æ±‚å¤„ç†å™¨ï¼Œç”¨äºŽæä¾›é™æ€æ–‡ä»¶æœåŠ¡ï¼Œå¹¶é›†æˆååˆ¶é€»è¾‘
    NÚrule_engine©Ú	directoryÚenvironment_idÚenvironment_rulesc                   sJ   |d ur|nt  ¡ | _|| _|d ur|ng | _d | _tƒ j|i |¤Ž d S ©N)ÚosÚgetcwdr   r   r   Ú_inject_infoÚsuperÚ__init__)Úselfr   r   r   ÚargsÚkwargs©Ú	__class__© ú2/root/ive/./drivers/static_file_honeypot/driver.pyr       s
   z%StaticFileHTTPRequestHandler.__init__c                 G   s4   t |  ¡ ƒ}t || ƒ}t d||  ¡ |f ¡ d S )Nz%s - - [%s] %s
)r   Úaddress_stringÚloggerÚinfoÚlog_date_time_string)r   r   r   Z	safe_addrZsafe_fmtr   r   r    Úlog_message)   s   z(StaticFileHTTPRequestHandler.log_messageÚreturnc                 C   s2   t | jtjƒr	dnd| j| jt| jƒ| jd dœS )u*   æž„å»ºè§„åˆ™å¼•æ“Žéœ€è¦çš„è¯·æ±‚ä¸Šä¸‹æ–‡ÚhttpsÚhttpr   )ÚprotocolÚmethodÚpathÚheadersÚip)	Ú
isinstanceÚ
connectionÚsslÚ	SSLSocketÚcommandr+   Údictr,   Úclient_address©r   r   r   r    Ú_build_request_context/   s   ûz3StaticFileHTTPRequestHandler._build_request_contextÚrequest_contextc                 C   s.   | j r| jr| j  || j| j¡S t d¡ g S )u   æ‰§è¡Œååˆ¶æŽªæ–½zIRule engine or environment ID not available for countermeasure execution.)r   r   Ú$evaluate_and_execute_for_environmentr   r"   Úwarning)r   r7   r   r   r    Ú_execute_countermeasures:   s   
ÿ
z5StaticFileHTTPRequestHandler._execute_countermeasuresÚresultsc                 C   s@   |D ]}|  d¡dkr|  di ¡  d¡r|d   d¡  S qdS )u   å¤„ç†å†…å®¹æ³¨å…¥ååˆ¶ç»“æžœÚactionÚinject_contentÚresultÚsuccessÚinject_infoN)Úget)r   r;   r>   r   r   r    Ú_handle_inject_contentE   s
    €z3StaticFileHTTPRequestHandler._handle_inject_contentc                 C   s`   |D ]+}|  d¡dkr-|  di ¡  di ¡}|  dd¡}|dkr-t d|› d¡ t |¡ qd	S )
u-   åº”ç”¨ååˆ¶æŽªæ–½çš„å‰¯ä½œç”¨ï¼ˆå¦‚å»¶è¿Ÿï¼‰r<   Údelayr>   ÚconfigÚdurationr   zApplying delay of z seconds for countermeasure.N)rA   r"   r#   ÚtimeÚsleep)r   r;   r>   Zdelay_configrE   r   r   r    Ú"_apply_countermeasure_side_effectsL   s   
€úz?StaticFileHTTPRequestHandler._apply_countermeasure_side_effectsc           
         sÎ   |   ¡ }|  |¡}|  |¡ |  |¡| _| jr.t| jƒ}tt| jƒƒ}t 	d|› d|› ¡ d}|D ])}| 
d¡dkr[| 
di ¡ 
di ¡}| 
dd	¡}| 
d
d¡}	|  ||	¡ d} nq2|setƒ  ¡  dS dS )u&   å¤„ç† GET è¯·æ±‚ï¼Œé›†æˆååˆ¶é€»è¾‘zContent injection prepared for z. Inject info: Fr<   Zerror_responser>   rD   Úcodeiô  ÚmessagezInternal Server ErrorTN)r6   r:   rH   rB   r   r   r+   Ústrr"   r#   rA   Ú
send_errorr   Údo_GET)
r   r7   Zcountermeasure_resultsZ	safe_pathZ	safe_infoZerror_triggeredr>   Zerror_configZ
error_codeZerror_messager   r   r    rM   W   s*   


ú	ÿz#StaticFileHTTPRequestHandler.do_GETc                    sº  |   | j¡}z"tj |¡}tj | j¡}tj ||g¡|kr'|  dd¡ W dS W n ty8   |  dd¡ Y dS w d}tj |¡r“t	j
 | j¡}|j d¡sx|  d¡ |d |d |d d |d	 |d
 f}t	j
 |¡}|  d|¡ |  ¡  dS dD ]}tj ||¡}tj |¡r|} nqztƒ  ¡ S |  |¡}	|	 d¡rX| jrXzt|dƒ}W n ty¹   |  dd¡ Y dS w t | ¡ ¡}
| ¡ }| ¡  z| d¡}W n tyç   t  !d|› d¡ tƒ  ¡  Y S w | jd }| jd }|}|dkr| "d|› dd¡}n$|dkr| "d|› dd¡}n|dkr$| "dd|› d¡}n|| }| #d¡}|  d¡ |  d |	¡ |  d!t$t%|ƒƒ¡ |  d"|  &|
j'¡¡ |  ¡  | j( )|¡ dS tƒ  ¡ S )#uG   
        é‡å†™ send_head æ–¹æ³•ä»¥æ”¯æŒ HTML å†…å®¹æ³¨å…¥ã€‚
        i“  Ú	ForbiddenNú/i-  r   é   é   é   é   ÚLocation)z
index.htmlz	index.htmz	text/htmlÚrbi”  zFile not foundzutf-8zFailed to decode z' as utf-8 for injection. Serving as-is.ÚcontentÚlocationÚbefore_body_endz</body>z
</body>Úheadz</head>z
</head>Ú
body_startz<body>z<body>
éÈ   zContent-typezContent-LengthzLast-Modified)*Útranslate_pathr+   r   Úrealpathr   Ú
commonpathrL   Ú	ExceptionÚisdirÚurllibÚparseÚurlsplitÚendswithÚsend_responseÚ
urlunsplitÚsend_headerÚend_headersÚjoinÚexistsr   Ú	send_headÚ
guess_typeÚ
startswithr   ÚopenÚOSErrorÚfstatÚfilenoÚreadÚcloseÚdecodeÚUnicodeDecodeErrorr"   r9   ÚreplaceÚencoderK   ÚlenÚdate_time_stringÚst_mtimeÚwfileÚwrite)r   r+   Zresolved_requested_pathZresolved_base_dirÚfÚpartsÚ	new_partsÚnew_urlÚindexÚctypeÚfsrV   Zcontent_strÚcontent_to_injectrW   Zinjected_contentZinjected_bytesr   r   r    rk   y   sŠ   þý
ÿþ

þý







ÿ
z&StaticFileHTTPRequestHandler.send_head)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r	   Ú__annotations__r   r%   r   rK   r   r6   r   r:   rB   rH   rM   rk   Ú__classcell__r   r   r   r    r      s   
 	&*"r   c                   @   sê   e Zd ZdZdd„ Zdd„ Zdd„ Zded	efd
d„Zd	e	e
eef  fdd„Zded	ee
eef  fdd„Zdeded	efdd„Zde
eef d	efdd„Zded	efdd„Zded	efdd„Zded	efdd„Zded	efdd„ZdS ) ÚStaticFileHoneypotDriveru=   
    é™æ€æ–‡ä»¶èœœç½é©±åŠ¨æ’ä»¶å®žçŽ° (é›†æˆååˆ¶)
    c                 C   s   t ƒ | _i | _d | _d S r   )r
   Ú
db_managerÚserversr   r5   r   r   r    r   ä   s   
z!StaticFileHoneypotDriver.__init__c              	   C   ó6   z	ddl }|jjW S  ttfy   t d¡ Y dS w )u   èŽ·å– rule_engine å®žä¾‹r   NzFFailed to get global rule_engine instance in StaticFileHoneypotDriver.)Ú
api.serverÚserverr   ÚImportErrorÚAttributeErrorr"   r9   ©r   Úapir   r   r    Ú_get_rule_engineê   s   

þz)StaticFileHoneypotDriver._get_rule_enginec              	   C   rŽ   )u/   èŽ·å– rule_manager å®žä¾‹ä»¥èŽ·å–çŽ¯å¢ƒè§„åˆ™r   NzGFailed to get global rule_manager instance in StaticFileHoneypotDriver.)r   r   Úrule_managerr‘   r’   r"   r9   r“   r   r   r    Ú_get_rule_managerô   s   

þz*StaticFileHoneypotDriver._get_rule_managerÚstatic_rootr&   c                 C   sâ   t j t j t j t¡¡¡}t j |¡}t j t j |d¡¡}|}t j |¡s.t j ||¡}t j |¡}t j |¡sAt	d|› ƒ‚t j 
|¡sNt	d|› ƒ‚zt j ||g¡|kr`t	d|› ƒ‚W |S  typ   t	d|› ƒ‚w )u2  è§£æžå¹¶æ ¡éªŒé™æ€æ ¹ç›®å½•ï¼Œé™åˆ¶åœ¨é¡¹ç›® static_sites ç›®å½•å†…ã€‚
        :param static_root: é…ç½®ä¼ å…¥çš„é™æ€ç›®å½•ï¼ˆç›¸å¯¹æˆ–ç»å¯¹è·¯å¾„ï¼‰
        :return: ç»è¿‡ realpath è§£æžä¸”æ ¡éªŒé€šè¿‡çš„ç»å¯¹è·¯å¾„
        :raises: ValueError å½“è·¯å¾„ä¸å­˜åœ¨/ä¸æ˜¯ç›®å½•/è¶Šç•Œæ—¶
        r   zStatic root does not exist: z Static root is not a directory: z%Static root is outside allowed base: z#Static root validation failed for: )r   r+   ÚdirnameÚabspathÚ__file__r]   ri   Úisabsrj   Ú
ValueErrorr`   r^   r_   )r   r˜   Zdrivers_dirÚproject_rootZallowed_baseZcandidate_pathÚresolvedr   r   r    Ú!_resolve_and_validate_static_rootý   s&   ÿüþz:StaticFileHoneypotDriver._resolve_and_validate_static_rootc              
   C   s¾   zA| j  ¡ 1}| ¡ }| d¡ | ¡ }g }|D ]}t|ƒ}t |d ¡|d< | |¡ q|W  d  ƒ W S 1 s:w   Y  W dS  t	j
y^ } zt d|› ¡ g W  Y d}~S d}~ww )u`   
        ä»Žæ•°æ®åº“åˆ—å‡ºæ‰€æœ‰çŽ¯å¢ƒã€‚
        :return: çŽ¯å¢ƒä¿¡æ¯å­—å…¸åˆ—è¡¨ã€‚
        zSELECT * FROM environmentsrD   NzError listing environments: )rŒ   Úget_connectionÚcursorÚexecuteÚfetchallr3   ÚjsonÚloadsÚappendÚsqlite3ÚErrorr"   Úerror)r   Úconnr¢   ÚrowsÚenvironmentsÚrowÚenv_dataÚer   r   r    Úlist_environments  s"   
(ö€þz*StaticFileHoneypotDriver.list_environmentsÚenv_idc              
   C   sÄ   zB| j  ¡ 2}| ¡ }| d|f¡ | ¡ }|r/t|ƒ}t |d ¡|d< |W  d  ƒ W S W d  ƒ W dS 1 s;w   Y  W dS  tj	ya } zt
 d|› d|› ¡ W Y d}~dS d}~ww )uª   
        ä»Žæ•°æ®åº“èŽ·å–çŽ¯å¢ƒä¿¡æ¯ã€‚
        :param env_id: çŽ¯å¢ƒå”¯ä¸€æ ‡è¯†ç¬¦ã€‚
        :return: çŽ¯å¢ƒä¿¡æ¯å­—å…¸ï¼Œå¦‚æžœæœªæ‰¾åˆ°åˆ™è¿”å›ž Noneã€‚
        z'SELECT * FROM environments WHERE id = ?rD   NzError getting environment ú: )rŒ   r¡   r¢   r£   Úfetchoner3   r¥   r¦   r¨   r©   r"   rª   )r   r²   r«   r¢   r®   r¯   r°   r   r   r    Úget_environment4  s(   øüõþ €þz(StaticFileHoneypotDriver.get_environmentÚstatusc              
   C   sÎ   z4| j  ¡ $}| ¡ }| d||f¡ | ¡  t d|› d¡ 	 W d   ƒ W dS 1 s-w   Y  W d S  tjyH   t 	d|› d¡ Y dS  tj
yf } zt d|› d|› ¡ W Y d }~dS d }~ww )	Nú/UPDATE environments set status = ? where id = ?úEnvironment z update in database.Tú already exists in database.FúError updateing environment r³   )rŒ   r¡   r¢   r£   Úcommitr"   r#   r¨   ÚIntegrityErrorr9   r©   rª   )r   r²   r¶   r«   r¢   r°   r   r   r    Úupdate_environmentI  s&   þ(ø	€þz+StaticFileHoneypotDriver.update_environmentÚ
env_configc                 C   s*   dt  ¡ j› }t d|› d|› ¡ |S )u   åˆ›å»ºé™æ€æ–‡ä»¶èœœç½çŽ¯å¢ƒZstatic_env_z)Created Static File Honeypot environment z with config )ÚuuidÚuuid4Úhexr"   r#   )r   r¾   r²   r   r   r    Úcreate_environment[  s   z+StaticFileHoneypotDriver.create_environmentc                    s  |   ˆ ¡}|st dˆ › d¡ dS |d }zK| js |  ¡ | _| js.t dˆ › ¡ W dS | jt_|d }| dd¡}| d	d
¡}| dd¡‰|  ˆ¡‰| dd¡}g ‰|  ¡ }|rz| 	ˆ ¡‰W n' t
y€ }	 zt dˆ › d|	› d¡ W Y d}	~	nd}	~	ww t dˆ › d¡ ‡ ‡‡fdd„}
t||f|
ƒ}|rÒ| d¡}| d¡}|rÉ|rÉtj |¡rÉtj |¡rÉtj|j||dd|_t dˆ › ¡ n	t dˆ › d¡ tj|jdd}| ¡  ||dœ| jˆ < d}z(| j ¡ }| ¡ }| d |ˆ f¡ | ¡  W d  ƒ n	1 s
w   Y  W n6 tjy&   t dˆ › d!¡ Y W dS  tj yF }	 zt d"ˆ › d|	› ¡ W Y d}	~	W dS d}	~	ww t d#ˆ › d$|› d%|› d&ˆ› d'|r[d(nd)› 
¡ W dS  t
y }	 zt d*ˆ › d|	› ¡ W Y d}	~	dS d}	~	ww )+u-   å¯åŠ¨é™æ€æ–‡ä»¶èœœç½çŽ¯å¢ƒ (é›†æˆååˆ¶)r¸   ú
 not foundFr¶   z*Rule engine not available for environment rD   Úhostz0.0.0.0Úporti  r˜   Ú.r0   Nz$Failed to get environment rules for r³   z. Using empty list.z+Rule manager not available for environment z. Using empty rule list.c                     s   t | ˆˆ ˆdœ|¤ŽS )Nr   )r   )r   r   ©r²   r   r˜   r   r    Úhandler_factory’  s   üûzCStaticFileHoneypotDriver.start_environment.<locals>.handler_factoryÚcertfileÚkeyfileT)rÉ   rÊ   Úserver_sidezSSL enabled for environment z*Invalid SSL configuration for environment z. Starting without SSL.)ÚtargetÚdaemon)r   ÚthreadÚrunningr·   r¹   rº   z)Started Static File Honeypot environment z on ú:z serving files from 'ú'z (HTTPS)z (HTTP)z1Failed to start Static File Honeypot environment )!rµ   r"   rª   r   r•   r   rA   r    r—   Úget_environment_rulesr_   r9   r   r   r+   rj   r0   Úwrap_socketÚsocketr#   Ú	threadingÚThreadÚserve_foreverÚstartr   rŒ   r¡   r¢   r£   r»   r¨   r¼   r©   )r   r²   Úenvr¶   rD   rÄ   rÅ   Z
ssl_configr–   r°   rÈ   r   rÉ   rÊ   Zserver_threadr«   r¢   r   rÇ   r    Ústart_environmentg  s   


$€ÿ


 ýþþ
ú€€þ2€þz*StaticFileHoneypotDriver.start_environmentc              
   C   sÖ   |   |¡}|st d|› d¡ dS |d dkr#t d|› d¡ dS z)| j |¡}|r<|d }| ¡  | ¡  | j|= |  |d¡ t 	d	|› ¡ W d
S  t
yj } zt d|› d|› ¡ W Y d}~dS d}~ww )u   åœæ­¢é™æ€æ–‡ä»¶èœœç½çŽ¯å¢ƒr¸   rÃ   Fr¶   rÏ   z is not runningr   Ústoppedz)Stopped Static File Honeypot environment Tz0Failed to stop Static File Honeypot environment r³   N)rµ   r"   rª   r9   r   rA   ÚshutdownÚserver_closer½   r#   r_   )r   r²   rÙ   Zserver_infor   r°   r   r   r    Ústop_environmentÈ  s,   
€þz)StaticFileHoneypotDriver.stop_environmentc                 C   sN   |   |¡}|st d|› d¡ dS |d dkr|  |¡ t d|› ¡ dS )u   åˆ é™¤é™æ€æ–‡ä»¶èœœç½çŽ¯å¢ƒr¸   rÃ   Fr¶   rÏ   z)Deleted Static File Honeypot environment T)rµ   r"   rª   rÞ   r#   ©r   r²   rÙ   r   r   r    Údelete_environmentã  s   

z+StaticFileHoneypotDriver.delete_environmentc                 C   s   |   |¡}|s	dS |d S )u   èŽ·å–çŽ¯å¢ƒçŠ¶æ€Z	not_foundr¶   )rµ   rß   r   r   r    Úget_environment_statusó  s   
z/StaticFileHoneypotDriver.get_environment_statusN)r…   r†   r‡   rˆ   r   r•   r—   rK   r    r   r   r   r±   r   rµ   Úboolr½   rÂ   rÚ   rÞ   rà   rá   r   r   r   r    r‹   ß   s    
	"ar‹   )!rÕ   rF   r¨   r¥   Úloggingr0   r   r¿   Úurllib.parsera   Úhttp.serverr   r   Útypingr   r   r   r   Úpluginsr   Úcore.rule_enginer	   Úcore.databaser
   Zcore.log_utilsr   ÚbasicConfigÚINFOÚ	getLoggerr…   r"   r   r‹   r   r   r   r    Ú<module>   s(    
 H