[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
에 대한 디버깅을 수행할 수 있습니다.