3
@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>   || _ | j | _d| _x"t|j D ]}|| | j|< q$W 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j|jd}dd	| i}| jj|d
d|d}|d dkr| jjdd d| _ d S |d d kr| j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 )r,   r-   r.   r/   )	
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   sZ  |j }|j}|j}d }| jr d S | jjd| d |  |dkrX| jjd| d  d S | jd dkst| jd dkr| jjd	d
 d| _d S || jkr| jjd| d  d S d| j|< |d0kr"d|kr|j	d\}}t
|dk r| jjd n"| j|d}|s:| jjd|  n"| j|d}|s:| jjd|  |r"ytj|}x|D ]}	|}
|	|kr~td|	| j|}
| j|
 x^||	 d D ]N}tjdt||	 d | tj}|rtd|d d | j|
}| j| qW qRW W n: tk
r  } z| jjdt| d
 W Y d d }~X nX |d1krV| j|d}|sR| jjd|  d S x |j	dD ]}t|dk rxq`ytj|}W n> tk
r } z | jjdt| d
 w`W Y d d }~X nX t
tj d | jd!   }| jd! dkr|d" |k r| jjd# q`t }|dkr\|d$ d%kr\|d& |kr\| j j|d' s\|j|d'  |d2kr|d& |kr| j j|d' s|j|d'  x|D ]}|dkr| jd( r| jj|| r| jjd) q| jd* s| j j|dd+r| jjd| d,  q| j| jd- k rtd.|| j|}| j| |  jd/7  _qW q`W d S )3Nz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 Zsubjectsz'.*["'](.+CN=([a-zA-Z0-9\-\*\.])+)["'].*r!   r   z)Invalid response returned from CIRCL.LU: 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rrnamer   z"Host no longer resolves to our IP.r   )includeParentsz" because it is on the same domain.r   r"      )r   r   )r   r   r   )r   r   )	eventTypemoduledatar1   r   debugr   r6   r   splitintr>   r7   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)rP   
__module____qualname____doc__r   optdescsr   r1   r   dictr   r    r#   r>   rl   r   r   r   r   r      s*   !r   )	rN   r2   rR   rX   sflibr   r   r   r   r   r   r   r   <module>   s
   