U
    @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:   || _ |  | _d| _t| D ]}|| | j|< q"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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   content	goodregexbadregexrxr    r    r!   contentMaliciousP   s    zsfp_torexits.contentMaliciousc                 C   s   | j d| d |  tt D ]}t| d }||kr$t| d dkr$tt| d }| j 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   queryr   _fetchtimeout
_useragenttimeout	useragentr4   Unable to fetch Fr5   r6   )r   r3   r   	malchecksr   strfetchUrlformatr   errorr8   )r   r   target
targetTypecheckcidr   resr    r    r!   resourceQueryd   s    $


zsfp_torexits.resourceQueryc                 C   s  d}|dkr | j || jd }tt D ]t}t| d }||kr,t| d dkr,t }t| d }| j d| | jd	d
|d< |d d kr| j j	|| jd | jd d}|d d kr| j 
d| d  d S | j d| |d  |dkrNt }	dt| krt| d dd}
t|
tj}| j d| d |
  |d dD ].}t||}t|d
krR|	|d
  qRn|d d}	|	D ]}t|dk s|drq| }z@t|t|kr| j |d | d |  |W     S W nB tk
rB } 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rj||krj| j |d | d | d  |    S qjq,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_r   r   r4   r:   r;   r<   r?   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getrB   rD   cachePutreplacer/   compiler1   r3   splitfindallr.   append
startswithstripr   r   	ExceptionrA   rC   r0   BaseException)r   r   rE   rF   	targetDomrG   rH   datar   iplistr7   patlinegrpr	   erxDomrxTgtr    r    r!   resourceListv   s     
   zsfp_torexits.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   r9   r   )r   r@   r   r   r3   rJ   rj   )r   
resourceIditemTyperE   rG   rH   r    r    r!   
lookupItem   s    zsfp_torexits.lookupItemc                 C   s  |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 |dkr| jddsd S |dkr| jddsd S tt	
 D ]}t	| d }| j| r|dkrd}|dkrd}nd}|dkrd}d}|dkrRd}|dkr6d}|dkrDd}|dkrRd}|dkrdd}d }|dkrvd}d!}| |||}	|  r 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%   r	   r#   r)   r*   )BGP_AS_OWNERBGP_AS_MEMBERasnMALICIOUS_ASN)INTERNET_NAMErn   AFFILIATE_INTERNET_NAMErL   rt   MALICIOUS_INTERNET_NAMEru   !MALICIOUS_AFFILIATE_INTERNET_NAMEMALICIOUS_COHOSTr
   r,   r+   z [z]
z<SFURL>z</SFURL>)	eventTypemodulerb   r   r3   r   r   rV   r   r@   r   rm   checkForStopr   __name__notifyListeners)r   event	eventNamesrcModuleName	eventDatarG   rH   typeIdevtTyper   textevtr    r    r!   handleEvent   sf    












zsfp_torexits.handleEvent)r|   
__module____qualname____doc__r   optdescsr   rT   r"   r(   r-   r8   rJ   rj   rm   r   r    r    r    r!   r      s*   

Mr   )
netaddrr   r   r/   sflibr   r   r   r@   r   r    r    r    r!   <module>   s   