U
    @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   s4   || _ |  | _t| D ]}|| | j|< q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 d|  d S zt|d }W n6 tk
r } z| j d	d
 W Y d S d }~X Y nX |S )Nz"https://api.shodan.io/shodan/host/z?key=r	   _fetchtimeoutr   timeout	useragentcontentNo SHODAN info found for +Error processing JSON response from SHODAN.Fr   fetchUrlr   infojsonloads	Exceptionerrorr   qryresr1   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 d|  d S zt|d }W n6 tk
r } z| j d	d
 W Y d S d }~X Y nX |S )Nz8https://api.shodan.io/shodan/host/search?query=hostname:z&key=r	   r(   r   r)   r,   r-   r.   Fr/   r6   r   r   r   searchHostsM   s"     zsfp_shodan.searchHostsc              
   C   s   d| djddd d | jd d}| jjd	tj| | jd
 dd}|d d krl| jd|  d S zt	
|d }W n6 tk
r } z| jdd W Y d S d }~X Y nX |S )Nzhttp.html:"raw_unicode_escapeasciireplace)errors"r	   )r:   keyz)https://api.shodan.io/shodan/host/search?r(   r   r)   r,   r-   r.   F)encodedecoder   r   r0   urllibparse	urlencoder1   r2   r3   r4   r5   )r   r7   paramsr8   r1   r9   r   r   r   
searchHtml]   s      zsfp_shodan.searchHtmlc              
   C   s  |j }|j}|j}| jrd S | jd| d |  | jd dkrZ| jdd d| _d S || jkr|| jd| d	  d S d| j|< |d
kr| 	|}|d krd S t
dt|| j|}| | |dkrz |dd }|dd }W nL tk
r8 }	 z,| jd| d t|	 d d W Y d S d }	~	X Y nX |dkr\| jd| d  d S | |}
|
d krtd S t
dt|
| j|}| | d S |dkr| jd sd S t|j| jd k r| jdtt|j d t| jd   d S t }|dr6t|D ]"}|t| d| jt|< qn
|| |D ]P}| |}
|
d krbqDt
dt|
| j|}| | |  r d S |
dd k	rt
d|
dd | d | j|}| | |
dd k	rt
d|
dd | d | j|}| | |
d d k	rVd!d"d# |
d$|
d fD }t
d%|| j|}| | d&|
krD| jd'|  |
d& D ]}t|d(}|d)}|d*}|d+}|d,}|d k	r|d- | }t
d.|| j|}| | |d k	rt
d/|| j|}| | |d k	r,t
d0|| j|}| | |d k	rXt
d1|d2d| j|}| | |d k	rxt| D ] }t
d3|| j|}| | qnqxqDd S )4Nz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 ())zGoogle AdSensezGoogle Analyticsz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&   )	eventTypemodulerQ   
errorStater   debugr   r5   r   r;   r   str__name__notifyListenerssplitBaseExceptionrH   r   	prefixlenr   
startswithappendr:   checkForStopgetjoinr1   r>   r   )r   event	eventNamesrcModuleName	eventDatahostsevtnetworkZanalytics_idr9   recqrylistipaddraddrlocationrrR   rS   rT   rU   rV   cpZvulnr   r   r   handleEventr   s   















 
 
$






 

 

 

 

 zsfp_shodan.handleEvent)r^   
__module____qualname____doc__r   optdescsr   r[   dictr   r   r'   r:   r;   rH   rv   r   r   r   r   r      s$   r   )r2   urllib.requestrD   urllib.parseurllib.errornetaddrr   sflibr   r   r   r   r   r   r   r   <module>   s   