
    h^                        S SK r S SKr\R                  R                  \R                  R                  \R                  R	                  \5      5      5      r\\ R                  ;  a  \ R                  R                  S \5        S SKrS SK	r	S SK
r
S SKJrJrJr  S SKJrJrJrJr  S SKJr  \
R,                  " \
R.                  SS9  \
R0                  " \5      rS SKJr  S SKJr  S S	KJ r   S S
K!J"r"  \" \5      r#Sr$\RJ                  " \$SS9  \$\#RL                  S'   1 Skr'S r(\" \#SSSSSS9r)\" SSS9r*\" SSS9r+\" SSS9r,\" SSS9r-\)R]                  \*S S!9  \)R]                  \+S S!9  \)R]                  \,S S!9  \)R]                  \-S"S!9  \)R_                  S#\R`                  " S$S%S&S'9\R`                  " S$S(S)S'9\R`                  " S$S*S+S'9\Rb                  " S$S,S-S'9\R`                  " S$S.S/S'9\Rd                  " S$S0S1S2S3.S'9\Rf                  " \R`                  S$S4S5S6/S'9S7.5      r4\)R_                  S8\R`                  " S9S9\R`                  " S:S9S;.5      r5\)R_                  S<\R`                  " S9S9\R`                  " S=S9\Rd                  " S>S9S?.5      r6\)R_                  S@\R`                  " S9S9\R`                  " S=S9\Rd                  " S>S9\R`                  " SAS9SB.5      r7\)R_                  SCSD\R`                  " SES905      r8\)R_                  SFSG\R`                  " S:S905      r9\)R_                  SH\Rf                  " \R`                  S$SISJSK/S'9\Rf                  " \Rd                  S$SLSM9SN.5      r:\)R_                  SO\R`                  " SPS9\R`                  " SQS9SR.5      r;\)R_                  SS\R`                  " S:S9\R`                  " STS9SU.5      r<S~SV jr=\=" 5       r>\"" 5       r?\" \>SW   SX    V s/ s H  n \R                  R                  \U 5      PM!     sn \>SW   SY    V s/ s H  n \R                  R                  \U 5      PM!     sn -   5      rA\AR                  5         \ " \>SZ   S[   5      rC\" \>S\   S]   5      rD\AR                  R                  5        H/  rG\AR                  \G5      rI\I(       d  M  \DR                  \G\I5        M1     \CR                  5       rL\DR                  \L5        \*R                  S^5       " S_ S<\5      5       rO\*R                  S`5      \*R                  SaS95       " Sb Sc\5      5       5       rQ\+R                  Sd5      \+R                  SaS95       " Se Sf\5      5       5       rR\+R                  Sg5      \+R                  SaS95       " Sh Si\5      5       5       rS\,R                  Sj5      \,R                  SaS95       " Sk Sl\5      5       5       rT\,R                  Sm5       " Sn So\5      5       rU\-R                  Sp5       " Sq Sr\5      5       rV\#R                  S^S[Ss0/ StQSu9\#R                  Sv/ StQSw9Sx 5       5       rW\Sy:X  a  \#R                  \>Sz   S{   \>Sz   S|   SS}9  ggs  sn f s  sn f )    N)Flaskrequestabort)ApiResource	Namespacefields)secure_filename4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformat)PluginManager)
RuleEngine)RuleManager)get_db_managerzuploads/certificatesT)exist_okUPLOAD_FOLDER>   crtkeypemcertc                 n    SU ;   =(       a*    U R                  SS5      S   R                  5       [        ;   $ )u$   检查文件扩展名是否被允许.   )rsplitlowerALLOWED_EXTENSIONS)filenames    D:\code\IVE\api\server.pyallowed_filer    )   s7    (? D??3"1%++-1CCD    z1.0zIVE Honeypot APIuC   蜜罐系统 API，用于管理蜜罐环境和配置反制规则。z/docs/z/redoc/)versiontitledescriptiondoc	redoc_urlenvironmentsu   环境管理)r$   controlu   环境控制countermeasuresu   反制能力管理filesu   文件管理z/api/v1/environments)pathz/api/v1/filesEnvironmentInputFu   蜜罐类型http)requiredr$   exampleu   蜜罐名称
MyHoneypotu   监听主机地址0.0.0.0u   监听端口P   u   服务 BannerzApache/2.4.1u   SSL 配置 (如果需要HTTPS)z/path/to/cert.pemz/path/to/key.pem)certfilekeyfileu   绑定的域名列表zexample.comzwww.example.com)typenamehostportbannerssldomainsEnvironmentOutputu	   环境 IDu   操作结果信息idmessageEnvironmentListu   使用的驱动u   环境配置)r>   driverconfigEnvironmentDetailu   环境状态)r>   rA   rB   statusErrorerroru   错误信息Messager?   ConfigureCountermeasuresInputu#   要关联到环境的规则ID列表inject_fake_flag_on_adminrandom_delay_on_loginuH   要关联到环境的完整规则对象列表 (优先级高于 rule_ids))r.   r$   )rule_idsrulesCountermeasureDescriptionu   反制动作名称u   反制动作描述r6   r$   
FileUploadu   上传文件的存储路径r?   filepathc                 <    [        U SSS9 n[        R                  " U5      nSSS5        [        R	                  SU  35        W$ ! , (       d  f       N(= f! [
         a:  n[        R                  SU  SU 35        SS	S
.SS0S/S/S.SSSS.S.s SnA$ SnAff = f)u   加载系统配置rzutf-8)encodingNz!Loaded system configuration from z)Failed to load system configuration from z: r1   i  )r7   r8   r+   zdata/honeypot.dbz	./driversz./countermeasures)driver_dirscountermeasure_dirsINFOr   z./logs/countermeasure_audit.log)r   r   audit_log_file)serverdatabasepluginslogging)openjsonloadloggerinfo	ExceptionrF   )config_filefrB   es       r   load_system_configrf      s    
+sW5YYq\F 67}EF 65  
@RPQsST  )$7!34 +}(;'<
  P"C
 	

s3   A A!A 
AA 
B!/BBBr[   rU   rV   rZ   r+   r\   rX   /c            
       h   \ rS rSr\R                  S5      \R                  \5      S 5       5       r\R                  S5      \R                  \
SS9\R                  \SS9\R                  S	S
\5      \R                  SS\5      \R                  SS\5      S 5       5       5       5       5       5       rSrg)r@      list_environmentsc                 .    [         R                  5       nU$ )u   列出所有环境)rule_managerrj   )selfdb_environmentss     r   getEnvironmentList.get   s     '88:r!   create_environmentTvalidate   code  Invalid JSON  zEnvironment already exists  z'Driver not available or creation failedc                    [         R                  nU(       d  [         R                  SS5        UR                  SS5      nUS:w  a  U S3OSn[        R                  U5      nU(       d6  [        R                  S5      nU(       d  [         R                  SSU S	35        UR                  U5      n[        R                  XSU5      nU(       d  [         R                  S
SU S35        USS.S4$ )u   创建新环境rw   rx   r5   r-   	_honeypothttp_honeypotrz   zDriver for type 'z' not availablery   zEnvironment with ID 'z' already existszEnvironment createdr=   rt   )apipayloadr   ro   plugin_manager
get_driverrq   rl   )rm   dataenv_typedriver_namerA   env_idsuccesss          r   postEnvironmentList.post   s     {{IIc>* 88FF+08F0B
),  **;7#..?F		#!28*OLM
 **40 11&tLIIc26(:JKL )>?DDr!    N)__name__
__module____qualname____firstlineno__ns_envr%   marshal_list_withenvironment_list_modelro   expectenvironment_input_modelmarshal_withenvironment_output_modelresponseerror_modelr   __static_attributes__r   r!   r   r@   r@      s    ZZ#$45 6 % ZZ$%]]*T]:1<__S.+6__S6D__SC[Q!E R E 7 = ; &!Er!   z/<string:env_id>r   c                   F   \ rS rSr\R                  S5      \R                  \5      \R                  SS\	5      S 5       5       5       r
\R                  S5      \R                  SS5      \R                  SS\	5      \R                  S	S
\	5      S 5       5       5       5       rSrg)Environment   get_environment  Environment not foundc                     [         R                  U5      nU(       d  [        R                  SS5        US   n[        R                  U5      nU(       a  UR                  U5      US'   U$ SUS'   U$ )u   获取环境详情r   !Environment not found in databaserA   rD   unknown)rl   r   r~   r   r   r   get_environment_status)rm   r   envr   rA   s        r   ro   Environment.get   so     **62IIc>? (m**;7"99&ACM 
 &CM
r!   delete_environment   zEnvironment deletedrz   z'Driver not available or deletion failedc                    [         R                  U5      nU(       d  [        R                  SS5        US   n[        R                  U5      nU(       d  [        R                  SU SU S35        Sn[        US5      (       a  UR                  U5      n[         R                  U5      nU(       a  U(       a  g	[        R                  S
S5        g)u   删除环境r   r   rA   Driver z not available for environment z during deletionTr   ) r   rz   zFailed to delete environmentN)
rl   r   r~   r   r   r   r`   warninghasattrr   )rm   r   r   r   rA   driver_delete_successdb_delete_successs          r   deleteEnvironment.delete   s     **62IIc>?(m**;7 NNW[M1PQWPXXhij !%6/00$*$=$=f$E! );;FC %6 IIc9:r!   r   N)r   r   r   r   r   r%   r   environment_detail_modelr   r   ro   r   r   r   r!   r   r   r      s     ZZ!"12__S1;? @ 3 #" ZZ$%__S/0__S1;?__SC[Q#; R @ 1 &#;r!   r   z/<string:env_id>/startc                       \ rS rSr\R                  S5      \R                  SS\5      \R                  SS\5      \R                  SS\5      S	 5       5       5       5       r	S
r
g)EnvironmentStarti)  start_environment   Environment startedr   r   rz   z$Driver not available or start failedc                 F   [         R                  U5      nU(       d  [        R                  SS5        US   n[        R                  U5      nU(       d  [        R                  SSU S35        UR                  U5      nU(       a  SS0S	4$ [        R                  SS
5        g)u   启动环境r   r   rA   rz   r    not availabler?   r   r   zFailed to start environmentN)rl   r   r~   r   r   r   r   rm   r   r   r   rA   r   s         r   r   EnvironmentStart.post,  s     **62IIc>?(m**;7IIcW[M@A**6245s::IIc89r!   r   Nr   r   r   r   ns_ctrlr%   r   message_modelr   r   r   r   r!   r   r   r   )  sk     [[$%c0-@c2K@cA;O: P A A &:r!   r   z/<string:env_id>/stopc                       \ rS rSr\R                  S5      \R                  SS\5      \R                  SS\5      \R                  SS\5      S	 5       5       5       5       r	S
r
g)EnvironmentStopiB  stop_environmentr   Environment stoppedr   r   rz   z#Driver not available or stop failedc                 F   [         R                  U5      nU(       d  [        R                  SS5        US   n[        R                  U5      nU(       d  [        R                  SSU S35        UR                  U5      nU(       a  SS0S	4$ [        R                  SS
5        g)u   停止环境r   r   rA   rz   r   r   r?   r   r   zFailed to stop environmentN)rl   r   r~   r   r   r   r   r   s         r   r   EnvironmentStop.postE  s     **62IIc>?(m**;7IIcW[M@A))&145s::IIc78r!   r   Nr   r   r!   r   r   r   B  sk     [[#$c0-@c2K@c@+N9 O A A %9r!   r   z /<string:env_id>/countermeasuresc            
          \ rS rSr\R                  S5      \R                  \SS9\R                  SS\	5      \R                  SS\
5      \R                  S	S
\
5      \R                  SS\
5      S 5       5       5       5       5       5       rSrg)ConfigureCountermeasuresi[  configure_countermeasuresTrr   rt   zCountermeasures configuredrw   z)Invalid payload or rule validation failedr   r   rz   z#Failed to configure countermeasuresc                    [         R                  U5      nU(       d  [        R                  SS5        [        R                  nUR                  S/ 5      nUR                  S/ 5      n/ nU(       aE  [        U[        5      (       a  [        S U 5       5      (       d  [        R                  SS5        UnO{U(       as  [         R                  5       nU Vs0 s H  oR                  S5      U_M     n	nU H7  n
X;   a  UR                  X   5        M  [        R                  SS	U
 S
35        M9     O [         R                  X5      nU(       a	  SSU 30S4$ [        R                  SS5        gs  snf )u   为环境配置反制措施r   r   rK   rL   c              3   B   #    U  H  n[        U[        5      v   M     g 7f)N)
isinstancedict).0rS   s     r   	<genexpr>0ConfigureCountermeasures.post.<locals>.<genexpr>v  s     5YSXajD6I6ISXs   rw   z:Invalid rules format: rules must be a list of rule objectsr>   z	Rule ID 'z' not found in global rulesr?   z+Countermeasures configured for environment rt   rz   z/Failed to configure countermeasures in databaseN)rl   r   r~   r   r   ro   r   listallget_all_rulesappendset_environment_rules)rm   r   r   r   rK   rL   environment_rulesall_global_rulesruleglobal_rule_dictrule_idr   s               r   r   ConfigureCountermeasures.post^  sI    **62IIc>? {{88J+"%  eT**#5YSX5Y2Y2Y		#[\ %+99;AQRAQ 4AQR#.%,,-=-FG IIcZy8T#UV $  44VO!LVHUVX[[[IIcLM-  Ss   E,r   N)r   r   r   r   ns_cmr%   r   %configure_countermeasures_input_modelr   r   r   r   r   r   r!   r   r   r   [  s     YY*+
\\7$\G
^^C5}E
^^CDkR
^^C0+>
^^C>L/N M ? S F H ,/Nr!   r   z/descriptionsc                   j    \ rS rSr\R                  S5      \R                  \5      S 5       5       rSr	g)CountermeasureDescriptionsi   list_countermeasure_descriptionsc                 <   / n[         R                  R                  5        H0  u  p# U" 5       nUR                  5       nUR	                  X%S.5        M2     U$ ! [
         a:  n[        R                  SU SU 35        UR	                  USS.5         SnAMu  SnAff = f)u'   列出所有可用反制动作的描述rN   z.Failed to get description for countermeasure 'z': zDescription unavailableN)r   r)   itemsget_descriptionr   rb   r`   rF   )rm   descriptionsr6   cm_classcm_instancer$   re   s          r   ro   CountermeasureDescriptions.get  s     ,<<BBDND^&j)99;##T$NO E   ^MdVSVWXVYZ[##TB[$\]]^s   *A
B!/BBr   N)
r   r   r   r   r   r%   r    countermeasure_description_modelro   r   r   r!   r   r   r     s2    
YY12
=> ? 3r!   r   z/certificatesc                       \ rS rSr\R                  S5      \R                  \R                  5       R                  SSSSSS95      \R                  \
SS	9\R                  S
S\5      S 5       5       5       5       rSrg)CertificateUploadi  upload_certificatefiler*   Tu   证书文件)locationr5   r.   helprt   ru   rw   z%No file selected or invalid file typec                    S[         R                  ;  a  [        R                  SS5        [         R                  S   nUR                  S:X  a  [        R                  SS5        U(       a  [        UR                  5      (       a  [        UR                  5      n[        R                  " 5       R                   SU 3n[        R                  R                  [        R                  S   U5      n UR                  U5        [         R#                  SU 35        S	US
.S4$ [        R                  SS5        g! [$         a8  n[         R'                  SU 35        [        R                  SS5         SnAgSnAff = f)u   上传SSL证书文件r   rw   zNo file partr   zNo selected file_r   z(Certificate file uploaded successfully: zFile uploaded successfullyrP   rt   zFailed to save uploaded file: rz   zFailed to save fileNz5Invalid file type. Allowed types: pem, crt, key, cert)r   r*   r~   r   r   r    r
   uuiduuid4hexosr+   joinapprB   saver`   ra   rb   rF   )rm   r   r   unique_filenamerQ   re   s         r   r   CertificateUpload.post  s,    &IIc>*}}V$ ==BIIc-. L//&t}}5H!%!1!1 2!H:>Oww||CJJ$?QH	6		(#FxjQR; (   IIcRS	  6=aSAB		#4556s   0/D7 7
E9.E44E9r   N)r   r   r   r   ns_filesr%   r   parseradd_argumentr   file_upload_modelr   r   r   r   r   r!   r   r   r     s    \\&'__X__&33FWSYdho}3~,37sC[QT R 8 @ (Tr!   r   r   )GETPOSTPUTDELETE)defaultsmethodsz/<path:path>)r   c                 &   S[         R                  [         R                  [        [         R                  5      [         R
                  [         R                  R                  5       [         R                  R                  5       [         R                  " SS9S.n[        R                  5       nU(       a  US   S   OSnUS:X  a  [        R                  5       nO2[        R                  U5      nU(       a  UO[        R                  5       n[        R                  XU5      nS nU HV  nUR!                  S5      S	:X  d  M  UR!                  S
0 5      R!                  S5      (       d  MB  US
   R!                  S5      n  O   SR#                  U5      n	U	n
U(       ae  US   nUS   nUS:X  a  U	R%                  SU S3S5      n
O>US:X  a  U	R%                  SU S3S5      n
O!US:X  a  U	R%                  SSU 3S5      n
OX-  n
[&        R)                  U
SSS9nU$ )Nr-   T)as_text)protocolmethodr+   headersipargsformr   r   r>   defaultactioninject_contentresultr   inject_infoa8  
    <!DOCTYPE html>
    <html>
    <head>
        <title>IVE Honeypot</title>
    </head>
    <body>
        <h1>Welcome to the IVE Honeypot!</h1>
        <p>This is a simulated service for security research and deception.</p>
        <p>Countermeasures triggered: <pre>{}</pre></p>
    </body>
    </html>
    contentr   before_body_endz</body>z
</body>r   headz</head>z
</head>
body_startz<body>z<body>
r   z	text/html)r   rD   mimetype)r   r  r+   r   r  remote_addrr  to_dictr  get_datarl   rj   r   get_environment_rulesrule_engine$evaluate_and_execute_for_environmentro   r   replacer   response_class)r+   request_contextrn   environment_idrules_to_user   resultsr  r
  default_html_contentresponse_contentcontent_to_injectr   r   s                 r   honeypot_servicer     s   
 ..(!!$$&$$&  .	O #446O1@_Q'-iN "#113 )>>~N ->(<C]C]C_ >>^lmG K::h#33

8R8P8T8TU^8_8_ *..}=K  	w  , '	2z*((3;;IJ[I\\eGfhij3;;IJ[I\\eGfhij%3;;HQbPcFdfgh 1 !!! " H
 Or!   __main__rY   r7   r8   )r7   r8   debug)zconfig/config.json)Ysysr   r+   dirnameabspath__file__project_rootinsertr^   r   r\   flaskr   r   r   flask_restxr   r   r   r	   werkzeug.utilsr
   basicConfigrW   	getLoggerr   r`   core.plugin_managerr   core.rule_enginer   core.rule_managerr   core.databaser   r   r   makedirsrB   r   r    r~   r   r   r   r   add_namespacemodelStringIntegerRawListr   r   r   r   r   r   r   r   r   rf   system_config
db_managerr   r   load_pluginsrl   r  r)   keysr6   get_countermeasure	cm_pluginregister_countermeasurer   rL   
load_rulesrouter@   paramr   r   r   r   r   r   r   run)dir_paths   0r   <module>rE     s   
 	 wwrwwrwwx/HIJsxxHHOOA|$    ' ' 8 8 *   ',,/e f			8	$ . ' ) ( Ho ' MD )+

? 2 D 
#u$6[ 
>~	>
I>
:#1EFW.9   &5  6   ' 6  7   %4  5   (  1 ))$6MM5nfUMM5nl[MM56JT]^NNE~rRmmUQ_`::u2Ri|  J\  ]]  ^{{6==5F]hu  xI  hJ  K9   99%8
--K
0}})=>;   #4
--K
0mm(9:jj^47   99%8
--K
0mm(9:jj^4mm7	;   iiV]]~6" 
 		)v}})=>&  ),		2QFMMEGl  xS  Ul  wm  n[[e  BL  MT ) % $'99-HMM&:;==-ABK $   IIl}})=>*GH-  
2 #$ 
:G	:RS`:ab:ahRWW\\,):ab:G	:RSh:ij:ihRWW\\,):ijk    =4V<=y12BCD **//1D11$7Iy++D)< 2 	""$   u  c2Eh 2E 2Eh  !h$<;( <; % "<;| 	'(x%:x : & ):. 	&'x%9h 9 & (9. /0X{#6Nx 6N $ 16Nr _  $ 
 $T $T !$TZ 3&"/OP>#CDU E QUn zGG8$V,8$V,   a cjs   2&Y/$&Y4
