반응형
이번에는 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
반응형
'라즈베리파이 > WIFI 무선랜 해킹' 카테고리의 다른 글
(4-1) wifi 무선랜 패킷 캡쳐 (pcap 라이브러리로 캡쳐한 structure설명) (0) | 2020.08.02 |
---|---|
(4) wifi 무선랜 패킷 캡쳐 ( pcaplib을 이용한 SSID 추출 ) (0) | 2020.08.02 |
(2) wifi 무선랜 패킷 수집(tins라이브러리로 SSID 추출하기) (0) | 2020.08.02 |
(1) wifi 무선 패킷 수집 (무선랜을 모니터 모드로 변경) (0) | 2020.08.02 |
리눅스(라즈베리파이, 젯슨나노)에서 무선랜 패킷 캡쳐 방법 (0) | 2020.07.14 |