起因是很想研究一下,一个人每天在外面与多少熟人擦肩而过,我觉得这个世界还是蛮小的,所以就设想当他们在我50m左右时能自动提醒就好了,那么想到的方案有如果能感应手机wifi的 mac地址 就可以实现这些,当然关了wifi 就没辙了 可正经人谁关wifi 啊,这里需要说明的是mac属于个人信息,但不属于个人敏感信息所以收集的风险是很低的,可还是有责任保护该信息不被用于非法用途。
那么开始吧
1,准备:
Win电脑
Linux电脑(kali),很多人都用虚拟机,但我有树莓派。最好还有块屏幕
usb网卡 3070L ,其实树莓派的自带网卡也可以进入monitor监听模式,实际使用时却差强人意,还是上专用的比较好。
网线,当开启监听模式后是无法使用wifi上网的,虽然自带的网卡可以用,但经常性抽风,为了稳定请连网线。
软件方面有
pycharm 专业版 ,xshell,xftp,wireshark,python全套
2,配置:
网卡3070L不需驱动 直插即可*2
网线做直连线 话说两电脑连不应该交叉吗?早就不用了
Kali安装完之后配置ip
nano /etc/network/interfaces
输入:
auto eth0
#
iface eth0 inet static
#
address 192.168.222.xx #ip地址
#
gateway 192.168.222.x #网关 写不写无所谓
#
netmask 255.255.255.0 #掩码
#如果想通过自带网卡上网一定要删掉路由表
重启网卡
Ifconfig eth0 down
Ifocnfig eth0 up
------------------------------------
配置ssh可用root登录
nano /etc/ssh/sshd_config
改写
#PermitRootLogin prohibit-password
PermitRootLogin yes
#PasswordAuthentication yes
PasswordAuthentication yes
然后重启服务
/etc/init.d/ssh start
service ssh restart
---------------------------------------------------
配置pycharm 使IDE可以远连树莓派
先确认xshell可以链接上 树莓派
然后新建项目
接下来ctrl+shift+s,进入设置
因为我是中文版 可能配置会有些不一样
点击 项目:xxx -> python解释器 -> 点击右上齿轮 -> 添加 -> 填写好主机 用户名 确定->填写密码->完成
-> 项目文件夹右键->部署->上传 ->启动一下main吧
如果报错bash: cd: /tmp/pycharm_project_xxx: 没有那个文件或目录
点击 项目:xxx -> python解释器 -> 点击右上齿轮 -> 全部显示 -> 右边小笔符号 ->Deployment configuration 是否配置正确 ->点右边3个小点 进入映射 ->部署路径 填入/tmp/pycharm_project_xxx 再试即可
插上网卡后 ifconfig 查看wlan1 是否上线
再iw list 查看Supported interface modes下是否有monitor
然后
airmon-ng check kill 关闭干扰的程序
airmon-ng start wlan1 开启monitor
ifconfig下有wlan1mon 上线
airodump-ng wlan1mon 开始监听monitor
至此如果有人进入你wifi范围你 你就能发现他的mac地址啦
可惜 并不是这么完美 这里面有很多限制 比如对方必须有连接上wifi 连接哪个都无所谓 但必须和wifi 有数据交互,现在流量包都不限量了 还哪会有正经人连野路子的wifi,而且air的这工具包很好用,但不太自由 所以还是用python写一个吧
那么配置的最后一步,需要给kali安装 pip 以及用它安装scapy包 这点教程略 网上有很多不再赘述。
3,编写
1 from scapy.all import *
2
3
4
5 WHITELIST = ['11:15:11:61:84:5c', ] # your phone MAC
6 NOshow=['00:00:00:00:00:00','22:22:22:22:22:24','22:22:22:22:22:28']
7
8 def Packecatch(pkt):
9 if pkt.haslayer(Dot11):
10 if pkt.addr2 not in NOshow:
11
12 a = ''
13 b = ''
14 if pkt.haslayer(Dot11Beacon):
15 a = 'this is AP'+' APname:'+pkt.getlayer(Dot11Beacon).info
16
17 try:
18 print (str(pkt.addr2) + " " + a + " " + b+" dbm= "+str(pkt.dBm_AntSignal))
19 except:
20 print 'nodata'
21 if pkt.addr2 in WHITELIST :
22 print 'yayaya,catch you'
23
24
25
26 def main():
27
28 facenat = 'wlan1' #network
29 sniff(iface=facenat, prn=Packecatch)
30
31
32 if __name__ == "__main__":
33 main()
启动之前将kali重启,别被airmon干扰到
然后
ifconfig wlan1 down #下线网卡
iwconfig wlan1 mode montor #开启监听模式
ifconfig wlan1 up#上线网卡
iwconfig #查看监听模式是否开启
好了 可以直接在pycharm中启动上面的脚本了
注意:这里需要再做个线程对网卡的侦测信道进行循环,否则抓不全。
至此如果有要找的人从你周围走过就会打印yayaya catch you 注意:这里的Beacon为路由器的广播管理帧,用来通告所有手机的ssid以及密码类型等信息,所以这个肯定不是你想要的吧
但如上文所述 对方在没连接wifi就没办法探查到mac 自安卓8以来 wifi多以被动扫描为主 只接受不发送 即便有时会主动扫描 使用的也不是真实mac
不过也不要灰心 还是有办法的 手机里面 只要有你曾经连过wifi名都有记录 如果遇到同样名字的就会主动连接 那样mac就会暴露
所以下面就是伪造ap环节 如果你不知道熟人曾经连过的wifi名是多少 推荐你把他们邀进家里 诱(qiang)导(po)他们连上自家wifi
----------------
以下开始 创建伪ap建立
from scapy.all import * def sendp(x, inter=0, loop=0, iface=None, count=None, verbose=None, realtime=None, return_packets=False, socket=None, w_int=1, w_time=0,ssid='',mac='',go=[True] ,*args, **kargs): ''' Send packets at layer 2 :param x: the packets :param inter: time (in s) between two packets (default 0) :param loop: send packet indefinetly (default 0) :param count: number of packets to send (default None=1) :param verbose: verbose mode (default None=conf.verbose) :param realtime: check that a packet was sent before sending the next one :param return_packets: return the sent packets :param socket: the socket to use (default is conf.L3socket(kargs)) :param iface: the interface to send the packets on :param monitor: (not on linux) send in monitor mode :param w_int: 循环发送次数 :param w_time: 循环一次后休息的时间 :param go:循环标记指针 ''' socket = socket or conf.L2socket(iface=iface, *args, **kargs) for ii in range(w_int): if not go[0]: return False scapy.sendrecv.__gen_send(socket, x, inter=inter, loop=loop, count=count, verbose=verbose, realtime=realtime, return_packets=return_packets) print('ssid:'+ssid+'休息中') if not go[0]: return False #关闭ap发送的逻辑 # for ap in wifi_receive.APlist: # if len(ap)<=2: # break # if ap[1]==ssid and ap[0] != mac: # print ("附近存在ssid:"+ssid+",已关闭该ssid") # return False # # # if ssid in wifi_config.No_scanAP_L: # print ("强制关闭该ssid:"+ssid+"") # return False time.sleep(w_time) socket.close() return True def scanAP_password(ssid='', mac='',go=[True]): mac=b'x11x22x33x44x55x66' #12位mac地址 mac_str = mac.hex(':') hexdump(mac)#打印 ssid_b = ssid.encode('utf-8')#ssid转utf-8 lenbi = len(ssid).to_bytes(length=1, byteorder='big')#ssid的长度转bytes # 数据头 mac = b"x80x00x00x00xffxffxffxffxffxff" + mac + mac # 以下为ap数据加密帧 t = b"xf0x44x85x97x73x06x00x00" b"x00x00x64x00x31x04x00" + lenbi + ssid_b + b"x01x08x82x84" b"x8bx96x0cx12x18x24x03x01x01x05x04x00x02x00x00x07" b"x06x43x4ex20x01x0dx14x2ax01x00x32x04x30x48x60x6c" b"x30x14x01x00x00x0fxacx04x01x00x00x0fxacx04x01x00" b"x00x0fxacx02x0cx00x2dx1axecx02x13xffxffx00x00x01" b"x00x00x00x00x00x00x00x07x00x00x00x00x00x00x00x00" b"x00x00x3dx16x01x00x00x00x00x00x00x00x00x00x00x00" b"x00x00x00x00x00x00x00x00x00x00x7fx08x00x00x00x00" b"x00x00x00x40xddx18x00x50xf2x02x01x01x00x00x03xa4" b"x00x00x27xa4x00x00x42x43x5ex00x62x32x2fx00" packet = RadioTap() / mac / t #拼接成帧 hexdump(packet) return sendp(packet, iface='wlan1', inter=0.05, count=200, w_int=800, w_time=2,ssid=ssid,mac=mac_str,go=go) # 同网卡监听和发送就会收到两个wifi信息 其中一个有错 需屏蔽 pass
关于ap数据加密帧如何获取 ,可以用wireshark随便抓一个路由器的Beacon帧改写即可,这样就能模拟一个让手机主动连接的wifi了,当然这个是连不上去,手机失败两次就不再重试 但够用了。
注意:sendp的参数设定不能过慢,否则手机需要很长时间才能发现信号,但同样发送过快会相当费电。务必是双网卡 ,一个发送创建ap的Beacon帧 ,一个负责抓包。