Create menu_functions.py

This commit is contained in:
Opabinia 2024-01-17 14:21:35 +13:00 committed by GitHub
parent d88fe7d058
commit 427545806e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 155 additions and 0 deletions

155
utils/menu_functions.py Normal file
View File

@ -0,0 +1,155 @@
import os
import logging as log
import bluetooth
import re
import subprocess
import time
def get_target_address():
target_address = input("\nWhat is the target address? Leave blank and we will scan for you: ")
if target_address == "":
devices = scan_for_devices()
if devices:
if len(devices) > 1: # More than one device means a scan was performed
selection = int(input("\nSelect a device by number: ")) - 1
if 0 <= selection < len(devices):
target_address = devices[selection][0]
else:
print("\nInvalid selection. Exiting.")
return
else:
# Only one device, means a known device was selected
target_address = devices[0][0]
else:
return
elif not is_valid_mac_address(target_address):
print("\nInvalid MAC address format. Please enter a valid MAC address.")
return
return target_address
def restart_bluetooth_daemon():
run(["sudo", "service", "bluetooth", "restart"])
time.sleep(0.5)
def run(command):
assert(isinstance(command, list))
log.debug("executing '%s'" % " ".join(command))
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
return result
def print_blue_ascii_art():
blue_color_code = "\033[34m" # ANSI escape code for blue text
reset_color_code = "\033[0m" # ANSI escape code to reset text color
ascii_art = """
"""
print(blue_color_code + ascii_art + reset_color_code)
def clear_screen():
os.system('clear')
# Function to save discovered devices to a file
def save_devices_to_file(devices, filename='known_devices.txt'):
with open(filename, 'w') as file:
for addr, name in devices:
file.write(f"{addr},{name}\n")
# Function to scan for devices
def scan_for_devices():
main_menu()
# Load known devices
known_devices = load_known_devices()
if known_devices:
print("\nKnown devices:")
for idx, (addr, name) in enumerate(known_devices):
print(f"{idx + 1}: Device Name: {name}, Address: {addr}")
use_known_device = input("\nDo you want to use one of these known devices? (yes/no): ")
if use_known_device.lower() == 'yes':
device_choice = int(input("Enter the number of the device: "))
return [known_devices[device_choice - 1]]
# Normal Bluetooth scan
print("\nAttempting to scan now...")
nearby_devices = bluetooth.discover_devices(duration=8, lookup_names=True, flush_cache=True, lookup_class=True)
device_list = []
if len(nearby_devices) == 0:
print("\nNo nearby devices found.")
else:
print("\nFound {} nearby device(s):".format(len(nearby_devices)))
for idx, (addr, name, _) in enumerate(nearby_devices):
print(f"{idx + 1}: Device Name: {name}, Address: {addr}")
device_list.append((addr, name))
# Save the scanned devices only if they are not already in known devices
new_devices = [device for device in device_list if device not in known_devices]
if new_devices:
known_devices += new_devices
save_devices_to_file(known_devices)
return device_list
def main_menu():
clear_screen()
print_blue_ascii_art()
title = "BlueDucky - Bluetooth Device Attacker"
separator = 70 * "="
print(separator)
print(f"{separator}\n{title.center(len(separator))}\n{separator}")
print("Remember, you can still attack devices without visibility...\nIf you have their MAC address")
print(separator)
def is_valid_mac_address(mac_address):
# Regular expression to match a MAC address in the form XX:XX:XX:XX:XX:XX
mac_address_pattern = re.compile(r'^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$')
return mac_address_pattern.match(mac_address) is not None
# Function to read DuckyScript from file
def read_duckyscript(filename='payload.txt'):
if os.path.exists(filename):
with open(filename, 'r') as file:
return [line.strip() for line in file.readlines()]
else:
log.warning(f"File {filename} not found. Skipping DuckyScript.")
return None
# Function to load known devices from a file
def load_known_devices(filename='known_devices.txt'):
if os.path.exists(filename):
with open(filename, 'r') as file:
return [tuple(line.strip().split(',')) for line in file]
else:
return []