Refactoring for packiging is now complete!
parent
68a908562a
commit
23d8a6517f
13
cme/cmedb.py
13
cme/cmedb.py
|
@ -16,12 +16,12 @@ requests.packages.urllib3.disable_warnings()
|
||||||
|
|
||||||
class CMEDatabaseNavigator(cmd.Cmd):
|
class CMEDatabaseNavigator(cmd.Cmd):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, db_path):
|
||||||
cmd.Cmd.__init__(self)
|
cmd.Cmd.__init__(self)
|
||||||
self.prompt = 'cmedb > '
|
self.prompt = 'cmedb > '
|
||||||
try:
|
try:
|
||||||
# set the database connection to autocommit w/ isolation level
|
# set the database connection to autocommit w/ isolation level
|
||||||
conn = sqlite3.connect('data/cme.db', check_same_thread=False)
|
conn = sqlite3.connect(db_path, check_same_thread=False)
|
||||||
conn.text_factory = str
|
conn.text_factory = str
|
||||||
conn.isolation_level = None
|
conn.isolation_level = None
|
||||||
self.db = CMEDatabase(conn)
|
self.db = CMEDatabase(conn)
|
||||||
|
@ -300,15 +300,18 @@ class CMEDatabaseNavigator(cmd.Cmd):
|
||||||
def main():
|
def main():
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("path", nargs='?', type=str, default='data/cme.db', help="path to CME database (default: data/cme.db)")
|
parser.add_argument("path", nargs='?', type=str, default=None, help="path to CME database (default: data/cme.db)")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if not os.path.exists(args.path):
|
db_path = os.path.join(os.path.expanduser('~/.cme'), 'cme.db')
|
||||||
|
|
||||||
|
if args.path:
|
||||||
|
db_path = os.path.expanduser(args.path)
|
||||||
print 'Path to CME database invalid'
|
print 'Path to CME database invalid'
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cmedbnav = CMEDatabaseNavigator()
|
cmedbnav = CMEDatabaseNavigator(db_path)
|
||||||
cmedbnav.cmdloop()
|
cmedbnav.cmdloop()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
pass
|
pass
|
|
@ -1,6 +1,9 @@
|
||||||
import BaseHTTPServer
|
import BaseHTTPServer
|
||||||
import threading
|
import threading
|
||||||
import ssl
|
import ssl
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from getpass import getuser
|
||||||
from BaseHTTPServer import BaseHTTPRequestHandler
|
from BaseHTTPServer import BaseHTTPRequestHandler
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from gevent import sleep
|
from gevent import sleep
|
||||||
|
@ -36,7 +39,11 @@ class RequestHandler(BaseHTTPRequestHandler):
|
||||||
|
|
||||||
class CMEServer(threading.Thread):
|
class CMEServer(threading.Thread):
|
||||||
|
|
||||||
def __init__(self, module, context, srv_host, port, server_type='https'):
|
def __init__(self, module, context, logger, srv_host, port, server_type='https'):
|
||||||
|
|
||||||
|
if port <= 1024 and os.geteuid() != 0:
|
||||||
|
logger.error("I'm sorry {}, I'm afraid I can't let you do that".format(getuser()))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
|
@ -46,12 +53,19 @@ class CMEServer(threading.Thread):
|
||||||
self.server.module = module
|
self.server.module = module
|
||||||
self.server.context = context
|
self.server.context = context
|
||||||
self.server.log = context.log
|
self.server.log = context.log
|
||||||
|
self.cert_path = os.path.join(os.path.expanduser('~/.cme'), 'cme.pem')
|
||||||
|
|
||||||
if server_type == 'https':
|
if server_type == 'https':
|
||||||
self.server.socket = ssl.wrap_socket(self.server.socket, certfile='data/cme.pem', server_side=True)
|
self.server.socket = ssl.wrap_socket(self.server.socket, certfile=self.cert_path, server_side=True)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print 'Error starting CME Server: {}'.format(e)
|
errno, message = e.args
|
||||||
|
if errno == 98 and message == 'Address already in use':
|
||||||
|
logger.error('Error starting CME server: the port is already in use, try specifying a diffrent port using --server-port')
|
||||||
|
else:
|
||||||
|
logger.error('Error starting CME server: {}'.format(message))
|
||||||
|
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
def base_server(self):
|
def base_server(self):
|
||||||
return self.server
|
return self.server
|
||||||
|
|
|
@ -43,7 +43,7 @@ def main():
|
||||||
@pentestgeek's smbexec https://github.com/pentestgeek/smbexec
|
@pentestgeek's smbexec https://github.com/pentestgeek/smbexec
|
||||||
|
|
||||||
{}: {}
|
{}: {}
|
||||||
{}: {}
|
{}: {}
|
||||||
""".format(highlight('Version', 'red'),
|
""".format(highlight('Version', 'red'),
|
||||||
highlight(VERSION),
|
highlight(VERSION),
|
||||||
highlight('Codename', 'red'),
|
highlight('Codename', 'red'),
|
||||||
|
@ -63,8 +63,8 @@ def main():
|
||||||
msgroup.add_argument("-H", metavar="HASH", dest='hash', nargs='*', default=[], help='NTLM hash(es) or file(s) containing NTLM hashes')
|
msgroup.add_argument("-H", metavar="HASH", dest='hash', nargs='*', default=[], help='NTLM hash(es) or file(s) containing NTLM hashes')
|
||||||
parser.add_argument("-M", "--module", metavar='MODULE', dest='module', help='Payload module to use')
|
parser.add_argument("-M", "--module", metavar='MODULE', dest='module', help='Payload module to use')
|
||||||
parser.add_argument('-o', metavar='MODULE_OPTION', nargs='*', default=[], dest='module_options', help='Payload module options')
|
parser.add_argument('-o', metavar='MODULE_OPTION', nargs='*', default=[], dest='module_options', help='Payload module options')
|
||||||
parser.add_argument('--module-info', action='store_true', dest='module_info', help='Display module info')
|
parser.add_argument('-L', '--list-modules', action='store_true', help='List available modules')
|
||||||
parser.add_argument('--list-modules', action='store_true', help='List available modules')
|
parser.add_argument('--show-options', action='store_true', dest='show_options', help='Display module options')
|
||||||
parser.add_argument("--share", metavar="SHARE", dest='share', default="C$", help="Specify a share (default: C$)")
|
parser.add_argument("--share", metavar="SHARE", dest='share', default="C$", help="Specify a share (default: C$)")
|
||||||
parser.add_argument("--smb-port", dest='smb_port', type=int, choices={139, 445}, default=445, help="SMB port (default: 445)")
|
parser.add_argument("--smb-port", dest='smb_port', type=int, choices={139, 445}, default=445, help="SMB port (default: 445)")
|
||||||
parser.add_argument("--mssql-port", dest='mssql_port', default=1433, type=int, metavar='PORT', help='MSSQL port (default: 1433)')
|
parser.add_argument("--mssql-port", dest='mssql_port', default=1433, type=int, metavar='PORT', help='MSSQL port (default: 1433)')
|
||||||
|
@ -190,14 +190,16 @@ def main():
|
||||||
modules = loader.get_modules()
|
modules = loader.get_modules()
|
||||||
|
|
||||||
if args.list_modules:
|
if args.list_modules:
|
||||||
for module in modules:
|
for m in modules:
|
||||||
print module
|
logger.info('{:<20} {}'.format(m, modules[m]['description']))
|
||||||
|
|
||||||
elif args.modules:
|
elif args.module:
|
||||||
for module in modules.keys():
|
for m in modules.keys():
|
||||||
if args.module.lower() == module.lower():
|
if args.module.lower() == m.lower():
|
||||||
module, context, server = loader.init_module(modules[module]['path'])
|
if args.show_options:
|
||||||
break
|
logger.info('{} module options:\n{}'.format(m, modules[m]['options']))
|
||||||
|
elif not args.show_options:
|
||||||
|
module, context, server = loader.init_module(modules[m]['path'])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -7,6 +7,7 @@ from cme.credentials.lsa import LSASecrets
|
||||||
from cme.credentials.ntds import NTDSHashes
|
from cme.credentials.ntds import NTDSHashes
|
||||||
from impacket.dcerpc.v5.rpcrt import DCERPCException
|
from impacket.dcerpc.v5.rpcrt import DCERPCException
|
||||||
import traceback
|
import traceback
|
||||||
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
class DumpSecrets:
|
class DumpSecrets:
|
||||||
|
@ -28,7 +29,7 @@ class DumpSecrets:
|
||||||
self.__history = False
|
self.__history = False
|
||||||
self.__noLMHash = True
|
self.__noLMHash = True
|
||||||
self.__isRemote = True
|
self.__isRemote = True
|
||||||
self.__outputFileName = 'logs/{}_{}'.format(connection.hostname, connection.host)
|
self.__outputFileName = os.path.join(os.path.expanduser('~/.cme'), 'logs/{}_{}'.format(connection.hostname, connection.host))
|
||||||
self.__doKerberos = False
|
self.__doKerberos = False
|
||||||
self.__justDC = False
|
self.__justDC = False
|
||||||
self.__justDCNTLM = False
|
self.__justDCNTLM = False
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
import re
|
import re
|
||||||
|
import cme
|
||||||
|
import os
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
from termcolor import colored
|
from termcolor import colored
|
||||||
|
|
||||||
|
@ -14,6 +16,14 @@ def validate_ntlm(data):
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def get_ps_script(path):
|
||||||
|
return os.path.join(os.path.dirname(cme.__file__), 'data', 'PowerSploit', path)
|
||||||
|
|
||||||
|
def write_log(data, log_name):
|
||||||
|
logs_dir = os.path.join(os.path.expanduser('~/.cme'), 'logs')
|
||||||
|
with open(os.path.join(logs_dir, log_name), 'w') as mimikatz_output:
|
||||||
|
mimikatz_output.write(data)
|
||||||
|
|
||||||
def obfs_ps_script(script, function_name=None):
|
def obfs_ps_script(script, function_name=None):
|
||||||
"""
|
"""
|
||||||
Strip block comments, line comments, empty lines, verbose statements,
|
Strip block comments, line comments, empty lines, verbose statements,
|
||||||
|
|
|
@ -2,7 +2,6 @@ import imp
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import cme
|
import cme
|
||||||
from getpass import getuser
|
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from cme.context import Context
|
from cme.context import Context
|
||||||
from cme.logger import CMEAdapter
|
from cme.logger import CMEAdapter
|
||||||
|
@ -24,6 +23,10 @@ class ModuleLoader:
|
||||||
self.logger.error('{} missing the name variable'.format(module_path))
|
self.logger.error('{} missing the name variable'.format(module_path))
|
||||||
module_error = True
|
module_error = True
|
||||||
|
|
||||||
|
elif not hasattr(module, 'description'):
|
||||||
|
self.logger.error('{} missing the description variable'.format(module_path))
|
||||||
|
module_error = True
|
||||||
|
|
||||||
elif not hasattr(module, 'options'):
|
elif not hasattr(module, 'options'):
|
||||||
self.logger.error('{} missing the options function'.format(module_path))
|
self.logger.error('{} missing the options function'.format(module_path))
|
||||||
module_error = True
|
module_error = True
|
||||||
|
@ -48,19 +51,19 @@ class ModuleLoader:
|
||||||
|
|
||||||
modules_path = os.path.join(os.path.dirname(cme.__file__), 'modules')
|
modules_path = os.path.join(os.path.dirname(cme.__file__), 'modules')
|
||||||
for module in os.listdir(modules_path):
|
for module in os.listdir(modules_path):
|
||||||
if module[-3:] == '.py':
|
if module[-3:] == '.py' and module != 'example_module.py':
|
||||||
module_path = os.path.join(modules_path, module)
|
module_path = os.path.join(modules_path, module)
|
||||||
m = self.load_module(os.path.join(modules_path, module))
|
m = self.load_module(os.path.join(modules_path, module))
|
||||||
if m:
|
if m:
|
||||||
modules[m.name] = {'path': module, 'description': m.__doc__, 'options': m.options.__doc__}
|
modules[m.name] = {'path': module_path, 'description': m.description, 'options': m.options.__doc__}
|
||||||
|
|
||||||
modules_path = os.path.join(self.cme_path, 'modules')
|
modules_path = os.path.join(self.cme_path, 'modules')
|
||||||
for module in os.listdir(modules_path):
|
for module in os.listdir(modules_path):
|
||||||
if module[-3:] == '.py':
|
if module[-3:] == '.py' and module != 'example_module.py':
|
||||||
module_path = os.path.join(modules_path, module)
|
module_path = os.path.join(modules_path, module)
|
||||||
m = self.load_module(module_path)
|
m = self.load_module(module_path)
|
||||||
if m:
|
if m:
|
||||||
modules[m.name] = {'path': module_path, 'description': m.__doc__, 'options': m.options.__doc__}
|
modules[m.name] = {'path': module_path, 'description': m.description, 'options': m.options.__doc__}
|
||||||
|
|
||||||
return modules
|
return modules
|
||||||
|
|
||||||
|
@ -90,13 +93,9 @@ class ModuleLoader:
|
||||||
args.server = getattr(module, 'required_server')
|
args.server = getattr(module, 'required_server')
|
||||||
|
|
||||||
if not self.server_port:
|
if not self.server_port:
|
||||||
if self.args.server_port <= 1024 and os.geteuid() is not 0:
|
|
||||||
self.logger.error("I'm sorry {}, I'm afraid I can't let you do that".format(getuser()))
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
self. server_port = self.args.server_port
|
self. server_port = self.args.server_port
|
||||||
|
|
||||||
server = CMEServer(module, context, self.args.server_host, self.server_port, self.args.server)
|
server = CMEServer(module, context, self.logger, self.args.server_host, self.server_port, self.args.server)
|
||||||
server.start()
|
server.start()
|
||||||
|
|
||||||
return module, context, server
|
return module, context, server
|
|
@ -15,6 +15,8 @@ class CMEModule:
|
||||||
|
|
||||||
name='com_exec'
|
name='com_exec'
|
||||||
|
|
||||||
|
description = 'Executes a command using a COM scriptlet to bypass whitelisting'
|
||||||
|
|
||||||
required_server='http'
|
required_server='http'
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
|
|
|
@ -11,7 +11,9 @@ class CMEModule:
|
||||||
Module by @byt3bl33d3r
|
Module by @byt3bl33d3r
|
||||||
'''
|
'''
|
||||||
|
|
||||||
name='Empire_Exec'
|
name='empire_exec'
|
||||||
|
|
||||||
|
description = "Uses Empire's RESTful API to generate a launcher for the specified listener and executes it"
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -5,7 +5,9 @@ class CMEModule:
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
name = 'Example'
|
name = 'example module'
|
||||||
|
|
||||||
|
description = 'Something Something'
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''Required. Module options get parsed here. Additionally, put the modules usage here as well'''
|
'''Required. Module options get parsed here. Additionally, put the modules usage here as well'''
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from cme.helpers import create_ps_command, obfs_ps_script
|
from cme.helpers import create_ps_command, obfs_ps_script, get_ps_script, write_log
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
@ -8,7 +8,9 @@ class CMEModule:
|
||||||
Module by @byt3bl33d3r
|
Module by @byt3bl33d3r
|
||||||
'''
|
'''
|
||||||
|
|
||||||
name = 'GetComputers'
|
name = 'getcomputers'
|
||||||
|
|
||||||
|
description = "Wrapper for PowerView's Get-NetGroup function"
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''
|
'''
|
||||||
|
@ -71,7 +73,7 @@ class CMEModule:
|
||||||
request.send_response(200)
|
request.send_response(200)
|
||||||
request.end_headers()
|
request.end_headers()
|
||||||
|
|
||||||
with open('data/PowerSploit/Recon/PowerView.ps1', 'r') as ps_script:
|
with open(get_ps_script('Recon/PowerView.ps1'), 'r') as ps_script:
|
||||||
ps_script = obfs_ps_script(ps_script.read())
|
ps_script = obfs_ps_script(ps_script.read())
|
||||||
request.wfile.write(ps_script)
|
request.wfile.write(ps_script)
|
||||||
|
|
||||||
|
@ -97,6 +99,5 @@ class CMEModule:
|
||||||
print_post_data(data)
|
print_post_data(data)
|
||||||
|
|
||||||
log_name = 'Computers-{}-{}.log'.format(response.client_address[0], datetime.now().strftime("%Y-%m-%d_%H%M%S"))
|
log_name = 'Computers-{}-{}.log'.format(response.client_address[0], datetime.now().strftime("%Y-%m-%d_%H%M%S"))
|
||||||
with open('logs/' + log_name, 'w') as log_file:
|
write_log(data, log_name)
|
||||||
log_file.write(data)
|
|
||||||
context.log.info("Saved output to {}".format(log_name))
|
context.log.info("Saved output to {}".format(log_name))
|
|
@ -1,4 +1,4 @@
|
||||||
from cme.helpers import create_ps_command, obfs_ps_script
|
from cme.helpers import create_ps_command, obfs_ps_script, get_ps_script, write_log
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
@ -8,7 +8,9 @@ class CMEModule:
|
||||||
Module by @byt3bl33d3r
|
Module by @byt3bl33d3r
|
||||||
'''
|
'''
|
||||||
|
|
||||||
name = 'GetGroupMembers'
|
name = 'getgroupmembers'
|
||||||
|
|
||||||
|
description = "Wrapper for PowerView's Get-NetGroupMember function"
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''
|
'''
|
||||||
|
@ -63,7 +65,7 @@ class CMEModule:
|
||||||
request.send_response(200)
|
request.send_response(200)
|
||||||
request.end_headers()
|
request.end_headers()
|
||||||
|
|
||||||
with open('data/PowerSploit/Recon/PowerView.ps1', 'r') as ps_script:
|
with open(get_ps_script('Recon/PowerView.ps1'), 'r') as ps_script:
|
||||||
ps_script = obfs_ps_script(ps_script.read())
|
ps_script = obfs_ps_script(ps_script.read())
|
||||||
request.wfile.write(ps_script)
|
request.wfile.write(ps_script)
|
||||||
|
|
||||||
|
@ -89,6 +91,5 @@ class CMEModule:
|
||||||
print_post_data(data)
|
print_post_data(data)
|
||||||
|
|
||||||
log_name = 'GroupMembers-{}-{}.log'.format(response.client_address[0], datetime.now().strftime("%Y-%m-%d_%H%M%S"))
|
log_name = 'GroupMembers-{}-{}.log'.format(response.client_address[0], datetime.now().strftime("%Y-%m-%d_%H%M%S"))
|
||||||
with open('logs/' + log_name, 'w') as log_file:
|
write_log(data, log_name)
|
||||||
log_file.write(data)
|
|
||||||
context.log.info("Saved output to {}".format(log_name))
|
context.log.info("Saved output to {}".format(log_name))
|
|
@ -1,4 +1,4 @@
|
||||||
from cme.helpers import create_ps_command, obfs_ps_script
|
from cme.helpers import create_ps_command, obfs_ps_script, get_ps_script, write_log
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
@ -8,7 +8,9 @@ class CMEModule:
|
||||||
Module by @byt3bl33d3r
|
Module by @byt3bl33d3r
|
||||||
'''
|
'''
|
||||||
|
|
||||||
name = 'GetGroups'
|
name = 'getgroups'
|
||||||
|
|
||||||
|
description = "Wrapper for PowerView's Get-NetGroup function"
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''
|
'''
|
||||||
|
@ -63,7 +65,7 @@ class CMEModule:
|
||||||
request.send_response(200)
|
request.send_response(200)
|
||||||
request.end_headers()
|
request.end_headers()
|
||||||
|
|
||||||
with open('data/PowerSploit/Recon/PowerView.ps1', 'r') as ps_script:
|
with open(get_ps_script('Recon/PowerView.ps1'), 'r') as ps_script:
|
||||||
ps_script = obfs_ps_script(ps_script.read())
|
ps_script = obfs_ps_script(ps_script.read())
|
||||||
request.wfile.write(ps_script)
|
request.wfile.write(ps_script)
|
||||||
|
|
||||||
|
@ -89,6 +91,5 @@ class CMEModule:
|
||||||
print_post_data(data)
|
print_post_data(data)
|
||||||
|
|
||||||
log_name = 'Groups-{}-{}.log'.format(response.client_address[0], datetime.now().strftime("%Y-%m-%d_%H%M%S"))
|
log_name = 'Groups-{}-{}.log'.format(response.client_address[0], datetime.now().strftime("%Y-%m-%d_%H%M%S"))
|
||||||
with open('logs/' + log_name, 'w') as log_file:
|
write_log(data, log_name)
|
||||||
log_file.write(data)
|
|
||||||
context.log.info("Saved output to {}".format(log_name))
|
context.log.info("Saved output to {}".format(log_name))
|
|
@ -1,4 +1,4 @@
|
||||||
from cme.helpers import gen_random_string, create_ps_command, obfs_ps_script
|
from cme.helpers import gen_random_string, create_ps_command, obfs_ps_script, get_ps_script
|
||||||
from sys import exit
|
from sys import exit
|
||||||
|
|
||||||
class CMEModule:
|
class CMEModule:
|
||||||
|
@ -6,7 +6,9 @@ class CMEModule:
|
||||||
Downloads the Meterpreter stager and injects it into memory using PowerSploit's Invoke-Shellcode.ps1 script
|
Downloads the Meterpreter stager and injects it into memory using PowerSploit's Invoke-Shellcode.ps1 script
|
||||||
Module by @byt3bl33d3r
|
Module by @byt3bl33d3r
|
||||||
'''
|
'''
|
||||||
name = 'MetInject'
|
name = 'metinject'
|
||||||
|
|
||||||
|
description = "Downloads the Meterpreter stager and injects it into memory using PowerSploit's Invoke-Shellcode.ps1 script"
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''
|
'''
|
||||||
|
@ -73,7 +75,7 @@ class CMEModule:
|
||||||
request.send_response(200)
|
request.send_response(200)
|
||||||
request.end_headers()
|
request.end_headers()
|
||||||
|
|
||||||
with open('data/PowerSploit/CodeExecution/Invoke-Shellcode.ps1', 'r') as ps_script:
|
with open(get_ps_script('CodeExecution/Invoke-Shellcode.ps1'), 'r') as ps_script:
|
||||||
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
||||||
request.wfile.write(ps_script)
|
request.wfile.write(ps_script)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from cme.helpers import create_ps_command, obfs_ps_script, gen_random_string, validate_ntlm
|
from cme.helpers import create_ps_command, get_ps_script, obfs_ps_script, gen_random_string, validate_ntlm, write_log
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
@ -8,7 +8,9 @@ class CMEModule:
|
||||||
Module by @byt3bl33d3r
|
Module by @byt3bl33d3r
|
||||||
'''
|
'''
|
||||||
|
|
||||||
name = 'Mimikatz'
|
name = 'mimikatz'
|
||||||
|
|
||||||
|
description = "Executes PowerSploit's Invoke-Mimikatz.ps1 script"
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''
|
'''
|
||||||
|
@ -53,7 +55,7 @@ class CMEModule:
|
||||||
request.send_response(200)
|
request.send_response(200)
|
||||||
request.end_headers()
|
request.end_headers()
|
||||||
|
|
||||||
with open('data/PowerSploit/Exfiltration/Invoke-Mimikatz.ps1', 'r') as ps_script:
|
with open(get_ps_script('Exfiltration/Invoke-Mimikatz.ps1'), 'r') as ps_script:
|
||||||
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
||||||
request.wfile.write(ps_script)
|
request.wfile.write(ps_script)
|
||||||
|
|
||||||
|
@ -213,6 +215,5 @@ class CMEModule:
|
||||||
context.log.highlight('{}\\{}:{}'.format(domain, username, password))
|
context.log.highlight('{}\\{}:{}'.format(domain, username, password))
|
||||||
|
|
||||||
log_name = 'Mimikatz-{}-{}.log'.format(response.client_address[0], datetime.now().strftime("%Y-%m-%d_%H%M%S"))
|
log_name = 'Mimikatz-{}-{}.log'.format(response.client_address[0], datetime.now().strftime("%Y-%m-%d_%H%M%S"))
|
||||||
with open('logs/' + log_name, 'w') as mimikatz_output:
|
write_log(data, log_name)
|
||||||
mimikatz_output.write(data)
|
|
||||||
context.log.info("Saved Mimikatz's output to {}".format(log_name))
|
context.log.info("Saved Mimikatz's output to {}".format(log_name))
|
|
@ -1,4 +1,4 @@
|
||||||
from cme.helpers import gen_random_string, create_ps_command, obfs_ps_script
|
from cme.helpers import gen_random_string, create_ps_command, obfs_ps_script, get_ps_script
|
||||||
from sys import exit
|
from sys import exit
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
@ -7,7 +7,9 @@ class CMEModule:
|
||||||
Downloads the specified DLL/EXE and injects it into memory using PowerSploit's Invoke-ReflectivePEInjection.ps1 script
|
Downloads the specified DLL/EXE and injects it into memory using PowerSploit's Invoke-ReflectivePEInjection.ps1 script
|
||||||
Module by @byt3bl33d3r
|
Module by @byt3bl33d3r
|
||||||
'''
|
'''
|
||||||
name = 'PEInject'
|
name = 'peinject'
|
||||||
|
|
||||||
|
description = "Downloads the specified DLL/EXE and injects it into memory using PowerSploit's Invoke-ReflectivePEInjection.ps1 script"
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''
|
'''
|
||||||
|
@ -64,7 +66,7 @@ class CMEModule:
|
||||||
request.send_response(200)
|
request.send_response(200)
|
||||||
request.end_headers()
|
request.end_headers()
|
||||||
|
|
||||||
with open('data/PowerSploit/CodeExecution/Invoke-ReflectivePEInjection.ps1', 'r') as ps_script:
|
with open(get_ps_script('CodeExecution/Invoke-ReflectivePEInjection.ps1'), 'r') as ps_script:
|
||||||
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
||||||
request.wfile.write(ps_script)
|
request.wfile.write(ps_script)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import os
|
import os
|
||||||
from cme.helpers import gen_random_string, create_ps_command, obfs_ps_script
|
from cme.helpers import gen_random_string, create_ps_command, obfs_ps_script, get_ps_script
|
||||||
from sys import exit
|
from sys import exit
|
||||||
|
|
||||||
class CMEModule:
|
class CMEModule:
|
||||||
|
@ -7,7 +7,9 @@ class CMEModule:
|
||||||
Downloads the specified raw shellcode and injects it into memory using PowerSploit's Invoke-Shellcode.ps1 script
|
Downloads the specified raw shellcode and injects it into memory using PowerSploit's Invoke-Shellcode.ps1 script
|
||||||
Module by @byt3bl33d3r
|
Module by @byt3bl33d3r
|
||||||
'''
|
'''
|
||||||
name = 'ShellInject'
|
name = 'shellinject'
|
||||||
|
|
||||||
|
description = "Downloads the specified raw shellcode and injects it into memory using PowerSploit's Invoke-Shellcode.ps1 script"
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''
|
'''
|
||||||
|
@ -56,7 +58,7 @@ class CMEModule:
|
||||||
request.send_response(200)
|
request.send_response(200)
|
||||||
request.end_headers()
|
request.end_headers()
|
||||||
|
|
||||||
with open('data/PowerSploit/CodeExecution/Invoke-Shellcode.ps1' ,'r') as ps_script:
|
with open(get_ps_script('CodeExecution/Invoke-Shellcode.ps1') ,'r') as ps_script:
|
||||||
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
||||||
request.wfile.write(ps_script)
|
request.wfile.write(ps_script)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from cme.helpers import create_ps_command, gen_random_string, obfs_ps_script
|
from cme.helpers import create_ps_command, gen_random_string, obfs_ps_script, get_ps_script
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
@ -16,7 +16,9 @@ class CMEModule:
|
||||||
Module by @byt3bl33d3r
|
Module by @byt3bl33d3r
|
||||||
'''
|
'''
|
||||||
|
|
||||||
name = 'TokenRider'
|
name = 'tokenrider'
|
||||||
|
|
||||||
|
description = 'Allows for automatic token enumeration, impersonation and mass lateral spread using privileges instead of dumped credentials'
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''
|
'''
|
||||||
|
@ -124,7 +126,7 @@ class CMEModule:
|
||||||
request.send_response(200)
|
request.send_response(200)
|
||||||
request.end_headers()
|
request.end_headers()
|
||||||
|
|
||||||
with open('data/PowerSploit/Exfiltration/Invoke-TokenManipulation.ps1', 'r') as ps_script:
|
with open(get_ps_script('Exfiltration/Invoke-TokenManipulation.ps1'), 'r') as ps_script:
|
||||||
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
||||||
request.wfile.write(ps_script)
|
request.wfile.write(ps_script)
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from cme.helpers import create_ps_command, obfs_ps_script, gen_random_string
|
from cme.helpers import create_ps_command, obfs_ps_script, gen_random_string, get_ps_script
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
import os
|
import os
|
||||||
|
@ -10,7 +10,9 @@ class CMEModule:
|
||||||
Module by @byt3bl33d3r
|
Module by @byt3bl33d3r
|
||||||
'''
|
'''
|
||||||
|
|
||||||
name = 'Tokens'
|
name = 'tokens'
|
||||||
|
|
||||||
|
description = "Enumerates available tokens using Powersploit's Invoke-TokenManipulation"
|
||||||
|
|
||||||
def options(self, context, module_options):
|
def options(self, context, module_options):
|
||||||
'''
|
'''
|
||||||
|
@ -67,7 +69,7 @@ class CMEModule:
|
||||||
request.send_response(200)
|
request.send_response(200)
|
||||||
request.end_headers()
|
request.end_headers()
|
||||||
|
|
||||||
with open('data/PowerSploit/Exfiltration/Invoke-TokenManipulation.ps1', 'r') as ps_script:
|
with open(get_ps_script('Exfiltration/Invoke-TokenManipulation.ps1'), 'r') as ps_script:
|
||||||
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
ps_script = obfs_ps_script(ps_script.read(), self.obfs_name)
|
||||||
request.wfile.write(ps_script)
|
request.wfile.write(ps_script)
|
||||||
|
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -7,7 +7,7 @@ setup(name='crackmapexec',
|
||||||
'License :: OSI Approved :: BSD License',
|
'License :: OSI Approved :: BSD License',
|
||||||
'Programming Language :: Python :: 2.7',
|
'Programming Language :: Python :: 2.7',
|
||||||
],
|
],
|
||||||
keywords='pentesting tool security windows smb active-directory',
|
keywords='pentesting security windows smb active-directory',
|
||||||
url='http://github.com/byt3bl33d3r/CrackMapExec',
|
url='http://github.com/byt3bl33d3r/CrackMapExec',
|
||||||
author='byt3bl33d3r',
|
author='byt3bl33d3r',
|
||||||
author_email='byt3bl33d3r@gmail.com',
|
author_email='byt3bl33d3r@gmail.com',
|
||||||
|
|
Loading…
Reference in New Issue