5.3黑客成长日记——scapy学习

5.3黑客成长日记——scapy学习
目标:不装逼,就搞懂这个鬼东西是啥

reference

1.0 黑客成长日记
2.0 知乎治学
3.0 简书治学
4.0 IP、TCP、UDP、ARP、ICMP结构

scapy

Scapy是一个强大的,用Python编写的交互式数据包处理程序,它能让用户发送、嗅探、解析,以及伪造网络报文,从而用来侦测、扫描和向网络发动攻击。Scapy可以轻松地处理扫描(scanning)、路由跟踪(tracerouting)、探测(probing)、单元测试(unit tests)、攻击(attacks)和发现网络(network discorvery)之类的传统任务。它可以代替hping,arpspoof,arp-sk,arping,p0f 甚至是部分的Nmap,tcpdump和tshark 的功能。
简单来讲就是网络偏底层的黑客工具。
# sudo is needed
进入scapy后,可以用ls()函数来查看scapy支持的网络协议
可以看到网工们耳熟能详的ARP, BOOTP, Dot1Q, DHCP, DNS, GRE, HSRP, ICMP, IP, NTP, RIP, SNMP, STP, PPPoE, TCP, TFTP, UDP等等统统都支持
python交互模式中:ls(*)*=Ether、IP、ICMP、TCP、UDP、ARP 等等,查看可以配置的参数

>>> package = IP()
>>> ls(IP)  # or package.show()
version    : BitField (4 bits)                   = (4)
ihl        : BitField (4 bits)                   = (None)
tos        : XByteField                          = (0)
len        : ShortField                          = (None)
id         : ShortField                          = (1)
flags      : FlagsField (3 bits)                 = (<Flag 0 ()>)
frag       : BitField (13 bits)                  = (0)
ttl        : ByteField                           = (64)
proto      : ByteEnumField                       = (0)
chksum     : XShortField                         = (None)
src        : SourceIPField                       = (None)
dst        : DestIPField                         = (None)
options    : PacketListField                     = ([])

上面的字段对应于下面的数据包中的各个字段


IP头.png

防止冗余:更多的头结构请参考:IP、TCP、UDP、ARP、ICMP结构
实地考察请使用LS命令

ps:四层结构:

应用程序
TCP层 # scapy 用send(第三层)
IP层 # scapy 用senddp(第二层)
EtherNet层(物理层/数据链路层)网络接口层


应用程序TCP层IP层EtherNet层(单位B).png

回到正题

字段的修改很方便,可以定义时候改,也可以作为属性修改

>>> ip = IP(ttl=520, dst='192.168.1.1')
>>> ip.version = 6
>>> ip.show()
###[ IP ]###
  version   = 6
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     =
  frag      = 0
  ttl       = 520
  proto     = ip
  chksum    = None
  src       = 10.0.0.14
  dst       = 192.168.1.1
  \options   \

如果想从数据链路层将数据发送出去,就需要构造以太网帧数据,IP数据报文和TCP报文,并将三者组合起来发送出去。看下面的示例:

>>> b = Ether()/IP(dst='www.baidu.com')/TCP()/"GET /index/html HTTP/1.0 \n\n"
>>> hexdump(b)
WARNING: getmacbyip failed on Sniffing and sending packets is not available at layer 2: winpcap is not installed. You may use conf.L3socket orconf.L3socket6 to access layer 3
WARNING: Mac address to reach destination not found. Using broadcast.
0000  FF FF FF FF FF FF 00 FF 6A 6E FC 9A 08 00 45 00  ........jn....E.
0010  00 43 00 01 00 00 40 06 08 0B 0A 00 00 0E 70 50  .C....@.......pP
0020  F8 4B 00 14 00 50 00 00 00 00 00 00 00 00 50 02  .K...P........P.
0030  20 00 4A 08 00 00 47 45 54 20 2F 69 6E 64 65 78   .J...GET /index
0040  2F 68 74 6D 6C 20 48 54 54 50 2F 31 2E 30 20 0A  /html HTTP/1.0 .
0050  0A

上面是构造包,然后我们开始发送和接受部分

只发送

二层:sendp() //给定网卡接口
三层:send() //自动根据路由表进行路由发送

发送并返回

二层:
srp() //发送包, 返回答复和没有答复的包的数量
srp1() //发送包, 返回只答复或者发送的包的详细信息| .参数,显示这个参数的返回数据
三层:
sr( ) //发送包, 返回答复和没有答复的包的数量
sr1( ) //发送包, 返回只答复或者发送的包的详细信息|.参数,显示这个参数的返回数据

>>> send(IP(dst="192.168.30.2")/ICMP())
.
Sent 1 packets.
#报错可能是需要安装一些例如winpcap的东西来抓包和发包
#错误如下Sniffing and sending packets is not available at layer 2: winpcap is not installed
>>> sendp(Ether()/IP(dst="192.168.1.1", ttl=(1,4)))
....
Sent 4 packets.


#收包
>>> res = sr(IP(dst="8.8.8.8")/UDP()/DNS(rd=1, qd=DNSQR(qname='www.baidu.com')))
Begin emission:
Finished sending 1 packets.
...*
Received 4 packets, got 1 answers, remaining 0 packets
>>> res[0][0]
(<IP  frag=0 proto=udp dst=8.8.8.8 |<UDP  sport=domain |<DNS  rd=1 qd=<DNSQR  qname='www.baidu.com' |> |>>>, <IP  version=4 ihl=5 tos=0x0 len=75 id=0 flags=DF frag=0 ttl=63 proto=udp chksum=0x2185 src=8.8.8.8 dst=10.0.0.14 |<UDP  sport=domain dport=domain len=55 chksum=0x21cd |<DNS  id=0 qr=1 opcode=QUERY aa=0 tc=0 rd=0 ra=0 z=0 ad=0 cd=0 rcode=ok qdcount=1 ancount=1 nscount=0 arcount=0 qd=<DNSQR  qname='www.baidu.com.' qtype=A qclass=IN |> an=<DNSRR  rrname='www.baidu.com.' type=A rclass=IN ttl=216 rdlen=None rdata=112.80.248.76 |> ns=None ar=None |>>>)
##当然上面两个操作合成一个就是sr1(IP(dst="8.8.8.8")/UDP()/DNS(rd=1, qd=DNSQR(qname='www.baidu.com')))

但是上面的这个其实还有别的
>>> res[0].summary()
IP / UDP / DNS Qry "b'www.baidu.com'"  ==> IP / UDP / DNS Ans "112.80.248.76"
>>> res[1] #空包列表
<bound method PacketList.summary of <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>>

注意上图中我们使用了DNS()方法帮助构造应用层(DNS)的报文内容。
实际上接收的数据返回两个列表,第一个就是发送的数据包及其应答组成的列表,第二个是无应答数据包组成的列表。
具体来说上面例子中的操作就是再8.8.8.8DNS服务器查询www.baidu.com域名的IP地址是多少。最后返回的数据就是一个数据包,rdata=112.80.248.76就是百度的IP了

对上面的结果,我们可以采用wireshark来查看,这就需要先存为pcap格式,然后读取

ans, unans = sr(IP(dst="8.8.8.8")/UDP()/DNS(rd=1, qd=DNSQR(qname='www.baidu.com')))
wrpcap('first.pcap', ans)
ans = rdcap(''first.pcap')
ans.show()

附录——ICMP

ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 [1]
ICMP 是 TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层。ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。
下面这两个有趣的命令等我有空了再重新好好看看。(搜tracert命令详解)

PS C:\Users\Feem> tracert www.baidu.com

通过最多 30 个跃点跟踪
到 www.a.shifen.com [112.80.248.76] 的路由: #这个域名本身也很有趣

  1    <1 毫秒   <1 毫秒   <1 毫秒 害怕泄露隐私 [10.0.0.1]
  2     2 ms     1 ms     1 ms  害怕泄露隐私 [192.168.1.1]
  3     6 ms     4 ms     3 ms  124.90.192.1
  4     4 ms     4 ms     4 ms  124.90.33.185
  5    23 ms    16 ms    16 ms  124.160.233.153
  6    16 ms    15 ms    56 ms  219.158.96.86
  7    16 ms    15 ms    14 ms  122.96.66.102
  8    16 ms    15 ms    17 ms  58.240.96.130
  9     *        *        *     请求超时。
 10    14 ms    14 ms    14 ms  112.80.248.76

跟踪完成。
PS C:\Users\Feem> ping baidu.com

正在 Ping baidu.com [220.181.38.148] 具有 32 字节的数据:
来自 220.181.38.148 的回复: 字节=32 时间=43ms TTL=49
来自 220.181.38.148 的回复: 字节=32 时间=43ms TTL=49
来自 220.181.38.148 的回复: 字节=32 时间=43ms TTL=49
来自 220.181.38.148 的回复: 字节=32 时间=43ms TTL=49

220.181.38.148 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 43ms,最长 = 43ms,平均 = 43ms

附录——效果查看

除此之外,如果您已经安装PyX,您可以做一个数据包的图形PostScript/ PDF转储,完整的输出命令列表如下:
pyX命令.png

得到的结果为


pyX转pdf效果.png

附录——python 中使用scapy

这个破电脑真的是太垃圾了,居然怎么都跑不动scapy,最后报错都报到端口去了,弃坑

from scapy.all import *

就可以了,但是要主要怎么获取管理员权限的问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343