Scapy文档总结quickDemo
ip组包
>>> IP()
>>>
>>> target = 'www.baidu.com'
>>> ip = IP(dst = target)
>>> ip
>>> [p for p in ip]
[]
ip组包的格式
ip = IP(dst = 'www.baidu.com')
这样一个ip包就组好了, mac地址等信息不设置都是自己的填充的。
现在, 让我们操作数据包吧
>>> IP()
>>> a=IP(dst="172.16.1.40")
>>> a
>>> a.dst
'172.16.1.40'
>>> a.ttl
64
这里我么组了一个 ip包目的ip是172.16.1.40
- ippacket.dst 获得包的目的ip
- ippacket.ttl 获取ttl值
怎么广播一个包, 告知网内所有计算机,从 192.168.13.1 到 192.168.13.2 TTL从1-9 使用UDP
>>> Ether(dst="ff:ff:ff:ff:ff:ff")
/IP(dst=["ketchup.com","mayo.com"],ttl=(1,9))
/UDP()
这个包被发到网内所有的计算机, 如果自己的ip地址不是目的ip则丢弃
机智的默认值
Scapy 试着让用户更加易于操作, 如果没有填写, 默认值就是Scapy填充的, 否则被你覆盖。
- IP地址等信息是根据路由表获得
- checkSum校验和是自己计算的
- MAC地址是根据自己使用的网口确定
- 网口类型和IP协议是由上层预定
- TCP的源端口默认值是20, 目的端口是80
- UDP源端口和目的端口都是53
- ICMP的默认类型是echo request(回显应答、Ping应答)
del方法
del
方法可以删除已经设置的字段
>>> 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
协议栈
/
操作符是用来组合两层的。当使用后,下层会根据上层确定自己的默认值, 比如设置的目的ip没有设置目的主机的MAC地址, 会从路由表中自动查询填充。数据部分可以自己填写
>>> IP()
>>> IP()/TCP()
>
>>> Ether()/IP()/TCP()
>>
>>> IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
>>
>>> Ether()/IP()/IP()/UDP()
>>>
>>> IP(proto=55)/TCP()
>
IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
proto是协议类型, 55是数据值表示TCP类型
发送了一个HTTP请求 HTTP/1.0表示协议和版本, '\r\n\r\n'就是经常使用一个格式了,我们有时候自己做请求头的时候原始请求头数据就是这么写的。
//创建一个IP报, 转为字符串打印
>>> str(IP())
'E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'
//把字符串变成IP报 转换
>>> IP(_)
//向www.slashdot.org主机发送一个 HTTP请求 获得index.html
>>> a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n"
//把这个包转换为16进制
>>> hexdump(a)
00 02 15 37 A2 44 00 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 [email protected]<....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 2F 69 6E 64 65 78 ..9..GET /index
2E 68 74 6D 6C 20 48 54 54 50 2F 31 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)
>>> ca
>>>
之所以没有显示所有的默认值是因为如果真的这么设计过于冗长
创建多个包
>>> a=IP(dst="www.slashdot.org/30")
>>> a
>>> [p for p in a]
[, ,
, ]
>>> b=IP(ttl=[1,2,(5,9)])
>>> b
>>> [p for p in b]
[, , , ,
, , ]
>>> c=TCP(dport=[80,443])
>>> [p for p in a/c]
[>,
>,
>,
>,
>,
>,
>,
>]
发送包
在知道组包之后, 下面看看怎么发送包.
>>> send(IP(dst="1.2.3.4")/ICMP())
.
Sent 1 packets.
>>> sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")
....
Sent 4 packets.
>>> sendp("I'm travelling on Ethernet", iface="eth1", loop=1, inter=0.2)
................^C
Sent 16 packets.
>>> sendp(rdpcap("/tmp/pcapfile")) # tcpreplay
...........
Sent 11 packets.