mirror of
https://github.com/rapid7/metasploit-payloads
synced 2025-03-18 15:14:10 +01:00
Handle discrepance of process launching on Windows between different versions of Java
This commit is contained in:
parent
dc3021e1c0
commit
f1fcfd6176
@ -67,70 +67,83 @@ public class stdapi_sys_process_execute implements Command {
|
|||||||
|
|
||||||
// On Windows, Java quote-escapes _some_ arguments (like those with spaces), but doesn't deal correctly with some
|
// On Windows, Java quote-escapes _some_ arguments (like those with spaces), but doesn't deal correctly with some
|
||||||
// edge cases; e.g. empty strings, strings that already have quotes.
|
// edge cases; e.g. empty strings, strings that already have quotes.
|
||||||
protected String escapeArg(String arg) {
|
protected String escapeArgWindows(String arg) {
|
||||||
if (arg == null) {
|
if (arg == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
String osName = System.getProperty("os.name");
|
if (arg.equals("")) {
|
||||||
if (osName != null && osName.toLowerCase().contains("windows")) {
|
return "\"\"";
|
||||||
if (arg.equals("")) {
|
} else {
|
||||||
return "\"\"";
|
StringBuilder sb = new StringBuilder();
|
||||||
} else {
|
int numBackslashes = 0;
|
||||||
StringBuilder sb = new StringBuilder();
|
boolean needsQuoting = false;
|
||||||
int numBackslashes = 0;
|
for (int i = 0; i < arg.length(); i++) {
|
||||||
boolean needsQuoting = false;
|
char c = arg.charAt(i);
|
||||||
for (int i = 0; i < arg.length(); i++) {
|
switch (c) {
|
||||||
char c = arg.charAt(i);
|
case '"': {
|
||||||
switch (c) {
|
for (int nb = 0; nb < numBackslashes; nb++) {
|
||||||
case '"': {
|
sb.append('\\');
|
||||||
for (int nb = 0; nb < numBackslashes; nb++) {
|
}
|
||||||
sb.append('\\');
|
numBackslashes = 0;
|
||||||
}
|
sb.append('\\');
|
||||||
numBackslashes = 0;
|
break;
|
||||||
sb.append('\\');
|
}
|
||||||
break;
|
case '\\': {
|
||||||
}
|
numBackslashes++;
|
||||||
case '\\': {
|
break;
|
||||||
numBackslashes++;
|
}
|
||||||
break;
|
case ' ':
|
||||||
}
|
case '\t':
|
||||||
case ' ':
|
case (char)11:
|
||||||
case '\t':
|
{
|
||||||
case (char)11:
|
needsQuoting = true;
|
||||||
{
|
numBackslashes = 0;
|
||||||
needsQuoting = true;
|
break;
|
||||||
numBackslashes = 0;
|
}
|
||||||
break;
|
default: {
|
||||||
}
|
numBackslashes = 0;
|
||||||
default: {
|
break;
|
||||||
numBackslashes = 0;
|
}
|
||||||
break;
|
}
|
||||||
}
|
sb.append(c);
|
||||||
}
|
}
|
||||||
sb.append(c);
|
if (needsQuoting) {
|
||||||
}
|
for (int nb = 0; nb < numBackslashes; nb++) {
|
||||||
if (needsQuoting) {
|
sb.append('\\');
|
||||||
for (int nb = 0; nb < numBackslashes; nb++) {
|
}
|
||||||
sb.append('\\');
|
return "\"" + sb.toString() + "\"";
|
||||||
}
|
}
|
||||||
return "\"" + sb.toString() + "\"";
|
return sb.toString();
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return arg;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Process execute(String cmd, ArrayList<String> args) throws IOException {
|
protected Process executeWindows(String cmd, ArrayList<String> args) throws IOException {
|
||||||
ArrayList<String> cmdAndArgs = new ArrayList<String>();
|
StringBuilder cmdString = new StringBuilder();
|
||||||
cmdAndArgs.add(cmd);
|
cmdString.append(cmd);
|
||||||
for (String arg : args) {
|
if (args.size() > 0) {
|
||||||
cmdAndArgs.add(escapeArg(arg));
|
for (String arg : args) {
|
||||||
|
cmdString.append(" ");
|
||||||
|
cmdString.append(escapeArgWindows(arg));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return execute(cmdString.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Process execute(String cmd, ArrayList<String> args) throws IOException {
|
||||||
|
String osName = System.getProperty("os.name");
|
||||||
|
if (osName != null && osName.toLowerCase().contains("windows")) {
|
||||||
|
return executeWindows(cmd, args);
|
||||||
|
} else {
|
||||||
|
ArrayList<String> cmdAndArgs = new ArrayList<String>();
|
||||||
|
cmdAndArgs.add(cmd);
|
||||||
|
for (String arg : args) {
|
||||||
|
cmdAndArgs.add(arg);
|
||||||
|
}
|
||||||
|
ProcessBuilder builder = new ProcessBuilder(cmdAndArgs);
|
||||||
|
builder.directory(Loader.getCWD());
|
||||||
|
return builder.start();
|
||||||
}
|
}
|
||||||
ProcessBuilder builder = new ProcessBuilder(cmdAndArgs);
|
|
||||||
builder.directory(Loader.getCWD());
|
|
||||||
return builder.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Process execute(String cmdstr) throws IOException {
|
protected Process execute(String cmdstr) throws IOException {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user