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
@@ -10,34 +10,34 @@ module Rex
10
10
 
11
11
  class ThreadFactory
12
12
 
13
- @@provider = nil
13
+ @@provider = nil
14
14
 
15
- def self.provider=(val)
16
- @@provider = val
17
- end
15
+ def self.provider=(val)
16
+ @@provider = val
17
+ end
18
18
 
19
- def self.spawn(name, crit, *args, &block)
20
- if @@provider
21
- if block
22
- return @@provider.spawn(name, crit, *args){ |*args_copy| block.call(*args_copy) }
23
- else
24
- return @@provider.spawn(name, crit, *args)
25
- end
26
- else
27
- t = nil
28
- if block
29
- t = ::Thread.new(*args){ |*args_copy| block.call(*args_copy) }
30
- else
31
- t = ::Thread.new(*args)
32
- end
33
- t[:tm_name] = name
34
- t[:tm_crit] = crit
35
- t[:tm_time] = Time.now
36
- t[:tm_call] = caller
37
- return t
38
- end
19
+ def self.spawn(name, crit, *args, &block)
20
+ if @@provider
21
+ if block
22
+ return @@provider.spawn(name, crit, *args){ |*args_copy| block.call(*args_copy) }
23
+ else
24
+ return @@provider.spawn(name, crit, *args)
25
+ end
26
+ else
27
+ t = nil
28
+ if block
29
+ t = ::Thread.new(*args){ |*args_copy| block.call(*args_copy) }
30
+ else
31
+ t = ::Thread.new(*args)
32
+ end
33
+ t[:tm_name] = name
34
+ t[:tm_crit] = crit
35
+ t[:tm_time] = Time.now
36
+ t[:tm_call] = caller
37
+ return t
38
+ end
39
39
 
40
- end
40
+ end
41
41
  end
42
42
 
43
43
  end
@@ -8,58 +8,58 @@ module Rex
8
8
  ###
9
9
  module ExtTime
10
10
 
11
- #
12
- # Convert seconds to a string that is broken down into years, days, hours,
13
- # minutes, and second.
14
- #
15
- def self.sec_to_s(seconds)
16
- parts = [ 31536000, 86400, 3600, 60, 1 ].map { |d|
17
- if ((c = seconds / d) > 0)
18
- seconds -= c.truncate * d
19
- c.truncate
20
- else
21
- 0
22
- end
23
- }.reverse
11
+ #
12
+ # Convert seconds to a string that is broken down into years, days, hours,
13
+ # minutes, and second.
14
+ #
15
+ def self.sec_to_s(seconds)
16
+ parts = [ 31536000, 86400, 3600, 60, 1 ].map { |d|
17
+ if ((c = seconds / d) > 0)
18
+ seconds -= c.truncate * d
19
+ c.truncate
20
+ else
21
+ 0
22
+ end
23
+ }.reverse
24
24
 
25
- str = ''
25
+ str = ''
26
26
 
27
- [ "sec", "min", "hour", "day", "year" ].each_with_index { |name, idx|
28
- next if (!parts[idx] or parts[idx] == 0)
27
+ [ "sec", "min", "hour", "day", "year" ].each_with_index { |name, idx|
28
+ next if (!parts[idx] or parts[idx] == 0)
29
29
 
30
- str = "#{parts[idx]} #{name + ((parts[idx] != 1) ? 's' :'')} " + str
31
- }
30
+ str = "#{parts[idx]} #{name + ((parts[idx] != 1) ? 's' :'')} " + str
31
+ }
32
32
 
33
- str.empty? ? "0 secs" : str.strip
34
- end
33
+ str.empty? ? "0 secs" : str.strip
34
+ end
35
35
 
36
- #
37
- # Converts a string in the form n years g days x hours y mins z secs.
38
- #
39
- def self.str_to_sec(str)
40
- fields = str.split(/ /)
41
- secs = 0
36
+ #
37
+ # Converts a string in the form n years g days x hours y mins z secs.
38
+ #
39
+ def self.str_to_sec(str)
40
+ fields = str.split(/ /)
41
+ secs = 0
42
42
 
43
- fields.each_with_index { |f, idx|
44
- val = 0
45
- case f
46
- when /^year/
47
- val = 31536000
48
- when /^day/
49
- val = 86400
50
- when /^hour/
51
- val = 3600
52
- when /^min/
53
- val = 60
54
- when /^sec/
55
- val = 1
56
- end
43
+ fields.each_with_index { |f, idx|
44
+ val = 0
45
+ case f
46
+ when /^year/
47
+ val = 31536000
48
+ when /^day/
49
+ val = 86400
50
+ when /^hour/
51
+ val = 3600
52
+ when /^min/
53
+ val = 60
54
+ when /^sec/
55
+ val = 1
56
+ end
57
57
 
58
- secs += val * fields[idx-1].to_i
59
- }
58
+ secs += val * fields[idx-1].to_i
59
+ }
60
60
 
61
- secs
62
- end
61
+ secs
62
+ end
63
63
 
64
64
  end
65
65
 
@@ -15,100 +15,100 @@ module Rex
15
15
  ###
16
16
  class Transformer
17
17
 
18
- #
19
- # Translates the object instance supplied in src_instance to an instance of
20
- # dst_class. The dst_class parameter's instance must support the <<
21
- # operator. An example call to this method looks something like:
22
- #
23
- # Transformer.transform(string, Array, [ String ], target)
24
- #
25
- def Transformer.transform(src_instance, dst_class, supported_classes,
26
- target = nil)
27
- dst_instance = dst_class.new
28
-
29
- if (src_instance.kind_of?(Array))
30
- src_instance.each { |src_inst|
31
- Transformer.transform_single(src_inst, dst_instance,
32
- supported_classes, target)
33
- }
34
- elsif (!src_instance.kind_of?(NilClass))
35
- Transformer.transform_single(src_instance, dst_instance,
36
- supported_classes, target)
37
- end
38
-
39
- return dst_instance
40
- end
18
+ #
19
+ # Translates the object instance supplied in src_instance to an instance of
20
+ # dst_class. The dst_class parameter's instance must support the <<
21
+ # operator. An example call to this method looks something like:
22
+ #
23
+ # Transformer.transform(string, Array, [ String ], target)
24
+ #
25
+ def Transformer.transform(src_instance, dst_class, supported_classes,
26
+ target = nil)
27
+ dst_instance = dst_class.new
28
+
29
+ if (src_instance.kind_of?(Array))
30
+ src_instance.each { |src_inst|
31
+ Transformer.transform_single(src_inst, dst_instance,
32
+ supported_classes, target)
33
+ }
34
+ elsif (!src_instance.kind_of?(NilClass))
35
+ Transformer.transform_single(src_instance, dst_instance,
36
+ supported_classes, target)
37
+ end
38
+
39
+ return dst_instance
40
+ end
41
41
 
42
42
  protected
43
43
 
44
- #
45
- # Transform a single source instance.
46
- #
47
- def Transformer.transform_single(src_instance, dst_instance,
48
- supported_classes, target)
49
- # If the src instance's class is supported, just add it to the dst
50
- # instance
51
- if (supported_classes.include?(src_instance.class))
52
- dst_instance << src_instance
53
- # If the src instance's class is an array, then we should check to see
54
- # if any of the supporting classes support from_a.
55
- elsif (src_instance.kind_of?(Array))
56
- new_src_instance = nil
57
-
58
- # Walk each supported class calling from_a if exported
59
- supported_classes.each { |sup_class|
60
- next if (sup_class.respond_to?('from_a') == false)
61
-
62
- new_src_instance = sup_class.from_a(src_instance)
63
-
64
- if (new_src_instance != nil)
65
- dst_instance << new_src_instance
66
- break
67
- end
68
- }
69
-
70
- # If we don't have a valid new src instance, then we suck
71
- if (new_src_instance == nil)
72
- bomb_translation(src_instance, target)
73
- end
74
-
75
- # If the source instance is a string, query each of the supported
76
- # classes to see if they can serialize it to their particular data
77
- # type.
78
- elsif (src_instance.kind_of?(String))
79
- new_src_instance = nil
80
-
81
- # Walk each supported class calling from_s if exported
82
- supported_classes.each { |sup_class|
83
- next if (sup_class.respond_to?('from_s') == false)
84
-
85
- new_src_instance = sup_class.from_s(src_instance)
86
-
87
- if (new_src_instance != nil)
88
- dst_instance << new_src_instance
89
- break
90
- end
91
- }
92
-
93
- # If we don't have a valid new src instance, then we suck
94
- if (new_src_instance == nil)
95
- bomb_translation(src_instance, target)
96
- end
97
- # Otherwise, bomb translation
98
- else
99
- bomb_translation(src_instance, target)
100
- end
101
- end
102
-
103
- def Transformer.bomb_translation(src_instance, target) # :nodoc:
104
- error = "Invalid source class (#{src_instance.class})"
105
-
106
- if (target != nil)
107
- error += " for #{target}"
108
- end
109
-
110
- raise ArgumentError, error, caller
111
- end
44
+ #
45
+ # Transform a single source instance.
46
+ #
47
+ def Transformer.transform_single(src_instance, dst_instance,
48
+ supported_classes, target)
49
+ # If the src instance's class is supported, just add it to the dst
50
+ # instance
51
+ if (supported_classes.include?(src_instance.class))
52
+ dst_instance << src_instance
53
+ # If the src instance's class is an array, then we should check to see
54
+ # if any of the supporting classes support from_a.
55
+ elsif (src_instance.kind_of?(Array))
56
+ new_src_instance = nil
57
+
58
+ # Walk each supported class calling from_a if exported
59
+ supported_classes.each { |sup_class|
60
+ next if (sup_class.respond_to?('from_a') == false)
61
+
62
+ new_src_instance = sup_class.from_a(src_instance)
63
+
64
+ if (new_src_instance != nil)
65
+ dst_instance << new_src_instance
66
+ break
67
+ end
68
+ }
69
+
70
+ # If we don't have a valid new src instance, then we suck
71
+ if (new_src_instance == nil)
72
+ bomb_translation(src_instance, target)
73
+ end
74
+
75
+ # If the source instance is a string, query each of the supported
76
+ # classes to see if they can serialize it to their particular data
77
+ # type.
78
+ elsif (src_instance.kind_of?(String))
79
+ new_src_instance = nil
80
+
81
+ # Walk each supported class calling from_s if exported
82
+ supported_classes.each { |sup_class|
83
+ next if (sup_class.respond_to?('from_s') == false)
84
+
85
+ new_src_instance = sup_class.from_s(src_instance)
86
+
87
+ if (new_src_instance != nil)
88
+ dst_instance << new_src_instance
89
+ break
90
+ end
91
+ }
92
+
93
+ # If we don't have a valid new src instance, then we suck
94
+ if (new_src_instance == nil)
95
+ bomb_translation(src_instance, target)
96
+ end
97
+ # Otherwise, bomb translation
98
+ else
99
+ bomb_translation(src_instance, target)
100
+ end
101
+ end
102
+
103
+ def Transformer.bomb_translation(src_instance, target) # :nodoc:
104
+ error = "Invalid source class (#{src_instance.class})"
105
+
106
+ if (target != nil)
107
+ error += " for #{target}"
108
+ end
109
+
110
+ raise ArgumentError, error, caller
111
+ end
112
112
 
113
113
  end
114
114
 
@@ -10,292 +10,292 @@ module Ui
10
10
  ###
11
11
  module Interactive
12
12
 
13
- #
14
- # Interactive sessions by default may interact with the local user input
15
- # and output.
16
- #
17
- include Rex::Ui::Subscriber
13
+ #
14
+ # Interactive sessions by default may interact with the local user input
15
+ # and output.
16
+ #
17
+ include Rex::Ui::Subscriber
18
18
 
19
- #
20
- # Starts interacting with the session at the most raw level, simply
21
- # forwarding input from user_input to rstream and forwarding input from
22
- # rstream to user_output.
23
- #
24
- def interact(user_input, user_output)
19
+ #
20
+ # Starts interacting with the session at the most raw level, simply
21
+ # forwarding input from user_input to rstream and forwarding input from
22
+ # rstream to user_output.
23
+ #
24
+ def interact(user_input, user_output)
25
25
 
26
- # Detach from any existing console
27
- if(self.interacting)
28
- detach()
29
- end
26
+ # Detach from any existing console
27
+ if(self.interacting)
28
+ detach()
29
+ end
30
30
 
31
- init_ui(user_input, user_output)
31
+ init_ui(user_input, user_output)
32
32
 
33
- self.interacting = true
34
- self.completed = false
33
+ self.interacting = true
34
+ self.completed = false
35
35
 
36
- eof = false
36
+ eof = false
37
37
 
38
- # Start the readline stdin monitor
39
- # XXX disabled
40
- # user_input.readline_start() if user_input.supports_readline
38
+ # Start the readline stdin monitor
39
+ # XXX disabled
40
+ # user_input.readline_start() if user_input.supports_readline
41
41
 
42
- # Handle suspend notifications
43
- handle_suspend
42
+ # Handle suspend notifications
43
+ handle_suspend
44
44
 
45
- # As long as we're interacting...
46
- while (self.interacting == true)
45
+ # As long as we're interacting...
46
+ while (self.interacting == true)
47
47
 
48
- begin
49
- _interact
48
+ begin
49
+ _interact
50
50
 
51
- rescue Interrupt
52
- # If we get an interrupt exception, ask the user if they want to
53
- # abort the interaction. If they do, then we return out of
54
- # the interact function and call it a day.
55
- eof = true if (_interrupt)
51
+ rescue Interrupt
52
+ # If we get an interrupt exception, ask the user if they want to
53
+ # abort the interaction. If they do, then we return out of
54
+ # the interact function and call it a day.
55
+ eof = true if (_interrupt)
56
56
 
57
- rescue EOFError, Errno::ECONNRESET, IOError
58
- # If we reach EOF or the connection is reset...
59
- eof = true
57
+ rescue EOFError, Errno::ECONNRESET, IOError
58
+ # If we reach EOF or the connection is reset...
59
+ eof = true
60
60
 
61
- end
61
+ end
62
62
 
63
- break if eof
64
- end
63
+ break if eof
64
+ end
65
65
 
66
- begin
66
+ begin
67
67
 
68
- # Restore the suspend handler
69
- restore_suspend
68
+ # Restore the suspend handler
69
+ restore_suspend
70
70
 
71
- # If we've hit eof, call the interact complete handler
72
- _interact_complete if (eof == true)
71
+ # If we've hit eof, call the interact complete handler
72
+ _interact_complete if (eof == true)
73
73
 
74
- # Shutdown the readline thread
74
+ # Shutdown the readline thread
75
75
  # XXX disabled
76
- # user_input.readline_stop() if user_input.supports_readline
77
-
78
- # Detach from the input/output handles
79
- reset_ui()
80
-
81
- ensure
82
- # Mark this as completed
83
- self.completed = true
84
- end
85
-
86
- # Return whether or not EOF was reached
87
- return eof
88
- end
89
-
90
- #
91
- # Stops the current interaction
92
- #
93
- def detach
94
- if (self.interacting)
95
- self.interacting = false
96
- while(not self.completed)
97
- ::IO.select(nil, nil, nil, 0.25)
98
- end
99
- end
100
- end
101
-
102
- #
103
- # Whether or not the session is currently being interacted with
104
- #
105
- attr_accessor :interacting
106
-
107
- #
108
- # Whether or not the session has completed interaction
109
- #
110
- attr_accessor :completed
111
-
112
- attr_accessor :on_print_proc
113
- attr_accessor :on_command_proc
76
+ # user_input.readline_stop() if user_input.supports_readline
77
+
78
+ # Detach from the input/output handles
79
+ reset_ui()
80
+
81
+ ensure
82
+ # Mark this as completed
83
+ self.completed = true
84
+ end
85
+
86
+ # Return whether or not EOF was reached
87
+ return eof
88
+ end
89
+
90
+ #
91
+ # Stops the current interaction
92
+ #
93
+ def detach
94
+ if (self.interacting)
95
+ self.interacting = false
96
+ while(not self.completed)
97
+ ::IO.select(nil, nil, nil, 0.25)
98
+ end
99
+ end
100
+ end
101
+
102
+ #
103
+ # Whether or not the session is currently being interacted with
104
+ #
105
+ attr_accessor :interacting
106
+
107
+ #
108
+ # Whether or not the session has completed interaction
109
+ #
110
+ attr_accessor :completed
111
+
112
+ attr_accessor :on_print_proc
113
+ attr_accessor :on_command_proc
114
114
 
115
115
  protected
116
116
 
117
- #
118
- # The original suspend proc.
119
- #
120
- attr_accessor :orig_suspend
121
-
122
- #
123
- # Stub method that is meant to handler interaction
124
- #
125
- def _interact
126
- end
127
-
128
- #
129
- # Called when an interrupt is sent.
130
- #
131
- def _interrupt
132
- true
133
- end
134
-
135
- #
136
- # Called when a suspend is sent.
137
- #
138
- def _suspend
139
- false
140
- end
141
-
142
- #
143
- # Called when interaction has completed and one of the sides has closed.
144
- #
145
- def _interact_complete
146
- true
147
- end
148
-
149
- #
150
- # Read from remote and write to local.
151
- #
152
- def _stream_read_remote_write_local(stream)
153
- data = stream.get
154
-
155
- self.on_print_proc.call(data) if self.on_print_proc
156
- user_output.print(data)
157
- end
158
-
159
- #
160
- # Read from local and write to remote.
161
- #
162
- def _stream_read_local_write_remote(stream)
163
- data = user_input.gets
164
-
165
- self.on_command_proc.call(data) if self.on_command_proc
166
- stream.put(data)
167
- end
168
-
169
- #
170
- # The local file descriptor handle.
171
- #
172
- def _local_fd
173
- user_input.fd
174
- end
175
-
176
- #
177
- # The remote file descriptor handle.
178
- #
179
- def _remote_fd(stream)
180
- stream.fd
181
- end
182
-
183
- #
184
- # Interacts with two streaming connections, reading data from one and
185
- # writing it to the other. Both are expected to implement Rex::IO::Stream.
186
- #
187
- def interact_stream(stream)
188
- while self.interacting
189
-
190
- # Select input and rstream
191
- sd = Rex::ThreadSafe.select([ _local_fd, _remote_fd(stream) ], nil, nil, 0.25)
192
-
193
- # Cycle through the items that have data
194
- # From the stream? Write to user_output.
195
- sd[0].each { |s|
196
- if (s == _remote_fd(stream))
197
- _stream_read_remote_write_local(stream)
198
- # From user_input? Write to stream.
199
- elsif (s == _local_fd)
200
- _stream_read_local_write_remote(stream)
201
- end
202
- } if (sd)
203
-
204
- Thread.pass
205
- end
206
- end
207
-
208
-
209
- #
210
- # Interacts between a local stream and a remote ring buffer. This has to use
211
- # a secondary thread to prevent the select on the local stream from blocking
212
- #
213
- def interact_ring(ring)
214
- begin
215
-
216
- rdr = Rex::ThreadFactory.spawn("RingMonitor", false) do
217
- seq = nil
218
- while self.interacting
219
-
220
- # Look for any pending data from the remote ring
221
- nseq,data = ring.read_data(seq)
222
-
223
- # Update the sequence number if necessary
224
- seq = nseq || seq
225
-
226
- # Write output to the local stream if successful
227
- user_output.print(data) if data
228
-
229
- # Wait for new data to arrive on this session
230
- ring.wait(seq)
231
- end
232
- end
233
-
234
- while self.interacting
235
-
236
- # Look for any pending input from the local stream
237
- sd = Rex::ThreadSafe.select([ _local_fd ], nil, [_local_fd], 5.0)
238
-
239
- # Write input to the ring's input mechanism
240
- if sd
241
- data = user_input.gets
242
- ring.put(data)
243
- end
244
- end
245
-
246
- ensure
247
- rdr.kill
248
- end
249
- end
250
-
251
-
252
- #
253
- # Installs a signal handler to monitor suspend signal notifications.
254
- #
255
- def handle_suspend
256
- if (orig_suspend == nil)
257
- begin
258
- self.orig_suspend = Signal.trap("TSTP") {
259
- _suspend
260
- }
261
- rescue
262
- end
263
- end
264
- end
265
-
266
- #
267
- # Restores the previously installed signal handler for suspend
268
- # notifications.
269
- #
270
- def restore_suspend
271
- begin
272
- if (orig_suspend)
273
- Signal.trap("TSTP", orig_suspend)
274
- else
275
- Signal.trap("TSTP", "DEFAULT")
276
- end
277
- self.orig_suspend = nil
278
- rescue
279
- end
280
- end
281
-
282
- #
283
- # Prompt the user for input if possible.
284
- # XXX: This is not thread-safe on Windows
285
- #
286
- def prompt(query)
287
- if (user_output and user_input)
288
- user_output.print("\n" + query)
289
- user_input.sysread(2)
290
- end
291
- end
292
-
293
- #
294
- # Check the return value of a yes/no prompt
295
- #
296
- def prompt_yesno(query)
297
- (prompt(query + " [y/N] ") =~ /^y/i) ? true : false
298
- end
117
+ #
118
+ # The original suspend proc.
119
+ #
120
+ attr_accessor :orig_suspend
121
+
122
+ #
123
+ # Stub method that is meant to handler interaction
124
+ #
125
+ def _interact
126
+ end
127
+
128
+ #
129
+ # Called when an interrupt is sent.
130
+ #
131
+ def _interrupt
132
+ true
133
+ end
134
+
135
+ #
136
+ # Called when a suspend is sent.
137
+ #
138
+ def _suspend
139
+ false
140
+ end
141
+
142
+ #
143
+ # Called when interaction has completed and one of the sides has closed.
144
+ #
145
+ def _interact_complete
146
+ true
147
+ end
148
+
149
+ #
150
+ # Read from remote and write to local.
151
+ #
152
+ def _stream_read_remote_write_local(stream)
153
+ data = stream.get
154
+
155
+ self.on_print_proc.call(data) if self.on_print_proc
156
+ user_output.print(data)
157
+ end
158
+
159
+ #
160
+ # Read from local and write to remote.
161
+ #
162
+ def _stream_read_local_write_remote(stream)
163
+ data = user_input.gets
164
+
165
+ self.on_command_proc.call(data) if self.on_command_proc
166
+ stream.put(data)
167
+ end
168
+
169
+ #
170
+ # The local file descriptor handle.
171
+ #
172
+ def _local_fd
173
+ user_input.fd
174
+ end
175
+
176
+ #
177
+ # The remote file descriptor handle.
178
+ #
179
+ def _remote_fd(stream)
180
+ stream.fd
181
+ end
182
+
183
+ #
184
+ # Interacts with two streaming connections, reading data from one and
185
+ # writing it to the other. Both are expected to implement Rex::IO::Stream.
186
+ #
187
+ def interact_stream(stream)
188
+ while self.interacting
189
+
190
+ # Select input and rstream
191
+ sd = Rex::ThreadSafe.select([ _local_fd, _remote_fd(stream) ], nil, nil, 0.25)
192
+
193
+ # Cycle through the items that have data
194
+ # From the stream? Write to user_output.
195
+ sd[0].each { |s|
196
+ if (s == _remote_fd(stream))
197
+ _stream_read_remote_write_local(stream)
198
+ # From user_input? Write to stream.
199
+ elsif (s == _local_fd)
200
+ _stream_read_local_write_remote(stream)
201
+ end
202
+ } if (sd)
203
+
204
+ Thread.pass
205
+ end
206
+ end
207
+
208
+
209
+ #
210
+ # Interacts between a local stream and a remote ring buffer. This has to use
211
+ # a secondary thread to prevent the select on the local stream from blocking
212
+ #
213
+ def interact_ring(ring)
214
+ begin
215
+
216
+ rdr = Rex::ThreadFactory.spawn("RingMonitor", false) do
217
+ seq = nil
218
+ while self.interacting
219
+
220
+ # Look for any pending data from the remote ring
221
+ nseq,data = ring.read_data(seq)
222
+
223
+ # Update the sequence number if necessary
224
+ seq = nseq || seq
225
+
226
+ # Write output to the local stream if successful
227
+ user_output.print(data) if data
228
+
229
+ # Wait for new data to arrive on this session
230
+ ring.wait(seq)
231
+ end
232
+ end
233
+
234
+ while self.interacting
235
+
236
+ # Look for any pending input from the local stream
237
+ sd = Rex::ThreadSafe.select([ _local_fd ], nil, [_local_fd], 5.0)
238
+
239
+ # Write input to the ring's input mechanism
240
+ if sd
241
+ data = user_input.gets
242
+ ring.put(data)
243
+ end
244
+ end
245
+
246
+ ensure
247
+ rdr.kill
248
+ end
249
+ end
250
+
251
+
252
+ #
253
+ # Installs a signal handler to monitor suspend signal notifications.
254
+ #
255
+ def handle_suspend
256
+ if (orig_suspend == nil)
257
+ begin
258
+ self.orig_suspend = Signal.trap("TSTP") {
259
+ _suspend
260
+ }
261
+ rescue
262
+ end
263
+ end
264
+ end
265
+
266
+ #
267
+ # Restores the previously installed signal handler for suspend
268
+ # notifications.
269
+ #
270
+ def restore_suspend
271
+ begin
272
+ if (orig_suspend)
273
+ Signal.trap("TSTP", orig_suspend)
274
+ else
275
+ Signal.trap("TSTP", "DEFAULT")
276
+ end
277
+ self.orig_suspend = nil
278
+ rescue
279
+ end
280
+ end
281
+
282
+ #
283
+ # Prompt the user for input if possible.
284
+ # XXX: This is not thread-safe on Windows
285
+ #
286
+ def prompt(query)
287
+ if (user_output and user_input)
288
+ user_output.print("\n" + query)
289
+ user_input.sysread(2)
290
+ end
291
+ end
292
+
293
+ #
294
+ # Check the return value of a yes/no prompt
295
+ #
296
+ def prompt_yesno(query)
297
+ (prompt(query + " [y/N] ") =~ /^y/i) ? true : false
298
+ end
299
299
 
300
300
  end
301
301