3
@6^%                 @   sT   d dl Z d dlZd dl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)	IPNetwork)
SpiderFootSpiderFootPluginSpiderFootEventc               @   sn   e Zd ZdZddddZ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d Zdd Zd	S )
sfp_shodanzxSHODAN:Footprint,Investigate,Passive:Search Engines:apikey:Obtain information from SHODAN about identified IP addresses. T   )api_keynetblocklookupmaxnetblockzSHODAN API Key.zvLook up all IPs on netblocks deemed to be owned by your target for possible 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.)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_shodan.pysetup(   s    
zsfp_shodan.setupc             C   s   ddddgS )N
IP_ADDRESSNETBLOCK_OWNERDOMAIN_NAMEWEB_ANALYTICS_IDr   )r   r   r   r   watchedEvents3   s    zsfp_shodan.watchedEventsc             C   s   ddddddddgS )	NOPERATING_SYSTEMDEVICE_TYPETCP_PORT_OPENTCP_PORT_OPEN_BANNERSEARCH_ENGINE_WEB_CONTENTRAW_RIR_DATAGEOINFOVULNERABILITYr   )r   r   r   r   producedEvents7   s    zsfp_shodan.producedEventsc             C   s   | j jd| d | jd  | jd dd}|d d krJ| j jd|  d S ytj|d }W n. tk
r } z| j jd	d
 d S d }~X nX |S )Nz"https://api.shodan.io/shodan/host/z?key=r	   _fetchtimeoutr   )timeout	useragentcontentzNo SHODAN info found for z+Error processing JSON response from SHODAN.F)r   fetchUrlr   infojsonloads	Exceptionerror)r   qryresr,   er   r   r   query=   s    zsfp_shodan.queryc             C   s   | j jd| d | jd  | jd dd}|d d krJ| j jd|  d S ytj|d }W n. tk
r } z| j jd	d
 d S d }~X nX |S )Nz8https://api.shodan.io/shodan/host/search?query=hostname:z&key=r	   r'   r   )r(   r)   r*   zNo SHODAN info found for z+Error processing JSON response from SHODAN.F)r   r+   r   r,   r-   r.   r/   r0   )r   r1   r2   r,   r3   r   r   r   searchHostsM   s    zsfp_shodan.searchHostsc             C   s   d|j djddd d | jd d}| jjd	tjj| | jd
 dd}|d d krl| jjd|  d S yt	j
|d }W n. tk
r } z| jjdd d S d }~X nX |S )Nzhttp.html:"raw_unicode_escapeasciireplace)errors"r	   )r4   keyz)https://api.shodan.io/shodan/host/search?r'   r   )r(   r)   r*   zNo SHODAN info found for z+Error processing JSON response from SHODAN.F)encodedecoder   r   r+   urllibparse	urlencoder,   r-   r.   r/   r0   )r   r1   paramsr2   r,   r3   r   r   r   
searchHtml]   s    zsfp_shodan.searchHtmlc             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 krd S t
dt|| j|}| j| |dkry |jdd }|jdd }W nD tk
r0 }	 z&| jjd| d t|	 d d d S d }	~	X nX |d6krT| jjd| d  d S | j|}
|
d krld S t
dt|
| j|}| j| 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r2x:t|D ]"}|jt| d| jt|< q
W n
|j| xb|D ]X}| j|}
|
d krbqDt
dt|
| j|}| j| | j rd S |
jdd k	rt
d|
jdd | d | j|}| j| |
jd d k	rt
d!|
jd d | d | j|}| j| |
jd"d k	rTd#jd$d% |
jd&|
jd"gD }t
d'|| j|}| j| d(|
krD| jjd)|  x*|
d( D ]}t|jd*}|jd+}|jd,}|jd-}|jd.}|d k	r|d/ | }t
d0|| j|}| j| |d k	r
t
d1|| j|}| j| |d k	r.t
d2|| j|}| j| |d k	rZt
d3|jd4d| j|}| j| |d k	rzx0t|j D ] }t
d5|| j|}| j| qrW qzW qDW d S )7NzReceived event, z, from r	   r   z2You enabled sfp_shodan but did not set an API key!FTz	Skipping z as already mapped.r   r"   r   z: r      z"Unable to parse WEB_ANALYTICS_ID: z ()Google AdSenseGoogle AnalyticsGoogle Site Verificationz, as not supported.r   r
   r   z$Network size bigger than permitted: z > 	NETBLOCK_r#   osr   Zdevtyper   Zcountry_namez, c             S   s   g | ]}|r|qS r   r   ).0_fr   r   r   
<listcomp>   s    z*sfp_shodan.handleEvent.<locals>.<listcomp>cityr$   datazFound SHODAN data for portbannerasnproductvulns:r    r!   ZSOFTWARE_USEDBGP_AS_MEMBERZASr%   )rE   rF   rG   )	eventTypemodulerN   
errorStater   debugr   r0   r   r5   r   str__name__notifyListenerssplitBaseExceptionrB   r   	prefixlenr   
startswithappendr4   checkForStopgetjoinr,   r8   r   )r   event	eventNamesrcModuleName	eventDatahostsevtnetworkZanalytics_idr3   recqrylistipaddraddrlocationrrO   rP   rQ   rR   rS   cpZvulnr   r   r   handleEventr   s    
















$



















zsfp_shodan.handleEvent)r[   
__module____qualname____doc__r   optdescsr   rX   dictr   r   r&   r4   r5   rB   rs   r   r   r   r   r      s    r   )r-   urllib.requestr>   urllib.parseurllib.errornetaddrr   sflibr   r   r   r   r   r   r   r   <module>   s   