Post

[Linux] ieee80211 + qemu

개요

Linux Kernel을 공부하면서 wireless 분석을 하기 위한 qemu 환경이 필요했습니다. 따라서, 해당 포스터에서 어떻게 환경을 구축해야되는지 설명하고자 합니다.

💡 qemu에는 가상화 wireless 장치를 지원하지 않기 때문에 다음의 방법으로 환경을 구축했습니다.

Kernel Build

우선 Kernel Build할때 ieee80211_hwsim 모듈을 사용할 수 있도록 Build해야 됩니다. 모든 순서는 아래 링크에서 확인할 수 있습니다.

여기서 달라지는 부분은 .config 파일을 설정하는 부분입니다. 기존의 설정한 값 이외의 아래의 값도 변경해주어야 합니다.

1
CONFIG_MAC80211_HWSIM=y

qemu

위와 같이 빌드를 하고 qemu까지 정상적으로 부팅이 되는 경우 다음의 명령어로 제대로 Kernel Build가 되었는지 확인합니다.

1
sudo modprobe mac80211_hwsim

모듈이 없다는 에러가 발생하지 않으면 정상적으로 설치가 된 것입니다.

이후, ifconfig 명령어를 실행하면 아직까지 wlan 인터페이스가 존재하지 않습니다. 따라서 다음의 파일을 우선 qemu 환경에 만들어둡니다.

hostapd.conf

1
2
3
4
5
6
7
8
9
10
11
interface=wlan0
driver=nl80211

hw_mode=g
channel=1
ssid=mac80211 test

wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa_passphrase=12345678

wpa_supplicant.conf

1
2
3
4
5
6
7
8
9
10
ctrl_interface=/var/run/wpa_supplicant

network={
	ssid="mac80211 test"
	psk="12345678"
	key_mgmt=WPA-PSK
	proto=WPA2
	pairwise=CCMP
	group=CCMP
}

dhcpd.conf

1
2
3
4
5
6
7
8
subnet 192.168.42.0 netmask 255.255.255.0 {
    range 192.168.42.100 192.168.42.200;
    option routers 192.168.42.1;
    option domain-name-servers 8.8.8.8, 8.8.4.4;
    option domain-name "example.com";
    default-lease-time 600;
    max-lease-time 7200;
}

init.sh

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

echo "[+] Setting wlan0"
sudo ip link set dev wlan0 up
sudo hostapd -B -f hostapd.log -i wlan0 hostapd.conf
sudo ip addr add 192.168.42.1/24 dev wlan0
sudo dhcpd -cf dhcpd.conf wlan0

echo "[+] Setting wlan1"
sudo wpa_supplicant -B -c wpa_supplicant.conf -f wpa_supplicant.log -i wlan1
sudo dhclient -4 wlan1
echo "[+] Finish!!!"

이렇게 모든 파일을 생성했으면 init.sh를 실행합니다. 실행하고 나면 아래와 같은 결과를 확인할 수 있습니다.

💡 만약 실행 도중 명령어가 없어서 에러가 발생한다면, 패키지를 설치해야합니다! 우선 아래의 패키지만 설치해도 될 것 같습니다.
sudo apt install hostapd isc-dhcp-server wpasupplicant isc-dhcp-client

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ubuntu@ubuntu:~/mac80211_hwsim/setting$ ./init.sh
[+] Setting wlan0
Internet Systems Consortium DHCP Server 4.4.1
Copyright 2004-2018 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Config file: dhcpd.conf
Database file: /var/lib/dhcp/dhcpd.leases
PID file: /var/run/dhcpd.pid
Wrote 0 leases to leases file.
Listening on LPF/wlan0/02:00:00:00:00:00/192.168.42.0/24
Sending on   LPF/wlan0/02:00:00:00:00:00/192.168.42.0/24
Sending on   Socket/fallback/fallback-net
[+] Setting wlan1
[+] Finish!!!

성공적으로 실행됐다면 ifconfig 명령어를 입력했을 때 아래와 같은 결과가 나옵니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.42.1  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::ff:fe00:0  prefixlen 64  scopeid 0x20<link>
        ether 02:00:00:00:00:00  txqueuelen 1000  (Ethernet)
        RX packets 44  bytes 3016 (3.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 61  bytes 6166 (6.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.42.100  netmask 255.255.255.0  broadcast 192.168.42.255
        inet6 fe80::ff:fe00:100  prefixlen 64  scopeid 0x20<link>
        ether 02:00:00:00:01:00  txqueuelen 1000  (Ethernet)
        RX packets 12  bytes 1714 (1.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 44  bytes 3808 (3.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0가 라우터 역할이기 때문에 1번 주소를 가지고있고 wlan1이 클라이언트라서 dhcp를 통해 100번을 할당받은 것을 확인할 수 있습니다.

이렇게 모든 설정을 하고 나면 정상적으로 gdb를 통해 ieee80211에 대한 디버깅을 수행할 수 있습니다.

This post is licensed under CC BY 4.0 by the author.