U
    @6^)                     @   sZ   d dl mZmZ d dlZd dlmZmZmZ ddddgdd	gg d
iZG dd deZ	dS )    )	IPAddress	IPNetworkN)
SpiderFootSpiderFootPluginSpiderFootEventzInternet Storm Center_iscqueryipzhttps://isc.sans.edu/api/ip/{0}z.*<attacks>\d+</attacks>.*)idtypechecksurlbadregex	goodregexc                   @   sl   e Zd ZdZdddZddi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d ZdS )sfp_isczpInternet Storm Center:Investigate,Passive:Reputation Systems::Check if an IP is malicious according to SANS ISC.T)r   checkaffiliatesr   zApply checks to affiliates?Nc                 C   s4   || _ |  | _t| D ]}|| | j|< qd S )N)sftempStorageresultslistkeysopts)selfsfcuserOptsopt r   2/var/www/spiderfoot.crq.systems/modules/sfp_isc.pysetup2   s    
zsfp_isc.setupc                 C   s   ddgS )N
IP_ADDRESSAFFILIATE_IPADDRr   r   r   r   r   watchedEvents>   s    zsfp_isc.watchedEventsc                 C   s   ddgS )NMALICIOUS_IPADDRMALICIOUS_AFFILIATE_IPADDRr   r!   r   r   r   producedEventsD   s    zsfp_isc.producedEventsc                 C   s   t |dkrB|D ]0}t||tjtjB r| jd|   dS qt |dkr|D ]0}t||tjtjB rR| jd|   dS qR| jd d S )Nr   z#Found to be bad against bad regex: Tz$Found to be good againt good regex: FzNeither good nor bad, unknown.)lenrematch
IGNORECASEDOTALLr   debug)r   contentr   r   rxr   r   r   contentMaliciousH   s    zsfp_isc.contentMaliciousc                 C   s   | j d| d |  tt D ]}t| d }||kr$t| d dkr$tt| d }| j j||d| jd d	}|d
 d kr| j 	d|| d  d S | 
|d
 t| d t| d r$||  S q$d S )Nz	Querying z for maliciousness of r
   r   r   r      
_useragenttimeout	useragentr,   Unable to fetch Fr   r   )r   r+   r   	malchecksr   strfetchUrlformatr   errorr.   )r   r
   target
targetTypecheckcidr   resr   r   r   resourceQuery\   s    


zsfp_isc.resourceQueryc                 C   s  d}|dkr | j || jd }tt D ]n}t| d }||kr,t| d dkr,t }t| d }| j d| | jd	d
|d< |d d kr| j j	|d| jd d}|d d kr| j 
d| d  d S | j d| |d  |dkrHt }	dt| kr~t| d dd}
t|
tj}| j d| d |
  |d dD ].}t||}t|d
krL|	|d
  qLn|d d}	|	D ]}t|dk s|drq| }z@t|t|kr| j |d | d |  |W     S W nB tk
r< } z"| j dt|  W Y qW 5 d }~X Y nX q d S dt| kr|d dD ]P}||ks|dkrd||krd| j |d | d | d  |    S qdq,ztt| d |}tt| d |}|d dD ]b}|dkrt||tjs&t||tjr| j |d | d | d  |  W   S qW q, tk
r } z | j d t|  W Y q,W 5 d }~X Y q,X q,d S )!N domain_internettldsr
   r   r   r   sfmal_cacheperiodr   r,   r/   r0   r1   r4   Fnetblockregexz{0}z(\d+\.\d+\.\d+\.\d+)zNew regex for z: 
   #z found within netblock/subnet z in zError encountered parsing: /z
 found in z list.zError encountered parsing 2: )r   
hostDomainr   r   r5   r   dictcacheGetgetr7   r9   cachePutreplacer'   compiler)   r+   splitfindallr&   append
startswithstripr   r   	Exceptionr6   r8   r(   BaseException)r   r
   r:   r;   	targetDomr<   r=   datar   iplistr-   patlinegrpr	   erxDomrxTgtr   r   r   resourceListn   s     
   zsfp_isc.resourceListc                 C   s   t t D ]}t| d }||kr|t| d kr| jd| d | d |  t| d dkrv| |||  S t| d dkr| |||  S qd S )	Nr
   r   zChecking maliciousness of z (z) with: r   r   r   )r   r5   r   r   r+   r?   rb   )r   
resourceIditemTyper:   r<   r=   r   r   r   
lookupItem   s    zsfp_isc.lookupItemc                 C   sv  |j }|j}|j}| jd| d |  || jkrL| jd| d  d S d| j|< |dkrp| jddspd S |d	kr| jd
dsd S tt	
 D ]}t	| d }| j| r|dkrd}|dkrd}nd}|dkrd}d}|dkrd}|dkrd}|dkrd}|dkrd}| |||}	|  r2 d S |	d k	r|d | d d |	 d }
t||
| j|}| | qd S )NzReceived event, z, from z	Skipping z, already checked.TCO_HOSTED_SITEcheckcohostsFr    r   r
   )r   r    r	   r   r#   r$   )BGP_AS_OWNERBGP_AS_MEMBERasnMALICIOUS_ASN)INTERNET_NAMErf   AFFILIATE_INTERNET_NAMErA   rl   MALICIOUS_INTERNET_NAMErm   !MALICIOUS_AFFILIATE_INTERNET_NAMEMALICIOUS_COHOSTz [z]
z<SFURL>z</SFURL>)	eventTypemodulerZ   r   r+   r   r   rN   r   r5   r   re   checkForStopr   __name__notifyListeners)r   event	eventNamesrcModuleName	eventDatar<   r=   typeIdevtTyper   textevtr   r   r   handleEvent   sR    






zsfp_isc.handleEvent)rt   
__module____qualname____doc__r   optdescsr   rL   r   r"   r%   r.   r?   rb   re   r~   r   r   r   r   r      s     Mr   )
netaddrr   r   r'   sflibr   r   r   r5   r   r   r   r   r   <module>   s   