Install Scapy
Пакет Scapy включен в Network Security Toolkit (NST 28)
Verion 2.x
Documentation scapy
pip install --pre scapy
pip install --pre scapy[basic]
pip3 install scapy-python3
Version 3.x
В версии 3k поменялось имя на kamene (version 3k)
Github Kamene
Documentation kamene
Docum Kamene
Доступные комманды scapy можно посмотреть с помощью:
lsc()
Помощь по коммандам
help(rdpcap)
Дополнительные уровни contrib
Чтобы посмотреть дополнительные доступные уровни протоколов
list_contrib()
Для загрузки дополнительного протокола можно использовать следующую комманду:
load_contrib("ospf")
Для подключения nmap требуется следующая команда:
load_module("nmap")
Interactive using scapy
Изменение темы возможно с помощью:
conf.color_theme = [DefaultTheme, BrightTheme, RastaTheme, ColorOnBlackTheme, BlackAndWhite, HTMLTheme, LatexTheme]
conf.color_theme=BrightTheme()
conf.color_theme=ColorOnBlackTheme()
Создать пакет ICMP
p=IP(dst="8.8.8.8")/ICMP()
Изменить ttl
p.ttl=10
Удалить ttl(сбросить настройку)
del(p.ttl)
Посмотреть поле с указанием протокола
p[IP].dst
Указать флаги
p[TCP].flags="SA"
Payload используется для вывода информации выше третьего уровня, можно его использовать несколько раз
p.payload.flags="SA"
Диапазон значений можно задавать списком либо начальным и конечным значением
p=IP()/TCP(dport=[22,23,25])
p=IP()/TCP(dport=(1,1000))
_ (подчеркивание) – последний результат
Вывод в HEX формате
a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n"
hexdump(a)
Reading pcap files
a=rdpcap("file_pcap.pcap")
Вывести dst всех считанных пакетов
[p.dst for p in a]
Основные команды с пакетом:
- raw(pkt) assemble the packet
- hexdump(pkt) have a hexadecimal dump
- ls(pkt) have the list of fields values
- pkt.summary() for a one-line summary
- pkt.show() for a developed view of the packet
- pkt.show2() same as show but on the assembled packet (checksum is calculated, for instance)
- pkt.sprintf() fills a format string with fields values of the packet
- pkt.decode_payload_as() changes the way the payload is decoded
- pkt.psdump() draws a PostScript diagram with explained dissection
- pkt.pdfdump() draws a PDF with explained dissection
- pkt.command() return a Scapy command that can generate the packet !!!
Над группой пакетов:
- summary() displays a list of summaries of each packet
- nsummary() same as previous, with the packet number
- conversations() displays a graph of conversations
- show() displays the preferred representation (usually nsummary())
- filter() returns a packet list filtered with a lambda function
Sending Packets
send() – посылает пакеты используя третий уровень, не обрабатывая ответы
send(IP(dst="192.168.180.231")/ICMP())
send(IP(dst="192.168.180.1")/fuzz(UDP()/NTP(version=4)),loop=1)
sendp() – посылает пакеты используя второй уровень, не обрабатывая ответы
sendp(rdpcap("/tmp/pcapfile"))
sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")
send(IP(dst='127.0.0.1'), return_packets=True)
sr() – отправляет пакеты, но ожидает ответные пакеты(L3), аналог send()
srp() – отправляет пакеты, но ожидает ответные пакеты(L2), аналог sendp()
sr1() и srp1() – аналогичны sr() и srp(), только ожидают в ответ один пакет
У этих команд есть дополнительные параметры:
- timeout в секундах
- retry
- filter
Пример сканирования портов
pkt=IP(dst="192.168.180.1")/TCP(dport=(1,100), flags="S")
ans, unans = sr(pkt)
Вывести результат сканирования портов в виде списка или на каждой строчке, где флаги равны SA
[f'Flags: {a[1][TCP].flags} Port: { a[1].sport }' for a in ans if a[1][TCP].flags==18]
print("\n".join([f'Flags: {a[1][TCP].flags} Port: { a[1].sport }' for a in ans if a[1][TCP].flags==18]))