让 WSL2 中的 Kali 虚拟机使用无线网卡

让 WSL2 中的 Kali 虚拟机使用无线网卡

最近我在研究最新的 WiFi 密码破解方法,由于出现了新的 WPA3 安全标准,也带来了新的思路。我们可以利用 WiFi 基站漫游功能中用于身份认证的 PMKID 加密算法,直接破解密码。而且,PMKID 的加密机制甚至不需要像以前那样为每个 ESSID 构建字典。通过以下公式,我们可以轻松地使用 PMKID 来破解无线密码。具体原理不在这里深入讨论,以后可以专门讨论这个问题:

PMKID = HMAC-SHA1-128(PMK, “PMK Name” | MACAP | MACSTA)

以前在虚拟机中进行这个实验既笨重又低效,现在微软推出了 WSL2,正好可以用来作为 WiFi 密码破解的实验环境。但是,目前公开的 WSL2 并不完美,因此我决定改造 WSL2,使其达到与真机或 VMware 虚拟机相同的效果。我喜欢 WSL2 的主要原因是它启动非常快,只需一秒钟,可以与 Windows 完美结合,资源占用也很少。再加上可以直接与 Linux 通信和调试的 VSCode,使得编程研究环境变得非常友好,感觉 Windows 和 Linux 的混合编程从未如此美好。(通过迁移工具,将 WSL2 迁移到独立的虚拟文件硬盘中,就可以在任何地方使用,无需重新安装和配置 Kali 环境)。

还有一个想法要提一下。如果将这项技术编译到安卓模拟器中,就可以使用任何无线网卡通过 WiFi 万能模式获取密码。而且还可以让普通手机透明地连接到任何高功率无线网卡。USB Over Internet 工具早在多年前就开始使用,解决了 Hyper-V 虚拟机不直接支持 USB 设备的问题,现在在 WSL 上使用,也算是新的利用方式。

改造 Kali,安装超级工具集

从微软商店下载并安装最新的 Kali,进行必要的准备工作,然后开始进行内核编译和升级。

升级的目的是为了打造一个强大的 Kali,因此,加载无线网卡非常重要。以下是在 WSL 中安装的 Kali 界面和工具集。具体过程省略,与本次技术实践的目的不同。

WSL2 的改造思路

通过对 Windows 的升级,最终获得 WSL2 的使用体验。也可以在 VMware 中安装最新的体验版来直接使用 WSL2 的所有特性。我注册了微软的体验者用户,然后从 Windows 10 体验站中下载最新的体验包 Windows10InsiderPreviewEnterpriseVLx64zh-cn_19041.iso,直接安装这个体验包,可以省去很多升级的麻烦。

微软在新的 WSL2 中使用了 Hyper-V 技术来支持独立的 Linux 应用(换句话说,Hyper-V 主要解决 Windows 不完美支持大小写以及软硬链接等 Linux 中的各种问题,但可能会带来安全方面的问题,比如在内核改造过程中发现了一些安全隐患。Windows 和 Linux 的结合最头疼的实际上是用户权限分配问题,还有一个隐藏的问题是,如果 Windows 强制使用大小写敏感的文件系统,将给黑客带来很多想象的空间)。

遗憾的是,无论是微软的 Hyper-V 技术还是 Windows 10 2004 版上的新版 WSL2,都不直接支持无线网卡等 USB 设备。最近在研究 WSL 的过程中,发现可以利用微软开源的 WSL 内核代码,通过手动编译内核并加入一个名为 USB/IP 的项目,在宿主机上运行 USB/IP 服务程序,将主机的 USB 网卡通过 USB/IP 转发给 WSL 内核,从而实现主机 USB 设备透明地提供给 WSL 使用。

在 Windows 中安装 USB/IP,可以通过下载 GIT 代码来编译实现:git clone 。USB/IP 的功能是将主机端的 USB 口通过以太报文传送到客户端,让客户端虚拟出这个 USB 设备,实现 USB 协议的透传效果。

编译的过程不再赘述,可以直接使用编译好的结果:USB/IP 的执行文件。关于如何在 Windows 中安装非合法签名的驱动,请自行搜索。需要注意的是,如果 BIOS 设置为安全启动,则无法在 Windows 中修改为测试模式。

在每台设备上,内核代码与操作系统绑定,因此不可能编译一次然后到处使用。必须在每台主机上编译完成后,再替换掉 WSL2 的启动镜像。最终形成的 Kali 镜像文件可以安全地覆盖现有的镜像文件,实现不断升级和完善调试环境的目的。

WSL 的运行由两部分组成,操作系统的启动部分和某个操作系统运行部分。操作系统启动部分对于所有的 WSL 都是共享的,所谓的内核编译就是替换掉这个共享的部分。无论是运行 Kali、Ubuntu 还是其他系统,这部分都是共享的。因此,在 Kali 中编译内核代码并替换现有的内核后,每个镜像都具备了统一的新内核功能,比如我们这次实现的 USB/IP 支持功能。

编译内核代码并替换内核

微软开放了 WSL2 的内核,可以直接从 GitHub 下载:git clone 。

编译时间很快,可能是因为我的机器比较强大,也可能有其他原因,系统在编译时自动加上了 -j12 选项,非常智能。估计是系统根据环境中的 CPU 内核数量自动加上的优化选项。总之,自从微软加入开源的 Linux 阵营后,变得非常强大,几乎秒杀其他努力生存的程序员(比如有了 VSCode,我几乎不再使用其他各种 IDE 环境了)。但是为了使用网卡驱动,必须在 menuconfig 中勾选几个选项。具体的我忘记了,主要是在编译网卡驱动时,如果提示找不到各种头文件或变量,重新勾选内核的某些支持功能。因为我们的无线网卡主要运行在嗅探模式,并不是所有网络都支持。我选择的是瑞昱 Realtek-RTL8187 无线网卡,该网卡功率可以调节,并且有源码支持内核编译。

最好先执行 make distclean 清除所有垃圾文件,然后重新编译。最近发现 WSL2-Linux-Kernel 的变化很大,所以可以先备份 .config 文件,然后经常执行 git reset –hard 和 git pull 来更新最新的内核文件。为了简单起见,可以先从当前操作系统中复制定制的 .config 文件来正确编译新的内核。

cp /proc/config.gz . & gzip -d ./config.gz & mv config .config & make menuconfig

由于新内核支持 USB/IP,因此在 menuconfig 中需要选择相关选项。

编译结束后,可以执行 make modulesinstall & make headersinstall & make install 来安装内核文件和相应的头文件到 /lib/modules 中。

这里有个技巧:在某个硬盘 x: 上创建一个 Source 目录,并将其软链接到该目录,以便于内外交换文件和在外部宿主机上编译代码。我将所有源码文件存放在这个 x:Source 目录中,以节约 WSL 空间。另外,由于 Windows 部分支持大小写敏感,最好将这个共享目录设置为大小写敏感,以支持某些 Linux 应用。

mkdir ~/source & ln -s /mnt/x/Source ~/source

编译后,在当前目录中找到 vmlinux 文件,将其复制到 ~/source 中,然后关闭 WSL 虚拟机(PS C:WINDOWSsystem32>wsl –shutdown),备份好 C:WindowsSystem32lxsstoolskernel 文件夹,将 vmlinux 改名为 kernel,然后重新启动 Kali。

至此,我们已经改造了新的 WSL2 内核,使其能够加载 USB/IP 驱动。

编译 USB/IP 工具

单独编译 USB/IP 的加载工具,以便后续与主机通信和模拟仿真。

进入内核代码的 tools 目录,开始编译:

cd tools/usb/usbip & ./autogen.sh & ./configure & make install

在 Kali 中挂载无线网卡并在 Windows 中提供 USB/IP 服务

现在是见证奇迹的时刻。首先,我们需要将 Windows 设置为测试模式,以便加载 USB/IP 驱动并提供 USB/IP 服务。这个过程可以在百度上搜索。如果无法完成,可能是之前的步骤没有做好或防火墙设置不正确。

以下是我使用 usbip 列出 Windows 上的设备并绑定该设备提供服务的截图,注意其中的 1-4 是 RTL8187L 网卡。同时,确保在 Windows 防火墙设置中添加服务提供程序 usbipd.exe,否则在 Kali 中将找不到。

在 Kali 中启动 USB/IP,以接入 Windows 的 USB 设备

回到 Kali,此时如果使用 lsusb 命令是无法列出任何设备的。我们可以先在命令行上查询 Windows 提供的服务是否存在,如果存在,则列出 Windows 上绑定的 USB 设备,然后在 Linux 中进行远程加载。加载后,该设备就可以在 Linux 中正常使用了。

首先,我们需要知道 Windows 中绑定虚拟 WSL 网卡的 IP 地址是什么,以便远程绑定。可以运行以下命令获取并将该地址保存在环境变量 wsl_ip 中供使用。我这里是 172.20.80.1(可以是任何设备的 IP 地址,比如树莓派)。此时,Windows 中应该显示调试信息,如果没有显示,可能是之前的步骤没有正确执行或防火墙设置有问题。

export wsl_ip=$(cat /etc/resolv.conf | grep nameserver | awk ‘{print $2}’)

在挂载之前,我们还需要加载之前编译生成的几个新模块,包括 usbcore.ko、usb-common.ko、usbip-core.ko 和 vhci-hcd.ko,以及其他根据需要加载的模块。使用 modprobe 命令加载到系统中:

我们可以先使用 lsusb 命令测试一下是否能够列出新的普通 USB 设备(如 USB hub),然后开始挂载该 IP 的 USB 设备:usbip attach -r $wsl_ip -b 1-4。再次使用 lsusb 命令测试一下,在 Kali 中是否多出一个新的 USB 网卡设备。

最后一步是添加无线网卡驱动。如果成功加载驱动,Kali 就可以像真机一样享受无线网卡带来的各种便利。

加载无线网卡驱动,使用 wifite 测试网卡功能

加载驱动有两种方式,一种是下载驱动源码并在配置好的 Kali 中进行编译和安装。另一种是发现一个开源项目可以完美解决我手头的 8187L 驱动安装问题:git clone 。下载后运行脚本程序,如果有问题可以简单修改一下脚本,比如将其改为以超级用户身份运行。以下是见证奇迹的时刻。新版的 wifite2 改变了旧版本的编程风格,并支持 PMKID、Pyrit 和 pcxtools 等新特性,可以进一步改造成强大的 WiFi 破解工具。

备份 Kali 虚拟机,直接在其他机器上使用

在我们的 Kali 中,经过各种编译工具和环境的安装,我们希望能够在多个地方重复使用,就像使用 VMware 镜像一样。为了方便起见,可以使用迁移工具将 Kali 镜像文件备份,并在其他机器上安装一个新的 Kali,然后用备份的镜像文件覆盖该镜像,实现定制 Kali 环境的迁移、部署和备份,不断完善和调试环境。使用 LxRunOffline 工具,在 Kali 关机的情况下运行以下命令将其迁移到新位置 x:some_where,然后备份 ext4.vhdx 文件(如果找不到 ext4.vhdx 文件,而是显示一堆 Linux 目录,可能是您的系统没有完美支持 Hyper-V,需要开启该模式),该文件可以随身携带以防丢失。使用该虚拟机镜像文件覆盖其他版本的 WSL 即可。该文件也可以挂载到其他操作系统上作为数据盘使用。

.LxRunOffline.exe m -n kali-linux -d x:some_where

后记

很幸运能够赶上微软收购 GitHub,进入 Linux 阵营,微软推出的一系列工具和措施极大地提高了生产效率,减少了编程的枯燥感,带来了舒适的编写和调试代码的体验。我编写这个教程的初衷是分享,与大家共享有关 Linux 内核和 Windows 结合带来的生产力革命性进步。

编写这个教程花费了我整天的时间,利用了假期,加深了对 VSCode 的认识,也让我下定决心放弃很多无味但可惜的工具。此外,跨平台研究不仅仅局限于此,在物联网时代,我们的设备也需要方便地相互访问,利用计算机强大的计算能力和物联网设备的低成本和灵活部署性,可以应用于许多新领域。对于 WiFi 破解来说,我们完全可以在树莓派等设备上安装无线网卡,利用 Windows 直观操作的便利性,轻松操作分布式设备,实现更好的运筹帷幄效果。

下一步工作是在安卓模拟器中结合 Kali,打造强大的 APP 研究环境和 WiFi 破解工具,该工具将结合“X能**”等 APP,直接从服务器获取所有已知密码,形成独特的密码基础库。

最近有些时间要进行一些研究工作,所以更新了一下很久没碰的 CSDN。奇怪的是,这个编写环境经常会莫名其妙地崩溃,不如 GitHub 稳定,所以一些工作还是在 GitHub 上进行会更好一点。

赞(0)