
    hZ                        d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
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 ddlmZ ddlmZmZmZmZ dd	lmZ dd
lmZm Z m!Z!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- ddl.m/Z/ 	 ddl0Z0dZ1n# e2$ r dZ1Y nw xY w	 ddl3Z3dZ4n# e2$ r dZ4Y nw xY w	 ddl5Z5dZ6n# e2$ r dZ6Y nw xY wdej7        vr*i ej7        d<   dej7        d         d<   dej7        d         d<   g dZ8ddgZ9g dZ:g dZ;g dZ<g dZ=d Z>d Z?d Z@d ZAd ZB G d  d!e          ZC G d" d#e          ZDd$ ZE G d% d&eC          ZF G d' d(eC          ZG G d) d*e          ZH G d+ d,e          ZI G d- d.eJ          ZK	 	 d;d1ZL e!e/eHd23            e!e/eHd24            e e/eHd2d25            e!e/eHd63            e!e/eHd64            G d7 d8e          ZM G d9 d:eM          ZNdS )<am  
HTTP 1.0 layer.

Load using::

    from scapy.layers.http import *

Or (console only)::

    >>> load_layer("http")

Note that this layer ISN'T loaded by default, as quite experimental for now.

To follow HTTP packets streams = group packets together to get the
whole request/answer, use ``TCPSession`` as::

    >>> sniff(session=TCPSession)  # Live on-the-flow session
    >>> sniff(offline="./http_chunk.pcap", session=TCPSession)  # pcap

This will decode HTTP packets using ``Content_Length`` or chunks,
and will also decompress the packets when needed.
Note: on failure, decompression will be ignored.

You can turn auto-decompression/auto-compression off with::

    >>> conf.contribs["http"]["auto_compression"] = False

(Defaults to True)

You can also turn auto-chunking/dechunking off with::

    >>> conf.contribs["http"]["auto_chunk"] = False

(Defaults to True)
    N)Enum)	plain_strbytes_encode)	AutomatonATMT)conf)WINDOWS)warninglog_loadinglog_interactiveScapy_Exception)StrField)Packetbind_layersbind_bottom_upRaw)StreamSocketSSLStreamSocket)get_temp_fileContextManagerSubprocess)GSS_S_COMPLETEGSS_S_FAILUREGSS_S_CONTINUE_NEEDEDGSSAPI_BLOB)TCPTFhttpauto_compression
auto_chunk)zCache-Control
Connection	PermanentzContent-LengthzContent-MD5zContent-TypeDatez
Keep-AlivePragmaUpgradeViaWarningzX-Request-IDzX-Correlation-ID)zA-IMAcceptzAccept-CharsetzAccept-EncodingzAccept-LanguagezAccept-DatetimezAccess-Control-Request-MethodzAccess-Control-Request-HeadersAuthorizationCookieExpect	ForwardedFromHostzHTTP2-SettingszIf-MatchzIf-Modified-SincezIf-None-MatchzIf-RangezIf-Unmodified-SincezMax-ForwardsOriginzProxy-AuthorizationRangeRefererTEz
User-Agent)zUpgrade-Insecure-RequestszX-Requested-WithDNTzX-Forwarded-ForzX-Forwarded-HostzX-Forwarded-ProtozFront-End-HttpszX-Http-Method-OverridezX-ATT-DeviceIdzX-Wap-ProfilezProxy-ConnectionzX-UIDHzX-Csrf-Tokenz	Save-Data)$zAccess-Control-Allow-Originz Access-Control-Allow-CredentialszAccess-Control-Expose-HeaderszAccess-Control-Max-AgezAccess-Control-Allow-MethodszAccess-Control-Allow-HeaderszAccept-PatchzAccept-RangesAgeAllowzAlt-SvczContent-DispositionzContent-EncodingzContent-LanguagezContent-LocationzContent-Rangez
Delta-BaseETagExpiresIMzLast-ModifiedLinkLocationP3PzProxy-AuthenticatezPublic-Key-PinszRetry-AfterServerz
Set-CookiezStrict-Transport-SecurityTrailerzTransfer-EncodingTkVaryzWWW-AuthenticatezX-Frame-Options)zContent-Security-PolicyzX-Content-Security-PolicyzX-WebKit-CSPRefreshStatuszTiming-Allow-OriginzX-Content-DurationzX-Content-Type-OptionszX-Powered-ByzX-UA-CompatiblezX-XSS-Protectionc                 l    t          |                                                               dd          S )zpTakes a header key (i.e., "Host" in "Host: www.google.com",
    and returns a stripped representation of it
    -_)r   stripreplace)names    U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/http.py_strip_header_namerG      s*     TZZ\\""**3444    c                 F    t          |           dz   t          |          z   S )zCreates a HTTP header lines   : )r   )rE   vals     rF   _header_linerK      s$     %S(9(999rH   c                    |                      d          }i }|D ]g}	 |                     dd          \  }}n# t          $ r Y )w xY wt          |                                          }||                                f||<   h|S )N   
   :   )split
ValueErrorrG   lowerrC   )sheadersheaders_foundheader_linekeyvalue
header_keys          rF   _parse_headersrZ      s    gggGM 9 9	$**433JC 	 	 	H	',,2244
%(%++--$8j!!s   7
AAc                 (   d}|                      |          }|dk    r5| d|t          |          z            }| |t          |          z   d         }n| }d}|                    dd          \  }}|                                t	          |          |fS )z Takes a HTTP packet, and returns a tuple containing:
      _ the first line (e.g., "GET ...")
      _ the headers in a dictionary
      _ the body
       

NrH   rM   rO   )findlenrP   rC   rZ   )rS   crlfcrlfcrlfcrlfIndexrT   body
first_lines         rF   _parse_headers_and_bodyrd      s     HFF8$$M2]S]]223X.//0!--33J~g66<<rH   c                    t          |          \  }}}| j        D ]m}t          |j                                                  }	 |                    |          \  }}n# t          $ r Y Nw xY w|                     |j        |           n|r7t          |	                                          }|                     d|           ||fS )zTakes a HTTP packet as the string s, and populates the scapy layer obj
    (either HTTPResponse or HTTPRequest). Returns the first line of the
    HTTP packet, and the body
    Unknown_Headers)
rd   fields_descrG   rE   rR   popKeyErrorsetfieldvaldictvalues)	objrS   rc   rT   rb   fstripped_namerB   rX   s	            rF   _dissect_headersrp     s    
 !8 : :J_ ' '*162288::	{{=11HAuu 	 	 	H	&&&& 4w~~''(()7333ts   A
A*)A*c                   B     e Zd ZdgZd Zd Zd Zd Zd Z fdZ	 xZ
S )_HTTPContent_original_lenc                     g }t          | t                    rv| j        r4|d t          | j                                      d          D             z  }| j        r4|d t          | j                                      d          D             z  }|S )Nc                 t    g | ]5}t          |                                                                          6S  r   rC   rR   .0xs     rF   
<listcomp>z/_HTTPContent._get_encodings.<locals>.<listcomp>,  sH     L L Lqill002288:: L L LrH   ,c                 t    g | ]5}t          |                                                                          6S rv   rw   rx   s     rF   r{   z/_HTTPContent._get_encodings.<locals>.<listcomp>/  sH     K K Kqill002288:: K K KrH   )
isinstanceHTTPResponseTransfer_Encodingr   rP   Content_Encoding)self	encodingss     rF   _get_encodingsz_HTTPContent._get_encodings(  s    	dL)) 	K% L L L'(>??EEcJJL L L L	$ K K K'(=>>DDSIIK K K K	rH   c                     dS )Ns   HTTP1rv   r   s    rF   hashretz_HTTPContent.hashret3  s    xrH   c                    t          |          | _        |                                 }t          j        d         d         rwd|v rsd}|rk|                    d          \  }}}	 t          |d          }|d |         }|||dz            dk    rn%||dz   d          }||z  }n# t          $ r Y nw xY w|k|s|}t          j        d         d         s|S 	 d	|v rd
d l}|	                    |          }nd|v rt          j	        |          }nd|v r1t          rt          j	        |          }nt          j        d           nd|v r1t          rt!          j	        |          }nt          j        d           nnd|v rjt"          rOt%          j        |          }	t)          j                                        |	          }
|
                                }nt          j        d           n# t0          $ r Y nw xY w|S )Nr   r   chunkedrH   rM         r   deflater   gzipcompressz:Can't import lzw. compress decompression will be ignored !brz;Can't import brotli. brotli decompression will be ignored !zstdz<Can't import zstandard. zstd decompression will be ignored !)r_   rs   r   r   contribs	partitionintrQ   zlib
decompressr   _is_lzw_availablelzwr   info_is_brotli_availablebrotli_is_zstd_availableioBytesIO	zstandardZstdDecompressorstream_readerread	Exception)r   rS   r   datalengthrB   rb   loadr   bioreaders              rF   post_dissectz_HTTPContent.post_dissect6  sv    VV''))	= . 	9	3I3ID !"#++g"6"64! __F
  =DF6A:-.'99VaZ[[)ADLDD "   E	  !  }V$%78 	H%	I%%OOA&&9$$OA&&y(($ q))AA$,    ""' )!,,AA$,    9$$%  *Q--C&799GGLLFAA$,    	 	 	D	 s%   #B" "
B/.B/DG# #
G0/G0c                    |                                  }t          j        d         d         rd|v rdd l}|                    |          }nd|v rt          j        |          }nd|v r1t          rt          j        |          }nt          j	        d           n{d|v r1t          rt          j        |          }n[t          j	        d	           nFd
|v rBt          r't          j                                        |          }nt          j	        d           t          j        d         d         rd|v rdt          |          z  dz   |z   dz   }||z   S )Nr   r   r   r   r   r   z8Can't import lzw. compress compression will be ignored !r   z9Can't import brotli. brotli compression will be ignored !r   z:Can't import zstandard. zstd compression will be ignored !r   r   s   %XrM   s   
0

)r   r   r   r   r   r   r   r   r   r   r   r   r   r   ZstdCompressorr_   )r   pktpayr   r   s        rF   
post_buildz_HTTPContent.post_buildw  s   ''))	= !34 	I%%mmC((9$$mC((y(($ ,s++CC$,    ""'  /#..CC$'    9$$% #244==cBBCC$'  
 = . 	H9	3I3I3s88#w.47GGCSyrH   c                    t          | j        t                    st          d           | j        | j        S d}|                                 }t          | j                  D ]\  }}|j        dk    r| 	                    |j                  }|s|j        dk    r(d|vr$t          t          | j        pd                    }nc|j        dk    rWt          | t                    rBt          j                            t          j        j                                      d          }n|d	k    rt'          |j        |          }|d
k    rd}nd}|                    | |||z             }| j        rad}| j                                        D ]\  }	}
|t'          |	|
          dz   z  }|                     d                              | ||          }|r|                    | |d          }|S )z\ Takes an HTTPRequest or HTTPResponse object, and creates its
        string representation.z:An HTTPResponse/HTTPRequest should always be below an HTTPNrH   rf   Content_Lengthr   r!   z%a, %d %b %Y %H:%M:%S GMT   rO       rM   )r~   
underlayerHTTPr
   raw_packet_cacher   	enumeraterg   rE   getfieldvalstrr_   payloadr   datetimenowtimezoneutcstrftimerK   	real_nameaddfieldrf   items	get_field)r   kwargspr   irn   rJ   	separatorheaders_textrE   rX   s              rF   
self_buildz_HTTPContent.self_build  s    $/400 	L    ,((''))	d.// 	5 	5DAqv***""16**C 
6---)92L2Lc$,"5#6677CCVv%%*T<*H*H%"+//0A0EFFOO3 CC
 Avv"1;44 Avv 		#	

4C)O44AA 	L#399;; D DeT5 9 9G CC011::a A  	-

4G,,ArH   c                     t          | d          s(t          t          |                               |          S | j        rd| j        v rddlm} |S t          t          |                               |          S )z"Detect potential payloads
        r   s   Upgrader   )H2Frame)hasattrsuperrr   guess_payload_classr   scapy.contrib.http2r   )r   r   r   	__class__s      rF   r   z _HTTPContent.guess_payload_class  s     t\** 	Jt,,@@III? 	zT_<<333333N\4((<<WEEErH   )__name__
__module____qualname__	__slots__r   r   r   r   r   r   __classcell__r   s   @rF   rr   rr   $  s         !I	 	 	  ? ? ?B% % %N4 4 4lF F F F F F F F FrH   rr   c                   $    e Zd ZdZdgZd Zd ZdS )_HTTPHeaderFieldz-Modified StrField to handle HTTP Header namesr   c                 b    || _         t          |          }t          j        | ||d           d S )NH)fmt)r   rG   r   __init__)r   rE   defaults      rF   r   z_HTTPHeaderField.__init__  s6    !$''$g3777777rH   c                 \    t          |t                    r|                    d          S |S )Nbackslashreplace)errors)r~   bytesdecode)r   r   rz   s      rF   i2reprz_HTTPHeaderField.i2repr  s.    a 	788#58666rH   N)r   r   r   __doc__r   r   r   rv   rH   rF   r   r     s?        77I8 8 8
    rH   r   c                      g }| D ]}||z  }g }t          |          D ]%}|                    t          |d                     &|S )z.Generate the header fields based on their nameN)sortedappendr   )argsall_headersrT   resultshs        rF   _generate_headersr     se     K  wGK   2 2'4001111NrH   c                       e Zd ZdZ edd           edd           edd          g eeeee	          z    edd	          gz   Z
d
 Zd Zd	S )HTTPRequestzHTTP RequestMethodGETPath/Http-VersionHTTP/1.1Unknown-HeadersNc                 X   t          | |          \  }}	 t          j        d|d          \  }}}|                     d|           |                     d|           |                     d|           n# t          $ r Y nw xY w|r|dt          |                    | _        n|| _        |S )z6From the HTTP packet string, populate the scapy object   \s+r   maxsplitr   r   Http_VersionNrp   rerP   rj   rQ   r_   r   )r   rS   rc   rb   r   r   HTTPVersions          rF   
do_dissectzHTTPRequest.do_dissect  s    +D!44
D	(**q(Q(Q(Q%FD+Xv...VT***^[9999 	 	 	D	 	&$%kD		zkND!!$%D!   AA3 3
B ?B c                 ,    |                      d          S )Nz*%HTTPRequest.Method% '%HTTPRequest.Path%' sprintfr   s    rF   	mysummaryzHTTPRequest.mysummary   s    ||8
 
 	
rH   )r   r   r   rE   r   r   GENERAL_HEADERSREQUEST_HEADERS!COMMON_UNSTANDARD_GENERAL_HEADERS!COMMON_UNSTANDARD_REQUEST_HEADERSrg   r   r  rv   rH   rF   r   r     s        D 	5))%%44	 	--		
 	
 	*D11	K"   
 
 
 
 
rH   r   c                       e Zd ZdZ edd           edd           edd          g eeeee	          z    edd	          gz   Z
d
 Zd Zd Zd	S )r   zHTTP Responser   r   zStatus-Code200zReason-PhraseOKr   Nc                     t           |v S N)r   )r   others     rF   answerszHTTPResponse.answers9  s    e##rH   c                 X   t          | |          \  }}	 t          j        d|d          \  }}}|                     d|           |                     d|           |                     d|           n# t          $ r Y nw xY w|r|dt          |                    | _        n|| _        |S )z8 From the HTTP packet string, populate the scapy object r   r   r   r   Status_CodeReason_PhraseNr   )r   rS   rc   rb   r   r?   Reasons          rF   r   zHTTPResponse.do_dissect<  s    +D!44
D	*,(7JQR*S*S*S'K^[999]F333_f5555 	 	 	D	 	&$%kD		zkND!!$%D!r   c                 ,    |                      d          S )Nz7%HTTPResponse.Status_Code% %HTTPResponse.Reason_Phrase%r   r   s    rF   r  zHTTPResponse.mysummaryL  s    ||E
 
 	
rH   )r   r   r   rE   r   r   r  RESPONSE_HEADERSr  "COMMON_UNSTANDARD_RESPONSE_HEADERSrg   r  r   r  rv   rH   rF   r   r   &  s        D 	44..$//	 	-.		
 	
 	*D11	K"$ $ $   
 
 
 
 
rH   r   c                       e Zd ZdZg ZdZeZeZ	dZ
d                    g d          Zed
d            Zed             Zd	 ZdS )r   zHTTP 1r   s   HTTP   |)s   OPTIONSs   GETs   HEADs   POSTs   PUTs   DELETEs   TRACE   CONNECTNc                    |rt          |          dk    rddlm}m} |rt          |          dk     r| S t	          |dd                   |vr| S t          j        dd|d d         z             d         dz   }|t          |          k    r| S t          j        d|dd                   d         }|d	z	  dk    r| S ||d          }||S | S )
N	   r   )_HTTP2_typesr   r      z!I          )r_   r   r  r   ordstructunpack)cls_pktr   kargsr  r   r   sids           rF   dispatch_hookzHTTP.dispatch_hookf  s     	CIINNAAAAAAAA  %t99q==JtAaCy>>55JtUT"1"X-=>>qAAECII%%JmD$qs)44Q7"9>>JFGG}  %  N
rH   c                 @  
                      dd           }                     dd          }|r|rQdd<    | |          }t          |j        t                    s|S t          |j        | j                  }|j        |r8|                    d          r#|t                                                   sd }nMt                    |j        j        sdk    r#t          |          |j        j        z
  

fd}npd	 }dd<   ng||          j                                        }d
|v }	|	rd }n>t          |j        | j                  r	d }dd<   n|r|j        dk    rd }n
fd}dd<   |d<    ||          r|S d S  ||          r | |          }|S d S )N
detect_enddetect_unknownTFr\   c                     dS )NTrv   )rB   s    rF   <lambda>z%HTTP.tcp_reassemble.<locals>.<lambda>  s    t rH   r   c                 0    t          |           z
  k    S r
  )r_   )dathttp_lengthr   s    rF   r*  z%HTTP.tcp_reassemble.<locals>.<lambda>  s    SXX-Cv-M rH   c                     dS NFrv   r,  s    rF   r*  z%HTTP.tcp_reassemble.<locals>.<lambda>  s    U rH   r   c                 ,    |                      d          S )Ns   0

endswithr0  s    rF   r*  z%HTTP.tcp_reassemble.<locals>.<lambda>  s    S\\,-G-G rH   c                 ,    |                      d          S Nr\   r2  r0  s    rF   r*  z%HTTP.tcp_reassemble.<locals>.<lambda>  s    S\\+-F-F rH   s   101c                 ,    |                      d          S r5  )r^   r0  s    rF   r*  z%HTTP.tcp_reassemble.<locals>.<lambda>  s    SXXk-B-B rH   c                 0                         dd          S )Ntcp_endF)get)r,  metadatas    rF   r*  z%HTTP.tcp_reassemble.<locals>.<lambda>  s    X\\)U-K-K rH   )r9  r~   r   rr   clsrespr   r3  r   r   r   r_   rs   clsreqr  )r!  r   r:  rB   r'  
is_unknownhttp_packetis_responser   r   r-  r   s     `       @@rF   tcp_reassemblezHTTP.tcp_reassemble  s=   \\,55
\\"2D99
  >	#Z >	#).H%&#d))Kk1<@@ #""$[%8#+FFK /F
 +6k**+6  -<<>>+6
 ,^

# V&. 6&A++"%d))k.A.O"OK!M!M!M!M!MJJ "3!2J15H-.. (,4CCEE	$	1 6!G!GJJ   3SZ@@ 6!F!FJ 26H-..  
6[%<%F%F "C!BJJ
 "L!K!K!KJ15H-.%/H\"z$ #""# # z$ #!c$ii""# #rH   c                    	 t          j        d| j        z   dz   dz   | j        z   dz             }|                    d          }|d|         }|                    |          }|r| j        S t          j        d| j        z   dz             }|                    |          }|r| j        S n# t          $ r Y nw xY wt          S )	zZDecides if the payload is an HTTP Request or Response, or
        something else.
        s   ^(?:s   ) s   (?:.+?) s   /\d\.\d$rM   N   ^s   /\d\.\d \d\d\d .*$)
r   compile
reqmethodshdrindexmatchr<  r;  rQ   r   )r   r   prog	crlfIndexreqresults         rF   r   zHTTP.guess_payload_class  s    	:4?*V3'( D
  g..I*9*%CZZ__F ({"z$/4J"JKKC (<'( 	 	 	D	 
s   A)B* ,<B* *
B76B7r
  )r   r   r   rE   rg   show_indentr   r<  r   r;  rE  joinrD  classmethodr%  r@  r   rv   rH   rF   r   r   T  s        DKKFG
C 	 	 	 	 	J    [2 C# C# [C#J    rH   r   c                       e Zd ZdZdZdZdZdS )HTTP_AUTH_MECHSNONEBasicNTLM	NegotiateN)r   r   r   rQ  BASICrS  	NEGOTIATErv   rH   rF   rP  rP    s"        DEDIIIrH   rP  c                   J    e Zd ZdZej        ddddfdZddZd Zdd
Z	d Z
dS )HTTP_Clientz
    A basic HTTP client

    :param mech: one of HTTP_AUTH_MECHS
    :param ssl: whether to use HTTPS or not
    :param ssp: the SSP object to use for binding
    TNFc                 v    d | _         d | _        || _        || _        || _        || _        d | _        || _        d S r
  )sock	_sockinfo
authmethodverb
sslcontextssp
sspcontextno_check_certificate)r   mechr]  r^  r_  ra  s         rF   r   zHTTP_Client.__init__  sC     		$$8!!!rH   r  c           	         ||rdnd}| j         ||fk    rd S | j         r|                                  t          j                    }|                    t          j        t          j        d           |                    |           | j        rt          d|d||rdndd           |	                    ||f           | j        rNt          t          j                            d	t          |                                          z                       |r| j        R| j        r7t#          j        t"          j                  }d
|_        t"          j        |_        nt#          j                    }n| j        }|                    ||          }t3          |t4                    | _        nt9          |t4                    | _        ||f| _         d S )N  P   rO   u   ┃ Connecting to z	 on port z	 with SSL z...u   └ Connected from %sF)server_hostname)r[  closesocket
setsockopt
SOL_SOCKETSO_KEEPALIVE
settimeoutr]  printconnectr   color_themegreenreprgetsocknamer^  ra  ssl
SSLContextPROTOCOL_TLS_CLIENTcheck_hostname	CERT_NONEverify_modecreate_default_contextwrap_socketr   r   rZ  r   )r   hostporttlstimeoutrZ  contexts          rF   _connect_or_reusezHTTP_Client._connect_or_reuse  s   <%332D>dD\))F> 	JJLLL})6+>BBB   9 	E DDD#&.KKB..	   	dD\"""9 	 &&.d6F6F6H6H1I1II   
  	1&, ;!nS-DEEG-2G**--G''!8::GG/&&tT&BBD'd33DII$T400DIrH   c                 r   | j         rAt          t          j                            d|                                z                        | j        j        t                      |z  fddi|}| j         rCt          t          j        	                    d|o|                                z                       |S )Nz>> %sverboser   z<< %s)
r]  rn  r   rp  openingsummaryrZ  sr1r   success)r   rJ  r   resps       rF   r  zHTTP_Client.sr1/  s    9 	E$"**7S[[]]+BCCDDDty}FFSL
 

 
 

 9 	 ((t67   
 rH   rH   c                    t          j        d|          }|st          d          |                                \  }}}	}
|dk    rd}nd}|
pd}
|	ot	          |	          }	|                     ||	||           dd	d	d
||
d}|                    |           t                      t          di |z  }|r||z  }	 | 	                    |          }|sn|j
        dv rP| j        t          j        t          j        fv r0d|j        v r^|j                            dd          \  }}	 t#          t%          j        |                    }n&# t(          $ r t+          d          w xY w|j        }d}t-          |          | j        j        k    rt+          d          | j                            | j        |d          \  | _        }}|t6          t8          fvrt+          d          | j        j                                        dz   t%          j        t?          |                    z   |_         t|j
        dv r+|r) | j!        |j"        #                                f|||d|S 	 |S )z,
        Perform a HTTP(s) request.
        z)(https?)://([^/:]+)(?:\:(\d+))?(?:/(.*))?z	Bad URL !httpsTFr   )r}  r~  r  s   gzip, deflates   no-caches
   keep-alive)Accept_EncodingCache_Controlr"   r   r,   r   )   401   407r   rO   zInvalid WWW-AuthenticateNr   )	req_flagszAuthentication failure)s   301s   302)r   r  follow_redirectsrv   )$r   rG  rQ   groupsr   r  updater   r   r  r  r\  rP  rS  rV  WWW_AuthenticaterP   r   base64	b64decoder   r   r   rX   r_  GSS_Init_sec_contextr`  r   r   encode	b64encoder   r'   requestr8   r   )r   urlr   r  r  rT   m	transportr|  r}  pathr~  http_headersrJ  r  methodssp_blobtokenstatuss                      rF   r  zHTTP_Client.request?  s   
 HA3GG 	*[)))&'hhjj#	4tCCC{s!D		 	t$CIII  0(!'
 
 	G$$$ff{22\222 	4KC.	88C==D #333?#(#-'  
 t444'+'<'B'B4'K'KN'263CD3I3I'J'JHH( N N N"12L"M"MMN "&!6#' ((DO,AAA-.HIII59X5R5R "# 6S 6 62DOUF
 n6K%LLL-.FGGG-4466=(u667 % #3338H3#t|M((**#%5	 
    s   %!E E!c                     | j         r;t          dt          | j        j                                                  z             | j                                         d S )NzX Connection to %s closed
)r]  rn  rr  rZ  insgetpeernamerh  r   s    rF   rh  zHTTP_Client.close  sQ    9 	U/$ty}7P7P7R7R2S2SSTTT	rH   )NFr  )rH   r  T)r   r   r   r   rP  rQ  r   r  r  r  rh  rv   rH   rF   rX  rX    s          !"9 9 9 9",& ,& ,& ,&\   Q Q Q Qf    rH   rX  r   r   c           	      j   t          t          j        |          }||rdnd}|                    d|rdpdd| d	|||
          }	|	r|rt          |	vrt          d           |	S t          d          }
t          |
d          5 }|                    |	j	                   ddd           n# 1 swxY w Y   t          rt          j        |
           n[t          t          j        j                  5  t#          j        t          j        j        |
g           ddd           n# 1 swxY w Y   |	S dS )a  
    Util to perform an HTTP request.

    :param host: the host to connect to
    :param path: the path of the request (default /)
    :param port: the port (default 80/443)
    :param timeout: timeout before None is returned
    :param display: display the result in the default browser (default False)
    :param iface: interface to use. Changing this turns on "raw"
    :param headers: any additional headers passed to the request

    :returns: the HTTPResponse packet
    )r]  Nrd  re  r   rS   rf  z://:)r  z(No HTTP content returned. Cannot displayz.html)autoextwb)rX  rP  rQ  r  r   r
   r   openwriter   r	   os	startfiler   r   rH  universal_open
subprocessPopen)r|  r  r}  r  displayr~  r  rT   clientansfilefds               rF   http_requestr    s    -G<<<F|!ssr
...!kc/R//ttTTB   C
   	G#~~BCCC
 111DdD!! #R"""# # # # # # # # # # # # # # #  GT""""-di.FGG G G$di&>%EFFFG G G G G G G G G G G G G G G
 s$   B//B36B34&D&&D*-D*re  )sport)dport)r  r  i  c                      e Zd ZdZeZej        ddfdZd Z	ddZ
 ej        d	          d
             Z ej        ed          d             Z ej                    d             Z ej                    d             Z ej        e          d             Zd Z ej        ed          d             Z ej        e          d             Z ej        d          d             Z ej        d          d             Z ej                    dd            Z ej        e          d             Z ej        e          d             Zd ZdS )HTTP_Serverab  
    HTTP server automaton

    :param ssp: the SSP to serve. If None, unauthenticated (or basic).
    :param mech: the HTTP_AUTH_MECHS to use (default: NONE)

    Other parameters:

    :param BASIC_IDENTITIES: a dict that contains {"user": "password"} for Basic
                             authentication.
    :param BASIC_REALM: the basic realm.
    TNc                    || _         d|vrt          d          || _        |j        | _        d | _        d| _        |                    di           | _        |                    dd          | _	        |t          j        k    r/| j        st          d          |t          d          d	| _        n!|t          j        k    r|t          d
          t          j        | g|R i | d S )NrZ  z>HTTP_Server cannot be started directly ! Use HTTP_Server.spawnFBASIC_IDENTITIESBASIC_REALMr   z#Please provide 'BASIC_IDENTITIES' !z)Can't use 'BASIC_IDENTITIES' with 'ssp' !TzCannot use ssp with mech=NONE !)r]  rQ   r_  rX   r\  r`  basicrh   r  r  rP  rU  rQ  r   r   )r   rb  r]  r_  r   r   s         rF   r   zHTTP_Server.__init__  s    	P   *
 &

+=r B B!::mY???(((( H !FGGG !LMMMDJJ_))) !BCCC41$111&11111rH   c                 X    | j                             t                      |z             d S r
  )rZ  sendr   )r   r  s     rF   r  zHTTP_Server.send  s$    	tvv}%%%%%rH   rf  c                     | j         r7t          j        rt          j        d|           dS t          d|z             dS dS )z,
        Verbose print (if enabled)
        z> %sN)r]  r   interactiver   r   rn  )r   rS   s     rF   vprintzHTTP_Server.vprint   sT     9 	" "$VQ/////fqj!!!!!		" 	"rH   rO   )initialc                 "    d| _         d | _        d S r/  )authenticatedr`  r   s    rF   BEGINzHTTP_Server.BEGIN
  s    "rH   r   )prioc                     | j         t          j        j        k    r|                                 |                                 r
  )r\  rP  rQ  rX   SERVEAUTHr   s    rF   should_authenticatezHTTP_Server.should_authenticate  s1    ?o2888**,,))++rH   c                     d S r
  rv   r   s    rF   r  zHTTP_Server.AUTH  s    rH   c                 t    d | _         |                     || j                   |                     d           d S )Nz
AUTH ERROR)r`  _ask_authorizationr\  r  )r   proxys     rF   
AUTH_ERRORzHTTP_Server.AUTH_ERROR  s9    t777L!!!!!rH   c                 *    |                                  r
  )r  r   s    rF   allow_reauthzHTTP_Server.allow_reauth   s    iikkrH   c                     |r'|                      t          dd|                     d S |                      t          dd|                     d S )Nr  s   Proxy Authentication Required)r  r  Proxy_Authenticater  s   Unauthorized)r  r  r  r  r   )r   r  r   s      rF   r  zHTTP_Server._ask_authorization$  s     	II &"B'+       II &"1%)      rH   c                 h   t           |v r|                     |                                           |j        dk    rd}nd}|r|j        }n|j        }|s3| j        | j        rd| j        z  z  | 	                    |           d S |
                    dd          \  }t          |          | j        k    r|                     |          	 t          j                  n## t          $ r |                     |          w xY w| j        s	 t!                    }nE# t          $ r8 d | _        | 	                    || j                   |                     |          w xY w| j                            | j        |          \  | _        }}nV	 t)          fd| j                                        D                        d t.          }}n# t0          $ r d t2          }}Y nw xY w|t.          t4          fvr|                     |          |t4          k    rl| j                                        |r'dt          j        t;          |                    z   z  | 	                    |           |                                 d| _        |                     d           |                      |          d S )	Nr  TFz realm='%s'r   rO   c              3   \   K   | ]&\  }}|d |                                 k    "dV  'dS )r  TN)r  )ry   kvr   s      rF   	<genexpr>z7HTTP_Server.received_unauthenticated.<locals>.<genexpr>c  sU         Aq'(qq!!,4466$>> >>>> rH   zAUTH OK)!r   r  r  r   Proxy_Authorizationr'   r\  r  r  r  rP   r   r  r  r  r   r   r`  r_  GSS_Accept_sec_contextnextr  r   r   StopIterationr   r   r  r  r   r  r  r  )	r   r   r  authorizationr  r  tokr  r   s	           @rF   received_unauthenticatedz$HTTP_Server.received_unauthenticated6  s   #KK&&&zZ''  2 # 7 # 1  : =MD,<<<D''t444(..tQ77LFD  DO33ooe,,,-'-- - - -ooe,,,- : 61*400HH  1 1 1&*DO++E4?CCC//%0001
 04x/N/NOX0 0,ff
6    $($9$?$?$A$A     
 #'CC$ 6 6 6"&CCC6 n.CDDDooe,,,000--// @D6#3E#JJ#?#???D''t444iikk! &*"I&&&jjoo%A s+   C% % DD   AE";G G"!G"c                 *    |                                  r
  CLOSEDr   s    rF   auth_eofzHTTP_Server.auth_eofz      kkmmrH   )errorc                 N    |                      t          dd                     d S )N400zBad Requestr  r  r  r   s    rF   ERRORzHTTP_Server.ERROR~  s:    		!+  	
 	
 	
 	
 	
rH   )finalc                 0    |                      d           d S )Nr  )r  r   s    rF   r  zHTTP_Server.CLOSED  s    HrH   c                 :   |d S |                      |          }|rU|                     |           |                     |                                d|                                           d S |                     d|                                z             d S )Nz -> z%s)answerr  r  r  )r   r   r  s      rF   r  zHTTP_Server.SERVE  s    ;FS!! 	.IIfKKckkmmmmV^^5E5E5EFGGGGGKKs{{}},-----rH   c                 *    |                                  r
  r  r   s    rF   	serve_eofzHTTP_Server.serve_eof  r  rH   c                 ,    |                      |          r
  )r  r   r   s     rF   new_requestzHTTP_Server.new_request  s    jjoorH   c                 b    |j         dk    rt                      dz  S t          dd          dz  S )z
        HTTP_server answer function.

        :param pkt: a HTTPRequest packet
        :returns: a HTTPResponse packet
           /z4<!doctype html><html><body><h1>OK</h1></body></html>s   404s	   Not Foundr  zA<!doctype html><html><body><h1>404 - Not Found</h1></body></html>)r   r   r  s     rF   r  zHTTP_Server.answer  sO     8t>>F   "*   T	 rH   )rf  r
  )r   r   r   r   r   pkt_clsrP  rQ  r   r  r  r   stater  	conditionr  r  r  r  r  receive_conditionr  eofr  r  r  r  r  r  r  rv   rH   rF   r  r    sq         G !	2 2 2 2>& & &" " " " TZ   T^E"""  #" TZ\\  \ TZ\\" " \"
 T^J     $ TDq)))A& A& *)A&F TXd^^  ^ TZa
 
 
 TZa  
 TZ\\. . . \. TXe__  _ TE""  #"
    rH   r  c                   >     e Zd ZdZdZej        dddddf fd	Z xZS )HTTPS_Servera0  
    HTTPS server automaton

    This has the same arguments and attributes as HTTP_Server, with the addition of:

    :param sslcontext: an optional SSLContext object.
                       If used, cert and key are ignored.
    :param cert: path to the certificate
    :param key: path to the key
    NTc                 N   d|vrt          d          |5t          j        t          j                  }	|	                    ||           n|}	t          |	                    |d         d          | j                  |d<    t          t          |           j
        ||||d| d S )NrZ  z@HTTPS_Server cannot be started directly ! Use HTTPS_Server.spawnT)server_side)rb  r]  r_  )rQ   rt  ru  PROTOCOL_TLS_SERVERload_cert_chainr   r{  r  r   r  r   )r   rb  r]  certrW   r^  r_  r   r   r  r   s             rF   r   zHTTPS_Server.__init__  s     R   nS%<==G##D#.... G(vDAAL
 
v 	+lD!!*  	
 	

 	
 	
 	
 	
 	
rH   )	r   r   r   r   	socketclsrP  rQ  r   r   r   s   @rF   r  r    se        	 	 I !
 
 
 
 
 
 
 
 
 
rH   r  )r   Nr   FFr   )Or   r  r   r   r   r  r   ri  rt  r  r  enumr   scapy.compatr   r   scapy.automatonr   r   scapy.configr   scapy.constsr	   scapy.errorr
   r   r   r   scapy.fieldsr   scapy.packetr   r   r   r   scapy.supersocketr   r   scapy.utilsr   r   scapy.layers.gssapir   r   r   r   scapy.layers.inetr   r   r   ImportErrorr   r   r   r   r   r  r  r  r  r  r  rG   rK   rZ   rd   rp   rr   r   r   r   r   r   rP  objectrX  r  r  r  rv   rH   rF   <module>r     s  " "P    				 				 				  



            0 0 0 0 0 0 0 0 + + + + + + + +                   N N N N N N N N N N N N ! ! ! ! ! ! A A A A A A A A A A A A ; ; ; ; ; ; ; ; ? ? ? ? ? ? ? ?            " ! ! ! ! !!MMM ! ! ! !JJJ       
DM&04DM&,-*.DM&,'    % !
  <% % % !"% % % N& & & ""5 5 5: : :
 
 
= = =$  (xF xF xF xF xF6 xF xF xFv    x   
 
 
&
 &
 &
 &
 &
, &
 &
 &
R)
 )
 )
 )
 )
< )
 )
 )
\I I I I I6 I I IX    d   n n n n n& n n nb 5634& & & &X sD # # # # sD # # # # CRr * * * * sD % % % % sD % % % %
e e e e e) e e eP-
 -
 -
 -
 -
; -
 -
 -
 -
 -
s6   B BB#B* *B43B48B? ?C	C	