U
    @†6^O   ã                   @   s@   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                   @   s€   e Zd ZdZd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d„ Zdd„ ZdS )Úsfp_dnsbrutez|DNS Brute-force:Footprint,Investigate:DNS::Attempts to identify hostnames through brute-forcing common names and iterations.TFéd   )ÚskipcommonwildcardÚ
domainonlyÚcommonsÚtop10000ÚnumbersuffixÚnumbersuffixlimitÚ_maxthreadsz8If wildcard DNS is detected, don't bother brute-forcing.zgOnly attempt to brute-force names on domain names, not hostnames (some hostnames are also sub-domains).z5Try a list of about 750 common hostnames/sub-domains.zRTry a further 10,000 common hostnames/sub-domains. Will make the scan much slower.zSFor any host found, try appending 1, 01, 001, -1, -01, -001, 2, 02, etc. (up to 10)zŒLimit using the number suffixes for hosts that have already been resolved? If disabled this will significantly extend the duration of scans.)r   r   r	   r
   r   r   Nc           	      C   sÞ   || _ |  ¡ | _|  ¡ | _d| _t ¡ | _t| 	¡ ƒD ]}|| | j
|< q6tƒ }| j
d r’t| j  ¡ d dƒ}| ¡ }|D ]}| ¡ }d| j|< qztƒ }| j
d rÚt| j  ¡ d dƒ}| ¡ }|D ]}| ¡ }d| j|< qÂd S )NÚDNSr	   z/dicts/subdomains.txtÚrTr
   z/dicts/subdomains-10000.txt)ÚsfÚtempStorageÚsublistÚeventsÚ__dataSource__Ú	threadingÚLockÚlockÚlistÚkeysÚoptsÚopenÚmyPathÚ	readlinesÚstrip)	ÚselfÚsfcÚuserOptsÚoptZcslinesÚcsÚsZttlinesÚtt© r&   ú7/var/www/spiderfoot.crq.systems/modules/sfp_dnsbrute.pyÚsetup0   s*    




zsfp_dnsbrute.setupc                 C   s(   dg}| j d r| j d r$| d¡ |S )NÚDOMAIN_NAMEr   r   ÚINTERNET_NAME)r   Úappend)r   Úretr&   r&   r'   ÚwatchedEventsK   s    
zsfp_dnsbrute.watchedEventsc                 C   s   dgS )Nr*   r&   )r   r&   r&   r'   ÚproducedEventsT   s    zsfp_dnsbrute.producedEventsc                 C   st   z0| j  |¡}|r.| j d| j|< W 5 Q R X W n> tk
rn } z | j d| j|< W 5 Q R X W 5 d }~X Y nX d S )NTF)r   ÚresolveHostr   ÚhostResultsÚBaseException)r   ÚnameÚaddrsÚer&   r&   r'   ÚtryHostW   s    zsfp_dnsbrute.tryHostc                 C   sØ   t ƒ | _d}d}g }| j dt|ƒ ¡ |D ]F}dtt dd¡ƒ }| tj	|| j
|fd¡ ||  ¡  |d7 }q,|r®d}t ¡ D ]}	|	j d¡r„d}q„|s¢d}t d	¡ qt| jD ]}
| j |
d¡r´|  ||
¡ q´d S )
NTr   z!Spawning threads to check hosts: Zthread_sfp_dnsbrute_iÿÉš;)r2   ÚtargetÚargsé   Fgš™™™™™©?)Údictr0   r   ÚinfoÚstrÚrandomÚrandintr+   r   ÚThreadr5   ÚstartÚ	enumerater2   Ú
startswithÚtimeÚsleepÚgetÚ	sendEvent)r   ZhostListÚsourceEventÚrunningÚiÚtr2   ÚtnÚfoundÚrtÚresr&   r&   r'   ÚtryHostWrappera   s*    

zsfp_dnsbrute.tryHostWrapperc                 C   s.   | j  d| ¡ td|| j|ƒ}|  |¡ d S )NzFound a brute-forced host: r*   )r   r:   r   Ú__name__ÚnotifyListeners)r   ÚsourceÚresultÚevtr&   r&   r'   rE   €   s    zsfp_dnsbrute.sendEventc                 C   s¢  |j }|j}|j}| j |¡}|}| j d| d | ¡ |dkrFd S || jkrTd S d| j|< |dkr˜|  ¡ j|dds˜| j	d sŠd S |  
¡ r–d S | d	d
¡\}}| j |¡}	| j	d rØ|	rØ| j d| d ¡ d S d	| }tƒ }
tdƒD ]}d|
|t|ƒ | < d|
|d t|ƒ | < d|
|d t|ƒ | < d|
|d t|ƒ | < d|
|d t|ƒ | < d|
|d t|ƒ | < qî|  t|
 ¡ ƒ|¡ d S |  ¡ j|dds°d S | j d¡ | j |¡}	| j	d rê|	rê| j d¡ d S tƒ }| jD ]T}|  
¡ r
 d S |d	 | }t|ƒ| j	d kr6| |¡ n|  ||¡ tƒ }qöt|ƒdkrf|  ||¡ | j	d rž| j	d sžtƒ }
d	| }| jD ]è}|  
¡ r¦ d S tdƒD ]’}d|
|t|ƒ | < d|
|d t|ƒ | < d|
|d t|ƒ | < d|
|d t|ƒ | < d|
|d t|ƒ | < d|
|d t|ƒ | < q®tt|
 ¡ ƒƒ| j	d kr’|  t|
 ¡ ƒ|¡ tƒ }
q’t|
ƒdkrž|  t|
 ¡ ƒ|¡ d S )NzReceived event, z, from r   Tr*   F)ÚincludeChildrenr   Ú.r8   r   zWildcard DNS detected on z so skipping host iteration.é
   Ú0Z00ú-z-0z-00z'Iterating through possible sub-domains.zWildcard DNS detected.r   r   r   )Ú	eventTypeÚmoduleÚdatar   Ú
hashstringÚdebugr   Ú	getTargetÚmatchesr   ÚcheckForStopÚsplitÚcheckDnsWildcardr9   Úranger;   rN   r   r   r   Úlenr+   )r   ÚeventÚ	eventNameÚsrcModuleNameÚ	eventDataÚeventDataHashÚparentEventÚhÚdomZwildcardZnextsubsrH   Ú
targetListÚsubr2   r$   r&   r&   r'   ÚhandleEvent‡   sˆ    








zsfp_dnsbrute.handleEvent)rO   Ú
__module__Ú__qualname__Ú__doc__r   Úoptdescsr   r   r   r9   r(   r-   r.   r5   rN   rE   ro   r&   r&   r&   r'   r      s4   ùú		
r   )r<   r   rB   Úsflibr   r   r   r   r&   r&   r&   r'   Ú<module>   s   