墨水熊

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

    起因是很想研究一下,一个人每天在外面与多少熟人擦肩而过,我觉得这个世界还是蛮小的,所以就设想当他们在我50m左右时能自动提醒就好了,那么想到的方案有如果能感应手机wifimac地址 就可以实现这些,当然关了wifi 就没辙了 可正经人谁关wifi 啊,这里需要说明的是mac属于个人信息,但不属于个人敏感信息所以收集的风险是很低的,可还是有责任保护该信息不被用于非法用途。

 

  那么开始吧

 

1,准备:

 

Win电脑

 

Linux电脑(kali,很多人都用虚拟机,但我有树莓派。最好还有块屏幕

 

usb网卡 3070L ,其实树莓派的自带网卡也可以进入monitor监听模式,实际使用时却差强人意,还是上专用的比较好。

 

网线,当开启监听模式后是无法使用wifi上网的,虽然自带的网卡可以用,但经常性抽风,为了稳定请连网线

 

软件方面有

pycharm 专业版 ,xshellxftpwiresharkpython全套

 

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'\x11\x22\x33\x44\x55\x66' #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"\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff" + mac + mac
    # 以下为ap数据加密帧
    t = b"\xf0\x44\x85\x97\x73\x06\x00\x00" \
        b"\x00\x00\x64\x00\x31\x04\x00" + lenbi + ssid_b + b"\x01\x08\x82\x84" \
                                                         b"\x8b\x96\x0c\x12\x18\x24\x03\x01\x01\x05\x04\x00\x02\x00\x00\x07" \
                                                         b"\x06\x43\x4e\x20\x01\x0d\x14\x2a\x01\x00\x32\x04\x30\x48\x60\x6c" \
                                                         b"\x30\x14\x01\x00\x00\x0f\xac\x04\x01\x00\x00\x0f\xac\x04\x01\x00" \
                                                         b"\x00\x0f\xac\x02\x0c\x00\x2d\x1a\xec\x02\x13\xff\xff\x00\x00\x01" \
                                                         b"\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00" \
                                                         b"\x00\x00\x3d\x16\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
                                                         b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\x08\x00\x00\x00\x00" \
                                                         b"\x00\x00\x00\x40\xdd\x18\x00\x50\xf2\x02\x01\x01\x00\x00\x03\xa4" \
                                                         b"\x00\x00\x27\xa4\x00\x00\x42\x43\x5e\x00\x62\x32\x2f\x00"


    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帧 ,一个负责抓包。

 

 

 

 

posted on 2020-11-19 20:44  墨水熊  阅读(147)  评论(0编辑  收藏  举报