a
    kÄ#d  ã                   @   s|  d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZmZmZmZmZ dd	lmZmZ dd
lmZ ddlmZmZmZmZmZmZm Z m!Z! ddl"m#Z#m$Z$ ddl%m&  m'Z' e
rìej(d d e_)nde_)e *d¡Z+G dd„ deƒZ,e,dƒe_-e e,ej-ƒe_-dd„ Z.dd„ Z/dd„ Z0d&dd„Z1dd„ Z2d d!„ Z3ej4j5d'd"d#„ƒZ6ej4j5d$d%„ ƒZ7dS )(aµ  Clone of Nmap's first generation OS fingerprinting.

This code works with the first-generation OS detection and
nmap-os-fingerprints, which has been removed from Nmap on November 3,
2007 (https://github.com/nmap/nmap/commit/50c49819), which means it is
outdated.

To get the last published version of this outdated fingerprint
database, you can fetch it from
<https://raw.githubusercontent.com/nmap/nmap/9efe1892/nmap-os-fingerprints>.

é    )Úabsolute_importN)ÚKnowledgeBase)Úconf)ÚWINDOWS)Úwarning)ÚIPÚTCPÚUDPÚICMPÚUDPerrorÚIPerror)Ú	NoPayloadÚPacket)Úsr)Ú	plain_strÚrawÚDictÚListÚTupleÚOptionalÚcastÚUnion)Ú
SndRcvListÚ
PacketListZProgramFilesz\nmap\nmap-os-fingerprintsz$/usr/share/nmap/nmap-os-fingerprintsz^([^\(]*)\(([^\)]*)\)$c                       s(   e Zd ZdZdd„ Z‡ fdd„Z‡  ZS )ÚNmapKnowledgeBasezŠA KnowledgeBase specialized in Nmap first-generation OS
fingerprints database. Loads from conf.nmap_base when self.filename is
None.

    c           	   	   C   sb  z t | jd u rtjn| jdƒ}W n* ttfyJ   td| jƒ d | _Y d S 0 g | _tt	t
ttttttf f f  | jƒ| _d }i }|D ]²}t|ƒ}| dd¡d  ¡ }|s®qˆ| d¡ræ|d urÐ| j ||f¡ |dd …  ¡ }i }qˆ| d¡ròqˆt |¡}|d u �rqˆ| ¡ \}}td	d
„ |�r,| d¡ng D ƒƒ||< qˆ|d u�rV| j ||f¡ | ¡  d S )NÚrbzCannot open nmap database [%s]ú#é   r   zFingerprint é   zClass c                 s   s   | ]}|  d d¡V  qdS )ú=r   N)Úsplit)Ú.0Úval© r#   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/modules/nmap.pyÚ	<genexpr>X   ó    z.NmapKnowledgeBase.lazy_init.<locals>.<genexpr>ú%)ÚopenÚfilenamer   Ú	nmap_baseÚIOErrorÚ	TypeErrorr   Úbaser   r   r   Ústrr   r   r    ÚstripÚ
startswithÚappendÚ
_NMAP_LINEÚsearchÚgroupsÚdictÚclose)	ÚselfZfdescÚnameÚsigÚlineZstr_lineZ
match_lineÚtestÚvaluesr#   r#   r$   Ú	lazy_init8   sJ    ÿþ*



ÿ
zNmapKnowledgeBase.lazy_initc                    s    t ttttf  tt| ƒ ¡ ƒS ©N)r   r   r   r.   r   Úsuperr   Úget_base)r7   ©Ú	__class__r#   r$   r@   ^   s    zNmapKnowledgeBase.get_base)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r=   r@   Ú__classcell__r#   r#   rA   r$   r   1   s   &r   c                 C   sš   i }| d urŽ| j jrdnd|d< d| j |d< | jdkr<dn| jdkrJd	nd
|d< t| t j ƒd d d… |d< d dd„ | t jD ƒ¡|d< nd|d< |S )NÚYÚNÚDFú%XÚWé   zS++r   ÚSÚOÚACKéÿÿÿÿÚFlagsÚ c                 s   s   | ]}|d  d  V  qdS )r   Nr#   ©r!   Úxr#   r#   r$   r%   o   r&   z%nmap_tcppacket_sig.<locals>.<genexpr>ÚOpsÚResp)ÚflagsrJ   ZwindowZackr.   r   ÚjoinÚoptions)ZpktÚresr#   r#   r$   Únmap_tcppacket_sigg   s    $ r\   c                 C   s&  i }|d u rd|d< �n
|j jr$dnd|d< d|j |d< d|j |d< d|jjj |d< | j|t jkrnd	nd
|d< | j|t jkrŠd	n|t jdkrœdnd
|d< | jj|t jkrºd	n|t jdkrÌdnd
|d< d|t j |d< t	|t jt
ƒ�st|t jƒt| t jƒk�rd	nd
|d< |S )NrI   rW   rH   rJ   rK   ÚTOSÚIPLENÚRIPTLÚEÚFÚRIDr   Ú0ÚRIPCKÚUCKÚULENÚDAT)rX   rJ   ZtosÚlenÚpayloadÚidr   Úchksumr   Ú
isinstancer   r   r	   )ÚsndÚrcvr[   r#   r#   r$   Únmap_udppacket_sigu   s,    ÿÿÿþýro   c                    sF   t ‡ fdd„t | ¡D ƒƒ}|dkr6|  d¡dkr6dS t|ƒt| ƒ S )Nc                 3   s(   | ] \}}|ˆ   |d ¡ d¡v V  qdS )rS   ú|N)Úgetr    )r!   Úkeyr"   ©Úrefr#   r$   r%   �   s   ÿz%nmap_match_one_sig.<locals>.<genexpr>r   rW   rI   gffffffæ?)ÚsumÚsixÚ	iteritemsrq   Úfloatrh   )Úseenrt   Zcntr#   rs   r$   Únmap_match_one_sigŽ   s    ÿrz   éP   éQ   r   c                    sÒ   i }g d¢‰‡ ‡‡‡fdd„t g d¢ƒD ƒ}| tˆd�td|d� d ¡ t|d	d
�\}}| dd„ |D ƒ¡ |D ]T\}}	|jdkr”||	f|d< qtd|jd  }
|	d urÀt|	v rÀtd|
ƒ d }	|	||
< qtt	|ƒS )N))ZWScaleé
   )ÚNOPN)ZMSSé   )Ú	Timestamp)é{   r   c              
      s>   g | ]6\}}t ˆd d�td d| |dk r,ˆnˆ ˆ|d� ‘qS )r   )Údstrj   i‰  é   )ÚseqÚsportÚdportrZ   rX   )r   r   )r!   ÚirX   ©ÚcportÚoportÚtargetZtcpoptr#   r$   Ú
<listcomp>Ÿ   s   ý
ÿÿznmap_sig.<locals>.<listcomp>)ÚCSrS   ZSFUPÚArN   rŽ   ZFPU)r‚   i�  )r…   r†   A,  iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiirM   )Útimeoutc                 s   s   | ]}|d fV  qd S r>   r#   rT   r#   r#   r$   r%   ¨   r&   znmap_sig.<locals>.<genexpr>ÚPUzT%iiˆ  zTest %s answered by an ICMP)
Ú	enumerater1   r   r	   r   Úextendr…   r
   r   Únmap_probes2sig)r‹   rŠ   r‰   Zucportr[   ÚtestsZansZunansrm   rn   r;   r#   rˆ   r$   Únmap_sig—   s"    
ü 


r•   c                 C   sH   |   ¡ } i }d| v r*t| d Ž |d< | d= | D ]}t| | ƒ||< q.|S )Nr�   )Úcopyro   r\   )r”   r[   Úkr#   r#   r$   r“   ·   s    r“   c                 C   sž   dg f}t ttjƒt_tj ¡ D ]x\}}d}t |¡D ]"\}}|| v r6|t| | |ƒ7 }q6|t| ƒ }||d kr~||gf}q ||d kr |d  	|¡ q |S )Nr   g        r   )
r   r   r   Únmap_kdbr@   rv   rw   rz   rh   r1   )ÚsigsÚguessZosvalZfprintZscorer;   r<   r#   r#   r$   Únmap_searchÃ   s    r›   c                 C   s   t | ||ƒ}t|ƒS )zcnmap fingerprinting
nmap_fp(target, [oport=80,] [cport=81,]) -> list of best guesses with accuracy
)r•   r›   )r‹   rŠ   r‰   r™   r#   r#   r$   Únmap_fpÔ   s    rœ   c              
      s~   g d¢}g d¢}g }| D ]}||vr|  |¡ q|D ]>}|  |¡‰ ˆ d u rLq4|  d|d ‡ fdd„|D ƒ¡f ¡ q4d |¡S )N)	ZTSeqZT1ZT2ZT3ZT4ZT5ZT6ZT7r�   )ÚClassÚgcdZSIZIPIDZTSrW   rJ   rL   rP   rR   rV   r]   r^   r_   rb   rd   re   rf   rg   z%s(%s)r'   c                 3   s&   | ]}|ˆ v rd |ˆ | f V  qdS )z%s=%sNr#   )r!   rr   ©Ztestsigr#   r$   r%   í   s   znmap_sig2txt.<locals>.<genexpr>Ú
)r1   rq   rY   )r9   ZtorderZkorderÚtxtr‡   r;   r#   rŸ   r$   Únmap_sig2txtÞ   s    
ÿr¢   )r{   r|   r   )r{   r|   )8rF   Ú
__future__r   ÚosÚreZ
scapy.datar   Zscapy.configr   Z
scapy.archr   Zscapy.errorr   Zscapy.layers.inetr   r   r	   r
   r   r   Zscapy.packetr   r   Zscapy.sendrecvr   Zscapy.compatr   r   r   r   r   r   r   r   Zscapy.plistr   r   Zscapy.libs.sixZlibsrv   Úenvironr*   Úcompiler2   r   r˜   r\   ro   rz   r•   r“   r›   ÚcommandsÚregisterrœ   r¢   r#   r#   r#   r$   Ú<module>   s<    (
2
	
 	