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,403 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/ui'
3
+
4
+ module Rex
5
+ module Ui
6
+ module Text
7
+
8
+ ###
9
+ #
10
+ # The shell class provides a command-prompt style interface in a
11
+ # generic fashion.
12
+ #
13
+ ###
14
+ module Shell
15
+
16
+ ###
17
+ #
18
+ # This module is meant to be mixed into an input medium class instance as a
19
+ # means of extending it to display a prompt before each call to gets.
20
+ #
21
+ ###
22
+ module InputShell
23
+ attr_accessor :prompt, :output
24
+
25
+ def pgets()
26
+
27
+ output.print(prompt)
28
+ output.flush
29
+
30
+ output.prompting
31
+ buf = gets
32
+ output.prompting(false)
33
+
34
+ buf
35
+ end
36
+ end
37
+
38
+ #
39
+ # Initializes a shell that has a prompt and can be interacted with.
40
+ #
41
+ def initialize(prompt, prompt_char = '>', histfile = nil, framework = nil)
42
+ # Set the stop flag to false
43
+ self.stop_flag = false
44
+ self.disable_output = false
45
+ self.stop_count = 0
46
+
47
+ # Initialize the prompt
48
+ self.init_prompt = prompt
49
+ self.prompt_char = prompt_char
50
+
51
+ self.histfile = histfile
52
+ self.hist_last_saved = 0
53
+
54
+ self.framework = framework
55
+ end
56
+
57
+ def init_tab_complete
58
+ if (self.input and self.input.supports_readline)
59
+ self.input = Input::Readline.new(lambda { |str| tab_complete(str) })
60
+ if Readline::HISTORY.length == 0 and histfile and File.exists?(histfile)
61
+ File.readlines(histfile).each { |e|
62
+ Readline::HISTORY << e.chomp
63
+ }
64
+ self.hist_last_saved = Readline::HISTORY.length
65
+ end
66
+ self.input.output = self.output
67
+ update_prompt(input.prompt)
68
+ end
69
+ end
70
+
71
+ #
72
+ # Initializes the user interface input/output classes.
73
+ #
74
+ def init_ui(in_input = nil, in_output = nil)
75
+ # Initialize the input and output methods
76
+ self.input = in_input
77
+ self.output = in_output
78
+
79
+ if (self.input)
80
+ # Extend the input medium as an input shell if the input medium
81
+ # isn't intrinsicly a shell.
82
+ if (self.input.intrinsic_shell? == false)
83
+ self.input.extend(InputShell)
84
+ end
85
+
86
+ self.input.output = self.output
87
+ end
88
+ update_prompt('')
89
+ end
90
+
91
+ #
92
+ # Resets the user interface handles.
93
+ #
94
+ def reset_ui
95
+ init_ui
96
+ end
97
+
98
+ #
99
+ # Sets the log source that should be used for logging input and output.
100
+ #
101
+ def set_log_source(log_source)
102
+ self.log_source = log_source
103
+ end
104
+
105
+ #
106
+ # Unsets the log source so that logging becomes disabled.
107
+ #
108
+ def unset_log_source
109
+ set_log_source(nil)
110
+ end
111
+
112
+ #
113
+ # Performs tab completion on the supplied string.
114
+ #
115
+ def tab_complete(str)
116
+ return tab_complete_proc(str) if (tab_complete_proc)
117
+ end
118
+
119
+ #
120
+ # Run the command processing loop.
121
+ #
122
+ def run(&block)
123
+
124
+ begin
125
+
126
+ while true
127
+ # If the stop flag was set or we've hit EOF, break out
128
+ break if (self.stop_flag or self.stop_count > 1)
129
+
130
+ init_tab_complete
131
+
132
+ if framework
133
+ if input.prompt.include?("%T")
134
+ t = Time.now
135
+ if framework.datastore['PromptTimeFormat']
136
+ t = t.strftime(framework.datastore['PromptTimeFormat'])
137
+ end
138
+ input.prompt.gsub!(/%T/, t.to_s)
139
+ end
140
+
141
+ if input.prompt.include?("%H")
142
+ hostname = ENV['HOSTNAME']
143
+ if hostname.nil?
144
+ hostname = `hostname`.split('.')[0]
145
+ end
146
+
147
+ # check if hostname is still nil
148
+ if hostname.nil?
149
+ hostname = ENV['COMPUTERNAME']
150
+ end
151
+
152
+ if hostname.nil?
153
+ hostname = 'unknown'
154
+ end
155
+
156
+ input.prompt.gsub!(/%H/, hostname.chomp)
157
+ end
158
+
159
+ if input.prompt.include?("%U")
160
+ user = ENV['USER']
161
+ if user.nil?
162
+ user = `whoami`
163
+ end
164
+
165
+ # check if username is still nil
166
+ if user.nil?
167
+ user = ENV['USERNAME']
168
+ end
169
+
170
+ if user.nil?
171
+ user = 'unknown'
172
+ end
173
+
174
+ input.prompt.gsub!(/%U/, user.chomp)
175
+ end
176
+
177
+ input.prompt.gsub!(/%S/, framework.sessions.length.to_s)
178
+ input.prompt.gsub!(/%J/, framework.jobs.length.to_s)
179
+ input.prompt.gsub!(/%L/, Rex::Socket.source_address("50.50.50.50"))
180
+ input.prompt.gsub!(/%D/, ::Dir.getwd)
181
+ self.init_prompt = input.prompt
182
+ end
183
+
184
+ line = input.pgets()
185
+ log_output(input.prompt)
186
+
187
+ # If a block was passed in, pass the line to it. If it returns true,
188
+ # break out of the shell loop.
189
+ if (block)
190
+ break if (line == nil or block.call(line))
191
+ elsif(input.eof? or line == nil)
192
+ # If you have sessions active, this will give you a shot to exit gravefully
193
+ # If you really are ambitious, 2 eofs will kick this out
194
+ self.stop_count += 1
195
+ next if(self.stop_count > 1)
196
+ run_single("quit")
197
+ else
198
+ # Otherwise, call what should be an overriden instance method to
199
+ # process the line.
200
+ ret = run_single(line)
201
+ # don't bother saving lines that couldn't be found as a
202
+ # command, create the file if it doesn't exist
203
+ if ret and self.histfile
204
+ File.open(self.histfile, "a+") { |f|
205
+ f.puts(line)
206
+ }
207
+ end
208
+ self.stop_count = 0
209
+ end
210
+
211
+ end
212
+ # Prevent accidental console quits
213
+ rescue ::Interrupt
214
+ output.print("Interrupt: use the 'exit' command to quit\n")
215
+ retry
216
+ end
217
+ end
218
+
219
+ #
220
+ # Stop processing user input.
221
+ #
222
+ def stop
223
+ self.stop_flag = true
224
+ end
225
+
226
+ #
227
+ # Checks to see if the shell has stopped.
228
+ #
229
+ def stopped?
230
+ self.stop_flag
231
+ end
232
+
233
+ #
234
+ # Change the input prompt.
235
+ #
236
+ # prompt - the actual prompt
237
+ # new_prompt_char the char to append to the prompt
238
+ # mode - append or not to append - false = append true = make a new prompt
239
+ def update_prompt(prompt = nil, new_prompt_char = nil, mode = false)
240
+ if (self.input)
241
+ if prompt
242
+ new_prompt = self.init_prompt + ' ' + prompt + prompt_char + ' '
243
+ else
244
+ new_prompt = self.prompt || ''
245
+ end
246
+
247
+ if mode
248
+ new_prompt = prompt + (new_prompt_char || prompt_char) + ' '
249
+ end
250
+
251
+ # Save the prompt before any substitutions
252
+ self.prompt = new_prompt
253
+
254
+ # Set the actual prompt to the saved prompt with any substitutions
255
+ # or updates from our output driver, be they color or whatever
256
+ self.input.prompt = self.output.update_prompt(new_prompt)
257
+ self.prompt_char = new_prompt_char if (new_prompt_char)
258
+ end
259
+ end
260
+
261
+ #
262
+ # Output shortcuts
263
+ #
264
+
265
+ #
266
+ # Prints an error message to the output handle.
267
+ #
268
+ def print_error(msg='')
269
+ return if (output.nil?)
270
+
271
+ self.on_print_proc.call(msg) if self.on_print_proc
272
+ # Errors are not subject to disabled output
273
+ log_output(output.print_error(msg))
274
+ end
275
+
276
+ #
277
+ # Prints a status message to the output handle.
278
+ #
279
+ def print_status(msg='')
280
+ return if (disable_output == true)
281
+
282
+ self.on_print_proc.call(msg) if self.on_print_proc
283
+ log_output(output.print_status(msg))
284
+ end
285
+
286
+ #
287
+ # Prints a good message to the output handle.
288
+ #
289
+ def print_good(msg='')
290
+ return if (disable_output == true)
291
+
292
+ self.on_print_proc.call(msg) if self.on_print_proc
293
+ log_output(output.print_good(msg))
294
+ end
295
+
296
+ #
297
+ # Prints a line of text to the output handle.
298
+ #
299
+ def print_line(msg='')
300
+ return if (disable_output == true)
301
+
302
+ self.on_print_proc.call(msg) if self.on_print_proc
303
+ log_output(output.print_line(msg))
304
+ end
305
+
306
+ #
307
+ # Prints a warning message to the output handle.
308
+ #
309
+ def print_warning(msg='')
310
+ return if (disable_output == true)
311
+
312
+ self.on_print_proc.call(msg) if self.on_print_proc
313
+ log_output(output.print_warning(msg))
314
+ end
315
+
316
+ #
317
+ # Prints a raw message to the output handle.
318
+ #
319
+ def print(msg='')
320
+ return if (disable_output == true)
321
+ self.on_print_proc.call(msg) if self.on_print_proc
322
+ log_output(output.print(msg))
323
+ end
324
+
325
+ #
326
+ # Whether or not output has been disabled.
327
+ #
328
+ attr_accessor :disable_output
329
+ #
330
+ # The input handle to read user input from.
331
+ #
332
+ attr_reader :input
333
+ #
334
+ # The output handle to write output to.
335
+ #
336
+ attr_reader :output
337
+
338
+ attr_accessor :on_command_proc
339
+ attr_accessor :on_print_proc
340
+ attr_accessor :framework
341
+
342
+ protected
343
+
344
+ #
345
+ # Parse a line into an array of arguments.
346
+ #
347
+ def parse_line(line)
348
+ log_input(line)
349
+
350
+ line.gsub!(/(\r|\n)/, '')
351
+
352
+ begin
353
+ return args = Rex::Parser::Arguments.from_s(line)
354
+ rescue ::ArgumentError
355
+ print_error("Parse error: #{$!}")
356
+ end
357
+
358
+ return []
359
+ end
360
+
361
+ #
362
+ # Print the prompt, but do not log it.
363
+ #
364
+ def _print_prompt(prompt)
365
+ output.print(prompt)
366
+ end
367
+
368
+ #
369
+ # Writes the supplied input to the log source if one has been registered.
370
+ #
371
+ def log_input(buf)
372
+ rlog(buf, log_source) if (log_source)
373
+ end
374
+
375
+ #
376
+ # Writes the supplied output to the log source if one has been registered.
377
+ #
378
+ def log_output(buf)
379
+ rlog(buf, log_source) if (log_source)
380
+ end
381
+
382
+ attr_writer :input, :output # :nodoc:
383
+ attr_accessor :stop_flag, :init_prompt # :nodoc:
384
+ attr_accessor :prompt # :nodoc:
385
+ attr_accessor :prompt_char, :tab_complete_proc # :nodoc:
386
+ attr_accessor :histfile # :nodoc:
387
+ attr_accessor :hist_last_saved # the number of history lines when last saved/loaded
388
+ attr_accessor :log_source, :stop_count # :nodoc:
389
+
390
+ end
391
+
392
+ ###
393
+ #
394
+ # Pseudo-shell interface that simply includes the Shell mixin.
395
+ #
396
+ ###
397
+ class PseudoShell
398
+ include Shell
399
+ end
400
+
401
+
402
+ end end end
403
+
@@ -0,0 +1,346 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/ui'
3
+ require 'rex/socket'
4
+
5
+ module Rex
6
+ module Ui
7
+ module Text
8
+
9
+ ###
10
+ #
11
+ # Prints text in a tablized format. Pretty lame at the moment, but
12
+ # whatever.
13
+ #
14
+ ###
15
+ class Table
16
+
17
+ #
18
+ # Initializes a text table instance using the supplied properties. The
19
+ # Table class supports the following hash attributes:
20
+ #
21
+ # Header
22
+ #
23
+ # The string to display as a heading above the table. If none is
24
+ # specified, no header will be displayed.
25
+ #
26
+ # HeaderIndent
27
+ #
28
+ # The amount of space to indent the header. The default is zero.
29
+ #
30
+ # Columns
31
+ #
32
+ # The array of columns that will exist within the table.
33
+ #
34
+ # Rows
35
+ #
36
+ # The array of rows that will exist.
37
+ #
38
+ # Width
39
+ #
40
+ # The maximum width of the table in characters.
41
+ #
42
+ # Indent
43
+ #
44
+ # The number of characters to indent the table.
45
+ #
46
+ # CellPad
47
+ #
48
+ # The number of characters to put between each horizontal cell.
49
+ #
50
+ # Prefix
51
+ #
52
+ # The text to prefix before the table.
53
+ #
54
+ # Postfix
55
+ #
56
+ # The text to affix to the end of the table.
57
+ #
58
+ # Sortindex
59
+ #
60
+ # The column to sort the table on, -1 disables sorting.
61
+ #
62
+ def initialize(opts = {})
63
+ self.header = opts['Header']
64
+ self.headeri = opts['HeaderIndent'] || 0
65
+ self.columns = opts['Columns'] || []
66
+ # updated below if we got a "Rows" option
67
+ self.rows = []
68
+
69
+ self.width = opts['Width'] || 80
70
+ self.indent = opts['Indent'] || 0
71
+ self.cellpad = opts['CellPad'] || 2
72
+ self.prefix = opts['Prefix'] || ''
73
+ self.postfix = opts['Postfix'] || ''
74
+ self.colprops = []
75
+
76
+ self.sort_index = opts['SortIndex'] || 0
77
+
78
+ # Default column properties
79
+ self.columns.length.times { |idx|
80
+ self.colprops[idx] = {}
81
+ self.colprops[idx]['MaxWidth'] = self.columns[idx].length
82
+ }
83
+
84
+ # ensure all our internal state gets updated with the given rows by
85
+ # using add_row instead of just adding them to self.rows. See #3825.
86
+ opts['Rows'].each { |row| add_row(row) } if opts['Rows']
87
+
88
+ # Merge in options
89
+ if (opts['ColProps'])
90
+ opts['ColProps'].each_key { |col|
91
+ idx = self.columns.index(col)
92
+
93
+ if (idx)
94
+ self.colprops[idx].merge!(opts['ColProps'][col])
95
+ end
96
+ }
97
+ end
98
+
99
+ end
100
+
101
+ #
102
+ # Converts table contents to a string.
103
+ #
104
+ def to_s
105
+ str = prefix.dup
106
+ str << header_to_s || ''
107
+ str << columns_to_s || ''
108
+ str << hr_to_s || ''
109
+
110
+ sort_rows
111
+ rows.each { |row|
112
+ if (is_hr(row))
113
+ str << hr_to_s
114
+ else
115
+ str << row_to_s(row)
116
+ end
117
+ }
118
+
119
+ str << postfix
120
+
121
+ return str
122
+ end
123
+
124
+ #
125
+ # Converts table contents to a csv
126
+ #
127
+ def to_csv
128
+ str = ''
129
+ str << ( columns.join(",") + "\n" )
130
+ rows.each { |row|
131
+ next if is_hr(row)
132
+ str << ( row.map{|x|
133
+ x = x.to_s
134
+
135
+ x.gsub(/[\r\n]/, ' ').gsub(/\s+/, ' ').gsub('"', '""')
136
+ }.map{|x| "\"#{x}\"" }.join(",") + "\n" )
137
+ }
138
+ str
139
+ end
140
+
141
+ #
142
+ #
143
+ # Returns the header string.
144
+ #
145
+ def header_to_s # :nodoc:
146
+ if (header)
147
+ pad = " " * headeri
148
+
149
+ return pad + header + "\n" + pad + "=" * header.length + "\n\n"
150
+ end
151
+
152
+ return ''
153
+ end
154
+
155
+ #
156
+ # Prints the contents of the table.
157
+ #
158
+ def print
159
+ puts to_s
160
+ end
161
+
162
+ #
163
+ # Adds a row using the supplied fields.
164
+ #
165
+ def <<(fields)
166
+ add_row(fields)
167
+ end
168
+
169
+ #
170
+ # Adds a row with the supplied fields.
171
+ #
172
+ def add_row(fields = [])
173
+ if fields.length != self.columns.length
174
+ raise RuntimeError, 'Invalid number of columns!'
175
+ end
176
+ fields.each_with_index { |field, idx|
177
+ if (colprops[idx]['MaxWidth'] < field.to_s.length)
178
+ colprops[idx]['MaxWidth'] = field.to_s.length
179
+ end
180
+ }
181
+
182
+ rows << fields
183
+ end
184
+
185
+ #
186
+ # Sorts the rows based on the supplied index of sub-arrays
187
+ # If the supplied index is an IPv4 address, handle it differently, but
188
+ # avoid actually resolving domain names.
189
+ #
190
+ def sort_rows(index=sort_index)
191
+ return if index == -1
192
+ return unless rows
193
+ rows.sort! do |a,b|
194
+ if a[index].nil?
195
+ -1
196
+ elsif b[index].nil?
197
+ 1
198
+ elsif Rex::Socket.dotted_ip?(a[index]) and Rex::Socket.dotted_ip?(b[index])
199
+ Rex::Socket::addr_atoi(a[index]) <=> Rex::Socket::addr_atoi(b[index])
200
+ elsif a[index] =~ /^[0-9]+$/ and b[index] =~ /^[0-9]+$/
201
+ a[index].to_i <=> b[index].to_i
202
+ else
203
+ a[index] <=> b[index] # assumes otherwise comparable.
204
+ end
205
+ end
206
+ end
207
+
208
+ #
209
+ # Adds a horizontal line.
210
+ #
211
+ def add_hr
212
+ rows << '__hr__'
213
+ end
214
+
215
+ #
216
+ # Returns new sub-table with headers and rows maching column names submitted
217
+ #
218
+ def [](*col_names)
219
+ tbl = self.class.new('Indent' => self.indent,
220
+ 'Header' => self.header,
221
+ 'Columns' => col_names)
222
+ indexes = []
223
+
224
+ col_names.each do |col_name|
225
+ index = self.columns.index(col_name)
226
+ raise RuntimeError, "Invalid column name #{col_name}" if index.nil?
227
+ indexes << index
228
+ end
229
+
230
+ self.rows.each do |old_row|
231
+ new_row = []
232
+ indexes.map {|i| new_row << old_row[i]}
233
+ tbl << new_row
234
+ end
235
+
236
+ return tbl
237
+ end
238
+
239
+
240
+ alias p print
241
+
242
+ attr_accessor :header, :headeri # :nodoc:
243
+ attr_accessor :columns, :rows, :colprops # :nodoc:
244
+ attr_accessor :width, :indent, :cellpad # :nodoc:
245
+ attr_accessor :prefix, :postfix # :nodoc:
246
+ attr_accessor :sort_index # :nodoc:
247
+
248
+ protected
249
+
250
+ #
251
+ # Defaults cell widths and alignments.
252
+ #
253
+ def defaults # :nodoc:
254
+ self.columns.length.times { |idx|
255
+ }
256
+ end
257
+
258
+ #
259
+ # Checks to see if the row is an hr.
260
+ #
261
+ def is_hr(row) # :nodoc:
262
+ return ((row.kind_of?(String)) && (row == '__hr__'))
263
+ end
264
+
265
+ #
266
+ # Converts the columns to a string.
267
+ #
268
+ def columns_to_s # :nodoc:
269
+ nameline = ' ' * indent
270
+ barline = nameline.dup
271
+ last_col = nil
272
+ last_idx = nil
273
+ columns.each_with_index { |col,idx|
274
+ if (last_col)
275
+ nameline << pad(' ', last_col, last_idx)
276
+
277
+ remainder = colprops[last_idx]['MaxWidth'] - last_col.length
278
+ if (remainder < 0)
279
+ remainder = 0
280
+ end
281
+ barline << (' ' * (cellpad + remainder))
282
+ end
283
+ nameline << col
284
+ barline << ('-' * col.length)
285
+
286
+ last_col = col
287
+ last_idx = idx
288
+ }
289
+
290
+ return "#{nameline}\n#{barline}"
291
+ end
292
+
293
+ #
294
+ # Converts an hr to a string.
295
+ #
296
+ def hr_to_s # :nodoc:
297
+ return "\n"
298
+ end
299
+
300
+ #
301
+ # Converts a row to a string.
302
+ #
303
+ def row_to_s(row) # :nodoc:
304
+ line = ' ' * indent
305
+ last_cell = nil
306
+ last_idx = nil
307
+ row.each_with_index { |cell, idx|
308
+ if (idx != 0)
309
+ line << pad(' ', last_cell.to_s, last_idx)
310
+ end
311
+ # line << pad(' ', cell.to_s, idx)
312
+ # Limit wide cells
313
+ if colprops[idx]['MaxChar']
314
+ last_cell = cell.to_s[0..colprops[idx]['MaxChar'].to_i]
315
+ line << last_cell
316
+ else
317
+ line << cell.to_s
318
+ last_cell = cell
319
+ end
320
+ last_idx = idx
321
+ }
322
+
323
+ return line + "\n"
324
+ end
325
+
326
+ #
327
+ # Pads out with the supplied character for the remainder of the space given
328
+ # some text and a column index.
329
+ #
330
+ def pad(chr, buf, colidx, use_cell_pad = true) # :nodoc:
331
+ remainder = colprops[colidx]['MaxWidth'] - buf.length
332
+ val = chr * remainder;
333
+
334
+ if (use_cell_pad)
335
+ val << ' ' * cellpad
336
+ end
337
+
338
+ return val
339
+ end
340
+
341
+
342
+ end
343
+
344
+ end
345
+ end
346
+ end