librex 0.0.68 → 0.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -0,0 +1,25 @@
1
+ # make sure the classes are defined before opening it to define submodule
2
+ require 'rex/ui/text/output'
3
+ require 'rex/ui/text/output/buffer'
4
+
5
+ module Rex
6
+ module Ui
7
+ module Text
8
+ class Output
9
+ class Buffer
10
+ # Adds {#write} method to {Rex::Ui::Text::Output::Buffer} so it can
11
+ # function as a stand-in for `$stdout`
12
+ module Stdout
13
+ # Prints raw message.
14
+ #
15
+ # @param (see Rex::Ui::Text::Output::Buffer#write)
16
+ # @return (see Rex::Ui::Text::Output::Buffer#write)
17
+ def write(msg = '')
18
+ print_raw(msg)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -12,30 +12,30 @@ module Text
12
12
  ###
13
13
  class Output::File < Rex::Ui::Text::Output
14
14
 
15
- attr_accessor :fd
16
-
17
- def initialize(path)
18
- self.fd = ::File.open(path, "wb")
19
- end
20
-
21
- def supports_color?
22
- false
23
- end
24
-
25
- #
26
- # Prints the supplied message to file output.
27
- #
28
- def print_raw(msg = '')
29
- return if not self.fd
30
- self.fd.write(msg)
31
- self.fd.flush
32
- msg
33
- end
34
-
35
- def close
36
- self.fd.close if self.fd
37
- self.fd = nil
38
- end
15
+ attr_accessor :fd
16
+
17
+ def initialize(path)
18
+ self.fd = ::File.open(path, "wb")
19
+ end
20
+
21
+ def supports_color?
22
+ false
23
+ end
24
+
25
+ #
26
+ # Prints the supplied message to file output.
27
+ #
28
+ def print_raw(msg = '')
29
+ return if not self.fd
30
+ self.fd.write(msg)
31
+ self.fd.flush
32
+ msg
33
+ end
34
+
35
+ def close
36
+ self.fd.close if self.fd
37
+ self.fd = nil
38
+ end
39
39
  end
40
40
 
41
41
  end
@@ -12,30 +12,30 @@ module Text
12
12
  ###
13
13
  class Output::Socket < Rex::Ui::Text::Output
14
14
 
15
- def initialize(sock)
16
- @sock = sock
17
- super()
18
- end
19
-
20
- def supports_color?
21
- case config[:color]
22
- when true
23
- # Allow color if the user forces it on
24
- return true
25
- else
26
- false
27
- end
28
- end
29
-
30
- #
31
- # Prints the supplied message to the socket.
32
- #
33
- def print_raw(msg = '')
34
- @sock.write(msg)
35
- @sock.flush
36
-
37
- msg
38
- end
15
+ def initialize(sock)
16
+ @sock = sock
17
+ super()
18
+ end
19
+
20
+ def supports_color?
21
+ case config[:color]
22
+ when true
23
+ # Allow color if the user forces it on
24
+ return true
25
+ else
26
+ false
27
+ end
28
+ end
29
+
30
+ #
31
+ # Prints the supplied message to the socket.
32
+ #
33
+ def print_raw(msg = '')
34
+ @sock.write(msg)
35
+ @sock.flush
36
+
37
+ msg
38
+ end
39
39
  end
40
40
 
41
41
  end
@@ -2,7 +2,7 @@
2
2
  require 'rex/ui'
3
3
 
4
4
  begin
5
- require 'windows_console_color_support'
5
+ require 'windows_console_color_support'
6
6
  rescue ::LoadError
7
7
  end
8
8
 
@@ -17,34 +17,34 @@ module Text
17
17
  ###
18
18
  class Output::Stdio < Rex::Ui::Text::Output
19
19
 
20
- def supports_color?
21
- case config[:color]
22
- when true
23
- return true
24
- when false
25
- return false
26
- else # auto
27
- if (Rex::Compat.is_windows)
28
- return true
29
- end
30
- term = Rex::Compat.getenv('TERM')
31
- return (term and term.match(/(?:vt10[03]|xterm(?:-color)?|linux|screen|rxvt)/i) != nil)
32
- end
33
- end
34
-
35
- #
36
- # Prints the supplied message to standard output.
37
- #
38
- def print_raw(msg = '')
39
- if (Rex::Compat.is_windows and supports_color?)
40
- WindowsConsoleColorSupport.new($stdout).write(msg)
41
- else
42
- $stdout.print(msg)
43
- end
44
- $stdout.flush
45
-
46
- msg
47
- end
20
+ def supports_color?
21
+ case config[:color]
22
+ when true
23
+ return true
24
+ when false
25
+ return false
26
+ else # auto
27
+ if (Rex::Compat.is_windows)
28
+ return true
29
+ end
30
+ term = Rex::Compat.getenv('TERM')
31
+ return (term and term.match(/(?:vt10[03]|xterm(?:-color)?|linux|screen|rxvt)/i) != nil)
32
+ end
33
+ end
34
+
35
+ #
36
+ # Prints the supplied message to standard output.
37
+ #
38
+ def print_raw(msg = '')
39
+ if (Rex::Compat.is_windows and supports_color?)
40
+ WindowsConsoleColorSupport.new($stdout).write(msg)
41
+ else
42
+ $stdout.print(msg)
43
+ end
44
+ $stdout.flush
45
+
46
+ msg
47
+ end
48
48
  end
49
49
 
50
50
  end
@@ -12,42 +12,42 @@ module Text
12
12
  ###
13
13
  class Output::Tee < Rex::Ui::Text::Output
14
14
 
15
- attr_accessor :fd
16
-
17
- def initialize(path)
18
- self.fd = ::File.open(path, "ab")
19
- super()
20
- end
21
-
22
- def supports_color?
23
- case config[:color]
24
- when true
25
- return true
26
- when false
27
- return false
28
- else # auto
29
- term = Rex::Compat.getenv('TERM')
30
- return (term and term.match(/(?:vt10[03]|xterm(?:-color)?|linux|screen|rxvt)/i) != nil)
31
- end
32
- end
33
-
34
- #
35
- # Prints the supplied message to file output.
36
- #
37
- def print_raw(msg = '')
38
- $stdout.print(msg)
39
- $stdout.flush
40
-
41
- return if not self.fd
42
- self.fd.write(msg)
43
- self.fd.flush
44
- msg
45
- end
46
-
47
- def close
48
- self.fd.close if self.fd
49
- self.fd = nil
50
- end
15
+ attr_accessor :fd
16
+
17
+ def initialize(path)
18
+ self.fd = ::File.open(path, "ab")
19
+ super()
20
+ end
21
+
22
+ def supports_color?
23
+ case config[:color]
24
+ when true
25
+ return true
26
+ when false
27
+ return false
28
+ else # auto
29
+ term = Rex::Compat.getenv('TERM')
30
+ return (term and term.match(/(?:vt10[03]|xterm(?:-color)?|linux|screen|rxvt)/i) != nil)
31
+ end
32
+ end
33
+
34
+ #
35
+ # Prints the supplied message to file output.
36
+ #
37
+ def print_raw(msg = '')
38
+ $stdout.print(msg)
39
+ $stdout.flush
40
+
41
+ return if not self.fd
42
+ self.fd.write(msg)
43
+ self.fd.flush
44
+ msg
45
+ end
46
+
47
+ def close
48
+ self.fd.close if self.fd
49
+ self.fd = nil
50
+ end
51
51
  end
52
52
 
53
53
  end
@@ -12,43 +12,43 @@ module Text
12
12
  ###
13
13
  class ProgressTracker < Rex::Ui::ProgressTracker
14
14
 
15
- def initialize(output)
16
- self.output = output
17
- self.start = 0
18
- self.stop = 0
19
- self.pos = 0
20
- end
21
-
22
- #
23
- # Passes a generic status message that isn't necessarily associated
24
- # with a step event.
25
- #
26
- def status(msg = '')
27
- output.print_status(msg)
28
- end
29
-
30
- #
31
- # Updates the status associated with the current step.
32
- #
33
- def step_status(msg = '')
34
- output.print_status("#{pos}: #{msg}") if (msg and msg.length > 0)
35
- end
36
-
37
- #
38
- # An error occurred that may result in aborting the progress.
39
- #
40
- def error(msg = '')
41
- output.print_error(msg)
42
- end
43
-
44
- #
45
- # Progress has been aborted, the reason is supplied in msg.
46
- #
47
- def abort(msg = '')
48
- output.print_error("fatal: #{msg}")
49
- end
50
-
51
- attr_accessor :output
15
+ def initialize(output)
16
+ self.output = output
17
+ self.start = 0
18
+ self.stop = 0
19
+ self.pos = 0
20
+ end
21
+
22
+ #
23
+ # Passes a generic status message that isn't necessarily associated
24
+ # with a step event.
25
+ #
26
+ def status(msg = '')
27
+ output.print_status(msg)
28
+ end
29
+
30
+ #
31
+ # Updates the status associated with the current step.
32
+ #
33
+ def step_status(msg = '')
34
+ output.print_status("#{pos}: #{msg}") if (msg and msg.length > 0)
35
+ end
36
+
37
+ #
38
+ # An error occurred that may result in aborting the progress.
39
+ #
40
+ def error(msg = '')
41
+ output.print_error(msg)
42
+ end
43
+
44
+ #
45
+ # Progress has been aborted, the reason is supplied in msg.
46
+ #
47
+ def abort(msg = '')
48
+ output.print_error("fatal: #{msg}")
49
+ end
50
+
51
+ attr_accessor :output
52
52
 
53
53
  end
54
54
 
@@ -13,369 +13,379 @@ module Text
13
13
  ###
14
14
  module Shell
15
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 raw message to the output handle.
308
- #
309
- def print(msg='')
310
- return if (disable_output == true)
311
- self.on_print_proc.call(msg) if self.on_print_proc
312
- log_output(output.print(msg))
313
- end
314
-
315
- #
316
- # Whether or not output has been disabled.
317
- #
318
- attr_accessor :disable_output
319
- #
320
- # The input handle to read user input from.
321
- #
322
- attr_reader :input
323
- #
324
- # The output handle to write output to.
325
- #
326
- attr_reader :output
327
-
328
- attr_accessor :on_command_proc
329
- attr_accessor :on_print_proc
330
- attr_accessor :framework
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
331
341
 
332
342
  protected
333
343
 
334
- #
335
- # Parse a line into an array of arguments.
336
- #
337
- def parse_line(line)
338
- log_input(line)
339
-
340
- line.gsub!(/(\r|\n)/, '')
341
-
342
- begin
343
- return args = Rex::Parser::Arguments.from_s(line)
344
- rescue ::ArgumentError
345
- print_error("Parse error: #{$!}")
346
- end
347
-
348
- return []
349
- end
350
-
351
- #
352
- # Print the prompt, but do not log it.
353
- #
354
- def _print_prompt(prompt)
355
- output.print(prompt)
356
- end
357
-
358
- #
359
- # Writes the supplied input to the log source if one has been registered.
360
- #
361
- def log_input(buf)
362
- rlog(buf, log_source) if (log_source)
363
- end
364
-
365
- #
366
- # Writes the supplied output to the log source if one has been registered.
367
- #
368
- def log_output(buf)
369
- rlog(buf, log_source) if (log_source)
370
- end
371
-
372
- attr_writer :input, :output # :nodoc:
373
- attr_accessor :stop_flag, :init_prompt # :nodoc:
374
- attr_accessor :prompt # :nodoc:
375
- attr_accessor :prompt_char, :tab_complete_proc # :nodoc:
376
- attr_accessor :histfile # :nodoc:
377
- attr_accessor :hist_last_saved # the number of history lines when last saved/loaded
378
- attr_accessor :log_source, :stop_count # :nodoc:
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:
379
389
 
380
390
  end
381
391
 
@@ -385,7 +395,7 @@ end
385
395
  #
386
396
  ###
387
397
  class PseudoShell
388
- include Shell
398
+ include Shell
389
399
  end
390
400
 
391
401