Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ Python ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

SQL\T-SQL

FreeBSD and Nix

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Python и SCAPY


Рассмотрим сетевую утилиту scapy для языка Python

Установку произведем на ОС FreeBSD (в моем случае была версия 10)

-------------------------
Варианты установки scapy:
Установка из портов: cd /usr/ports/net/scapy/ && make install clean
Установка с помощью добавления пакета: /usr/sbin/pkg install net/scapy

-------------------------
Запуск интерактивной оболочки scapy:
>>> scapy

Посмотреть поддерживаемые протоколы:
>>> ls()

Посомтреть поля протокола(в круглых скобках - "()" указаны значения по умолчанию, поля могут быть изменены):
>>> 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' |>>>

>>> p.summary()
'IP / ICMP 192.168.255.82 > 192.168.255.11 echo-request 0 / Raw'

>>> p.show()
###[ IP ]###
  version= 4
  ihl= None
  tos= 0x0
  len= None
  id= 1
  flags=
  frag= 0
  ttl= 64
  proto= icmp
  chksum= None
  src= 192.168.255.82
  dst= 192.168.255.11
  \options\
###[ ICMP ]###
     type= echo-request
     code= 0
     chksum= None
     id= 0x0
     seq= 0x0
###[ Raw ]###
        load= 'Test'

Тепрь посмотрим внутренности пакетов отдельно:
>>> p[IP]
<IP  frag=0 proto=icmp dst=192.168.255.11 |<ICMP  |<Raw  load='Test' |>>>

>>> p[ICMP]
<ICMP  |<Raw  load='Test' |>>

>>> p[Raw]
<Raw  load='Test' |>

>>> p[Raw].load
'Test'

>>> p[IP].dst
'192.168.255.11'

Примеры сборки пакетов с указанием диапазона(в круглых скобках) или списка(в квадратных скобках) портов:
>>> p=IP(dst="192.168.255.11")/TCP(dport=(1,60))
>>> p
<IP  frag=0 proto=tcp dst=192.168.255.11 |<TCP  dport=(1, 60) |>>

>>> p=IP(dst="192.168.255.11")/TCP(dport=[1,25,43,60])
>>> p
<IP  frag=0 proto=tcp dst=192.168.255.11 |<TCP  dport=['tcpmux', 'smtp', 'nicname', '60'] |>>

Посмотреть все пакеты, которые будут посланы при множестве целей портов с помощью 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!")

Классическое SYN сканирование можно инициализировать, выполнив следующую команду:
>>> sr1(IP(dst="freebsd.org")/TCP(dport=80,flags="S"))
Begin emission:
.Finished to send 1 packets.
..........................................*
Received 259 packets, got 1 answers, remaining 0 packets
<IP  version=4L ihl=5L tos=0x0 len=44 id=16792 flags=DF frag=0L ttl=55 
proto=tcp chksum=0x87c2 src=8.8.178.110 dst=192.168.255.82 options=[] 
|<TCP  sport=http dport=ftp_data seq=674166824 ack=1 dataofs=6L reserved=0L 
flags=SA window=65535 chksum=0xfce8 urgptr=0 options=[('MSS', 1460)] |>>

Из приведенного выше вывода, мы можем видеть, вернулись флаги "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)

>>> rdpcap("test.pcap")
<test.pcap: TCP:2 UDP:4 ICMP:4 Other:0>

>>> _.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

-------------------------
Работа с таблицей маршрутизации:

Вывод таблицы маршрутизации:
>>> conf.route
Network         Netmask         Gateway         Iface           Output IP
0.0.0.0         0.0.0.0         192.168.255.11  hn0             192.168.255.82
127.0.0.1       255.255.255.255 0.0.0.0         lo0             127.0.0.1
192.168.255.0   255.255.255.0   0.0.0.0         hn0             192.168.255.82
192.168.255.82  255.255.255.255 0.0.0.0         lo0             127.0.0.1
192.168.255.83  255.255.255.255 0.0.0.0         lo0             127.0.0.1

Добавление записей:
>>> conf.route.add(net="1.1.1.0/24",gw="192.168.1.1")
>>> conf.route.add(host="2.2.2.2",gw="192.168.1.1")
>>> conf.route
Network         Netmask         Gateway         Iface           Output IP
0.0.0.0         0.0.0.0         192.168.255.11  hn0             192.168.255.82
127.0.0.1       255.255.255.255 0.0.0.0         lo0             127.0.0.1
192.168.255.0   255.255.255.0   0.0.0.0         hn0             192.168.255.82
192.168.255.82  255.255.255.255 0.0.0.0         lo0             127.0.0.1
192.168.255.83  255.255.255.255 0.0.0.0         lo0             127.0.0.1
1.1.1.0         255.255.255.0   192.168.1.1     hn0             192.168.255.82
2.2.2.2         255.255.255.255 192.168.1.1     hn0             192.168.255.82

Удаление записи:
>>> conf.route.delt(host="2.2.2.2",gw="192.168.1.1")
>>> conf.route
Network         Netmask         Gateway         Iface           Output IP
0.0.0.0         0.0.0.0         192.168.255.11  hn0             192.168.255.82
127.0.0.1       255.255.255.255 0.0.0.0         lo0             127.0.0.1
192.168.255.0   255.255.255.0   0.0.0.0         hn0             192.168.255.82
192.168.255.82  255.255.255.255 0.0.0.0         lo0             127.0.0.1
192.168.255.83  255.255.255.255 0.0.0.0         lo0             127.0.0.1
1.1.1.0         255.255.255.0   192.168.1.1     hn0             192.168.255.82

Сброс:
>>> conf.route.resync()
>>> conf.route
Network         Netmask         Gateway         Iface           Output IP
0.0.0.0         0.0.0.0         192.168.255.11  hn0             192.168.255.82
127.0.0.1       255.255.255.255 0.0.0.0         lo0             127.0.0.1
192.168.255.0   255.255.255.0   0.0.0.0         hn0             192.168.255.82
192.168.255.82  255.255.255.255 0.0.0.0         lo0             127.0.0.1
192.168.255.83  255.255.255.255 0.0.0.0         lo0             127.0.0.1

-------------------------
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>)

-------------------------

Простая программа TCP SYN Flood:

Первоисточник: http://pastebin.com/GE3QzN76


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект