
    h                        d 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 ddlmZmZ ddlmZmZm Z m!Z!m"Z"m#Z# erej$        d         dz   e_%        nde_%         ej&        d          Z' G d de          Z( e(d          e_)         e"e(ej)                  e_)        d Z*d Z+d Z,ddZ-d Z.d Z/ej0        j1        dd            Z2ej0        j1        d             Z3d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>.

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

    c           
      (   	 t          | j        t          j        n| j        d          }n4# t          t
          f$ r  t          d| j                   d | _        Y d S w xY wg | _        t          t          t          t          t          t          t          t          t          f         f         f                  | j                  | _        d }i }|D ]}t          |          }|                    dd          d                                         }|sC|                    d          r=|| j                            ||f           |dd                                          }i }|                    d          rt$                              |          }||                                \  }}t+          d	 |r|                    d
          ng D                       ||<   || j                            ||f           |                                 d S )NrbzCannot open nmap database [%s]#   r   zFingerprint    zClass c              3   B   K   | ]}|                     d d          V  dS )=r    N)split).0vals     V/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/modules/nmap.py	<genexpr>z.NmapKnowledgeBase.lazy_init.<locals>.<genexpr>_   sH       D D3SYYsA.. D D D D D D    %)openfilenamer   	nmap_baseIOError	TypeErrorr   baser   r   r   strr   r   r$   strip
startswithappend
_NMAP_LINEsearchgroupsdictclose)	selffdescnamesiglinestr_line
match_linetestvaluess	            r'   	lazy_initzNmapKnowledgeBase.lazy_init?   s%   	 M1 . .EE # 	 	 	4dmDDD DMFF	
 	eCc4S>.A)B$BCDdiPP	 	D 	DD H~~c1--a06688H "">22 #I$$dC[111}**,,""8,, #**844J!%,,..LD& D D39Afll3///rD D D D DCIIIdC[)))s   (+ -AAc                     t          t          t          t          t          f                  t          t          |                                                     S N)r   r   r   r1   r   superr   get_base)r:   	__class__s    r'   rG   zNmapKnowledgeBase.get_basee   s8    DsDy)*E2CT,J,J,S,S,U,UVVVr)   )__name__
__module____qualname____doc__rC   rG   __classcell__)rH   s   @r'   r   r   8   s[         $ $ $LW W W W W W W W Wr)   r   c                 R   i }| | j         j        rdnd|d<   d| j        z  |d<   | j        dk    rdn| j        dk    rd	nd
|d<   t	          | t
                   j                   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              3   2   K   | ]}|d          d          V  dS )r   N r%   xs     r'   r(   z%nmap_tcppacket_sig.<locals>.<genexpr>v   s*      ??QqT!W??????r)   OpsResp)flagsrQ   windowackr1   r   joinoptions)pktress     r'   nmap_tcppacket_sigrh   n   s    
C
9<0CCSD	#*$C!gllUUsw!||E
3s8>**44R40GWW??c#h.>?????E

FJr)   c                    i }|d|d<   nc|j         j        rdnd|d<   d|j        z  |d<   d|j        z  |d<   d|j        j        j        z  |d<   | j        |t                   j        k    rd	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        z  |d<   t          |t                   j        t                    s@t          |t                   j                  t          | t                   j                  k    rd	nd
|d<   |S )NrP   r`   rO   rQ   rR   TOSIPLENRIPTLEFRIDr   0RIPCKUCKULENDAT)ra   rQ   toslenpayloadidr   chksumr   
isinstancer   r   r	   )sndrcvrg   s      r'   nmap_udppacket_sigr}   |   sl   
C
{F9<0CCSD	CG^E
cg~Gck155GFc'lo55SS3E
!jCL,???ssw<&!++CC 	G  K.#h-2FFFSSx='1,,CC# 	E
 S]..Fs8},i88H%&&#c#h.>*?*??? S  	E
 Jr)   c                     t          fd|                                 D                       }|dk    r|                     d          dk    rdS t          |          t	          |           z  S )Nc              3   t   K   | ]2\  }}|                     |d                               d          v V  3dS )rZ   |N)getr$   )r%   keyr&   refs      r'   r(   z%nmap_match_one_sig.<locals>.<genexpr>   sH      NNXS#cSWWS"%%++C000NNNNNNr)   r   r`   rP   gffffff?)sumitemsr   floatrv   )seenr   cnts    ` r'   nmap_match_one_sigr      sh    
NNNNNNN
N
NC
axxDHHV$$++s::D		!!r)   P   Q   r    c                     i }g d fdt          g d          D             }|                    t                     t          d|          z  dz             t	          |d	          \  }}|                    d
 |D                        |D ]G\  }}	|j        dk    r||	f|d<   d|j        dz
  z  }
|	t          |	v rt          d|
           d }	|	||
<   Ht          |          S )N))WScale
   )NOPN)MSS   )	Timestamp){   r   c           
      x    g | ]6\  }}t          d           t          d d|z   |dk     rn|          z  7S )r    )dstrx   i     )seqsportdportre   ra   )r   r   )r%   ira   cportoporttargettcpopts      r'   
<listcomp>znmap_sig.<locals>.<listcomp>   sn        Au 	v!!a%%U%	) 	) 	)	)  r)   )CSrZ   SFUPArU   r   FPU)r   i  )r   r   ,  iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiirT   )timeoutc              3      K   | ]}|d fV  	d S rE   r\   r]   s     r'   r(   znmap_sig.<locals>.<genexpr>   s&      ((Q4y((((((r)   PUzT%ii  zTest %s answered by an ICMP)
	enumerater4   r   r	   r   extendr   r
   r   nmap_probes2sig)r   r   r   ucportrg   testsansunansr{   r|   rA   r   s   ```        @r'   nmap_sigr      sJ   
C' ' 'F       ""J"J"JKK	  E 
LL#D"?"?"??9MNNNE1%%%JCJJ((%((((((  S9c
CIICI,-D43;;5t<<<CII3r)   c                     |                                  } i }d| v rt          | d          |d<   | d= | D ]}t          | |                   ||<   |S )Nr   )copyr}   rh   )r   rg   ks      r'   r   r      sa    JJLLE
Cu}}&d4D	$K . .#E!H--AJr)   c                    dg f}t          t          t          j                  t          _        t          j                                        D ]\  }}d}|                                D ]"\  }}|| v r|t          | |         |          z  }#|t          |           z  }||d         k    r||gf}b||d         k    r|d                             |           |S )Nr   g        r    )	r   r   r   nmap_kdbrG   r   r   rv   r4   )sigsguessosvalfprintscorerA   rB   s          r'   nmap_searchr      s    rEE*DM::DM//11 	# 	#v"LLNN 	@ 	@LD&t||+DJ???T58E7NEEeAh!HOOE"""Lr)   c                 B    t          | ||          }t          |          S )zcnmap fingerprinting
nmap_fp(target, [oport=80,] [cport=81,]) -> list of best guesses with accuracy
)r   r   )r   r   r   r   s       r'   nmap_fpr      s#     FE5))Dtr)   c           	      ,   g d}g d}g }| D ]}||vr|                     |           |D ]T}|                     |          |                     |dd                    fd|D                       d           Ud                    |          S )N)	TSeqT1T2T3T4T5T6T7r   )ClassgcdSIIPIDTSr`   rQ   rS   rW   rY   r_   rj   rk   rl   ro   rq   rr   rs   rt   (r*   c              3   :   K   | ]}|v |d |         V  dS )r#   Nr\   )r%   r   testsigs     r'   r(   znmap_sig2txt.<locals>.<genexpr>   s?       .
 .
.1sg~~sssGCLL)~~~~.
 .
r)   )
)r4   r   rd   )r=   torderkordertxtr   rA   r   s         @r'   nmap_sig2txtr      s     FEEFM M MF C  F??MM!  ''$--?

tttSXX .
 .
 .
 .
5;.
 .
 .
 &
 &
 &
 &
  	 	 	 	 99S>>r)   )r   r   r    )r   r   )4rL   osre
scapy.datar   scapy.configr   
scapy.archr   scapy.errorr   scapy.layers.inetr   r   r	   r
   r   r   scapy.packetr   r   scapy.sendrecvr   scapy.compatr   r   scapy.plistr   r   typingr   r   r   r   r   r   environr-   compiler5   r   r   rh   r}   r   r   r   r   commandsregisterr   r   r\   r)   r'   <module>r      s    
			 				 $ $ $ $ $ $                   C C C C C C C C C C C C C C C C * * * * * * * *       ' ' ' ' ' ' ' ' . . . . . . . .                 <Z/2PPDNN;DN RZ455
/W /W /W /W /W /W /W /Wd "!$''&66    2" " "       @	 	 	  "         r)   