6519 字
33 分钟
Kali-Linux Pwn 环境配置 - 使用 WSL
NOTE

Tips:

  1. 本教程于 2026.1 更新

    由于教程是在 WSL 子系统教程之后编写的,只作为针对新手的补充,后续可以参照子系统的教程,相对来说没有子系统的教程细致,但是更适合新手

  2. 本教程默认你有了基本的计算机操作水平并且已经解决了任何网络问题

  3. 由于网页和图床代理到 Cloudflare,如果你浏览有些卡顿甚至加载失败,请自行加速并刷新

1. 安装 WSL 2#

TIP

无论你有没有安装过子系统,在你选择了 Windows 11 的时候,你就可以使用 wsl 命令

在此之前,请确保你开启了Windows 功能中的适用于 Linux 的 Windows 子系统虚拟机平台

environment_linux-pwn-wsl-D8EA2A9A-C6D0-420B-8CE4-23563A12C985

微软提供了详细的安装 WSL 2 的方式:

Loading preview...
Waiting for metadata...

简单来讲就是在 cmd(Powershell)里一句命令的事情

PowerShell terminal
wsl --update

2. 下载并安装任意发行版#

TIP

提示:所有方法安装后均可以在 Windows Terminal 找到对应的快捷选项卡

2-1 使用微软商店#

这里以安装 Kali-Linux 为示例,使用微软商店是最简单的方式,直接打开 Microsoft Store 搜索 Kali Linux 下载安装并打开

environment_linux-pwn-wsl-88E3125C-2D1B-4D32-BCE7-B67B04A06E23

2-2 使用命令行#

也是很简单的方式,我们只需要输入

PowerShell terminal
wsl --list --online

然后输入

PowerShell terminal
wsl.exe --install <发行版名称>

安装即可

PEWK1-image-20250930104507689

2-3 解包官方发行版安装包并安装#

使用微软商店安装镜像会默认安装到 C 盘,这里可以手动解压微软官方的 Appx 安装包并运行安装包的初始化 exe 程序,确保镜像生成在和 exe 程序相同目录,免去二次迁移位置的苦恼,这里还是以安装 Kali-Linux 为示例

下载 Kali Linux 的 Appx 可以在下面的网页中下载

Loading preview...
Waiting for metadata...

你只需要去微软商店点击分享按钮并复制链接到网页就可以下载了,本体在 Appxbundle 中

environment_linux-pwn-wsl-3418B2EF-A43A-4F66-ACC0-1FE99C31D225

下载好以后可以双击安装,当然,用压缩软件打开发现以下文件

environment_linux-pwn-wsl-FBD300B3-E8B1-420D-8826-113E02A2692A

选择最下面的 x64 并再次用压缩软件打开(除非你真的用 ARM 架构的 Windows),并挑个好位置解压,文件夹里面应该有下面的文件,到此就算安装完毕了,只需要启动 kali.exe 就可以进行初始化

environment_linux-pwn-wsl-1D0F1F63-896B-40A1-80D8-651204F2CB69

2-4 导入任意类型 tar 安装包#

如果你是官网下载的 Ubuntu 或者是其他的官方发行版,亦或者是第三方发行版,*只要你找到对应的根文件系统的 .tar 包,你就可以导入到 WSL 里

Loading preview...
Waiting for metadata...

下载了 Ubuntu 最新的 WSL 安装包

environment_linux-pwn-wsl-722DE945-2969-41C4-B908-8755E19C56F2

接着就可以使用一下命令导入

PowerShell terminal
wsl.exe --import <发行版名称> <安装位置> <文件位置> [Options]
Options:
--version <Version>
--vhd

举例,我要导入上文的包到一个目录,例如 F:\Virtual-Machine\Ubuntu ,那么我就会输入

PowerShell terminal
wsl --import Ubuntu "F:\Virtual-Machine\Ubuntu" "C:\Users\Lufiende\Downloads\ubuntu-24.04.3-wsl-amd64.gz"

这个方式安装可能会导致 Windows Terminal 图标有问腿,需要手动定位


3. 简单配置虚拟机#

Shell terminal
touch ~/.hushlogin

3-1 WSL 基本设置#

如果你开着一些代理软件,你可能会发现,他会告诉你诸如 Nat 模式无法使用代理等等的提醒,这是因为微软塞了一堆奇怪的小功能,你可以尝试去改动一些 WSL 的设置,如果你开着 Windows 的更新,你大抵是可以在开始菜单看到这个

environment_linux-pwn-wsl-DF4E72D1-8D49-4BA7-B6B2-D49AED7B8110

你可以参考我的设置,我放到了下面,如果你没有看到这个,你可以去用户目录下(C:\Users\xxx)新建一个 .wslconfig 文件写入配置,具体配置写法可以参照:

Loading preview...
Waiting for metadata...

(事实上能改的不止这一个,还有 wsl.conf.wslgconfig 等)

配置文件内容如下~~(实际就是个配置文件生成器)~~

.wslconfig
[wsl2]
processors=16
networkingMode=Mirrored
[experimental]
hostAddressLoopback=true
sparseVhd=true

environment_linux-pwn-wsl-C7BD3425-52F2-408D-870D-7C99EA19270F

关键的选择也是有的,这个 Mirrored 的网络模式也是有意思的,这个是继承自 Hyper-V 的功能,十分方便,能直接引用系统代理,如果你将来要进一步进行各种物联网仿真工作的话,其实 Nat 也是一种很好的选择

同时你可以选择默认启用稀疏 VHD 使得删除文件时虚拟磁盘文件可以同步缩小

3-2 用户操作#

3-2-1 创建用户#

如果你使用上文前三种的方式创建了虚拟机,第一次打开它大概率会直接要求你建立一个账户并设置一个密码,按提示设置即可,以防万一还是提醒一下你看不到你输入的密码

如果你使用第四种方法,大概率登录直接是 root 账户,那么你可以新建一个,默认情况下都会建议你,用户名不能包含大写字母,也不能包含某些特殊字符,当然我也建议遵守这条限制

Shell terminal
useradd -m <用户名> # 添加用户,-m 可以建立 /home 下的用户名目录
passwd <用户名> # 改密码
su <用户名> # 切换用户

3-2-2 添加用户到 Sudo 组#

先看看你的账户能不能用 sudo,如果输入密码之后提示 xxx is not in the sudoers file,接着往下看

进入 root 用户,如果你不知道密码,你可以使用

PowerShell terminal
wsl -d <发行版> -u root

进入 root,然后使用 passwd 新建一个密码,可以方便以后直接进入,然后

Shell terminal
usermod -aG sudo <用户名>

就可以了

3-2-3 将 Sudo 组免密(可选)#

我们需要修改 /etc/sudoers 实现效果

Shell terminal
sudo visudo
# 或者
su root
visudo
sudoers
root ALL=(ALL:ALL) ALL
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
@includedir /etc/sudoers.d

图示如下

environment_linux-pwn-wsl-967C6257-083C-45F2-B4CD-900DB1F21BFD

3-3 更新软件源#

目前实测,大概率,你不需要进行任何换源操作就能更新,会自动使用镜像源,虽然镜像源不是很稳定,直接

Shell terminal
sudo apt update
sudo apt full-upgrade #(可选)

3-4 汉化虚拟机#

我们可以趁机把汉化搞一下

Shell terminal
sudo apt install locales
sudo apt install locales-all # 有就安,不用等待生成了,kali 自带了
sudo dpkg-reconfigure locales

看介绍,这是要生成不同地区使用语言的区域设置,用滚轮或者上下键选择语言,这里以防万一可以全选,也可以拉下去只选 zh_CN.UTF-8 UTF-8en_US.UTF-8 UTF-8,然后回车

environment_linux-pwn-wsl-7EC199AE-4135-4B17-ABC2-45D35480755A

回车后,接下来是选择默认语言,选择 zh_CN.UTF-8 就可以,除非你是罕见选完之后关掉现在的终端,重启或者 logout 也行,重新打开就能看见效果,比如看看 apt 的超级牛力

environment_linux-pwn-wsl-BC61C389-C685-45F8-BB53-99D58B0560FF

3-5 备份虚拟机#

十分简单,备份只需要

PowerShell terminal
wsl --export <发行版名称> X:\path\to\xxx.tar

导入类似于 2-4 提供的安装方法,可以

PowerShell terminal
wsl --import <发行版名称> X:\path\to\ext4.vhdx (即<存放目录>) X:\path\to\xxx.tar (即<备份目录>) --version 2

4. 针对性的高级配置#

4-1 Kali-Linux 高级配置#

4-1-1 安装配套开箱即用 MetaPackages#

如果你安装了一个 Kali 发行版,他可能会提示你一些内容,例如

environment_linux-pwn-wsl-00E7A7F9-425E-486F-B78C-8FFB01B823C7

意思是 WSL 安装 Kali 都是以最小化模式安装的,并没有附带 Kali 的哪些强大的工具包,接下来就是去安装那些包的过程,安装的包叫 Metapackages,就是一次能安很多包的包,为了以后的方便,我们需要安装一些初始工具包,让 Kali 更加完整,我们会在下面指导这部分的安装内容,安装完后会自动消失

当然你也可以选择不安装,我这里选择不安装自带包,感觉我不是很用的上,忽略提示也可

官方链接:

Loading preview...
Waiting for metadata...

可以按官方教程来

我们首先需要执行

Shell terminal
sudo apt update
sudo apt full-upgrade -y
kali-tweaks

然后就会出现

environment_linux-pwn-wsl-983A8C20-2CB3-4EF7-929D-0252966A3C97

第二项就是我们要安装的 Metapackages 了,这里我放出来了官方的描述

  • kali-linux-core: Base Kali Linux System – core items that are always included
  • kali-linux-headless: Default install that doesn’t require GUI
  • kali-linux-default: “Default” desktop images include these tools
  • kali-linux-arm: All tools suitable for ARM devices
  • kali-linux-nethunter: Tools used as part of Kali NetHunter

一般选圈住的第一个的 kali-linux-default,用不到图形化界面可以选择 kali-linux-headless,如果喜欢一步到位可以选择 kali-linux-large,如果有特殊需求可以结合官网安装其他的包

environment_linux-pwn-wsl-517E95F7-2E90-4D25-8BF9-D22A1D596C3F

4-1-2 Kali-tweaks 自定义选项#

Shell & Prompt

environment_linux-pwn-wsl-F6D14C6A-32FD-4D1B-A491-D4E866FB9997

Configure Prompt 用于调整终端的主题样式,可以自行摸索

Default Login Shell 用于调整默认终端,一般是 bashzsh 中选择,这里建议大家可以在把默认终端改成 zsh,因为好用

Reset Shell Config 用于重置终端设置,就是 .bashrc.zshrc 之类的


Network Repositories

environment_linux-pwn-wsl-81630668-2A45-42E4-95AB-163F4AA9953C

Additional Kali repositories 别选,各位师傅你也不想因为一些包不稳定的更新而崩溃吧

Mirrors 是下载源的设置,你看到这里会发现我根本没有提过换源这个说法,其实是 kali 会自动用适合所在地的镜像而已,如果没有特殊原因无需变动

Protocol 是选协议,对于 apt 来说 https 其实安全不到哪去,维持原样即可


Hardening Settings

environment_linux-pwn-wsl-FF9294E2-86B6-4E54-8670-0B851215EE24

Kernel settings 涉及到关于 dmesg 命令的使用权限以及特权端口选项的开关,这个根据需要配置,你当个赛棍还管这么多,又用不到

Wide Compatibility mode 可以让你连接一些旧的,老的,不安全的客户端,按需开启

4-2 使用易用的 Shell#

如果你使用的是 Kali-Linux,那么看上面的 Kali-tweaks 切换终端,以及简单美化

如果你想美化终端,可以看下方的 个性化终端

一般来说,常用的 Shell 包括 shbashzsh 三种 Shell,其中我们常用前两者来解释我们写的 *.sh 脚本,后者作为我们日常使用的利器,大部分的发行版都包括了前两者 ,一些简洁的系统,例如 Alpine,则只有由 busybox 支持的 sh 一个 Shell

另外的,还有支持分屏的 tmux ,请大家自行探索,可以根据你的系统来安装

Shell terminal
sudo apt install bash zsh
cat /etc/shells # 查看安装了多少 Shell
echo $SHELL # 查看当前使用的 Shell
echo $0 # 同上,查看当前使用的 Shell
# 切换 Shell:chsh -s [shell 位置]
chsh -s /bin/bash # 切换为Bash
chsh -s /bin/zsh # 切换为Zsh

4-3 个性化 Shell(可选)#

4-3-1安装 oh-my-zsh#

Shell terminal
sudo apt install wget git curl

这里使用 oh-my-zsh 来进行个性化,官网:

Loading preview...
Waiting for metadata...

点击 install oh-my-zsh 之后,页面会自动滚到下载连接页

environment_linux-pwn-wsl-5DBAD26E-F6F9-490A-A10B-87EAAA12E864

Shell terminal
# 复制下载链接(注意时效性,二选一)
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"

链接粘贴到终端下载就行,安装时会自动帮你把原本的 .zshrc 备份到同目录下的 .zshrc.pre-oh-my-zsh

效果如下图

environment_linux-pwn-wsl-69D1A904-C290-4518-86BA-49A85313E339

4-3-2 安装前置字体#

在此之前,你需要了解,因为这些主题通常会用到专业的字体,常见的可能就是 Nerd 和 Powerline ,某些主题很可能会推荐其中之一的字体,甚至是会直接提供基于这些字体修补过的专用字体,安装主题时需要多留意源网页的安装指导

NOTE

下文的 Powerlevel10k 使用了修补过的 nerd 字体

MesloLGS NF Regular.ttf

MesloLGS NF Bold.ttf

MesloLGS NF Italic.ttf

MesloLGS NF Bold Italic.ttf

如果没有给出特定的下载连接或者是字体样式,你可以尝试普通的 Nerd 或者是 Powerline

Nerd 下载地址:

Loading preview...
Waiting for metadata...

Powerline 仓库:

powerline
/
fonts
Waiting for api.github.com...
00K
0K
0K
Waiting...

由于通常使用子系统会使用 Windows Terminal ,所以我们需要在 Windows Terminal 进行一些配置

environment_linux-pwn-wsl-35885D3F-A7ED-4918-BCCE-2240A9AD4856

environment_linux-pwn-wsl-EE5475F4-8CA5-4FBA-BCE9-E3F0AECA3102

选择安装的字体就可以了,图片仅作示例

4-3-3 搜索并安装主题#

完成这些工作,你可以在官网的 Themes 找到各种主题

environment_linux-pwn-wsl-7141E61A-6F6D-4E34-B008-0AB98B591CF1

当然也可以自行在搜索引擎上寻找自己喜欢的主题

但是,每个主题的安装方式可能有差别,所以请大家仔细阅读每个主题提供的安装文档!

这里我以 Powerlevel10k 主题为例,链接:选择它

romkatv
/
powerlevel10k
Waiting for api.github.com...
00K
0K
0K
Waiting...

可以参考源页面的安装方法,下载方式

Shell terminal
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

也可以使用 gitee.com 上的官方镜像加速下载

Shell terminal
git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k

编辑 ~/.zshrc 并找到 ZSH_THEME , 改为 "powerlevel10k/powerlevel10k"

environment_linux-pwn-wsl-36E78827-0749-4634-8FF0-4132EEEB8139

这个主题第一次运行会有一个引导初始化设置的界面,如果不小心关掉或者想尝试一些别的设置可以使用 p10k configure 再次启动

environment_linux-pwn-wsl-94301A65-5BF6-42E2-AF7B-67773D9D01D3

4-3-4 启用一些喜欢的 oh-my-zsh 插件#

zsh 内置了许多丰富的插件,查看可以在 $ZSH/plugins/ 下查看

environment_linux-pwn-wsl-4C577E90-59E5-44A0-A820-9293CCDC832C

网络上也有许多优秀的插件,比如 zsh-syntax-highlighting

zsh-users
/
zsh-syntax-highlighting
Waiting for api.github.com...
00K
0K
0K
Waiting...

它们都在 $ZSH/custom/plugins/ 目录下

包括 zsh-syntax-highlighting 在内的第三方插件都会在 github 官方文档中写明插件的安装方式,例如

Shell terminal
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

更多有意思的插件可以在网络上寻找或查找相关大佬的文章

当安装好插件后就可以启用了,还是在 .zshrc 中启用,我们找到 plugins=() 进行修改

~/.zshrc
plugins=(
# 我的示例,这里面写你要添加的插件名字
git
zsh-syntax-highlighting # 外部
z
ssh
zsh-completions # 外部
command-not-found
history
history-substring-search
you-should-use # 外部
)

保存退出,重启 zsh 就可以看到改变了

4-4 联动 VSCode#

前往官网下载 VS Code

首先,确保宿主机安装了 VSCode ,并且安装了 WSL 插件

environment_linux-pwn-wsl-16D01610-C4A0-4BF4-9C60-7C77DE4F98E2

尝试在 VSCode 中连接一下当前的虚拟机,点左边下面的 ><连接到 WSL

environment_linux-pwn-wsl-99A304FE-58F3-4BB0-B108-6248BB531C1D

或者,尝试在虚拟机中使用

Shell terminal
code .

一般来讲会安装一个叫 .vscode-server 的东西,这个安装完就可以正常使用

如果不能用,把下面这个放到 .bashrc 或者是 .zshrc

~/.zshrc
alias code="/mnt/<映射主机的 VSCode 安装目录>/bin/code"

之后直接在目录中使用

PowerShell terminal
wsl -d kali-linux
code .

即可使用 vscode 编写脚本


5. Python 独立环境安装#

5-1 为什么我需要一个独立 Python 环境#

众所周知,Python 一般各个发行版都会提供,我们可以使用 apt 安装,甚至已经内置,为什么我们不直接使用,并在系统的 Python 直接安装各种包呢?

其实,系统层面的 Python 大概率是为系统的其他部件提供支持的,许多 Python 项目通常需要依赖某些特定版本的库,可以说是专门为了系统各种软件和功能量身定制的,甚至可以说并不是给用户准备的,如果你后期安装了一些系统已经内置的包,但是版本有冲突,可能会出现一些问题

对于某些经常更新的系统,例如 Kali-linux,它是一个 Rolling Release 即 滚动更新 的版本,apt 会不定期的更新安装所有安装的包如果你和小伙伴约定组一辈子的 ctf 战队的话如果遇到更新 Python 的情况,默认使用系统安装的 Python 的话,默认 Python 有朝一日可能会被更改成一个更新的版本,这时候你使用 Python 就会发现你的 Python 环境一朝回到解放前,只能使用诸如 python3.xx 的命令运行 Python 并且一些程序也会因为缺少依赖而无法运作,这是因为他会改掉 Python 对应的默认版本

理论上你可以通过修改 Python 的链接符号,或者是在新版本 Python 对应 pip 安装包时添加参数 --break-system-packages 来达成目的,但是我认为通过 pip 安装会在滚动更新的系统上引起一些其他不必要的 bug,创建一个虚拟环境来安装需要的包是个不错的选择

environment_linux-pwn-wsl-FBBAF8F2-A943-419B-9A12-4C91E1D5F7EE

这里有几种解决方法:

  • 使用 pyenvconda 类型的环境管理
  • 使用 uv 进行环境管理
  • 使用 pipx
  • 使用 apt 安装 python3-pwntools 等包

这里只介绍前两种,通常你只需要一个独立的环境即可,不需要太麻烦的环境管理

5-2 安装 uv#

uv 有详细的官方文档:

Loading preview...
Waiting for metadata...

可以使用一键安装脚本,请确认 ~/.local/bin 处于环境变量中

Shell terminal
curl -LsSf https://astral.sh/uv/install.sh | sh

如果你想自定义安装的话,可以定义下面几个环境变量,记得把下面存放可执行文件的目录放到环境变量中,也可以参考官方的 init 方法

~/.zshrc
# 写入 .bashrc
export UV_INSTALL_DIR="/mnt/wsldata/Environment/uv"
# 这是 uv 的安装目录,先定义环境变量再执行安装脚本
export UV_CACHE_DIR="$UV_INSTALL_DIR/cache"
# 这是 uv 的缓存目录
export UV_PYTHON_BIN_DIR="$UV_INSTALL_DIR/bin"
# 这是 python 可执行文件目录,需要添加到 PATH
export UV_PYTHON_INSTALL_DIR="$UV_INSTALL_DIR/installed"
# 这是 uv 的 pytohn 安装目录
export UV_TOOL_BIN_DIR="$UV_INSTALL_DIR/toolbin"
# 这是 uv 所有安装的包的可执行文件目录,需要添加到 PATH
export UV_TOOL_DIR="$UV_INSTALL_DIR/tools"
# 这是 uv 的包安装目录

安装过后可以尝试执行 uv,发现可以正常工作

environment_linux-pwn-wsl-5999096E-593F-4A22-BFCC-F7F6C611F1A2

5-3 安装 Pyenv#

Pyenv 官方仓库:

pyenv
/
pyenv
Waiting for api.github.com...
00K
0K
0K
Waiting...

一键安装可以使用官方提供的脚本

Shell terminal
curl -fsSL https://pyenv.run | bash

如果你想安装到自己的目录,你可以尝试

Shell terminal
git clone https://github.com/pyenv/pyenv.git /path/to/directory

如果你使用 zsh,下一步需要执行下面的命令(作用是添加下面对应内容进入 .zshrc

Shell terminal
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init - zsh)"' >> ~/.zshrc

自己安装请改动目录位置

Shell terminal
echo 'export PYENV_ROOT="/path/to/directory/.pyenv"' >> ~/.zshrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init - zsh)"' >> ~/.zshrc
# 追加插件
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

你可以参考我的

environment_linux-pwn-wsl-82294B13-D5F2-4440-B0C5-6D29DC399767

然后就可以使用了

Shell terminal
pyenv # 输入
pyenv 2.6.7-13-g2ecd676a
Usage: pyenv <command> [<args>]
Some useful pyenv commands are:
commands List all available pyenv commands
exec Run an executable with the selected Python version
global Set or show the global Python version(s)
help Display help for a command
hooks List hook scripts for a given pyenv command
init Configure the shell environment for pyenv
install Install a Python version using python-build
latest Print the latest installed or known version with the given prefix
local Set or show the local application-specific Python version(s)
prefix Display prefixes for Python versions
rehash Rehash pyenv shims (run this after installing executables)
root Display the root directory where versions and shims are kept
shell Set or show the shell-specific Python version
shims List existing pyenv shims
uninstall Uninstall Python versions
--version Display the version of pyenv
version Show the current Python version(s) and its origin
version-file Detect the file that sets the current pyenv version
version-name Show the current Python version
version-origin Explain how the current Python version is set
versions List all Python versions available to pyenv
whence List all Python versions that contain the given executable
which Display the full path to an executable
See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme

但是还没有结束,你需要安装 一些库来保证你可以编译出 Python,不同发行版可以参考:

Loading preview...
Waiting for metadata...

这里列出 Debian 系的包列表

Shell terminal
sudo apt update;
sudo apt install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl git libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

然后就可以准备安装工作

Shell terminal
pyenv install -l # 列出版本列表
pyenv install <某个列出的版本号>
# 替换默认终端(可选)
pyenv global <某个列出的版本号>
zsh # 刷新终端,可能需要

5-4 安装 Anconda 或 Miniforge#

Anconda 自带的库我们很可能用不到,反正用到还能自己装,所以我们选择小而美的 Miniconda,当然选择 Anconda 也可以

Anconda 官网:

Loading preview...
Waiting for metadata...

点击 Skip Registration 跳过登录即可下载(或者 Download Now | Anaconda),不过为了方便我们可以复制下载链接使用 wget(注意链接时效性)

Shell terminal
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod 777 Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh

我们还可以在阅读完用户协议后定义安装路径

如果你以后可能会涉及到商业纠纷的问题,那你可以使用这个社区版,去 Releases 下载安装包安装

conda-forge
/
miniforge
Waiting for api.github.com...
00K
0K
0K
Waiting...
Shell terminal
chmod 777 Miniforge3-25.3.0-3-Linux-x86_64.sh
./Miniforge3-25.3.0-3-Linux-x86_64.sh

同上文安装方法,安装之后,正常情况下你可以直接使用初始化命令

Shell terminal
conda init
zsh # 刷新终端

默认情况下,初始化之后每次启动 Shell 会自动激活自带的 base 环境

5-5 创建更加独立的虚拟环境#

TIP

提示:部分 oh-my-zsh 主题可能会使 conda / pyenv 显示环境名的功能失效,每个主题修复的方式不一,大家可以自行百度

因为你会在不同的场合安装不同的包,所以你大概率需要创建一个虚拟环境,如果你立志成为一个 Pwn 大师,安装相关环境肯定是缺不了的,在这之后,我们就可以创建一个为 CTF 准备的 Python 环境了

5-4-1 uv#

找一个合适的目录,使用命令

Terminal window
uv venv /path/to/env # 即存放环境的位置,根据自己的需求更改
# uv venv ./CTFpy 这是我的方法
source CTFpy/bin/activate

就可以激活虚拟环境

不同的是,uv 并不支持你随时随地都能激活这个环境,你可以向你的 .zshrc 写入自定义脚本来实现加载,可以参考我的

~/.zshrc
uv-venv() {
local VENV_BASE="/home/Lufiende/Environment/mounted/uv-globalvenv"
# 更改自己的目录,我将所有可能会常用的通用环境放到了一个目录
if [ -z "$1" ]; then
echo "用法: uv-venv <环境名称>"
echo "当前可用环境:"
ls "$VENV_BASE"
return 1
fi
local TARGET_ENV="$VENV_BASE/$1/bin/activate"
if [ ! -f "$TARGET_ENV" ]; then
echo "错误: 环境 '$1' 不存在于 $VENV_BASE"
return 1
fi
if [ -n "$VIRTUAL_ENV" ]; then
echo "正在退出当前环境: $(basename "$VIRTUAL_ENV")..."
deactivate
fi
source "$TARGET_ENV"
echo "已激活环境: $1"
}

这个时候,你只需要

Terminal window
uv-venv <环境名称>

就可以执行目录里的环境了

如果你要在当前环境安装包,请使用 uv pip 来代替 pip

如果你要使用 VS Code 的话,你需要修改一下配置文件的 python.venvPath 来确保你的环境能被搜索到

转到 文件 > 首选项 > 设置 选中远程后搜索 python.venvPath

填入你存放虚拟环境的目录

environment_linux-pwn-wsl-A36E2158-8460-4FB8-8E35-26619DDC8F65

5-4-2 Pyenv#

输入以下指令就可以创建

Shell terminal
pyenv virtualenv <版本号> <名称>
pyenv local <名称>

例如我要创建并激活一个 3.13.7 的 CTFpy 虚拟环境,我就可以

environment_linux-pwn-wsl-E4CF7E5F-13B0-4F58-8435-1D31B3218302

5-4-3 Conda / Miniforge#

Shell terminal
conda create -n <起个名字> python=3.12
conda activate <名字>

然后我们修改一下 .zshrc,如果你使用 zsh 的话,末尾添加

Shell terminal
conda activate <名字>

就可以默认激活对应环境


6. 添加并挂载数据盘(可选)#

官方教程:

Loading preview...
Waiting for metadata...

有时候你可能会运行多个 wsl 发行版,并且会共同使用一些环境和数据,每个系统盘都下载一遍还是有点占空间了,我们可以单独挂载一个数据盘存储一些不是很吃环境的资料

6-1 添加虚拟磁盘#

我们可以右键此电脑,点击 管理 进入计算机管理(进入方式不唯一),找到磁盘管理

environment_linux-pwn-wsl-30C55319-6C14-42D6-A521-B12677D5177D

然后选择更多操作,再选择创建 vhd 选项,就可以进入虚拟磁盘创建页面,填入参数即可创建,可以参考我的

environment_linux-pwn-wsl-0C8AC3BF-47BF-4C24-B5E4-5BFCC04E06C7

然后我们会看到一个上面有黑条的磁盘跳出来了,我们先分离一下,右键分离,不然会被系统占用

environment_linux-pwn-wsl-865F6D2C-902C-4BB6-99A6-E955140014FC

然后我们输入

PowerShell terminal
wsl --mount --vhd "X:\path\to\data.vhdx" --bare

即可完成挂载

6-2 持久化挂载#

值得一提的是,这个挂载不是永久的,当你重启 WSL 的时候就失去了挂载,因为我们希望虚拟机启动后挂载,其实我们可以使用 Crontab 启动,在某处准备一个脚本,写上

PowerShell terminal
vim /path/to/automount
#!/bin/bash
/mnt/c/WINDOWS/system32/wsl.exe --mount --vhd "X:\path\to\Data.vhdx"

随后添加任务

PowerShell terminal
crontab -e
# 打开后添加
@reboot /path/tp/automount

重启 WSL 查看挂载情况

PowerShell terminal
wsl --shutdown
wsl
# 进入之后
lsblk

你会看到多出一块 128G 的磁盘,如下图,不过它的名称可能不固定,取决于挂载时机,正常按上文步骤你的磁盘应该是 sde ,但是如果你是先挂载再进入的子系统那么挂载的硬盘位置比系统盘要前,名字也会变成 sdd,但是丝毫不影响,下面操作

environment_linux-pwn-wsl-E50CED3B-270D-4821-B62B-E786515D650F

6-3 使用 fdisk 进行分区#

使用命令行工具 fdisk

Shell terminal
# 输入
sudo fdisk /dev/sde
# 回显
Welcome to fdisk (util-linux 2.41.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS (MBR) disklabel with disk identifier 0xc148e97b.
Command (m for help): m
Help:
DOS (MBR)
a toggle a bootable flag
b edit nested BSD disklabel
c toggle the dos compatibility flag
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
e resize a partition
T discard (trim) sectors
Misc
m print this menu
u change display/entry units
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty MBR (DOS) partition table
s create a new empty Sun partition table

我们要做的无非就是新建一个 GPT 格式的分区,按下面来就可以

Shell terminal
Command (m for help): g
# 使用GPT
Created a new GPT disklabel (GUID: 89089BCF-4A99-4839-8857-F96D8A5CA7E6).
The device contains 'dos' signature and it will be removed by a write command. See fdisk(8) man page and --wipe option for more details.
Command (m for help): n
# 新建分区
Partition number (1-128, default 1):
First sector (2048-268435422, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-268435422, default 268433407):
# 全部回车默认
Created a new partition 1 of type 'Linux filesystem' and of size 128 GiB.
Command (m for help): w
# 应用修改

这个时候我们就可以看到原来的新加磁盘 sde 多了一个 sde1

environment_linux-pwn-wsl-CB178B19-4970-4667-B1FA-0D42F6469920

最后我们格式化分区为 ext4

Shell terminal
sudo mkfs.ext4 /dev/sde1

6-4 磁盘挂载到目录#

我们可以随便创建一个文件夹作为挂载点,一般来说都会再 /mnt 目录下建立一个文件夹

Shell terminal
sudo mkdir /path/to/folder
# 例如 sudo mkdir /mnt/wsldata

由于磁盘名称可能会改变,所以我们需要使用唯一的 UUID 来识别每一个磁盘

Shell terminal
lsblk -f

你会看到下面的内容

environment_linux-pwn-wsl-E7CA0537-10A7-484D-815C-1814D61BACB4

复制 sde1 的 UUID,输入下面的命令

Shell terminal
sudo mount UUID=<复制下来> /path/to/folder
# 例如 sudo mount UUID=4a1b8e8a-1251-4644-b987-37851976cb97 /mnt/wsldata

然后你就可以顺利挂载了,同时上面的命令可以添加到持久化挂载的脚本

environment_linux-pwn-wsl-A6A6624A-B598-416A-A668-26E2DA1DF95E

Kali-Linux Pwn 环境配置 - 使用 WSL
https://fuwari.vercel.app/posts/environment_linux-pwn-wsl/
作者
Lufiende
发布于
2025-01-13
许可协议
CC BY-NC-SA 4.0