Как я установил драйвер WiFi (с возможностью wardriving) в WSL2(Win10)

Discussion in 'Беспроводные технологии/Wi-Fi/Wardriving' started by Dioptimizer, 23 Jul 2022.

  1. Dioptimizer

    Dioptimizer Member

    Joined:
    18 Nov 2011
    Messages:
    63
    Likes Received:
    25
    Reputations:
    6
    Есть такое приложение для WSL2 - usbipd.
    Но казалось бы, что оно только для UART свистков и прочее, но последние версии уже поддерживают проброску флешек и wifi свистков.

    Первым делом нужно пересобрать ядро(не бойтесь, это не весь дистрибутив, это только файл весом ~14Мб в сжатом виде) для поддержки вайфая.
    Во вложении уже скомпилировано версия ядра:
    Code:
    dmytro@DESKTOP-XXXXXX:~$ uname -a
    Linux DESKTOP-XXXXXX 5.10.102.1-microsoft-standard-WSL2+ #9 SMP Fri Jul 22 21:25:45 EEST 2022 x86_64 x86_64 x86_64 GNU/Linux
    
    Если у вас такое ядро Ubuntu-20.04, то файл ядра должен вам подойти без компиляции.

    Компиляция ядра
    1. Первым делом установим из магазина Ubuntu-20.04.
    2. После первого запуска иконки в приложениях идем в свой профиль c:\Users\<Имя> и добавляем файл с названием ".wslconfig" (точка тут нужна) как текстовый файл, его мы будем редактировать в Блокноте.
    3. Редактируем файл .wslconfig и добавляем такие строчки:
      Code:
      [wsl2]
      #kernel=c:\\wslkernel\\kernel-5.10.102.1-new
      localhostForwarding=true
      #memory=6GB
      #processors=3
      #swap=10GB
      #swapFile=%USERPROFILE%\AppData\Local\Temp\swap.vhdx
      [interop]
      enabled=false
      appendWindowsPath=false
      
      Где kernel мы указываем путь к файлу скомпилированного нового ядра с поддержкой вафли, обратите внимание, что путь должен быть с двумя \\ слешами. Параметры memory, processors, swap отвечают за то, сколько WSLу вы выделите памяти, процессоров и нужен ли своп файл(если памяти мало например) соответственно. Обратите внимание, что все вышеуказанное закомментировано и только вы должны выбрать, нужно оно вам сейчас или нет. Остальные параметры не трогаем, они должны быть по умолчанию включены.
    4. Далее заходим в подсистему WSL2 Ubuntu и обновим дистрибутив:
      Code:
      sudo apt update
      sudo apt upgrade
      
      По желанию можно установить "sudo apt mc install" (Midnight Commander) или редактировать файл через Explorer (cd \\wsl$), нам нужен файл "~/.bashrc" который находится в домашней директории, необходимо добавить в этот файл в конец - строчку:
      Code:
      PATH=$(/usr/bin/printenv PATH | /usr/bin/perl -ne 'print join(":", grep { !/\/mnt\/[a-z]/ } split(/:/));')
      
      и после чего перезапустим WSL, для этого, уже в консоли Windows(cmd) использовать команду "
      wsl --shutdown"
    5. Перезапускаем WSL и теперь уже перед компиляции ядра установим зависимости:
      Code:
      sudo apt install -y build-essential git flex bison libssl-dev libelf-dev libncurses-dev autoconf libudev-dev libtool dwarves
      
    6. Теперь клонируем ядро:
      Code:
      git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
      оно будет клонировать ядро относительно того пути, в котором вы сейчас находитесь, имейте ввиду, должен быть путь где ext4 ФС или просто домашняя пака "~/", потом заходим в папку WSL2-Linux-Kernel и применяем патч во вложении.
    7. Копируем патч в папку WSL2-Linux-Kernel и используем команду
      Code:
      patch -u < config.patch
      (если будет запрос целевого файла, то указывайте файл Microsoft/config-wsl)
    8. Если Вы специалист в компилировании ядра linux, то можете воспользоваться командой
      Code:
      sudo make KCONFIG_CONFIG=Microsoft/config-wsl menuconfig
      (относительно пути исходников WSL2-Linux-Kernel) и в меню выбрать дополнительную конфигурацию - если вам нужно например установить модули wifi, которые в ядре находятся проприетарно(по умолчанию они отключены). Или пропустите этот шаг.
    9. Теперь собираем ядро командой
      Code:
      sudo make KCONFIG_CONFIG=Microsoft/config-wsl -j 3
      где число "3" - кол-во выделенных ядер вашего процессора, чем больше - тем быстрее скомпилирует.
    10. После удачной компиляции, уже готов файл ядра, он находится по пути arch/x86/boot/bzImage <- как файл, его необходимо скопировать вне WSL - в любое удобное место вашего диска, я обычно создаю папку c:\wslkernel\ и копирую его туда
      Code:
      cp -v arch/x86/boot/bzImage /mnt/c/wslkernel/kernel-5.10.102.1-new
    11. Теперь то, можно в файле c:\Users\<Имя>\.wslconfig раскомментировать параметр
      Code:
      kernel=c:\\wslkernel\\kernel-5.10.102.1-new
      и перезапустить "wsl --shutdown".

    Сборка драйвера WiFi

    1. Для сборки нам понадобится всё тот же клонированный WSL2-Linux-Kernel - т.к. тут в WSL2 свой linux-headers и в репозитории apt его не будет. Чтобы была возможность компилировать драйвер (или использовать для компиляции dkms) нужно пробросить эту ссылочку:
      Code:
      sudo ln -s ~/WSL2-Linux-Kernel /lib/modules/5.10.102.1-microsoft-standard-WSL2+/build
      где путь должен быть от WSL2-Linux-Kernel, до грубо говоря "uname -r", в данном случае "5.10.102.1-microsoft-standard-WSL2+" папка.
    2. Дальше компилируйте драйвер Wifi по стандартной процедуре, которая описана в мануале для вашего донгла. В моём случае, я компилировал этот драйвер: https://github.com/morrownr/88x2bu-20210702, где нужно устанавливать свои зависимости.
    3. Имейте ввиду, в WSL2 не работает автозагрузка модулей(разве что выходить из ситуации скриптами автозагрузки) - поэтому загружать модуль нужно командой "sudo modprobe <модуль>", да и в любом случае необходимо загружать модуль только после инициализации usbip устройства, об этом ниже. Но в моём случае я мог модуль загрузить раньше, п потом использовать attach утилиты usbipd(об этом ниже).
    Утилита usbipd-win
    1. Следующий шаг, это установка утилиты usbipd для Windows и usbip для WSL чтобы можно было связать две системы по USB. По пути https://github.com/dorssel/usbipd-win качаем последний релиз(на момент написания этого мануала usbipd-win_2.3.0.msi) и устанавливаем в системе Windows.
    2. Для WSL2 чуть сложнее, нужно установить такими командами:
      Code:
      sudo apt install linux-tools-virtual hwdata
      sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20
      
    После чего, можно даже не перезагружая попытаться пробросить устройство:
    Code:
    C:\WINDOWS\system32>usbipd wsl list
    BUSID  VID:PID    DEVICE                                                        STATE
    1-1    0458:0152  USB-устройство ввода                                          Not attached
    4-4    0bda:b812  Realtek 8812BU Wireless LAN 802.11ac USB NIC                  Not attached
    7-4    0781:5583  Запоминающее устройство для USB                               Not attached
    
    C:\WINDOWS\system32>usbipd wsl attach -b 4-4
    
    C:\WINDOWS\system32>usbipd wsl list
    BUSID  VID:PID    DEVICE                                                        STATE
    1-1    0458:0152  USB-устройство ввода                                          Not attached
    4-4    0bda:b812  Realtek 8812BU Wireless LAN 802.11ac USB NIC                  Attached - Ubuntu-20.04
    7-4    0781:5583  Запоминающее устройство для USB                               Not attached
    
    
    C:\WINDOWS\system32>
    
    после чего в консоли WSL появится это устройство:
    Code:
    dmytro@DESKTOP-XXXXXX:~$ lsusb
    Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 001 Device 003: ID 0bda:b812 Realtek Semiconductor Corp. USB3.0 802.11ac 1200M Adapter
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    dmytro@DESKTOP-XXXXXX:~$
    
    Что удобно, так это то, что при attach в WSL у вас в Windows оно сразу отключается(не нужно перезагрузок), а при detach из WSL устройство также без всяких манипуляций появляется в системе Windows и его сразу можно использовать)
    Какие гарантии и чего нет по умолчанию в WSL2?

    А гарантий, что у вас заработает как у меня никаких нет! Это может быть исключение.
    И как писалось раньше, модули Wi-Fi, которые идут по умолчанию с любым дистрибутивом Linux - отключены в ядре, и вам их нужно включать самому(в menuconfig это Device Drivers ---> [*] Network device support ---> [*] Wireless LAN ---> <и тут выбрать модуль, который вам нужен>).

    Чего нет в WSL2 и что нужно устанавливать из apt, так это:

    wireless-tools - утилита отвечающая за iwconfig, может еще за iwlist - не уверен.
    net-tools - в WSL2 даже нет ifconfig Карл.
    linux-firmware - не уверен, может и есть.
    rfkill - необходима для aircrack, но это только ради того чтобы скрипты которые от нее зависят не ругались, потому как никто не будет использовать ваш wlan# - ибо нет тут networkmanager и wpa_supplicant.
    hostapd - честно признаюсь, не проверял, да и не нужен он мне чтобы поймать хендшейк.
    aircrack-ng - без комментариев.
    Остальное компилируем сами.
    Инжекция работает как и должна, я проверил на своем драйвере.

    https://www.mediafire.com/file/wq95jlys4nb6m1t/wslkernel.zip/file

    Update:
    Также хочу заметить, что в системе WSL2 поломана загрузка драйверов /lib/firmware из rootfs, где находится в том числе regulatory.db (по поводу важности открытый вопрос). Но чтобы загружать любую firmware для WiFi адаптера в WSL2 - на данном этапе, необходимо этот драйвер интегрировать в ядро при компиляции.
    За это отвечает конфигурация:
    Code:
    CONFIG_EXTRA_FIRMWARE="regulatory.db"
    CONFIG_EXTRA_FIRMWARE_DIR="/lib/firmware"
    
    Если ваш драйвер для wifi адаптера зависит от бинарного драйвера(firmware), вы должны интегрировать свой бинарный драйвер верхним примером, где "regulatory.db <firmware.bin>" должен отделятся пробелом(или можно относительный путь "regulatory.db <path>/<firmware.bin>"). Перед компиляцией, убедитесь, чтобы файл находится по обозначенному пути /lib/firmware/<firmware.bin>. Пока выход только такой я вижу.
     

    Attached Files:

    #1 Dioptimizer, 23 Jul 2022
    Last edited: 29 Jul 2022
    hydra, CRACK211 and binarymaster like this.
  2. 4Fun

    4Fun Elder - Старейшина

    Joined:
    25 Jul 2018
    Messages:
    496
    Likes Received:
    709
    Reputations:
    11
    Так точно.

    Code:
    $ pacman -Ql wireless_tools | grep '/usr/bin'
    wireless_tools /usr/bin/
    wireless_tools /usr/bin/ifrename
    wireless_tools /usr/bin/iwconfig
    wireless_tools /usr/bin/iwevent
    wireless_tools /usr/bin/iwgetid
    wireless_tools /usr/bin/iwlist
    wireless_tools /usr/bin/iwpriv
    wireless_tools /usr/bin/iwspy
    На самом деле, rfkill предназначен не для остановки процессов, мешающих airodump-ng, а для того, чтобы "аппаратно" отключать или включать беспроводные устройства (Wi-Fi, Bluetooth, GPS, NFC и др.)