Установку произведем на ОС FreeBSD (в моем случае была версия 10)
------------------------- Варианты установки scapy: Установка из портов:cd /usr/ports/net/scapy/ && make install clean Установка с помощью добавления пакета:/usr/sbin/pkg install net/scapy
Посомтреть поля протокола(в круглых скобках - "()" указаны значения по умолчанию, поля могут быть изменены): >>> ls(ICMP)
------------------------- В scapy можно собирать пакеты изначально пропустив низкие уровни, начав сразу с прикладного.
Уровни разделяются косой чертой - "/" >>> Ether()/IP()/TCP()/”TEST”
Соберем пакет и посомтрим его содержимое методами summary() и show(): >>> p=IP(dst="192.168.255.11")/ICMP()/"Test"
>>> p
<IP frag=0 proto=icmp dst=192.168.255.11 |<ICMP |<Raw load='Test' |>>>
Посмотреть все пакеты, которые будут посланы при множестве целей портов с помощью for: >>> [a for a in p]
[<IP frag=0 proto=tcp dst=192.168.255.11 |<TCP dport=tcpmux |>>,
<IP frag=0 proto=tcp dst=192.168.255.11 |<TCP dport=smtp |>>,
<IP frag=0 proto=tcp dst=192.168.255.11 |<TCP dport=nicname |>>,
<IP frag=0 proto=tcp dst=192.168.255.11 |<TCP dport=60 |>>]
------------------------- Базовые действия с полями пакета:
Создадим IP пакет и зададим поле ttl: >>> a=IP(ttl=10) >>> a
< IP ttl=10 |>
Посмотрим поле пакета >>> a.src
’127.0.0.1’
Изменим поле пакета >>> a.dst="192.168.1.1" >>> a
< IP ttl=10 dst=192.168.1.1 |> >>> a.src
’192.168.8.14’
Удалим поле из пакета: >>> del(a.ttl) >>> a
< IP dst=192.168.1.1 |> >>> a.ttl
64
------------------------- Посомтреть основные возможности scapy можно с помощью lsc(): >>> lsc()
Получить информацию по функциям из lsc() можно так: >>> help(traceroute)
Описание основных функций: sendp() – отправить пакет на канальном (L2) уровне, ответ не ожидается. srp() – отправить пакет на канальном (L2) уровне, ответ ожидается. srp1() – отправить пакет на канальном (L2) уровне, ответ ожидается в единичном экземпляре.
send() – отправить пакет на сетевом (L3) уровне, ответ не ожидается. sr() – отправить пакет на сетевом (L3) уровне, ответ ожидается. sr1() – отправить пакет на сетевом (L3) уровне, ответ ожидается в единичном экземпляре.
Пример отправки ICMP на определенный адрес: >>> send(IP(dst="192.168.255.11")/ICMP())
Пример отправки ICMP на определенный адрес с ожиданием ответа: >>> p=sr1(IP(dst="freebsd.org")/ICMP()/"Hello!")
Из приведенного выше вывода, мы можем видеть, вернулись флаги "SA" или SYN-ACK, указывающие на открытый порт.
Сканирование портов: ans,unans = sr(IP(dst=["192.168.255.11","yandex.ru"])/TCP(dport=[22,80],flags="S")) ans.make_table(lambda(s,r): (s.dst, s.dport,r.sprintf("{TCP:%TCP.flags%}{ICMP:%IP.src% - %ICMP.type%}")))
77.88.55.55 192.168.255.11
22 - RA
80 SA RA
Приведенный выше пример будет даже печатать тип ошибки ICMP, если пакет ICMP был получен в ответ вместо ожидаемого TCP.
Только определенные ответы. В приведенном ниже примере будут показаны только пакеты с "SA" флагом: ans.nsummary(lfilter = lambda (s,r): r.sprintf("%TCP.flags%") == "SA")
0002 IP / TCP 192.168.255.82:ftp_data > 77.88.55.55:http S ==> IP / TCP 77.88.55.55:http > 192.168.255.82:ftp_data SA
Для более крупных сканирований мы можем построить таблицу открытых портов: ans.filter(lambda (s,r):TCP in r and r[TCP].flags&2).make_table(lambda (s,r): ... (s.dst, s.dport, "X"))
77.88.55.55
80 X
------------------------- Теперь рассмотрим снифер - функция sniff():
Информация: help(sniff)
"Ctrl+C" прерывает процесс захвата трафика и выведет результат, результат попадет в "_".
Метод summary() выводит статистику по принятым пакетам: >>> sniff()
^C<Sniffed: TCP:2 UDP:12 ICMP:6 Other:0>
>>> _.summary()
Ether / IP / TCP 192.168.45.63:49296 > 192.168.255.82:ssh A / Padding
Ether / IPv6 / UDP fe80::10:74ff:fe96:33a:dhcpv6_client > ff02::1:2:dhcpv6_server / DHCP6_Solicit / DHCP6OptElapsedTime / DHCP6OptClientId / DHCP6OptIA_NA / DHCP6OptOptReq
Ether / IP / ICMP 192.168.45.63 > 192.168.255.82 echo-request 0 / Raw
Ether / IP / ICMP 192.168.255.82 > 192.168.45.63 echo-reply 0 / Raw
Ether / IP / ICMP 192.168.45.63 > 192.168.255.82 echo-request 0 / Raw
Ether / IP / ICMP 192.168.255.82 > 192.168.45.63 echo-reply 0 / Raw
Ether / IP / ICMP 192.168.45.63 > 192.168.255.82 echo-request 0 / Raw
Ether / IP / ICMP 192.168.255.82 > 192.168.45.63 echo-reply 0 / Raw
Ether / IPv6 / UDP fe80::10:74ff:fe96:33a:dhcpv6_client > ff02::1:2:dhcpv6_server / DHCP6_Solicit / DHCP6OptElapsedTime / DHCP6OptClientId / DHCP6OptIA_NA / DHCP6OptOptReq
Ether / IP / TCP 192.168.45.63:49296 > 192.168.255.82:ssh PA / Raw
>>> p=sniff() ^C>>> p.summary()
Ether / IP / TCP 192.168.45.63:49296 > 192.168.255.82:ssh A / Padding
Ether / IP / ICMP 192.168.45.63 > 192.168.255.82 echo-request 0 / Raw
Ether / IP / ICMP 192.168.255.82 > 192.168.45.63 echo-reply 0 / Raw
Ether / IPv6 / UDP fe80::10:74ff:fe96:33a:dhcpv6_client > ff02::1:2:dhcpv6_server / DHCP6_Solicit / DHCP6OptElapsedTime / DHCP6OptClientId / DHCP6OptIA_NA / DHCP6OptOptReq
Ether / IP / ICMP 192.168.45.63 > 192.168.255.82 echo-request 0 / Raw
Ether / IP / ICMP 192.168.255.82 > 192.168.45.63 echo-reply 0 / Raw
Ether / IPv6 / UDP fe80::10:74ff:fe96:33a:dhcpv6_client > ff02::1:2:dhcpv6_server / DHCP6_Solicit / DHCP6OptElapsedTime / DHCP6OptClientId / DHCP6OptIA_NA / DHCP6OptOptReq
Ether / IP / TCP 192.168.45.63:49296 > 192.168.255.82:ssh PA / Raw
Запись дампа в файл и его чтение: >>> wrpcap("test.pcap",p)
------------------------- TCP-Traceroute
В отличие от других программ, которые ждут TraceRoute для каждого узла, чтобы ответить, прежде чем переходить к следующему, scapy отправляет все пакеты в то же время. Недостаток: он не может знать, когда остановиться (при этом параметр maxttl), но большое преимущество, что он взял менее 3 секунд.
>>> traceroute(["www.yahoo.com","google.com"],maxttl=20)
Begin emission:
******************************Finished to send 40 packets.
*********
Received 39 packets, got 39 answers, remaining 1 packets
46.228.47.115:tcp80 87.245.200.162:tcp80
1 192.168.255.11 11 192.168.255.11 11
2 46.46.148.149 11 46.46.148.149 11
3 87.245.232.114 11 46.46.128.53 11
4 80.249.209.110 11 87.245.200.162 SA
5 216.115.104.64 11 87.245.200.162 SA
6 66.196.65.159 11 87.245.200.162 SA
7 217.146.185.185 11 87.245.200.162 SA
8 - 87.245.200.162 SA
9 46.228.47.115 SA 87.245.200.162 SA
10 46.228.47.115 SA 87.245.200.162 SA
11 46.228.47.115 SA 87.245.200.162 SA
12 46.228.47.115 SA 87.245.200.162 SA
13 46.228.47.115 SA 87.245.200.162 SA
14 46.228.47.115 SA 87.245.200.162 SA
15 46.228.47.115 SA 87.245.200.162 SA
16 46.228.47.115 SA 87.245.200.162 SA
17 46.228.47.115 SA 87.245.200.162 SA
18 46.228.47.115 SA 87.245.200.162 SA
19 46.228.47.115 SA 87.245.200.162 SA
20 46.228.47.115 SA 87.245.200.162 SA
(<Traceroute: TCP:29 UDP:0 ICMP:10 Other:0>, <Unanswered: TCP:1 UDP:0 ICMP:0 Other:0>)