Sử dụng - Scapy

bắt đầu từ Scapy
bao tương tác Scapy được chạy trong một phiên ga. quyền root là cần thiết để gửi các gói dữ liệu, vì vậy chúng tôi đang sử dụng sudo ở đây:
$ Sudo scapy
Chào mừng bạn đến Scapy (2.0.1-dev)
>>>
Trên Windows, hãy mở một dấu nhắc lệnh (cmd.exe) và chắc chắn rằng bạn có quyền quản trị:
C: \> scapy
hỗ trợ Không IPv6 trong kernel: INFO
CẢNH BÁO: Không tìm thấy tuyến đường cho các điểm đến IPv6 :: (không có tuyến đường mặc định?)
Chào mừng bạn đến Scapy (2.0.1-dev)
>>>
Nếu bạn không có tất cả các gói tùy chọn cài đặt, Scapy sẽ thông báo cho bạn rằng một số tính năng sẽ không có sẵn:

INFO: Không thể nhập python gnuplot wrapper. Sẽ không thể cốt truyện.
INFO: Không thể nhập hộp pyx. Sẽ không thể sử dụng psdump () hoặc pdfdump ().
Các tính năng cơ bản của việc gửi và nhận các gói tin vẫn phải làm việc, mặc dù.
Hướng dẫn tương tác
Phần này sẽ chỉ cho bạn một số tính năng của Scapy. Chỉ cần mở một phiên Scapy như trên và thử các ví dụ cho mình.
Những bước đầu tiên
Hãy xây dựng một gói tin và chơi với nó:
>>> A = IP (ttl = 10)
>>> một
<IP TTL = 10 |>
>>> a.src
'127.0.0.1'
>>> A.dst = "192.168.1.1"
>>> một
<IP TTL = 10 dst = 192.168.1.1 |>
>>> a.src
'192.168.8.14'
>>> Del (a.ttl)
>>> một
<IP dst = 192.168.1.1 |>
>>> a.ttl
64
xếp thành lớp
Các / nhà điều hành đã được sử dụng như là một nhà điều hành thành phần giữa hai lớp. Khi làm như vậy, lớp dưới có thể có một hoặc nhiều hơn các giá trị mặc định lĩnh vực của mình bị quá tải theo các lớp trên. (Bạn vẫn có thể cung cấp cho các giá trị mà bạn muốn). Một chuỗi có thể được sử dụng như một lớp nguyên liệu.
>>> IP ()
<IP |>
>>> IP () / TCP ()
<IP frag = 0 proto = TCP | <TCP | >>
>>> Ether () / IP () / TCP ()
<Ether type = 0x800 | <IP frag = 0 proto = TCP | <TCP | >>>
>>> IP () / TCP () / "GET / HTTP / 1.0 \ r \ n \ r \ n"
<IP frag = 0 proto = TCP | <TCP | <liệu tải = 'GET / HTTP / 1.0 \ r \ n \ r \ n' | >>>
>>> Ether () / IP () / IP () / UDP ()
<Ether type = 0x800 | <IP frag = 0 proto = IP | <IP frag = 0 proto = UDP | <UDP | >>>>
>>> IP (proto = 55) / TCP ()
<IP frag = 0 proto = 55 | <TCP | >>
Mỗi gói có thể được xây dựng hoặc chia cắt (lưu ý: trong Python _ (gạch dưới) là kết quả mới nhất):
>>> Str (IP ())
'E \ x00 \ x00 \ x14 \ x00 \ x01 \ x00 \ x00 @ \ x00 | \ xe7 \ x7f \ x00 \ x00 \ x01 \ x7f \ x00 \ x00 \ x01'
>>> IP (_)
<Phiên bản IP = 4L IHL = 5L tos = 0x0 len = 20 id = 1 cờ = frag = 0l ttl = 64 proto = IP
 chksum = 0x7ce7 src = 127.0.0.1 dst = 127.0.0.1 |>
>>> A = Ether () / IP (dst = "www.slashdot.org") / TCP () / "GET /index.html HTTP / 1.0 \ n \ n"
>>> Hexdump (a)
00 02 15 37 44 00 A2 AE F3 52 AA D1 08 00 45 00 ... 7.D ... R .... E.
00 43 00 01 00 00 40 06 78 3C C0 A8 05 15 42 23 .C .... @. X <.... B #
FA 97 00 14 00 50 00 00 00 00 00 00 00 00 50 02 ..... P ........ P.
20 00 BB 39 00 00 47 45 54 20 69 2F 6E 64 65 78 ..9..GET / index
2E 68 74 6D 6C 20 48 54 54 50 31 2F 2E 30 20 0A .html HTTP / 1.0.
0A.
>>> B = str (a)
>>> b
'\ X00 \ x02 \ x157 \ xa2D \ x00 \ xAE \ xf3R \ XAA \ xd1 \ x08 \ x00E \ x00 \ x00C \ x00 \ x01 \ x00 \ x00 @ \ x06x <\ xc0
 \ Xa8 \ X05 \ x15B # \ xfa \ x97 \ x00 \ x14 \ x00P \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00P \ x02 \ x00
 \ Xbb9 \ x00 \ x00GET /index.html HTTP / 1.0 \ n \ n '
>>> C = Ether (b)
>>> c
<Ether dst = 00: 02: 15: 37: a2: 44 src = 00: ae: f3: 52: aa: d1 type = 0x800 | <IP version = 4L
 IHL = tos 5L = 0x0 len = 67 id = 1 cờ = frag = 0l ttl = 64 proto = TCP chksum = 0x783c
 src = 192.168.5.21 dst = 66.35.250.151 tùy chọn = '' | <TCP thể thao = 20 dport = 80 seq = 0l
 ack = 0l dataofs = 5L reserved = cờ 0l = S window = 8192 chksum = 0xbb39 urgptr = 0
 options = [] | <liệu tải = 'GET /index.html HTTP / 1.0 \ n \ n' | >>>>
Chúng ta thấy rằng một gói chia cắt có tất cả các lĩnh vực của nó lấp đầy. Đó là vì tôi xem xét rằng mỗi lĩnh vực có giá trị của nó áp đặt bởi các chuỗi ban đầu. Nếu điều này là quá dài dòng, các hide_defaults phương pháp () sẽ xóa tất cả các lĩnh vực có giá trị như mặc định:
>>> C.hide_defaults ()
>>> c
<Ether dst = 00: 0f: 66: 56: fa: d2 src = 00: ae: f3: 52: aa: d1 type = 0x800 | <IP IHL = 5L len = 67
  frag = 0 proto = TCP chksum = 0x783c src = 192.168.5.21 dst = 66.35.250.151 | <TCP dataofs = 5L
  chksum = 0xbb39 options = [] | <liệu tải = 'GET /index.html HTTP / 1.0 \ n \ n' | >>>>
Đọc các tập tin pcap
Bạn có thể đọc các gói dữ liệu từ một tập tin pcap và viết chúng vào một tập tin pcap.
>>> A = rdpcap ( "/ tùng / chụp / isakmp.cap")
>>> một
<Isakmp.cap: UDP: 721 TCP: 0 ICMP: 0 Khác: 0>
bãi đồ họa (PDF, PS)
Nếu bạn có hộp pyx cài đặt, bạn có thể làm một bãi chứa đồ họa PostScript / PDF của một gói hoặc một danh sách các gói tin (xem hình ảnh PNG xấu xí dưới PostScript / PDF có chất lượng tốt hơn nhiều ....):
>>> A [423] .pdfdump (layer_shift = 1)
>>> A [423] .psdump ( "/ tmp / isakmp_pkt.eps", layer_shift = 1)
lệnh Effect
str (PKT) lắp ráp các gói tin
hexdump (PKT) có một bãi chứa hệ thập lục phân
ls (PKT) có danh sách các giá trị lĩnh vực
pkt.summary () cho một bản tóm tắt một dòng
pkt.show () cho một cái nhìn developped của gói tin
pkt.show2 () tương tự như chương trình nhưng trên gói lắp ráp (checksum được tính toán, ví dụ)
pkt.sprintf () điền vào một chuỗi định dạng với các lĩnh vực giá trị của gói tin
pkt.decode_payload_as () thay đổi cách làm việc của tải trọng được giải mã
pkt.psdump () vẽ một sơ đồ với giải thích mổ xẻ PostScript
pkt.pdfdump () rút ra một file PDF với giải thích mổ xẻ
pkt.command () trả về một lệnh Scapy có thể tạo ra các gói tin
Tạo bộ gói
Đối với thời điểm này, chúng tôi đã chỉ ra một gói. Hãy xem làm thế nào để xác định bộ các gói tin một cách dễ dàng. Mỗi lĩnh vực của toàn bộ gói (từng lớp) có thể là một tập hợp. Đây implicidely định nghĩa một tập các gói dữ liệu, tạo ra bằng cách sử dụng các loại sản phẩm Descartes giữa tất cả các lĩnh vực.
>>> A = IP (dst = "www.slashdot.org/30")
>>> một
<IP dst = Net ( 'www.slashdot.org/30') |>
>>> [P cho p trong một]
[<IP dst = 66.35.250.148 |>, <IP dst = 66.35.250.149 |>,
  <IP dst = 66.35.250.150 |>, <IP dst = 66.35.250.151 |>]
>>> B = IP (ttl = [1,2, (5,9)])
>>> b
<IP ttl = [1, 2, (5, 9)] |>
>>> [P cho p trong b]
[<IP TTL = 1 |>, <IP TTL = 2 |>, <IP ttl = 5 |>, <IP ttl = 6 |>,
  <IP ttl = 7 |>, <IP ttl = 8 |>, <IP ttl = 9 |>]
>>> C = TCP (dport = [80.443])
>>> [P cho p trong một / c]
[<IP frag = 0 proto = TCP dst = 66.35.250.148 | <TCP dport = 80 | >>,
  <IP frag = 0 proto = TCP dst = 66.35.250.148 | <TCP dport = 443 | >>,
  <IP frag = 0 proto = TCP dst = 66.35.250.149 | <TCP dport = 80 | >>,
  <IP frag = 0 proto = TCP dst = 66.35.250.149 | <TCP dport = 443 | >>,
  <IP frag = 0 proto = TCP dst = 66.35.250.150 | <TCP dport = 80 | >>,
  <IP frag = 0 proto = TCP dst = 66.35.250.150 | <TCP dport = 443 | >>,
  <IP frag = 0 proto = TCP dst = 66.35.250.151 | <TCP dport = 80 | >>,
  <IP frag = 0 proto = TCP dst = 66.35.250.151 | <TCP dport = 443 | >>]
Một số hoạt động (như xây dựng các chuỗi từ một gói) không thể làm việc trên một tập hợp các gói tin. Trong những trường hợp này, nếu bạn quên cuộn thiết lập của bạn gói, chỉ phần tử đầu tiên của danh sách bạn quên để tạo ra sẽ được sử dụng để lắp ráp các gói tin.

lệnh Effect
tóm tắt () sẽ hiển thị một danh sách các bản tóm tắt của mỗi gói
nsummary () giống như trước đó, với số lượng gói
cuộc hội thoại () sẽ hiển thị một biểu đồ các cuộc hội thoại
show () sẽ hiển thị các đại diện ưa thích (thường nsummary ())
filter () trả về một danh sách gói lọc với một hàm lambda
hexdump () trả về một hexdump của tất cả các gói
hexraw () trả về một hexdump của lớp liệu của tất cả các gói
padding () trả về một hexdump của gói tin với lớp đệm
nzpadding () trả về một hexdump của gói tin với lớp đệm không bằng không
lô () lô một hàm lambda áp dụng cho danh sách gói
làm bảng () sẽ hiển thị một bảng theo một hàm lambda
gửi các gói tin
Bây giờ chúng ta biết làm thế nào để thao tác các gói tin. Chúng ta hãy xem làm thế nào để gửi chúng. Các send () chức năng sẽ gửi các gói tin ở lớp 3. Đó là để nói nó sẽ xử lý định tuyến và lớp 2 cho bạn. Các sendp () chức năng sẽ làm việc ở lớp 2. Đó là vào bạn để chọn đúng giao diện và giao thức lớp liên kết ngay.
>>> Gửi (IP (dst = "1.2.3.4") / ICMP ())
.
Gửi 1 gói tin.
>>> Sendp (Ether () / IP (dst = "1.2.3.4", ttl = (1,4)), iface = "eth1")
....
Đã gửi 4 gói tin.
>>> Sendp ("Tôi đang đi du lịch trên Ethernet", iface = "eth1", loop = 1, liên = 0,2)
................ ^ C
Đã gửi 16 gói.
>>> Sendp (rdpcap ( "/ tmp / pcapfile")) # tcpreplay
...........
Đã gửi 11 gói
fuzzing
Các chức năng lông tơ () có thể thay đổi bất kỳ giá trị mặc định mà không cần tính (như tổng kiểm tra) của một đối tượng có giá trị ngẫu nhiên và có kiểu được thích nghi với lĩnh vực này. Điều này cho phép để xây dựng quicky mẫu fuzzing và gửi chúng trong vòng lặp. Trong ví dụ sau, lớp IP là bình thường, và UDP và NTP lớp là fuzzed. UDP checksum sẽ được chính xác, các cổng đích UDP sẽ bị quá tải bởi NTP là 123 và phiên bản NTP sẽ bị buộc phải 4. Tất cả các cổng khác sẽ được chọn ngẫu nhiên:
>>> Gửi (IP (dst = "mục tiêu") / lông tơ (UDP () / NTP (version = 4)), loop = 1)
................ ^ C
Đã gửi 16 gói.
Gửi và nhận các gói tin (sr)
Bây giờ, chúng ta hãy cố gắng làm một số điều thú vị. Các sr () chức năng là để gửi các gói dữ liệu và nhận được câu trả lời. Hàm trả về một vài gói tin và câu trả lời, và các gói tin trả lời. Các chức năng sr1 () là một biến thể mà chỉ trả lại một gói tin trả lời các gói tin (hoặc các thiết lập gói tin) gửi. Các gói tin phải được lớp 3 gói (IP, ARP, vv). Các chức năng srp () làm tương tự cho lớp 2 gói (Ethernet, 802.3, vv).
>>> P = sr1 (IP (dst = "www.slashdot.org") / ICMP () / "xxxxxxxxxxx")
Bắt đầu phát thải:
... Kết thúc để gửi 1 gói tin.
. *
Đã nhận được 5 gói, có 1 câu trả lời, còn lại 0 gói
>>> p
<Phiên bản IP = 4L IHL = 5L tos = 0x0 len = 39 id = 15.489 cờ = frag = 0l ttl = 42 proto = ICMP
  chksum = 0x51dd src = 66.35.250.151 dst = 192.168.5.21 options = '' | <ICMP type = echo-reply
  code = 0 chksum = 0xee45 id = 0x0 seq = 0x0 | <tải thô = 'xxxxxxxxxxx'
  | <Tải Padding = '\ x00 \ x00 \ x00 \ x00' | >>>>
>>> P.show ()
--- [IP] ---
version = 4L
IHL = 5L
tos = 0x0
len = 39
id = 15.489
cờ =
frag = 0l
ttl = 42
proto = ICMP
chksum = 0x51dd
src = 66.35.250.151
dst = 192.168.5.21
tùy chọn = ''
--- [ICMP] ---
    type = echo-reply
    code = 0
    chksum = 0xee45
    id = 0x0
    seq = 0x0
--- [Raw] ---
       tải = 'xxxxxxxxxxx'
--- [Padding] ---
          tải = '\ x00 \ x00 \ x00 \ x00'
Một truy vấn DNS (rd = đệ quy mong muốn). Các 192.168.5.1 máy chủ là máy chủ DNS của tôi. Lưu ý padding không null đến từ Linksys của tôi có lỗ hổng Etherleak:
>>> Sr1 (IP (dst = "192.168.5.1") / UDP () / DNS (rd = 1, qd = DNSQR (QName = "www.slashdot.org")))
Bắt đầu phát thải:
Kết thúc để gửi 1 gói tin.
.. *
Nhận 3 gói, có 1 câu trả lời, còn lại 0 gói
<Phiên bản IP = 4L IHL = 5L tos = 0x0 len = 78 id = 0 cờ = DF frag = 0l ttl = 64 proto = UDP chksum = 0xaf38
  src = 192.168.5.1 dst = 192.168.5.21 options = '' | <UDP thể thao = 53 dport = 53 len = 58 chksum = 0xd55d
  | <DNS id = 0 qr = 1L opcode = QUERY aa = 0l tc = 0l rd = 1L ra = 1L z = 0l rcode = ok qdcount = 1 ancount = 1
  nscount = 0 arcount = 0 qd = <DNSQR QName = 'www.slashdot.org.' qtype = A = qclass TRÊN |>
  một = <DNSRR rrname = 'www.slashdot.org.' gõ = A = rclass TRÊN ttl = 3560L rdata = '66 .35.250.151 '|>
  ns = 0 ar = 0 | <Padding tải = '\ xc6 \ x94 \ xc7 \ xeb' | >>>>
Các chức năng "send'n'receive" Gia đình là trái tim của scapy. Họ trở về một cặp vợ chồng của hai danh sách. Yếu tố đầu tiên là danh sách các cặp vợ chồng (gói tin gửi đi, câu trả lời), và yếu tố thứ hai là danh sách các gói tin trả lời. Hai yếu tố này là danh sách, nhưng họ được bao bọc bởi một đối tượng để trình bày cho họ tốt hơn, và cung cấp cho họ với một số phương pháp làm những hành động thường xuyên cần thiết nhất:
>>> Sr (IP (dst = "192.168.8.1") / TCP (dport = [21,22,23]))
Nhận được 6 gói, có 3 câu trả lời, còn lại 0 gói
(<Kết quả: UDP: 0 TCP: 3 ICMP: 0 Khác: 0>, <Chưa trả lời: UDP: 0 TCP: 0 ICMP: 0 Khác: 0>)
>>> Ans, unans = _
>>> Ans.summary ()
IP / TCP 192.168.8.14:20> 192.168.8.1:21 S ==> Ether / IP / TCP 192.168.8.1:21> 192.168.8.14:20 RA / Padding
IP / TCP 192.168.8.14:20> 192.168.8.1:22 S ==> Ether / IP / TCP 192.168.8.1:22> 192.168.8.14:20 RA / Padding
IP / TCP 192.168.8.14:20> 192.168.8.1:23 S ==> Ether / IP / TCP 192.168.8.1:23> 192.168.8.14:20 RA / Padding
Nếu có một tỷ lệ hạn chế các câu trả lời, bạn có thể chỉ định một khoảng thời gian để chờ đợi giữa hai gói tin với các thông số liên. Nếu một số gói tin bị mất hoặc nếu xác định một khoảng thời gian là không đủ, bạn có thể gửi lại tất cả các gói tin trả lời, hoặc bằng cách gọi các chức năng một lần nữa, trực tiếp với danh sách được trả lời, hoặc bằng cách xác định một tham số thử lại. Nếu thử lại là 3, scapy sẽ cố gắng gửi lại gói tin chưa được trả lời 3 lần. Nếu thử lại là -3, scapy sẽ gửi lại gói tin trả lời khi không có câu trả lời hơn là đưa ra cho cùng một tập hợp các gói tin chưa được trả lời 3 lần trong một hàng. Các thông số thời gian chờ xác định thời gian chờ đợi sau khi gói tin cuối cùng đã được gửi:
>>> Sr (IP (dst = "172.20.29.5/30") / TCP (dport = [21,22,23]), liên = 0,5, thử lại = -2, thời gian chờ = 1)
Bắt đầu phát thải:
Kết thúc để gửi 12 gói.
Bắt đầu phát thải:
Kết thúc để gửi 9 gói.
Bắt đầu phát thải:
Kết thúc để gửi 9 gói.

Nhận được 100 gói, có 3 câu trả lời, còn lại 9 gói
(<Kết quả: UDP: 0 TCP: 3 ICMP: 0 Khác: 0>, <Chưa trả lời: UDP: 0 TCP: 9 ICMP: 0 Khác: 0>)
SYN Quét
Cổ điển SYN Scan có thể được khởi tạo bằng cách thực hiện các lệnh sau từ dấu nhắc Scapy của:

>>> Sr1 (IP (dst = "72.14.207.99") / TCP (dport = 80, cờ = "S"))
Đoạn trên sẽ gửi một gói tin SYN duy nhất để Google cổng 80 và sẽ bỏ thuốc lá sau khi cập nhật dữ liệu một phản ứng duy nhất:

Bắt đầu phát thải:
.Finished Để gửi 1 gói tin.
*
Nhận được 2 gói, có 1 câu trả lời, còn lại 0 gói
<Phiên bản IP = 4L IHL = 5L tos = 0x20 len = 44 id = 33.529 cờ = frag = 0l ttl = 244
proto = TCP chksum = 0x6a34 src = 72.14.207.99 dst = 192.168.1.100 options = // |
<TCP thể thao = www dport = ftp-data seq = 2487238601L ack = 1 dataofs = 6L reserved = 0l
cờ = SA window = 8190 chksum = 0xcdc7 urgptr = 0 tùy chọn = [('MSS', 536)] |
<Padding tải = 'V \ xf7' | >>>
Từ đầu ra ở trên, chúng ta có thể thấy Google trở cờ "SA" hoặc SYN-ACK chỉ ra một cổng mở.

Sử dụng hoặc ký hiệu để quét cổng 400 qua 443 trên hệ thống:

>>> Sr (IP (dst = "192.168.1.1") / TCP (thể thao = 666, dport = (440.443), cờ = "S"))
hoặc là

>>> Sr (IP (dst = "192.168.1.1") / TCP (thể thao = RandShort (), dport = [440.441.442.443], cờ = "S"))
Để nhanh chóng xem xét phản ứng chỉ cần yêu cầu một bản tóm tắt của các gói dữ liệu thu thập được:

>>> Ans, unans = _
>>> Ans.summary ()
IP / TCP 192.168.1.100:ftp-data> 192.168.1.1:440 S ======> IP / TCP 192.168.1.1:440> 192.168.1.100:ftp-data RA / Padding
IP / TCP 192.168.1.100:ftp-data> 192.168.1.1:441 S ======> IP / TCP 192.168.1.1:441> 192.168.1.100:ftp-data RA / Padding
IP / TCP 192.168.1.100:ftp-data> 192.168.1.1:442 S ======> IP / TCP 192.168.1.1:442> 192.168.1.100:ftp-data RA / Padding
IP / TCP 192.168.1.100:ftp-data> 192.168.1.1:https S ======> 192.168.1.1:https IP / TCP> 192.168.1.100:ftp-data SA / Padding
Đoạn trên sẽ hiển thị cặp kích cầu / đáp ứng cho tàu thăm dò trả lời. Chúng ta có thể chỉ hiển thị các thông tin chúng tôi được quan tâm bằng cách sử dụng một vòng lặp đơn giản:

>>> Ans.summary (lambda (s, r): r.sprintf ("% TCP.sport% \ t% TCP.flags%"))
440 RA
441 RA
442 RA
https SA
Thậm chí tốt hơn, một bảng có thể được xây dựng bằng cách sử dụng make_table () để hiển thị thông tin về nhiều mục tiêu:

>>> Ans, unans = sr (IP (dst = [ "192.168.1.1", "yahoo.com", "slashdot.org"]) / TCP (dport = [22,80,443], cờ = "S") )
Bắt đầu phát thải:
....... *. ** ....... Kết thúc để gửi 9 gói.
**. *. * .. * ..................
Nhận được 362 gói, có 8 câu trả lời, 1 gói còn lại
>>> Ans.make_table (
... Lambda (s, r): (s.dst, s.dport,
... R.sprintf ("{TCP:% TCP.flags%} {ICMP:% IP.src% -% ICMP.type%}")))
     66.35.250.150 192.168.1.1 216.109.112.135
22 66.35.250.150 - dest-unreach RA -
80 SA RA SA
443 SA SA SA

Comments

Popular posts from this blog

Thiết lập card không dây trên Kali Linux

Monitor mode

Giới thiệu - Scapy