dstruct 0.0.1

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 (491) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +23 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -0
  5. data/lib/rex/LICENSE +29 -0
  6. data/lib/rex/arch.rb +104 -0
  7. data/lib/rex/arch/sparc.rb +75 -0
  8. data/lib/rex/arch/x86.rb +524 -0
  9. data/lib/rex/assembly/nasm.rb +104 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +389 -0
  12. data/lib/rex/constants.rb +124 -0
  13. data/lib/rex/elfparsey.rb +9 -0
  14. data/lib/rex/elfparsey/elf.rb +121 -0
  15. data/lib/rex/elfparsey/elfbase.rb +256 -0
  16. data/lib/rex/elfparsey/exceptions.rb +25 -0
  17. data/lib/rex/elfscan.rb +10 -0
  18. data/lib/rex/elfscan/scanner.rb +226 -0
  19. data/lib/rex/elfscan/search.rb +44 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +90 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
  26. data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
  27. data/lib/rex/encoder/ndr.rb +90 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +107 -0
  31. data/lib/rex/encoder/xor.rb +69 -0
  32. data/lib/rex/encoder/xor/dword.rb +13 -0
  33. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  34. data/lib/rex/encoders/xor_dword.rb +35 -0
  35. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  36. data/lib/rex/encoding/xor.rb +20 -0
  37. data/lib/rex/encoding/xor/byte.rb +15 -0
  38. data/lib/rex/encoding/xor/dword.rb +21 -0
  39. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  40. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  41. data/lib/rex/encoding/xor/generic.rb +146 -0
  42. data/lib/rex/encoding/xor/qword.rb +15 -0
  43. data/lib/rex/encoding/xor/word.rb +21 -0
  44. data/lib/rex/exceptions.rb +275 -0
  45. data/lib/rex/exploitation/cmdstager.rb +10 -0
  46. data/lib/rex/exploitation/cmdstager/base.rb +190 -0
  47. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  48. data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
  49. data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
  50. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  51. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  52. data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
  53. data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
  54. data/lib/rex/exploitation/egghunter.rb +425 -0
  55. data/lib/rex/exploitation/encryptjs.rb +78 -0
  56. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  57. data/lib/rex/exploitation/heaplib.rb +107 -0
  58. data/lib/rex/exploitation/js.rb +6 -0
  59. data/lib/rex/exploitation/js/detect.rb +69 -0
  60. data/lib/rex/exploitation/js/memory.rb +81 -0
  61. data/lib/rex/exploitation/js/network.rb +84 -0
  62. data/lib/rex/exploitation/js/utils.rb +33 -0
  63. data/lib/rex/exploitation/jsobfu.rb +513 -0
  64. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  65. data/lib/rex/exploitation/omelet.rb +321 -0
  66. data/lib/rex/exploitation/opcodedb.rb +819 -0
  67. data/lib/rex/exploitation/powershell.rb +62 -0
  68. data/lib/rex/exploitation/powershell/function.rb +63 -0
  69. data/lib/rex/exploitation/powershell/obfu.rb +98 -0
  70. data/lib/rex/exploitation/powershell/output.rb +151 -0
  71. data/lib/rex/exploitation/powershell/param.rb +23 -0
  72. data/lib/rex/exploitation/powershell/parser.rb +183 -0
  73. data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
  74. data/lib/rex/exploitation/powershell/script.rb +99 -0
  75. data/lib/rex/exploitation/ropdb.rb +190 -0
  76. data/lib/rex/exploitation/seh.rb +93 -0
  77. data/lib/rex/file.rb +160 -0
  78. data/lib/rex/image_source.rb +10 -0
  79. data/lib/rex/image_source/disk.rb +58 -0
  80. data/lib/rex/image_source/image_source.rb +44 -0
  81. data/lib/rex/image_source/memory.rb +35 -0
  82. data/lib/rex/io/bidirectional_pipe.rb +161 -0
  83. data/lib/rex/io/datagram_abstraction.rb +35 -0
  84. data/lib/rex/io/ring_buffer.rb +369 -0
  85. data/lib/rex/io/stream.rb +312 -0
  86. data/lib/rex/io/stream_abstraction.rb +209 -0
  87. data/lib/rex/io/stream_server.rb +221 -0
  88. data/lib/rex/job_container.rb +200 -0
  89. data/lib/rex/logging.rb +4 -0
  90. data/lib/rex/logging/log_dispatcher.rb +180 -0
  91. data/lib/rex/logging/log_sink.rb +43 -0
  92. data/lib/rex/logging/sinks/flatfile.rb +56 -0
  93. data/lib/rex/logging/sinks/stderr.rb +44 -0
  94. data/lib/rex/mac_oui.rb +16581 -0
  95. data/lib/rex/machparsey.rb +9 -0
  96. data/lib/rex/machparsey/exceptions.rb +34 -0
  97. data/lib/rex/machparsey/mach.rb +209 -0
  98. data/lib/rex/machparsey/machbase.rb +408 -0
  99. data/lib/rex/machscan.rb +9 -0
  100. data/lib/rex/machscan/scanner.rb +217 -0
  101. data/lib/rex/mime.rb +10 -0
  102. data/lib/rex/mime/encoding.rb +17 -0
  103. data/lib/rex/mime/header.rb +78 -0
  104. data/lib/rex/mime/message.rb +150 -0
  105. data/lib/rex/mime/part.rb +50 -0
  106. data/lib/rex/nop/opty2.rb +109 -0
  107. data/lib/rex/nop/opty2_tables.rb +301 -0
  108. data/lib/rex/ole.rb +202 -0
  109. data/lib/rex/ole/clsid.rb +44 -0
  110. data/lib/rex/ole/difat.rb +138 -0
  111. data/lib/rex/ole/directory.rb +228 -0
  112. data/lib/rex/ole/direntry.rb +237 -0
  113. data/lib/rex/ole/docs/dependencies.txt +8 -0
  114. data/lib/rex/ole/docs/references.txt +1 -0
  115. data/lib/rex/ole/fat.rb +96 -0
  116. data/lib/rex/ole/header.rb +201 -0
  117. data/lib/rex/ole/minifat.rb +74 -0
  118. data/lib/rex/ole/propset.rb +141 -0
  119. data/lib/rex/ole/samples/create_ole.rb +27 -0
  120. data/lib/rex/ole/samples/dir.rb +35 -0
  121. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  122. data/lib/rex/ole/samples/ole_info.rb +23 -0
  123. data/lib/rex/ole/storage.rb +392 -0
  124. data/lib/rex/ole/stream.rb +50 -0
  125. data/lib/rex/ole/substorage.rb +46 -0
  126. data/lib/rex/ole/util.rb +154 -0
  127. data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
  128. data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
  129. data/lib/rex/parser/appscan_nokogiri.rb +367 -0
  130. data/lib/rex/parser/arguments.rb +108 -0
  131. data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
  132. data/lib/rex/parser/ci_nokogiri.rb +193 -0
  133. data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
  134. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  135. data/lib/rex/parser/group_policy_preferences.rb +185 -0
  136. data/lib/rex/parser/ini.rb +186 -0
  137. data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
  138. data/lib/rex/parser/ip360_xml.rb +98 -0
  139. data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
  140. data/lib/rex/parser/nessus_xml.rb +121 -0
  141. data/lib/rex/parser/netsparker_xml.rb +109 -0
  142. data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
  143. data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
  144. data/lib/rex/parser/nexpose_xml.rb +172 -0
  145. data/lib/rex/parser/nmap_nokogiri.rb +394 -0
  146. data/lib/rex/parser/nmap_xml.rb +166 -0
  147. data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
  148. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  149. data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
  150. data/lib/rex/parser/retina_xml.rb +110 -0
  151. data/lib/rex/parser/unattend.rb +171 -0
  152. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  153. data/lib/rex/payloads.rb +2 -0
  154. data/lib/rex/payloads/win32.rb +3 -0
  155. data/lib/rex/payloads/win32/common.rb +27 -0
  156. data/lib/rex/payloads/win32/kernel.rb +54 -0
  157. data/lib/rex/payloads/win32/kernel/common.rb +55 -0
  158. data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
  159. data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
  160. data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
  161. data/lib/rex/peparsey.rb +10 -0
  162. data/lib/rex/peparsey/exceptions.rb +30 -0
  163. data/lib/rex/peparsey/pe.rb +210 -0
  164. data/lib/rex/peparsey/pe_memdump.rb +61 -0
  165. data/lib/rex/peparsey/pebase.rb +1662 -0
  166. data/lib/rex/peparsey/section.rb +128 -0
  167. data/lib/rex/pescan.rb +11 -0
  168. data/lib/rex/pescan/analyze.rb +366 -0
  169. data/lib/rex/pescan/scanner.rb +230 -0
  170. data/lib/rex/pescan/search.rb +68 -0
  171. data/lib/rex/platforms.rb +2 -0
  172. data/lib/rex/platforms/windows.rb +52 -0
  173. data/lib/rex/poly.rb +134 -0
  174. data/lib/rex/poly/block.rb +480 -0
  175. data/lib/rex/poly/machine.rb +13 -0
  176. data/lib/rex/poly/machine/machine.rb +830 -0
  177. data/lib/rex/poly/machine/x86.rb +509 -0
  178. data/lib/rex/poly/register.rb +101 -0
  179. data/lib/rex/poly/register/x86.rb +41 -0
  180. data/lib/rex/post.rb +7 -0
  181. data/lib/rex/post/dir.rb +51 -0
  182. data/lib/rex/post/file.rb +172 -0
  183. data/lib/rex/post/file_stat.rb +220 -0
  184. data/lib/rex/post/gen.pl +13 -0
  185. data/lib/rex/post/io.rb +182 -0
  186. data/lib/rex/post/meterpreter.rb +5 -0
  187. data/lib/rex/post/meterpreter/channel.rb +446 -0
  188. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  189. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  190. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  191. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  192. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  193. data/lib/rex/post/meterpreter/client.rb +483 -0
  194. data/lib/rex/post/meterpreter/client_core.rb +352 -0
  195. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  196. data/lib/rex/post/meterpreter/extension.rb +32 -0
  197. data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
  198. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
  199. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  200. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
  201. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  202. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  203. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  204. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  205. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  206. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  207. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  208. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  209. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
  210. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  211. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  212. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  213. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
  214. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  215. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
  216. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  217. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  218. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  219. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
  220. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  221. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  222. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
  223. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
  224. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
  225. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
  240. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
  252. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  253. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  255. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
  264. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
  265. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  266. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
  267. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
  268. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
  269. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
  270. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  271. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  272. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
  273. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
  274. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  275. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  276. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  277. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  278. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
  279. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  280. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  281. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
  282. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  283. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
  284. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
  285. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
  286. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  287. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  288. data/lib/rex/post/meterpreter/packet.rb +709 -0
  289. data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
  290. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  291. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  292. data/lib/rex/post/meterpreter/ui/console.rb +142 -0
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
  294. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
  295. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
  296. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
  297. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  298. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  299. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  300. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  301. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  302. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  303. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
  304. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  305. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  306. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  307. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  308. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  309. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
  310. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
  311. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
  312. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
  313. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
  314. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
  315. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
  316. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
  317. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
  318. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
  319. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
  320. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
  321. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
  322. data/lib/rex/post/permission.rb +26 -0
  323. data/lib/rex/post/process.rb +57 -0
  324. data/lib/rex/post/thread.rb +57 -0
  325. data/lib/rex/post/ui.rb +52 -0
  326. data/lib/rex/proto.rb +15 -0
  327. data/lib/rex/proto/addp.rb +218 -0
  328. data/lib/rex/proto/dcerpc.rb +7 -0
  329. data/lib/rex/proto/dcerpc/client.rb +362 -0
  330. data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
  331. data/lib/rex/proto/dcerpc/handle.rb +48 -0
  332. data/lib/rex/proto/dcerpc/ndr.rb +73 -0
  333. data/lib/rex/proto/dcerpc/packet.rb +264 -0
  334. data/lib/rex/proto/dcerpc/response.rb +188 -0
  335. data/lib/rex/proto/dcerpc/uuid.rb +85 -0
  336. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  337. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  338. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  339. data/lib/rex/proto/dhcp.rb +7 -0
  340. data/lib/rex/proto/dhcp/constants.rb +34 -0
  341. data/lib/rex/proto/dhcp/server.rb +334 -0
  342. data/lib/rex/proto/drda.rb +6 -0
  343. data/lib/rex/proto/drda/constants.rb +50 -0
  344. data/lib/rex/proto/drda/packet.rb +253 -0
  345. data/lib/rex/proto/drda/utils.rb +124 -0
  346. data/lib/rex/proto/http.rb +7 -0
  347. data/lib/rex/proto/http/client.rb +722 -0
  348. data/lib/rex/proto/http/client_request.rb +472 -0
  349. data/lib/rex/proto/http/handler.rb +47 -0
  350. data/lib/rex/proto/http/handler/erb.rb +129 -0
  351. data/lib/rex/proto/http/handler/proc.rb +61 -0
  352. data/lib/rex/proto/http/header.rb +173 -0
  353. data/lib/rex/proto/http/packet.rb +414 -0
  354. data/lib/rex/proto/http/request.rb +354 -0
  355. data/lib/rex/proto/http/response.rb +151 -0
  356. data/lib/rex/proto/http/server.rb +385 -0
  357. data/lib/rex/proto/iax2.rb +2 -0
  358. data/lib/rex/proto/iax2/call.rb +326 -0
  359. data/lib/rex/proto/iax2/client.rb +218 -0
  360. data/lib/rex/proto/iax2/codecs.rb +5 -0
  361. data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
  362. data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
  363. data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
  364. data/lib/rex/proto/iax2/constants.rb +262 -0
  365. data/lib/rex/proto/ipmi.rb +57 -0
  366. data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
  367. data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
  368. data/lib/rex/proto/ipmi/rakp2.rb +36 -0
  369. data/lib/rex/proto/ipmi/utils.rb +125 -0
  370. data/lib/rex/proto/natpmp.rb +7 -0
  371. data/lib/rex/proto/natpmp/constants.rb +19 -0
  372. data/lib/rex/proto/natpmp/packet.rb +45 -0
  373. data/lib/rex/proto/ntlm.rb +8 -0
  374. data/lib/rex/proto/ntlm/base.rb +327 -0
  375. data/lib/rex/proto/ntlm/constants.rb +75 -0
  376. data/lib/rex/proto/ntlm/crypt.rb +412 -0
  377. data/lib/rex/proto/ntlm/exceptions.rb +17 -0
  378. data/lib/rex/proto/ntlm/message.rb +534 -0
  379. data/lib/rex/proto/ntlm/utils.rb +765 -0
  380. data/lib/rex/proto/ntp.rb +3 -0
  381. data/lib/rex/proto/ntp/constants.rb +12 -0
  382. data/lib/rex/proto/ntp/modes.rb +130 -0
  383. data/lib/rex/proto/pjl.rb +31 -0
  384. data/lib/rex/proto/pjl/client.rb +163 -0
  385. data/lib/rex/proto/proxy/socks4a.rb +441 -0
  386. data/lib/rex/proto/rfb.rb +13 -0
  387. data/lib/rex/proto/rfb/cipher.rb +82 -0
  388. data/lib/rex/proto/rfb/client.rb +205 -0
  389. data/lib/rex/proto/rfb/constants.rb +50 -0
  390. data/lib/rex/proto/sip.rb +4 -0
  391. data/lib/rex/proto/sip/response.rb +61 -0
  392. data/lib/rex/proto/smb.rb +8 -0
  393. data/lib/rex/proto/smb/client.rb +2064 -0
  394. data/lib/rex/proto/smb/constants.rb +1064 -0
  395. data/lib/rex/proto/smb/crypt.rb +37 -0
  396. data/lib/rex/proto/smb/evasions.rb +67 -0
  397. data/lib/rex/proto/smb/exceptions.rb +867 -0
  398. data/lib/rex/proto/smb/simpleclient.rb +173 -0
  399. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  400. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  401. data/lib/rex/proto/smb/utils.rb +104 -0
  402. data/lib/rex/proto/sunrpc.rb +2 -0
  403. data/lib/rex/proto/sunrpc/client.rb +196 -0
  404. data/lib/rex/proto/tftp.rb +13 -0
  405. data/lib/rex/proto/tftp/client.rb +344 -0
  406. data/lib/rex/proto/tftp/constants.rb +39 -0
  407. data/lib/rex/proto/tftp/server.rb +497 -0
  408. data/lib/rex/random_identifier_generator.rb +177 -0
  409. data/lib/rex/registry.rb +14 -0
  410. data/lib/rex/registry/hive.rb +132 -0
  411. data/lib/rex/registry/lfkey.rb +51 -0
  412. data/lib/rex/registry/nodekey.rb +54 -0
  413. data/lib/rex/registry/regf.rb +25 -0
  414. data/lib/rex/registry/valuekey.rb +67 -0
  415. data/lib/rex/registry/valuelist.rb +29 -0
  416. data/lib/rex/ropbuilder.rb +8 -0
  417. data/lib/rex/ropbuilder/rop.rb +271 -0
  418. data/lib/rex/script.rb +42 -0
  419. data/lib/rex/script/base.rb +61 -0
  420. data/lib/rex/script/meterpreter.rb +16 -0
  421. data/lib/rex/script/shell.rb +10 -0
  422. data/lib/rex/service.rb +49 -0
  423. data/lib/rex/service_manager.rb +154 -0
  424. data/lib/rex/services/local_relay.rb +424 -0
  425. data/lib/rex/socket.rb +788 -0
  426. data/lib/rex/socket/comm.rb +120 -0
  427. data/lib/rex/socket/comm/local.rb +526 -0
  428. data/lib/rex/socket/ip.rb +132 -0
  429. data/lib/rex/socket/parameters.rb +363 -0
  430. data/lib/rex/socket/range_walker.rb +470 -0
  431. data/lib/rex/socket/ssl_tcp.rb +345 -0
  432. data/lib/rex/socket/ssl_tcp_server.rb +188 -0
  433. data/lib/rex/socket/subnet_walker.rb +76 -0
  434. data/lib/rex/socket/switch_board.rb +289 -0
  435. data/lib/rex/socket/tcp.rb +79 -0
  436. data/lib/rex/socket/tcp_server.rb +67 -0
  437. data/lib/rex/socket/udp.rb +165 -0
  438. data/lib/rex/sslscan/result.rb +201 -0
  439. data/lib/rex/sslscan/scanner.rb +206 -0
  440. data/lib/rex/struct2.rb +5 -0
  441. data/lib/rex/struct2/c_struct.rb +181 -0
  442. data/lib/rex/struct2/c_struct_template.rb +39 -0
  443. data/lib/rex/struct2/constant.rb +26 -0
  444. data/lib/rex/struct2/element.rb +44 -0
  445. data/lib/rex/struct2/generic.rb +73 -0
  446. data/lib/rex/struct2/restraint.rb +54 -0
  447. data/lib/rex/struct2/s_string.rb +72 -0
  448. data/lib/rex/struct2/s_struct.rb +111 -0
  449. data/lib/rex/sync.rb +6 -0
  450. data/lib/rex/sync/event.rb +85 -0
  451. data/lib/rex/sync/read_write_lock.rb +177 -0
  452. data/lib/rex/sync/ref.rb +58 -0
  453. data/lib/rex/sync/thread_safe.rb +83 -0
  454. data/lib/rex/text.rb +1813 -0
  455. data/lib/rex/thread_factory.rb +43 -0
  456. data/lib/rex/time.rb +66 -0
  457. data/lib/rex/transformer.rb +116 -0
  458. data/lib/rex/ui.rb +22 -0
  459. data/lib/rex/ui/interactive.rb +304 -0
  460. data/lib/rex/ui/output.rb +85 -0
  461. data/lib/rex/ui/output/none.rb +19 -0
  462. data/lib/rex/ui/progress_tracker.rb +97 -0
  463. data/lib/rex/ui/subscriber.rb +160 -0
  464. data/lib/rex/ui/text/color.rb +98 -0
  465. data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
  466. data/lib/rex/ui/text/input.rb +119 -0
  467. data/lib/rex/ui/text/input/buffer.rb +79 -0
  468. data/lib/rex/ui/text/input/readline.rb +129 -0
  469. data/lib/rex/ui/text/input/socket.rb +96 -0
  470. data/lib/rex/ui/text/input/stdio.rb +46 -0
  471. data/lib/rex/ui/text/irb_shell.rb +62 -0
  472. data/lib/rex/ui/text/output.rb +86 -0
  473. data/lib/rex/ui/text/output/buffer.rb +62 -0
  474. data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
  475. data/lib/rex/ui/text/output/file.rb +44 -0
  476. data/lib/rex/ui/text/output/socket.rb +44 -0
  477. data/lib/rex/ui/text/output/stdio.rb +53 -0
  478. data/lib/rex/ui/text/output/tee.rb +56 -0
  479. data/lib/rex/ui/text/progress_tracker.rb +57 -0
  480. data/lib/rex/ui/text/shell.rb +403 -0
  481. data/lib/rex/ui/text/table.rb +346 -0
  482. data/lib/rex/zip.rb +96 -0
  483. data/lib/rex/zip/archive.rb +130 -0
  484. data/lib/rex/zip/blocks.rb +184 -0
  485. data/lib/rex/zip/entry.rb +122 -0
  486. data/lib/rex/zip/jar.rb +283 -0
  487. data/lib/rex/zip/samples/comment.rb +32 -0
  488. data/lib/rex/zip/samples/mkwar.rb +138 -0
  489. data/lib/rex/zip/samples/mkzip.rb +19 -0
  490. data/lib/rex/zip/samples/recursive.rb +58 -0
  491. metadata +536 -0
@@ -0,0 +1,81 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'msf/core'
4
+
5
+ module Rex
6
+ module Exploitation
7
+ module Js
8
+
9
+ #
10
+ # Provides meomry manipulative functions in JavaScript
11
+ #
12
+ class Memory
13
+
14
+ def self.mstime_malloc
15
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "mstime_malloc.js"))
16
+ js = js.gsub(/W00TA/, Rex::Text.rand_text_hex(6))
17
+ js = js.gsub(/W00TB/, Rex::Text.rand_text_hex(5))
18
+
19
+ ::Rex::Exploitation::ObfuscateJS.new(js,
20
+ {
21
+ 'Symbols' => {
22
+ 'Variables' => %w{ buf eleId acTag }
23
+ }
24
+ }).obfuscate
25
+ end
26
+
27
+ def self.heaplib2(custom_js='', opts={})
28
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "heaplib2.js"))
29
+
30
+ unless custom_js.blank?
31
+ js << custom_js
32
+ end
33
+
34
+ js = ::Rex::Exploitation::JSObfu.new js
35
+ js.obfuscate
36
+ return js
37
+ end
38
+
39
+ def self.property_spray
40
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "property_spray.js"))
41
+
42
+ ::Rex::Exploitation::ObfuscateJS.new(js,
43
+ {
44
+ 'Symbols' => {
45
+ 'Variables' => %w{ sym_div_container data junk obj }
46
+ }
47
+ }).obfuscate
48
+ end
49
+
50
+ def self.heap_spray
51
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "heap_spray.js"))
52
+
53
+ ::Rex::Exploitation::ObfuscateJS.new(js,
54
+ {
55
+ 'Symbols' => {
56
+ 'Variables' => %w{ index heapSprayAddr_hi heapSprayAddr_lo retSlide heapBlockCnt }
57
+ }
58
+ }).obfuscate
59
+ end
60
+
61
+ def self.explib2
62
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "explib2", "lib", "explib2.js"))
63
+
64
+ ::Rex::Exploitation::ObfuscateJS.obfuscate(js)
65
+ end
66
+
67
+ def self.explib2_payload(payload="exec")
68
+ case payload
69
+ when "drop_exec"
70
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "explib2", "payload", "drop_exec.js"))
71
+ else # "exec"
72
+ js = ::File.read(::File.join(Msf::Config.data_directory, "js", "memory", "explib2", "payload", "exec.js"))
73
+ end
74
+
75
+ ::Rex::Exploitation::ObfuscateJS.obfuscate(js)
76
+ end
77
+
78
+ end
79
+ end
80
+ end
81
+ end
@@ -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
@@ -0,0 +1,513 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rex/text'
4
+ require 'rex/random_identifier_generator'
5
+ require 'rkelly'
6
+
7
+ module Rex
8
+ module Exploitation
9
+
10
+
11
+ #
12
+ # Obfuscate JavaScript by randomizing as much as possible and removing
13
+ # easily-signaturable string constants.
14
+ #
15
+ # Example:
16
+ # js = ::Rex::Exploitation::JSObfu.new %Q|
17
+ # var a = "0\\612\\063\\x34\\x35\\x36\\x37\\x38\\u0039";
18
+ # var b = { foo : "foo", bar : "bar" }
19
+ # alert(a);
20
+ # alert(b.foo);
21
+ # |
22
+ # js.obfuscate
23
+ # puts js
24
+ # Example Output:
25
+ # var VwxvESbCgv = String.fromCharCode(0x30,0x31,062,063,064,53,0x36,067,070,0x39);
26
+ # var ToWZPn = {
27
+ # "\146\157\x6f": (function () { var yDyv="o",YnCL="o",Qcsa="f"; return Qcsa+YnCL+yDyv })(),
28
+ # "\142ar": String.fromCharCode(0142,97,0162)
29
+ # };
30
+ # alert(VwxvESbCgv);
31
+ # alert(ToWZPn.foo);
32
+ #
33
+ # NOTE: Variables MUST be declared with a 'var' statement BEFORE first use (or
34
+ # not at all) for this to generate correct code! If variables are not declared
35
+ # they will not be randomized but the generated code will be correct.
36
+ #
37
+ # Bad Example Javascript:
38
+ # a = "asdf"; // this variable hasn't been declared and will not be randomized
39
+ # var a;
40
+ # alert(a); // real js engines will alert "asdf" here
41
+ # Bad Example Obfuscated:
42
+ # a = (function () { var hpHu="f",oyTm="asd"; return oyTm+hpHu })();
43
+ # var zSrnHpEfJZtg;
44
+ # alert(zSrnHpEfJZtg);
45
+ # Notice that the first usage of +a+ (before it was declared) is not
46
+ # randomized. Thus, the obfuscated version will alert 'undefined' instead of
47
+ # "asdf".
48
+ #
49
+ class JSObfu
50
+
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
134
+
135
+ protected
136
+
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
483
+
484
+
485
+ end
486
+ end
487
+ end
488
+
489
+
490
+ =begin
491
+ if __FILE__ == $0
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
510
+
511
+ end
512
+
513
+ =end