scapy.layers.http
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)
- class scapy.layers.http.HTTP(_pkt, /)[source]
Bases:
Packet- aliastypes = [<class 'scapy.layers.http.HTTP'>, <class 'scapy.packet.Packet'>]
- clsreq[source]
alias of
HTTPRequest
- clsresp[source]
alias of
HTTPResponse
- guess_payload_class(payload)[source]
Decides if the payload is an HTTP Request or Response, or something else.
- hdr = b'HTTP'
- reqmethods = b'OPTIONS|GET|HEAD|POST|PUT|DELETE|TRACE|CONNECT'
- show_indent = 0
- class scapy.layers.http.HTTPRequest(_pkt, /, *, Method=b'GET', Path=b'/', Http_Version=b'HTTP/1.1', A_IM=None, Accept=None, Accept_Charset=None, Accept_Datetime=None, Accept_Encoding=None, Accept_Language=None, Access_Control_Request_Headers=None, Access_Control_Request_Method=None, Authorization=None, Cache_Control=None, Connection=None, Content_Length=None, Content_MD5=None, Content_Type=None, Cookie=None, DNT=None, Date=None, Expect=None, Forwarded=None, From=None, Front_End_Https=None, HTTP2_Settings=None, Host=None, If_Match=None, If_Modified_Since=None, If_None_Match=None, If_Range=None, If_Unmodified_Since=None, Keep_Alive=None, Max_Forwards=None, Origin=None, Permanent=None, Pragma=None, Proxy_Authorization=None, Proxy_Connection=None, Range=None, Referer=None, Save_Data=None, TE=None, Upgrade=None, Upgrade_Insecure_Requests=None, User_Agent=None, Via=None, Warning=None, X_ATT_DeviceId=None, X_Correlation_ID=None, X_Csrf_Token=None, X_Forwarded_For=None, X_Forwarded_Host=None, X_Forwarded_Proto=None, X_Http_Method_Override=None, X_Request_ID=None, X_Requested_With=None, X_UIDH=None, X_Wap_Profile=None, Unknown_Headers=None)[source]
Bases:
_HTTPContent- aliastypes = [<class 'scapy.layers.http.HTTPRequest'>, <class 'scapy.layers.http._HTTPContent'>, <class 'scapy.packet.Packet'>]
- fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<_HTTPHeaderField (HTTPRequest).Method>, <_HTTPHeaderField (HTTPRequest).Path>, <_HTTPHeaderField (HTTPRequest).Http_Version>, <_HTTPHeaderField (HTTPRequest).A_IM>, <_HTTPHeaderField (HTTPRequest).Accept>, <_HTTPHeaderField (HTTPRequest).Accept_Charset>, <_HTTPHeaderField (HTTPRequest).Accept_Datetime>, <_HTTPHeaderField (HTTPRequest).Accept_Encoding>, <_HTTPHeaderField (HTTPRequest).Accept_Language>, <_HTTPHeaderField (HTTPRequest).Access_Control_Request_Headers>, <_HTTPHeaderField (HTTPRequest).Access_Control_Request_Method>, <_HTTPHeaderField (HTTPRequest).Authorization>, <_HTTPHeaderField (HTTPRequest).Cache_Control>, <_HTTPHeaderField (HTTPRequest).Connection>, <_HTTPHeaderField (HTTPRequest).Content_Length>, <_HTTPHeaderField (HTTPRequest).Content_MD5>, <_HTTPHeaderField (HTTPRequest).Content_Type>, <_HTTPHeaderField (HTTPRequest).Cookie>, <_HTTPHeaderField (HTTPRequest).DNT>, <_HTTPHeaderField (HTTPRequest).Date>, <_HTTPHeaderField (HTTPRequest).Expect>, <_HTTPHeaderField (HTTPRequest).Forwarded>, <_HTTPHeaderField (HTTPRequest).From>, <_HTTPHeaderField (HTTPRequest).Front_End_Https>, <_HTTPHeaderField (HTTPRequest).HTTP2_Settings>, <_HTTPHeaderField (HTTPRequest).Host>, <_HTTPHeaderField (HTTPRequest).If_Match>, <_HTTPHeaderField (HTTPRequest).If_Modified_Since>, <_HTTPHeaderField (HTTPRequest).If_None_Match>, <_HTTPHeaderField (HTTPRequest).If_Range>, <_HTTPHeaderField (HTTPRequest).If_Unmodified_Since>, <_HTTPHeaderField (HTTPRequest).Keep_Alive>, <_HTTPHeaderField (HTTPRequest).Max_Forwards>, <_HTTPHeaderField (HTTPRequest).Origin>, <_HTTPHeaderField (HTTPRequest).Permanent>, <_HTTPHeaderField (HTTPRequest).Pragma>, <_HTTPHeaderField (HTTPRequest).Proxy_Authorization>, <_HTTPHeaderField (HTTPRequest).Proxy_Connection>, <_HTTPHeaderField (HTTPRequest).Range>, <_HTTPHeaderField (HTTPRequest).Referer>, <_HTTPHeaderField (HTTPRequest).Save_Data>, <_HTTPHeaderField (HTTPRequest).TE>, <_HTTPHeaderField (HTTPRequest).Upgrade>, <_HTTPHeaderField (HTTPRequest).Upgrade_Insecure_Requests>, <_HTTPHeaderField (HTTPRequest).User_Agent>, <_HTTPHeaderField (HTTPRequest).Via>, <_HTTPHeaderField (HTTPRequest).Warning>, <_HTTPHeaderField (HTTPRequest).X_ATT_DeviceId>, <_HTTPHeaderField (HTTPRequest).X_Correlation_ID>, <_HTTPHeaderField (HTTPRequest).X_Csrf_Token>, <_HTTPHeaderField (HTTPRequest).X_Forwarded_For>, <_HTTPHeaderField (HTTPRequest).X_Forwarded_Host>, <_HTTPHeaderField (HTTPRequest).X_Forwarded_Proto>, <_HTTPHeaderField (HTTPRequest).X_Http_Method_Override>, <_HTTPHeaderField (HTTPRequest).X_Request_ID>, <_HTTPHeaderField (HTTPRequest).X_Requested_With>, <_HTTPHeaderField (HTTPRequest).X_UIDH>, <_HTTPHeaderField (HTTPRequest).X_Wap_Profile>, <_HTTPHeaderField (HTTPRequest).Unknown_Headers>]
- class scapy.layers.http.HTTPResponse(_pkt, /, *, Http_Version=b'HTTP/1.1', Status_Code=b'200', Reason_Phrase=b'OK', Accept_Patch=None, Accept_Ranges=None, Access_Control_Allow_Credentials=None, Access_Control_Allow_Headers=None, Access_Control_Allow_Methods=None, Access_Control_Allow_Origin=None, Access_Control_Expose_Headers=None, Access_Control_Max_Age=None, Age=None, Allow=None, Alt_Svc=None, Cache_Control=None, Connection=None, Content_Disposition=None, Content_Encoding=None, Content_Language=None, Content_Length=None, Content_Location=None, Content_MD5=None, Content_Range=None, Content_Security_Policy=None, Content_Type=None, Date=None, Delta_Base=None, ETag=None, Expires=None, IM=None, Keep_Alive=None, Last_Modified=None, Link=None, Location=None, P3P=None, Permanent=None, Pragma=None, Proxy_Authenticate=None, Public_Key_Pins=None, Refresh=None, Retry_After=None, Server=None, Set_Cookie=None, Status=None, Strict_Transport_Security=None, Timing_Allow_Origin=None, Tk=None, Trailer=None, Transfer_Encoding=None, Upgrade=None, Vary=None, Via=None, WWW_Authenticate=None, Warning=None, X_Content_Duration=None, X_Content_Security_Policy=None, X_Content_Type_Options=None, X_Correlation_ID=None, X_Frame_Options=None, X_Powered_By=None, X_Request_ID=None, X_UA_Compatible=None, X_WebKit_CSP=None, X_XSS_Protection=None, Unknown_Headers=None)[source]
Bases:
_HTTPContent- aliastypes = [<class 'scapy.layers.http.HTTPResponse'>, <class 'scapy.layers.http._HTTPContent'>, <class 'scapy.packet.Packet'>]
- fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<_HTTPHeaderField (HTTPResponse).Http_Version>, <_HTTPHeaderField (HTTPResponse).Status_Code>, <_HTTPHeaderField (HTTPResponse).Reason_Phrase>, <_HTTPHeaderField (HTTPResponse).Accept_Patch>, <_HTTPHeaderField (HTTPResponse).Accept_Ranges>, <_HTTPHeaderField (HTTPResponse).Access_Control_Allow_Credentials>, <_HTTPHeaderField (HTTPResponse).Access_Control_Allow_Headers>, <_HTTPHeaderField (HTTPResponse).Access_Control_Allow_Methods>, <_HTTPHeaderField (HTTPResponse).Access_Control_Allow_Origin>, <_HTTPHeaderField (HTTPResponse).Access_Control_Expose_Headers>, <_HTTPHeaderField (HTTPResponse).Access_Control_Max_Age>, <_HTTPHeaderField (HTTPResponse).Age>, <_HTTPHeaderField (HTTPResponse).Allow>, <_HTTPHeaderField (HTTPResponse).Alt_Svc>, <_HTTPHeaderField (HTTPResponse).Cache_Control>, <_HTTPHeaderField (HTTPResponse).Connection>, <_HTTPHeaderField (HTTPResponse).Content_Disposition>, <_HTTPHeaderField (HTTPResponse).Content_Encoding>, <_HTTPHeaderField (HTTPResponse).Content_Language>, <_HTTPHeaderField (HTTPResponse).Content_Length>, <_HTTPHeaderField (HTTPResponse).Content_Location>, <_HTTPHeaderField (HTTPResponse).Content_MD5>, <_HTTPHeaderField (HTTPResponse).Content_Range>, <_HTTPHeaderField (HTTPResponse).Content_Security_Policy>, <_HTTPHeaderField (HTTPResponse).Content_Type>, <_HTTPHeaderField (HTTPResponse).Date>, <_HTTPHeaderField (HTTPResponse).Delta_Base>, <_HTTPHeaderField (HTTPResponse).ETag>, <_HTTPHeaderField (HTTPResponse).Expires>, <_HTTPHeaderField (HTTPResponse).IM>, <_HTTPHeaderField (HTTPResponse).Keep_Alive>, <_HTTPHeaderField (HTTPResponse).Last_Modified>, <_HTTPHeaderField (HTTPResponse).Link>, <_HTTPHeaderField (HTTPResponse).Location>, <_HTTPHeaderField (HTTPResponse).P3P>, <_HTTPHeaderField (HTTPResponse).Permanent>, <_HTTPHeaderField (HTTPResponse).Pragma>, <_HTTPHeaderField (HTTPResponse).Proxy_Authenticate>, <_HTTPHeaderField (HTTPResponse).Public_Key_Pins>, <_HTTPHeaderField (HTTPResponse).Refresh>, <_HTTPHeaderField (HTTPResponse).Retry_After>, <_HTTPHeaderField (HTTPResponse).Server>, <_HTTPHeaderField (HTTPResponse).Set_Cookie>, <_HTTPHeaderField (HTTPResponse).Status>, <_HTTPHeaderField (HTTPResponse).Strict_Transport_Security>, <_HTTPHeaderField (HTTPResponse).Timing_Allow_Origin>, <_HTTPHeaderField (HTTPResponse).Tk>, <_HTTPHeaderField (HTTPResponse).Trailer>, <_HTTPHeaderField (HTTPResponse).Transfer_Encoding>, <_HTTPHeaderField (HTTPResponse).Upgrade>, <_HTTPHeaderField (HTTPResponse).Vary>, <_HTTPHeaderField (HTTPResponse).Via>, <_HTTPHeaderField (HTTPResponse).WWW_Authenticate>, <_HTTPHeaderField (HTTPResponse).Warning>, <_HTTPHeaderField (HTTPResponse).X_Content_Duration>, <_HTTPHeaderField (HTTPResponse).X_Content_Security_Policy>, <_HTTPHeaderField (HTTPResponse).X_Content_Type_Options>, <_HTTPHeaderField (HTTPResponse).X_Correlation_ID>, <_HTTPHeaderField (HTTPResponse).X_Frame_Options>, <_HTTPHeaderField (HTTPResponse).X_Powered_By>, <_HTTPHeaderField (HTTPResponse).X_Request_ID>, <_HTTPHeaderField (HTTPResponse).X_UA_Compatible>, <_HTTPHeaderField (HTTPResponse).X_WebKit_CSP>, <_HTTPHeaderField (HTTPResponse).X_XSS_Protection>, <_HTTPHeaderField (HTTPResponse).Unknown_Headers>]
- class scapy.layers.http.HTTPS_Server(self, debug: int = 0, store: int = 0, session: Any = None, **kargs: Any)[source]
Bases:
HTTP_ServerHTTPS server automaton
This has the same arguments and attributes as HTTP_Server, with the addition of:
- Parameters:
sslcontext – an optional SSLContext object. If used, key is ignored but cert can still be used for channel bindings.
cert – path to the certificate
key – path to the key
require_cbt – require Channel Bindings to be valid
- actions: Dict[str, List[_StateWrapper]] = {'allow_reauth': [], 'auth_eof': [], 'new_request': [], 'received_unauthenticated': [], 'serve_eof': [], 'should_authenticate': []}
- conditions: Dict[str, List[_StateWrapper]] = {'AUTH': [], 'AUTH_ERROR': [<function HTTP_Server.allow_reauth>], 'BEGIN': [], 'CLOSED': [], 'ERROR': [], 'SERVE': []}
- eofs: Dict[str, _StateWrapper] = {'AUTH': <function HTTP_Server.auth_eof>, 'SERVE': <function HTTP_Server.serve_eof>}
- initial_states: List[_StateWrapper] = [<function ATMT.state.<locals>.deco.<locals>._state_wrapper>]
- ioevents: Dict[str, List[_StateWrapper]] = {'AUTH': [], 'AUTH_ERROR': [], 'BEGIN': [], 'CLOSED': [], 'ERROR': [], 'SERVE': []}
- ionames: List[str] = []
- iosupersockets: List[SuperSocket] = []
- recv_conditions: Dict[str, List[_StateWrapper]] = {'AUTH': [<function HTTP_Server.received_unauthenticated>], 'AUTH_ERROR': [], 'BEGIN': [<function HTTP_Server.should_authenticate>], 'CLOSED': [], 'ERROR': [], 'SERVE': [<function HTTP_Server.new_request>]}
- socketcls = None
- states: Dict[str, _StateWrapper] = {'AUTH': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>, 'AUTH_ERROR': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>, 'BEGIN': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>, 'CLOSED': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>, 'ERROR': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>, 'SERVE': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>}
- stop_state: _StateWrapper | None = None
- timeout: Dict[str, _TimerList] = {'AUTH': [], 'AUTH_ERROR': [], 'BEGIN': [], 'CLOSED': [], 'ERROR': [], 'SERVE': []}
- class scapy.layers.http.HTTP_AUTH_MECHS(*values)[source]
Bases:
Enum- BASIC = 'Basic'
- NEGOTIATE = 'Negotiate'
- NONE = 'NONE'
- NTLM = 'NTLM'
- class scapy.layers.http.HTTP_Client(mech=HTTP_AUTH_MECHS.NONE, verb=True, sslcontext=None, ssp=None, no_check_certificate=False, no_chan_bindings=False)[source]
Bases:
objectA basic HTTP client
- Parameters:
mech – one of HTTP_AUTH_MECHS
ssl – whether to use HTTPS or not
ssp – the SSP object to use for binding
no_check_certificate – with SSL, do not check the certificate
no_chan_bindings – force disable sending the channel bindings
- request(url, data=b'', timeout=5, follow_redirects=True, http_headers={}, **headers)[source]
Perform a HTTP(s) request.
- Parameters:
url – the full URL to connect to. e.g. https://google.com/test
data – the data to send as payload
follow_redirects – if True, request() will follow 302 return codes
http_headers – if specified, overwrites the HTTP headers (except Host and Path).
headers – any additional HTTPRequest parameter to add. e.g. Method=”POST”
- class scapy.layers.http.HTTP_Server(self, debug: int = 0, store: int = 0, session: Any = None, **kargs: Any)[source]
Bases:
AutomatonHTTP server automaton
- Parameters:
ssp – the SSP to serve. If None, unauthenticated (or basic).
mech – the HTTP_AUTH_MECHS to use (default: NONE)
require_cbt – require Channel Bindings to be valid (default: False)
cbt_cert – the path to the certificate used for channel bindings. Useful if behind a reverse proxy. (default: None)
Other parameters:
- Parameters:
BASIC_IDENTITIES – a dict that contains {“user”: “password”} for Basic authentication.
BASIC_REALM – the basic realm.
- AUTH(*args: ATMT, **kargs: Any) NewStateRequested[source]
- AUTH_ERROR(*args: ATMT, **kargs: Any) NewStateRequested[source]
- BEGIN(*args: ATMT, **kargs: Any) NewStateRequested[source]
- CLOSED(*args: ATMT, **kargs: Any) NewStateRequested[source]
- ERROR(*args: ATMT, **kargs: Any) NewStateRequested[source]
- SERVE(*args: ATMT, **kargs: Any) NewStateRequested[source]
- actions: Dict[str, List[_StateWrapper]] = {'allow_reauth': [], 'auth_eof': [], 'new_request': [], 'received_unauthenticated': [], 'serve_eof': [], 'should_authenticate': []}
- answer(pkt)[source]
HTTP_server answer function.
- Parameters:
pkt – a HTTPRequest packet
- Returns:
a HTTPResponse packet
- conditions: Dict[str, List[_StateWrapper]] = {'AUTH': [], 'AUTH_ERROR': [<function HTTP_Server.allow_reauth>], 'BEGIN': [], 'CLOSED': [], 'ERROR': [], 'SERVE': []}
- eofs: Dict[str, _StateWrapper] = {'AUTH': <function HTTP_Server.auth_eof>, 'SERVE': <function HTTP_Server.serve_eof>}
- initial_states: List[_StateWrapper] = [<function ATMT.state.<locals>.deco.<locals>._state_wrapper>]
- ioevents: Dict[str, List[_StateWrapper]] = {'AUTH': [], 'AUTH_ERROR': [], 'BEGIN': [], 'CLOSED': [], 'ERROR': [], 'SERVE': []}
- ionames: List[str] = []
- iosupersockets: List[SuperSocket] = []
- recv_conditions: Dict[str, List[_StateWrapper]] = {'AUTH': [<function HTTP_Server.received_unauthenticated>], 'AUTH_ERROR': [], 'BEGIN': [<function HTTP_Server.should_authenticate>], 'CLOSED': [], 'ERROR': [], 'SERVE': [<function HTTP_Server.new_request>]}
- states: Dict[str, _StateWrapper] = {'AUTH': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>, 'AUTH_ERROR': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>, 'BEGIN': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>, 'CLOSED': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>, 'ERROR': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>, 'SERVE': <function ATMT.state.<locals>.deco.<locals>._state_wrapper>}
- stop_state: _StateWrapper | None = None
- timeout: Dict[str, _TimerList] = {'AUTH': [], 'AUTH_ERROR': [], 'BEGIN': [], 'CLOSED': [], 'ERROR': [], 'SERVE': []}
- scapy.layers.http.http_request(host, path='/', port=None, timeout=3, display=False, tls=False, verbose=0, **headers)[source]
Util to perform an HTTP request.
- Parameters:
host – the host to connect to
path – the path of the request (default /)
port – the port (default 80/443)
timeout – timeout before None is returned
display – display the result in the default browser (default False)
iface – interface to use. Changing this turns on “raw”
headers – any additional headers passed to the request
- Returns:
the HTTPResponse packet