라즈베리파이/WIFI 무선랜 해킹

(3) wifi 무선랜 패킷 수집 ( pcap라이브러리로 ssid 추출 )

아크리엑터 2020. 8. 2. 21:10
반응형

이번에는 pcap 라이브러리를 이용하여, ssid를 조회하는 방법을 알아본다.

 

pcap라이브러리를 사용하기 위해서는 당연히 라이브러리를 설치해줘야 한다.

sudo apt-get install libpcap-dev

 

pcap1.cpp

#include <cstdio>

#include <pcap.h>

enum{CMD, INF};


void hexView(const u_char *p)
{
    for (int j = 0; j < 0xf+1; j++) {
        for (int i = 0; i < 0xf+1; i++) printf("%02x ", *(p+i+j*(0xf+1)));
        for (int i = 0; i < 0xf+1; i++) printf("%c",  (*(p+i+j*(0xf+1)) > 32)? *(p+i+j*(0xf+1)):'.');
        printf("\n");
    }

}

void procPacket(u_char *arg, const struct pcap_pkthdr *h, const u_char *p)
{
    int len;
    len = 0;
    int pos;

    hexView(p);

    u_int8_t ssid_len = *(p+63); // SSID length 정보의 위치

    printf("%4d: ", ssid_len);

    for(int i=0; i < ssid_len; i++){ // SSID length만큼 읽어드림
        printf("%c", *(p+64+i));
    }

    printf("\n");
    return;
}


int main(int argc, char *argv[]){
    pcap_t *handle;
    char *dev = argv[INF];
    char errbuf[PCAP_ERRBUF_SIZE];

    struct bpf_program fp;

    handle = pcap_open_live(dev, BUFSIZ, 0, 100, errbuf);
    if(NULL == handle){
        printf("%s", errbuf);
        return 1;
    }

    if(-1 == pcap_compile(handle, &fp, "type mgt subtype beacon",0,PCAP_NETMASK_UNKNOWN)){
        printf("compile error\n");
        return 1;
    }
    if (pcap_setfilter(handle, &fp) == -1){
        printf("setfilter error\n");
        return 1;
    }

    pcap_loop(handle, -1, procPacket, NULL);

}

 

Makefile

CC = g++

INC =  -I. 

LIBS =  -lpcap

DFLAGS = -D
 
CFLAGS = -g $(INC)  $(DFLAGS) 


OBJS = pcap1.o

SRCS = pcap1.cpp

TARGET = pcap1 

all : $(TARGET) 

$(TARGET) : $(OBJS)  Makefile
	$(CC) -o $@  $(OBJS) $(LIBS) 

dep :
	gccmakedep $(INC)  $(SRCS)

clean :
	rm -rf $(OBJS) $(TARGET) core

new : 
	$(MAKE) clean 
	$(MAKE) 

 

 

실행한 화면은 다음과 같다.   캡쳐한 패킷에서 64번째 부터 SSID가 표시된다. 그런데, 기술 자료를 보면, 76번째인가 부터 SSID가 표시되어야 하는데, 실제 패킷을 조회해서보니, 다르게 인식된다. 왜 이런지는 다시 찾아봐야 겠다.

$ sudo ./pcap1 wlan0mon
00 00 1a 00 2f 48 00 00  64 38 fd 27 00 00 00 00 ..../H.. d8.'....
10 02 99 09 a0 00 be 00  00 00 80 00 00 00 ff ff ........ ........
ff ff ff ff 90 9f 33 d3  89 1a 90 9f 33 d3 89 1a ......3. ....3...
e0 90 99 21 aa 86 0e 00  00 00 64 00 11 04 00 07 ...!.... ..d.....
4e 55 4a 49 5f 32 47 01  08 82 84 8b 96 0c 12 18 NUJI_2G. ........
24 03 01 02 05 04 01 03  00 00 2a 01 04 32 04 30 $....... ..*..2.0
48 60 6c 2d 1a ee 19 1f  ff ff 00 00 00 00 00 00 H`l-.... ........
00 00 00 00 00 00 00 00  00 00 18 04 81 00 00 3d ........ .......=
16 02 05 03 00 00 00 00  00 00 00 00 00 00 00 00 ........ ........
00 00 00 00 00 00 00 30  14 01 00 00 0f ac 04 01 .......0 ........
00 00 0f ac 04 01 00 00  0f ac 02 00 00 dd 18 00 ........ ........
50 f2 02 01 01 80 00 03  a4 00 00 27 a4 00 00 42 P....... ...'...B
43 5e 00 62 32 2f 00 7f  05 00 00 00 00 00 dd 1e C^.b2/.. ........
00 90 4c 33 ee 19 1f ff  ff 00 00 00 00 00 00 00 ..L3.... ........
00 00 00 00 00 00 00 00  00 18 04 81 00 00 dd 1a ........ ........
00 90 4c 34 02 05 03 00  00 00 00 00 00 00 00 00 ..L4.... ........
   7: NUJI_2G

 

수집한 Beacon  패킷의 구조가 아래와 같이 나와야 한다고 하는데, 위의 것과는 좀 다르게 보여지고 있어서 원인을 찾아야 한다. T.T

 

위에서 위치가 맞지 않는 원인은 RadioTap의 Strucure가 가변적으로 변화하는 것을 알지 못한 문제였다. radiotab의 총 4바이트 안에 RadioTap의 길이정보가 있는데, 헤더를 포함한 길이로 이를 제외하고 나면, BeaconFrame영역이 된다.

위의 이미지를 사례로 아래에 설명을 한다.

Offset 길이 설명
0 0x00 1 RadioTap 버전정보
1 0x00 1 패팅
2~3 0x2400 2 RadioTap 길이
0x0024 =>36
37 0x80 1 Beacon관리프레임

 

다음의 표는 맨 위의 프로그램에서 표시된 정보로 위치를 설명한 내용이다.

offset 길이 설명
0 0 1 Radio Tap버전정보
1 0 1 패팅
2~3 0x1a00 2 RadioTap길이
0x1a00 => 26
27 0x80 1 Beacon관리프레임

 

위 정보를 기준으로, 맨 위의 소스코드를 조금 수정하였다.

#include <cstdio>
#include <ctype.h>
#include <pcap.h>

enum{CMD, INF};


void hexView(const u_char *p)
{
    for (int j = 0; j <= 0xf; j++) {
        for (int i = 0; i <=0xf; i++) {
            if (i == 8) printf(" ");
            printf("%02x ", *(p+i+j*(0xf+1)));
        }
        for (int i = 0; i <=0xf; i++) {
            if (i == 8) printf(" ");
            if (isprint(*(p+i+j*(0xf+1)))) printf("%c", *(p+i+j*(0xf+1)));
            else printf(".");
        }
        printf("\n");
    }

    printf("\n");
}

void procPacket(u_char *arg, const struct pcap_pkthdr *h, const u_char *p)
{
    int len, radiotaplen;
    len = 0;
    int pos;

    hexView(p);

    radiotaplen = *(p+2) + *(p+3)*0xff;

    u_int8_t ssid_len = *(p+radiotaplen+37); // SSID length 정보의 위치

    printf("%4d: ", ssid_len);

    for(int i=0; i < ssid_len; i++){ // SSID length만큼 읽어드림
        printf("%c", *(p+radiotaplen+38+i));
    }

    printf("\n");
    printf("\n");
    return;
}


int main(int argc, char *argv[]){
    pcap_t *handle;
    char *dev = argv[INF];
    char errbuf[PCAP_ERRBUF_SIZE];

    struct bpf_program fp;

    handle = pcap_open_live(dev, BUFSIZ, 0, 100, errbuf);
    if(NULL == handle){
        printf("%s", errbuf);
        return 1;
    }

    if(-1 == pcap_compile(handle, &fp, "type mgt subtype beacon",0,PCAP_NETMASK_UNKNOWN)){
        printf("compile error\n");
        return 1;
    }
    if (pcap_setfilter(handle, &fp) == -1){
        printf("setfilter error\n");
        return 1;
    }

    pcap_loop(handle, -1, procPacket, NULL);

}

 

아래는 실행된 결과이다. SSID가 없는 경우도 나타나는데, 이것은 SSID를 외부에 노출되지 않도록 설정한 경우로, 근처에 누군가가 설정해 놓은 것으로 생각하면 될터이다.

$ sudo ./pcap0 wlan0mon
00 00 1a 00 2f 48 00 00  9d 29 89 3e 00 00 00 00 ..../H.. .).>....
10 02 99 09 a0 00 be 00  00 00 80 00 00 00 ff ff ........ ........
ff ff ff ff 90 9f 33 d3  89 1a 90 9f 33 d3 89 1a ......3. ....3...
c0 98 99 01 36 9d 0e 00  00 00 64 00 11 04 00 07 ....6... ..d.....
4e 55 4a 49 5f 32 47 01  08 82 84 8b 96 0c 12 18 NUJI_2G. ........
24 03 01 02 05 04 00 03  00 20 2a 01 04 32 04 30 $....... . *..2.0
48 60 6c 2d 1a ee 19 1f  ff ff 00 00 00 00 00 00 H`l-.... ........
00 00 00 00 00 00 00 00  00 00 18 04 81 00 00 3d ........ .......=
16 02 05 03 00 00 00 00  00 00 00 00 00 00 00 00 ........ ........
00 00 00 00 00 00 00 30  14 01 00 00 0f ac 04 01 .......0 ........
00 00 0f ac 04 01 00 00  0f ac 02 00 00 dd 18 00 ........ ........
50 f2 02 01 01 80 00 03  a4 00 00 27 a4 00 00 42 P....... ...'...B
43 5e 00 62 32 2f 00 7f  05 00 00 08 00 80 dd 1e C^.b2/.. ........
00 90 4c 33 ee 19 1f ff  ff 00 00 00 00 00 00 00 ..L3.... ........
00 00  

   7: NUJI_2G

00 00 1a 00 2f 48 00 00  51 23 8e 3e 00 00 00 00 ..../H.. Q#.>....
10 02 99 09 a0 00 ac 00  00 00 80 00 00 00 ff ff ........ ........
ff ff ff ff 00 08 9f 2a  89 ca 00 08 9f 2a 89 ca .......* .....*..
e0 b1 83 71 b5 f8 0e 00  00 00 64 00 01 04 00 06 ...q.... ..d.....
69 70 74 69 6d 65 01 08  82 84 8b 96 24 30 48 6c iptime.. ....$0Hl
03 01 0b 05 04 00 01 00  00 2a 01 00 2f 01 00 32 ........ .*../..2
04 0c 12 18 60 2d 1a fe  18 1b ff ff 00 00 01 00 ....`-.. ........
00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 ........ ........
00 3d 16 0b 0f 04 00 00  00 00 00 00 00 00 00 00 .=...... ........
00 00 00 00 00 00 00 00  00 dd 0e 00 50 f2 04 10 ........ ....P...
4a 00 01 10 10 44 00 01  02 dd 09 00 10 18 02 01 J....D.. ........
f0 2c 00 00 dd 18 00 50  f2 02 01 01 80 00 03 a4 .,.....P ........
00 00 27 a4 00 00 42 43  5e 00 62 32 2f 00 2b 00 ..'...BC ^.b2/.+.
e3 85 00 00 00 00 00 00  00 00 00 00 00 00 00 00 ........ ........
00 00  

   6: iptime

반응형