3
@6^                 @   sX   d dl Z d dlZd dlmZ d dlZd dlmZ d dlmZmZm	Z	 G dd deZ
dS )    N)datetime)	IPNetwork)
SpiderFootSpiderFootPluginSpiderFootEventc               @   sb   e Zd ZdZdddddZdddd	dZd
ZdZe fddZ	dd Z
dd Zdd Zdd Zd
S )
sfp_censyszRCensys:Investigate,Passive:Search Engines:apikey:Obtain information from Censys.io    Z   )censys_api_key_uidcensys_api_key_secretdelayage_limit_dayszCensys.io API UID.zCensys.io API Secret.z#Delay between requests, in seconds.z<Ignore any records older than this many days. 0 = unlimited.NFc             C   s8   || _ | j | _x"t|j D ]}|| | j|< qW d S )N)sftempStorageresultslistkeysopts)selfsfcuserOptsopt r   5/var/www/spiderfoot.crq.systems/modules/sfp_censys.pysetup,   s    
zsfp_censys.setupc             C   s
   dddgS )N
IP_ADDRESSINTERNET_NAMENETBLOCK_OWNERr   )r   r   r   r   watchedEvents6   s    zsfp_censys.watchedEventsc             C   s   dddddddgS )NBGP_AS_MEMBERTCP_PORT_OPENOPERATING_SYSTEMWEBSERVER_HTTPHEADERSNETBLOCK_MEMBERGEOINFORAW_RIR_DATAr   )r   r   r   r   producedEvents:   s    zsfp_censys.producedEventsc       	      C   s  |dkrd}|dkrd}| j d d | j d  }tj|jd}d	d
| i}| jjd|j|jddd | j d d|d}tj| j d  |d dkr| jj	dd d| _
d S |d d kr| jjd|  d S ytj|d }W n0 tk
r } z| jj	dd d S d }~X nX |S )Nipzipv4/{0}hostzwebsites/{0}r   :r   zutf-8AuthorizationzBasic %szhttps://censys.io/api/v1/view/replace)errors_fetchtimeoutr   )timeout	useragentheadersr   code400429500403z^Censys.io API key seems to have been rejected or you have exceeded usage limits for the month.FTcontentzNo Censys.io info found for z.Error processing JSON response from Censys.io.)r3   r4   r5   r6   )r   base64	b64encodeencoder   fetchUrlformattimesleeperror
errorStateinfojsonloads	Exception)	r   qry	querytypesecretb64_valr1   resrA   er   r   r   queryA   s2    zsfp_censys.queryc             C   s  |j }|j}|j}| jrd S | jjd| d |  | jd dksP| jd dkrh| jjdd d| _d S || jkr| jjd	| d
  d S d| j|< t	 }|j
drx8t|D ] }|jt| d| jt|< qW n
|j| x|D ]}| j rd S |d9krd}nd}| j||}	|	d kr$qd|	krf|	d dkrN| jjd|  q| jjd|	d  d q| jjd tdt|	| j|}
| j|
 ytj|	jddd}ttj|j }ttj d| jd   }| jd dkr||k r| jjd wd|	krjdjd d! |	d jd"|	d jd#|	d jd$|	d jd%gD }|rjtd&|| j|}
| j|
 d'|	krtj|	d' dd(}td)|| j|}
| j|
 d*|	krt|	d* d+ }td,|| j|}
| j|
 |	d* d- }td.|| j|}
| j|
 d/|	krZxT|	d/ D ]H}d|	kr q|	d d0 |jd1d  }td2|| j|}
| j|
 qW d3|	krd4|	d3 kr|	d3 d4 }td5|| j|}
| j|
 W q tk
r }
 z(| jjd6| d7 t|
 d8 d W Y d d }
~
X qX qW d S ):NzReceived event, z, from r   r   r   z9You enabled sfp_censys but did not set an API uid/secret!FTz	Skipping z as already mapped.	NETBLOCK_r   NETLBLOCK_OWNERr(   r)   r?   Z
error_typeunknownzCensys returned no data for z%Censys returned an unexpected error: zFound results in Censys.ior&   Z
updated_atz1970-01-01T00:00:00+00:00z%Y-%m-%dT%H:%M:%S+00:00iQ r   r   z#Record found but too old, skipping.locationz, c             S   s   g | ]}|r|qS r   r   ).0_fr   r   r   
<listcomp>   s    z*sfp_censys.handleEvent.<locals>.<listcomp>cityZprovincepostal_codecountryr%   r1   )ensure_asciir#   Zautonomous_systemasnr    Zrouted_prefixr$   	protocolsr*   /r!   metadataZos_descriptionr"   z(Error encountered processing record for z ())r   rM   )	eventTypemoduledatar@   r   debugr   r?   r   r   
startswithr   appendstrcheckForStoprK   r   __name__notifyListenersr   strptimegetintr=   mktime	timetuplejoinrB   dumpssplitBaseException)r   event	eventNamesrcModuleName	eventDataqrylistipaddraddrqtyperecrJ   
created_dt
created_tsage_limit_tsrO   datpr   r   r   handleEventh   s    








D








zsfp_censys.handleEvent)rd   
__module____qualname____doc__r   optdescsr   r@   dictr   r   r'   rK   r}   r   r   r   r   r      s    
'r   )rB   r8   r   r=   netaddrr   sflibr   r   r   r   r   r   r   r   <module>   s   