3
@6^-                 @   sX   d dl mZmZ d dlZd dlmZmZmZ dddddgd	d
diZG dd deZ	dS )    )	IPAddress	IPNetworkN)
SpiderFootSpiderFootPluginSpiderFootEventzTOR Exist List	_torexitslistipnetblockz+https://check.torproject.org/exit-addressesz^ExitAddress\s+{0}\s+)idtypechecksurlregexc               @   sx   e Zd ZdZddddddZdddd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d Zd
S )sfp_torexitszTOR Exit Nodes:Investigate,Passive:Secondary Networks::Check if an IP or netblock appears on the torproject.org exit node list.T   )r   checkaffiliatescacheperiodchecknetblockschecksubnetszApply checks to affiliates?z,Hours to cache list data before re-fetching.z=Report if any malicious IPs are found within owned netblocks?zJCheck if any malicious IPs are found within the same subnet of the target?)r   r   r   r   Nc             C   s>   || _ | j | _d| _x"t|j D ]}|| | j|< q$W d S )Nztorproject.org)sftempStorageresults__dataSource__r   keysopts)selfsfcuserOptsopt r    7/var/www/spiderfoot.crq.systems/modules/sfp_torexits.pysetup7   s
    
zsfp_torexits.setupc             C   s   ddddgS )N
IP_ADDRESSNETBLOCK_MEMBERAFFILIATE_IPADDRNETBLOCK_OWNERr    )r   r    r    r!   watchedEventsD   s    zsfp_torexits.watchedEventsc             C   s   ddddgS )NMALICIOUS_IPADDRMALICIOUS_AFFILIATE_IPADDRMALICIOUS_SUBNETMALICIOUS_NETBLOCKr    )r   r    r    r!   producedEventsK   s    zsfp_torexits.producedEventsc             C   s   t |dkrDx6|D ].}tj||tjtjB r| jjd|  dS qW t |dkrx6|D ].}tj||tjtjB rV| jjd|  dS qVW | j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   content	goodregexbadregexrxr    r    r!   contentMaliciousP   s    

zsfp_torexits.contentMaliciousc             C   s   | j jd| d |  xttj D ]}t| d }||kr&t| d dkr&tt| d }| j j|j|| jd | jd d	}|d
 d kr| j j	d|j| d d S | j
|d
 t| d t| d r&|j|S q&W d S )Nz	Querying z for maliciousness of r   r   queryr   _fetchtimeout
_useragent)timeout	useragentr3   zUnable to fetch Fr4   r5   )r   r2   r   	malchecksr   strfetchUrlformatr   errorr7   )r   r   target
targetTypecheckcidr   resr    r    r!   resourceQueryd   s    $

zsfp_torexits.resourceQueryc             C   s  d}|dkr | j j|| jd }xjttj D ]X}t| d }||koXt| d dkr0t }t| d }| j jd| | jjd	d
|d< |d d kr| j j	|| jd | jd d}|d d kr| j j
d| d d S | j jd| |d  |dkrFt }	dt| krt| d jdd}
tj|
tj}| j jd| d |
  xP|d jdD ].}tj||}t|d
krV|	j|d
  qVW n|d jd}	x|	D ]}t|dk s|jdrq|j }y6t|t|kr| j j|d | d |  |S W n< tk
r: } z| j jdt|  wW Y d d }~X nX qW d S dt| krxZ|d jdD ]H}||ks|dkrd||krd| j j|d | d | d  |S qdW q0ytt| d j|}tt| d j|}xj|d jdD ]X}|dkrtj||tjs"tj||tjr| j j|d | d | d  |S qW W q0 tk
r } z| j jd t|  w0W Y d d }~X q0X q0W d S )!N domain_internettldsr   r   r   r   sfmal_r   r   r3   r9   r:   )r;   r<   zUnable to fetch Fr
   r   z{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   r=   r   dictcacheGetgetr?   rA   cachePutreplacer.   compiler0   r2   splitfindallr-   append
startswithstripr   r   	Exceptionr>   r@   r/   BaseException)r   r   rB   rC   	targetDomrD   rE   datar   iplistr6   patlinegrpr	   erxDomrxTgtr    r    r!   resourceListv   sr     

  zsfp_torexits.resourceListc             C   s   xt tj D ]}t| d }||kr|t| d kr| jjd| d | d |  t| d dkrt| j|||S t| d dkr| j|||S qW d S )	Nr   r   zChecking maliciousness of z (z) with: r   r8   r   )r   r=   r   r   r2   rG   rg   )r   
resourceIditemTyperB   rD   rE   r    r    r!   
lookupItem   s    zsfp_torexits.lookupItemc             C   s  |j }|j}|j}| jjd| d |  || jkrL| jjd| d  d S d| j|< |dkrr| jjdd rrd S |d	kr| jjd
d rd S |dkr| jjdd rd S |dkr| jjdd rd S xtt	j
 D ]}t	| d }| j| r|d%krd}|dkrd}nd}|d&kr&d}d}|d'kr^d}|dkrBd}|dkrPd}|dkr^d}|dkrpd}d}|dkrd}d }| j|||}	| j rd S |	d k	r|d! | d" d# |	 d$ }
t||
| j|}| j| qW d S )(NzReceived event, z, from z	Skipping z, already checked.TCO_HOSTED_SITEcheckcohostsFr%   r   r&   r   r$   r   r   r#   r	   r(   r)   BGP_AS_OWNERBGP_AS_MEMBERasnMALICIOUS_ASNINTERNET_NAMEAFFILIATE_INTERNET_NAMErI   MALICIOUS_INTERNET_NAME!MALICIOUS_AFFILIATE_INTERNET_NAMEMALICIOUS_COHOSTr
   r+   r*   z [z]
z<SFURL>z</SFURL>)r#   r%   )rm   rn   )rq   rk   rr   )	eventTypemoduler_   r   r2   r   r   rS   r   r=   r   rj   checkForStopr   __name__notifyListeners)r   event	eventNamesrcModuleName	eventDatarD   rE   typeIdevtTyper   textevtr    r    r!   handleEvent   sf    











zsfp_torexits.handleEvent)ry   
__module____qualname____doc__r   optdescsr   rQ   r"   r'   r,   r7   rG   rg   rj   r   r    r    r    r!   r      s&   Mr   )
netaddrr   r   r.   sflibr   r   r   r=   r   r    r    r    r!   <module>   s   
