3
@6^                 @   sh   d dl Z d dlmZ d dlZd dlmZ d dlZd dlZd dlZd dl	m
Z
mZmZ G dd deZdS )    N)datetime)	IPNetwork)
SpiderFootSpiderFootPluginSpiderFootEventc               @   sn   e Zd ZdZddddddddZdd	d
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_pulsedivez`Pulsedive:Investigate,Passive:Reputation Systems:apikey:Obtain information from Pulsedive's API.       T   )api_keydelayage_limit_daysnetblocklookupmaxnetblocksubnetlookup	maxsubnetzPulsedive API Key.z#Delay between requests, in seconds.z<Ignore any records older than this many days. 0 = unlimited.zLook up all IPs on netblocks deemed to be owned by your target for possible blacklisted hosts on the same target subdomain/domain?zyIf looking up owned netblocks, the maximum netblock size to look up all IPs within (CIDR value, 24 = /24, 16 = /16, etc.)zKLook up all IPs on subnets which your target is a part of for blacklisting?zsIf looking up subnets, the maximum subnet size to look up all the IPs within (CIDR value, 24 = /24, 16 = /16, etc.)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   8/var/www/spiderfoot.crq.systems/modules/sfp_pulsedive.pysetup4   s    
zsfp_pulsedive.setupc             C   s   dddddgS )N
IP_ADDRESSAFFILIATE_IPADDRINTERNET_NAMENETBLOCK_OWNERNETBLOCK_MEMBERr   )r   r   r   r   watchedEvents?   s    zsfp_pulsedive.watchedEventsc             C   s   dddddgS )NMALICIOUS_INTERNET_NAMEMALICIOUS_IPADDRMALICIOUS_AFFILIATE_IPADDRMALICIOUS_NETBLOCKTCP_PORT_OPENr   )r   r   r   r   producedEventsD   s    zsfp_pulsedive.producedEventsc             C   s   |j djddd| jd d}dtjj| }| jj|dd	d
}tj	| jd  |d dkrv| jj
dd d| _d S |d d krd S ytj|d }W n. tk
r } z| jj
dd d S d }~X nX |S )Nraw_unicode_escapeasciireplace)errorsr   )	indicatorkeyz#https://pulsedive.com/api/info.php?r
   r   )timeout	useragentr   code403z^Pulsedive API key seems to have been rejected or you have exceeded usage limits for the month.FTcontentz.Error processing JSON response from Pulsedive.)encodedecoder   urllibparse	urlencoder   fetchUrltimesleeperror
errorStatejsonloads	Exception)r   qryparamsurlresinfoer   r   r   queryJ   s"    zsfp_pulsedive.queryc             C   s  |j }|j}|j}| jrd S | jjd| d |  | jd dkrZ| jjdd d| _d S || jkr|| jjd| d	  d S d| j|< |d
kr| jd sd S t	|j
| jd k r| jjdtt	|j
 d t| jd   d S |dkr>| jd sd S t	|j
| jd k r>| jjdtt	|j
 d t| jd   d S t }|jdrx:t	|D ]"}|jt| d| jt|< qZW n
|j| x|D ]}| j rd S |dks|jdrd}|dkrd}|dkrd}| j|}	|	d krq|	jd}
|
rH|
jd}|rHx0|D ](}td|d | | j|}| j| qW |	jd}|s\q| jjd x"|D ]}|}t|	jd}|d |jd!d 7 }|d"|jd#d d$ 7 }|r|d%| d& 7 }|jd'd}yftj|d(}ttj|j }ttj d)| jd*   }| jd* d+kr:||k r:| jjd, wpW n0 tk
rl } z| jjd- W Y d d }~X nX t||| j|}| j| qpW qW d S ).NzReceived event, z, from r   r   z5You enabled sfp_pulsedive but did not set an API key!FTz	Skipping z as already mapped.r#   r   r   z$Network size bigger than permitted: z > r$   r   r   	NETBLOCK_r    r'   r!   r(   r"   r&   
attributesportr*   :threatszFound threat info in PulsediveZiidz
 - namez (category)z-
<SFURL>https://pulsedive.com/indicator/?iid=z</SFURL>Zstamp_linkedz%Y-%m-%d %H:%M:%SiQ r   r   z#Record found but too old, skipping.z7Couldn't parse date from Pulsedive so assuming it's OK.)	eventTypemoduledatar@   r   debugr   r?   r   r   	prefixlenstrr   
startswithappendcheckForStoprJ   getr   __name__notifyListenersr   strptimeintr=   mktime	timetupleBaseException)r   event	eventNamesrcModuleName	eventDataqrylistipaddraddrevtTyperecrL   portsprI   rO   resultdescrtidcreated
created_dt
created_tsage_limit_tsr   r   r   handleEventf   s    














zsfp_pulsedive.handleEvent)r]   
__module____qualname____doc__r   optdescsr   r@   dictr   r%   r+   rJ   rv   r   r   r   r   r      s,   r   )rA   r   r=   netaddrr   urllib.requestr9   urllib.parseurllib.errorsflibr   r   r   r   r   r   r   r   <module>   s   