mirror of https://github.com/secdev/scapy.git
170 lines
5.2 KiB
Plaintext
170 lines
5.2 KiB
Plaintext
% send, sniff, sr* tests for Scapy
|
|
|
|
~ netaccess
|
|
|
|
############
|
|
############
|
|
+ Test bridge_and_sniff() using tap sockets
|
|
|
|
~ tap linux
|
|
|
|
= Create two tap interfaces
|
|
|
|
import subprocess
|
|
from threading import Thread
|
|
|
|
tap0, tap1 = [TunTapInterface("tap%d" % i) for i in range(2)]
|
|
|
|
if LINUX:
|
|
for i in range(2):
|
|
assert subprocess.check_call(["ip", "link", "set", "tap%d" % i, "up"]) == 0
|
|
else:
|
|
for i in range(2):
|
|
assert subprocess.check_call(["ifconfig", "tap%d" % i, "up"]) == 0
|
|
|
|
= Run a sniff thread on the tap1 **interface**
|
|
* It will terminate when 5 IP packets from 1.2.3.4 have been sniffed
|
|
t_sniff = Thread(
|
|
target=sniff,
|
|
kwargs={"iface": "tap1", "count": 5, "prn": Packet.summary,
|
|
"lfilter": lambda p: IP in p and p[IP].src == "1.2.3.4"}
|
|
)
|
|
t_sniff.start()
|
|
|
|
= Run a bridge_and_sniff thread between the taps **sockets**
|
|
* It will terminate when 5 IP packets from 1.2.3.4 have been forwarded
|
|
t_bridge = Thread(target=bridge_and_sniff, args=(tap0, tap1),
|
|
kwargs={"store": False, "count": 5, 'prn': Packet.summary,
|
|
"lfilter": lambda p: IP in p and p[IP].src == "1.2.3.4"})
|
|
t_bridge.start()
|
|
|
|
= Send five IP packets from 1.2.3.4 to the tap0 **interface**
|
|
time.sleep(1)
|
|
sendp([Ether(dst=ETHER_BROADCAST) / IP(src="1.2.3.4") / ICMP()], iface="tap0",
|
|
count=5)
|
|
|
|
= Wait for the threads
|
|
t_bridge.join()
|
|
t_sniff.join()
|
|
|
|
= Run a sniff thread on the tap1 **interface**
|
|
* It will terminate when 5 IP packets from 2.3.4.5 have been sniffed
|
|
t_sniff = Thread(
|
|
target=sniff,
|
|
kwargs={"iface": "tap1", "count": 5, "prn": Packet.summary,
|
|
"lfilter": lambda p: IP in p and p[IP].src == "2.3.4.5"}
|
|
)
|
|
t_sniff.start()
|
|
|
|
= Run a bridge_and_sniff thread between the taps **sockets**
|
|
* It will "NAT" packets from 1.2.3.4 to 2.3.4.5 and will terminate when 5 IP packets have been forwarded
|
|
def nat_1_2(pkt):
|
|
if IP in pkt and pkt[IP].src == "1.2.3.4":
|
|
pkt[IP].src = "2.3.4.5"
|
|
del pkt[IP].chksum
|
|
return pkt
|
|
return False
|
|
|
|
t_bridge = Thread(target=bridge_and_sniff, args=(tap0, tap1),
|
|
kwargs={"store": False, "count": 5, 'prn': Packet.summary,
|
|
"xfrm12": nat_1_2,
|
|
"lfilter": lambda p: IP in p and p[IP].src == "1.2.3.4"})
|
|
t_bridge.start()
|
|
|
|
= Send five IP packets from 1.2.3.4 to the tap0 **interface**
|
|
time.sleep(1)
|
|
sendp([Ether(dst=ETHER_BROADCAST) / IP(src="1.2.3.4") / ICMP()], iface="tap0",
|
|
count=5)
|
|
|
|
= Wait for the threads
|
|
t_bridge.join()
|
|
t_sniff.join()
|
|
|
|
= Delete the tap interfaces
|
|
del tap0, tap1
|
|
|
|
|
|
############
|
|
############
|
|
+ Test bridge_and_sniff() using tun sockets
|
|
|
|
~ tun linux not_pcapdnet
|
|
|
|
= Create two tun interfaces
|
|
|
|
import subprocess
|
|
from threading import Thread
|
|
|
|
tun0, tun1 = [TunTapInterface("tun%d" % i) for i in range(2)]
|
|
|
|
if LINUX:
|
|
for i in range(2):
|
|
assert subprocess.check_call(["ip", "link", "set", "tun%d" % i, "up"]) == 0
|
|
else:
|
|
for i in range(2):
|
|
assert subprocess.check_call(["ifconfig", "tun%d" % i, "up"]) == 0
|
|
|
|
= Run a sniff thread on the tun1 **interface**
|
|
* It will terminate when 5 IP packets from 1.2.3.4 have been sniffed
|
|
t_sniff = Thread(
|
|
target=sniff,
|
|
kwargs={"iface": "tun1", "count": 5, "prn": Packet.summary,
|
|
"lfilter": lambda p: IP in p and p[IP].src == "1.2.3.4"}
|
|
)
|
|
t_sniff.start()
|
|
|
|
= Run a bridge_and_sniff thread between the tuns **sockets**
|
|
* It will terminate when 5 IP packets from 1.2.3.4 have been forwarded.
|
|
t_bridge = Thread(target=bridge_and_sniff, args=(tun0, tun1),
|
|
kwargs={"store": False, "count": 5, 'prn': Packet.summary,
|
|
"xfrm12": lambda pkt: pkt,
|
|
"lfilter": lambda p: IP in p and p[IP].src == "1.2.3.4"})
|
|
t_bridge.start()
|
|
|
|
= Send five IP packets from 1.2.3.4 to the tun0 **interface**
|
|
time.sleep(1)
|
|
conf.route.add(net="1.2.3.4/32", dev="tun0")
|
|
send(IP(src="1.2.3.4", dst="1.2.3.4") / ICMP(), count=5)
|
|
conf.route.delt(net="1.2.3.4/32", dev="tun0")
|
|
|
|
= Wait for the threads
|
|
t_bridge.join()
|
|
t_sniff.join()
|
|
|
|
= Run a sniff thread on the tun1 **interface**
|
|
* It will terminate when 5 IP packets from 2.3.4.5 have been sniffed
|
|
t_sniff = Thread(
|
|
target=sniff,
|
|
kwargs={"iface": "tun1", "count": 5, "prn": Packet.summary,
|
|
"lfilter": lambda p: IP in p and p[IP].src == "2.3.4.5"}
|
|
)
|
|
t_sniff.start()
|
|
|
|
= Run a bridge_and_sniff thread between the tuns **sockets**
|
|
* It will "NAT" packets from 1.2.3.4 to 2.3.4.5 and will terminate when 5 IP packets have been forwarded
|
|
def nat_1_2(pkt):
|
|
if IP in pkt and pkt[IP].src == "1.2.3.4":
|
|
pkt[IP].src = "2.3.4.5"
|
|
del pkt[IP].chksum
|
|
return pkt
|
|
return False
|
|
|
|
t_bridge = Thread(target=bridge_and_sniff, args=(tun0, tun1),
|
|
kwargs={"store": False, "count": 5, 'prn': Packet.summary,
|
|
"xfrm12": nat_1_2,
|
|
"lfilter": lambda p: IP in p and p[IP].src == "1.2.3.4"})
|
|
t_bridge.start()
|
|
|
|
= Send five IP packets from 1.2.3.4 to the tun0 **interface**
|
|
time.sleep(1)
|
|
conf.route.add(net="1.2.3.4/32", dev="tun0")
|
|
send(IP(src="1.2.3.4", dst="1.2.3.4") / ICMP(), count=5)
|
|
conf.route.delt(net="1.2.3.4/32", dev="tun0")
|
|
|
|
= Wait for the threads
|
|
t_bridge.join()
|
|
t_sniff.join()
|
|
|
|
= Delete the tun interfaces
|
|
del tun0, tun1
|