Windows11下安装WSL2_Kali踩坑记录
城南花已开 Lv5

前言

当前是我全新状态下的Windows11,在此之前我已经受够了之前那个破预览版体验计划了,我先吐槽一下这个b预览版了,某次在弹出系统更新的提示下误打误撞加入了Windows预览版体验计划,优点是我可以更早的体验更新的功能,当时推出的多标签页资源管理器,改了UI的任务管理器,我觉得资源管理器是挺好的可以提高效率,但随之而来的就是每隔一段时间我的电脑就会有各种各样的小毛病,包括绿屏,是的你没有听错,在Windows11下的蓝屏就是绿屏,亦或者是预览版特有的,每每更新提示都会让我觉得心烦,所以从22年国庆过后我就停止在Preview 23650版本,就是这个版本有几个bug会导致无法正常安装WSL,而且这个玩意他竟然还有效期的,在今年的11月份左右就过期了,过期了就导致我Virtual Box的靶机开不起来,方法也是有的,只需将时间调回未过期的时间前即可,太鸡儿麻烦了

我是已经受不了之前哪个破环境了,直接重新安装了Windows 11 24H2版本,还我一个清爽的系统,后面我又花了两天的时间配置环境,应用等

遂记录一下安装Windows For Linux 子系统,在此之前我的打靶流程是利用VMware WorkstationOrcle 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 WokrstationVMnet8网卡,总所周知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 命令,然后重启计算机。

1
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
# Get-VMHost | Select-Object IovSupport,IovSupportReasons | Format-List
# 可以使用上述命令来事先了解相关网卡是否支持 SR-Iov 特性,此特性有助于提高虚拟交换机性能
# 以下命令,在不存在外部网络时,将尝试使用查询到的第一张物理网卡创建一个外部网络,可能会导致短暂的网络中断,请自行提前保存当前工作状态
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
}


# 允许 Windows 预置及刚新建的虚拟交换机进行路由转发,主要是一些极特殊环境会用到
# 好像每次重启都会失效(因此重启后需要再次配置),但是我们可以把它编写成“PowerShell 脚本”放到“本地组策略”里,实现开机自动重新配置
# 本地组策略 -> 计算机策略 - Windows 设置 -> 脚本(启动/关机)
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 #2 63 Up 00-15-5D-8F-A9-54 10 Gbps
vEthernet (LAN) Hyper-V Virtual Ethernet Adapter #3 50 Up 00-50-56-C0-00-08 100 Mbps
以太网 Realtek Gaming 2.5GbE 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 0A-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 6E AX211 160MHz 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界面来创建

image

代理配置

不过在NAT环境下是无法代理宿主机的网络的,我尝试过设置环境变量来进行代理貌似是不行,ping不通宿主机上VM8的IP地址一般来说是192.168.xx.1

所以我利用了Clash中的TUN功能,所以流量经过Clash这个虚拟网卡可以成功实现代理

在开启TUN模式之前,您需要在Serveice Mode中安装一下,重启软件后等待地球变绿即可打开TUN模式

image

在WSL中的流量都是由C:\Windows\SysWOW64\vmnat.exe这个VM8虚拟网卡发出的,如果ping不通google.com之类的地址,谨防DNS劫持

可以使用1.1.1.18.8.8.8

不过有个缺点就是需要将VMware NAT Service这个服务开机自启

image

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 地址。

关键的字段就只有两个networkingModevmSwitch,设为你自己命名的虚拟交换机

微软官方原有配置文档可以参考,特别详细

配置/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		<-- 配置网络
# The primary network interface <-- 配置DNS
# 开机自动连接网络
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源
# See: https://www.kali.org/docs/general-use/kali-linux-sources-list-repositories/
#deb http://http.kali.org/kali kali-last-snapshot main contrib non-free non-free-firmware
# Additional line for source packages
#deb-src http://http.kali.org/kali kali-last-snapshot main contrib non-free non-free-firmware
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
#  This file is part of the debianisation of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# See tmpfiles.d(5) for details

# Type Path Mode UID GID Age Argument
L+ /tmp/.X11-unix - - - - /mnt/wslg/.X11-unix

这样你就可以自动创建Socket文件链接了,但是基于这种情况下WSLg的界面是有点难看的,我也不知道为什么有这个又粗又丑的大白框

image

这是以前的未出故障的GUI,很显然是原生kali的窗口

image

这样你也可以直接在windows的开始菜单中启动

说白了就是使用wslg后台运行kali-linux切到家目录运行firefox,道理是一样的

1
"C:\Program Files\WSL\wslg.exe" -d kali-linux --cd "~" -- /usr/lib/firefox-esr/firefox-esr 

image

Win-Kex故障

当你以普通用户的身份打开kex会发现无法正常运行

设置密码后会报错,打开password文件失败

image

我们可以在/usr/bin/kex的bash脚本中找到相关代码

以win模式启动kex,会检查家目录下的.config/tigervnc/passwd文件是否存在

image

那么我们就手动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

由 Hexo 驱动 & 主题 Keep
本站由 提供部署服务
总字数 258.9k