U
    @6^ "                     @   sH   d dl Z d dlZd dlZd dlZd dlmZmZmZ G dd deZdS )    N)
SpiderFootSpiderFootPluginSpiderFootEventc                   @   sn   e Zd ZdZdddddddZdd	d
ddddZdZdZdZe	 fddZ
dd Zdd Zdd Zdd ZdS )sfp_circlluzCIRCL.LU:Investigate,Passive:Reputation Systems:apikey:Obtain information from CIRCL.LU's Passive DNS and Passive SSL databases. r   TFd   )api_key_loginapi_key_passwordage_limit_daysverifycohostsamedomain	maxcohostzCIRCL.LU login.zCIRCL.LU password.zHIgnore any Passive DNS records older than this many days. 0 = unlimited.zMVerify co-hosts are valid by checking if they still resolve to the shared IP.z>Treat co-hosted sites on the same target domain as co-hosting?zbStop reporting co-hosted sites after this many are found, as it would likely indicate web hosting.Nc                 C   s:   || _ |  | _d| _t| D ]}|| | j|< q"d S )Nr   )sftempStorageresultscohostcountlistkeysopts)selfsfcuserOptsopt r   6/var/www/spiderfoot.crq.systems/modules/sfp_circllu.pysetup2   s
    
zsfp_circllu.setupc                 C   s   ddddgS )NINTERNET_NAMENETBLOCK_OWNER
IP_ADDRESSDOMAIN_NAMEr   r   r   r   r   watchedEvents>   s    zsfp_circllu.watchedEventsc                 C   s
   dddgS )Nr   SSL_CERTIFICATE_ISSUEDCO_HOSTED_SITEr   r    r   r   r   producedEventsB   s    zsfp_circllu.producedEventsc           	      C   s   d }| j rd S |dkr d| }nd| }| jd d | jd  }t|d}dd	| i}| jj|d
d|d}|d dkr| jdd d| _ d S |d d kr| jd|  d S |d S )NPDNSz https://www.circl.lu/pdns/query/z"https://www.circl.lu/v2pssl/query/r   :r	   zutf-8AuthorizationzBasic %s   r   )timeout	useragentheaderscode)400429500403zNCIRCL.LU access seems to have been rejected or you have exceeded usage limits.FTcontentzNo CIRCL.LU info found for )	
errorStater   base64	b64encodeencoder   fetchUrlerrorinfo)	r   qryqtypereturlsecretZb64_valr+   resr   r   r   queryE   s.    
 
 zsfp_circllu.queryc                 C   sL  |j }|j}|j}d }| jr d S | jd| d |  |dkrX| jd| d  d S | jd dkst| jd dkr| jd	d
 d| _d S || jkr| jd| d  d S d| j|< |dkrd|kr|	d\}}t
|dk r| jd n"| |d}|s:| jd|  n"| |d}|s:| jd|  |rzt|}|D ]}	|}
|	|kr|td|	| j|}
| |
 ||	 d D ]N}tdt||	 d | tj}|rtd|d d | j|
}| | qqPW n: tk
r } z| jdt| d
 W 5 d }~X Y nX |dkrH| |d}|sJ| jd|  d S |	dD ]}t|dk rlqTzt|}W nD tk
r } z$| jdt| d
 W Y qTW 5 d }~X Y nX t
t d| jd    }| jd  dkr|d! |k r| jd" qTt }|dkrV|d# d$krV|d% |krV|  |d& sV||d&  |d'kr|d% |kr|  |d& s||d&  |D ]}|dkr| jd( r| j||s| jd) q| jd* s|  j|dd+r| jd| d,  q| j| jd- k rtd.|| j|}| | |  jd/7  _qqTd S )0NzReceived event, z, from r   z	Ignoring z, from self.r   r   r	   z7You enabled sfp_circllu but did not set an credentials!FTz	Skipping z as already mapped.)r   r   /   z/Network size bigger than permitted by CIRCL.LU.PSSLz'No CIRCL.LU passive SSL data found for r   Zsubjectsz'.*["'](.+CN=([a-zA-Z0-9\-\*\.])+)["'].*r"   r   z)Invalid response returned from CIRCL.LU: )r   r   r   r%   z'No CIRCL.LU passive DNS data found for 
   iQ r
   Z	time_lastz#Record found but too old, skipping.ZrrtypeArdataZrrname)r   r   r   z"Host no longer resolves to our IP.r   )includeParentsz" because it is on the same domain.r   r#      )	eventTypemoduledatar2   r   debugr   r7   r   splitintr?   r8   jsonloadsr   __name__notifyListenersrefindallstr
IGNORECASEBaseExceptionlentimer   	getTargetmatchesappend
validateIPr   )r   event	eventNamesrcModuleName	eventDatar;   addrmaskjipZipeZcrtrelinerecage_limit_tscohostscor   r   r   handleEventf   s    






 (


&
zsfp_circllu.handleEvent)rQ   
__module____qualname____doc__r   optdescsr   r2   r   dictr   r!   r$   r?   rm   r   r   r   r   r      s.   !r   )	rO   r3   rS   rY   sflibr   r   r   r   r   r   r   r   <module>   s
   