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 cặp vài gói tin và câu trả lời, và các gói tin không được 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")
Begin emission:
...Finished to send 1 packets.
.*
Received 5 packets, got 1 answers, remaining 0 packets
>>> p
<IP version=4L ihl=5L tos=0x0 len=39 id=15489 flags= 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 |<Raw load='XXXXXXXXXXX'
|<Padding load='\x00\x00\x00\x00' |>>>>
>>> p.show()
---[ IP ]---
version = 4L
ihl = 5L
tos = 0x0
len = 39
id = 15489
flags =
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
---[ Raw ]---
load = 'XXXXXXXXXXX'
---[ Padding ]---
load = '\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")))
Begin emission:
Finished to send 1 packets.
..*
Received 3 packets, got 1 answers, remaining 0 packets
<IP version=4L ihl=5L tos=0x0 len=78 id=0 flags=DF frag=0L ttl=64 proto=UDP chksum=0xaf38
src=192.168.5.1 dst=192.168.5.21 options='' |<UDP sport=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=IN |>
an=<DNSRR rrname='www.slashdot.org.' type=A rclass=IN ttl=3560L rdata='66.35.250.151' |>
ns=0 ar=0 |<Padding load='\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]))
Received 6 packets, got 3 answers, remaining 0 packets
(<Results: UDP:0 TCP:3 ICMP:0 Other:0>, <Unanswered: UDP:0 TCP:0 ICMP:0 Other: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]),inter=0.5,retry=-2,timeout=1)
Begin emission:
Finished to send 12 packets.
Begin emission:
Finished to send 9 packets.
Begin emission:
Finished to send 9 packets.
Received 100 packets, got 3 answers, remaining 9 packets
(<Results: UDP:0 TCP:3 ICMP:0 Other:0>, <Unanswered: UDP:0 TCP:9 ICMP:0 Other:0>)
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")
Begin emission:
...Finished to send 1 packets.
.*
Received 5 packets, got 1 answers, remaining 0 packets
>>> p
<IP version=4L ihl=5L tos=0x0 len=39 id=15489 flags= 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 |<Raw load='XXXXXXXXXXX'
|<Padding load='\x00\x00\x00\x00' |>>>>
>>> p.show()
---[ IP ]---
version = 4L
ihl = 5L
tos = 0x0
len = 39
id = 15489
flags =
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
---[ Raw ]---
load = 'XXXXXXXXXXX'
---[ Padding ]---
load = '\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")))
Begin emission:
Finished to send 1 packets.
..*
Received 3 packets, got 1 answers, remaining 0 packets
<IP version=4L ihl=5L tos=0x0 len=78 id=0 flags=DF frag=0L ttl=64 proto=UDP chksum=0xaf38
src=192.168.5.1 dst=192.168.5.21 options='' |<UDP sport=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=IN |>
an=<DNSRR rrname='www.slashdot.org.' type=A rclass=IN ttl=3560L rdata='66.35.250.151' |>
ns=0 ar=0 |<Padding load='\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]))
Received 6 packets, got 3 answers, remaining 0 packets
(<Results: UDP:0 TCP:3 ICMP:0 Other:0>, <Unanswered: UDP:0 TCP:0 ICMP:0 Other: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]),inter=0.5,retry=-2,timeout=1)
Begin emission:
Finished to send 12 packets.
Begin emission:
Finished to send 9 packets.
Begin emission:
Finished to send 9 packets.
Received 100 packets, got 3 answers, remaining 9 packets
(<Results: UDP:0 TCP:3 ICMP:0 Other:0>, <Unanswered: UDP:0 TCP:9 ICMP:0 Other:0>)
Comments
Post a Comment