librex 0.0.68 → 0.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -0,0 +1,84 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'msf/core'
4
+
5
+ module Rex
6
+ module Exploitation
7
+ module Js
8
+
9
+ #
10
+ # Provides networking functions in JavaScript
11
+ #
12
+ class Network
13
+
14
+ # @param [Hash] opts the options hash
15
+ # @option opts [Boolean] :obfuscate toggles js obfuscation. defaults to true.
16
+ # @option opts [Boolean] :inject_xhr_shim automatically stubs XHR to use ActiveXObject when needed.
17
+ # defaults to true.
18
+ # @return [String] javascript code to perform a synchronous ajax request to the remote
19
+ # and returns the response
20
+ def self.ajax_download(opts={})
21
+ should_obfuscate = opts.fetch(:obfuscate, true)
22
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "network", "ajax_download.js"))
23
+
24
+ if should_obfuscate
25
+ js = ::Rex::Exploitation::ObfuscateJS.new(js,
26
+ {
27
+ 'Symbols' => {
28
+ 'Variables' => %w{ xmlHttp oArg }
29
+ }
30
+ }).obfuscate
31
+ end
32
+
33
+ xhr_shim(opts) + js
34
+ end
35
+
36
+ # @param [Hash] opts the options hash
37
+ # @option opts [Boolean] :obfuscate toggles js obfuscation. defaults to true.
38
+ # @option opts [Boolean] :inject_xhr_shim automatically stubs XHR to use ActiveXObject when needed.
39
+ # defaults to true.
40
+ # @return [String] javascript code to perform a synchronous or asynchronous ajax request to
41
+ # the remote with the data specified.
42
+ def self.ajax_post(opts={})
43
+ should_obfuscate = opts.fetch(:obfuscate, true)
44
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "network", "ajax_post.js"))
45
+
46
+ if should_obfuscate
47
+ js = ::Rex::Exploitation::ObfuscateJS.new(js,
48
+ {
49
+ 'Symbols' => {
50
+ 'Variables' => %w{ xmlHttp cb path data }
51
+ }
52
+ }).obfuscate
53
+ end
54
+
55
+ xhr_shim(opts) + js
56
+ end
57
+
58
+ # @param [Hash] opts the options hash
59
+ # @option opts [Boolean] :obfuscate toggles js obfuscation. defaults to true.
60
+ # @option opts [Boolean] :inject_xhr_shim false causes this method to return ''. defaults to true.
61
+ # @return [String] javascript code that adds XMLHttpRequest to the global scope if it
62
+ # does not exist (e.g. on IE6, where you have to use the ActiveXObject constructor)
63
+ def self.xhr_shim(opts={})
64
+ return '' unless opts.fetch(:inject_xhr_shim, true)
65
+
66
+ should_obfuscate = opts.fetch(:obfuscate, true)
67
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "network", "xhr_shim.js"))
68
+
69
+ if should_obfuscate
70
+ js = ::Rex::Exploitation::ObfuscateJS.new(js,
71
+ {
72
+ 'Symbols' => {
73
+ 'Variables' => %w{ activeObjs idx }
74
+ }
75
+ }
76
+ ).obfuscate
77
+ end
78
+ js
79
+ end
80
+
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,33 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'msf/core'
4
+ require 'rex/text'
5
+ require 'rex/exploitation/jsobfu'
6
+
7
+ module Rex
8
+ module Exploitation
9
+ module Js
10
+
11
+ #
12
+ # Javascript utilities
13
+ #
14
+ class Utils
15
+
16
+ def self.base64
17
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "utils", "base64.js"))
18
+
19
+ opts = {
20
+ 'Symbols' => {
21
+ 'Variables' => %w{ Base64 encoding result _keyStr encoded_data utftext input_idx
22
+ input output chr chr1 chr2 chr3 enc1 enc2 enc3 enc4 },
23
+ 'Methods' => %w{ _utf8_encode _utf8_decode encode decode }
24
+ }
25
+ }
26
+
27
+ ::Rex::Exploitation::ObfuscateJS.new(js, opts).to_s
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,9 +1,7 @@
1
1
  # -*- coding: binary -*-
2
- ##
3
- # $Id: jsobfu.rb 15548 2012-06-29 06:08:20Z rapid7 $
4
- ##
5
2
 
6
3
  require 'rex/text'
4
+ require 'rex/random_identifier_generator'
7
5
  require 'rkelly'
8
6
 
9
7
  module Rex
@@ -50,412 +48,438 @@ module Exploitation
50
48
  #
51
49
  class JSObfu
52
50
 
53
- #
54
- # Abstract Syntax Tree generated by RKelly::Parser#parse
55
- #
56
- attr_reader :ast
57
-
58
- #
59
- # Saves +code+ for later obfuscation with #obfuscate
60
- #
61
- def initialize(code)
62
- @code = code
63
- @funcs = {}
64
- @vars = {}
65
- @debug = false
66
- end
67
-
68
- #
69
- # Add +str+ to the un-obfuscated code.
70
- #
71
- # Calling this method after #obfuscate is undefined
72
- #
73
- def <<(str)
74
- @code << str
75
- end
76
-
77
- #
78
- # Return the (possibly obfuscated) code as a string.
79
- #
80
- # If #obfuscate has not been called before this, returns the parsed,
81
- # unobfuscated code. This can be useful for example to remove comments and
82
- # standardize spacing.
83
- #
84
- def to_s
85
- parse if not @ast
86
- @ast.to_ecma
87
- end
88
-
89
- #
90
- # Return the obfuscated name of a symbol
91
- #
92
- # You MUST call #obfuscate before this method!
93
- #
94
- def sym(lookup)
95
- if @vars[lookup]
96
- ret = @vars[lookup]
97
- elsif @funcs[lookup]
98
- ret = @funcs[lookup]
99
- else
100
- ret = lookup
101
- end
102
- ret
103
- end
104
-
105
- #
106
- # Parse and obfuscate
107
- #
108
- def obfuscate
109
- parse
110
- obfuscate_r(@ast)
111
- end
51
+ # these keywords should never be used as a random var name
52
+ # source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Reserved_Words
53
+ RESERVED_KEYWORDS = %w(
54
+ break case catch continue debugger default delete do else finally
55
+ for function if in instanceof new return switch this throw try
56
+ typeof var void while with class enum export extends import super
57
+ implements interface let package private protected public static yield
58
+ )
59
+
60
+ #
61
+ # Abstract Syntax Tree generated by RKelly::Parser#parse
62
+ #
63
+ attr_reader :ast
64
+
65
+ #
66
+ # Saves +code+ for later obfuscation with #obfuscate
67
+ #
68
+ def initialize(code)
69
+ @code = code
70
+ @funcs = {}
71
+ @vars = {}
72
+ @debug = false
73
+ @rand_gen = Rex::RandomIdentifierGenerator.new(
74
+ :max_length => 15,
75
+ :first_char_set => Rex::Text::Alpha+"_$",
76
+ :char_set => Rex::Text::AlphaNumeric+"_$"
77
+ )
78
+ end
79
+
80
+ #
81
+ # Add +str+ to the un-obfuscated code.
82
+ #
83
+ # Calling this method after #obfuscate is undefined
84
+ #
85
+ def <<(str)
86
+ @code << str
87
+ end
88
+
89
+ #
90
+ # Return the (possibly obfuscated) code as a string.
91
+ #
92
+ # If #obfuscate has not been called before this, returns the parsed,
93
+ # unobfuscated code. This can be useful for example to remove comments and
94
+ # standardize spacing.
95
+ #
96
+ def to_s
97
+ parse if not @ast
98
+ @ast.to_ecma
99
+ end
100
+
101
+ #
102
+ # Return the obfuscated name of a symbol
103
+ #
104
+ # You MUST call #obfuscate before this method!
105
+ #
106
+ def sym(lookup)
107
+ if @vars[lookup]
108
+ ret = @vars[lookup]
109
+ elsif @funcs[lookup]
110
+ ret = @funcs[lookup]
111
+ else
112
+ ret = lookup
113
+ end
114
+ ret
115
+ end
116
+
117
+ #
118
+ # Parse and obfuscate
119
+ #
120
+ def obfuscate
121
+ parse
122
+ obfuscate_r(@ast)
123
+ end
124
+
125
+ # @return [String] a unique random var name that is not a reserved keyword
126
+ def random_var_name
127
+ loop do
128
+ text = random_string
129
+ unless @vars.has_value?(text) or RESERVED_KEYWORDS.include?(text)
130
+ return text
131
+ end
132
+ end
133
+ end
112
134
 
113
135
  protected
114
136
 
115
- #
116
- # Recursive method to obfuscate the given +ast+.
117
- #
118
- # +ast+ should be the result of RKelly::Parser#parse
119
- #
120
- def obfuscate_r(ast)
121
- ast.each do |node|
122
- #if node.respond_to? :value and node.value.kind_of? String and node.value =~ /bodyOnLoad/i
123
- # $stdout.puts("bodyOnLoad: #{node.class}: #{node.value}")
124
- #end
125
-
126
- case node
127
- when nil
128
- nil
129
-
130
- when ::RKelly::Nodes::SourceElementsNode
131
- # Recurse
132
- obfuscate_r(node.value)
133
-
134
- #when ::RKelly::Nodes::ObjectLiteralNode
135
- # TODO
136
- #$stdout.puts(node.methods - Object.new.methods)
137
- #$stdout.puts(node.value.inspect)
138
-
139
- when ::RKelly::Nodes::PropertyNode
140
- # Property names must be bare words or string literals NOT
141
- # expressions! Can't use transform_string() here
142
- if node.name =~ /^[a-zA-Z_][a-zA-Z0-9_]*$/
143
- n = '"'
144
- node.name.unpack("C*") { |c|
145
- case rand(3)
146
- when 0; n << "\\x%02x"%(c)
147
- when 1; n << "\\#{c.to_s 8}"
148
- when 2; n << [c].pack("C")
149
- end
150
- }
151
- n << '"'
152
- node.name = n
153
- end
154
-
155
- # Variables
156
- when ::RKelly::Nodes::VarDeclNode
157
- if @vars[node.name].nil?
158
- #@vars[node.name] = "var_#{Rex::Text.rand_text_alpha(3+rand(12))}_#{node.name}"
159
- @vars[node.name] = "#{Rex::Text.rand_text_alpha(3+rand(12))}"
160
- end
161
- node.name = @vars[node.name]
162
- when ::RKelly::Nodes::ParameterNode
163
- if @vars[node.value].nil?
164
- #@vars[node.value] = "param_#{Rex::Text.rand_text_alpha(3+rand(12))}_#{node.value}"
165
- @vars[node.value] = "#{Rex::Text.rand_text_alpha(3+rand(12))}"
166
- end
167
- node.value = @vars[node.value]
168
- when ::RKelly::Nodes::ResolveNode
169
- #$stdout.puts("Resolve bodyOnload: #{@vars[node.value]}") if "bodyOnLoad" == node.value
170
- node.value = @vars[node.value] if @vars[node.value]
171
- when ::RKelly::Nodes::DotAccessorNode
172
- case node.value
173
- when ::RKelly::Nodes::ResolveNode
174
- if @vars[node.value.value]
175
- node.value.value = @vars[node.value.value]
176
- end
177
- #else
178
- # $stderr.puts("Non-resolve node as target of dotaccessor: #{node.value.class}")
179
- end
180
-
181
- # Functions
182
- when ::RKelly::Nodes::FunctionDeclNode
183
- #$stdout.puts("FunctionDecl: #{node.value}")
184
- # Functions can also act as objects, so store them in the vars
185
- # and the functions list so we can replace them in both places
186
- if @funcs[node.value].nil? and not @funcs.values.include?(node.value)
187
- #@funcs[node.value] = "func_#{Rex::Text.rand_text_alpha(3+rand(12))}_#{node.value}"
188
- @funcs[node.value] = "#{Rex::Text.rand_text_alpha(3+rand(12))}"
189
- if @vars[node.value].nil?
190
- @vars[node.value] = @funcs[node.value]
191
- end
192
- node.value = @funcs[node.value]
193
- end
194
- when ::RKelly::Nodes::FunctionCallNode
195
- # The value of a FunctionCallNode is some sort of accessor node or a ResolveNode
196
- # so this is basically useless
197
- #$stdout.puts("Function call: #{node.name} => #{@funcs[node.name]}")
198
- #node.value = @funcs[node.value] if @funcs[node.value]
199
-
200
- # Transformers
201
- when ::RKelly::Nodes::NumberNode
202
- node.value = transform_number(node.value)
203
- when ::RKelly::Nodes::StringNode
204
- node.value = transform_string(node.value)
205
- else
206
- #$stderr.puts "#{node.class}: #{node.value}"
207
- #$stderr.puts "#{node.class}"
208
- end
209
-
210
- #unless node.kind_of? ::RKelly::Nodes::SourceElementsNode
211
- # $stderr.puts "#{node.class}: #{node.value}"
212
- #end
213
- end
214
-
215
- nil
216
- end
217
-
218
- #
219
- # Generate an Abstract Syntax Tree (#ast) for later obfuscation
220
- #
221
- def parse
222
- parser = RKelly::Parser.new
223
- @ast = parser.parse(@code)
224
- end
225
-
226
- #
227
- # Convert a number to a random base (decimal, octal, or hexedecimal).
228
- #
229
- # Given 10 as input, the possible return values are:
230
- # "10"
231
- # "0xa"
232
- # "012"
233
- #
234
- def rand_base(num)
235
- case rand(3)
236
- when 0; num.to_s
237
- when 1; "0%o" % num
238
- when 2; "0x%x" % num
239
- end
240
- end
241
-
242
- #
243
- # Return a mathematical expression that will evaluate to the given number
244
- # +num+.
245
- #
246
- # +num+ can be a float or an int, but should never be negative.
247
- #
248
- def transform_number(num)
249
- case num
250
- when Fixnum
251
- if num == 0
252
- r = rand(10) + 1
253
- transformed = "('#{Rex::Text.rand_text_alpha(r)}'.length - #{r})"
254
- elsif num > 0 and num < 10
255
- # use a random string.length for small numbers
256
- transformed = "'#{Rex::Text.rand_text_alpha(num)}'.length"
257
- else
258
- transformed = "("
259
- divisor = rand(num) + 1
260
- a = num / divisor.to_i
261
- b = num - (a * divisor)
262
- # recurse half the time for a
263
- a = (rand(2) == 0) ? transform_number(a) : rand_base(a)
264
- # recurse half the time for divisor
265
- divisor = (rand(2) == 0) ? transform_number(divisor) : rand_base(divisor)
266
- transformed << "#{a}*#{divisor}"
267
- transformed << "+#{b}"
268
- transformed << ")"
269
- end
270
- when Float
271
- transformed = "(#{num - num.floor} + #{rand_base(num.floor)})"
272
- end
273
-
274
- #puts("#{num} == #{transformed}")
275
-
276
- transformed
277
- end
278
-
279
- #
280
- # Convert a javascript string into something that will generate that string.
281
- #
282
- # Randomly calls one of the +transform_string_*+ methods
283
- #
284
- def transform_string(str)
285
- quote = str[0,1]
286
- # pull off the quotes
287
- str = str[1,str.length - 2]
288
- return quote*2 if str.length == 0
289
-
290
- case rand(2)
291
- when 0
292
- transformed = transform_string_split_concat(str, quote)
293
- when 1
294
- transformed = transform_string_fromCharCode(str)
295
- #when 2
296
- # # Currently no-op
297
- # transformed = transform_string_unescape(str)
298
- end
299
-
300
- #$stderr.puts "Obfuscating str: #{str.ljust 30} #{transformed}"
301
- transformed
302
- end
303
-
304
- #
305
- # Split a javascript string, +str+, without breaking escape sequences.
306
- #
307
- # The maximum length of each piece of the string is half the total length
308
- # of the string, ensuring we (almost) always split into at least two
309
- # pieces. This won't always be true when given a string like "AA\x41",
310
- # where escape sequences artificially increase the total length (escape
311
- # sequences are considered a single character).
312
- #
313
- # Returns an array of two-element arrays. The zeroeth element is a
314
- # randomly generated variable name, the first is a piece of the string
315
- # contained in +quote+s.
316
- #
317
- # See #escape_length
318
- #
319
- def safe_split(str, quote)
320
- parts = []
321
- max_len = str.length / 2
322
- while str.length > 0
323
- len = 0
324
- loop do
325
- e_len = escape_length(str[len..-1])
326
- e_len = 1 if e_len.nil?
327
- len += e_len
328
- # if we've reached the end of the string, bail
329
- break unless str[len]
330
- break if len > max_len
331
- # randomize the length of each part
332
- break if (rand(4) == 0)
333
- end
334
-
335
- part = str.slice!(0, len)
336
-
337
- var = Rex::Text.rand_text_alpha(4)
338
- parts.push( [ var, "#{quote}#{part}#{quote}" ] )
339
- end
340
-
341
- parts
342
- end
343
-
344
- #
345
- # Stolen from obfuscatejs.rb
346
- #
347
- # Determines the length of an escape sequence
348
- #
349
- def escape_length(str)
350
- esc_len = nil
351
- if str[0,1] == "\\"
352
- case str[1,1]
353
- when "u"; esc_len = 6 # unicode \u1234
354
- when "x"; esc_len = 4 # hex, \x41
355
- when /[0-7]/ # octal, \123, \0
356
- str[1,3] =~ /([0-7]{1,3})/
357
- if $1.to_i(8) > 255
358
- str[1,3] =~ /([0-7]{1,2})/
359
- end
360
- esc_len = 1 + $1.length
361
- else; esc_len = 2 # \" \n, etc.
362
- end
363
- end
364
- esc_len
365
- end
366
-
367
- #
368
- # Split a javascript string, +str+, into multiple randomly-ordered parts
369
- # and return an anonymous javascript function that joins them in the
370
- # correct order. This method can be called safely on strings containing
371
- # escape sequences. See #safe_split.
372
- #
373
- def transform_string_split_concat(str, quote)
374
- parts = safe_split(str, quote)
375
- func = "(function () { var "
376
- ret = "; return "
377
- parts.sort { |a,b| rand }.each do |part|
378
- func << "#{part[0]}=#{part[1]},"
379
- end
380
- func.chop!
381
-
382
- ret << parts.map{|part| part[0]}.join("+")
383
- final = func + ret + " })()"
384
-
385
- final
386
- end
387
-
388
-
389
- # TODO
390
- #def transform_string_unescape(str)
391
- # str
392
- #end
393
-
394
- #
395
- # Return a call to String.fromCharCode() with each char of the input as arguments
396
- #
397
- # Example:
398
- # input : "A\n"
399
- # output: String.fromCharCode(0x41, 10)
400
- #
401
- def transform_string_fromCharCode(str)
402
- buf = "String.fromCharCode("
403
- bytes = str.unpack("C*")
404
- len = 0
405
- while str.length > 0
406
- if str[0,1] == "\\"
407
- str.slice!(0,1)
408
- # then this is an escape sequence and we need to deal with all
409
- # the special cases
410
- case str[0,1]
411
- # For chars that contain their non-escaped selves, step past
412
- # the backslash and let the rand_base() below decide how to
413
- # represent the character.
414
- when '"', "'", "\\", " "
415
- char = str.slice!(0,1).unpack("C").first
416
- # For symbolic escapes, use the known value
417
- when "n"; char = 0x0a; str.slice!(0,1)
418
- when "t"; char = 0x09; str.slice!(0,1)
419
- # Lastly, if it's a hex, unicode, or octal escape, pull out the
420
- # real value and use that
421
- when "x"
422
- # Strip the x
423
- str.slice!(0,1)
424
- char = str.slice!(0,2).to_i 16
425
- when "u"
426
- # This can potentially lose information in the case of
427
- # characters like \u0041, but since regular ascii is stored
428
- # as unicode internally, String.fromCharCode(0x41) will be
429
- # represented as 00 41 in memory anyway, so it shouldn't
430
- # matter.
431
- str.slice!(0,1)
432
- char = str.slice!(0,4).to_i 16
433
- when /[0-7]/
434
- # Octals are a bit harder since they are variable width and
435
- # don't necessarily mean what you might think. For example,
436
- # "\61" == "1" and "\610" == "10". 610 is a valid octal
437
- # number, but not a valid ascii character. Javascript will
438
- # interpreter as much as it can as a char and use the rest
439
- # as a literal. Boo.
440
- str =~ /([0-7]{1,3})/
441
- char = $1.to_i 8
442
- if char > 255
443
- str =~ /([0-7]{1,2})/
444
- char = $1.to_i 8
445
- end
446
- str.slice!(0,$1.length)
447
- end
448
- else
449
- char = str.slice!(0,1).unpack("C").first
450
- end
451
- buf << "#{rand_base(char)},"
452
- end
453
- # Strip off the last comma
454
- buf = buf[0,buf.length-1] + ")"
455
- transformed = buf
456
-
457
- transformed
458
- end
137
+ # @return [String] a random string
138
+ def random_string
139
+ @rand_gen.generate
140
+ end
141
+
142
+ #
143
+ # Recursive method to obfuscate the given +ast+.
144
+ #
145
+ # +ast+ should be the result of RKelly::Parser#parse
146
+ #
147
+ def obfuscate_r(ast)
148
+ ast.each do |node|
149
+ #if node.respond_to? :value and node.value.kind_of? String and node.value =~ /bodyOnLoad/i
150
+ # $stdout.puts("bodyOnLoad: #{node.class}: #{node.value}")
151
+ #end
152
+
153
+ case node
154
+ when nil
155
+ nil
156
+
157
+ when ::RKelly::Nodes::SourceElementsNode
158
+ # Recurse
159
+ obfuscate_r(node.value)
160
+
161
+ #when ::RKelly::Nodes::ObjectLiteralNode
162
+ # TODO
163
+ #$stdout.puts(node.methods - Object.new.methods)
164
+ #$stdout.puts(node.value.inspect)
165
+
166
+ when ::RKelly::Nodes::PropertyNode
167
+ # Property names must be bare words or string literals NOT
168
+ # expressions! Can't use transform_string() here
169
+ if node.name =~ /^[a-zA-Z_][a-zA-Z0-9_]*$/
170
+ n = '"'
171
+ node.name.unpack("C*") { |c|
172
+ case rand(3)
173
+ when 0; n << "\\x%02x"%(c)
174
+ when 1; n << "\\#{c.to_s 8}"
175
+ when 2; n << [c].pack("C")
176
+ end
177
+ }
178
+ n << '"'
179
+ node.instance_variable_set(:@name, n)
180
+ end
181
+
182
+ # Variables
183
+ when ::RKelly::Nodes::VarDeclNode
184
+ if @vars[node.name].nil?
185
+ @vars[node.name] = random_var_name
186
+ end
187
+ node.name = @vars[node.name]
188
+ when ::RKelly::Nodes::ParameterNode
189
+ if @vars[node.value].nil?
190
+ @vars[node.value] = random_var_name
191
+ end
192
+ node.value = @vars[node.value]
193
+ when ::RKelly::Nodes::ResolveNode
194
+ #$stdout.puts("Resolve bodyOnload: #{@vars[node.value]}") if "bodyOnLoad" == node.value
195
+ node.value = @vars[node.value] if @vars[node.value]
196
+ when ::RKelly::Nodes::DotAccessorNode
197
+ case node.value
198
+ when ::RKelly::Nodes::ResolveNode
199
+ if @vars[node.value.value]
200
+ node.value.value = @vars[node.value.value]
201
+ end
202
+ #else
203
+ # $stderr.puts("Non-resolve node as target of dotaccessor: #{node.value.class}")
204
+ end
205
+
206
+ # Functions
207
+ when ::RKelly::Nodes::FunctionDeclNode
208
+ #$stdout.puts("FunctionDecl: #{node.value}")
209
+ # Functions can also act as objects, so store them in the vars
210
+ # and the functions list so we can replace them in both places
211
+ if @funcs[node.value].nil? and not @funcs.values.include?(node.value)
212
+ @funcs[node.value] = random_var_name
213
+ if @vars[node.value].nil?
214
+ @vars[node.value] = @funcs[node.value]
215
+ end
216
+ node.value = @funcs[node.value]
217
+ end
218
+ when ::RKelly::Nodes::FunctionCallNode
219
+ # The value of a FunctionCallNode is some sort of accessor node or a ResolveNode
220
+ # so this is basically useless
221
+ #$stdout.puts("Function call: #{node.name} => #{@funcs[node.name]}")
222
+ #node.value = @funcs[node.value] if @funcs[node.value]
223
+
224
+ # Transformers
225
+ when ::RKelly::Nodes::NumberNode
226
+ node.value = transform_number(node.value)
227
+ when ::RKelly::Nodes::StringNode
228
+ node.value = transform_string(node.value)
229
+ else
230
+ #$stderr.puts "#{node.class}: #{node.value}"
231
+ #$stderr.puts "#{node.class}"
232
+ end
233
+
234
+ #unless node.kind_of? ::RKelly::Nodes::SourceElementsNode
235
+ # $stderr.puts "#{node.class}: #{node.value}"
236
+ #end
237
+ end
238
+
239
+ nil
240
+ end
241
+
242
+ #
243
+ # Generate an Abstract Syntax Tree (#ast) for later obfuscation
244
+ #
245
+ def parse
246
+ parser = RKelly::Parser.new
247
+ @ast = parser.parse(@code)
248
+ end
249
+
250
+ #
251
+ # Convert a number to a random base (decimal, octal, or hexedecimal).
252
+ #
253
+ # Given 10 as input, the possible return values are:
254
+ # "10"
255
+ # "0xa"
256
+ # "012"
257
+ #
258
+ def rand_base(num)
259
+ case rand(3)
260
+ when 0; num.to_s
261
+ when 1; "0%o" % num
262
+ when 2; "0x%x" % num
263
+ end
264
+ end
265
+
266
+ #
267
+ # Return a mathematical expression that will evaluate to the given number
268
+ # +num+.
269
+ #
270
+ # +num+ can be a float or an int, but should never be negative.
271
+ #
272
+ def transform_number(num)
273
+ case num
274
+ when Fixnum
275
+ if num == 0
276
+ r = rand(10) + 1
277
+ transformed = "('#{Rex::Text.rand_text_alpha(r)}'.length - #{r})"
278
+ elsif num > 0 and num < 10
279
+ # use a random string.length for small numbers
280
+ transformed = "'#{Rex::Text.rand_text_alpha(num)}'.length"
281
+ else
282
+ transformed = "("
283
+ divisor = rand(num) + 1
284
+ a = num / divisor.to_i
285
+ b = num - (a * divisor)
286
+ # recurse half the time for a
287
+ a = (rand(2) == 0) ? transform_number(a) : rand_base(a)
288
+ # recurse half the time for divisor
289
+ divisor = (rand(2) == 0) ? transform_number(divisor) : rand_base(divisor)
290
+ transformed << "#{a}*#{divisor}"
291
+ transformed << "+#{b}"
292
+ transformed << ")"
293
+ end
294
+ when Float
295
+ transformed = "(#{num - num.floor} + #{rand_base(num.floor)})"
296
+ end
297
+
298
+ #puts("#{num} == #{transformed}")
299
+
300
+ transformed
301
+ end
302
+
303
+ #
304
+ # Convert a javascript string into something that will generate that string.
305
+ #
306
+ # Randomly calls one of the +transform_string_*+ methods
307
+ #
308
+ def transform_string(str)
309
+ quote = str[0,1]
310
+ # pull off the quotes
311
+ str = str[1,str.length - 2]
312
+ return quote*2 if str.length == 0
313
+
314
+ case rand(2)
315
+ when 0
316
+ transformed = transform_string_split_concat(str, quote)
317
+ when 1
318
+ transformed = transform_string_fromCharCode(str)
319
+ #when 2
320
+ # # Currently no-op
321
+ # transformed = transform_string_unescape(str)
322
+ end
323
+
324
+ #$stderr.puts "Obfuscating str: #{str.ljust 30} #{transformed}"
325
+ transformed
326
+ end
327
+
328
+ #
329
+ # Split a javascript string, +str+, without breaking escape sequences.
330
+ #
331
+ # The maximum length of each piece of the string is half the total length
332
+ # of the string, ensuring we (almost) always split into at least two
333
+ # pieces. This won't always be true when given a string like "AA\x41",
334
+ # where escape sequences artificially increase the total length (escape
335
+ # sequences are considered a single character).
336
+ #
337
+ # Returns an array of two-element arrays. The zeroeth element is a
338
+ # randomly generated variable name, the first is a piece of the string
339
+ # contained in +quote+s.
340
+ #
341
+ # See #escape_length
342
+ #
343
+ def safe_split(str, quote)
344
+ parts = []
345
+ max_len = str.length / 2
346
+ while str.length > 0
347
+ len = 0
348
+ loop do
349
+ e_len = escape_length(str[len..-1])
350
+ e_len = 1 if e_len.nil?
351
+ len += e_len
352
+ # if we've reached the end of the string, bail
353
+ break unless str[len]
354
+ break if len > max_len
355
+ # randomize the length of each part
356
+ break if (rand(4) == 0)
357
+ end
358
+
359
+ part = str.slice!(0, len)
360
+
361
+ var = Rex::Text.rand_text_alpha(4)
362
+ parts.push( [ var, "#{quote}#{part}#{quote}" ] )
363
+ end
364
+
365
+ parts
366
+ end
367
+
368
+ #
369
+ # Stolen from obfuscatejs.rb
370
+ #
371
+ # Determines the length of an escape sequence
372
+ #
373
+ def escape_length(str)
374
+ esc_len = nil
375
+ if str[0,1] == "\\"
376
+ case str[1,1]
377
+ when "u"; esc_len = 6 # unicode \u1234
378
+ when "x"; esc_len = 4 # hex, \x41
379
+ when /[0-7]/ # octal, \123, \0
380
+ str[1,3] =~ /([0-7]{1,3})/
381
+ if $1.to_i(8) > 255
382
+ str[1,3] =~ /([0-7]{1,2})/
383
+ end
384
+ esc_len = 1 + $1.length
385
+ else; esc_len = 2 # \" \n, etc.
386
+ end
387
+ end
388
+ esc_len
389
+ end
390
+
391
+ #
392
+ # Split a javascript string, +str+, into multiple randomly-ordered parts
393
+ # and return an anonymous javascript function that joins them in the
394
+ # correct order. This method can be called safely on strings containing
395
+ # escape sequences. See #safe_split.
396
+ #
397
+ def transform_string_split_concat(str, quote)
398
+ parts = safe_split(str, quote)
399
+ func = "(function () { var "
400
+ ret = "; return "
401
+ parts.sort { |a,b| rand }.each do |part|
402
+ func << "#{part[0]}=#{part[1]},"
403
+ end
404
+ func.chop!
405
+
406
+ ret << parts.map{|part| part[0]}.join("+")
407
+ final = func + ret + " })()"
408
+
409
+ final
410
+ end
411
+
412
+
413
+ # TODO
414
+ #def transform_string_unescape(str)
415
+ # str
416
+ #end
417
+
418
+ #
419
+ # Return a call to String.fromCharCode() with each char of the input as arguments
420
+ #
421
+ # Example:
422
+ # input : "A\n"
423
+ # output: String.fromCharCode(0x41, 10)
424
+ #
425
+ def transform_string_fromCharCode(str)
426
+ buf = "String.fromCharCode("
427
+ bytes = str.unpack("C*")
428
+ len = 0
429
+ while str.length > 0
430
+ if str[0,1] == "\\"
431
+ str.slice!(0,1)
432
+ # then this is an escape sequence and we need to deal with all
433
+ # the special cases
434
+ case str[0,1]
435
+ # For chars that contain their non-escaped selves, step past
436
+ # the backslash and let the rand_base() below decide how to
437
+ # represent the character.
438
+ when '"', "'", "\\", " "
439
+ char = str.slice!(0,1).unpack("C").first
440
+ # For symbolic escapes, use the known value
441
+ when "n"; char = 0x0a; str.slice!(0,1)
442
+ when "t"; char = 0x09; str.slice!(0,1)
443
+ # Lastly, if it's a hex, unicode, or octal escape, pull out the
444
+ # real value and use that
445
+ when "x"
446
+ # Strip the x
447
+ str.slice!(0,1)
448
+ char = str.slice!(0,2).to_i 16
449
+ when "u"
450
+ # This can potentially lose information in the case of
451
+ # characters like \u0041, but since regular ascii is stored
452
+ # as unicode internally, String.fromCharCode(0x41) will be
453
+ # represented as 00 41 in memory anyway, so it shouldn't
454
+ # matter.
455
+ str.slice!(0,1)
456
+ char = str.slice!(0,4).to_i 16
457
+ when /[0-7]/
458
+ # Octals are a bit harder since they are variable width and
459
+ # don't necessarily mean what you might think. For example,
460
+ # "\61" == "1" and "\610" == "10". 610 is a valid octal
461
+ # number, but not a valid ascii character. Javascript will
462
+ # interpreter as much as it can as a char and use the rest
463
+ # as a literal. Boo.
464
+ str =~ /([0-7]{1,3})/
465
+ char = $1.to_i 8
466
+ if char > 255
467
+ str =~ /([0-7]{1,2})/
468
+ char = $1.to_i 8
469
+ end
470
+ str.slice!(0,$1.length)
471
+ end
472
+ else
473
+ char = str.slice!(0,1).unpack("C").first
474
+ end
475
+ buf << "#{rand_base(char)},"
476
+ end
477
+ # Strip off the last comma
478
+ buf = buf[0,buf.length-1] + ")"
479
+ transformed = buf
480
+
481
+ transformed
482
+ end
459
483
 
460
484
 
461
485
  end
@@ -465,24 +489,24 @@ end
465
489
 
466
490
  =begin
467
491
  if __FILE__ == $0
468
- if ARGV[0]
469
- code = File.read(ARGV[0])
470
- else
471
- #require 'rex/exploitation/javascriptosdetect'
472
- #code = Rex::Exploitation::JavascriptOSDetect.new.to_s
473
- code = <<-EOS
474
- // Should alert "0123456789"
475
- var a = "0\\612\\063\\x34\\x35\\x36\\x37\\x38\\u0039";
476
- var a,b=2,c=3;
477
- alert(a);
478
- // should alert "asdfjkl;"
479
- var d = (function() { var foo = "jkl;", blah = "asdf"; return blah + foo; })();
480
- alert(d);
481
- EOS
482
- end
483
- js = Rex::Exploitation::JSObfu.new(code)
484
- js.obfuscate
485
- puts js.to_s
492
+ if ARGV[0]
493
+ code = File.read(ARGV[0])
494
+ else
495
+ #require 'rex/exploitation/javascriptosdetect'
496
+ #code = Rex::Exploitation::JavascriptOSDetect.new.to_s
497
+ code = <<-EOS
498
+ // Should alert "0123456789"
499
+ var a = "0\\612\\063\\x34\\x35\\x36\\x37\\x38\\u0039";
500
+ var a,b=2,c=3;
501
+ alert(a);
502
+ // should alert "asdfjkl;"
503
+ var d = (function() { var foo = "jkl;", blah = "asdf"; return blah + foo; })();
504
+ alert(d);
505
+ EOS
506
+ end
507
+ js = Rex::Exploitation::JSObfu.new(code)
508
+ js.obfuscate
509
+ puts js.to_s
486
510
 
487
511
  end
488
512