티스토리 뷰

Wireshark는 open source network packet analyzer로 다른 상용 툴 못지 않은 다양한 기능을 제공한다. 특히 filtercoloring rules 기능은 패킷 분석에 꼭 필요한 중요한 기능이다. 또한 Wireshark를 이용하여 USB protocol 분석 등 다양한 용도로 확장할 수도 있다. 


하지만 무선랜 패킷을 캡쳐하기 위하여는 한 가지 걸림돌이 있는데, 일반 무선랜 카드로는 불가능하다는 것이다. 가장 손쉬운 방법은 riverbed사의 AirPcap USB 무선랜 카드 구매인데, 802.11agbn 모델의 경우 $698(배송, 통관비 제외)이고, Microsoft Windows에서만 사용 가능하다. 물론 상용 network analyzer에 비하여 저렴한 비용이지만, 이 또한 가격 부담이고, linux나 os x를 메인 PC로 사용하는 경우에는 패킷 켭쳐를 위하여 윈도우 PC를 따로 구비하여야 하는 것도 번거롭다.


물론 Linux에서는 조금만 수고 한다면 아주 저렴한 비용으로 구축하는 것이 가능하다.  

이와 같은 무선랜 패킷 캡쳐 환경을 구축하기 위한 무선랜 카드 선정부터 Wireshark 설정 방법까지 설명한다. 


1. Wireshark

Wireshark는 기본적으로 tcpdump와 같은 기능이라고 보면 된다. 여기에 분석을 도와주는 다양한 기능들이 추가되었다고 보면 된다. Wireshark 패키지를 보면 tcpdump와 유사한 기능을 하는 console 기반의 프로그램들도 제공한다. Tcpdump의 command line 옵션의 기능에 만족하지 못하였다면 tshark도 사용할 만 하다.


네트워크 패킷을 캡쳐하기 위하여는 오가는 패킷을 훅킹하여야 하는데, 이와 같은 기능을 제공해주는 것이 PCAP(Packet CAPture) 라이브러리이다. UN*N용으로는 libpcap이 있고, Windows용으로 포팅된 WinPcap도 있어서 대부분의 OS에서 지원한다고 보면 된다.


2. 유선랜(802.3/Ethernet) / 무선랜(802.11) 차이점

일반 Ethernet 카드는 기본적으로 promiscuous mode를 지원하여 자신에게 오는 패킷 만이 아닌 모든 패킷을 상위 레이어로 올리도록 하고, PCAP으로 캡쳐하면 되기 때문에 보통 wireshark만 설치하면 바로 사용 가능하다. (물론 ethernet의 경우에도 스위치에 연결된 상태에서는 다른 패킷들이 들어오지 않아 모니터링용 TAP 이나 10M 허브를 사용하여야 하지만...)


Ethernet의 경우 드라이버 입장에서 단순하다. 일반 상태에서는 destination address에 미리 설정된 자신의 MAC(unicast) address, broadcast address, multicast address만 상위 layer로 전달하고, promiscuous mode인 경우에는 무조건 다 전달하면 된다. 

하지만 무선랜의 경우 패킷 켭쳐 입장에서는 상황이 조금 달라진다. 802.11 패킷 헤더는 ethernet과 헤더가 다르다. 802.11 무선랜의 경우 AP 주소(BSS ID)등 무선 채널을 관리하는데 필요한 정보들이 있는데, IP layer입장에서 ethernet과 호환성을 맞추기 위하여 ethernet과 동일한 형태로 layer정보를 채워서 올려준다. 그래서 별도 설정없이 wireshark으로 무선랜을 캡쳐해보면 그냥 ethernet 패킷 형태로 보이게 된다. 물론 IP layer 상위의 프로토콜을 분석하려는 경우에는 이 정도면 충분하다. 


하지만 보통 무선랜 패킷 캡쳐를 원하는 경우에는 이와 같은 정보 이외에 무선랜 스캔, 접속(association) 등의 과정을 보고 싶어하는 경우가 대부분이다. 무선랜의 경우 promiscuous mode를 설정한다고 해서 이와 같은 패킷이 보이지 않는다. 802.11 패킷 헤더를 보기 위하여는 무선랜 칩셋/드라이버에서 monitor mode를 지원하여야 한다. 모든 칩셋이 monitor mode를 지원하지 않고, 제조사에 따라서 공개를 하지 않는 경우가 있어, 사용하는 무선랜 칩이 monitor mode가 지원되는지 확인하여야 하고, OS에 맞는 설정 방법이 있는지 찾아보아야 한다. 


다음 절 부터는 linux로 한정하여 내용을 정리한다. 참고로 windows의 경우에는 드라이버가 공개되지 않는 추세라 특별한 방법이 없고, OS X의 경우에는 내장 무선랜 카드를 이용하여 쉽게 캡쳐가 가능한데, 이 부분은 다음에 따로 설명을 할 예정이다.


3. Monitor mode 지원 무선랜

사용하려는 무선랜 칩이 monitor mode가 지원되는 지 여부를 먼저 확인하여야 한다. 아래 linux kernel wiki에 가면 무선랜 드라이버 별로 지원 여부를 확인 할 수 있다. 

이미 가지고 있는 무선랜 카드가 지원된다면 해당 카드를 이용하여 설정을 하면 되고, 새로 구매를 할 예정이라면 Ralink(MediaTek 로 변경) 제품을 사면 된다. Ralink의 경우 기본적으로 monitor mode를 지원하고, device driver 소스 코드도 회사 다운로드 페이지에 들어가면 얻을 수 있어 추가적인 튜닝을 할 수 있다. 


에누리에서 USB 무선랜 카드 중 "라링크"로 검색을 해보면 쓸만한 것은 2013년도에 출시된 netis WF2150 이다. 이 카드는 Ralink RT5572 chipset을 사용하고 있다. 가격도 13,900원이니 미리 서너개 구비 해 놓으면 좋을 것이다. 저가로는 가격 조건이 나쁜지 Realtek에 비하여 사용하고 있는 무선랜 카드가 그리 많지 않다. 나중에 로밍 등의 시험을 위하여 무선랜 여러채널을 동시에 잡는 경우도 필요할 수 있으므로 2~3개 미리 준비 해 놓는 것도 여러모로 쓸모가 많다. 


이 제품을 분해해보면 2개의 안테나 단자도 있어 필요하다면 외장형 안테나를 연결하거나, 유선(conducted mode)으로 연결해서 시험하는 것도 가능하다. 


4. RT5572 chipset 드라이버 설치

무선랜 카드를 구했으면 이제는 linux에 필요한 드라이버를 설치할 차례이다. Linux는 ubuntu 14.04/14.10을 기준으로 설명한다.


다른 chipset을 사용하는 경우에는 먼저 무선랜 monitor mode가 설정이 가능한지를 확인해 보아야 한다. 


Ubuntu에 기본으로 제공하는 드라이버 rt2800usb.ko를 사용하지 않도록 설정을 변경하고 컴퓨터를 리부팅한다 (설치를 해본게 오래되어 정확히 기억나지는 않지만 기본 드라이버는 monitor mode를 지원하지 않았던듯..) 

  • /etc/modprobe.d/blacklist-rt2800.conf 파일을 만들어 아래와 같이 적어준다. 

blacklist rt2800usb 

  • 컴퓨터를 재부팅 후 무선랜 카드를 꽂은 상태에서 lsmod로 확인하여 rt2800usb 드라이버가 로드가 안되는 것을 확인한다. 
  • 미디어텍 다운로드 페이지에서 RT5572 linux driver를 다운로드 받는다. 
  • 다운로드 소스 중 다음과 같은 부분을 수정한다.
    • 첫번째 부분은 linux 3.13에서 에러가 나서 수정한 부분이다.
    • 두번째 주석처리한 부분은 size14bytes 이하의 데이타도 버리지 말게 한것이다. 이렇게 하면 802.11 ACK 패킷도 캡쳐에서 볼수 있다.


Index: DPO_RT5572_LinuxSTA_2.6.1.3_20121022/include/os/rt_linux.h

===================================================================

--- DPO_RT5572_LinuxSTA_2.6.1.3_20121022.orig/include/os/rt_linux.h    2012-10-22 12:52:59.000000000 +0900

+++ DPO_RT5572_LinuxSTA_2.6.1.3_20121022/include/os/rt_linux.h    2014-09-16 15:08:42.236129091 +0900

@@ -274,8 +274,8 @@

 

 typedef struct _OS_FS_INFO_

 {

-    int                fsuid;

-    int                fsgid;

+    kuid_t                fsuid;

+    kgid_t                fsgid;

     mm_segment_t    fs;

 } OS_FS_INFO;

 

Index: DPO_RT5572_LinuxSTA_2.6.1.3_20121022/sta/rtmp_data.c

===================================================================

--- DPO_RT5572_LinuxSTA_2.6.1.3_20121022.orig/sta/rtmp_data.c    2014-09-16 15:09:25.760130085 +0900

+++ DPO_RT5572_LinuxSTA_2.6.1.3_20121022/sta/rtmp_data.c    2014-09-16 15:09:54.428130739 +0900

@@ -935,11 +935,13 @@

         INC_COUNTER64(pAd->WlanCounters.ReceivedFragmentCount);

 #endif /* STATS_COUNT_SUPPORT */

 

+#if 0

         if (pRxWI->MPDUtotalByteCount < 14)

         {

             Status = NDIS_STATUS_FAILURE;

             continue;

         }

+#endif

 

         if (MONITOR_ON(pAd))

         { 

  • 다음과 같이 빌드한다 (make시에도 sudo를 한 이유는 makefile을 수정치 않으려고... 일반 해보면 알것임).

# sudo make

# sudo make install

  • 무선랜을 꽂고 lsmod로 확인하여 rt5572sta 가 로드되었는지 확인한다. 이것이 로드 되었으면 정상적으로 된 것이다. 혹시 정상적으로 로드되지 않는다면 PC를 리부팅하고 다시 확인해 본다.
  • 무선랜 캡쳐를 하기 위하여는 다음과 같이 monitor mode로 설정한다.
    • 아래는 채널을 11로 하는 것이고 이를 옵션으로 입력 받도록 shell script로 만들어 두면 편리.
    • 2.4GHz 채널은 1~14이고, 5GHz 채널은 아래 링크를 보고 채널을 확인한다. 

# sudo ifconfig ra0 up

# sudo iwconfig ra0 channel 11

# sudo iwconfig ra0 mode monitor  

  • Ralink의 경우 채널을 바꿀때 매번 아래처럼 monitor mode를 다시 재 설정하여야 정상적으로 채널이 변경된다.

# sudo iwconfig ra0 channel 6

# sudo iwconfig ra0 mode monitor 


5. Wireshark 설치 및 일반 사용자 권한으로 실행하기

Wireshark 설치는 ubuntu의 경우 아래처럼 apt-get을 이용하여 간편하게 설치할 수 있다.


# sudo apt-get install wireshark 


위와 같이 드라이버를 monitor mode로 설정하고 wireshark를 실행하면 캡쳐를 잡을 수 있다. 하지만 무선랜을 잡기 위하여는 root 권한으로 실행을 하여야 한다. 하지만 이렇게 하는 경우 캡쳐한 파일을 저장하면 root 권한으로 저장되어 관리하기도 불편하고 보안성 면에서도 좋지 않아 아래처럼 설정해서 일반 사용자 권한으로도 실행될 수 있도록 한다.


Shell에서 아래와 같은 것은 root 권한으로 실행한다. 

# sudo -u root -s

# setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap 


관련한 설명은 wireshark wiki에서 찾아 볼 수 있다. 



위와 같이 하면 무선랜 패킷을 잡을 수 있을 것이다. 참고로 ubuntu가 upgrade 되면서 kernel이 변경되면 위 드라이버 빌드 과정을 다시 수행하여 설치하여야 한다.


참고:


댓글
댓글쓰기 폼