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,350 +10,350 @@ require 'rex/proto/dcerpc/exceptions'
10
10
  require 'rex/text'
11
11
  require 'rex/proto/smb/exceptions'
12
12
 
13
- attr_accessor :handle, :socket, :options, :last_response, :context, :no_bind, :ispipe, :smb
14
-
15
- # initialize a DCE/RPC Function Call
16
- def initialize(handle, socket, useroptions = Hash.new)
17
- self.handle = handle
18
- self.socket = socket
19
- self.options = {
20
- 'smb_user' => '',
21
- 'smb_pass' => '',
22
- 'smb_pipeio' => 'rw',
23
- 'smb_name' => nil,
24
- 'read_timeout' => 10,
25
- 'connect_timeout' => 5
26
- }
27
-
28
- self.options.merge!(useroptions)
29
-
30
- # If the caller passed us a smb_client object, use it and
31
- # and skip the connect/login/ipc$ stages of the setup
32
- if (self.options['smb_client'])
33
- self.smb = self.options['smb_client']
34
- end
35
-
36
- # we must have a valid handle, regardless of everything else
37
- raise ArgumentError, 'handle is not a Rex::Proto::DCERPC::Handle' if !self.handle.is_a?(Rex::Proto::DCERPC::Handle)
38
-
39
- # we do this in case socket needs setup first, ie, socket = nil
40
- if !self.options['no_socketsetup']
41
- self.socket_check()
42
- end
43
-
44
- raise ArgumentError, 'socket can not read' if !self.socket.respond_to?(:read)
45
- raise ArgumentError, 'socket can not write' if !self.socket.respond_to?(:write)
46
-
47
- if !self.options['no_autobind']
48
- self.bind()
49
- end
50
- end
51
-
52
- def socket_check()
53
- if self.socket == nil
54
- self.socket_setup()
55
- end
56
-
57
- case self.handle.protocol
58
- when 'ncacn_ip_tcp'
59
- if self.socket.type? != 'tcp'
60
- raise "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
61
- end
62
- when 'ncacn_np'
63
- if self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe
64
- self.ispipe = 1
65
- elsif self.socket.type? == 'tcp'
66
- self.smb_connect()
67
- else
68
- raise "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
69
- end
70
- # No support ncacn_ip_udp (is it needed now that its ripped from Vista?)
71
- else
72
- raise "Unsupported protocol : #{self.handle.protocol}"
73
- end
74
- end
75
-
76
- # Create the appropriate socket based on protocol
77
- def socket_setup()
78
- ctx = { 'Msf' => self.options['Msf'], 'MsfExploit' => self.options['MsfExploit'] }
79
- self.socket = case self.handle.protocol
80
-
81
- when 'ncacn_ip_tcp'
82
- Rex::Socket.create_tcp(
83
- 'PeerHost' => self.handle.address,
84
- 'PeerPort' => self.handle.options[0],
85
- 'Context' => ctx,
86
- 'Timeout' => self.options['connect_timeout']
87
- )
88
-
89
- when 'ncacn_np'
90
- begin
91
- socket = Rex::Socket.create_tcp(
92
- 'PeerHost' => self.handle.address,
93
- 'PeerPort' => 445,
94
- 'Context' => ctx,
95
- 'Timeout' => self.options['connect_timeout']
96
- )
97
- rescue ::Timeout::Error, Rex::ConnectionRefused
98
- socket = Rex::Socket.create_tcp(
99
- 'PeerHost' => self.handle.address,
100
- 'PeerPort' => 139,
101
- 'Context' => ctx,
102
- 'Timeout' => self.options['connect_timeout']
103
- )
104
- end
105
- socket
106
- else nil
107
- end
108
-
109
- # Add this socket to the exploit's list of open sockets
110
- options['MsfExploit'].add_socket(self.socket) if (options['MsfExploit'])
111
- end
112
-
113
- def smb_connect()
114
- require 'rex/proto/smb/simpleclient'
115
-
116
- if(not self.smb)
117
- if self.socket.peerport == 139
118
- smb = Rex::Proto::SMB::SimpleClient.new(self.socket)
119
- else
120
- smb = Rex::Proto::SMB::SimpleClient.new(self.socket, true)
121
- end
122
-
123
- smb.login('*SMBSERVER', self.options['smb_user'], self.options['smb_pass'])
124
- smb.connect("\\\\#{self.handle.address}\\IPC$")
125
- self.smb = smb
126
- self.smb.read_timeout = self.options['read_timeout']
127
- end
128
-
129
- f = self.smb.create_pipe(self.handle.options[0])
130
- f.mode = self.options['smb_pipeio']
131
- self.socket = f
132
- end
133
-
134
- def read()
135
-
136
- max_read = self.options['pipe_read_max_size'] || 1024*1024
137
- min_read = self.options['pipe_read_min_size'] || max_read
138
-
139
- raw_response = ''
140
-
141
- # Are we reading from a remote pipe over SMB?
142
- if (self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe)
143
- begin
144
-
145
- # Max SMB read is 65535, cap it at 64000
146
- max_read = [64000, max_read].min
147
- min_read = [64000, min_read].min
148
-
149
- read_limit = nil
150
-
151
- while(true)
152
- # Random read offsets will not work on Windows NT 4.0 (thanks Dave!)
153
-
154
- read_cnt = (rand(max_read-min_read)+min_read)
155
- if(read_limit)
156
- if(read_cnt + raw_response.length > read_limit)
157
- read_cnt = raw_response.length - read_limit
158
- end
159
- end
160
-
161
- data = self.socket.read( read_cnt, rand(1024)+1)
162
- break if !(data and data.length > 0)
163
- raw_response += data
164
-
165
- # Keep reading until we have at least the DCERPC header
166
- next if raw_response.length < 10
167
-
168
- # We now have to process the raw_response and parse out the DCERPC fragment length
169
- # if we have read enough data. Once we have the length value, we need to make sure
170
- # that we don't read beyond this amount, or it can screw up the SMB state
171
- if (not read_limit)
172
- begin
173
- check = Rex::Proto::DCERPC::Response.new(raw_response)
174
- read_limit = check.frag_len
175
- rescue ::Rex::Proto::DCERPC::Exceptions::InvalidPacket
176
- end
177
- end
178
- break if (read_limit and read_limit <= raw_response.length)
179
- end
180
-
181
- rescue Rex::Proto::SMB::Exceptions::NoReply
182
- # I don't care if I didn't get a reply...
183
- rescue Rex::Proto::SMB::Exceptions::ErrorCode => exception
184
- if exception.error_code != 0xC000014B
185
- raise exception
186
- end
187
- end
188
- # This must be a regular TCP or UDP socket
189
- else
190
- if (self.socket.type? == 'tcp')
191
- if (false and max_read)
192
- while (true)
193
- data = self.socket.get_once((rand(max_read-min_read)+min_read), self.options['read_timeout'])
194
- break if not data
195
- break if not data.length
196
- raw_response << data
197
- end
198
- else
199
- # Just read the entire response in one go
200
- raw_response = self.socket.get_once(-1, self.options['read_timeout'])
201
- end
202
- else
203
- # No segmented read support for non-TCP sockets
204
- raw_response = self.socket.read(0xFFFFFFFF / 2 - 1) # read max data
205
- end
206
- end
207
-
208
- raw_response
209
- end
210
-
211
- # Write data to the underlying socket, limiting the sizes of the writes based on
212
- # the pipe_write_min / pipe_write_max options.
213
- def write(data)
214
-
215
- max_write = self.options['pipe_write_max_size'] || data.length
216
- min_write = self.options['pipe_write_min_size'] || max_write
217
-
218
- if(min_write > max_write)
219
- max_write = min_write
220
- end
221
-
222
- idx = 0
223
-
224
- if (self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe)
225
- while(idx < data.length)
226
- bsize = (rand(max_write-min_write)+min_write).to_i
227
- len = self.socket.write(data[idx, bsize], rand(1024)+1)
228
- idx += bsize
229
- end
230
- else
231
- self.socket.write(data)
232
- end
233
-
234
- data.length
235
- end
236
-
237
- def bind()
238
- require 'rex/proto/dcerpc/packet'
239
- bind = ''
240
- context = ''
241
- if self.options['fake_multi_bind']
242
-
243
- args = [ self.handle.uuid[0], self.handle.uuid[1] ]
244
-
245
- if (self.options['fake_multi_bind_prepend'])
246
- args << self.options['fake_multi_bind_prepend']
247
- end
248
-
249
- if (self.options['fake_multi_bind_append'])
250
- args << self.options['fake_multi_bind_append']
251
- end
252
-
253
- bind, context = Rex::Proto::DCERPC::Packet.make_bind_fake_multi(*args)
254
- else
255
- bind, context = Rex::Proto::DCERPC::Packet.make_bind(self.handle.uuid[0], self.handle.uuid[1])
256
- end
257
-
258
- raise 'make_bind failed' if !bind
259
-
260
- self.write(bind)
261
- raw_response = self.read()
262
-
263
- response = Rex::Proto::DCERPC::Response.new(raw_response)
264
- self.last_response = response
265
- if response.type == 12 or response.type == 15
266
- if self.last_response.ack_result[context] == 2
267
- raise "Could not bind to #{self.handle}"
268
- end
269
- self.context = context
270
- else
271
- raise "Could not bind to #{self.handle}"
272
- end
273
- end
274
-
275
- # Perform a DCE/RPC Function Call
276
- def call(function, data, do_recv = true)
277
-
278
- frag_size = data.length
279
- if options['frag_size']
280
- frag_size = options['frag_size']
281
- end
282
- object_id = ''
283
- if options['object_call']
284
- object_id = self.handle.uuid[0]
285
- end
286
- if options['random_object_id']
287
- object_id = Rex::Proto::DCERPC::UUID.uuid_unpack(Rex::Text.rand_text(16))
288
- end
289
-
290
- call_packets = Rex::Proto::DCERPC::Packet.make_request(function, data, frag_size, self.context, object_id)
291
- call_packets.each { |packet|
292
- self.write(packet)
293
- }
294
-
295
- return true if not do_recv
296
-
297
- raw_response = ''
298
-
299
- begin
300
- raw_response = self.read()
301
- rescue ::EOFError
302
- raise Rex::Proto::DCERPC::Exceptions::NoResponse
303
- end
304
-
305
- if (raw_response == nil or raw_response.length == 0)
306
- raise Rex::Proto::DCERPC::Exceptions::NoResponse
307
- end
308
-
309
-
310
- self.last_response = Rex::Proto::DCERPC::Response.new(raw_response)
311
-
312
- if self.last_response.type == 3
313
- e = Rex::Proto::DCERPC::Exceptions::Fault.new
314
- e.fault = self.last_response.status
315
- raise e
316
- end
317
-
318
- self.last_response.stub_data
319
- end
320
-
321
- # Process a DCERPC response packet from a socket
322
- def self.read_response(socket, timeout=self.options['read_timeout'])
323
-
324
- data = socket.get_once(-1, timeout)
325
-
326
- # We need at least 10 bytes to find the FragLen
327
- if (! data or data.length() < 10)
328
- return
329
- end
330
-
331
- # Pass the first 10 bytes to the constructor
332
- resp = Rex::Proto::DCERPC::Response.new(data.slice!(0, 10))
333
-
334
- # Something went wrong in the parser...
335
- if (! resp.frag_len)
336
- return resp
337
- end
338
-
339
- # Do we need to read more data?
340
- if (resp.frag_len > (data.length + 10))
341
- begin
342
- data << socket.timed_read(resp.frag_len - data.length - 10, timeout)
343
- rescue Timeout::Error
344
- end
345
- end
346
-
347
- # Still missing some data...
348
- if (data.length() != resp.frag_len - 10)
349
- # TODO: Bubble this up somehow
350
- # $stderr.puts "Truncated DCERPC response :-("
351
- return resp
352
- end
353
-
354
- resp.parse(data)
355
- return resp
356
- end
13
+ attr_accessor :handle, :socket, :options, :last_response, :context, :no_bind, :ispipe, :smb
14
+
15
+ # initialize a DCE/RPC Function Call
16
+ def initialize(handle, socket, useroptions = Hash.new)
17
+ self.handle = handle
18
+ self.socket = socket
19
+ self.options = {
20
+ 'smb_user' => '',
21
+ 'smb_pass' => '',
22
+ 'smb_pipeio' => 'rw',
23
+ 'smb_name' => nil,
24
+ 'read_timeout' => 10,
25
+ 'connect_timeout' => 5
26
+ }
27
+
28
+ self.options.merge!(useroptions)
29
+
30
+ # If the caller passed us a smb_client object, use it and
31
+ # and skip the connect/login/ipc$ stages of the setup
32
+ if (self.options['smb_client'])
33
+ self.smb = self.options['smb_client']
34
+ end
35
+
36
+ # we must have a valid handle, regardless of everything else
37
+ raise ArgumentError, 'handle is not a Rex::Proto::DCERPC::Handle' if !self.handle.is_a?(Rex::Proto::DCERPC::Handle)
38
+
39
+ # we do this in case socket needs setup first, ie, socket = nil
40
+ if !self.options['no_socketsetup']
41
+ self.socket_check()
42
+ end
43
+
44
+ raise ArgumentError, 'socket can not read' if !self.socket.respond_to?(:read)
45
+ raise ArgumentError, 'socket can not write' if !self.socket.respond_to?(:write)
46
+
47
+ if !self.options['no_autobind']
48
+ self.bind()
49
+ end
50
+ end
51
+
52
+ def socket_check()
53
+ if self.socket == nil
54
+ self.socket_setup()
55
+ end
56
+
57
+ case self.handle.protocol
58
+ when 'ncacn_ip_tcp'
59
+ if self.socket.type? != 'tcp'
60
+ raise "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
61
+ end
62
+ when 'ncacn_np'
63
+ if self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe
64
+ self.ispipe = 1
65
+ elsif self.socket.type? == 'tcp'
66
+ self.smb_connect()
67
+ else
68
+ raise "ack, #{self.handle.protocol} requires socket type tcp, not #{self.socket.type?}!"
69
+ end
70
+ # No support ncacn_ip_udp (is it needed now that its ripped from Vista?)
71
+ else
72
+ raise "Unsupported protocol : #{self.handle.protocol}"
73
+ end
74
+ end
75
+
76
+ # Create the appropriate socket based on protocol
77
+ def socket_setup()
78
+ ctx = { 'Msf' => self.options['Msf'], 'MsfExploit' => self.options['MsfExploit'] }
79
+ self.socket = case self.handle.protocol
80
+
81
+ when 'ncacn_ip_tcp'
82
+ Rex::Socket.create_tcp(
83
+ 'PeerHost' => self.handle.address,
84
+ 'PeerPort' => self.handle.options[0],
85
+ 'Context' => ctx,
86
+ 'Timeout' => self.options['connect_timeout']
87
+ )
88
+
89
+ when 'ncacn_np'
90
+ begin
91
+ socket = Rex::Socket.create_tcp(
92
+ 'PeerHost' => self.handle.address,
93
+ 'PeerPort' => 445,
94
+ 'Context' => ctx,
95
+ 'Timeout' => self.options['connect_timeout']
96
+ )
97
+ rescue ::Timeout::Error, Rex::ConnectionRefused
98
+ socket = Rex::Socket.create_tcp(
99
+ 'PeerHost' => self.handle.address,
100
+ 'PeerPort' => 139,
101
+ 'Context' => ctx,
102
+ 'Timeout' => self.options['connect_timeout']
103
+ )
104
+ end
105
+ socket
106
+ else nil
107
+ end
108
+
109
+ # Add this socket to the exploit's list of open sockets
110
+ options['MsfExploit'].add_socket(self.socket) if (options['MsfExploit'])
111
+ end
112
+
113
+ def smb_connect()
114
+ require 'rex/proto/smb/simpleclient'
115
+
116
+ if(not self.smb)
117
+ if self.socket.peerport == 139
118
+ smb = Rex::Proto::SMB::SimpleClient.new(self.socket)
119
+ else
120
+ smb = Rex::Proto::SMB::SimpleClient.new(self.socket, true)
121
+ end
122
+
123
+ smb.login('*SMBSERVER', self.options['smb_user'], self.options['smb_pass'])
124
+ smb.connect("\\\\#{self.handle.address}\\IPC$")
125
+ self.smb = smb
126
+ self.smb.read_timeout = self.options['read_timeout']
127
+ end
128
+
129
+ f = self.smb.create_pipe(self.handle.options[0])
130
+ f.mode = self.options['smb_pipeio']
131
+ self.socket = f
132
+ end
133
+
134
+ def read()
135
+
136
+ max_read = self.options['pipe_read_max_size'] || 1024*1024
137
+ min_read = self.options['pipe_read_min_size'] || max_read
138
+
139
+ raw_response = ''
140
+
141
+ # Are we reading from a remote pipe over SMB?
142
+ if (self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe)
143
+ begin
144
+
145
+ # Max SMB read is 65535, cap it at 64000
146
+ max_read = [64000, max_read].min
147
+ min_read = [64000, min_read].min
148
+
149
+ read_limit = nil
150
+
151
+ while(true)
152
+ # Random read offsets will not work on Windows NT 4.0 (thanks Dave!)
153
+
154
+ read_cnt = (rand(max_read-min_read)+min_read)
155
+ if(read_limit)
156
+ if(read_cnt + raw_response.length > read_limit)
157
+ read_cnt = raw_response.length - read_limit
158
+ end
159
+ end
160
+
161
+ data = self.socket.read( read_cnt, rand(1024)+1)
162
+ break if !(data and data.length > 0)
163
+ raw_response += data
164
+
165
+ # Keep reading until we have at least the DCERPC header
166
+ next if raw_response.length < 10
167
+
168
+ # We now have to process the raw_response and parse out the DCERPC fragment length
169
+ # if we have read enough data. Once we have the length value, we need to make sure
170
+ # that we don't read beyond this amount, or it can screw up the SMB state
171
+ if (not read_limit)
172
+ begin
173
+ check = Rex::Proto::DCERPC::Response.new(raw_response)
174
+ read_limit = check.frag_len
175
+ rescue ::Rex::Proto::DCERPC::Exceptions::InvalidPacket
176
+ end
177
+ end
178
+ break if (read_limit and read_limit <= raw_response.length)
179
+ end
180
+
181
+ rescue Rex::Proto::SMB::Exceptions::NoReply
182
+ # I don't care if I didn't get a reply...
183
+ rescue Rex::Proto::SMB::Exceptions::ErrorCode => exception
184
+ if exception.error_code != 0xC000014B
185
+ raise exception
186
+ end
187
+ end
188
+ # This must be a regular TCP or UDP socket
189
+ else
190
+ if (self.socket.type? == 'tcp')
191
+ if (false and max_read)
192
+ while (true)
193
+ data = self.socket.get_once((rand(max_read-min_read)+min_read), self.options['read_timeout'])
194
+ break if not data
195
+ break if not data.length
196
+ raw_response << data
197
+ end
198
+ else
199
+ # Just read the entire response in one go
200
+ raw_response = self.socket.get_once(-1, self.options['read_timeout'])
201
+ end
202
+ else
203
+ # No segmented read support for non-TCP sockets
204
+ raw_response = self.socket.read(0xFFFFFFFF / 2 - 1) # read max data
205
+ end
206
+ end
207
+
208
+ raw_response
209
+ end
210
+
211
+ # Write data to the underlying socket, limiting the sizes of the writes based on
212
+ # the pipe_write_min / pipe_write_max options.
213
+ def write(data)
214
+
215
+ max_write = self.options['pipe_write_max_size'] || data.length
216
+ min_write = self.options['pipe_write_min_size'] || max_write
217
+
218
+ if(min_write > max_write)
219
+ max_write = min_write
220
+ end
221
+
222
+ idx = 0
223
+
224
+ if (self.socket.class == Rex::Proto::SMB::SimpleClient::OpenPipe)
225
+ while(idx < data.length)
226
+ bsize = (rand(max_write-min_write)+min_write).to_i
227
+ len = self.socket.write(data[idx, bsize], rand(1024)+1)
228
+ idx += bsize
229
+ end
230
+ else
231
+ self.socket.write(data)
232
+ end
233
+
234
+ data.length
235
+ end
236
+
237
+ def bind()
238
+ require 'rex/proto/dcerpc/packet'
239
+ bind = ''
240
+ context = ''
241
+ if self.options['fake_multi_bind']
242
+
243
+ args = [ self.handle.uuid[0], self.handle.uuid[1] ]
244
+
245
+ if (self.options['fake_multi_bind_prepend'])
246
+ args << self.options['fake_multi_bind_prepend']
247
+ end
248
+
249
+ if (self.options['fake_multi_bind_append'])
250
+ args << self.options['fake_multi_bind_append']
251
+ end
252
+
253
+ bind, context = Rex::Proto::DCERPC::Packet.make_bind_fake_multi(*args)
254
+ else
255
+ bind, context = Rex::Proto::DCERPC::Packet.make_bind(*self.handle.uuid)
256
+ end
257
+
258
+ raise 'make_bind failed' if !bind
259
+
260
+ self.write(bind)
261
+ raw_response = self.read()
262
+
263
+ response = Rex::Proto::DCERPC::Response.new(raw_response)
264
+ self.last_response = response
265
+ if response.type == 12 or response.type == 15
266
+ if self.last_response.ack_result[context] == 2
267
+ raise "Could not bind to #{self.handle}"
268
+ end
269
+ self.context = context
270
+ else
271
+ raise "Could not bind to #{self.handle}"
272
+ end
273
+ end
274
+
275
+ # Perform a DCE/RPC Function Call
276
+ def call(function, data, do_recv = true)
277
+
278
+ frag_size = data.length
279
+ if options['frag_size']
280
+ frag_size = options['frag_size']
281
+ end
282
+ object_id = ''
283
+ if options['object_call']
284
+ object_id = self.handle.uuid[0]
285
+ end
286
+ if options['random_object_id']
287
+ object_id = Rex::Proto::DCERPC::UUID.uuid_unpack(Rex::Text.rand_text(16))
288
+ end
289
+
290
+ call_packets = Rex::Proto::DCERPC::Packet.make_request(function, data, frag_size, self.context, object_id)
291
+ call_packets.each { |packet|
292
+ self.write(packet)
293
+ }
294
+
295
+ return true if not do_recv
296
+
297
+ raw_response = ''
298
+
299
+ begin
300
+ raw_response = self.read()
301
+ rescue ::EOFError
302
+ raise Rex::Proto::DCERPC::Exceptions::NoResponse
303
+ end
304
+
305
+ if (raw_response == nil or raw_response.length == 0)
306
+ raise Rex::Proto::DCERPC::Exceptions::NoResponse
307
+ end
308
+
309
+
310
+ self.last_response = Rex::Proto::DCERPC::Response.new(raw_response)
311
+
312
+ if self.last_response.type == 3
313
+ e = Rex::Proto::DCERPC::Exceptions::Fault.new
314
+ e.fault = self.last_response.status
315
+ raise e
316
+ end
317
+
318
+ self.last_response.stub_data
319
+ end
320
+
321
+ # Process a DCERPC response packet from a socket
322
+ def self.read_response(socket, timeout=self.options['read_timeout'])
323
+
324
+ data = socket.get_once(-1, timeout)
325
+
326
+ # We need at least 10 bytes to find the FragLen
327
+ if (! data or data.length() < 10)
328
+ return
329
+ end
330
+
331
+ # Pass the first 10 bytes to the constructor
332
+ resp = Rex::Proto::DCERPC::Response.new(data.slice!(0, 10))
333
+
334
+ # Something went wrong in the parser...
335
+ if (! resp.frag_len)
336
+ return resp
337
+ end
338
+
339
+ # Do we need to read more data?
340
+ if (resp.frag_len > (data.length + 10))
341
+ begin
342
+ data << socket.timed_read(resp.frag_len - data.length - 10, timeout)
343
+ rescue Timeout::Error
344
+ end
345
+ end
346
+
347
+ # Still missing some data...
348
+ if (data.length() != resp.frag_len - 10)
349
+ # TODO: Bubble this up somehow
350
+ # $stderr.puts "Truncated DCERPC response :-("
351
+ return resp
352
+ end
353
+
354
+ resp.parse(data)
355
+ return resp
356
+ end
357
357
 
358
358
  end
359
359
  end