mirror of
https://github.com/RoganDawes/P4wnP1_aloa.git
synced 2025-03-18 05:41:55 +01:00
216 lines
8.1 KiB
Python
Executable File
216 lines
8.1 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
#!/usr/bin/python
|
|
|
|
# This file is part of P4wnP1.
|
|
#
|
|
# Copyright (c) 2017, Marcus Mengs.
|
|
#
|
|
# P4wnP1 is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# P4wnP1 is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with P4wnP1. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
# The command line tool could be used to configure the MaMe82 nexmon firmware mod (KARMA)
|
|
# for Pi3 / Pi0W while an access point is up and running
|
|
|
|
from mame82_util import *
|
|
import cmd
|
|
import sys
|
|
import getopt
|
|
|
|
def interact():
|
|
pass
|
|
|
|
def usage():
|
|
usagescr = '''Firmware configuration tool for KARMA modified nexmon WiFi firmware on Pi0W/Pi3 by MaMe82
|
|
=========================================================================================
|
|
|
|
RePo: https://github.com/mame82/P4wnP1_nexmon_additions
|
|
Creds to: seemoo-lab for "NEXMON" project
|
|
|
|
A hostapd based Access Point should be up and running, when using this tool
|
|
(see the README for details).
|
|
|
|
Usage: python karmatool.py [Arguments]
|
|
|
|
Arguments:
|
|
-h Print this help screen
|
|
-i Interactive mode
|
|
-d Load default configuration (KARMA on, KARMA beaconing off,
|
|
beaconing for 13 common SSIDs on, custom SSIDs never expire)
|
|
-c Print current KARMA firmware configuration
|
|
-p 0/1 Disable/Enable KARMA probe responses
|
|
-a 0/1 Disable/Enable KARMA association responses
|
|
-k 0/1 Disable/Enable KARMA association responses and probe responses
|
|
(overrides -p and -a)
|
|
-b 0/1 Disable/Enable KARMA beaconing (broadcasts up to 20 SSIDs
|
|
spotted in probe requests as beacon)
|
|
-s 0/1 Disable/Enable custom SSID beaconing (broadcasts up to 20 SSIDs
|
|
which have been added by the user with '--addssid=' when enabled)
|
|
--addssid="test" Add SSID "test" to custom SSID list (max 20 SSIDs)
|
|
--remssid="test" Remove SSID "test" from custom SSID list
|
|
--clearssids Clear list of custom SSIDs
|
|
--clearkarma Clear list of karma SSIDs (only influences beaconing, not probes)
|
|
--autoremkarma=600 Auto remove KARMA SSIDs from beaconing list after sending 600 beacons
|
|
without receiving an association (about 60 seconds, 0 = beacon forever)
|
|
--autoremcustom=3000 Auto remove custom SSIDs from beaconing list after sending 3000
|
|
beacons without receiving an association (about 5 minutes, 0 = beacon
|
|
forever)
|
|
|
|
Example:
|
|
python karmatool.py -k 1 -b 0 Enables KARMA (probe and association responses)
|
|
But sends no beacons for SSIDs from received probes
|
|
python karmatool.py -k 1 -b 0 Enables KARMA (probe and association responses)
|
|
and sends beacons for SSIDs from received probes
|
|
(max 20 SSIDs, if autoremove isn't enabled)
|
|
|
|
python karmatool.py --addssid="test 1" --addssid="test 2" -s 1
|
|
Add SSID "test 1" and "test 2" and enable beaconing for
|
|
custom SSIDs
|
|
'''
|
|
print(usagescr)
|
|
|
|
def print_conf():
|
|
print "Retrieving current configuration ...\n===================================="
|
|
MaMe82_IO.dump_conf(print_res=True)
|
|
|
|
def check_bool_arg(arg):
|
|
try:
|
|
res = int(arg)
|
|
if (res == 0) or (res == 1):
|
|
return res
|
|
else:
|
|
return -1
|
|
except ValueError:
|
|
return -1
|
|
|
|
def main(argv):
|
|
try:
|
|
opts, args = getopt.getopt(argv, "hicdk:p:a:b:s:", ["help", "interactive", "currentconfig", "setdefault", "clearkarma", "clearssids", "addssid=", "remssid=", "autoremkarma=", "autoremcustom="])
|
|
except getopt.GetoptError:
|
|
print "ERROR: Wrong command line argument(s)"
|
|
print "-------------------------------------\n"
|
|
usage()
|
|
sys.exit(2)
|
|
|
|
for opt, arg in opts:
|
|
if opt in ("-h", "--help"):
|
|
usage()
|
|
sys.exit()
|
|
elif opt in ("-d", "--setdefault"):
|
|
print "Setting default configuration ..."
|
|
MaMe82_IO.set_defaults()
|
|
print_conf()
|
|
sys.exit()
|
|
elif opt in ("-i", "--interactive"):
|
|
print "Interactive mode"
|
|
print "... Sorry, feature not implemented, yet ... stay tuned"
|
|
sys.exit()
|
|
elif opt in ("-c", "--currentconfig"):
|
|
print_conf()
|
|
elif opt == "-p":
|
|
val = check_bool_arg(arg)
|
|
if (val == -1):
|
|
print "Argument error for -p (KARMA probe), must be 0 or 1 .... ignoring option"
|
|
else:
|
|
print "Setting KARMA probe responses to {0}".format("On" if (val==1) else "Off")
|
|
MaMe82_IO.set_enable_karma_probe(True if (val==1) else False)
|
|
elif opt == "-a":
|
|
val = check_bool_arg(arg)
|
|
if (val == -1):
|
|
print "Argument error for -a (KARMA associations), must be 0 or 1 .... ignoring option"
|
|
else:
|
|
print "Setting KARMA association responses to {0}".format("On" if (val==1) else "Off")
|
|
MaMe82_IO.set_enable_karma_assoc(True if (val==1) else False)
|
|
elif opt == "-k":
|
|
val = check_bool_arg(arg)
|
|
if (val == -1):
|
|
print "Argument error for -k (KARMA probes and associations), must be 0 or 1 .... ignoring option"
|
|
else:
|
|
print "Setting KARMA probe and association responses to {0}".format("On" if (val==1) else "Off")
|
|
MaMe82_IO.set_enable_karma(True if (val==1) else False)
|
|
elif opt == "-b":
|
|
val = check_bool_arg(arg)
|
|
if (val == -1):
|
|
print "Argument error for -b (KARMA beaconing), must be 0 or 1 .... ignoring option"
|
|
else:
|
|
print "Setting KARMA beaconing to {0}".format("On" if (val==1) else "Off")
|
|
MaMe82_IO.set_enable_karma_beaconing(True if (val==1) else False)
|
|
elif opt == "-s":
|
|
val = check_bool_arg(arg)
|
|
if (val == -1):
|
|
print "Argument error for -s (custom beaconing), must be 0 or 1 .... ignoring option"
|
|
else:
|
|
print "Setting custom beaconing to {0}".format("On" if (val==1) else "Off")
|
|
MaMe82_IO.set_enable_custom_beaconing(True if (val==1) else False)
|
|
elif opt == "--addssid":
|
|
if len(arg) == 0 or len(arg) > 32:
|
|
print "Argument error for --addssid, mustn't be empty max length is 32 ... ignoring option"
|
|
else:
|
|
MaMe82_IO.add_custom_ssid(arg)
|
|
elif opt == "--remssid":
|
|
if len(arg) == 0 or len(arg) > 32:
|
|
print "Argument error for --remssid, mustn't be empty max length is 32 ... ignoring option"
|
|
else:
|
|
MaMe82_IO.rem_custom_ssid(arg)
|
|
elif opt == "--clearssids":
|
|
print "Removing all custom SSIDs"
|
|
MaMe82_IO.clear_custom_ssids()
|
|
elif opt == "--clearkarma":
|
|
print "Removing all KARMA SSIDs (no influence on probe / assoc responses)"
|
|
MaMe82_IO.clear_karma_ssids()
|
|
elif opt == "--autoremkarma":
|
|
error="An integer value >=0 is needed for autoremkarma ... ignoring option"
|
|
try:
|
|
val = int(arg)
|
|
if (val < 0):
|
|
print error
|
|
else:
|
|
print "Removing KARMA SSIDs after sending {0} beacons without occuring association".format(val)
|
|
MaMe82_IO.set_autoremove_karma_ssids(val)
|
|
except ValueError:
|
|
print error
|
|
elif opt == "--autoremcustom":
|
|
error="An integer value >=0 is needed for autoremcustom ... ignoring option"
|
|
try:
|
|
val = int(arg)
|
|
if (val < 0):
|
|
print error
|
|
else:
|
|
print "Removing custom SSIDs after sending {0} beacons without occuring association".format(val)
|
|
MaMe82_IO.set_autoremove_custom_ssids(val)
|
|
except ValueError:
|
|
print error
|
|
|
|
|
|
|
|
print ""
|
|
print_conf()
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if not MaMe82_IO.check_for_karma_cap():
|
|
print "The current WiFi Firmware in use doesn't seem to support KARMA"
|
|
print "A modified and precompiled nexmon firmware for Pi3 / Pi0w with KARMA support could"
|
|
print "be found here:\thttps://github.com/mame82/P4wnP1_nexmon_additions"
|
|
sys.exit()
|
|
else:
|
|
print "Firmware in use seems to be KARMA capable"
|
|
|
|
if len(sys.argv) < 2:
|
|
usage()
|
|
sys.exit()
|
|
main(sys.argv[1:])
|
|
|