diff --git a/data/meterpreter/ext_server_stdapi.jar b/data/meterpreter/ext_server_stdapi.jar
index 5b471307d6..c4405f4aeb 100755
Binary files a/data/meterpreter/ext_server_stdapi.jar and b/data/meterpreter/ext_server_stdapi.jar differ
diff --git a/data/meterpreter/meterpreter.jar b/data/meterpreter/meterpreter.jar
index 4228cb3b1e..a9583a5a90 100755
Binary files a/data/meterpreter/meterpreter.jar and b/data/meterpreter/meterpreter.jar differ
diff --git a/external/source/meterpreter/java/src/meterpreter/com/metasploit/meterpreter/Meterpreter.java b/external/source/meterpreter/java/src/meterpreter/com/metasploit/meterpreter/Meterpreter.java
index 488d18244a..79cb3b5678 100644
--- a/external/source/meterpreter/java/src/meterpreter/com/metasploit/meterpreter/Meterpreter.java
+++ b/external/source/meterpreter/java/src/meterpreter/com/metasploit/meterpreter/Meterpreter.java
@@ -267,6 +267,15 @@ public class Meterpreter {
return err;
}
+ /**
+ * Return the length of the currently buffered error stream content, or -1 if no buffering is active.
+ */
+ public int getErrorBufferLength() {
+ if (errBuffer == null)
+ return -1;
+ return errBuffer.size();
+ }
+
/**
* Return the currently buffered error stream content, or null if no buffering is active.
*/
@@ -315,4 +324,4 @@ public class Meterpreter {
ExtensionLoader loader = (ExtensionLoader) classLoader.loadClass(loaderName).newInstance();
loader.load(commandManager);
}
-}
\ No newline at end of file
+}
diff --git a/external/source/meterpreter/java/src/stdapi/com/metasploit/meterpreter/stdapi/stdapi_fs_stat.java b/external/source/meterpreter/java/src/stdapi/com/metasploit/meterpreter/stdapi/stdapi_fs_stat.java
index 321485482f..5b751a996a 100644
--- a/external/source/meterpreter/java/src/stdapi/com/metasploit/meterpreter/stdapi/stdapi_fs_stat.java
+++ b/external/source/meterpreter/java/src/stdapi/com/metasploit/meterpreter/stdapi/stdapi_fs_stat.java
@@ -14,6 +14,13 @@ public class stdapi_fs_stat implements Command {
public int execute(Meterpreter meterpreter, TLVPacket request, TLVPacket response) throws Exception {
String path = request.getStringValue(TLVType.TLV_TYPE_FILE_PATH);
+ if (path.equals("...")) {
+ long length = meterpreter.getErrorBufferLength();
+ if (length != -1) {
+ response.add(TLVType.TLV_TYPE_STAT_BUF, stat(0444 | 0100000, length, System.currentTimeMillis()));
+ return ERROR_SUCCESS;
+ }
+ }
File file = new File(path);
if (!file.exists())
file = Loader.expand(path);
@@ -24,24 +31,28 @@ public class stdapi_fs_stat implements Command {
}
public byte[] stat(File file) throws IOException {
+ int mode = (file.canRead() ? 0444 : 0) | (file.canWrite() ? 0222 : 0) | (canExecute(file) ? 0110 : 0) | (file.isHidden() ? 1 : 0) | (file.isDirectory() ? 040000 : 0) | (file.isFile() ? 0100000 : 0);
+ return stat(mode, file.length(), file.lastModified());
+ }
+
+ private byte[] stat(int mode, long length, long lastModified) throws IOException {
ByteArrayOutputStream statbuf = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(statbuf);
dos.writeInt(le(0)); // dev
dos.writeShort(short_le(0)); // ino
- int mode = (file.canRead() ? 0444 : 0) | (file.canWrite() ? 0222 : 0) | (canExecute(file) ? 0110 : 0) | (file.isHidden() ? 1 : 0) | (file.isDirectory() ? 040000 : 0) | (file.isFile() ? 0100000 : 0);
dos.writeShort(short_le(mode)); // mode
dos.writeShort(short_le(1)); // nlink
dos.writeShort(short_le(65535)); // uid
dos.writeShort(short_le(65535)); // gid
dos.writeShort(short_le(0)); // padding
dos.writeInt(le(0)); // rdev
- dos.writeInt(le((int) file.length())); // size
- int mtime = (int) (file.lastModified() / 1000);
+ dos.writeInt(le((int) length)); // size
+ int mtime = (int) (lastModified / 1000);
dos.writeInt(le(mtime)); // atime
dos.writeInt(le(mtime)); // mtime
dos.writeInt(le(mtime)); // ctime
dos.writeInt(le(1024)); // blksize
- dos.writeInt(le((int) ((file.length() + 1023) / 1024))); // blocks
+ dos.writeInt(le((int) ((length + 1023) / 1024))); // blocks
return statbuf.toByteArray();
}