美文网首页程序员
Scapy文档总结quickDemo

Scapy文档总结quickDemo

作者: YKDog | 来源:发表于2017-04-26 17:23 被阅读136次

    Scapy文档总结quickDemo

    ip组包

    >>> IP()
    <IP  |>
    >>> 
    >>> target = 'www.baidu.com'
    >>> ip = IP(dst = target)
    >>> ip
    <IP  dst=Net('www.baidu.com') |>
    >>> [p for p in ip]
    [<IP  dst=220.181.111.188 |>]
    

    ip组包的格式
    ip = IP(dst = 'www.baidu.com')

    这样一个ip包就组好了, mac地址等信息不设置都是自己的填充的。

    现在, 让我们操作数据包吧

    >>> IP()
    <IP |>
    >>> a=IP(dst="172.16.1.40")
    >>> a
    <IP dst=172.16.1.40 |>
    >>> 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 |>
    >>> 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 |<Raw load='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 |>>
    

    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(_)
    <IP version=4L ihl=5L tos=0x0 len=20 id=1 flags= frag=0L ttl=64 proto=IP
     chksum=0x7ce7 src=127.0.0.1 dst=127.0.0.1 |>
     
    //向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  .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 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
    <Ether dst=00:02:15:37:a2:44 src=00:ae:f3:52:aa:d1 type=0x800 |<IP version=4L
     ihl=5L tos=0x0 len=67 id=1 flags= frag=0L ttl=64 proto=TCP chksum=0x783c
     src=192.168.5.21 dst=66.35.250.151 options='' |<TCP sport=20 dport=80 seq=0L
     ack=0L dataofs=5L reserved=0L flags=S window=8192 chksum=0xbb39 urgptr=0
     options =[] |<Raw load='GET /index.html HTTP/1.0 \n\n' |>>>>
    

    之所以没有显示所有的默认值是因为如果真的这么设计过于冗长

    创建多个包

    >>> a=IP(dst="www.slashdot.org/30")
    >>> a
    <IP  dst=Net('www.slashdot.org/30') |>
    >>> [p for p in a]
    [<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 for p in 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 for p in a/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 |>>]
    

    发送包

    在知道组包之后, 下面看看怎么发送包.

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

    相关文章

      网友评论

        本文标题:Scapy文档总结quickDemo

        本文链接:https://www.haomeiwen.com/subject/cccwzttx.html