| % Regression tests for Scapy Answering Machines |
| |
| # More informations at http://www.secdev.org/projects/UTscapy/ |
| |
| |
| ############ |
| ############ |
| + Answering Machines |
| |
| = Generic answering machine mocker |
| import mock |
| @mock.patch("scapy.ansmachine.sniff") |
| def test_am(cls_name, packet_query, check_reply, mock_sniff, **kargs): |
| def sniff(*args,**kargs): |
| kargs["prn"](packet_query) |
| mock_sniff.side_effect = sniff |
| am = cls_name(**kargs) |
| am.send_reply = check_reply |
| am() |
| |
| |
| = BOOT_am |
| def check_BOOTP_am_reply(packet): |
| assert(BOOTP in packet and packet[BOOTP].op == 2) |
| assert(packet[BOOTP].yiaddr == "192.168.1.128" and packet[BOOTP].giaddr == "192.168.1.1") |
| |
| test_am(BOOTP_am, |
| IP()/UDP()/BOOTP(op=1), |
| check_BOOTP_am_reply) |
| |
| |
| = DHCP_am |
| def check_DHCP_am_reply(packet): |
| assert(DHCP in packet and len(packet[DHCP].options)) |
| assert(("domain", "localnet") in packet[DHCP].options) |
| |
| test_am(DHCP_am, |
| IP()/UDP()/BOOTP(op=1)/DHCP(), |
| check_DHCP_am_reply) |
| |
| |
| = ARP_am |
| def check_ARP_am_reply(packet): |
| assert(ARP in packet and packet[ARP].psrc == "10.28.7.1") |
| assert(packet[ARP].hwsrc == "00:01:02:03:04:05") |
| |
| test_am(ARP_am, |
| Ether()/ARP(pdst="10.28.7.1"), |
| check_ARP_am_reply, |
| IP_addr="10.28.7.1", |
| ARP_addr="00:01:02:03:04:05") |
| |
| |
| = DNS_am |
| def check_DNS_am_reply(packet): |
| assert(DNS in packet and packet[DNS].ancount == 1) |
| assert(packet[DNS].an.rdata == b"192.168.1.1") |
| |
| test_am(DNS_am, |
| IP()/UDP()/DNS(qd=DNSQR(qname="www.secdev.org")), |
| check_DNS_am_reply) |
| |
| = DHCPv6_am - Basic Instantiaion |
| ~ osx netaccess |
| a = DHCPv6_am() |
| a.usage() |
| |
| a.parse_options(dns="2001:500::1035", domain="localdomain, local", duid=None, |
| iface=conf.iface6, advpref=255, sntpservers=None, |
| sipdomains=None, sipservers=None, |
| nisdomain=None, nisservers=None, |
| nispdomain=None, nispservers=None, |
| bcmcsdomains=None, bcmcsservers=None, |
| debug=1) |
| |
| = DHCPv6_am - SOLICIT |
| ~ osx netaccess |
| req = IPv6(dst="::1")/UDP()/DHCP6(msgtype=1)/DHCP6OptClientId(duid=DUID_LLT()) |
| assert a.is_request(req) |
| res = a.make_reply(req) |
| assert not a.is_request(res) |
| assert res[DHCP6_Advertise] |
| assert res[DHCP6OptPref].prefval == 255 |
| assert res[DHCP6OptReconfAccept] |
| a.print_reply(req, res) |
| |
| = DHCPv6_am - INFO-REQUEST |
| ~ osx netaccess |
| req = IPv6(dst="::1")/UDP()/DHCP6(msgtype=11)/DHCP6OptClientId(duid=DUID_LLT()) |
| assert a.is_request(req) |
| res = a.make_reply(req) |
| assert not a.is_request(res) |
| assert res[DHCP6_Reply] |
| assert "local" in res[DHCP6OptDNSDomains].dnsdomains |
| a.print_reply(req, res) |
| |
| = DHCPv6_am - REQUEST |
| ~ osx netaccess |
| req = IPv6(dst="::1")/UDP()/DHCP6(msgtype=3)/DHCP6OptClientId(duid=DUID_LLT())/DHCP6OptServerId(duid=a.duid) |
| assert a.is_request(req) |
| res = a.make_reply(req) |
| assert not a.is_request(res) |
| assert res[UDP].dport == 546 |
| assert res[DHCP6_Solicit] |
| a.print_reply(req, res) |
| |
| = WiFi_am |
| import mock |
| @mock.patch("scapy.layers.dot11.sniff") |
| def test_WiFi_am(packet_query, check_reply, mock_sniff, **kargs): |
| def sniff(*args,**kargs): |
| kargs["prn"](packet_query) |
| mock_sniff.side_effect = sniff |
| am = WiFi_am(**kargs) |
| am.send_reply = check_reply |
| am() |
| |
| def check_WiFi_am_reply(packet): |
| assert(isinstance(packet, list) and len(packet) == 2) |
| assert(TCP in packet[0] and Raw in packet[0] and raw(packet[0][Raw]) == b"5c4pY") |
| |
| test_WiFi_am(Dot11(FCfield="to-DS")/IP()/TCP()/"Scapy", |
| check_WiFi_am_reply, |
| iffrom="scapy0", ifto="scapy1", replace="5c4pY", pattern="Scapy") |