o
    ¥¼h3]  ã                   @   sD  d dl Z d dlZej ej ej e¡¡¡Zee jvr"e 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d e
 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j'e&dd e&e%j(d< h d£Z)dd„ Z*ee%ddddddZ+edddZ,edddZ-edddZ.ed d!dZ/e+j0e,d"d# e+j0e-d"d# e+j0e.d"d# e+j0e/d$d# e+ 1d%ej2d&d'd(d)ej2d&d*d+d)ej2d&d,d-d)ej3d&d.d/d)ej2d&d0d1d)ej4d&d2d3d4d5œd)ej5ej2d&d6d7d8gd)d9œ¡Z6e+ 1d:ej2d;dej2d<dd=œ¡Z7e+ 1d>ej2d;dej2d?dej4d@ddAœ¡Z8e+ 1dBej2d;dej2d?dej4d@dej2dCddDœ¡Z9e+ 1dEdFej2dGdi¡Z:e+ 1dHdIej2d<di¡Z;e+ 1dJej5ej2d&dKdLdMgd)ej5ej4d&dNdOdPœ¡Z<e+ 1dQej2dRdej2dSddTœ¡Z=e+ 1dUej2d<dej2dVddWœ¡Z>d†dYdZ„Z?e?ƒ Z@e"ƒ ZAed[d\„ e@d] d^ D ƒd_d\„ e@d] d` D ƒ ƒZBeB C¡  e e@da db ƒZDee@dc dd ƒZEeBjF G¡ D ]ZHeB IeH¡ZJeJròeE KeHeJ¡ qâeD L¡ ZMeE NeM¡ e, Ode¡G dfd>„ d>eƒƒZPe, Odg¡e, Qdhd;¡G didj„ djeƒƒƒZRe- Odk¡e- Qdhd;¡G dldm„ dmeƒƒƒZSe- Odn¡e- Qdhd;¡G dodp„ dpeƒƒƒZTe. Odq¡e. Qdhd;¡G drds„ dseƒƒƒZUe. Odt¡G dudv„ dveƒƒZVe/ Odw¡G dxdy„ dyeƒƒZWe%jOdedbdzig d{¢d|e%jOd}g d{¢d~dd€„ ƒƒZXedkr e%jYe@d‚ dƒ e@d‚ d„ d&d… dS dS )‡é    N)ÚFlaskÚrequestÚabort)ÚApiÚResourceÚ	NamespaceÚfields)Úsecure_filenameú4%(asctime)s - %(name)s - %(levelname)s - %(message)s)ÚlevelÚformat)ÚPluginManager)Ú
RuleEngine)ÚRuleManager)Úget_db_manager)ÚCORSzuploads/certificatesT)Úexist_okÚUPLOAD_FOLDER>   ÚkeyÚcertÚpemÚcrtc                 C   s    d| v o|   dd¡d  ¡ tv S )u$   æ£€æŸ¥æ–‡ä»¶æ‰©å±•åæ˜¯å¦è¢«å…è®¸Ú.é   )ÚrsplitÚlowerÚALLOWED_EXTENSIONS)Úfilename© r   ú/root/ive/api/server.pyÚallowed_file+   s   ÿr    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=   r@   rA   ÚstatusÚErrorÚerroru   é”™è¯¯ä¿¡æ¯ÚMessager>   ÚConfigureCountermeasuresInputu#   è¦å…³è”åˆ°çŽ¯å¢ƒçš„è§„åˆ™IDåˆ—è¡¨Úinject_fake_flag_on_adminÚrandom_delay_on_loginuH   è¦å…³è”åˆ°çŽ¯å¢ƒçš„å®Œæ•´è§„åˆ™å¯¹è±¡åˆ—è¡¨ (ä¼˜å…ˆçº§é«˜äºŽ rule_ids))r-   r#   )Úrule_idsÚrulesÚCountermeasureDescriptionu   ååˆ¶åŠ¨ä½œåç§°u   ååˆ¶åŠ¨ä½œæè¿°©r5   r#   Ú
FileUploadu   ä¸Šä¼ æ–‡ä»¶çš„å­˜å‚¨è·¯å¾„©r>   Úfilepathúconfig/config.jsonc              
   C   s´   z't | ddd}t |¡}W d  ƒ n1 sw   Y  t d| › ¡ |W S  tyY } z&t d| › d|› ¡ dd	d
œddidgdgdœddddœdœW  Y d}~S d}~ww )u   åŠ è½½ç³»ç»Ÿé…ç½®Úrzutf-8)ÚencodingNz!Loaded system configuration from z)Failed to load system configuration from z: r0   i‘  )r6   r7   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Ú	ExceptionrE   )Úconfig_fileÚfrA   Úer   r   r   Úload_system_config‚   s(   ÿþýù€ýre   c                 C   ó   g | ]	}t j t|¡‘qS r   ©Úosr*   ÚjoinÚproject_root©Ú.0Údir_pathr   r   r   Ú
<listcomp>¢   ó    rn   rZ   rT   c                 C   rf   r   rg   rk   r   r   r   rn   £   ro   rU   rY   r*   r[   rW   ú/c                
   @   s€   e Zd Ze d¡e e¡dd„ ƒƒZe d¡eje	ddej
edde d	d
e¡e dde¡e dde¡dd„ ƒƒƒƒƒƒZdS )r?   Úlist_environmentsc                 C   s   t  ¡ }|S )u   åˆ—å‡ºæ‰€æœ‰çŽ¯å¢ƒ)Úrule_managerrq   )ÚselfÚdb_environmentsr   r   r   Úget¸   s   zEnvironmentList.getÚcreate_environmentT©ÚvalidateéÉ   ©Úcodeé  úInvalid JSONé™  zEnvironment already existséô  z'Driver not available or creation failedc                 C   s¦   t j}|st  dd¡ | dd¡}|dkr|› dnd}t |¡}|s4t d¡}|s4t  dd|› d	¡ | |¡}t |||¡}|sLt  d
d|› d¡ |ddœdfS )u   åˆ›å»ºæ–°çŽ¯å¢ƒr|   r}   r4   r,   Ú	_honeypotÚhttp_honeypotr   zDriver for type 'z' not availabler~   zEnvironment with ID 'z' already existszEnvironment createdr<   ry   )ÚapiÚpayloadr   ru   Úplugin_managerÚ
get_driverrv   rr   )rs   ÚdataÚenv_typeÚdriver_namer@   Úenv_idÚsuccessr   r   r   ÚpostÂ   s   


zEnvironmentList.postN)Ú__name__Ú
__module__Ú__qualname__Úns_envr$   Úmarshal_list_withÚenvironment_list_modelru   ÚexpectÚenvironment_input_modelÚmarshal_withÚenvironment_output_modelÚresponseÚerror_modelr‹   r   r   r   r   r?   ¶   s    z/<string:env_id>r‰   c                   @   sp   e Zd Ze d¡e e¡e dde¡dd„ ƒƒƒZ	e d¡e dd¡e dde¡e d	d
e¡dd„ ƒƒƒƒZ
dS )ÚEnvironmentÚget_environmenté”  úEnvironment not foundc                 C   sN   t  |¡}|st dd¡ |d }t |¡}|r!| |¡|d< |S d|d< |S )u   èŽ·å–çŽ¯å¢ƒè¯¦æƒ…rš   ú!Environment not found in databaser@   rC   Úunknown)rr   r™   r‚   r   r„   r…   Úget_environment_status)rs   r‰   Úenvrˆ   r@   r   r   r   ru   î   s   

þzEnvironment.getÚdelete_environmentéÌ   zEnvironment deletedr   z'Driver not available or deletion failedc                 C   s†   t  |¡}|st dd¡ |d }t |¡}|s$t d|› d|› d¡ d}t|dƒr0| 	|¡}t  	|¡}|r;|r;d	S t d
d¡ dS )u   åˆ é™¤çŽ¯å¢ƒrš   rœ   r@   úDriver z not available for environment z during deletionTr    )Ú r¡   r   zFailed to delete environmentN)
rr   r™   r‚   r   r„   r…   r_   ÚwarningÚhasattrr    )rs   r‰   rŸ   rˆ   r@   Údriver_delete_successÚdb_delete_successr   r   r   Údelete  s   





zEnvironment.deleteN)rŒ   r   rŽ   r   r$   r”   Úenvironment_detail_modelr–   r—   ru   r¨   r   r   r   r   r˜   ë   s    
r˜   z/<string:env_id>/startc                   @   óH   e Zd Ze d¡e dde¡e dde¡e dde¡dd	„ ƒƒƒƒZd
S )ÚEnvironmentStartÚstart_environmentéÈ   úEnvironment startedrš   r›   r   z$Driver not available or start failedc                 C   s~   t  |¡}|st dd¡ |d }t |¡}|s"t dd|› d¡ t|ƒ | |¡}t|ƒ |r7ddid	fS t dd
¡ dS )u   å¯åŠ¨çŽ¯å¢ƒrš   rœ   r@   r   r¢   ú not availabler>   r®   r­   zFailed to start environmentN)rr   r™   r‚   r   r„   r…   Úprintr¬   ©rs   r‰   rŸ   rˆ   r@   rŠ   r   r   r   r‹   .  s   


zEnvironmentStart.postN©	rŒ   r   rŽ   Úns_ctrlr$   r–   Úmessage_modelr—   r‹   r   r   r   r   r«   +  ó    r«   z/<string:env_id>/stopc                   @   rª   )ÚEnvironmentStopÚstop_environmentr­   úEnvironment stoppedrš   r›   r   z#Driver not available or stop failedc                 C   sn   t  |¡}|st dd¡ |d }t |¡}|s"t dd|› d¡ | |¡}|r/ddid	fS t dd
¡ dS )u   åœæ­¢çŽ¯å¢ƒrš   rœ   r@   r   r¢   r¯   r>   r¸   r­   zFailed to stop environmentN)rr   r™   r‚   r   r„   r…   r·   r±   r   r   r   r‹   I  s   


zEnvironmentStop.postNr²   r   r   r   r   r¶   F  rµ   r¶   z /<string:env_id>/countermeasuresc                
   @   sd   e Zd Ze d¡ejedde dde¡e dde	¡e dd	e	¡e d
de	¡dd„ ƒƒƒƒƒƒZ
dS )ÚConfigureCountermeasuresÚconfigure_countermeasuresTrw   ry   zCountermeasures configuredr|   z)Invalid payload or rule validation failedrš   r›   r   z#Failed to configure countermeasuresc                 C   sô   t  |¡}|st dd¡ tj}| dg ¡}| dg ¡}g }|r7t|tƒr.tdd„ |D ƒƒs4t dd¡ |}n*|r`t  	¡ }d	d
„ |D ƒ}|D ]}	|	|v rT| 
||	 ¡ qFt dd|	› d¡ qFn	 t  ||¡}
|
rrdd|› idfS t dd¡ dS )u   ä¸ºçŽ¯å¢ƒé…ç½®ååˆ¶æŽªæ–½rš   rœ   rJ   rK   c                 s   s    | ]}t |tƒV  qd S )N)Ú
isinstanceÚdict)rl   rR   r   r   r   Ú	<genexpr>z  s   € z0ConfigureCountermeasures.post.<locals>.<genexpr>r|   z:Invalid rules format: rules must be a list of rule objectsc                 S   s   i | ]}|  d ¡|“qS )r=   )ru   )rl   Úruler   r   r   Ú
<dictcomp>  s    z1ConfigureCountermeasures.post.<locals>.<dictcomp>z	Rule ID 'z' not found in global rulesr>   z+Countermeasures configured for environment ry   r   z/Failed to configure countermeasures in databaseN)rr   r™   r‚   r   rƒ   ru   r»   ÚlistÚallÚget_all_rulesÚappendÚset_environment_rules)rs   r‰   rŸ   r†   rJ   rK   Úenvironment_rulesÚall_global_rulesÚglobal_rule_dictÚrule_idrŠ   r   r   r   r‹   b  s0   
	ú
zConfigureCountermeasures.postN)rŒ   r   rŽ   Úns_cmr$   r’   Ú%configure_countermeasures_input_modelr–   r´   r—   r‹   r   r   r   r   r¹   _  s    r¹   z/descriptionsc                   @   s(   e Zd Ze d¡e e¡dd„ ƒƒZdS )ÚCountermeasureDescriptionsÚ list_countermeasure_descriptionsc                 C   sˆ   g }t j ¡ D ]:\}}z|ƒ }| ¡ }| ||dœ¡ W q tyA } zt d|› d|› ¡ | |ddœ¡ W Y d}~qd}~ww |S )u'   åˆ—å‡ºæ‰€æœ‰å¯ç”¨ååˆ¶åŠ¨ä½œçš„æè¿°rM   z.Failed to get description for countermeasure 'z': zDescription unavailableN)r„   r(   ÚitemsÚget_descriptionrÃ   ra   r_   rE   )rs   Údescriptionsr5   Úcm_classÚcm_instancer#   rd   r   r   r   ru   œ  s   €þzCountermeasureDescriptions.getN)rŒ   r   rŽ   rÉ   r$   r   Ú countermeasure_description_modelru   r   r   r   r   rË   š  s    rË   z/certificatesc                
   @   sX   e Zd Ze d¡e e ¡ jdddddd¡eje	dde 
d	d
e¡dd„ ƒƒƒƒZdS )ÚCertificateUploadÚupload_certificateÚfiler)   Tu   è¯ä¹¦æ–‡ä»¶)Úlocationr4   r-   Úhelpry   rz   r|   z%No file selected or invalid file typec              
   C   sô   dt jvrt dd¡ t jd }|jdkrt dd¡ |rrt|jƒrrt|jƒ}t ¡ j	› d|› }t
j tjd |¡}z| |¡ t d|› ¡ d	|d
œdfW S  tyq } zt d|› ¡ t dd¡ W Y d}~dS d}~ww t dd¡ dS )u   ä¸Šä¼ SSLè¯ä¹¦æ–‡ä»¶rÕ   r|   zNo file partr£   zNo selected fileÚ_r   z(Certificate file uploaded successfully: zFile uploaded successfullyrO   ry   zFailed to save uploaded file: r   zFailed to save fileNz5Invalid file type. Allowed types: pem, crt, key, cert)r   r)   r‚   r   r   r    r	   ÚuuidÚuuid4Úhexrh   r*   ri   ÚapprA   Úsaver_   r`   ra   rE   )rs   rÕ   r   Úunique_filenamerP   rd   r   r   r   r‹   ¯  s.   




þý€þzCertificateUpload.postN)rŒ   r   rŽ   Úns_filesr$   r’   ÚparserÚadd_argumentr”   Úfile_upload_modelr–   r—   r‹   r   r   r   r   rÓ   ­  s    rÓ   r£   )ÚGETÚPOSTÚPUTÚDELETE)ÚdefaultsÚmethodsz/<path:path>)rè   c              
   C   s^  dt jt jtt jƒt jt j ¡ t j ¡ t j	dddœ}t
 ¡ }|r'|d d nd}|dkr2t
 ¡ }nt
 |¡}|r;|nt
 ¡ }t |||¡}d }|D ]}| d¡d	kre| d
i ¡ d¡re|d
  d¡} nqJd}	|	}
|r¥|d }|d }|dkrƒ|	 d|› dd¡}
n"|dkr’|	 d|› dd¡}
n|dkr¡|	 dd|› d¡}
n|
|7 }
tj|
ddd}|S )Nr,   T)Úas_text)ÚprotocolÚmethodr*   ÚheadersÚipÚargsÚformr†   r   r=   ÚdefaultÚactionÚinject_contentÚresultrŠ   Úinject_infor£   ÚcontentrÖ   Úbefore_body_endz</body>z
</body>r   Úheadz</head>z
</head>Ú
body_startz<body>z<body>
r­   z	text/html)r–   rC   Úmimetype)r   rë   r*   r¼   rì   Úremote_addrrî   Úto_dictrï   Úget_datarr   rq   rÂ   Úget_environment_rulesÚrule_engineÚ$evaluate_and_execute_for_environmentru   ÚreplacerÜ   Úresponse_class)r*   Úrequest_contextrt   Úenvironment_idÚrules_to_userÅ   Úresultsrô   ró   Údefault_html_contentÚresponse_contentÚcontent_to_injectrÖ   r–   r   r   r   Úhoneypot_serviceÛ  sP   
ø

 €ýr	  Ú__main__rX   r6   r7   )r6   r7   Údebug)rQ   )ZÚsysrh   r*   ÚdirnameÚabspathÚ__file__rj   Úinsertr]   rÙ   r[   Úflaskr   r   r   Úflask_restxr   r   r   r   Úwerkzeug.utilsr	   ÚbasicConfigrV   Ú	getLoggerrŒ   r_   Úcore.plugin_managerr   Úcore.rule_enginer   Úcore.rule_managerr   Úcore.databaser   Ú
flask_corsr   rÜ   r   ÚmakedirsrA   r   r    r‚   r   r³   rÉ   rß   Úadd_namespaceÚmodelÚStringÚIntegerÚRawÚListr“   r•   r‘   r©   r—   r´   rÊ   rÒ   râ   re   Úsystem_configÚ
db_managerr„   Úload_pluginsrr   rþ   r(   Úkeysr5   Úget_countermeasureÚ	cm_pluginÚregister_countermeasurerÂ   rK   Ú
load_rulesÚrouter?   Úparamr˜   r«   r¶   r¹   rË   rÓ   r	  Úrunr   r   r   r   Ú<module>   sü    


ýù

þ


ý



üÿÿþ

þ

þ
ÿÿ
€
4
>


9-
J


ýÿ