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,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YWZjMDZlNDJjMzQ5YTMyODZkMTAzMWUzNzE1YWQ3ZjA2OTkxMDc3ZQ==
5
+ data.tar.gz: !binary |-
6
+ OWFhNGFiZDQ1MDBjYmJkZTU2NDljMzM5YjJkM2U1M2ZkZTk5NTljYQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ MmE3ZjFmYTk3YjE2YmI3NzFlNThhNmI3YzJiMTVhYWFlMTY0ZDVhMzdjZGMw
10
+ NzJkOTA4OGNjMWU4M2ZmYzUwMTI2ZDBhYTcyNmVjNzI4ZWQ3NzBlMDVlZjk3
11
+ ZmY5N2YyZWQwZTJhYjM2ZGFlOTMyYmNiMmRhMDliM2NlOGNkZGQ=
12
+ data.tar.gz: !binary |-
13
+ YmE4MGI3MTA2NDE3NGIyNGE3NzRmOWZlMWRhNzU4NzYyN2ZiMTliN2RmMzBi
14
+ Y2ZiMjk1MjQ1M2RkMmIyNDk4NWUxZmIwOTZiOTFmMGE4YThlZmFmODcwMGFm
15
+ ODMwNjNjYmNlNGM0YTUzY2Y1MTk5MGIzZTA4OWFjMTQ1Y2VjODg=
@@ -0,0 +1,23 @@
1
+ # Rex
2
+
3
+ An re-packaging of the Rex library included in the Metasploit Framework for use by non-Metasploit applications. Originally created by Jacob Hammack and made official by the Rapid7 development team. The upstream of this package is the rex subdirectory of https://github.com/rapid7/metasploit-framework
4
+
5
+ Note that prior to version 2.0.0, the 'rex' gem was an unrelated library developed by Aaron Paterson (@tenderlove).
6
+
7
+ For users of the prior library (a lexical scanner generator), set your Gemfile to something like the following:
8
+ ```
9
+ gem 'rex', '< 2.0.0'
10
+ ```
11
+
12
+ This package replaces the librex gem.
13
+
14
+ ```
15
+ $ gem install rex
16
+ ```
17
+
18
+ # Credits
19
+
20
+ * [The Metasploit Community](https://github.com/rapid7/metasploit-framework)
21
+ * [Jacob Hammack](https://github.com/hammackj) for initially extracting rex from Metasploit
22
+ * [Aaron Paterson](https://github.com/tenderlove) for letting us repurpose the 'rex' gem name
23
+ * [Rapid7](http://www.rapid7.com/) for continued support
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #Jacob Hammack
4
+ #Jacob.Hammack@hammackj.com
5
+ #An Example for connecting to a Windows Share.
6
+
7
+ require 'rubygems'
8
+ require 'rex'
9
+
10
+ host = ARGV[0]
11
+ username = ARGV[1]
12
+ password = ARGV[2]
13
+ #hostname is interesting, new windows require the actual hostname of the box
14
+ #to connect so this may not work on 7
15
+ hostname = "*SMBSERVER"
16
+ domain = ""
17
+
18
+ begin
19
+ sock = Rex::Socket::Tcp.create('PeerHost' => host, 'PeerPort' => 139)
20
+ smb = Rex::Proto::SMB::SimpleClient.new(sock)
21
+
22
+ puts "[*] Logging in to #{host}"
23
+ smb.login(hostname, username, password, domain)
24
+ smb.connect("Admin$")
25
+
26
+ if smb.client.auth_user
27
+ puts "[*] Connected to Admin$"
28
+ else
29
+ puts "[!] Unable to Connect to Admin$"
30
+ end
31
+
32
+ sock.close
33
+ rescue Exception => e
34
+ puts "#{e.message}\n#{e.backtrace}\n\n"
35
+ end
@@ -0,0 +1,108 @@
1
+ =begin
2
+
3
+ The Metasploit Rex library is provided under the 3-clause BSD license.
4
+
5
+ Copyright (c) 2005-2010, Rapid7, Inc.
6
+ All rights reserved.
7
+
8
+ Redistribution and use in source and binary forms, with or without modification,
9
+ are permitted provided that the following conditions are met:
10
+
11
+ * Redistributions of source code must retain the above copyright notice, this
12
+ list of conditions and the following disclaimer.
13
+
14
+ * Redistributions in binary form must reproduce the above copyright notice,
15
+ this list of conditions and the following disclaimer in the documentation
16
+ and/or other materials provided with the distribution.
17
+
18
+ * Neither the name of Rapid7, Inc. nor the names of its contributors may be
19
+ used to endorse or promote products derived from this software without
20
+ specific prior written permission.
21
+
22
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
23
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
26
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
29
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+
33
+ =end
34
+
35
+ module Rex
36
+ Root = File.join(File.expand_path(File.dirname(__FILE__)), 'rex')
37
+ LogSource = "rex"
38
+ end
39
+
40
+ # Generic classes
41
+ require 'rex/constants'
42
+ require 'rex/exceptions'
43
+ require 'rex/transformer'
44
+ require 'rex/text'
45
+ require 'rex/time'
46
+ require 'rex/job_container'
47
+ require 'rex/file'
48
+
49
+ # Thread safety and synchronization
50
+ require 'rex/sync'
51
+
52
+ # Thread factory
53
+ require 'rex/thread_factory'
54
+
55
+ # Encoding
56
+ require 'rex/encoder/xor'
57
+ require 'rex/encoding/xor'
58
+
59
+ # Architecture subsystem
60
+ require 'rex/arch'
61
+
62
+ # Assembly
63
+ require 'rex/assembly/nasm'
64
+
65
+ # Logging
66
+ require 'rex/logging/log_dispatcher'
67
+
68
+ # IO
69
+ require 'rex/io/stream'
70
+ require 'rex/io/stream_abstraction'
71
+ require 'rex/io/stream_server'
72
+
73
+ # Sockets
74
+ require 'rex/socket'
75
+
76
+ # Protocols
77
+ require 'rex/proto'
78
+ require 'rex/mac_oui'
79
+
80
+ # Parsers
81
+ require 'rex/parser/arguments'
82
+ require 'rex/parser/ini'
83
+
84
+
85
+ # Compatibility
86
+ require 'rex/compat'
87
+
88
+ # Platforms
89
+ require 'rex/platforms'
90
+
91
+ # SSLScan
92
+ require 'rex/sslscan/scanner'
93
+ require 'rex/sslscan/result'
94
+
95
+
96
+ # Overload the Kernel.sleep() function to be thread-safe
97
+ Kernel.class_eval("
98
+ def sleep(seconds=nil)
99
+ Rex::ThreadSafe.sleep(seconds)
100
+ end
101
+ ")
102
+
103
+ # Overload the Kernel.select function to be thread-safe
104
+ Kernel.class_eval("
105
+ def select(rfd = nil, wfd = nil, efd = nil, to = nil)
106
+ Rex::ThreadSafe.select(rfd, wfd, efd, to)
107
+ end
108
+ ")
@@ -0,0 +1,29 @@
1
+ The Metasploit Rex library is provided under the 3-clause BSD license.
2
+
3
+ Copyright (c) 2005-2006, Rapid7, Inc.
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without modification,
7
+ are permitted provided that the following conditions are met:
8
+
9
+ * Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ * Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ * Neither the name of Rapid7, Inc. nor the names of its contributors may be
17
+ used to endorse or promote products derived from this software without
18
+ specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
24
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
27
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,104 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/constants'
3
+
4
+ module Rex
5
+
6
+
7
+ ###
8
+ #
9
+ # This module provides generalized methods for performing operations that are
10
+ # architecture specific. Furthermore, the modules contained within this
11
+ # module provide features that are specific to a given architecture.
12
+ #
13
+ ###
14
+ module Arch
15
+
16
+ #
17
+ # Architecture classes
18
+ #
19
+ require 'rex/arch/x86'
20
+ require 'rex/arch/sparc'
21
+
22
+ #
23
+ # This routine adjusts the stack pointer for a given architecture.
24
+ #
25
+ def self.adjust_stack_pointer(arch, adjustment)
26
+
27
+ if ( arch.is_a?(::Array))
28
+ arch = arch[0]
29
+ end
30
+
31
+ case arch
32
+ when /x86/
33
+ Rex::Arch::X86.adjust_reg(Rex::Arch::X86::ESP, adjustment)
34
+ else
35
+ nil
36
+ end
37
+ end
38
+
39
+ #
40
+ # This route provides address packing for the specified arch
41
+ #
42
+ def self.pack_addr(arch, addr)
43
+
44
+ if ( arch.is_a?(::Array))
45
+ arch = arch[0]
46
+ end
47
+
48
+ case arch
49
+ when ARCH_X86
50
+ [addr].pack('V')
51
+ when ARCH_X86_64
52
+ [addr].pack('Q<')
53
+ when ARCH_MIPS # ambiguous
54
+ [addr].pack('N')
55
+ when ARCH_MIPSBE
56
+ [addr].pack('N')
57
+ when ARCH_MIPSLE
58
+ [addr].pack('V')
59
+ when ARCH_PPC # ambiguous
60
+ [addr].pack('N')
61
+ when ARCH_SPARC
62
+ [addr].pack('N')
63
+ when ARCH_ARMLE
64
+ [addr].pack('V')
65
+ when ARCH_ARMBE
66
+ [addr].pack('N')
67
+ end
68
+ end
69
+
70
+ #
71
+ # This routine reports the endianess of a given architecture
72
+ #
73
+ def self.endian(arch)
74
+
75
+ if ( arch.is_a?(::Array))
76
+ arch = arch[0]
77
+ end
78
+
79
+ case arch
80
+ when ARCH_X86
81
+ return ENDIAN_LITTLE
82
+ when ARCH_X86_64
83
+ return ENDIAN_LITTLE
84
+ when ARCH_MIPS # ambiguous
85
+ return ENDIAN_BIG
86
+ when ARCH_MIPSLE
87
+ return ENDIAN_LITTLE
88
+ when ARCH_MIPSBE
89
+ return ENDIAN_BIG
90
+ when ARCH_PPC # ambiguous
91
+ return ENDIAN_BIG
92
+ when ARCH_SPARC
93
+ return ENDIAN_BIG
94
+ when ARCH_ARMLE
95
+ return ENDIAN_LITTLE
96
+ when ARCH_ARMBE
97
+ return ENDIAN_BIG
98
+ end
99
+
100
+ return ENDIAN_LITTLE
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,75 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Arch
5
+
6
+ #
7
+ # Everything here is mostly stolen from vlad's perl sparc stuff
8
+ #
9
+ module Sparc
10
+
11
+ #
12
+ # Register number constants
13
+ #
14
+ RegisterNumber =
15
+ {
16
+ 'g0' => 0, 'g1' => 1, 'g2' => 2, 'g3' => 3,
17
+ 'g4' => 4, 'g5' => 5, 'g6' => 6, 'g7' => 7,
18
+ 'o0' => 8, 'o1' => 9, 'o2' => 10, 'o3' => 11,
19
+ 'o4' => 12, 'o5' => 13, 'o6' => 14, 'o7' => 15,
20
+ 'l0' => 16, 'l1' => 17, 'l2' => 18, 'l3' => 19,
21
+ 'l4' => 20, 'l5' => 21, 'l6' => 22, 'l7' => 23,
22
+ 'i0' => 24, 'i1' => 25, 'i2' => 26, 'i3' => 27,
23
+ 'i4' => 28, 'i5' => 29, 'i6' => 30, 'i7' => 31,
24
+ 'sp' => 14, 'fp' => 30,
25
+ } # :nodoc:
26
+
27
+ #
28
+ # Encodes a SETHI instruction with the value 'constant' being put into 'dst' register
29
+ #
30
+ def self.sethi(constant, dst)
31
+ [
32
+ (RegisterNumber[dst] << 25) |
33
+ (4 << 22) |
34
+ (constant >> 10)
35
+ ].pack('N')
36
+ end
37
+
38
+ #
39
+ # Encodes an OR instruction with the value 'constant' being OR'ed with the 'src' register into the 'dst' register
40
+ #
41
+ def self.ori(src, constant, dst)
42
+ [
43
+ (2 << 30) |
44
+ (RegisterNumber[dst] << 25) |
45
+ (2 << 19) |
46
+ (RegisterNumber[src] << 14) |
47
+ (1 << 13) |
48
+ (constant & 0x1fff)
49
+ ].pack('N')
50
+ end
51
+
52
+ #
53
+ # Puts 'constant' into the 'dst' register using as few instructions as possible by checking the size of the value.
54
+ # XXX: signedness support
55
+ #
56
+ def self.set(constant, dst)
57
+ if (constant <= 4095 and constant >= 0)
58
+ ori('g0', constant, dst)
59
+ elsif (constant & 0x3ff != 0)
60
+ set_dword(constant, dst)
61
+ else
62
+ sethi(constant, dst)
63
+ end
64
+ end
65
+
66
+ #
67
+ # Puts 'constant' into the 'dst' register using both sethi and ori (necessary to use both uncessarily in some cases with encoders)
68
+ #
69
+ def self.set_dword(constant, dst)
70
+ sethi(constant, dst) + ori(dst, constant & 0x3ff, dst)
71
+ end
72
+
73
+ end
74
+
75
+ end end
@@ -0,0 +1,524 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Arch
5
+
6
+ #
7
+ # everything here is mostly stole from vlad's perl x86 stuff
8
+ #
9
+
10
+ module X86
11
+
12
+ #
13
+ # Register number constants
14
+ #
15
+ EAX = AL = AX = ES = 0
16
+ ECX = CL = CX = CS = 1
17
+ EDX = DL = DX = SS = 2
18
+ EBX = BL = BX = DS = 3
19
+ ESP = AH = SP = FS = 4
20
+ EBP = CH = BP = GS = 5
21
+ ESI = DH = SI = 6
22
+ EDI = BH = DI = 7
23
+
24
+ REG_NAMES32 = [ 'eax', 'ecx', 'edx', 'ebx', 'esp', 'ebp', 'esi', 'edi' ]
25
+
26
+ REG_NAMES16 = [ 'ax', 'cx', 'dx', 'bx', 'sp', 'bp', 'si', 'di' ]
27
+
28
+ REG_NAMES8L = [ 'al', 'cl', 'dl', 'bl', nil, nil, nil, nil ]
29
+
30
+ # Jump tp a specific register
31
+ def self.jmp_reg(str)
32
+ reg = reg_number(str)
33
+ _check_reg(reg)
34
+ "\xFF" + [224 + reg].pack('C')
35
+ end
36
+
37
+ #
38
+ # Generate a LOOP instruction (Decrement ECX and jump short if ECX == 0)
39
+ #
40
+ def self.loop(offset)
41
+ "\xE2" + pack_lsb(rel_number(offset, -2))
42
+ end
43
+
44
+ #
45
+ # This method returns the opcodes that compose a jump instruction to the
46
+ # supplied relative offset.
47
+ def self.jmp(addr)
48
+ "\xe9" + pack_dword(rel_number(addr))
49
+ end
50
+
51
+ #
52
+ # This method adds/subs a packed long integer
53
+ #
54
+ def self.dword_adjust(dword, amount=0)
55
+ pack_dword(dword.unpack('V')[0] + amount)
56
+ end
57
+
58
+ #
59
+ # This method returns the opcodes that compose a tag-based search routine
60
+ #
61
+ def self.searcher(tag)
62
+ "\xbe" + dword_adjust(tag,-1)+ # mov esi, Tag - 1
63
+ "\x46" + # inc esi
64
+ "\x47" + # inc edi (end_search:)
65
+ "\x39\x37" + # cmp [edi],esi
66
+ "\x75\xfb" + # jnz 0xa (end_search)
67
+ "\x46" + # inc esi
68
+ "\x4f" + # dec edi (start_search:)
69
+ "\x39\x77\xfc" + # cmp [edi-0x4],esi
70
+ "\x75\xfa" + # jnz 0x10 (start_search)
71
+ jmp_reg('edi') # jmp edi
72
+ end
73
+
74
+ #
75
+ # Generates a buffer that will copy memory immediately following the stub
76
+ # that is generated to be copied to the stack
77
+ #
78
+ def self.copy_to_stack(len)
79
+ # four byte align
80
+ len = (len + 3) & ~0x3
81
+
82
+ stub =
83
+ "\xeb\x0f"+ # jmp _end
84
+ push_dword(len)+ # push n
85
+ "\x59"+ # pop ecx
86
+ "\x5e"+ # pop esi
87
+ "\x29\xcc"+ # sub esp, ecx
88
+ "\x89\xe7"+ # mov edi, esp
89
+ "\xf3\xa4"+ # rep movsb
90
+ "\xff\xe4"+ # jmp esp
91
+ "\xe8\xec\xff\xff\xff" # call _start
92
+
93
+ stub
94
+ end
95
+
96
+ #
97
+ # This method returns the opcodes that compose a short jump instruction to
98
+ # the supplied relative offset.
99
+ #
100
+ def self.jmp_short(addr)
101
+ "\xeb" + pack_lsb(rel_number(addr, -2))
102
+ end
103
+
104
+ #
105
+ # This method returns the opcodes that compose a relative call instruction
106
+ # to the address specified.
107
+ #
108
+ def self.call(addr)
109
+ "\xe8" + pack_dword(rel_number(addr, -5))
110
+ end
111
+
112
+ #
113
+ # This method returns a number offset to the supplied string.
114
+ #
115
+ def self.rel_number(num, delta = 0)
116
+ s = num.to_s
117
+
118
+ case s[0, 2]
119
+ when '$+'
120
+ num = s[2 .. -1].to_i
121
+ when '$-'
122
+ num = -1 * s[2 .. -1].to_i
123
+ when '0x'
124
+ num = s.hex
125
+ else
126
+ delta = 0
127
+ end
128
+
129
+ return num + delta
130
+ end
131
+
132
+ #
133
+ # This method returns the number associated with a named register.
134
+ #
135
+ def self.reg_number(str)
136
+ return self.const_get(str.upcase)
137
+ end
138
+
139
+ #
140
+ # This method returns the register named associated with a given register
141
+ # number.
142
+ #
143
+ def self.reg_name32(num)
144
+ _check_reg(num)
145
+ return REG_NAMES32[num].dup
146
+ end
147
+
148
+ #
149
+ # This method generates the encoded effective value for a register.
150
+ #
151
+ def self.encode_effective(shift, dst)
152
+ return (0xc0 | (shift << 3) | dst)
153
+ end
154
+
155
+ #
156
+ # This method generates the mod r/m character for a source and destination
157
+ # register.
158
+ #
159
+ def self.encode_modrm(dst, src)
160
+ _check_reg(dst, src)
161
+ return (0xc0 | src | dst << 3).chr
162
+ end
163
+
164
+ #
165
+ # This method generates a push byte instruction.
166
+ #
167
+ def self.push_byte(byte)
168
+ # push byte will sign extend...
169
+ if byte < 128 && byte >= -128
170
+ return "\x6a" + (byte & 0xff).chr
171
+ end
172
+ raise ::ArgumentError, "Can only take signed byte values!", caller()
173
+ end
174
+
175
+ #
176
+ # This method generates a push word instruction.
177
+ #
178
+ def self.push_word(val)
179
+ return "\x66\x68" + pack_word(val)
180
+ end
181
+
182
+ #
183
+ # This method generates a push dword instruction.
184
+ #
185
+ def self.push_dword(val)
186
+ return "\x68" + pack_dword(val)
187
+ end
188
+
189
+ #
190
+ # This method generates a pop dword instruction into a register.
191
+ #
192
+ def self.pop_dword(dst)
193
+ _check_reg(dst)
194
+ return (0x58 | dst).chr
195
+ end
196
+
197
+ #
198
+ # This method generates an instruction that clears the supplied register in
199
+ # a manner that attempts to avoid bad characters, if supplied.
200
+ #
201
+ def self.clear(reg, badchars = '')
202
+ _check_reg(reg)
203
+ return set(reg, 0, badchars)
204
+ end
205
+
206
+ #
207
+ # This method generates the opcodes that set the low byte of a given
208
+ # register to the supplied value.
209
+ #
210
+ def self.mov_byte(reg, val)
211
+ _check_reg(reg)
212
+ # chr will raise RangeError if val not between 0 .. 255
213
+ return (0xb0 | reg).chr + val.chr
214
+ end
215
+
216
+ #
217
+ # This method generates the opcodes that set the low word of a given
218
+ # register to the supplied value.
219
+ #
220
+ def self.mov_word(reg, val)
221
+ _check_reg(reg)
222
+ if val < 0 || val > 0xffff
223
+ raise RangeError, "Can only take unsigned word values!", caller()
224
+ end
225
+ return "\x66" + (0xb8 | reg).chr + pack_word(val)
226
+ end
227
+
228
+ #
229
+ # This method generates the opcodes that set the a register to the
230
+ # supplied value.
231
+ #
232
+ def self.mov_dword(reg, val)
233
+ _check_reg(reg)
234
+ return (0xb8 | reg).chr + pack_dword(val)
235
+ end
236
+
237
+ #
238
+ # This method is a general way of setting a register to a value. Depending
239
+ # on the value supplied, different sets of instructions may be used.
240
+ #
241
+ # TODO: Make this moderatly intelligent so it chain instructions by itself
242
+ # (ie. xor eax, eax + mov al, 4 + xchg ah, al)
243
+ def self.set(dst, val, badchars = '')
244
+ _check_reg(dst)
245
+
246
+ # If the value is 0 try xor/sub dst, dst (2 bytes)
247
+ if(val == 0)
248
+ opcodes = Rex::Text.remove_badchars("\x29\x2b\x31\x33", badchars)
249
+ if !opcodes.empty?
250
+ return opcodes[rand(opcodes.length)].chr + encode_modrm(dst, dst)
251
+ end
252
+ # TODO: SHL/SHR
253
+ # TODO: AND
254
+ end
255
+
256
+ # try push BYTE val; pop dst (3 bytes)
257
+ begin
258
+ return _check_badchars(push_byte(val) + pop_dword(dst), badchars)
259
+ rescue ::ArgumentError, ::RuntimeError, ::RangeError
260
+ end
261
+
262
+ # try clear dst, mov BYTE dst (4 bytes)
263
+ begin
264
+ # break if val == 0
265
+ return _check_badchars(clear(dst, badchars) + mov_byte(dst, val), badchars)
266
+ rescue ::ArgumentError, ::RuntimeError, ::RangeError
267
+ end
268
+
269
+ # try mov DWORD dst (5 bytes)
270
+ begin
271
+ return _check_badchars(mov_dword(dst, val), badchars)
272
+ rescue ::ArgumentError, ::RuntimeError, ::RangeError
273
+ end
274
+
275
+ # try push DWORD, pop dst (6 bytes)
276
+ begin
277
+ return _check_badchars(push_dword(val) + pop_dword(dst), badchars)
278
+ rescue ::ArgumentError, ::RuntimeError, ::RangeError
279
+ end
280
+
281
+ # try clear dst, mov WORD dst (6 bytes)
282
+ begin
283
+ # break if val == 0
284
+ return _check_badchars(clear(dst, badchars) + mov_word(dst, val), badchars)
285
+ rescue ::ArgumentError, ::RuntimeError, ::RangeError
286
+ end
287
+
288
+ raise RuntimeError, "No valid set instruction could be created!", caller()
289
+ end
290
+
291
+ #
292
+ # Builds a subtraction instruction using the supplied operand
293
+ # and register.
294
+ #
295
+ def self.sub(val, reg, badchars = '', add = false, adjust = false, bits = 0)
296
+ opcodes = []
297
+ shift = (add == true) ? 0 : 5
298
+
299
+ if (bits <= 8 and val >= -0x7f and val <= 0x7f)
300
+ opcodes <<
301
+ ((adjust) ? '' : clear(reg, badchars)) +
302
+ "\x83" +
303
+ [ encode_effective(shift, reg) ].pack('C') +
304
+ [ val.to_i ].pack('C')
305
+ end
306
+
307
+ if (bits <= 16 and val >= -0xffff and val <= 0)
308
+ opcodes <<
309
+ ((adjust) ? '' : clear(reg, badchars)) +
310
+ "\x66\x81" +
311
+ [ encode_effective(shift, reg) ].pack('C') +
312
+ [ val.to_i ].pack('v')
313
+ end
314
+
315
+ opcodes <<
316
+ ((adjust) ? '' : clear(reg, badchars)) +
317
+ "\x81" +
318
+ [ encode_effective(shift, reg) ].pack('C') +
319
+ [ val.to_i ].pack('V')
320
+
321
+ # Search for a compatible opcode
322
+ opcodes.each { |op|
323
+ begin
324
+ _check_badchars(op, badchars)
325
+ rescue
326
+ next
327
+ end
328
+
329
+ return op
330
+ }
331
+
332
+ if opcodes.empty?
333
+ raise RuntimeError, "Could not find a usable opcode", caller()
334
+ end
335
+ end
336
+
337
+ #
338
+ # This method generates the opcodes equivalent to subtracting with a
339
+ # negative value from a given register.
340
+ #
341
+ def self.add(val, reg, badchars = '', adjust = false, bits = 0)
342
+ sub(val, reg, badchars, true, adjust, bits)
343
+ end
344
+
345
+ #
346
+ # This method wrappers packing a short integer as a little-endian buffer.
347
+ #
348
+ def self.pack_word(num)
349
+ [num].pack('v')
350
+ end
351
+
352
+ #
353
+ # This method wrappers packing an integer as a little-endian buffer.
354
+ #
355
+ def self.pack_dword(num)
356
+ [num].pack('V')
357
+ end
358
+
359
+ #
360
+ # This method returns the least significant byte of a packed dword.
361
+ #
362
+ def self.pack_lsb(num)
363
+ pack_dword(num)[0,1]
364
+ end
365
+
366
+ #
367
+ # This method adjusts the value of the ESP register by a given amount.
368
+ #
369
+ def self.adjust_reg(reg, adjustment)
370
+ if (adjustment > 0)
371
+ sub(adjustment, reg, '', false, false, 32)
372
+ else
373
+ add(adjustment, reg, '', true, 32)
374
+ end
375
+ end
376
+
377
+ def self._check_reg(*regs) # :nodoc:
378
+ regs.each { |reg|
379
+ if reg > 7 || reg < 0
380
+ raise ArgumentError, "Invalid register #{reg}", caller()
381
+ end
382
+ }
383
+ return nil
384
+ end
385
+
386
+ def self._check_badchars(data, badchars) # :nodoc:
387
+ idx = Rex::Text.badchar_index(data, badchars)
388
+ if idx
389
+ raise RuntimeError, "Bad character at #{idx}", caller()
390
+ end
391
+ return data
392
+ end
393
+
394
+ #
395
+ # This method returns an array of 'safe' FPU instructions
396
+ #
397
+ def self.fpu_instructions
398
+ fpus = []
399
+
400
+ 0xe8.upto(0xee) { |x| fpus << "\xd9" + x.chr }
401
+ 0xc0.upto(0xcf) { |x| fpus << "\xd9" + x.chr }
402
+ 0xc0.upto(0xdf) { |x| fpus << "\xda" + x.chr }
403
+ 0xc0.upto(0xdf) { |x| fpus << "\xdb" + x.chr }
404
+ 0xc0.upto(0xc7) { |x| fpus << "\xdd" + x.chr }
405
+
406
+ fpus << "\xd9\xd0"
407
+ fpus << "\xd9\xe1"
408
+ fpus << "\xd9\xf6"
409
+ fpus << "\xd9\xf7"
410
+ fpus << "\xd9\xe5"
411
+
412
+ # This FPU instruction seems to fail consistently on Linux
413
+ #fpus << "\xdb\xe1"
414
+
415
+ fpus
416
+ end
417
+
418
+ #
419
+ # This method returns an array containing a geteip stub, a register, and an offset
420
+ # This method will return nil if the getip generation fails
421
+ #
422
+ def self.geteip_fpu(badchars)
423
+
424
+ #
425
+ # Default badchars to an empty string
426
+ #
427
+ badchars ||= ''
428
+
429
+ #
430
+ # Bail out early if D9 is restricted
431
+ #
432
+ return nil if badchars.index("\xd9")
433
+
434
+ #
435
+ # Create a list of FPU instructions
436
+ #
437
+ fpus = *self.fpu_instructions
438
+ bads = []
439
+ badchars.each_byte do |c|
440
+ fpus.each do |str|
441
+ bads << str if (str.index(c.chr))
442
+ end
443
+ end
444
+ bads.each { |str| fpus.delete(str) }
445
+ return nil if fpus.length == 0
446
+
447
+ #
448
+ # Create a list of registers to use for fnstenv
449
+ #
450
+ dsts = []
451
+ 0.upto(7) do |c|
452
+ dsts << c if (not badchars.index( (0x70+c).chr ))
453
+ end
454
+
455
+ if (dsts.include?(ESP) and badchars.index("\x24"))
456
+ dsts.delete(ESP)
457
+ end
458
+
459
+ return nil if dsts.length == 0
460
+
461
+ #
462
+ # Grab a random FPU instruction
463
+ #
464
+ fpu = fpus[ rand(fpus.length) ]
465
+
466
+ #
467
+ # Grab a random register from dst
468
+ #
469
+ while(dsts.length > 0)
470
+ buf = ''
471
+ dst = dsts[ rand(dsts.length) ]
472
+ dsts.delete(dst)
473
+
474
+ # If the register is not ESP, copy ESP
475
+ if (dst != ESP)
476
+ next if badchars.index( (0x70 + dst).chr )
477
+
478
+ if !(badchars.index("\x89") or badchars.index( (0xE0+dst).chr ))
479
+ buf << "\x89" + (0xE0 + dst).chr
480
+ else
481
+ next if badchars.index("\x54")
482
+ next if badchars.index( (0x58+dst).chr )
483
+ buf << "\x54" + (0x58 + dst).chr
484
+ end
485
+ end
486
+
487
+ pad = 0
488
+ while (pad < (128-12) and badchars.index( (256-12-pad).chr))
489
+ pad += 4
490
+ end
491
+
492
+ # Give up on finding a value to use here
493
+ if (pad == (128-12))
494
+ return nil
495
+ end
496
+
497
+ out = buf + fpu + "\xd9" + (0x70 + dst).chr
498
+ out << "\x24" if dst == ESP
499
+ out << (256-12-pad).chr
500
+
501
+ regs = [*(0..7)]
502
+ while (regs.length > 0)
503
+ reg = regs[ rand(regs.length) ]
504
+ regs.delete(reg)
505
+ next if reg == ESP
506
+ next if badchars.index( (0x58 + reg).chr )
507
+
508
+ # Pop the value back out
509
+ 0.upto(pad / 4) { |c| out << (0x58 + reg).chr }
510
+
511
+ # Fix the value to point to self
512
+ gap = out.length - buf.length
513
+
514
+ return [out, REG_NAMES32[reg].upcase, gap]
515
+ end
516
+ end
517
+
518
+ return nil
519
+ end
520
+
521
+ end
522
+
523
+ end end
524
+