Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions scapy/fwdmachine.py
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ def cb_sni(sock, server_name, _):
thissock.send(ex.data)
self.vprint(self.ANSWER, ctx, cs, data, ex.data)
except Exception as ex:
# Processing failed. forward to not break anything
# Processing failed. Drop the packet.
self.vprint(
self.ERROR,
ctx,
Expand All @@ -527,8 +527,7 @@ def cb_sni(sock, server_name, _):
None,
)
traceback.print_exception(ex)
othersock.send(data)
self.vprint(self.FORWARD, ctx, cs, data, None)
self.vprint(self.DROP, ctx, cs, data, None)
except RuntimeError:
print(self.ct.red("%s DISCONNECTED !" % repr(addr)))
self.delconn(ctx)
Expand Down
47 changes: 47 additions & 0 deletions test/scapy/layers/http.uts
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,53 @@ raw_pkt = raw(pkt)
raw_pkt
assert raw_pkt == b'\x00P\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x00\x00\x00\x00GET /download HTTP/1.1\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: en-US,en;q=0.5\r\nCache-Control: max-age=0\r\nConnection: keep-alive\r\nContent-Length: 0\r\nHost: scapy.net\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0\r\n\r\n'

= ForwardMachine drops a packet when its policy callback fails
~ http

from unittest.mock import patch
from scapy.fwdmachine import ForwardMachine
from scapy.layers.http import HTTP
from scapy.themes import DefaultTheme

class _ForwardSocket:
def __init__(self, packet=None):
self.packet = packet
self.sent = []
self.streamsession = {}
def recv(self, size):
return self.packet
def send(self, packet):
self.sent.append(packet)
def close(self):
pass

class _FailingPolicy(ForwardMachine):
def __init__(self, peer):
self.peer = peer
self.tls = False
self.sockcls = lambda sock, cls: sock
self.cls = HTTP
self.MTU = 65535
self.ct = DefaultTheme()
def _getpeersock(self, dest, ctx, server_hostname=None):
return self.peer
def xfrmcs(self, pkt, ctx):
raise ValueError("policy rejected malformed input")
def vprint(self, *args):
pass

packet = HTTP(b"PATCH /blocked HTTP/1.1\r\nHost: example\r\n\r\n")
client = _ForwardSocket(packet)
peer = _ForwardSocket()
machine = _FailingPolicy(peer)
with patch(
"scapy.fwdmachine.select.select",
side_effect=[([client], [], []), RuntimeError()],
), patch("scapy.fwdmachine.traceback.print_exception"):
machine.handler(client, ("127.0.0.1", 1), ("127.0.0.1", 2))

assert peer.sent == []

= HTTP 1.1 -> HTTP 2.0 Upgrade (h2c)
~ Test h2c

Expand Down
Loading