dstruct 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +23 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -0
  5. data/lib/rex/LICENSE +29 -0
  6. data/lib/rex/arch.rb +104 -0
  7. data/lib/rex/arch/sparc.rb +75 -0
  8. data/lib/rex/arch/x86.rb +524 -0
  9. data/lib/rex/assembly/nasm.rb +104 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +389 -0
  12. data/lib/rex/constants.rb +124 -0
  13. data/lib/rex/elfparsey.rb +9 -0
  14. data/lib/rex/elfparsey/elf.rb +121 -0
  15. data/lib/rex/elfparsey/elfbase.rb +256 -0
  16. data/lib/rex/elfparsey/exceptions.rb +25 -0
  17. data/lib/rex/elfscan.rb +10 -0
  18. data/lib/rex/elfscan/scanner.rb +226 -0
  19. data/lib/rex/elfscan/search.rb +44 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +90 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
  26. data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
  27. data/lib/rex/encoder/ndr.rb +90 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +107 -0
  31. data/lib/rex/encoder/xor.rb +69 -0
  32. data/lib/rex/encoder/xor/dword.rb +13 -0
  33. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  34. data/lib/rex/encoders/xor_dword.rb +35 -0
  35. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  36. data/lib/rex/encoding/xor.rb +20 -0
  37. data/lib/rex/encoding/xor/byte.rb +15 -0
  38. data/lib/rex/encoding/xor/dword.rb +21 -0
  39. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  40. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  41. data/lib/rex/encoding/xor/generic.rb +146 -0
  42. data/lib/rex/encoding/xor/qword.rb +15 -0
  43. data/lib/rex/encoding/xor/word.rb +21 -0
  44. data/lib/rex/exceptions.rb +275 -0
  45. data/lib/rex/exploitation/cmdstager.rb +10 -0
  46. data/lib/rex/exploitation/cmdstager/base.rb +190 -0
  47. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  48. data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
  49. data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
  50. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  51. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  52. data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
  53. data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
  54. data/lib/rex/exploitation/egghunter.rb +425 -0
  55. data/lib/rex/exploitation/encryptjs.rb +78 -0
  56. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  57. data/lib/rex/exploitation/heaplib.rb +107 -0
  58. data/lib/rex/exploitation/js.rb +6 -0
  59. data/lib/rex/exploitation/js/detect.rb +69 -0
  60. data/lib/rex/exploitation/js/memory.rb +81 -0
  61. data/lib/rex/exploitation/js/network.rb +84 -0
  62. data/lib/rex/exploitation/js/utils.rb +33 -0
  63. data/lib/rex/exploitation/jsobfu.rb +513 -0
  64. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  65. data/lib/rex/exploitation/omelet.rb +321 -0
  66. data/lib/rex/exploitation/opcodedb.rb +819 -0
  67. data/lib/rex/exploitation/powershell.rb +62 -0
  68. data/lib/rex/exploitation/powershell/function.rb +63 -0
  69. data/lib/rex/exploitation/powershell/obfu.rb +98 -0
  70. data/lib/rex/exploitation/powershell/output.rb +151 -0
  71. data/lib/rex/exploitation/powershell/param.rb +23 -0
  72. data/lib/rex/exploitation/powershell/parser.rb +183 -0
  73. data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
  74. data/lib/rex/exploitation/powershell/script.rb +99 -0
  75. data/lib/rex/exploitation/ropdb.rb +190 -0
  76. data/lib/rex/exploitation/seh.rb +93 -0
  77. data/lib/rex/file.rb +160 -0
  78. data/lib/rex/image_source.rb +10 -0
  79. data/lib/rex/image_source/disk.rb +58 -0
  80. data/lib/rex/image_source/image_source.rb +44 -0
  81. data/lib/rex/image_source/memory.rb +35 -0
  82. data/lib/rex/io/bidirectional_pipe.rb +161 -0
  83. data/lib/rex/io/datagram_abstraction.rb +35 -0
  84. data/lib/rex/io/ring_buffer.rb +369 -0
  85. data/lib/rex/io/stream.rb +312 -0
  86. data/lib/rex/io/stream_abstraction.rb +209 -0
  87. data/lib/rex/io/stream_server.rb +221 -0
  88. data/lib/rex/job_container.rb +200 -0
  89. data/lib/rex/logging.rb +4 -0
  90. data/lib/rex/logging/log_dispatcher.rb +180 -0
  91. data/lib/rex/logging/log_sink.rb +43 -0
  92. data/lib/rex/logging/sinks/flatfile.rb +56 -0
  93. data/lib/rex/logging/sinks/stderr.rb +44 -0
  94. data/lib/rex/mac_oui.rb +16581 -0
  95. data/lib/rex/machparsey.rb +9 -0
  96. data/lib/rex/machparsey/exceptions.rb +34 -0
  97. data/lib/rex/machparsey/mach.rb +209 -0
  98. data/lib/rex/machparsey/machbase.rb +408 -0
  99. data/lib/rex/machscan.rb +9 -0
  100. data/lib/rex/machscan/scanner.rb +217 -0
  101. data/lib/rex/mime.rb +10 -0
  102. data/lib/rex/mime/encoding.rb +17 -0
  103. data/lib/rex/mime/header.rb +78 -0
  104. data/lib/rex/mime/message.rb +150 -0
  105. data/lib/rex/mime/part.rb +50 -0
  106. data/lib/rex/nop/opty2.rb +109 -0
  107. data/lib/rex/nop/opty2_tables.rb +301 -0
  108. data/lib/rex/ole.rb +202 -0
  109. data/lib/rex/ole/clsid.rb +44 -0
  110. data/lib/rex/ole/difat.rb +138 -0
  111. data/lib/rex/ole/directory.rb +228 -0
  112. data/lib/rex/ole/direntry.rb +237 -0
  113. data/lib/rex/ole/docs/dependencies.txt +8 -0
  114. data/lib/rex/ole/docs/references.txt +1 -0
  115. data/lib/rex/ole/fat.rb +96 -0
  116. data/lib/rex/ole/header.rb +201 -0
  117. data/lib/rex/ole/minifat.rb +74 -0
  118. data/lib/rex/ole/propset.rb +141 -0
  119. data/lib/rex/ole/samples/create_ole.rb +27 -0
  120. data/lib/rex/ole/samples/dir.rb +35 -0
  121. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  122. data/lib/rex/ole/samples/ole_info.rb +23 -0
  123. data/lib/rex/ole/storage.rb +392 -0
  124. data/lib/rex/ole/stream.rb +50 -0
  125. data/lib/rex/ole/substorage.rb +46 -0
  126. data/lib/rex/ole/util.rb +154 -0
  127. data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
  128. data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
  129. data/lib/rex/parser/appscan_nokogiri.rb +367 -0
  130. data/lib/rex/parser/arguments.rb +108 -0
  131. data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
  132. data/lib/rex/parser/ci_nokogiri.rb +193 -0
  133. data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
  134. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  135. data/lib/rex/parser/group_policy_preferences.rb +185 -0
  136. data/lib/rex/parser/ini.rb +186 -0
  137. data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
  138. data/lib/rex/parser/ip360_xml.rb +98 -0
  139. data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
  140. data/lib/rex/parser/nessus_xml.rb +121 -0
  141. data/lib/rex/parser/netsparker_xml.rb +109 -0
  142. data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
  143. data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
  144. data/lib/rex/parser/nexpose_xml.rb +172 -0
  145. data/lib/rex/parser/nmap_nokogiri.rb +394 -0
  146. data/lib/rex/parser/nmap_xml.rb +166 -0
  147. data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
  148. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  149. data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
  150. data/lib/rex/parser/retina_xml.rb +110 -0
  151. data/lib/rex/parser/unattend.rb +171 -0
  152. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  153. data/lib/rex/payloads.rb +2 -0
  154. data/lib/rex/payloads/win32.rb +3 -0
  155. data/lib/rex/payloads/win32/common.rb +27 -0
  156. data/lib/rex/payloads/win32/kernel.rb +54 -0
  157. data/lib/rex/payloads/win32/kernel/common.rb +55 -0
  158. data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
  159. data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
  160. data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
  161. data/lib/rex/peparsey.rb +10 -0
  162. data/lib/rex/peparsey/exceptions.rb +30 -0
  163. data/lib/rex/peparsey/pe.rb +210 -0
  164. data/lib/rex/peparsey/pe_memdump.rb +61 -0
  165. data/lib/rex/peparsey/pebase.rb +1662 -0
  166. data/lib/rex/peparsey/section.rb +128 -0
  167. data/lib/rex/pescan.rb +11 -0
  168. data/lib/rex/pescan/analyze.rb +366 -0
  169. data/lib/rex/pescan/scanner.rb +230 -0
  170. data/lib/rex/pescan/search.rb +68 -0
  171. data/lib/rex/platforms.rb +2 -0
  172. data/lib/rex/platforms/windows.rb +52 -0
  173. data/lib/rex/poly.rb +134 -0
  174. data/lib/rex/poly/block.rb +480 -0
  175. data/lib/rex/poly/machine.rb +13 -0
  176. data/lib/rex/poly/machine/machine.rb +830 -0
  177. data/lib/rex/poly/machine/x86.rb +509 -0
  178. data/lib/rex/poly/register.rb +101 -0
  179. data/lib/rex/poly/register/x86.rb +41 -0
  180. data/lib/rex/post.rb +7 -0
  181. data/lib/rex/post/dir.rb +51 -0
  182. data/lib/rex/post/file.rb +172 -0
  183. data/lib/rex/post/file_stat.rb +220 -0
  184. data/lib/rex/post/gen.pl +13 -0
  185. data/lib/rex/post/io.rb +182 -0
  186. data/lib/rex/post/meterpreter.rb +5 -0
  187. data/lib/rex/post/meterpreter/channel.rb +446 -0
  188. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  189. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  190. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  191. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  192. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  193. data/lib/rex/post/meterpreter/client.rb +483 -0
  194. data/lib/rex/post/meterpreter/client_core.rb +352 -0
  195. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  196. data/lib/rex/post/meterpreter/extension.rb +32 -0
  197. data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
  198. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
  199. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  200. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
  201. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  202. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  203. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  204. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  205. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  206. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  207. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  208. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  209. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
  210. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  211. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  212. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  213. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
  214. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  215. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
  216. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  217. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  218. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  219. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
  220. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  221. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  222. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
  223. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
  224. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
  225. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
  240. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
  252. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  253. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  255. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
  264. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
  265. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  266. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
  267. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
  268. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
  269. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
  270. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  271. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  272. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
  273. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
  274. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  275. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  276. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  277. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  278. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
  279. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  280. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  281. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
  282. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  283. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
  284. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
  285. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
  286. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  287. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  288. data/lib/rex/post/meterpreter/packet.rb +709 -0
  289. data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
  290. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  291. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  292. data/lib/rex/post/meterpreter/ui/console.rb +142 -0
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
  294. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
  295. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
  296. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
  297. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  298. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  299. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  300. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  301. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  302. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  303. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
  304. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  305. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  306. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  307. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  308. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  309. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
  310. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
  311. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
  312. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
  313. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
  314. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
  315. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
  316. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
  317. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
  318. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
  319. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
  320. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
  321. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
  322. data/lib/rex/post/permission.rb +26 -0
  323. data/lib/rex/post/process.rb +57 -0
  324. data/lib/rex/post/thread.rb +57 -0
  325. data/lib/rex/post/ui.rb +52 -0
  326. data/lib/rex/proto.rb +15 -0
  327. data/lib/rex/proto/addp.rb +218 -0
  328. data/lib/rex/proto/dcerpc.rb +7 -0
  329. data/lib/rex/proto/dcerpc/client.rb +362 -0
  330. data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
  331. data/lib/rex/proto/dcerpc/handle.rb +48 -0
  332. data/lib/rex/proto/dcerpc/ndr.rb +73 -0
  333. data/lib/rex/proto/dcerpc/packet.rb +264 -0
  334. data/lib/rex/proto/dcerpc/response.rb +188 -0
  335. data/lib/rex/proto/dcerpc/uuid.rb +85 -0
  336. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  337. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  338. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  339. data/lib/rex/proto/dhcp.rb +7 -0
  340. data/lib/rex/proto/dhcp/constants.rb +34 -0
  341. data/lib/rex/proto/dhcp/server.rb +334 -0
  342. data/lib/rex/proto/drda.rb +6 -0
  343. data/lib/rex/proto/drda/constants.rb +50 -0
  344. data/lib/rex/proto/drda/packet.rb +253 -0
  345. data/lib/rex/proto/drda/utils.rb +124 -0
  346. data/lib/rex/proto/http.rb +7 -0
  347. data/lib/rex/proto/http/client.rb +722 -0
  348. data/lib/rex/proto/http/client_request.rb +472 -0
  349. data/lib/rex/proto/http/handler.rb +47 -0
  350. data/lib/rex/proto/http/handler/erb.rb +129 -0
  351. data/lib/rex/proto/http/handler/proc.rb +61 -0
  352. data/lib/rex/proto/http/header.rb +173 -0
  353. data/lib/rex/proto/http/packet.rb +414 -0
  354. data/lib/rex/proto/http/request.rb +354 -0
  355. data/lib/rex/proto/http/response.rb +151 -0
  356. data/lib/rex/proto/http/server.rb +385 -0
  357. data/lib/rex/proto/iax2.rb +2 -0
  358. data/lib/rex/proto/iax2/call.rb +326 -0
  359. data/lib/rex/proto/iax2/client.rb +218 -0
  360. data/lib/rex/proto/iax2/codecs.rb +5 -0
  361. data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
  362. data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
  363. data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
  364. data/lib/rex/proto/iax2/constants.rb +262 -0
  365. data/lib/rex/proto/ipmi.rb +57 -0
  366. data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
  367. data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
  368. data/lib/rex/proto/ipmi/rakp2.rb +36 -0
  369. data/lib/rex/proto/ipmi/utils.rb +125 -0
  370. data/lib/rex/proto/natpmp.rb +7 -0
  371. data/lib/rex/proto/natpmp/constants.rb +19 -0
  372. data/lib/rex/proto/natpmp/packet.rb +45 -0
  373. data/lib/rex/proto/ntlm.rb +8 -0
  374. data/lib/rex/proto/ntlm/base.rb +327 -0
  375. data/lib/rex/proto/ntlm/constants.rb +75 -0
  376. data/lib/rex/proto/ntlm/crypt.rb +412 -0
  377. data/lib/rex/proto/ntlm/exceptions.rb +17 -0
  378. data/lib/rex/proto/ntlm/message.rb +534 -0
  379. data/lib/rex/proto/ntlm/utils.rb +765 -0
  380. data/lib/rex/proto/ntp.rb +3 -0
  381. data/lib/rex/proto/ntp/constants.rb +12 -0
  382. data/lib/rex/proto/ntp/modes.rb +130 -0
  383. data/lib/rex/proto/pjl.rb +31 -0
  384. data/lib/rex/proto/pjl/client.rb +163 -0
  385. data/lib/rex/proto/proxy/socks4a.rb +441 -0
  386. data/lib/rex/proto/rfb.rb +13 -0
  387. data/lib/rex/proto/rfb/cipher.rb +82 -0
  388. data/lib/rex/proto/rfb/client.rb +205 -0
  389. data/lib/rex/proto/rfb/constants.rb +50 -0
  390. data/lib/rex/proto/sip.rb +4 -0
  391. data/lib/rex/proto/sip/response.rb +61 -0
  392. data/lib/rex/proto/smb.rb +8 -0
  393. data/lib/rex/proto/smb/client.rb +2064 -0
  394. data/lib/rex/proto/smb/constants.rb +1064 -0
  395. data/lib/rex/proto/smb/crypt.rb +37 -0
  396. data/lib/rex/proto/smb/evasions.rb +67 -0
  397. data/lib/rex/proto/smb/exceptions.rb +867 -0
  398. data/lib/rex/proto/smb/simpleclient.rb +173 -0
  399. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  400. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  401. data/lib/rex/proto/smb/utils.rb +104 -0
  402. data/lib/rex/proto/sunrpc.rb +2 -0
  403. data/lib/rex/proto/sunrpc/client.rb +196 -0
  404. data/lib/rex/proto/tftp.rb +13 -0
  405. data/lib/rex/proto/tftp/client.rb +344 -0
  406. data/lib/rex/proto/tftp/constants.rb +39 -0
  407. data/lib/rex/proto/tftp/server.rb +497 -0
  408. data/lib/rex/random_identifier_generator.rb +177 -0
  409. data/lib/rex/registry.rb +14 -0
  410. data/lib/rex/registry/hive.rb +132 -0
  411. data/lib/rex/registry/lfkey.rb +51 -0
  412. data/lib/rex/registry/nodekey.rb +54 -0
  413. data/lib/rex/registry/regf.rb +25 -0
  414. data/lib/rex/registry/valuekey.rb +67 -0
  415. data/lib/rex/registry/valuelist.rb +29 -0
  416. data/lib/rex/ropbuilder.rb +8 -0
  417. data/lib/rex/ropbuilder/rop.rb +271 -0
  418. data/lib/rex/script.rb +42 -0
  419. data/lib/rex/script/base.rb +61 -0
  420. data/lib/rex/script/meterpreter.rb +16 -0
  421. data/lib/rex/script/shell.rb +10 -0
  422. data/lib/rex/service.rb +49 -0
  423. data/lib/rex/service_manager.rb +154 -0
  424. data/lib/rex/services/local_relay.rb +424 -0
  425. data/lib/rex/socket.rb +788 -0
  426. data/lib/rex/socket/comm.rb +120 -0
  427. data/lib/rex/socket/comm/local.rb +526 -0
  428. data/lib/rex/socket/ip.rb +132 -0
  429. data/lib/rex/socket/parameters.rb +363 -0
  430. data/lib/rex/socket/range_walker.rb +470 -0
  431. data/lib/rex/socket/ssl_tcp.rb +345 -0
  432. data/lib/rex/socket/ssl_tcp_server.rb +188 -0
  433. data/lib/rex/socket/subnet_walker.rb +76 -0
  434. data/lib/rex/socket/switch_board.rb +289 -0
  435. data/lib/rex/socket/tcp.rb +79 -0
  436. data/lib/rex/socket/tcp_server.rb +67 -0
  437. data/lib/rex/socket/udp.rb +165 -0
  438. data/lib/rex/sslscan/result.rb +201 -0
  439. data/lib/rex/sslscan/scanner.rb +206 -0
  440. data/lib/rex/struct2.rb +5 -0
  441. data/lib/rex/struct2/c_struct.rb +181 -0
  442. data/lib/rex/struct2/c_struct_template.rb +39 -0
  443. data/lib/rex/struct2/constant.rb +26 -0
  444. data/lib/rex/struct2/element.rb +44 -0
  445. data/lib/rex/struct2/generic.rb +73 -0
  446. data/lib/rex/struct2/restraint.rb +54 -0
  447. data/lib/rex/struct2/s_string.rb +72 -0
  448. data/lib/rex/struct2/s_struct.rb +111 -0
  449. data/lib/rex/sync.rb +6 -0
  450. data/lib/rex/sync/event.rb +85 -0
  451. data/lib/rex/sync/read_write_lock.rb +177 -0
  452. data/lib/rex/sync/ref.rb +58 -0
  453. data/lib/rex/sync/thread_safe.rb +83 -0
  454. data/lib/rex/text.rb +1813 -0
  455. data/lib/rex/thread_factory.rb +43 -0
  456. data/lib/rex/time.rb +66 -0
  457. data/lib/rex/transformer.rb +116 -0
  458. data/lib/rex/ui.rb +22 -0
  459. data/lib/rex/ui/interactive.rb +304 -0
  460. data/lib/rex/ui/output.rb +85 -0
  461. data/lib/rex/ui/output/none.rb +19 -0
  462. data/lib/rex/ui/progress_tracker.rb +97 -0
  463. data/lib/rex/ui/subscriber.rb +160 -0
  464. data/lib/rex/ui/text/color.rb +98 -0
  465. data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
  466. data/lib/rex/ui/text/input.rb +119 -0
  467. data/lib/rex/ui/text/input/buffer.rb +79 -0
  468. data/lib/rex/ui/text/input/readline.rb +129 -0
  469. data/lib/rex/ui/text/input/socket.rb +96 -0
  470. data/lib/rex/ui/text/input/stdio.rb +46 -0
  471. data/lib/rex/ui/text/irb_shell.rb +62 -0
  472. data/lib/rex/ui/text/output.rb +86 -0
  473. data/lib/rex/ui/text/output/buffer.rb +62 -0
  474. data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
  475. data/lib/rex/ui/text/output/file.rb +44 -0
  476. data/lib/rex/ui/text/output/socket.rb +44 -0
  477. data/lib/rex/ui/text/output/stdio.rb +53 -0
  478. data/lib/rex/ui/text/output/tee.rb +56 -0
  479. data/lib/rex/ui/text/progress_tracker.rb +57 -0
  480. data/lib/rex/ui/text/shell.rb +403 -0
  481. data/lib/rex/ui/text/table.rb +346 -0
  482. data/lib/rex/zip.rb +96 -0
  483. data/lib/rex/zip/archive.rb +130 -0
  484. data/lib/rex/zip/blocks.rb +184 -0
  485. data/lib/rex/zip/entry.rb +122 -0
  486. data/lib/rex/zip/jar.rb +283 -0
  487. data/lib/rex/zip/samples/comment.rb +32 -0
  488. data/lib/rex/zip/samples/mkwar.rb +138 -0
  489. data/lib/rex/zip/samples/mkzip.rb +19 -0
  490. data/lib/rex/zip/samples/recursive.rb +58 -0
  491. metadata +536 -0
@@ -0,0 +1,173 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Proto
4
+ module SMB
5
+ class SimpleClient
6
+
7
+ require 'rex/text'
8
+ require 'rex/struct2'
9
+ require 'rex/proto/smb/constants'
10
+ require 'rex/proto/smb/exceptions'
11
+ require 'rex/proto/smb/evasions'
12
+ require 'rex/proto/smb/crypt'
13
+ require 'rex/proto/smb/utils'
14
+ require 'rex/proto/smb/client'
15
+ require 'rex/proto/smb/simpleclient/open_file'
16
+ require 'rex/proto/smb/simpleclient/open_pipe'
17
+
18
+ # Some short-hand class aliases
19
+ CONST = Rex::Proto::SMB::Constants
20
+ CRYPT = Rex::Proto::SMB::Crypt
21
+ UTILS = Rex::Proto::SMB::Utils
22
+ XCEPT = Rex::Proto::SMB::Exceptions
23
+ EVADE = Rex::Proto::SMB::Evasions
24
+
25
+ # Public accessors
26
+ attr_accessor :last_error
27
+
28
+ # Private accessors
29
+ attr_accessor :socket, :client, :direct, :shares, :last_share
30
+
31
+ # Pass the socket object and a boolean indicating whether the socket is netbios or cifs
32
+ def initialize(socket, direct = false)
33
+ self.socket = socket
34
+ self.direct = direct
35
+ self.client = Rex::Proto::SMB::Client.new(socket)
36
+ self.shares = { }
37
+ end
38
+
39
+ def login(name = '', user = '', pass = '', domain = '',
40
+ verify_signature = false, usentlmv2 = false, usentlm2_session = true,
41
+ send_lm = true, use_lanman_key = false, send_ntlm = true,
42
+ native_os = 'Windows 2000 2195', native_lm = 'Windows 2000 5.0', spnopt = {})
43
+
44
+ begin
45
+
46
+ if (self.direct != true)
47
+ self.client.session_request(name)
48
+ end
49
+ self.client.native_os = native_os
50
+ self.client.native_lm = native_lm
51
+ self.client.verify_signature = verify_signature
52
+ self.client.use_ntlmv2 = usentlmv2
53
+ self.client.usentlm2_session = usentlm2_session
54
+ self.client.send_lm = send_lm
55
+ self.client.use_lanman_key = use_lanman_key
56
+ self.client.send_ntlm = send_ntlm
57
+
58
+ self.client.negotiate
59
+
60
+ # Disable NTLMv2 Session for Windows 2000 (breaks authentication on some systems)
61
+ # XXX: This in turn breaks SMB auth for Windows 2000 configured to enforce NTLMv2
62
+ # XXX: Tracked by ticket #4785#4785
63
+ if self.client.native_lm =~ /Windows 2000 5\.0/ and usentlm2_session
64
+ # self.client.usentlm2_session = false
65
+ end
66
+
67
+ self.client.spnopt = spnopt
68
+
69
+ ok = self.client.session_setup(user, pass, domain)
70
+ rescue ::Interrupt
71
+ raise $!
72
+ rescue ::Exception => e
73
+ n = XCEPT::LoginError.new
74
+ n.source = e
75
+ if(e.respond_to?('error_code'))
76
+ n.error_code = e.error_code
77
+ n.error_reason = e.get_error(e.error_code)
78
+ end
79
+ raise n
80
+ end
81
+
82
+ return true
83
+ end
84
+
85
+
86
+ def login_split_start_ntlm1(name = '')
87
+
88
+ begin
89
+
90
+ if (self.direct != true)
91
+ self.client.session_request(name)
92
+ end
93
+
94
+ # Disable extended security
95
+ self.client.negotiate(false)
96
+ rescue ::Interrupt
97
+ raise $!
98
+ rescue ::Exception => e
99
+ n = XCEPT::LoginError.new
100
+ n.source = e
101
+ if(e.respond_to?('error_code'))
102
+ n.error_code = e.error_code
103
+ n.error_reason = e.get_error(e.error_code)
104
+ end
105
+ raise n
106
+ end
107
+
108
+ return true
109
+ end
110
+
111
+
112
+ def login_split_next_ntlm1(user, domain, hash_lm, hash_nt)
113
+ begin
114
+ ok = self.client.session_setup_no_ntlmssp_prehash(user, domain, hash_lm, hash_nt)
115
+ rescue ::Interrupt
116
+ raise $!
117
+ rescue ::Exception => e
118
+ n = XCEPT::LoginError.new
119
+ n.source = e
120
+ if(e.respond_to?('error_code'))
121
+ n.error_code = e.error_code
122
+ n.error_reason = e.get_error(e.error_code)
123
+ end
124
+ raise n
125
+ end
126
+
127
+ return true
128
+ end
129
+
130
+ def connect(share)
131
+ ok = self.client.tree_connect(share)
132
+ tree_id = ok['Payload']['SMB'].v['TreeID']
133
+ self.shares[share] = tree_id
134
+ self.last_share = share
135
+ end
136
+
137
+ def disconnect(share)
138
+ ok = self.client.tree_disconnect(self.shares[share])
139
+ self.shares.delete(share)
140
+ end
141
+
142
+
143
+ def open(path, perm, chunk_size = 48000)
144
+ mode = UTILS.open_mode_to_mode(perm)
145
+ access = UTILS.open_mode_to_access(perm)
146
+
147
+ ok = self.client.open(path, mode, access)
148
+ file_id = ok['Payload'].v['FileID']
149
+ fh = OpenFile.new(self.client, path, self.client.last_tree_id, file_id)
150
+ fh.chunk_size = chunk_size
151
+ fh
152
+ end
153
+
154
+ def delete(*args)
155
+ self.client.delete(*args)
156
+ end
157
+
158
+ def create_pipe(path, perm = 'c')
159
+ disposition = UTILS.create_mode_to_disposition(perm)
160
+ ok = self.client.create_pipe(path, disposition)
161
+ file_id = ok['Payload'].v['FileID']
162
+ fh = OpenPipe.new(self.client, path, self.client.last_tree_id, file_id)
163
+ end
164
+
165
+ def trans_pipe(fid, data, no_response = nil)
166
+ client.trans_named_pipe(fid, data, no_response)
167
+ end
168
+
169
+ end
170
+ end
171
+ end
172
+ end
173
+
@@ -0,0 +1,106 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Proto
4
+ module SMB
5
+ class SimpleClient
6
+
7
+ class OpenFile
8
+ attr_accessor :name, :tree_id, :file_id, :mode, :client, :chunk_size
9
+
10
+ def initialize(client, name, tree_id, file_id)
11
+ self.client = client
12
+ self.name = name
13
+ self.tree_id = tree_id
14
+ self.file_id = file_id
15
+ self.chunk_size = 48000
16
+ end
17
+
18
+ def delete
19
+ begin
20
+ self.close
21
+ rescue
22
+ end
23
+ self.client.delete(self.name, self.tree_id)
24
+ end
25
+
26
+ # Close this open file
27
+ def close
28
+ self.client.close(self.file_id, self.tree_id)
29
+ end
30
+
31
+ # Read data from the file
32
+ def read(length = nil, offset = 0)
33
+ if (length == nil)
34
+ data = ''
35
+ fptr = offset
36
+ ok = self.client.read(self.file_id, fptr, self.chunk_size)
37
+ while (ok and ok['Payload'].v['DataLenLow'] > 0)
38
+ buff = ok.to_s.slice(
39
+ ok['Payload'].v['DataOffset'] + 4,
40
+ ok['Payload'].v['DataLenLow']
41
+ )
42
+ data << buff
43
+ if ok['Payload'].v['Remaining'] == 0
44
+ break
45
+ end
46
+ fptr += ok['Payload'].v['DataLenLow']
47
+
48
+ begin
49
+ ok = self.client.read(self.file_id, fptr, self.chunk_size)
50
+ rescue XCEPT::ErrorCode => e
51
+ case e.error_code
52
+ when 0x00050001
53
+ # Novell fires off an access denied error on EOF
54
+ ok = nil
55
+ else
56
+ raise e
57
+ end
58
+ end
59
+ end
60
+
61
+ return data
62
+ else
63
+ ok = self.client.read(self.file_id, offset, length)
64
+ data = ok.to_s.slice(
65
+ ok['Payload'].v['DataOffset'] + 4,
66
+ ok['Payload'].v['DataLenLow']
67
+ )
68
+ return data
69
+ end
70
+ end
71
+
72
+ def << (data)
73
+ self.write(data)
74
+ end
75
+
76
+ # Write data to the file
77
+ def write(data, offset = 0)
78
+ # Track our offset into the remote file
79
+ fptr = offset
80
+
81
+ # Duplicate the data so we can use slice!
82
+ data = data.dup
83
+
84
+ # Take our first chunk of bytes
85
+ chunk = data.slice!(0, self.chunk_size)
86
+
87
+ # Keep writing data until we run out
88
+ while (chunk.length > 0)
89
+ ok = self.client.write(self.file_id, fptr, chunk)
90
+ cl = ok['Payload'].v['CountLow']
91
+
92
+ # Partial write, push the failed data back into the queue
93
+ if (cl != chunk.length)
94
+ data = chunk.slice(cl - 1, chunk.length - cl) + data
95
+ end
96
+
97
+ # Increment our painter and grab the next chunk
98
+ fptr += cl
99
+ chunk = data.slice!(0, self.chunk_size)
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,57 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module SMB
6
+ class SimpleClient
7
+
8
+ class OpenPipe < OpenFile
9
+
10
+ # Valid modes are: 'trans' and 'rw'
11
+ attr_accessor :mode
12
+
13
+ def initialize(*args)
14
+ super(*args)
15
+ self.mode = 'rw'
16
+ @buff = ''
17
+ end
18
+
19
+ def read_buffer(length, offset=0)
20
+ length ||= @buff.length
21
+ @buff.slice!(0, length)
22
+ end
23
+
24
+ def read(length = nil, offset = 0)
25
+ case self.mode
26
+ when 'trans'
27
+ read_buffer(length, offset)
28
+ when 'rw'
29
+ super(length, offset)
30
+ else
31
+ raise ArgumentError
32
+ end
33
+ end
34
+
35
+ def write(data, offset = 0)
36
+ case self.mode
37
+
38
+ when 'trans'
39
+ write_trans(data, offset)
40
+ when 'rw'
41
+ super(data, offset)
42
+ else
43
+ raise ArgumentError
44
+ end
45
+ end
46
+
47
+ def write_trans(data, offset=0)
48
+ ack = self.client.trans_named_pipe(self.file_id, data)
49
+ doff = ack['Payload'].v['DataOffset']
50
+ dlen = ack['Payload'].v['DataCount']
51
+ @buff << ack.to_s[4+doff, dlen]
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,104 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/text'
3
+ require 'rex/proto/smb/constants'
4
+
5
+ module Rex
6
+ module Proto
7
+ module SMB
8
+ class Utils
9
+
10
+ CONST = Rex::Proto::SMB::Constants
11
+
12
+ # Creates an access mask for use with the CLIENT.open() call based on a string
13
+ def self.open_mode_to_access(str)
14
+ access = CONST::OPEN_ACCESS_READ | CONST::OPEN_SHARE_DENY_NONE
15
+ str.each_byte { |c|
16
+ case [c].pack('C').downcase
17
+ when 'w'
18
+ access |= CONST::OPEN_ACCESS_READWRITE
19
+ end
20
+ }
21
+ return access
22
+ end
23
+
24
+ # Creates a mode mask for use with the CLIENT.open() call based on a string
25
+ def self.open_mode_to_mode(str)
26
+ mode = 0
27
+
28
+ str.each_byte { |c|
29
+ case [c].pack('C').downcase
30
+ when 'x' # Fail if the file already exists
31
+ mode |= CONST::OPEN_MODE_EXCL
32
+ when 't' # Truncate the file if it already exists
33
+ mode |= CONST::OPEN_MODE_TRUNC
34
+ when 'c' # Create the file if it does not exist
35
+ mode |= CONST::OPEN_MODE_CREAT
36
+ when 'o' # Just open the file, clashes with x
37
+ mode |= CONST::OPEN_MODE_OPEN
38
+ end
39
+ }
40
+
41
+ return mode
42
+ end
43
+
44
+ # Returns a disposition value for smb.create based on permission string
45
+ def self.create_mode_to_disposition(str)
46
+ str.each_byte { |c|
47
+ case [c].pack('C').downcase
48
+ when 'c' # Create the file if it does not exist
49
+ return CONST::CREATE_ACCESS_OPENCREATE
50
+ when 'o' # Just open the file and fail if it does not exist
51
+ return CONST::CREATE_ACCESS_EXIST
52
+ end
53
+ }
54
+
55
+ return CONST::CREATE_ACCESS_OPENCREATE
56
+ end
57
+
58
+ # NOTE: the difference below came from: Time.utc("1970-1-1") - Time.utc("1601-1-1")
59
+
60
+ # Convert a 64-bit signed SMB time to a unix timestamp
61
+ def self.time_smb_to_unix(thi, tlo)
62
+ (((thi << 32) + tlo) / 10000000) - 11644473600
63
+ end
64
+
65
+ # Convert a unix timestamp to a 64-bit signed server time
66
+ def self.time_unix_to_smb(unix_time)
67
+ t64 = (unix_time + 11644473600) * 10000000
68
+ thi = (t64 & 0xffffffff00000000) >> 32
69
+ tlo = (t64 & 0x00000000ffffffff)
70
+ return [thi, tlo]
71
+ end
72
+
73
+ # Convert a name to its NetBIOS equivalent
74
+ def self.nbname_encode(str)
75
+ encoded = ''
76
+ for x in (0..15)
77
+ if (x >= str.length)
78
+ encoded << 'CA'
79
+ else
80
+ c = str[x, 1].upcase[0,1].unpack('C*')[0]
81
+ encoded << [ (c / 16) + 0x41, (c % 16) + 0x41 ].pack('CC')
82
+ end
83
+ end
84
+ return encoded
85
+ end
86
+
87
+ # Convert a name from its NetBIOS equivalent
88
+ def self.nbname_decode(str)
89
+ decoded = ''
90
+ str << 'A' if str.length % 2 != 0
91
+ while (str.length > 0)
92
+ two = str.slice!(0, 2).unpack('C*')
93
+ if (two.length == 2)
94
+ decoded << [ ((two[0] - 0x41) * 16) + two[1] - 0x41 ].pack('C')
95
+ end
96
+ end
97
+ return decoded
98
+ end
99
+
100
+
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,2 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/proto/sunrpc/client'
@@ -0,0 +1,196 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/socket'
3
+ require 'rex/encoder/xdr'
4
+
5
+ module Rex
6
+ module Proto
7
+ module SunRPC
8
+
9
+ class RPCTimeout < ::Interrupt
10
+ def initialize(msg = 'Operation timed out.')
11
+ @msg = msg
12
+ end
13
+
14
+ def to_s
15
+ @msg
16
+ end
17
+ end
18
+
19
+ # XXX: CPORT!
20
+ class Client
21
+ AUTH_NULL = 0
22
+ AUTH_UNIX = 1
23
+
24
+ PMAP_PROG = 100000
25
+ PMAP_VERS = 2
26
+ PMAP_GETPORT = 3
27
+
28
+ CALL = 0
29
+
30
+ attr_accessor :rhost, :rport, :proto, :program, :version
31
+ attr_accessor :pport, :call_sock, :timeout, :context
32
+
33
+ attr_accessor :should_fragment
34
+
35
+ def initialize(opts)
36
+ self.rhost = opts[:rhost]
37
+ self.rport = opts[:rport]
38
+ self.program = opts[:program]
39
+ self.version = opts[:version]
40
+ self.timeout = opts[:timeout] || 20
41
+ self.context = opts[:context] || {}
42
+ self.proto = opts[:proto]
43
+
44
+ if self.proto.downcase !~ /^(tcp|udp)$/
45
+ raise ::Rex::ArgumentError, 'Protocol is not "tcp" or "udp"'
46
+ end
47
+
48
+ @pport = nil
49
+
50
+ @auth_type = AUTH_NULL
51
+ @auth_data = ''
52
+
53
+ @call_sock = nil
54
+ end
55
+
56
+ # XXX: Add optional parameter to have proto be something else
57
+ def create()
58
+ proto_num = 0
59
+ if @proto.eql?('tcp')
60
+ proto_num = 6
61
+ elsif @proto.eql?('udp')
62
+ proto_num = 17
63
+ end
64
+
65
+ buf =
66
+ Rex::Encoder::XDR.encode(CALL, 2, PMAP_PROG, PMAP_VERS, PMAP_GETPORT,
67
+ @auth_type, [@auth_data, 400], AUTH_NULL, '',
68
+ @program, @version, proto_num, 0)
69
+
70
+ sock = make_rpc(@proto, @rhost, @rport)
71
+ send_rpc(sock, buf)
72
+ ret = recv_rpc(sock)
73
+ close_rpc(sock)
74
+
75
+ return ret
76
+ end
77
+
78
+ def call(procedure, buffer, maxwait = self.timeout)
79
+ buf =
80
+ Rex::Encoder::XDR.encode(CALL, 2, @program, @version, procedure,
81
+ @auth_type, [@auth_data, 400], AUTH_NULL, '')+
82
+ buffer
83
+
84
+ if ! @call_sock
85
+ @call_sock = make_rpc(@proto, @rhost, @pport)
86
+ end
87
+
88
+ send_rpc(@call_sock, buf)
89
+ recv_rpc(@call_sock, maxwait)
90
+ end
91
+
92
+ def destroy
93
+ close_rpc(@call_sock) if @call_sock
94
+ @call_sock = nil
95
+ end
96
+
97
+ def authnull_create
98
+ @auth_type = AUTH_NULL
99
+ @auth_data = ''
100
+ end
101
+
102
+ def authunix_create(host, uid, gid, groupz)
103
+ raise ::Rex::ArgumentError, 'Hostname length is too long' if host.length > 255
104
+ # 10?
105
+ raise ::Rex::ArgumentError, 'Too many groups' if groupz.length > 10
106
+
107
+ @auth_type = AUTH_UNIX
108
+ @auth_data =
109
+ Rex::Encoder::XDR.encode(0, host, uid, gid, groupz) # XXX: TIME! GROUPZ?!
110
+ end
111
+
112
+ # XXX: Dirty, integrate some sort of request system into create/call?
113
+ def portmap_req(host, port, rpc_vers, procedure, buffer)
114
+ buf = Rex::Encoder::XDR.encode(CALL, 2, PMAP_PROG, rpc_vers, procedure,
115
+ AUTH_NULL, '', AUTH_NULL, '') + buffer
116
+
117
+ sock = make_rpc('tcp', host, port)
118
+ send_rpc(sock, buf)
119
+ ret = recv_rpc(sock)
120
+ close_rpc(sock)
121
+
122
+ return ret
123
+ end
124
+
125
+ private
126
+ def make_rpc(proto, host, port)
127
+ Rex::Socket.create(
128
+ 'PeerHost' => host,
129
+ 'PeerPort' => port,
130
+ 'Proto' => proto,
131
+ 'Timeout' => self.timeout,
132
+ 'Context' => self.context
133
+ )
134
+ end
135
+
136
+ def build_tcp(buf)
137
+ if !self.should_fragment
138
+ return Rex::Encoder::XDR.encode(0x80000000 | buf.length) + buf
139
+ end
140
+
141
+ str = buf.dup
142
+
143
+ fragmented = ''
144
+
145
+ while (str.size > 0)
146
+ frag = str.slice!(0, rand(3) + 1)
147
+ len = frag.size
148
+ if str.size == 0
149
+ len |= 0x80000000
150
+ end
151
+
152
+ fragmented += Rex::Encoder::XDR.encode(len) + frag
153
+ end
154
+
155
+ return fragmented
156
+ end
157
+
158
+ def send_rpc(sock, buf)
159
+ buf = gen_xid() + buf
160
+ if sock.type?.eql?('tcp')
161
+ buf = build_tcp(buf)
162
+ end
163
+ sock.put(buf)
164
+ end
165
+
166
+ def recv_rpc(sock, maxwait=self.timeout)
167
+
168
+ buf = nil
169
+ begin
170
+ Timeout.timeout(maxwait) { buf = sock.get }
171
+ rescue ::Timeout
172
+ end
173
+
174
+ return nil if not buf
175
+
176
+ buf.slice!(0..3)
177
+ if sock.type?.eql?('tcp')
178
+ buf.slice!(0..3)
179
+ end
180
+ return buf if buf.length > 1
181
+ return nil
182
+ end
183
+
184
+ def close_rpc(sock)
185
+ sock.close
186
+ end
187
+
188
+ def gen_xid
189
+ return Rex::Encoder::XDR.encode(rand(0xffffffff) + 1)
190
+ end
191
+ end
192
+
193
+ end
194
+ end
195
+ end
196
+