Put pcap parsing in utils class

This commit is contained in:
dadav
2019-10-07 19:59:28 +02:00
parent 72e6668c17
commit 1f99a249c6
3 changed files with 117 additions and 39 deletions

View File

@ -11,6 +11,7 @@ import glob
import subprocess
import pwnagotchi
import pwnagotchi.utils as utils
from pwnagotchi.utils import WifiInfo, extract_from_pcap
OPTIONS = dict()
AUTH = utils.StatusFile('/root/.api-enrollment.json', data_format='json')
@ -67,17 +68,6 @@ def get_api_token(log, keys):
return AUTH.data["token"]
def parse_packet(packet, info):
from scapy.all import Dot11Elt, Dot11Beacon, Dot11, Dot11ProbeResp, Dot11AssoReq, Dot11ReassoReq
if packet.haslayer(Dot11Beacon):
if packet.haslayer(Dot11ProbeResp) or packet.haslayer(Dot11AssoReq) or packet.haslayer(Dot11ReassoReq):
if hasattr(packet[Dot11], 'addr3'):
info['bssid'] = packet[Dot11].addr3
if hasattr(packet[Dot11Elt], 'info'):
info['essid'] = packet[Dot11Elt].info.decode('utf-8')
return info
def parse_pcap(filename):
logging.info("api: parsing %s ..." % filename)
@ -94,20 +84,16 @@ def parse_pcap(filename):
bssid = ':'.join([a + b for a, b in zip(it, it)])
info = {
'essid': essid,
'bssid': bssid
WifiInfo.ESSID: essid,
WifiInfo.BSSID: bssid,
}
try:
from scapy.all import rdpcap
for pkt in rdpcap(filename):
info = parse_packet(pkt, info)
info = extract_from_pcap(filename, [WifiInfo.BSSID, WifiInfo.ESSID])
except Exception as e:
logging.error("api: %s" % e)
return info['essid'], info['bssid']
return info[WifiInfo.ESSID], info[WifiInfo.BSSID]
def api_report_ap(log, keys, token, essid, bssid):

View File

@ -12,6 +12,7 @@ import csv
from datetime import datetime
import requests
from pwnagotchi.mesh.wifi import freq_to_channel
from pwnagotchi.utils import WifiInfo, FieldNotFoundError, extract_from_pcap
READY = False
ALREADY_UPLOADED = None
@ -151,13 +152,13 @@ def _transform_wigle_entry(gps_data, pcap_data):
writer = csv.writer(dummy, delimiter=",", quoting=csv.QUOTE_NONE)
writer.writerow([
pcap_data['bssid'],
pcap_data['essid'].decode('utf-8'),
_format_auth(pcap_data['encryption']),
pcap_data[WifiInfo.BSSID],
pcap_data[WifiInfo.ESSID],
_format_auth(pcap_data[WifiInfo.ENCRYPTION]),
datetime.strptime(gps_data['Updated'].rsplit('.')[0],
"%Y-%m-%dT%H:%M:%S").strftime('%Y-%m-%d %H:%M:%S'),
pcap_data['channel'],
pcap_data['rssi'],
pcap_data[WifiInfo.CHANNEL],
pcap_data[WifiInfo.RSSI],
gps_data['Latitude'],
gps_data['Longitude'],
gps_data['Altitude'],
@ -238,23 +239,17 @@ def on_internet_available(display, keypair, config, log):
continue
try:
pcap_data = _analyze_pcap(pcap_filename)
except Scapy_Exception as sc_e:
logging.error("WIGLE: %s", sc_e)
pcap_data = extract_from_pcap(pcap_filename, [WifiInfo.BSSID,
WifiInfo.ESSID,
WifiInfo.ENCRYPTION,
WifiInfo.CHANNEL,
WifiInfo.RSSI])
except FieldNotFoundError:
logging.error("WIGLE: Could not extract all informations. Skip %s", gps_file)
SKIP.append(gps_file)
continue
# encrypption-key is only there if privacy-cap was set
if 'encryption' in pcap_data:
if not pcap_data['encryption']:
pcap_data['encryption'].add('WEP')
else:
# no encryption, nothing to eat :(
pcap_data['encryption'] = set()
pcap_data['encryption'].add('OPN')
if len(pcap_data) < 5:
# not enough data; try next time
except Scapy_Exception as sc_e:
logging.error("WIGLE: %s", sc_e)
SKIP.append(gps_file)
continue