U
    @6^                     @   sL   d dl m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 )    )	IPNetworkN)
SpiderFootSpiderFootPluginSpiderFootEventc                1   @   s   e Zd ZdZdddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2g1d3d4d5d5d6d7Zd8d9d:d;d<d=d>Zd?Ze Ze	 Z
d?Zd@Ze	 fdAdBZdCdD ZdEdF ZdGdH ZdIdJ ZdKdL ZdMdN Zd?S )Osfp_portscan_tcpzPort Scanner - TCP:Footprint,Investigate:Crawling and Scanning:slow,invasive:Scans for commonly open TCP ports on Internet-facing systems.Z21Z22Z23Z25Z53Z7980Z81Z88Z110Z111Z113Z119Z123Z137Z138Z139Z143161Z179Z389443Z445Z465512513Z514Z515Z3306Z5432Z1521Z2638Z1433Z3389Z5900Z5901Z5902Z5903Z5631Z631Z636Z990Z992Z993Z995Z1080Z8080Z8888Z9000   
   T   )portstimeout
maxthreads	randomizenetblockscannetblockscanmaxzSNumber of ports to try to open simultaneously (number of threads to spawn at once.)zThe TCP ports to scan. Prefix with an '@' to iterate through a file containing ports to try (one per line), e.g. @C:\ports.txt or @/home/bob/ports.txt. Or supply a URL to load the list from there.z#Seconds before giving up on a port.z%Randomize the order of ports scanned.z4Port scan all IPs within identified owned netblocks?zVMaximum netblock/subnet size to scan IPs within (CIDR value, 24 = /24, 16 = /16, etc.))r   r   r   r   r   r   NFc                 C   s  || _ |  | _d| _t | _t| D ]}|| | j	|< q,| j	d d 
ds|| j	d d 
ds|| j	d d 
dr| j | j	d d }n
| j	d }t|D ]H}z| jt| W q tk
r } z| j d W 5 d }~X Y qX q| j	d rt | j d S )	NzTarget Networkr   r   zhttp://zhttps://@z,Skipping invalid port specified in port listr   )sftempStorageresults__dataSource__	threadingLocklocklistkeysopts
startswithoptValueToDatasetportlistappendint
ValueErrordebugrandomSystemRandomshuffle)selfsfcuserOptsoptr#   porte r1   ;/var/www/spiderfoot.crq.systems/modules/sfp_portscan_tcp.pysetup8   s(    


 zsfp_portscan_tcp.setupc                 C   s   ddgS )N
IP_ADDRESSNETBLOCK_OWNERr1   r+   r1   r1   r2   watchedEventsS   s    zsfp_portscan_tcp.watchedEventsc                 C   s   ddgS )NTCP_PORT_OPENTCP_PORT_OPEN_BANNERr1   r6   r1   r1   r2   producedEventsY   s    zsfp_portscan_tcp.producedEventsc                 C   s  zB| j ||| jd }| j d| j|d t| < W 5 Q R X W nP tk
r } z2| j d| j|d t| < W 5 Q R X W Y d S d }~X Y nX z2| j" |d| j|d t| < W 5 Q R X W n0 tk
r } z|  W Y d S d }~X Y nX |  d S )Nr   T:Fi   )	r   
safeSocketr   r   portResultsstr	Exceptionrecvclose)r+   ipr/   sockr0   r1   r1   r2   tryPort\   s    $ *zsfp_portscan_tcp.tryPortc                 C   s   t  | _d}d}g }|t|k r| jdt||  d |  |tjdt||  | j	||| fd || 
  |d7 }q|rd}t D ]}|jdrd}q|sd}td	 q| jS )
NTr   zSpawning thread to check port: z on Zsfp_portscan_tcp_)nametargetargs   Fg      ?)dictr=   lenr   infor>   r$   r   ThreadrD   start	enumeraterE   r    timesleep)r+   rB   ZportListrunningitfoundZrtr1   r1   r2   tryPortWrapperp   s*      

zsfp_portscan_tcp.tryPortWrapperc                 C   s   |D ]~}|| r| j d| d  td|| j|}| | || dkr|| dkrt|| ddd}td	|| j|}| | qd S )
Nz	TCP Port z found to be OPEN.r8    Tzutf-8replace)errorsr9   )r   rK   r   __name__notifyListenersr>   )r+   ZresArrayZsrcEventcpevtZbannerZbevtr1   r1   r2   	sendEvent   s    
 zsfp_portscan_tcp.sendEventc              
   C   s  |j }|j}|j}t }| jr"d S | jd| d |  | jsX| jdd d| _d S z|dkr| j	d rt
|}|j| j	d k r| jd	| d
  W d S |D ]:}t|}|dd dkrqd|dkrq|| qn
|| W nL tk
r8 }	 z,| jd| d t|	 d d W Y d S d }	~	X Y nX |D ]}
|
| jkrh| jd|
 d   d S d| j|
< d}g }| jD ]Z}|  r  d S || j	d k r|| |d7 }n| | |
|| d}|g}q| | |
|| q>d S )NzReceived event, z, from zNo ports specified in port listFTr5   r   r   zSkipping port scanning of z
, too big..   )2550r`   z.Strange netblock identified, unable to parse: z ()z	Skipping z as already scanned.r   r   rH   )	eventTypemoduledatar   
errorStater   r'   r#   errorr   r   	prefixlenr>   splitr$   BaseExceptionr   checkForStopr]   rU   )r+   event	eventNamesrcModuleName	eventDataZscanIpsnetrB   ipaddrr0   ipAddrrR   ZportArrr/   r1   r1   r2   handleEvent   sn    





zsfp_portscan_tcp.handleEvent)rY   
__module____qualname____doc__r   optdescsr   r   r#   rI   r=   r   rf   r3   r7   r:   rD   rU   r]   rs   r1   r1   r1   r2   r      s                                    	r   )
netaddrr   r(   r   rO   sflibr   r   r   r   r1   r1   r1   r2   <module>   s
   