3
@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>   || _ | j | _d| _x"t|j D ]}|| | j|< q$W 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|jd}| jd }t|tkr|jd}tj|djd | }	d|	jd dd}
| jj	|dd|
|d}|d d!kr| jj
dd d| _ d S |d d kr$| jjd|  d S y0tj|d }d|krR| jjd|  d S W n0 tk
r } z| jj
d d d S d }~X 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.)r0   r1   r2   r3   )
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   sR    





zsfp_riskiq.queryc             C   s  |j }|j}|j}d }| jr d S | jjd| d |  |dkrX| jjd| d  d S | jd dkst| jd dkr| jjd	d
 d| _d S || jkr| jjd| d  d S d| j|< |d*kr| j	|d}|s| jj
d|  |ryx|D ]~}|d |krq| j j|d ddrtd|d | j|}| j| | jj|d | jd rtd|d | j|}| j| qW W n: tk
r } z| jjdt| d
 W Y d d }~X nX |dkr| j	|d}|s| jj
d|  d S x|D ]}|jd|d  s| jj|d rd}	nd}	t|	|d | j|}| j| |	dkr| jj|d | jd rtd|d | j|}
| j|
 qW d S |d+kr| j	|d}|s| jj
d|  d S t }|dkr*xd|D ]\}|d  jd!r|d  d d, |d < | j j|d   rd#|d  kr|j|d   qW |d-krx\|D ]T}|d  jd!rb|d  d d. |d < |d  |kr:d#|d  kr:|j|d   q:W x|D ]}||krq|dkr| jd$ r| jj|| r| jjd% q| jd& sP| j j|dd'rPtd|| j|}| j| | jj|| jd rtd|| j|}| j| q| j| jd( k rtd)|| j|}| j| |  jd"7  _qW d 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   _internettldsz'Invalid response returned from RiskIQ: r   r'   z%No RiskIQ passive DNS data found for @domainr#   r    r!   r   r%   Z
focusPoint.   *r
   z"Host no longer resolves to our IP.r   )includeParentsr   r"   )r   )r   r   r   )r   r   rQ   )	eventTypemoduledatar5   r   debugr   r=   r   rH   r>   	getTargetmatchesr   __name__notifyListenersisDomainrA   r7   endswithvalidIPr   append
validateIPr   )r   event	eventNamesrcModuleName	eventDatarC   rF   rG   rtevtZcohostscor   r   r   handleEventz   s    








(


$


$



(


zsfp_riskiq.handleEvent)rX   
__module____qualname____doc__r   optdescsr   r5   r   dictr   r   r$   rH   rg   r   r   r   r   r      s&   7r   )r?   r9   sflibr   r   r   r   r   r   r   r   <module>   s   