U
    @6^X&                     @   s8   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)
SpiderFootSpiderFootPluginSpiderFootEventc                   @   sp   e Zd ZdZddddddZddd	d
ddZdZdZdZe	 fddZ
dd Zdd Ze	 fddZdd ZdS )
sfp_riskiqzRiskIQ:Investigate,Passive:Reputation Systems:apikey:Obtain information from RiskIQ's (formerly PassiveTotal) Passive DNS and Passive SSL databases. TFd   )api_key_loginapi_key_passwordverifycohostsamedomain	maxcohostzRiskIQ login.zRiskIQ API Key.zMVerify co-hosts are valid by checking if they still resolve to the shared IP.z>Treat co-hosted sites on the same target domain as co-hosting?zbStop reporting co-hosted sites after this many are found, as it would likely indicate web hosting.Nr   c                 C   s:   || _ |  | _d| _t| D ]}|| | j|< q"d S )Nr   )sftempStorageresultscohostcountlistkeysopts)selfsfcuserOptsopt r   5/var/www/spiderfoot.crq.systems/modules/sfp_riskiq.pysetup.   s
    
zsfp_riskiq.setupc                 C   s   ddddgS )NINTERNET_NAME
IP_ADDRESSDOMAIN_NAME	EMAILADDRr   r   r   r   r   watchedEvents:   s    zsfp_riskiq.watchedEventsc                 C   s   dddddddgS )Nr   r   AFFILIATE_INTERNET_NAMEr   AFFILIATE_DOMAIN_NAMECO_HOSTED_SITENETBLOCK_OWNERr   r   r   r   r   producedEvents>   s      zsfp_riskiq.producedEventsc              
   C   s  d }d }| j rd S |dkr*d}d| d }|dkrBd}d| d }|dkrZd	}d
| d }| jd }t|tkrz|d}| jd }t|tkr|d}t|dd | }	d|	d dd}
| jj	|dd|
|d}|d dkr| j
dd d| _ d S |d d kr$| jd|  d S z2t|d }d|krT| jd|  W d S W n8 tk
r } z| j
dd W Y d S d }~X Y nX |d S )NPDNSz2https://api.passivetotal.org/v2/dns/search/keywordz{"query": "z"}PSSLz6https://api.passivetotal.org/v2/ssl-certificate/searchz){"field": "subjectCommonName", "query": "WHOISz,https://api.passivetotal.org/v2/whois/searchz{"field": "email", "query": "r   zutf-8r	   :zBasic zapplication/json)AuthorizationzContent-Type   r   )timeout	useragentheaderspostDatacode)400429500403zLRiskIQ access seems to have been rejected or you have exceeded usage limits.FTcontentzNo RiskIQ info found for r   z Invalid JSON returned by RiskIQ.)
errorStater   typestrencodebase64	b64encodedecoder   fetchUrlerrorinfojsonloadsBaseException)r   qryZqtyper   retposturlr   r	   Zcredr.   reser   r   r   queryC   sX    




 

zsfp_riskiq.queryc              
   C   s|  |j }|j}|j}d }| jr d S | jd| d |  |dkrX| jd| d  d S | jd dkst| jd dkr| jd	d
 d| _d S || jkr| jd| d  d S d| j|< |dkr| 	|d}|s| j
d|  |rz|D ]~}|d |krq|  j|d ddrtd|d | j|}| | | j|d | jd rtd|d | j|}| | qW n: tk
r } z| jdt| d
 W 5 d }~X Y nX |dkr|| 	|d}|s| j
d|  d S |D ]}|d|d  s| j|d rd}	nd}	t|	|d | j|}| | |	dkr| j|d | jd rtd|d | j|}
| |
 qd S |dkrx| 	|d }|s| j
d|  d S t }|d!kr|D ]Z}|d" d#r|d" d d$ |d"< |  |d" sd%|d" kr||d"  q|d&kr|D ]T}|d" d#rR|d" d d$ |d"< |d" |kr*d%|d" kr*||d"  q*|D ]}||krq|d!kr| jd' r| j||s| jd( q| jd) s:|  j|dd*r:td|| j|}| | | j|| jd rtd|| j|}| | q| j| jd+ k rtd,|| j|}| | |  jd-7  _qd S ).NzReceived event, z, from r   z	Ignoring z, from self.r   r   r	   z6You enabled sfp_riskiq but did not set an credentials!FTz	Skipping z as already mapped.)r   r'   z%No RiskIQ passive SSL data found for ZsubjectCommonName)includeChildrenr   _internettldsr   z'Invalid response returned from RiskIQ: r   r(   z%No RiskIQ passive DNS data found for @domainr$   r!   r"   )r   r   r   r&   r   Z
focusPoint.*)r   r   r
   z"Host no longer resolves to our IP.r   )includeParentsr   r#      )	eventTypemoduledatar6   r   debugr   r>   r   rI   r?   	getTargetmatchesr   __name__notifyListenersisDomainrB   r8   endswithvalidIPr   append
validateIPr   )r   event	eventNamesrcModuleName	eventDatarD   rG   rH   rtevtZcohostscor   r   r   handleEventz   s    



 

 (

$

"

&


zsfp_riskiq.handleEvent)rY   
__module____qualname____doc__r   optdescsr   r6   r   dictr   r    r%   rI   rh   r   r   r   r   r      s*   
7r   )r@   r:   sflibr   r   r   r   r   r   r   r   <module>   s   