
    hT                     0   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j4                  ej6                  d	        ej8                  e      Z G d
 de      Z G d de      Z y)    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                        e Zd ZU dZdZee   ed<   dddd fd
Zd Z	de
eef   fdZd	e
eef   dee
eef      fd
Zdee
eef      dee
eef      fdZdee
eef      fdZ fdZ fdZ xZS )StaticFileHTTPRequestHandleru[   
    自定义请求处理器，用于提供静态文件服务，并集成反制逻辑
    Nrule_engine	directoryenvironment_idenvironment_rulesc                    ||nt        j                         | _        || _        ||ng | _        d | _        t        |   |i | y N)osgetcwdr   r   r   _inject_infosuper__init__)selfr   r   r   argskwargs	__class__s         7E:\workrun\ive\./drivers\static_file_honeypot\driver.pyr   z%StaticFileHTTPRequestHandler.__init__    sJ    &/&;,6G6S!2Y[ $)&)    c                     t        | j                               }t        ||z        }t        j                  |d| j	                         d|d       y )Nz - - [z] 
)r   address_stringloggerinfolog_date_time_string)r   r   r   	safe_addrsafe_fmts        r!   log_messagez(StaticFileHTTPRequestHandler.log_message)   s@    $T%8%8%:;	#FTM2)T5N5N5PRZ[\r"   returnc                     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commandr2   dictr3   client_addressr   s    r!   _build_request_contextz3StaticFileHTTPRequestHandler._build_request_context/   sM     $.doos}}#MSYllIIDLL)%%a(
 	
r"   request_contextc                     | j                   r=| j                  r1| j                   j                  || j                  | j                        S t        j                  d       g S )u   执行反制措施zIRule engine or environment ID not available for countermeasure execution.)r   r   $evaluate_and_execute_for_environmentr   r&   warning)r   r>   s     r!   _execute_countermeasuresz5StaticFileHTTPRequestHandler._execute_countermeasures:   sS     3 3##HH!7!79L9L  NNfgIr"   resultsc                     |D ]N  }|j                  d      dk(  s|j                  di       j                  d      s:|d   j                  d      c S  y)u   处理内容注入反制结果actioninject_contentresultsuccessinject_infoN)get)r   rC   rG   s      r!   _handle_inject_contentz3StaticFileHTTPRequestHandler._handle_inject_contentE   sS    Fzz(#'77FJJxQS<T<X<XYb<ch'++M::  r"   c                    |D ]  }|j                  d      dk(  s|j                  di       j                  di       }|j                  dd      }|dkD  sRt        j                  d| d       t        j                  |        y	)
u-   应用反制措施的副作用（如延迟）rE   delayrG   configdurationr   zApplying delay of z seconds for countermeasure.N)rJ   r&   r'   timesleep)r   rC   rG   delay_configrO   s        r!   "_apply_countermeasure_side_effectsz?StaticFileHTTPRequestHandler._apply_countermeasure_side_effectsL   sx     Fzz(#w.%zz(B7;;HbI'++J:a<KK"4XJ>Z [\JJx( r"   c                 ^   | j                         }| j                  |      }| j                  |       | j                  |      | _        | j                  rNt        | j                        }t        t        | j                              }t        j                  d| d|        d}|D ]r  }|j                  d      dk(  s|j                  di       j                  di       }|j                  dd	      }|j                  d
d      }	| j                  ||	       d} n |st        
| 5          yy)u&   处理 GET 请求，集成反制逻辑zContent injection prepared for z. Inject info: FrE   error_responserG   rN   codei  messagezInternal Server ErrorTN)r=   rB   rS   rK   r   r   r2   strr&   r'   rJ   
send_errorr   do_GET)r   r>   countermeasure_results	safe_path	safe_infoerror_triggeredrG   error_config
error_codeerror_messager    s             r!   rZ   z#StaticFileHTTPRequestHandler.do_GETW   s$    557 "&!>!>!O 	//0FG !778NO(3I(T->->)?@IKK9)OT]S^_`  ,Fzz(#'77%zz(B7;;HbI)--fc:
 , 0 0<S T
M:"& - GN r"   c                    | j                  | j                        }	 t        j                  j                  |      }t        j                  j                  | j                        }t        j                  j                  ||g      |k7  r| j                  dd       y	 d}t        j                  j                  |      rt        j                  j                  | j                        }|j                  j                  d      sl| j                  d       |d   |d   |d   dz   |d	   |d
   f}t        j                  j                  |      }| j                  d|       | j!                          ydD ]E  }t        j                  j#                  ||      }t        j                  j%                  |      sC|} n t&        | Q         S | j+                  |      }	|	j-                  d      r| j.                  r	 t1        |d      }t        j4                  |j7                               }
|j9                         }|j;                          	 |j=                  d      }| j.                  d   }| j.                  d   }|}|dk(  r|jE                  d| dd      }n=|dk(  r|jE                  d| dd      }n!|dk(  r|jE                  dd| d      }n||z   }|jG                  d      }| j                  d       | j                  d |	       | j                  d!tI        tK        |                   | j                  d"| jM                  |
jN                               | j!                          | jP                  jS                  |       yt&        | Q         S # t        $ r | j                  dd       Y yw xY w# t2        $ r | j                  dd       Y yw xY w# t>        $ r* t@        jC                  d| d       t&        | Q         cY S w xY w)#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_pathr2   r   realpathr   
commonpathrY   	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&   rA   replaceencoderX   lendate_time_stringst_mtimewfilewrite)r   r2   resolved_requested_pathresolved_base_dirfparts	new_partsnew_urlindexctypefsrk   content_strcontent_to_injectrl   injected_contentinjected_bytesr    s                    r!   r   z&StaticFileHTTPRequestHandler.send_heady   s   
 ""499-		&(gg&6&6t&<# " 0 0 @ww!!#:<M"NOSdd[1 e 77== LL))$))4E::&&s+""3'"1XuQxqC!!HeAh0	 ,,11)<  W5  "2T5177>>%( D	 3 w(**%
 K(T->->t$ !((*%BffhGGGI+%nnW5 !% 1 1) <((4H*,,#.#6#6yEVDWW`Bacd#e V##.#6#6yEVDWW`Bacd#e \)#.#6#6x8L]K^A_ab#c  $/1B#B  .44W=N s#^U3-s3~3F/GH_%%bkk24 JJ^, 7$&&k  	OOC-	D  %56 & +!24&8_`aw(**+s6   A>N 9N1 	O N.-N.1OO0PP)__name__
__module____qualname____doc__r   r   r
   __annotations__r   r+   r   rX   r   r=   r   rB   rK   rS   rZ   r   __classcell__)r    s   @r!   r   r      s    
 )-K*%,(,TUY *]	
S#X 	
	S#X 	4PTUXZ]U]P^K_ 	d4S>.B xPTUXZ]U]P^G_ 	)$tCH~:N 	)Db' b'r"   r   c                       e Zd ZdZd Zd Zd ZdedefdZde	e
eef      fdZd	edee
eef      fd
Zd	ededefdZde
eef   defdZd	edefdZd	edefdZd	edefdZd	edefdZy)StaticFileHoneypotDriveru=   
    静态文件蜜罐驱动插件实现 (集成反制)
    c                 >    t               | _        i | _        d | _        y r   )r   
db_managerserversr   r<   s    r!   r   z!StaticFileHoneypotDriver.__init__   s    (*r"   c                     	 ddl }|j                  j                  S # t        t        f$ r t
        j                  d       Y yw xY w)u   获取 rule_engine 实例r   NzFFailed to get global rule_engine instance in StaticFileHoneypotDriver.)
api.serverserverr   ImportErrorAttributeErrorr&   rA   r   apis     r!   _get_rule_enginez)StaticFileHoneypotDriver._get_rule_engine   s>    	::)))^, 	NNcd	    $AAc                     	 ddl }|j                  j                  S # t        t        f$ r t
        j                  d       Y yw xY w)u/   获取 rule_manager 实例以获取环境规则r   NzGFailed to get global rule_manager instance in StaticFileHoneypotDriver.)r   r   rule_managerr   r   r&   rA   r   s     r!   _get_rule_managerz*StaticFileHoneypotDriver._get_rule_manager   s>    	::***^, 	NNde	r   static_rootr,   c                    t         j                  j                  t         j                  j                  t         j                  j                  t                          }t         j                  j                  |      }t         j                  j                  t         j                  j                  |d            }|}t         j                  j                  |      s t         j                  j                  ||      }t         j                  j                  |      }t         j                  j                  |      st        d|       t         j                  j                  |      st        d|       	 t         j                  j                  ||g      |k7  rt        d|       	 |S # t        $ r t        d|       w xY w)u2  解析并校验静态根目录，限制在项目 static_sites 目录内。
        :param static_root: 配置传入的静态目录（相对或绝对路径）
        :return: 经过 realpath 解析且校验通过的绝对路径
        :raises: ValueError 当路径不存在/不是目录/越界时
        static_sitesz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   r2   dirnameabspath__file__rr   r~   isabsr   
ValueErrorru   rs   rt   )r   r   drivers_dirproject_rootallowed_basecandidate_pathresolveds          r!   !_resolve_and_validate_static_rootz:StaticFileHoneypotDriver._resolve_and_validate_static_root   sT    ggoobggoobggooh6O&PQww{3ww''\>(RS %ww}}^,WW\\,GN77##N3 ww~~h';H:FGGww}}X&?zJKK	Oww!!8\":;|K #H
!STT L 	  	OB8*MNN	Os   52F* *Gc                    	 | j                   j                         5 }|j                         }|j                  d       |j	                         }g }|D ]9  }t        |      }t        j                  |d         |d<   |j                  |       ; |cddd       S # 1 sw Y   yxY w# t        j                  $ r$}t        j                  d|        g cY d}~S d}~ww xY w)u`   
        从数据库列出所有环境。
        :return: 环境信息字典列表。
        zSELECT * FROM environmentsrN   NzError listing environments: )r   get_connectioncursorexecutefetchallr:   jsonloadsappendsqlite3Errorr&   error)r   connr   rowsenvironmentsrowenv_dataes           r!   list_environmentsz*StaticFileHoneypotDriver.list_environments  s    
	//1T;<(!C#CyH)-HX4F)GHX& ''1	  
 $ 211 }} 	LL7s;<I	s;   B% A3B	B% B"B% "B% %C8CCCenv_idc                    	 | j                   j                         5 }|j                         }|j                  d|f       |j	                         }|r1t        |      }t        j                  |d         |d<   |cddd       S 	 ddd       y# 1 sw Y   yxY w# t        j                  $ r%}t        j                  d| d|        Y d}~yd}~ww xY w)u   
        从数据库获取环境信息。
        :param env_id: 环境唯一标识符。
        :return: 环境信息字典，如果未找到则返回 None。
        z'SELECT * FROM environments WHERE id = ?rN   NzError getting environment : )r   r   r   r   fetchoner:   r   r   r   r   r&   r   )r   r   r   r   r   r   r   s          r!   get_environmentz(StaticFileHoneypotDriver.get_environment4  s    	E//1TH6)Too'#CyH)-HX4F)GHX&# 21 	 2  2  }} 	ELL5fXRsCDD	Es;   B AB9	B B BB B C,CCstatusc                    	 | j                   j                         5 }|j                         }|j                  d||f       |j	                          t
        j                  d| d       	 d d d        y# 1 sw Y   y xY w# t        j                  $ r t
        j                  d| d       Y yt        j                  $ r%}t
        j                  d| d|        Y d }~yd }~ww xY 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   IntegrityErrorrA   r   r   )r   r   r   r   r   r   s         r!   update_environmentz+StaticFileHoneypotDriver.update_environmentI  s    	//1TEV$ l6(2FGH 211 %% 	NN\&1MNO}} 	LL7xr!EF	s;   B  AA4+B  4A=9B  =B   ,C%.C% C  C%
env_configc                 ~    dt        j                         j                   }t        j	                  d| d|        |S )u   创建静态文件蜜罐环境static_env_z)Created Static File Honeypot environment z with config )uuiduuid4hexr&   r'   )r   r   r   s      r!   create_environmentz+StaticFileHoneypotDriver.create_environment[  s@     tzz|//01 	?x}U_T`abr"   c                 F   | j                        }|st        j                  d d       y|d   }	 | j                  s| j	                         | _        | j                  st        j                  d        y| j                  t
        _        |d   }|j                  dd      }|j                  d	d
      }|j                  dd      | j                        |j                  dd      }g | j                         }|r	 |j                        nt        j                  d d       fd}
t        ||f|
      }|r|j                  d      }|j                  d      }|r|rt        j                  j                  |      r`t        j                  j                  |      rAt!        j"                  |j$                  ||d      |_        t        j'                  d        nt        j                  d d       t)        j*                  |j,                  d      }|j/                          ||d| j0                  <   d}	 | j2                  j5                         5 }|j7                         }|j9                  d|f       |j;                          ddd       t        j'                  d" d#| d$| d% d&|rd'nd( 
       y# t        $ r'}	t        j                  d d|	 d       Y d}	~	d}	~	ww xY w# 1 sw Y   exY w# t<        j>                  $ r t        j                  d d        Y yt<        j@                  $ r%}	t        j                  d! d|	        Y d}	~	yd}	~	ww xY w# t        $ r%}	t        j                  d) d|	        Y d}	~	yd}	~	ww xY w)*u-   启动静态文件蜜罐环境 (集成反制)r   
 not foundFr   z*Rule engine not available for environment rN   hostz0.0.0.0porti  r   .r7   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                  "    t        | d|S )Nr   )r   )r   r   r   r   r   s     r!   handler_factoryzCStaticFileHoneypotDriver.start_environment.<locals>.handler_factory  s&    3)#)&7	
  r"   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   rJ   r   r   get_environment_rulesrt   rA   r   r   r2   r   r7   wrap_socketsocketr'   	threadingThreadserve_foreverstartr   r   r   r   r   r   r   r   r   )r   r   envr   rN   r   r   
ssl_configr   r   r   r   r   r   server_threadr   r   r   r   s    `               @@r!   start_environmentz*StaticFileHoneypotDriver.start_environmentg  s   ""6*LL<xz:;X
S	###'#8#8#: ##I&RS7;7G7G(4]F::fi0D::fd+D **]C8K@@MKE40J !#113Ll(4(J(J6(R% !LVHTlmn  to>F %>>*5$..3BGGNN8,DX_I`$'OOFMM<D;B?C%EFM KK">vh GHNN%OPVxWn#op%,,F4H4HQUVM! !'$DLL  F__335![[]FNNI( KKM 6 KKCF84PTvUVW[V\\qr}q~~  OY  AK  _h  @i  j  ko ! lNN%I&QSTUSVVi#jkklR 65 )) fX5QRS== ;F82aSIJ
  	LLLVHTVWXVYZ[	s   AM2 =BM2 K D4M2 L
 %5K>L
 "(M2 	K;K60M2 6K;;M2 >LL
 
,M/6M2 8M/
M*%M2 *M//M2 2	N ;NN c                    | j                  |      }|st        j                  d| d       y|d   dk7  rt        j                  d| d       y	 | j                  j                  |      }|r2|d   }|j                          |j                          | j                  |= | j                  |d       t        j                  d	|        y
# t        $ r%}t        j                  d| d|        Y d}~yd}~ww xY 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   rA   r   rJ   shutdownserver_closer   r'   rt   )r   r   r  server_infor   r   s         r!   stop_environmentz)StaticFileHoneypotDriver.stop_environment  s    ""6*LL<xz:;x=I%NN\&AB	,,**62K$X.!##%LL( ##FI6KKCF8LM 	LLKF8SUVWUXYZ	s   A9C 	C9C44C9c                     | j                  |      }|st        j                  d| d       y|d   dk(  r| j                  |       t        j	                  d|        y)u   删除静态文件蜜罐环境r   r   Fr   r   z)Deleted Static File Honeypot environment T)r   r&   r   r  r'   r   r   r  s      r!   delete_environmentz+StaticFileHoneypotDriver.delete_environment  sb    ""6*LL<xz:; x=I%!!&) 	?xHIr"   c                 4    | j                  |      }|sy|d   S )u   获取环境状态	not_foundr   )r   r  s      r!   get_environment_statusz/StaticFileHoneypotDriver.get_environment_status  s"    ""6*8}r"   N)r   r   r   r   r   r   r   rX   r   r   r   r   r   r   r   boolr   r   r  r  r  r   r"   r!   r   r      s      S  S  D4S#X#7 *c htCH~.F * c d $
T#s(^ 
 
_ _ _Bs t 6   S S r"   r   )!r   rP   r   r   loggingr7   r   r   urllib.parserv   http.serverr   r   typingr   r   r   r   pluginsr	   core.rule_enginer
   core.databaser   core.log_utilsr   basicConfigINFO	getLoggerr   r&   r   r   r  r"   r!   <module>r     s~         
 	   < , ,   ' ( +   ',,/e f			8	$C'#; C'NY| Yr"   