mirror of
https://github.com/trustedsec/social-engineer-toolkit
synced 2024-11-25 22:10:19 +00:00
bee1a38d05
This commit completes porting the internals of the MiniFakeDNS server class to Python 3. This primarily means converting the Python 2 `str` types to Python 3's `bytes` objects. In the process, I've also translated the variable names from their original Spanish into English, and added explanatory comments for how the DNS header parsing is accomplished to enhance the educational potential of SET. Another small change is the addition of a new core helper function, `detect_public_ip()`, which makes a couple parts of the codebase a little more DRY by reducing code duplication across the `set.py` and `setcore.py` files. This change also makes it possible to parameterize the IP address that MiniFakeDNS server responds to requests with.
286 lines
9.8 KiB
Python
Executable file
286 lines
9.8 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
# coding=utf-8
|
|
import os
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
|
|
# Py2/3 compatibility
|
|
# Python3 renamed raw_input to input
|
|
try:
|
|
input = raw_input
|
|
except NameError:
|
|
pass
|
|
|
|
# import main core functionality into SET
|
|
import src.core.setcore as core
|
|
|
|
# check which operating system
|
|
operating_system = core.check_os()
|
|
|
|
if operating_system == "posix":
|
|
|
|
#
|
|
# ROOT CHECK
|
|
#
|
|
|
|
if os.geteuid() != 0:
|
|
print("\n The Social-Engineer Toolkit (SET) - by David Kennedy (ReL1K)")
|
|
print("\n Not running as root. \n\nExiting the Social-Engineer Toolkit (SET).\n")
|
|
core.exit_set()
|
|
|
|
# if we are running in the path no need to change
|
|
if os.path.isfile("setoolkit"):
|
|
pass
|
|
|
|
# check where we are and load default directory
|
|
elif os.path.isdir("/usr/share/setoolkit"):
|
|
if not os.path.isfile("setoolkit"):
|
|
os.chdir("/usr/share/setoolkit")
|
|
sys.path.append("/usr/share/setoolkit")
|
|
|
|
# check where we are and load default directory
|
|
elif os.path.isdir("/usr/share/set"):
|
|
if not os.path.isfile("setoolkit"):
|
|
os.chdir("/usr/share/set")
|
|
sys.path.append("/usr/share/set")
|
|
|
|
# make sure the config file is located in /etc/setoolkit
|
|
if not os.path.isdir("/etc/setoolkit/"):
|
|
os.makedirs("/etc/setoolkit/")
|
|
shutil.copyfile("src/core/config.baseline", "/etc/setoolkit/set.config")
|
|
|
|
if not os.path.isfile("/etc/setoolkit/set.config"):
|
|
shutil.copyfile("src/core/config.baseline", "/etc/setoolkit/set.config")
|
|
|
|
# here we check to ensure we have the latest version
|
|
with open("/etc/setoolkit/set.config") as fileopen:
|
|
data = fileopen.read()
|
|
|
|
if "CONFIG_VERSION=7.7.9" not in data:
|
|
print("[*] Overwriting old config for updates to SET. Backing up your old one in /etc/setoolkit/")
|
|
shutil.move("/etc/setoolkit/set.config", "/etc/setoolkit/set.config.bak")
|
|
shutil.copyfile("src/core/config.baseline", "/etc/setoolkit/set.config")
|
|
|
|
# import after config checks have been properly created
|
|
from src.core.menu import text
|
|
from src.core.update_config import update_config
|
|
|
|
|
|
if os.path.isfile(os.path.join(core.userconfigpath, "version.lock")):
|
|
os.remove(os.path.join(core.userconfigpath, "version.lock"))
|
|
|
|
# check directory and make it
|
|
if not os.path.isdir("src/logs/"):
|
|
os.makedirs("src/logs/")
|
|
|
|
# check set logfile
|
|
if not os.path.isfile("src/logs/set_logfile.log"):
|
|
# create new log
|
|
with open("src/logs/set_logfile.log", "w") as filewrite:
|
|
filewrite.write("")
|
|
|
|
# use ~/.set
|
|
if operating_system == "posix":
|
|
if not os.path.isdir(core.userconfigpath):
|
|
# create the set variables
|
|
os.makedirs(core.userconfigpath)
|
|
# if for some reason it failed to pull the path
|
|
userdir = os.path.join(os.path.expanduser('~'), '.set')
|
|
if not os.path.isdir(userdir):
|
|
os.makedirs(userdir)
|
|
|
|
if not os.path.isdir(os.path.join(core.userconfigpath, "reports")):
|
|
os.makedirs(os.path.join(core.userconfigpath, "reports"))
|
|
|
|
# check to see if we have python-pycrypto
|
|
try:
|
|
from Crypto.Cipher import AES
|
|
except ImportError:
|
|
print("[!] The python-pycrypto python module not installed. You will lose the ability to use multi-pyinjector.")
|
|
pass
|
|
|
|
#
|
|
# The Social-Engineer Toolkit (SET) #
|
|
# Written by: David Kennedy (ReL1K) #
|
|
#
|
|
#
|
|
# this is the main menu structure for SET
|
|
|
|
# main menu
|
|
|
|
# update the main config per load
|
|
update_config()
|
|
|
|
# chmod routine
|
|
if operating_system == "posix":
|
|
# change permissions if nix
|
|
subprocess.Popen("chmod +x seautomate;"
|
|
"chmod +x set-update;"
|
|
"chmod +x setup.py;"
|
|
"chmod +x set-proxy;"
|
|
"chmod +x src/payloads/ratte/ratteserver;"
|
|
"chmod +x src/payloads/set_payloads/listener.py",
|
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
|
|
|
dns = core.check_config("DNS_SERVER=")
|
|
if dns.lower() == "on":
|
|
import src.core.minifakedns
|
|
from src.core.setcore import detect_public_ip
|
|
src.core.minifakedns.start_dns_server(detect_public_ip())
|
|
|
|
# remove old files
|
|
for root, dirs, files in os.walk(core.userconfigpath):
|
|
for f in files:
|
|
try:
|
|
match = re.search(".svn|entries|all-wcprops|props|text-base|prop-base|tmp", f)
|
|
if not match:
|
|
os.unlink(os.path.join(root, f))
|
|
|
|
# if they are being used then ignore
|
|
except:
|
|
pass
|
|
# loop through all the directories
|
|
for d in dirs:
|
|
try:
|
|
match = re.search(".svn|entries|all-wcprops|props|text-base|prop-base|tmp", d)
|
|
if not match:
|
|
shutil.rmtree(os.path.join(root, d))
|
|
except:
|
|
pass
|
|
|
|
# if there isn't a set_config.py file yet, create one
|
|
if not os.path.isfile("/etc/setoolkit/set_config.py"):
|
|
update_config()
|
|
|
|
define_version = core.get_version()
|
|
|
|
# create the set.options routine
|
|
with open(os.path.join(core.userconfigpath, "set.options"), "w") as filewrite:
|
|
filewrite.write("{This is the main SET configuration file for all options used in SET}\n")
|
|
|
|
try:
|
|
# Remove old Signed_Updates
|
|
if os.path.isfile(os.path.join(core.userconfigpath, "Signed_Update.jar")):
|
|
os.remove(os.path.join(core.userconfigpath, "Signed_Update.jar"))
|
|
|
|
# initial user menu
|
|
if not os.path.isfile("src/agreement4"):
|
|
with open("readme/LICENSE") as fileopen:
|
|
for line in fileopen:
|
|
print((line.rstrip()))
|
|
|
|
print("{0}The Social-Engineer Toolkit is designed purely"
|
|
" for good and not evil. If you are planning on "
|
|
"using this tool for malicious purposes that are "
|
|
"not authorized by the company you are performing "
|
|
"assessments for, you are violating the terms of "
|
|
"service and license of this toolset. By hitting "
|
|
"yes (only one time), you agree to the terms of "
|
|
"service and that you will only use this tool for "
|
|
"lawful purposes only.{1}".format(core.bcolors.RED, core.bcolors.ENDC))
|
|
print(core.bcolors.GREEN)
|
|
choice = input("\nDo you agree to the terms of service [y/n]: ")
|
|
choice += " " # b/c method below
|
|
if choice[0].lower() == "y":
|
|
with open("src/agreement4", "w") as filewrite:
|
|
filewrite.write("user accepted")
|
|
print(core.bcolors.ENDC)
|
|
else:
|
|
print(core.bcolors.ENDC + "[!] Exiting the Social-Engineer Toolkit, have a nice day." + core.bcolors.ENDC)
|
|
sys.exit()
|
|
|
|
while True:
|
|
core.show_banner(define_version, '1')
|
|
show_main_menu = core.create_menu(text.main_text, text.main_menu)
|
|
|
|
# special case of list item 99
|
|
print('\n 99) Exit the Social-Engineer Toolkit\n')
|
|
|
|
# main core menu
|
|
main_menu_choice = (input(core.setprompt("0", "")))
|
|
|
|
# funny
|
|
if main_menu_choice == "hugs":
|
|
core.print_warning("Have you given someone a hug today? Remember a hug can change the world.")
|
|
pause = input("\nPlease give someone a hug then press {return} to continue.")
|
|
|
|
# funny2
|
|
if main_menu_choice == "freehugs":
|
|
core.print_warning("HUGS ARE ALWAYS FREE! NEVER CHARGE! ALWAYS HUG.")
|
|
pause = input("\nDo not press return until giving someone a hug.")
|
|
|
|
# funny3
|
|
if main_menu_choice == "derbycon":
|
|
core.print_warning(core.bcolors.BOLD + "YAYYYYYYYYYYYYYYYYYYYYYY DerbyCon.\n\nDerbyCon 7.0 'Legacy' -- September 22th - 24th 2017" + core.bcolors.ENDC)
|
|
pause = input(core.bcolors.BOLD + "\nDon't miss it! Sep 23 - Sep 25th! Press {return} to continue." + core.bcolors.ENDC)
|
|
|
|
# rance
|
|
if main_menu_choice == "rance":
|
|
core.print_warning(core.bcolors.BOLD + "We miss you buddy. David Jones (Rance) changed a lot of us and you'll always be apart of our lives (and SET). Fuck Cancer." + core.bcolors.ENDC)
|
|
pause = input("Press {return} to continue.")
|
|
|
|
# cavs
|
|
if main_menu_choice == "cavs":
|
|
core.print_warning(core.bcolors.BOLD + "2015-2016 CHAMPS BABY!!! C l e e e e e e v eeee l a a n n d d d d d d d d d d d " + core.bcolors.ENDC)
|
|
pause = input("Press {return} to continue.")
|
|
|
|
# quit out
|
|
if main_menu_choice == 'exit' or main_menu_choice == "99" or main_menu_choice == "quit":
|
|
core.exit_set()
|
|
# cleans up stale processes from SET
|
|
try:
|
|
# kill anything python running on 80
|
|
core.kill_proc("80", "python")
|
|
# kill anything on 443 ruby which is generally a rogue listener
|
|
core.kill_proc("443", "ruby")
|
|
except:
|
|
pass
|
|
|
|
# load set
|
|
if main_menu_choice == '1':
|
|
try:
|
|
core.module_reload(src.core.set)
|
|
except:
|
|
import src.core.set
|
|
|
|
# load fasttrack
|
|
if main_menu_choice == '2':
|
|
try:
|
|
core.module_reload(src.core.fasttrack)
|
|
except:
|
|
import src.core.fasttrack
|
|
|
|
# third party modules
|
|
if main_menu_choice == '3':
|
|
try:
|
|
core.module_reload(src.core.module_handler)
|
|
except:
|
|
import src.core.module_handler
|
|
|
|
# update set
|
|
if main_menu_choice == '4':
|
|
core.update_set()
|
|
|
|
# credits
|
|
if main_menu_choice == '5':
|
|
update_config()
|
|
|
|
# update config
|
|
if main_menu_choice == '6':
|
|
core.help_menu()
|
|
|
|
# handle keyboard interrupts
|
|
except KeyboardInterrupt:
|
|
print(("\n\nThank you for {0}shopping{1} with the Social-Engineer Toolkit."
|
|
"\n\nHack the Gibson...and remember...hugs are worth more "
|
|
"than handshakes.\n".format(core.bcolors.RED, core.bcolors.ENDC)))
|
|
|
|
# handle exceptions
|
|
except Exception as error:
|
|
core.log(error)
|
|
print("\n\n[!] Something went wrong, printing the error: " + str(error))
|
|
|
|
# cleanup routine
|
|
core.cleanup_routine()
|