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,233 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Parser
4
+
5
+ # Determines if Nokogiri is available and if it's a minimum
6
+ # acceptable version.
7
+ def self.load_nokogiri
8
+ @nokogiri_loaded = false
9
+ begin
10
+ require 'nokogiri'
11
+ major,minor = Nokogiri::VERSION.split(".")[0,2]
12
+ if major.to_i >= 1
13
+ if minor.to_i >= 4
14
+ @nokogiri_loaded = true
15
+ end
16
+ end
17
+ rescue LoadError => e
18
+ @nokogiri_loaded = false
19
+ @nokogiri_error = e
20
+ end
21
+ @nokogiri_loaded
22
+ end
23
+
24
+ def self.nokogiri_loaded
25
+ !!@nokogiri_loaded
26
+ end
27
+
28
+ # Useful during development, shouldn't be used in normal operation.
29
+ def self.reload(fname)
30
+ $stdout.puts "Reloading #{fname}..."
31
+ load __FILE__
32
+ load File.join(File.expand_path(File.dirname(__FILE__)),fname)
33
+ end
34
+
35
+ end
36
+ end
37
+
38
+ module Rex
39
+ module Parser
40
+
41
+ load_nokogiri && module NokogiriDocMixin
42
+
43
+ # Set up the getters and instance variables for the document
44
+ eval("attr_reader :args, :db, :state, :block, :report_data")
45
+
46
+ def initialize(args,db,&block)
47
+ @args = args
48
+ @db = db
49
+ @state = {}
50
+ @state[:current_tag] = {}
51
+ @block = block if block
52
+ @report_data = {:wspace => args[:wspace]}
53
+ @nx_console_id = args[:nx_console_id]
54
+ super()
55
+ end
56
+
57
+ # Turn XML attribute pairs in to more workable hashes (there
58
+ # are better Enumerable tricks in Ruby 1.9, but ignoring for now)
59
+ def attr_hash(attrs)
60
+ h = {}
61
+ attrs.each {|k,v| h[k] = v}
62
+ h
63
+ end
64
+
65
+ def valid_ip(addr)
66
+ valid = false
67
+ valid = ::Rex::Socket::RangeWalker.new(addr).valid? rescue false
68
+ !!valid
69
+ end
70
+
71
+ def normalize_ref(ref_type, ref_value)
72
+ return if ref_type.nil? || ref_type.empty? || ref_value.nil? || ref_value.empty?
73
+ ref_value = ref_value.strip
74
+ ref_type = ref_type.strip.upcase
75
+
76
+ ret = case ref_type
77
+ when "CVE"
78
+ ref_value.gsub("CAN", "CVE")
79
+ when "MS"
80
+ if ref_value =~ /^MS[0-9]/
81
+ "MSB-#{ref_value}"
82
+ else
83
+ "MSB-MS#{ref_value}"
84
+ end
85
+ when "URL", "BID"
86
+ "#{ref_type}-#{ref_value}"
87
+ when "APPLE"
88
+ ref_value
89
+ when "XF"
90
+ if ref_value =~ /\((\d+)\)$/
91
+ "#{ref_type}-#{$1}"
92
+ else
93
+ "#{ref_type}-#{ref_value}"
94
+ end
95
+ else # Handle others?
96
+ "#{ref_type}-#{ref_value}"
97
+ end
98
+ return ret
99
+ end
100
+
101
+ def normalize_references(orig_refs)
102
+ return [] unless orig_refs
103
+ refs = []
104
+ orig_refs.each do |ref_hash|
105
+
106
+ ref_hash_sym = Hash[ref_hash.map {|k, v| [k.to_sym, v] }]
107
+ ref_type = ref_hash_sym[:source].to_s.strip.upcase
108
+ ref_value = ref_hash_sym[:value].to_s.strip
109
+ refs << normalize_ref(ref_type, ref_value)
110
+ end
111
+ return refs.compact.uniq
112
+ end
113
+
114
+ def in_tag(tagname)
115
+ @state[:current_tag].keys.include? tagname
116
+ end
117
+
118
+ # If there's an address, it's not on the blacklist,
119
+ # it has ports, and the port list isn't
120
+ # empty... it's okay.
121
+ def host_is_okay
122
+ return false unless @report_data[:host]
123
+ return false unless valid_ip(@report_data[:host])
124
+ return false unless @report_data[:state] == Msf::HostState::Alive
125
+ if @args[:blacklist]
126
+ return false if @args[:blacklist].include?(@report_data[:host])
127
+ end
128
+ return false unless @report_data[:ports]
129
+ return false if @report_data[:ports].empty?
130
+ return true
131
+ end
132
+
133
+ # XXX: Document classes ought to define this
134
+ def determine_port_state(v)
135
+ return v
136
+ end
137
+
138
+ # Circumvent the unknown attribute logging by the various reporters. They
139
+ # seem to be there just for debugging anyway.
140
+ def db_report(table, data)
141
+ raise "Data should be a hash" unless data.kind_of? Hash
142
+ nonempty_data = data.reject {|k,v| v.nil?}
143
+ valid_attrs = db_valid_attributes(table)
144
+ raise "Unknown table `#{table}'" if valid_attrs.empty?
145
+ case table
146
+ when :note, :web_site, :web_page, :web_form, :web_vuln
147
+ just_the_facts = nonempty_data
148
+ else
149
+ just_the_facts = nonempty_data.select {|k,v| valid_attrs.include? k.to_s.to_sym}
150
+ end
151
+ return nil if just_the_facts.empty?
152
+ just_the_facts[:task] = @args[:task]
153
+ db.send("report_#{table}", just_the_facts)
154
+ end
155
+
156
+ # XXX: It would be better to either have a single registry of acceptable
157
+ # keys if we're going to alert on bad ones, or to be more forgiving if
158
+ # the caller is this thing. There is basically no way to tell if
159
+ # report_host()'s tastes are going to change with this scheme.
160
+ def db_valid_attributes(table)
161
+ case table.to_s.to_sym
162
+ when :host
163
+ ::Mdm::Host.new.attribute_names.map {|x| x.to_sym} |
164
+ [:host, :workspace]
165
+ when :service
166
+ ::Mdm::Service.new.attribute_names.map {|x| x.to_sym} |
167
+ [:host, :host_name, :mac, :workspace]
168
+ when :vuln
169
+ ::Mdm::Vuln.new.attribute_names.map {|x| x.to_sym} |
170
+ [:host, :refs, :workspace, :port, :proto, :details, :exploited_at]
171
+ when :vuln_details
172
+ ::Mdm::VulnDetails.new.attribute_names.map {|x| x.to_sym} | [ :key ]
173
+ when :host_details
174
+ ::Mdm::HostDetails.new.attribute_names.map {|x| x.to_sym} | [ :key ]
175
+ when :note, :web_site, :web_page, :web_form, :web_vuln
176
+ # These guys don't complain
177
+ [:anything]
178
+ else
179
+ []
180
+ end
181
+ end
182
+
183
+ # Nokogiri 1.4.4 (and presumably beyond) generates attrs as pairs,
184
+ # like [["value1","foo"],["value2","bar"]] (but not hashes for some
185
+ # reason). 1.4.3.1 (and presumably 1.4.3.x and prior) generates attrs
186
+ # as a flat array of strings. We want array_pairs.
187
+ def normalize_attrs(attrs)
188
+ attr_pairs = []
189
+ case attrs.first
190
+ when Array, NilClass
191
+ attr_pairs = attrs
192
+ when String
193
+ attrs.each_index {|i|
194
+ next if i % 2 == 0
195
+ attr_pairs << [attrs[i-1],attrs[i]]
196
+ }
197
+ else # Wow, yet another format! It's either from the distant past or distant future.
198
+ raise ::Msf::DBImportError.new("Unknown format for XML attributes. Please check your Nokogiri version.")
199
+ end
200
+ return attr_pairs
201
+ end
202
+
203
+ # This breaks xml-encoded characters, so need to append.
204
+ # It's on the end_element tag name to turn the appending
205
+ # off and clear out the data.
206
+ def characters(text)
207
+ return unless @state[:has_text]
208
+ @text ||= ""
209
+ @text << text
210
+ end
211
+
212
+ # Effectively the same as characters()
213
+ def cdata_block(text)
214
+ return unless @state[:has_text]
215
+ @text ||= ""
216
+ @text << text
217
+ end
218
+
219
+ def end_document
220
+ block = @block
221
+ return unless @report_type_ok
222
+ unless @state[:current_tag].empty?
223
+ missing_ends = @state[:current_tag].keys.map {|x| "'#{x}'"}.join(", ")
224
+ msg = "Warning, the provided file is incomplete, and there may be missing\n"
225
+ msg << "data. The following tags were not closed: #{missing_ends}."
226
+ db.emit(:warning,msg,&block) if block
227
+ end
228
+ end
229
+
230
+ end
231
+
232
+ end
233
+ end
@@ -0,0 +1,172 @@
1
+ # -*- coding: binary -*-
2
+ require "rex/parser/nokogiri_doc_mixin"
3
+
4
+ module Rex
5
+ module Parser
6
+
7
+ # If Nokogiri is available, define OpenVAS document class.
8
+ load_nokogiri && class OpenVASDocument < Nokogiri::XML::SAX::Document
9
+
10
+ include NokogiriDocMixin
11
+
12
+ # ourselves with the @state variable, turning things on when we
13
+ # get here (and turning things off when we exit in end_element()).
14
+ def start_element(name=nil,attrs=[])
15
+ attrs = normalize_attrs(attrs)
16
+ block = @block
17
+ @state[:current_tag][name] = true
18
+ case name
19
+ when "host"
20
+ @state[:has_text] = true
21
+ end
22
+ end
23
+
24
+ # When we exit a tag, this is triggered.
25
+ def end_element(name=nil)
26
+ block = @block
27
+ case name
28
+ when "name"
29
+ return if not in_tag("result")
30
+ @state[:has_text] = true
31
+ @state[:vuln_name] = @text.strip if @text
32
+ @text = nil
33
+ when "description"
34
+ @state[:has_text] = true
35
+ @state[:vuln_desc] = @text.strip if @text
36
+ @text = nil
37
+ when "bid"
38
+ return if not in_tag("result")
39
+ return if not in_tag("nvt")
40
+ @state[:has_text] = true
41
+ @state[:bid] = @text.strip if @text
42
+ @text = nil
43
+ when "cve"
44
+ return if not in_tag("result")
45
+ return if not in_tag("nvt")
46
+ @state[:has_text] = true
47
+ @state[:cves] = @text.strip if @text
48
+ @text = nil
49
+ when "risk_factor"
50
+ return if not in_tag("result")
51
+ return if not in_tag("nvt")
52
+
53
+ #we do this to clean out the buffer so to speak
54
+ #if we don't set text to nil now, the text will show up later
55
+ @state[:has_text] = true
56
+ @text = nil
57
+ when "cvss_base"
58
+ return if not in_tag("result")
59
+ return if not in_tag("nvt")
60
+ @state[:has_text] = true
61
+ @text = nil
62
+ when "subnet"
63
+ @state[:has_text] = true
64
+ @text = nil
65
+ when "result"
66
+ return if not in_tag("results")
67
+ record_vuln
68
+ when "threat"
69
+ return if not in_tag("ports")
70
+ return if not in_tag("port")
71
+ @state[:has_text] = true
72
+
73
+ if not @text.index('(')
74
+ @state[:name] = nil
75
+ @state[:port] = nil
76
+ @state[:proto] = nil
77
+ @text = nil
78
+ return
79
+ end
80
+
81
+ @state[:name] = @text.split(' ')[0] if @text
82
+ @state[:port] = @text.split('(')[1].split('/')[0] if @text
83
+ @state[:proto] = @text.split('(')[1].split('/')[1].split(')')[0] if @text
84
+
85
+ @text = nil
86
+ when "host"
87
+ if in_tag('result')
88
+ @state[:has_text] = true
89
+ @state[:host] = @text.strip if @text
90
+ @text = nil
91
+ elsif in_tag('ports')
92
+ return if not in_tag('port')
93
+ @state[:has_text] = true
94
+ @state[:host] = @text.strip if @text
95
+ @text = nil
96
+ end
97
+ when "port"
98
+ if in_tag('result')
99
+ @state[:has_text] = true
100
+ if not @text.index('(')
101
+ @state[:proto] = nil
102
+ @state[:port] = nil
103
+ @text = nil
104
+ return
105
+ end
106
+ @state[:proto] = @text.split('(')[0].strip if @text
107
+ @state[:port] = @text.split('(')[1].split('/')[0].gsub(/\)/, '') if @text
108
+ @text = nil
109
+ elsif in_tag('ports')
110
+ record_service
111
+ end
112
+ when "name"
113
+ return if not in_tag("result")
114
+ @state[:has_text] = true
115
+ @text = nil
116
+ end
117
+ @state[:current_tag].delete name
118
+ end
119
+
120
+ def record_vuln
121
+ if (@state[:cves] and @state[:cves] == "NOCVE") and (@state[:bid] and @state[:bid] == "NOBID")
122
+ return
123
+ end
124
+
125
+ if @state[:cves] and @state[:cves] != "NOCVE" and !@state[:cves].empty?
126
+ @state[:cves].split(',').each do |cve|
127
+ vuln_info = {}
128
+ vuln_info[:host] = @state[:host]
129
+ vuln_info[:refs] = normalize_references([{ :source => "CVE", :value => cve}])
130
+ vuln_info[:name] = @state[:vuln_name]
131
+ vuln_info[:info] = @state[:vuln_desc]
132
+ vuln_info[:port] = @state[:port]
133
+ vuln_info[:proto] = @state[:proto]
134
+
135
+ db_report(:vuln, vuln_info)
136
+ end
137
+ end
138
+ if @state[:bid] and @state[:bid] != "NOBID" and !@state[:bid].empty?
139
+ @state[:bid].split(',').each do |bid|
140
+ vuln_info = {}
141
+ vuln_info[:host] = @state[:host]
142
+ vuln_info[:refs] = normalize_references([{ :source => "BID", :value => bid}])
143
+ vuln_info[:name] = @state[:vuln_name]
144
+ vuln_info[:info] = @state[:vuln_desc]
145
+ vuln_info[:port] = @state[:port]
146
+ vuln_info[:proto] = @state[:proto]
147
+
148
+ db_report(:vuln, vuln_info)
149
+ end
150
+ end
151
+ end
152
+
153
+ def record_service
154
+ return if not @state[:name]
155
+
156
+ service_info = {}
157
+ service_info[:host] = @state[:host]
158
+ service_info[:name] = @state[:name]
159
+ service_info[:port] = @state[:port]
160
+ service_info[:proto] = @state[:proto]
161
+
162
+ db_report(:service, service_info)
163
+
164
+ host_info = {}
165
+ host_info[:host] = @state[:host]
166
+
167
+ db_report(:host, host_info)
168
+ end
169
+ end
170
+ end
171
+ end
172
+
@@ -0,0 +1,240 @@
1
+ # -*- coding: binary -*-
2
+ require "rex/parser/nokogiri_doc_mixin"
3
+
4
+ module Rex
5
+ module Parser
6
+
7
+ load_nokogiri && class Outpost24Document < Nokogiri::XML::SAX::Document
8
+
9
+ include NokogiriDocMixin
10
+
11
+ def start_element(name, attrs)
12
+ @state[:current_tag][name] = true
13
+ case name
14
+ when "description", "information"
15
+ return unless in_tag("detaillist")
16
+ return unless in_tag("detail")
17
+ record_text
18
+ when "detail"
19
+ return unless in_tag("detaillist")
20
+ record_vuln
21
+ when "detaillist"
22
+ record_vulns
23
+ when "host"
24
+ return unless in_tag("hostlist")
25
+ record_host
26
+ when "hostlist"
27
+ record_hosts
28
+ when "id"
29
+ return unless in_tag("detaillist")
30
+ return unless in_tag("detail")
31
+ return unless in_tag("cve")
32
+ record_text
33
+ when "name"
34
+ return unless in_tag("hostlist") || in_tag("detaillist")
35
+ return unless in_tag("host") || in_tag("detail")
36
+ record_text
37
+ when "platform"
38
+ return unless in_tag("hostlist")
39
+ return unless in_tag("host")
40
+ record_text
41
+ when "portinfo"
42
+ return unless in_tag("portlist")
43
+ return unless in_tag("portlist-host")
44
+ record_service
45
+ when "portlist"
46
+ record_services
47
+ when "portnumber", "protocol", "service"
48
+ return unless in_tag("portlist")
49
+ return unless in_tag("portlist-host")
50
+ return unless in_tag("portinfo")
51
+ record_text
52
+ when "report", "ip"
53
+ record_text
54
+ end
55
+ end
56
+
57
+ def end_element(name)
58
+ case name
59
+ when "description", "information"
60
+ return unless in_tag("detaillist")
61
+ return unless in_tag("detail")
62
+ collect_vuln_data(name)
63
+ when "detail"
64
+ return unless in_tag("detaillist")
65
+ collect_vuln
66
+ when "detaillist"
67
+ report_vulns
68
+ when "host"
69
+ return unless in_tag("hostlist")
70
+ collect_host
71
+ when "hostlist"
72
+ report_hosts
73
+ when "id"
74
+ return unless in_tag("detaillist")
75
+ return unless in_tag("detail")
76
+ return unless in_tag("cve")
77
+ collect_vuln_data(name)
78
+ when "ip"
79
+ collect_ip
80
+ when "name"
81
+ if in_tag("hostlist") && in_tag("host")
82
+ collect_host_data(name)
83
+ elsif in_tag("detaillist") && in_tag("detail")
84
+ collect_vuln_data(name)
85
+ end
86
+ when "platform"
87
+ return unless in_tag("hostlist")
88
+ return unless in_tag("host")
89
+ collect_host_data(name)
90
+ when "portinfo"
91
+ return unless in_tag("portlist")
92
+ return unless in_tag("portlist-host")
93
+ collect_service
94
+ when "portlist"
95
+ report_services
96
+ when "portnumber", "protocol", "service"
97
+ return unless in_tag("portlist")
98
+ return unless in_tag("portlist-host")
99
+ return unless in_tag("portinfo")
100
+ collect_service_data(name)
101
+ when "report"
102
+ collect_product
103
+ end
104
+ @state[:current_tag].delete(name)
105
+ end
106
+
107
+ def record_hosts
108
+ @report_data[:hosts] = []
109
+ end
110
+
111
+ def record_services
112
+ @report_data[:services] = []
113
+ end
114
+
115
+ def record_vulns
116
+ @report_data[:vulns] = []
117
+ end
118
+
119
+ def record_host
120
+ @host = {}
121
+ end
122
+
123
+ def record_service
124
+ @service = {}
125
+ end
126
+
127
+ def record_vuln
128
+ @vuln = {}
129
+ @refs = []
130
+ end
131
+
132
+ def record_text
133
+ @state[:has_text] = true
134
+ end
135
+
136
+ def collect_host
137
+ @host[:host] = @state[:host]
138
+ @host[:name] = @state[:hname]
139
+ @host[:os_name] = @state[:os_name]
140
+ @host[:info] = @state[:pinfo]
141
+ @report_data[:hosts] << @host
142
+ end
143
+
144
+ def collect_service
145
+ @service[:host] = @state[:host]
146
+ @service[:port] = @state[:port]
147
+ @service[:proto] = @state[:proto]
148
+ @service[:name] = @state[:sname]
149
+ @service[:info] = @state[:pinfo]
150
+ @report_data[:services] << @service
151
+ end
152
+
153
+ def collect_vuln
154
+ @vuln[:host] = @state[:host]
155
+ @vuln[:name] = @state[:vname]
156
+ @vuln[:info] = @state[:vinfo]
157
+ @vuln[:refs] = @refs
158
+ @report_data[:vulns] << @vuln
159
+ end
160
+
161
+ def collect_product
162
+ @state[:has_text] = false
163
+ @state[:pinfo] = @text.strip if @text
164
+ @text = nil
165
+ end
166
+
167
+ def collect_ip
168
+ @state[:has_text] = false
169
+ @state[:host] = @text.strip if @text
170
+ @text = nil
171
+ end
172
+
173
+ def collect_host_data(name)
174
+ @state[:has_text] = false
175
+ if name == "name"
176
+ @state[:hname] = @text.strip if @text
177
+ elsif name == "platform"
178
+ if @text
179
+ @state[:os_name] = @text.strip
180
+ else
181
+ @state[:os_name] = Msf::OperatingSystems::UNKNOWN
182
+ end
183
+ end
184
+ @text = nil
185
+ end
186
+
187
+ def collect_service_data(name)
188
+ @state[:has_text] = false
189
+ if name == "portnumber"
190
+ @state[:port] = @text.strip if @text
191
+ elsif name == "protocol"
192
+ @state[:proto] = @text.strip.downcase if @text
193
+ elsif name == "service"
194
+ @state[:sname] = @text.strip if @text
195
+ end
196
+ @text = nil
197
+ end
198
+
199
+ def collect_vuln_data(name)
200
+ @state[:has_text] = false
201
+ if name == "name"
202
+ @state[:vname] = @text.strip if @text
203
+ elsif name == "description"
204
+ @state[:vinfo] = @text.strip if @text
205
+ elsif name == "information"
206
+ @state[:vinfo] << " #{@text.strip if @text}"
207
+ elsif name == "id"
208
+ @state[:ref] = @text.strip if @text
209
+ @refs << normalize_ref("CVE", @state[:ref])
210
+ end
211
+ @text = nil
212
+ end
213
+
214
+ def report_hosts
215
+ block = @block
216
+ @report_data[:hosts].each do |h|
217
+ db.emit(:address, h[:host], &block) if block
218
+ db_report(:host, h)
219
+ end
220
+ end
221
+
222
+ def report_services
223
+ block = @block
224
+ @report_data[:services].each do |s|
225
+ db.emit(:service, "#{s[:host]}:#{s[:port]}/#{s[:proto]}", &block) if block
226
+ db_report(:service, s)
227
+ end
228
+ end
229
+
230
+ def report_vulns
231
+ block = @block
232
+ @report_data[:vulns].each do |v|
233
+ db.emit(:vuln, ["#{v[:name]} (#{v[:host]})", 1], &block) if block
234
+ db_report(:vuln, v)
235
+ end
236
+ end
237
+
238
+ end
239
+ end
240
+ end