
    5h^                        d dl Z d dlZej                  j                  ej                  j                  ej                  j	                  e                  Zee j                  vre j                  j                  d e       d dlZd dl	Z	d dl
Z
d dlmZmZmZ d dlmZmZmZmZ d dlmZ  e
j,                  e
j.                  d        e
j0                  e      Zd dlmZ d dlmZ d d	lm Z  d d
l!m"Z" d dl#m$Z$  ee      Z% e$e%       dZ& ejN                  e&d       e&e%jP                  d<   h dZ)d Z* ee%ddddd      Z+ edd      Z, edd      Z- edd      Z. edd       Z/e+ja                  e,d!"       e+ja                  e-d!"       e+ja                  e.d!"       e+ja                  e/d#"       e+jc                  d$ ejd                  d%d&d'(       ejd                  d%d)d*(       ejd                  d%d+d,(       ejf                  d%d-d.(       ejd                  d%d/d0(       ejh                  d%d1d2d3d4(       ejj                  ejd                  d%d5d6d7g(      d8      Z6e+jc                  d9 ejd                  d:       ejd                  d;      d<      Z7e+jc                  d= ejd                  d:       ejd                  d>       ejh                  d?      d@      Z8e+jc                  dA ejd                  d:       ejd                  d>       ejh                  d?       ejd                  dB      dC      Z9e+jc                  dDdE ejd                  dF      i      Z:e+jc                  dGdH ejd                  d;      i      Z;e+jc                  dI ejj                  ejd                  d%dJdKdLg(       ejj                  ejh                  d%dMN      dO      Z<e+jc                  dP ejd                  dQ       ejd                  dR      dS      Z=e+jc                  dT ejd                  d;       ejd                  dU      dV      Z>ddWZ? e?       Z@ e"       ZA ee@dX   dY   D  cg c]  } ej                  j                  e|         c} e@dX   dZ   D  cg c]  } ej                  j                  e|         c} z         ZCeCj                           e e@d[   d\         ZE ee@d]   d^         ZFeCj                  j                         D ](  ZIeCj                  eI      ZKeKseFj                  eIeK       * eEj                         ZNeFj                  eN       e,j                  d_       G d` d=e             ZQe,j                  da      e,j                  dbd:       G dc dde                    ZSe-j                  de      e-j                  dbd:       G df dge                    ZTe-j                  dh      e-j                  dbd:       G di dje                    ZUe.j                  dk      e.j                  dbd:       G dl dme                    ZVe.j                  dn       G do dpe             ZWe/j                  dq       G dr dse             ZXe%j                  d_d\dtig duv      e%j                  dwg dux      dy               ZYedzk(  r!e%j                  e@d{   d|   e@d{   d}   d%~       yyc c} w c c} w )    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_manager)CORSzuploads/certificatesT)exist_okUPLOAD_FOLDER>   crtkeypemcertc                 `    d| v xr) | j                  dd      d   j                         t        v S )u$   检查文件扩展名是否被允许.   )rsplitlowerALLOWED_EXTENSIONS)filenames    D:\code\IVE2\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?   rB   rC   statusErrorerroru   错误信息Messager@   ConfigureCountermeasuresInputu#   要关联到环境的规则ID列表inject_fake_flag_on_adminrandom_delay_on_loginuH   要关联到环境的完整规则对象列表 (优先级高于 rule_ids))r/   r%   )rule_idsrulesCountermeasureDescriptionu   反制动作名称u   反制动作描述r7   r%   
FileUploadu   上传文件的存储路径r@   filepathc                 4   	 t        | dd      5 }t        j                  |      }ddd       t        j	                  d|         S # 1 sw Y   #xY w# t
        $ r:}t        j                  d|  d|        dd	d
ddidgdgddddddcY d}~S d}~ww xY w)u   加载系统配置rzutf-8)encodingNz!Loaded system configuration from z)Failed to load system configuration from z: r2   i  )r8   r9   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	ExceptionrG   )config_filefrC   es       r    load_system_configrg      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\   rV   rW   r[   r,   r]   rY   /c            
       l   e Zd Zej	                  d      ej                  e      d               Zej	                  d      ej                  e	d      ej                  ed      ej                  dd	e      ej                  d
de      ej                  dde      d                                           Zy)rA   list_environmentsc                 .    t         j                         }|S )u   列出所有环境)rule_managerrj   )selfdb_environmentss     r    getzEnvironmentList.get   s     '88:r"   create_environmentTvalidate   code  Invalid JSON  zEnvironment already exists  z'Driver not available or creation failedc                    t         j                  }|st         j                  dd       |j                  dd      }|dk7  r| dnd}t        j                  |      }|s1t        j                  d      }|st         j                  dd| d	       |j                  |      }t        j                  |||      }|st         j                  d
d| d       |dddfS )u   创建新环境rv   rw   r6   r.   	_honeypothttp_honeypotry   zDriver for type 'z' not availablerx   zEnvironment with ID 'z' already existszEnvironment createdr>   rs   )apipayloadr   ro   plugin_manager
get_driverrp   rl   )rm   dataenv_typedriver_namerB   env_idsuccesss          r    postz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__ns_envr&   marshal_list_withenvironment_list_modelro   expectenvironment_input_modelmarshal_withenvironment_output_modelresponseerror_modelr    r"   r    rA   rA      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                   >   e Zd Zej	                  d      ej                  e      ej                  dde      d                      Z	ej	                  d      ej                  dd      ej                  dde      ej                  dd	e      d
                             Z
y)Environmentget_environment  Environment not foundc                     t         j                  |      }|st        j                  dd       |d   }t        j                  |      }|r|j                  |      |d<   |S d|d<   |S )u   获取环境详情r   !Environment not found in databaserB   rE   unknown)rl   r   r}   r   r   r   get_environment_status)rm   r   envr   rB   s        r    ro   zEnvironment.get   so     **62IIc>? (m**;7"99&ACM 
 &CM
r"   delete_environment   zEnvironment deletedry   z'Driver not available or deletion failedc                 l   t         j                  |      }|st        j                  dd       |d   }t        j                  |      }|st        j                  d| d| d       d}t        |d      r|j                  |      }t         j                  |      }|r|ry	t        j                  d
d       y)u   删除环境r   r   rB   Driver z not available for environment z during deletionTr   ) r   ry   zFailed to delete environmentN)
rl   r   r}   r   r   r   ra   warninghasattrr   )rm   r   r   r   rB   driver_delete_successdb_delete_successs          r    deletezEnvironment.delete  s     **62IIc>?(m**;7 NNW[M1PQWPXXhij !%6/0$*$=$=f$E! );;FC %6 IIc9:r"   N)r   r   r   r   r&   r   environment_detail_modelr   r   ro   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                       e Zd Zej	                  d      ej                  dde      ej                  dde      ej                  dde      d                             Zy	)
EnvironmentStartstart_environment   Environment startedr   r   ry   z$Driver not available or start failedc                 T   t         j                  |      }|st        j                  dd       |d   }t        j                  |      }|st        j                  dd| d       t        |       |j                  |      }t        |       |rddid	fS t        j                  dd
       y)u   启动环境r   r   rB   ry   r    not availabler@   r   r   zFailed to start environmentN)rl   r   r}   r   r   r   printr   rm   r   r   r   rB   r   s         r    r   zEnvironmentStart.post.  s     **62IIc>?(m**;7IIcW[M@Af**62g45s::IIc89r"   N	r   r   r   ns_ctrlr&   r   message_modelr   r   r   r"   r    r   r   +  sk     [[$%c0-@c2K@cA;O: P A A &:r"   r   z/<string:env_id>/stopc                       e Zd Zej	                  d      ej                  dde      ej                  dde      ej                  dde      d                             Zy	)
EnvironmentStopstop_environmentr   Environment stoppedr   r   ry   z#Driver not available or stop failedc                 (   t         j                  |      }|st        j                  dd       |d   }t        j                  |      }|st        j                  dd| d       |j                  |      }|rddid	fS t        j                  dd
       y)u   停止环境r   r   rB   ry   r   r   r@   r   r   zFailed to stop environmentN)rl   r   r}   r   r   r   r   r   s         r    r   zEnvironmentStop.postI  s     **62IIc>?(m**;7IIcW[M@A))&145s::IIc78r"   Nr   r   r"   r    r   r   F  sk     [[#$c0-@c2K@c@+N9 O A A %9r"   r   z /<string:env_id>/countermeasuresc            
          e Zd Zej	                  d      ej                  ed      ej                  dde      ej                  dde	      ej                  dd	e	      ej                  d
de	      d                                           Z
y)ConfigureCountermeasuresconfigure_countermeasuresTrq   rs   zCountermeasures configuredrv   z)Invalid payload or rule validation failedr   r   ry   z#Failed to configure countermeasuresc                    t         j                  |      }|st        j                  dd       t        j                  }|j                  dg       }|j                  dg       }g }|r;t        |t              rt        d |D              st        j                  dd       |}nq|rnt         j                         }|D ci c]  }|j                  d      | }	}|D ]5  }
|
|	v r|j                  |	|
          t        j                  dd	|
 d
       7 n	 t         j                  ||      }|r	dd| idfS t        j                  dd       yc c}w )u   为环境配置反制措施r   r   rL   rM   c              3   <   K   | ]  }t        |t                y w)N)
isinstancedict).0rT   s     r    	<genexpr>z0ConfigureCountermeasures.post.<locals>.<genexpr>z  s     5YSXajD6ISXs   rv   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 rs   ry   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   rL   rM   environment_rulesall_global_rulesruleglobal_rule_dictrule_idr   s               r    r   zConfigureCountermeasures.postb  sM    **62IIc>? {{88J+"%  eT*#5YSX5Y2Y		#[\ %+99;AQRAQ 4AQR#..%,,-=g-FG IIcZy8T#UV $  44V=NO!LVHUVX[[[IIcLM-  Ss   ;E
N)r   r   r   ns_cmr&   r   %configure_countermeasures_input_modelr   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                   b    e Zd Zej	                  d      ej                  e      d               Zy)CountermeasureDescriptions list_countermeasure_descriptionsc                 8   g }t         j                  j                         D ]1  \  }}	  |       }|j                         }|j	                  ||d       3 |S # t
        $ r9}t        j                  d| d|        |j	                  |dd       Y d}~sd}~ww xY w)u'   列出所有可用反制动作的描述rO   z.Failed to get description for countermeasure 'z': zDescription unavailableN)r   r*   itemsget_descriptionr   rc   ra   rG   )rm   descriptionsr7   cm_classcm_instancer%   rf   s          r    ro   zCountermeasureDescriptions.get  s     ,<<BBDND(^&j)99;##T+$NO E   ^MdVSVWXVYZ[##TB[$\]]^s   +A	B /BBN)r   r   r   r   r&   r    countermeasure_description_modelro   r   r"   r    r   r     s2    
YY12
=> ? 3r"   r   z/certificatesc            
           e Zd Zej	                  d      ej                  ej                         j                  ddddd            ej                  e	d      ej                  d	d
e      d                             Zy)CertificateUploadupload_certificatefiler+   Tu   证书文件)locationr6   r/   helprs   rt   rv   z%No file selected or invalid file typec                    dt         j                  vrt        j                  dd       t         j                  d   }|j                  dk(  rt        j                  dd       |rt        |j                        rt        |j                        }t        j                         j                   d| }t        j                  j                  t        j                  d   |      }	 |j                  |       t         j#                  d|        d	|d
dfS t        j                  dd       y# t$        $ r8}t         j'                  d|        t        j                  dd       Y d}~yd}~ww xY w)u   上传SSL证书文件r   rv   zNo file partr   zNo selected file_r   z(Certificate file uploaded successfully: zFile uploaded successfullyrQ   rs   zFailed to save uploaded file: ry   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apprC   savera   rb   rc   rG   )rm   r   r   unique_filenamerR   rf   s         r    r   z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   "/D) )	E*2.E%%E*N)r   r   r   ns_filesr&   r   parseradd_argumentr   file_upload_modelr   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           
         dt         j                  t         j                  t        t         j                        t         j
                  t         j                  j                         t         j                  j                         t        j                  d      d}t        j                         }|r|d   d   nd}|dk(  rt        j                         }n-t        j                  |      }|r|nt        j                         }t        j                  |||      }d }|D ]N  }|j!                  d      d	k(  s|j!                  d
i       j!                  d      s:|d
   j!                  d      } n dj#                  |      }	|	}
|rc|d   }|d   }|dk(  r|	j%                  d| dd      }
n=|dk(  r|	j%                  d| dd      }
n!|dk(  r|	j%                  dd| d      }
n|
|z  }
t&        j)                  |
dd      }|S )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   rE   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_ >>P\^lmG K::h#33

8R8P8T8TU^8_ *..}=K  	w  , '	2z*((3;;IJ[I\\eGfhij3;;IJ[I\\eGfhij%3;;HQbPcFdfgh  11 !!! " H
 Or"   __main__rZ   r8   r9   )r8   r9   debug)zconfig/config.json)[sysr   r,   dirnameabspath__file__project_rootinsertr_   r   r]   flaskr   r   r   flask_restxr   r   r   r	   werkzeug.utilsr
   basicConfigrX   	getLoggerr   ra   core.plugin_managerr   core.rule_enginer   core.rule_managerr   core.databaser   
flask_corsr   r   r   makedirsrC   r   r!   r}   r   r   r   r   add_namespacemodelStringIntegerRawListr   r   r   r   r   r   r   r   r   rg   system_config
db_managerr   r   load_pluginsrl   r	  r*   keysr7   get_countermeasure	cm_pluginregister_countermeasurer   rM   
load_rulesrouterA   paramr   r   r   r   r   r   r  run)dir_paths   0r    <module>r:     s@   
 	 wwrwwrwwx/HIJsxxHHOOA|$    ' ' 8 8 *   ',,/e f			8	$ . ' ) (  Ho S	 ' MD )+

? 2 D 
#u$6[ 
>~	>
I>
:#1EFW.9   &5  6   ' 6  7   %4  5   (  1 ))$6FMM5nfUFMM5nl[FMM56JT]^FNNE~rRfmmUQ_`6::u2Ri|  J\  ]]  ^v{{6==5F]hu  xI  hJ  K9   99%8
&--K
0v}})=>;   #4
&--K
0fmm(9:fjj^47   99%8
&--K
0fmm(9:fjj^4fmm7	;   ii]V]]~6" 
 		)}v}})=>&  ),		2QFMMEGl  xS  Ul  wm  nV[[e  BL  MT ) % $'99-HFMM&:; 6==-ABK $   IIlv}})=>*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++D)< 2 	""$   u  c2Eh 2E 2Eh  !h$<;( <; % "<;| 	'(x%:x : & ):2 	&'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,   e cjs   &#[#["
