前言 当前是我全新状态下的Windows11,在此之前我已经受够了之前那个破预览版体验计划了,我先吐槽一下这个b预览版了,某次在弹出系统更新的提示下误打误撞加入了Windows预览版体验计划,优点是我可以更早的体验更新的功能,当时推出的多标签页资源管理器,改了UI的任务管理器,我觉得资源管理器是挺好的可以提高效率,但随之而来的就是每隔一段时间我的电脑就会有各种各样的小毛病,包括绿屏,是的你没有听错,在Windows11下的蓝屏就是绿屏,亦或者是预览版特有的,每每更新提示都会让我觉得心烦,所以从22年国庆过后我就停止在Preview 23650版本,就是这个版本有几个bug会导致无法正常安装WSL,而且这个玩意他竟然还有效期的,在今年的11月份左右就过期了,过期了就导致我Virtual Box的靶机开不起来,方法也是有的,只需将时间调回未过期的时间前即可,太鸡儿麻烦了
我是已经受不了之前哪个破环境了,直接重新安装了Windows 11 24H2版本,还我一个清爽的系统,后面我又花了两天的时间配置环境,应用等
遂记录一下安装Windows For Linux 子系统,在此之前我的打靶流程是利用VMware Workstation和Orcle Virtual Box来联合搭配使用的
使用了WSL即可只用开Virtual Box靶机即可,方便了自己,提高了效率,但网络部分是重中之重,网络配置不好第一步都没法办法开展
在这里踩了很多的坑,请不要使用Mirror模式,虽然可以使你的宿主机与虚拟机共享同一个IP地址,也可以共享代理,但你ping靶机(仅主机模式)的时候会导致TTL超时,我猜测可能时环回地址导致一直循环转发数据包
也请不要使用NAT模式,在此模式下可以ping通靶机,但当通过靶机反弹Shell的时候会弹不上,因为套了一层NAT,当你没有做NAT穿透时,是没办法从外部访问内部NAT网络的
可以采用Bridged模式,直接桥接物理网卡,最省心省力了,但还是有个问题,我目前的网络环境是在校园网下,校园大内网,学校的上网认证系统只允许了每个用户只能进行三台终端认证登入,虽然可以通过DHCP服务器获取IP,但你在未认证之前是没有办法ping通任何一个在线的IP(包括网关),而且每次认证后会随机给你分配IP地址,地址不固定,你靶机也配置桥接的话也可以,但校园网的内网掩码为18,这么说有64个子网,你说扫靶机要扫到猴年马月啊,当然了这是基于我目前的网络环境
所以我采用的是WSL桥接Bridged VMware Wokrstation的VMnet8网卡,总所周知VM8网卡是在VM下的一个NAT网卡,然后靶机桥接WSL 桥接VM8生成的网卡vEthernet(LAN),有点套娃的感觉了🤣
在此环境下完美解决了前两者的问题,还可以连接互联网
先决条件 这里你完全可以参照巨硬官方给的文档来操作,非常详细
先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux ,可以在控制面板-程序-启用或关闭Widows功能中找到,顺便勾选“Hyper-V”功能
安装 WSL 2 之前,必须启用“虚拟机平台”可选功能。 计算机需要虚拟化功能 才能使用此功能。
或者以管理员身份打开 PowerShell(“开始”菜单 >“PowerShell” >单击右键 >“以管理员身份运行”),然后输入以下命令:
1 2 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart <--WSL 开启 dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart <-- 虚拟化开启
重新启动 计算机,以完成 WSL 安装并更新到 WSL 2。
安装WSL 现在,可以使用单个命令安装运行 WSL 所需的一切内容。 在管理员模式下打开 PowerShell 或 Windows 命令提示符,方法是右键单击并选择“以管理员身份运行”,输入 wsl –install 命令,然后重启计算机。
此命令将启用运行 WSL 并安装 Linux 的 Ubuntu 发行版所需的功能。 (可以更改此默认发行版 )。
我还需要安装 Kali 所以再执行一下
1 wsl --install kali-linux
其实上面的步骤你也可以不用通过命令行方式安装
直接在Microsoft Store搜索Linux发行版直接下载安装即可
我直接跳过设置Linux用户信息等阶段了,直接从最小化的Kali开始
WSL配置桥接网络 截至目前我的宿主机环境
1 2 3 4 5 6 7 8 9 10 11 12 ⚡maple ❯❯ wsl -v WSL 版本: 2.3 .26.0 内核版本: 5.15 .167.4 -1 WSLg 版本: 1.0 .65 MSRDC 版本: 1.2 .5620 Direct3D 版本: 1.611 .1 -81528511 DXCore 版本: 10.0 .26100.1 -240331-1435 .ge-release Windows 版本: 10.0 .26100.2605 ⚡maple ❯❯ wsl -l -v NAME STATE VERSION * kali-linux Stopped 2 Ubuntu-20 .04 Stopped 2
你需要创建一个外部虚拟交换机,命名为“LAN”备用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 if ((Get-VMSwitch -SwitchType "External" ).Count -eq 0 ) { New-VMSwitch -Name "LAN" ` -AllowManagementOS $true ` -EnableIov $false ` -EnableEmbeddedTeaming $false ` -EnablePacketDirect $true ` -NetAdapterInterfaceDescription (Get-NetAdapter )[0 ].InterfaceDescription } Get-NetIPInterface | Where-Object {$_ .InterfaceAlias -match "^vEthernet\s.*(Default Switch|WSL|WSLCore|LAN).*$ " } | Set-NetIPInterface -Forwarding Enabled -ErrorAction SilentlyContinue
这部分我是参考其他博主的设置,但是我只是做了创建了虚拟网卡这一步,路由转发这一步我并未操作,也可以正常运行
在(Get-NetAdapter)[0]你可以替换为其他的网卡,你可以通过命令查询网卡,以供你选择序号
1 2 3 4 5 6 7 8 9 10 11 12 13 ⚡maple ❯❯ Get-NetAdapter Name InterfaceDescription ifIndex Status MacAddress LinkSpeed ---- -------------------- ------- ------ ---------- --------- vEthernet (Default Swi... Hyper-V Virtual Ethernet Adapter 5 Up 00 -15-5D-A5-0D-C8 10 Gbps vEthernet (WSL (Hyper-... Hyper-V Virtual Ethernet Adapter vEthernet (LAN) Hyper-V Virtual Ethernet Adapter 以太网 Realtek Gaming 2.5 GbE Family Controller 21 Up 90 -6F-18-03-9D-14 1 Gbps 蓝牙网络连接 Bluetooth Device (Personal Area Netw... 17 Not Present 08 -9D-F4-02-8C-48 0 bps 以太网 2 VirtualBox Host-Only Ethernet Adapter 16 Up 0 A-00-27-00-00-10 1 Gbps VMware Network Adapte...1 VMware Virtual Ethernet Adapter for ... 27 Up 00 -50-56-C0-00-01 100 Mbps WLAN Intel(R ) Wi-Fi 6 E AX211 160 MHz 11 Disabled 08 -9D-F4-02-8C-44 0 bps VMware Network Adapte...8 VMware Virtual Ethernet Adapter for ... 47 Up 00 -50-56-C0-00-08 100 Mbps
由于我的VM8网卡在最后一个,所以我直接填-1,如果有报错那你就将报错行的ture改为flase即可
由于我的网卡不支持数据包的透传特性,这里我将EnablePacketDirect改为flase就可以创建了
这里你也可以使用GUI界面来创建
代理配置 不过在NAT环境下是无法代理宿主机的网络的,我尝试过设置环境变量来进行代理貌似是不行,ping不通宿主机上VM8的IP地址一般来说是192.168.xx.1
所以我利用了Clash中的TUN功能,所以流量经过Clash这个虚拟网卡可以成功实现代理
在开启TUN模式之前,您需要在Serveice Mode中安装一下,重启软件后等待地球变绿即可打开TUN模式
在WSL中的流量都是由C:\Windows\SysWOW64\vmnat.exe这个VM8虚拟网卡发出的,如果ping不通google.com之类的地址,谨防DNS劫持
可以使用1.1.1.1或8.8.8.8
不过有个缺点就是需要将VMware NAT Service这个服务开机自启
Config文件配置 配置%USERPROFILE%/.wslconfig文件,位于宿主机
以下是我的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [wsl2] <-- 主要 WSL 设置 processors=4 <-- 分配给 WSL 2 VM 的逻辑处理器数量 memory=8GB <--分配给 WSL 2 VM 的内存量 swap=4GB <-- 向 WSL 2 VM 添加的交换空间量 #localhostForwarding=true <-- 指定绑定到 WSL 2 VM 中的通配符或 localhost 的端口是否应可通过 localhost:port 从主机连接。 #dnsTunneling = true <-- 更改将 DNS 请求从 WSL 代理到 Windows 的方式 firewall = false <-- Windows 防火墙规则以及特定于 Hyper-V 流量的规则可以筛选 WSL 网络流量。 vmSwitch=LAN <-- 桥接时的虚拟交换机名称 autoProxy=true <-- 强制 WSL 使用 Windows 的 HTTP 代理信息 dnsProxy=false <-- 仅适用于 networkingMode = NAT,通知 WSL 将 Linux 中的 DNS 服务器配置为主机上的 NAT networkingMode=bridged <-- 默认或无法识别的字符串会生成 NAT 网络 [experimental] <-- 实验性设置 autoMemoryReclaim=disabled <-- 检测空闲 CPU 使用率后,自动释放缓存的内存。 sparseVhd = true <-- 如果设置为 true,则任何新创建的 VHD 将自动设置为稀疏。 #hostAddressLoopback=true <-- 仅当 wsl2.networkingMode 设置为 mirrored 时才适用如果设置为 True,将会允许容器通过分配给主机的 IP 地址连接到主机,或允许主机通过此方式连接到容器。 始终可以使用 127.0.0.1 环回地址,此选项也允许使用所有额外分配的本地 IP 地址。 仅支持分配给主机的 IPv4 地址。
关键的字段就只有两个networkingMode和vmSwitch,设为你自己命名的虚拟交换机
微软官方原有配置文档可以参考,特别详细
配置/etc/wsl.conf文件,位于虚拟机
以下是我的个人配置,我选择不添加$PATH变量,我只需要一个explorer.exe直接指定路径即可,不需要windows的环境变量了
不然污染了WSL的环境
1 2 3 4 5 6 7 8 9 ❯ sudo vim /etc/wsl.conf [boot] systemd=true <-- 启用 systemd [network] generateResolvConf = false <-- 将 WSL 设置为生成 /etc/resolv.conf generateHosts = true <-- 将 WSL 设置为生成 /etc/hosts [interop] enabled=true <-- 设置此键可确定 WSL 是否支持启动 Windows 进程。 appendWindowsPath=false <-- 设置此键可确定 WSL 是否会将 Windows 路径元素添加到 $PATH 环境变量。
其他配置均可在官方文档中得知
配置更改的 8 秒规则 必须等到运行你的 Linux 发行版的子系统完全停止运行并重启,配置设置更新才会显示。
Kali配置 配置静态IP、DNS解析、apt源等
这里我就配置了中科大的源,我个人认为中科大的源速度比较快,你可以选择其他的源
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ❯ sudo vim /etc/network/interfaces <-- 配置网络 auto lo iface lo inet loopback auto eth0 allow-hotplug eth0 iface eth0 inet static address 192.168.xx.xx netmask 255.255.255.0 gateway 192.168.xx.2 ❯ sudo vim /etc/resolv.conf domain localdomain search localdomain nameserver 192.168.xx.2 ❯ sudo vim /etc/apt/sources.list <-- 配置apt源 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib ❯ sudo apt clean all && sudo apt update <-- apt更新源 ❯ sudo apt upgrade <-- 更新最新软件(可选)
目前WSL中的Kali是最小化版本的,很多组件都没有比如burpsuite,nmap之类的
你可以选择安装以下包,最常用的就是kali-linux-default
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ❯sudo apt install kali-linux-top10 <-- 装前 10 名最受欢迎的 Kali 工具 ❯sudo apt install kali-linux-default <-- 安装标准 Kali 安装附带的默认工具集 ❯sudo apt install kali-linux-all <-- 安装 Kali Linux 中可用的所有工具,这是最全面的软件包 ❯sudo apt install kali-linux-large <-- 安装大量工具,但不如kali-linux-all ❯sudo apt install kali-linux-everything <-- 安装 Kali Linux 提供的每个软件包。 它类似但可能包含更多的附加实用程序 ❯sudo apt install kali-linux-web <-- 安装专门用于 Web 应用测试的工具 ❯sudo apt install kali-linux-forensic <-- 安装用于取证分析的工具 ❯sudo apt install kali-linux-passwords <-- 安装与密码破解相关的工具 ❯sudo apt install kali-linux-rfid <-- 安装与 RFID 分析和攻击相关的工具 ❯sudo apt install kali-linux-gpu <-- 安装针对基于 GPU 的攻击进行优化的工具 ❯sudo apt install kali-linux-sdr <-- 装用于软件定义无线电(SDR)分析的工具 ❯sudo apt install kali-linux-voip <-- 安装用于语音传输(IP 电话)分析的工具 ❯sudo apt install kali-linux-wireless <-- 安装用于无线网络分析的工具 ❯sudo apt install kali-linux-nethunter <-- 安装针对 Kali Nethunter(用于移动渗透测试)的特定工具 ❯sudo apt install kali-linux-exploit <-- 安装专注于利用开发和漏洞利用的工具
如果你需要GUI图形界面可以安装kex,在此之前你需要设置普通用户并设置密码
通过mstsc.exe远程连接
1 2 3 4 5 6 7 ❯ sudo apt install kali-win-kex ❯ kex --esm --ip --sound Starting Win-KeX server (ESM) Win-KeX server (ESM) is stopped Starting Win-KeX client (ESM) /usr/bin/kex: line 389: cmdkey.exe: command not found Please enter Win-KeX server (ESM) password for user 你的用户名密码:
如果报错可以尝试修改/usr/bin/kex文件第409行中的路径
1 2 ❯ sudo vim /usr/bin/kex /mnt/c/Windows/System32/mstsc.exe .win-kex.rdp /v:${HOST} :3390 &
相关参数贴在下面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 模式: [none] : Window Mode (default) <-- 默认是窗口模式 --esm : Enhanced Session Mode - 在使用 Windows 本地 RDP 的专用窗口中启动 Win-KeX 桌面 --sl : 无缝模式 - 无缝集成 Win-KeX 到 Windows 桌面 --win : 在窗口模式下启动 Win-KeX 桌面,放在一个独立窗口中 ----------------------------------------- 命令: --start : 启动 Win-KeX 服务器 --start-client : 启动 Win-KeX 客户端 --wtstart:在 Windows Terminal 会话中启动 Win-KeX 服务器并启动 Win-KeX 客户端 --stop : 停止 Win-KeX 服务器 --status : 显示 Win-KeX 服务器状态 --kill : 停止 Win-KeX 服务器并结束所有相关进程 --passwd : 设置 Win-KeX 服务器密码 --start-sound : 启动 Windows 音频服务器 停止声音服务器 --wslg-restore : 恢复 WSLg unix 套接字 --wslg-remove : 移除 WSLg unix 套接字 --wslg-status : 显示 WSLg unix socket 的状态 --version: 显示 Win-KeX 版本 ------------------------------------------ (可选)参数: --ip -i : 使用容器 IP 地址,而不是 "localhost" --multiscreen -m:针对多屏进行优化 --sound -s : 声音支持 --nowgl -n : 禁用 Windows OpenGL --norc -r:禁用 Win-KeX 客户端重新连接 - 一次就足够了! --wait -w : 在 SL 模式下等待更长时间启动桌面 --verbose : 详细输出 Examples: kex -s : Start Win-KeX server in window mode and launch Win-KeX client with sound support kex --sl -s : Start Win-KeX in seamless mode and launch Win-KeX client with sound support kex --esm -i -s : Start Win-KeX in Enhanced Session Mode with ARM workaround and launch Win-KeX client with sound support sudo kex : Start Win-KeX server as root in window mode and launch Win-KeX client
基本到这就结束了
后续可以安装zsh可以参考安装Ubuntu那篇文章
故障排除 WSLg无法打开GUI故障 因为安装WSL2的时候会顺带安装WSLg(Windows Subsystem for Linux GUI )该项目的目的是支持在 Windows 上运行 Linux GUI 应用程序(X11 和 Wayland),并提供完全集成的桌面体验
但是有时候会遇到无法打开GUI界面的情况,例如我打开firefox,会显示Error找不到display
1 2 3 ❯ firefox [863] Wayland Proxy [0x7f402464dce0] Error: CheckWaylandDisplay(): Failed to connect to Wayland display '/run/user/1000//wayland-0' error: No such file or directory Error: we don't have any display, WAYLAND_DISPLAY=' wayland-0' DISPLAY=' :0'
这时候可以看一下官方Wiki贴在文末了
你可以echo一下display这个变量,但是/tmp/.X11-unix这个目录并没有链接WSLg
1 2 3 4 5 6 ❯ echo $DISPLAY :0 ❯ ls -al /tmp/.X11-unix/ total 0 drwxrwxrwt 2 root root 40 Jan 7 21:00 . drwxrwxrwt 9 root root 180 Jan 7 21:00 ..
你可以在mnt目录下找到X0
1 2 3 4 5 ❯ ls -al /mnt/wslg/.X11-unix/ total 0 drwxrwxrwx 2 root root 60 Jan 7 21:00 . drwxrwxrwt 7 root root 300 Jan 7 21:00 .. srwxrwxrwx 1 Pepster Pepster 0 Jan 7 21:00 X0
可以先取消挂载然后删除文件夹再进行手工创建链接
1 2 3 ❯ sudo umount /tmp/.X11-unix ❯ sudo rm -rf /tmp/.X11-unix ❯ sudo ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix
但是每次WSL开机都要这么操作太麻烦了
你可以将命令写入.bashrc或者.zshrc
1 sudo rm -r /tmp/.X11-unix&&ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix
但我更推荐下面的做法
你可以将命令写入systemd 配置自动化运行文件
写入/etc/tmpfiles.d/wslg.conf
1 2 3 4 5 6 7 8 9 10 11 L+ /tmp/.X11-unix - - - - /mnt/wslg/.X11-unix
这样你就可以自动创建Socket文件链接了,但是基于这种情况下WSLg的界面是有点难看的,我也不知道为什么有这个又粗又丑的大白框
这是以前的未出故障的GUI,很显然是原生kali的窗口
这样你也可以直接在windows的开始菜单中启动
说白了就是使用wslg后台运行kali-linux切到家目录运行firefox,道理是一样的
1 "C:\Program Files\WSL\wslg.exe" -d kali-linux --cd "~" -- /usr/lib/firefox-esr/firefox-esr
Win-Kex故障 当你以普通用户的身份打开kex会发现无法正常运行
设置密码后会报错,打开password文件失败
我们可以在/usr/bin/kex的bash脚本中找到相关代码
以win模式启动kex,会检查家目录下的.config/tigervnc/passwd文件是否存在
那么我们就手动cp就行了,将.vnc下生成的passwd复制到tigervnc目录下
1 2 3 4 5 6 7 8 9 ❯ cd .vnc ❯ ls -al total 104 drwxr-xr-x 2 Pepster Pepster 4096 Jan 7 21:40 . drwx------ 49 Pepster Pepster 4096 Jan 7 21:44 .. -rw------- 1 Pepster Pepster 8 Jan 7 21:39 passwd -rw-r--r-- 1 Pepster Pepster 84149 Jan 7 21:40 primary.:1.log -rw-r--r-- 1 Pepster Pepster 5 Jan 7 21:40 primary.:1.pid ❯ cp passwd ../.config/tigervnc
即可不输入密码,直接以普通用户打开kex win模式
参考文章
WSLg/WSL2 通过网桥实现局域网同网域(网段)互通 - STARGAZER
安装 WSL | Microsoft Learn
WSL 中的高级设置配置 | Microsoft Learn
dantmnf/WSLAttachSwitch at latest
WSL2改为桥接 | Zzz记忆
最详细的WSL安装kali教程 + 图形化界面(踩完了所有的坑)_哔哩哔哩_bilibili
桥接网络模式的 WSL2 的安装与配置 - 哔哩哔哩
Diagnosing “cannot open display” type issues with WSLg · microsoft/wslg Wiki
无法使用 2.0.12 启动 GUI 应用程序 ·问题 #1156 ·微软/WSLG
Init /tmp/.X11-unix is overwritten by mounts · Issue #43 · microsoft/wslg
/tmp/ 中。X11-unix 以只读方式挂载 ·问题 #9303 ·微软/WSL