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,109 @@
1
+ # -*- coding: binary -*-
2
+ module Rex
3
+ module Parser
4
+
5
+
6
+ class NetSparkerXMLStreamParser
7
+
8
+ attr_accessor :on_found_vuln
9
+
10
+ def initialize(on_found_vuln = nil)
11
+ self.on_found_vuln = on_found_vuln if on_found_vuln
12
+ reset_state
13
+ end
14
+
15
+ def reset_state
16
+ @state = :generic_state
17
+ @vuln = {'info' => []}
18
+ @attr = {}
19
+ end
20
+
21
+ def tag_start(name, attributes)
22
+ @state = "in_#{name.downcase}".intern
23
+ @attr = attributes
24
+
25
+ case name
26
+ when "vulnerability"
27
+ @vuln = { 'info' => [] }
28
+ @vuln['confirmed'] = attributes['confirmed']
29
+ end
30
+ end
31
+
32
+ def text(str)
33
+ case @state
34
+ when :in_url
35
+ @vuln['url'] ||= ""
36
+ @vuln['url'] += str
37
+ when :in_type
38
+ @vuln['type'] ||= ""
39
+ @vuln['type'] += str
40
+ when :in_severity
41
+ @vuln['severity'] ||= ""
42
+ @vuln['severity'] += str
43
+ when :in_vulnerableparametertype
44
+ @vuln["vparam_type"] ||= ""
45
+ @vuln["vparam_type"] += str
46
+ when :in_vulnerableparameter
47
+ @vuln["vparam_name"] ||= ""
48
+ @vuln["vparam_name"] += str
49
+ when :in_vulnerableparametervalue
50
+ @vuln["vparam_value"] ||= ""
51
+ @vuln["vparam_value"] += str
52
+ when :in_rawrequest
53
+ @vuln["request"] ||= ""
54
+ @vuln["request"] += str
55
+ when :in_rawresponse
56
+ @vuln["response"] ||= ""
57
+ @vuln["response"] += str
58
+ when :in_info
59
+ # <info name="Identified Internal Path(s)">C:\AppServ\www\test-apps\dokeos\main\inc\banner.inc.php</info>
60
+ if not str.to_s.strip.empty?
61
+ @vuln['info'] << [@attr['name'] || "Information", str]
62
+ end
63
+ when :in_netsparker
64
+ when :in_target
65
+ when :in_scantime
66
+ when :generic_state
67
+ when :in_vulnerability
68
+ when :in_extrainformation
69
+ else
70
+ # $stderr.puts "unknown state: #{@state}"
71
+ end
72
+ end
73
+
74
+ def tag_end(name)
75
+ case name
76
+ when "vulnerability"
77
+ @vuln.keys.each do |k|
78
+ @vuln[k] = @vuln[k].strip if @vuln[k].kind_of?(::String)
79
+ end
80
+ on_found_vuln.call(@vuln) if on_found_vuln
81
+ reset_state
82
+ end
83
+ end
84
+
85
+ # We don't need these methods, but they're necessary to keep REXML happy
86
+ def xmldecl(version, encoding, standalone); end
87
+ def cdata(data)
88
+ puts "cdata for #{@state} (#{data.length})"
89
+ case @state
90
+ when :in_rawresponse
91
+ @vuln["response"] = data
92
+ when :in_rawrequest
93
+ @vuln["request"] = data
94
+ when :in_info
95
+ if not data.to_s.strip.empty?
96
+ @vuln['info'] << [@attr['name'] || "Information", data]
97
+ end
98
+ end
99
+ end
100
+
101
+ def comment(str); end
102
+ def instruction(name, instruction); end
103
+ def attlist; end
104
+ end
105
+ end
106
+ end
107
+
108
+ __END__
109
+
@@ -0,0 +1,686 @@
1
+ # -*- coding: binary -*-
2
+ require "rex/parser/nokogiri_doc_mixin"
3
+ require "date"
4
+
5
+ module Rex
6
+ module Parser
7
+
8
+ # If Nokogiri is available, define Template document class.
9
+ load_nokogiri && class NexposeRawDocument < Nokogiri::XML::SAX::Document
10
+
11
+ include NokogiriDocMixin
12
+
13
+ attr_reader :tests
14
+
15
+ NEXPOSE_HOST_DETAIL_FIELDS = %W{ nx_device_id nx_site_name nx_site_importance nx_scan_template nx_risk_score }
16
+ NEXPOSE_VULN_DETAIL_FIELDS = %W{
17
+ nx_scan_id
18
+ nx_vulnerable_since
19
+ nx_pci_compliance_status
20
+ }
21
+
22
+ # Triggered every time a new element is encountered. We keep state
23
+ # ourselves with the @state variable, turning things on when we
24
+ # get here (and turning things off when we exit in end_element()).
25
+ def start_element(name=nil,attrs=[])
26
+ attrs = normalize_attrs(attrs)
27
+ block = @block
28
+ @state[:current_tag][name] = true
29
+ case name
30
+ when "nodes" # There are two main sections, nodes and VulnerabilityDefinitions
31
+ @tests = {}
32
+ when "node"
33
+ record_host(attrs)
34
+ when "name"
35
+ @state[:has_text] = true
36
+ when "endpoint"
37
+ @state.delete(:cached_service_object)
38
+ record_service(attrs)
39
+ when "service"
40
+ record_service_info(attrs)
41
+ when "fingerprint"
42
+ record_service_fingerprint(attrs)
43
+ when "os"
44
+ record_os_fingerprint(attrs)
45
+ when "test" # All the vulns tested for
46
+ @state[:has_text] = true
47
+ record_host_test(attrs)
48
+ record_service_test(attrs)
49
+ when "vulnerability"
50
+ record_vuln(attrs)
51
+ when "reference"
52
+ @state[:has_text] = true
53
+ record_reference(attrs)
54
+ when "description"
55
+ @state[:has_text] = true
56
+ record_vuln_description(attrs)
57
+ when "solution"
58
+ @state[:has_text] = true
59
+ record_vuln_solution(attrs)
60
+ when "tag"
61
+ @state[:has_text] = true
62
+ when "tags"
63
+ @state[:tags] = []
64
+ #
65
+ # These are markup tags only present within description/solutions
66
+ #
67
+ when "ContainerBlockElement", # Overall container, no formatting
68
+ "Paragraph", # <Paragraph preformat="true">
69
+ "UnorderedList", # List container (bulleted)
70
+ "ListItem", # List item
71
+ "URLLink" # <URLLink LinkURL="http://support.microsoft.com/kb/887429" LinkTitle="http://support.microsoft.com/kb/887429" href="http://support.microsoft.com/kb/887429">KB 887429</URLLink>
72
+
73
+ record_formatted_content(name, attrs)
74
+
75
+ end
76
+ end
77
+
78
+ # When we exit a tag, this is triggered.
79
+ def end_element(name=nil)
80
+ block = @block
81
+ case name
82
+ when "node" # Wrap it up
83
+ collect_host_data
84
+ host_object = report_host &block
85
+ report_services(host_object)
86
+ report_fingerprint(host_object)
87
+ # Reset the state once we close a host
88
+ @state.delete_if {|k| k.to_s !~ /^(current_tag|in_nodes)$/}
89
+ @report_data = {:wspace => @args[:wspace]}
90
+ when "name"
91
+ collect_hostname
92
+ @state[:has_text] = false
93
+ @text = nil
94
+ when "endpoint"
95
+ collect_service_data
96
+ @state.delete(:cached_service_object)
97
+ when "os"
98
+ collect_os_fingerprints
99
+ when "test"
100
+ report_test(&block)
101
+ @state[:has_text] = false
102
+ @text = nil
103
+ when "vulnerability"
104
+ collect_vuln_info
105
+ report_vuln(&block)
106
+ @state.delete_if {|k| k.to_s !~ /^(current_tag|in_vulndefs)$/}
107
+ when "reference"
108
+ @state[:has_text] = false
109
+ collect_reference
110
+ @text = nil
111
+ when "description"
112
+ @state[:has_text] = false
113
+ collect_vuln_description
114
+ @text = nil
115
+ when "solution"
116
+ @state[:has_text] = false
117
+ collect_vuln_solution
118
+ @text = nil
119
+ when "tag"
120
+ @state[:has_text] = false
121
+ collect_tag
122
+ @text = nil
123
+ when "tags"
124
+ @report_data[:vuln_tags] = @state[:tags]
125
+ @state.delete(:tags)
126
+ #
127
+ # These are markup tags only present within description/solutions
128
+ #
129
+ when "ContainerBlockElement", # Overall container, no formatting
130
+ "Paragraph", # <Paragraph preformat="true">
131
+ "UnorderedList", # List container (bulleted)
132
+ "ListItem", # List item
133
+ "URLLink" # <URLLink LinkURL="http://support.microsoft.com/kb/887429" LinkTitle="http://support.microsoft.com/kb/887429" href="http://support.microsoft.com/kb/887429">KB 887429</URLLink>
134
+
135
+ collect_formatted_content(name)
136
+ end
137
+ @state[:current_tag].delete name
138
+ end
139
+
140
+ def collect_reference
141
+ return unless in_tag("references")
142
+ return unless in_tag("vulnerability")
143
+ return unless @state[:vuln]
144
+ @state[:ref][:value] = @text.to_s.strip
145
+ @report_data[:refs] ||= []
146
+ @report_data[:refs] << @state[:ref]
147
+ @state[:ref] = nil
148
+ end
149
+
150
+ def collect_vuln_description
151
+ return unless in_tag("description")
152
+ return unless in_tag("vulnerability")
153
+ return unless @state[:vuln]
154
+ @report_data[:vuln_description] = clean_formatted_text( @report_data[:vuln_description_stack].join.strip )
155
+ end
156
+
157
+ def collect_vuln_solution
158
+ return unless in_tag("solution")
159
+ return unless in_tag("vulnerability")
160
+ return unless @state[:vuln]
161
+ @report_data[:vuln_solution] = clean_formatted_text( @report_data[:vuln_solution_stack].join.strip )
162
+ end
163
+
164
+ def collect_tag
165
+ return unless in_tag("tag")
166
+ return unless in_tag("tags")
167
+ return unless in_tag("vulnerability")
168
+ return unless @state[:vuln]
169
+ @state[:tags] ||= []
170
+ @state[:tags] << @text.to_s.strip
171
+ end
172
+
173
+ def collect_vuln_info
174
+ return unless in_tag("VulnerabilityDefinitions")
175
+ return unless in_tag("vulnerability")
176
+ return unless @state[:vuln]
177
+ vuln = @state[:vuln]
178
+ vuln[:refs] = @report_data[:refs]
179
+ @report_data[:vuln] = vuln
180
+ @state[:vuln] = nil
181
+ @report_data[:refs] = nil
182
+ end
183
+
184
+ def report_vuln(&block)
185
+ return unless in_tag("VulnerabilityDefinitions")
186
+ return unless @report_data[:vuln]
187
+ return unless @report_data[:vuln][:matches].kind_of? Array
188
+
189
+ ::ActiveRecord::Base.connection_pool.with_connection {
190
+
191
+ refs = normalize_references(@report_data[:vuln][:refs])
192
+ refs << "NEXPOSE-#{report_data[:vuln]["id"]}"
193
+ vuln_instances = @report_data[:vuln][:matches].size
194
+ db.emit(:vuln, [refs.last,vuln_instances], &block) if block
195
+
196
+ vuln_ids = @report_data[:vuln][:matches].map{ |v| v[0] }
197
+ vdet_ids = @report_data[:vuln][:matches].map{ |v| v[1] }
198
+
199
+ refs = refs.uniq.map{|x| db.find_or_create_ref(:name => x) }
200
+
201
+ # Assign title and references to all vuln_ids
202
+ # Mass update fails due to the join table || ::Mdm::Vuln.where(:id => vuln_ids).update_all({ :name => @report_data[:vuln]["title"], :refs => refs } )
203
+ vuln_ids.each do |vid|
204
+ vuln = ::Mdm::Vuln.find(vid)
205
+ next unless vuln
206
+ vuln.name = @report_data[:vuln]["title"]
207
+
208
+ if refs.length > 0
209
+ vuln.refs += refs
210
+ end
211
+
212
+ if vuln.changed?
213
+ vuln.save!
214
+ end
215
+ end
216
+
217
+ # Mass update vulnerability details across the database based on conditions
218
+ vdet_info = { :title => @report_data[:vuln]["title"] }
219
+ vdet_info[:description] = @report_data[:vuln_description] unless @report_data[:vuln_description].to_s.empty?
220
+ vdet_info[:solution] = @report_data[:vuln_solution] unless @report_data[:vuln_solution].to_s.empty?
221
+ vdet_info[:nx_tags] = @report_data[:vuln_tags].sort.uniq.join(", ") if ( @report_data[:vuln_tags].kind_of?(::Array) and @report_data[:vuln_tags].length > 0 )
222
+ vdet_info[:nx_severity] = @report_data[:vuln]["severity"].to_f if @report_data[:vuln]["severity"]
223
+ vdet_info[:nx_pci_severity] = @report_data[:vuln]["pciSeverity"].to_f if @report_data[:vuln]["pciSeverity"]
224
+ vdet_info[:cvss_score] = @report_data[:vuln]["cvssScore"].to_f if @report_data[:vuln]["cvssScore"]
225
+ vdet_info[:cvss_vector] = @report_data[:vuln]["cvssVector"] if @report_data[:vuln]["cvssVector"]
226
+
227
+ %W{ published added modified }.each do |tf|
228
+ next if not @report_data[:vuln][tf]
229
+ ts = DateTime.parse(@report_data[:vuln][tf]) rescue nil
230
+ next if not ts
231
+ vdet_info[ "nx_#{tf}".to_sym ] = ts
232
+ end
233
+
234
+ ::Mdm::VulnDetail.where(:id => vdet_ids).update_all(vdet_info)
235
+
236
+ @report_data[:vuln] = nil
237
+
238
+ }
239
+ end
240
+
241
+ def record_reference(attrs)
242
+ return unless in_tag("VulnerabilityDefinitions")
243
+ return unless in_tag("vulnerability")
244
+ @state[:ref] = attr_hash(attrs)
245
+ end
246
+
247
+ def record_vuln(attrs)
248
+ return unless in_tag("VulnerabilityDefinitions")
249
+ vuln = attr_hash(attrs)
250
+ matching_tests = @tests[ vuln["id"].downcase ]
251
+ return unless matching_tests
252
+ return if matching_tests.empty?
253
+ @state[:vuln] = vuln
254
+ @state[:vuln][:matches] = matching_tests
255
+ end
256
+
257
+ def record_vuln_description(attrs)
258
+ @report_data[:vuln_description_stack] = []
259
+ end
260
+
261
+ def record_vuln_solution(attrs)
262
+ @report_data[:vuln_solution_stack] = []
263
+ end
264
+
265
+
266
+ def record_formatted_content(name, eattrs)
267
+ attrs = attr_hash(eattrs)
268
+ stack = nil
269
+
270
+ if in_tag("solution")
271
+ stack = @report_data[:vuln_solution_stack]
272
+ end
273
+
274
+ if in_tag("description")
275
+ stack = @report_data[:vuln_description_stack]
276
+ end
277
+
278
+ if in_tag("test")
279
+ stack = @report_data[:vuln_proof_stack]
280
+ end
281
+
282
+ return if not stack
283
+
284
+ @report_data[:formatted_indent] ||= 0
285
+
286
+ data = @text.to_s.strip.split(/\n+/).map{|t| t.strip}.join(" ")
287
+ @text = ""
288
+
289
+ case name
290
+ when 'ListItem'
291
+ @report_data[:formatted_indent] = 1
292
+ # data = "\n* " + data
293
+ when 'URLLink'
294
+ @report_data[:formatted_link] = attrs["LinkURL"]
295
+ else
296
+
297
+ if @report_data[:formatted_indent] > 1
298
+ data = (" " * (@report_data[:formatted_indent])) + data
299
+ end
300
+
301
+ if @report_data[:formatted_indent] == 1
302
+ @report_data[:formatted_indent] = 6
303
+ end
304
+ end
305
+
306
+ if data.length > 0
307
+ stack << data
308
+ end
309
+ end
310
+
311
+ def collect_formatted_content(name)
312
+ stack = nil
313
+ prefix = ""
314
+
315
+ if in_tag("solution")
316
+ stack = @report_data[:vuln_solution_stack]
317
+ end
318
+
319
+ if in_tag("description")
320
+ stack = @report_data[:vuln_description_stack]
321
+ end
322
+
323
+ if in_tag("test")
324
+ stack = @report_data[:vuln_proof_stack]
325
+ end
326
+
327
+ return if not stack
328
+
329
+ data = @text.to_s.strip.split(/\n+/).map{|t| t.strip}.join(" ")
330
+ @text = ""
331
+
332
+ case name
333
+ when 'URLLink'
334
+ if @report_data[:formatted_link]
335
+ if data != @report_data[:formatted_link]
336
+ if data.empty?
337
+ data << (" " + @report_data[:formatted_link])
338
+ else
339
+ data = " " + data + " ( " + @report_data[:formatted_link] + " )"
340
+ end
341
+ end
342
+ end
343
+ when 'Paragraph'
344
+ data << "\n\n"
345
+ when 'ListItem'
346
+ @report_data[:formatted_indent] = 0
347
+ data << "\n"
348
+ end
349
+
350
+ if data.length > 0
351
+ stack << data
352
+ end
353
+ end
354
+
355
+ # XML Export 2.0 includes additional test keys:
356
+ # <test id="unix-unowned-files-or-dirs" status="vulnerable-exploited" scan-id="6381" vulnerable-since="20120322T124352665" pci-compliance-status="pass">
357
+
358
+ def report_test
359
+ return unless in_tag("nodes")
360
+ return unless in_tag("node")
361
+ return unless @state[:test]
362
+
363
+ vuln_info = {
364
+ :workspace => @args[:wspace],
365
+ # This name will be overwritten during the vuln definition
366
+ # parsing via mass-update.
367
+ :name => "NEXPOSE-" + @state[:test][:id].downcase,
368
+ :host => @state[:cached_host_object] || @state[:address]
369
+ }
370
+
371
+ if in_tag("endpoint") and @state[:test][:port]
372
+ # Verify this port actually has some relation to our tracked state
373
+ # since it may not due to greedy vulnerability matching
374
+ if @state[:cached_service_object] and @state[:cached_service_object].port.to_i == @state[:test][:port].to_i
375
+ vuln_info[:service] = @state[:cached_service_object]
376
+ else
377
+ vuln_info[:port] = @state[:test][:port]
378
+ vuln_info[:proto] = @state[:test][:protocol] if @state[:test][:protocol]
379
+ end
380
+ end
381
+
382
+ # This hash feeds a vuln_details row for this vulnerability
383
+ vdet = { :src => 'nexpose', :nx_vuln_id => @state[:test][:id] }
384
+
385
+ # This hash defines the matching criteria to overwrite an existing entry
386
+ vkey = { :src => 'nexpose', :nx_vuln_id => @state[:test][:id] }
387
+
388
+ if @state[:nx_device_id]
389
+ vdet[:nx_device_id] = @state[:nx_device_id]
390
+ vkey[:nx_device_id] = @state[:nx_device_id]
391
+ end
392
+
393
+ if @state[:test][:key]
394
+ vdet[:nx_proof_key] = @state[:test][:key]
395
+ vkey[:nx_proof_key] = @state[:test][:key]
396
+ end
397
+
398
+ vdet[:nx_console_id] = @nx_console_id if @nx_console_id
399
+ vdet[:nx_vuln_status] = @state[:test][:status] if @state[:test][:status]
400
+
401
+ vdet[:nx_scan_id] = @state[:test][:nx_scan_id] if @state[:test][:nx_scan_id]
402
+ vdet[:nx_pci_compliance_status] = @state[:test][:nx_pci_compliance_status] if @state[:test][:nx_pci_compliance_status]
403
+
404
+ if @state[:test][:nx_vulnerable_since]
405
+ ts = ::DateTime.parse(@state[:test][:nx_vulnerable_since]) rescue nil
406
+ vdet[:nx_vulnerable_since] = ts if ts
407
+ end
408
+
409
+ proof = clean_formatted_text(@report_data[:vuln_proof_stack].join.strip)
410
+ @report_data[:vuln_proof_stack] = []
411
+
412
+ vuln_info[:info] = proof
413
+ vdet[:proof] = proof
414
+
415
+ # Configure the find key for vuln_details
416
+ vdet[:key] = vkey
417
+
418
+ # Pass this key to the vuln hash to find existing entries
419
+ # that may have been renamed (re-import nexpose vulns)
420
+ vuln_info[:details_match] = vkey
421
+
422
+ ::ActiveRecord::Base.connection_pool.with_connection {
423
+
424
+ # Report the vulnerability
425
+ vuln = db.report_vuln(vuln_info)
426
+
427
+ if vuln
428
+ # Report the vulnerability details
429
+ detail = db.report_vuln_details(vuln, vdet)
430
+
431
+ # Cache returned host and service objects if necessary
432
+ @state[:cached_host_object] ||= vuln.host
433
+
434
+ # The vuln.service may be found via greedy matching
435
+ if in_tag("endpoint") and vuln.service
436
+ @state[:cached_service_object] ||= vuln.service
437
+ end
438
+
439
+ # Record the ID of this vuln for a future mass update that
440
+ # brings in title, risk, description, solution, etc
441
+ @tests[ @state[:test][:id].downcase ] ||= []
442
+ @tests[ @state[:test][:id].downcase ] << [ vuln.id, detail.id ]
443
+ end
444
+
445
+ }
446
+ @state[:test] = nil
447
+ end
448
+
449
+ def record_os_fingerprint(attrs)
450
+ return unless in_tag("nodes")
451
+ return unless in_tag("fingerprints")
452
+ return unless in_tag("node")
453
+ return if in_tag("service")
454
+ @state[:os] = attr_hash(attrs)
455
+ end
456
+
457
+ # Just keep the highest scoring, which is usually the most vague. :(
458
+ def collect_os_fingerprints
459
+ @report_data[:os] ||= {}
460
+ return unless @state[:os]["certainty"].to_f > 0
461
+ return if @report_data[:os]["os_certainty"].to_f > @state[:os]["certainty"].to_f
462
+ @report_data[:os] = {} # Zero it out if we're replacing it.
463
+ @report_data[:os]["os_certainty"] = @state[:os]["certainty"]
464
+ @report_data[:os]["os_vendor"] = @state[:os]["vendor"]
465
+ @report_data[:os]["os_family"] = @state[:os]["family"]
466
+ @report_data[:os]["os_product"] = @state[:os]["product"]
467
+ @report_data[:os]["os_version"] = @state[:os]["version"]
468
+ @report_data[:os]["os_arch"] = @state[:os]["arch"]
469
+ end
470
+
471
+ # Just taking the first one.
472
+ def collect_hostname
473
+ if in_tag("node")
474
+ @state[:hostname] ||= @text.to_s.strip if @text
475
+ @text = nil
476
+ end
477
+ end
478
+
479
+ def record_service_fingerprint(attrs)
480
+ return unless in_tag("nodes")
481
+ return unless in_tag("node")
482
+ return unless in_tag("service")
483
+ return unless in_tag("fingerprint")
484
+ @state[:service_fingerprint] = attr_hash(attrs)
485
+ end
486
+
487
+ def record_service_info(attrs)
488
+ return unless in_tag("nodes")
489
+ return unless in_tag("node")
490
+ return unless in_tag("service")
491
+ @state[:service].merge! attr_hash(attrs)
492
+ end
493
+
494
+ def report_fingerprint(host_object)
495
+ return unless host_object.kind_of? ::Mdm::Host
496
+ return unless @report_data[:os].kind_of? Hash
497
+ note = {
498
+ :workspace => host_object.workspace,
499
+ :host => host_object,
500
+ :type => "host.os.nexpose_fingerprint",
501
+ :data => {
502
+ :family => @report_data[:os]["os_family"],
503
+ :certainty => @report_data[:os]["os_certainty"]
504
+ }
505
+ }
506
+ note[:data][:vendor] = @report_data[:os]["os_vendor"] if @report_data[:os]["os_vendor"]
507
+ note[:data][:product] = @report_data[:os]["os_product"] if @report_data[:os]["os_prduct"]
508
+ note[:data][:version] = @report_data[:os]["os_version"] if @report_data[:os]["os_version"]
509
+ note[:data][:arch] = @report_data[:os]["os_arch"] if @report_data[:os]["os_arch"]
510
+ db_report(:note, note)
511
+ end
512
+
513
+ def report_services(host_object)
514
+ return unless host_object.kind_of? ::Mdm::Host
515
+ return unless @report_data[:ports]
516
+ return if @report_data[:ports].empty?
517
+ reported = []
518
+ @report_data[:ports].each do |svc|
519
+ reported << db_report(:service, svc.merge(:host => host_object))
520
+ end
521
+ reported
522
+ end
523
+
524
+ def record_service(attrs)
525
+ return unless in_tag("nodes")
526
+ return unless in_tag("node")
527
+ return unless in_tag("endpoint")
528
+ @state[:service] = attr_hash(attrs)
529
+ end
530
+
531
+ def collect_service_data
532
+ return unless in_tag("node")
533
+ return unless in_tag("endpoint")
534
+ port_hash = {}
535
+ @report_data[:ports] ||= []
536
+ @state[:service].each do |k,v|
537
+ case k
538
+ when "protocol"
539
+ port_hash[:proto] = v
540
+ when "port"
541
+ port_hash[:port] = v
542
+ when "status"
543
+ port_hash[:status] = (v == "open" ? Msf::ServiceState::Open : Msf::ServiceState::Closed)
544
+ end
545
+ end
546
+ if @state[:service]
547
+ if state[:service]["name"] == "<unknown>"
548
+ sname = nil
549
+ else
550
+ sname = db.service_name_map(@state[:service]["name"])
551
+ end
552
+ port_hash[:name] = sname
553
+ end
554
+ if @state[:service_fingerprint]
555
+ info = []
556
+ info << @state[:service_fingerprint]["product"] if @state[:service_fingerprint]["product"]
557
+ info << @state[:service_fingerprint]["version"] if @state[:service_fingerprint]["version"]
558
+ port_hash[:info] = info.join(" ") if info[0]
559
+ end
560
+ @report_data[:ports] << port_hash.clone
561
+ @state.delete :service_fingerprint
562
+ @state.delete :service
563
+ @report_data[:ports]
564
+ end
565
+
566
+ def actually_vulnerable(test)
567
+ return false unless test.has_key? "status"
568
+ return false unless test.has_key? "id"
569
+ ['vulnerable-exploited', 'vulnerable-version', 'potential'].include? test["status"]
570
+ end
571
+
572
+ def record_host_test(attrs)
573
+ return unless in_tag("nodes")
574
+ return unless in_tag("node")
575
+ return if in_tag("service")
576
+ return unless in_tag("tests")
577
+
578
+ test = attr_hash(attrs)
579
+ return unless actually_vulnerable(test)
580
+ @state[:test] = {:id => test["id"].downcase}
581
+ @state[:test][:key] = test["key"] if test["key"]
582
+ @state[:test][:nx_scan_id] = test["scan-id"] if test["scan-id"]
583
+ @state[:test][:nx_vulnerable_since] = test["vulnerable-since"] if test["vulnerable-since"]
584
+ @state[:test][:nx_pci_compliance_status] = test["pci-compliance-status"] if test["pci-compliance-status"]
585
+
586
+ @report_data[:vuln_proof_stack] = []
587
+ end
588
+
589
+ def record_service_test(attrs)
590
+ return unless in_tag("nodes")
591
+ return unless in_tag("node")
592
+ return unless in_tag("service")
593
+ return unless in_tag("tests")
594
+ test = attr_hash(attrs)
595
+ return unless actually_vulnerable(test)
596
+ @state[:test] = {
597
+ :id => test["id"].downcase,
598
+ :port => @state[:service]["port"],
599
+ :protocol => @state[:service]["protocol"],
600
+ }
601
+ @state[:test][:key] = test["key"] if test["key"]
602
+ @state[:test][:status] = test["status"] if test["status"]
603
+ @state[:test][:nx_scan_id] = test["scan-id"] if test["scan-id"]
604
+ @state[:test][:nx_vulnerable_since] = test["vulnerable-since"] if test["vulnerable-since"]
605
+ @state[:test][:nx_pci_compliance_status] = test["pci-compliance-status"] if test["pci-compliance-status"]
606
+ @report_data[:vuln_proof_stack] = []
607
+ end
608
+
609
+ def record_host(attrs)
610
+ return unless in_tag("nodes")
611
+ host_attrs = attr_hash(attrs)
612
+ if host_attrs["status"] == "alive"
613
+ @state[:host_is_alive] = true
614
+ @state[:address] = host_attrs["address"]
615
+ @state[:mac] = host_attrs["hardware-address"] if host_attrs["hardware-address"]
616
+
617
+ NEXPOSE_HOST_DETAIL_FIELDS.each do |f|
618
+ fs = f.to_sym
619
+ fk = f.sub(/^nx_/, '').gsub('_', '-')
620
+ if host_attrs[fk]
621
+ @state[fs] = host_attrs[fk]
622
+ end
623
+ end
624
+ end
625
+ end
626
+
627
+ def collect_host_data
628
+ return unless in_tag("node")
629
+ @report_data[:host] = @state[:address]
630
+ @report_data[:state] = Msf::HostState::Alive
631
+ @report_data[:name] = @state[:hostname] if @state[:hostname]
632
+ if @state[:mac]
633
+ if @state[:mac] =~ /[0-9a-fA-f]{12}/
634
+ @report_data[:mac] = @state[:mac].scan(/.{2}/).join(":")
635
+ else
636
+ @report_data[:mac] = @state[:mac]
637
+ end
638
+ end
639
+
640
+ NEXPOSE_HOST_DETAIL_FIELDS.each do |f|
641
+ v = @state[f.to_sym]
642
+ @report_data[f.to_sym] = v if v
643
+ end
644
+ end
645
+
646
+ def report_host(&block)
647
+ if host_is_okay
648
+ db.emit(:address,@report_data[:host],&block) if block
649
+ device_id = @report_data[:nx_device_id]
650
+
651
+ host_object = db_report(:host, @report_data.merge(:workspace => @args[:wspace] ) )
652
+ if host_object
653
+ db.report_import_note(host_object.workspace, host_object)
654
+ if device_id
655
+ detail = {
656
+ :key => { :src => 'nexpose' },
657
+ :src => 'nexpose',
658
+ :nx_device_id => device_id
659
+ }
660
+ detail[:nx_console_id] = @nx_console_id if @nx_console_id
661
+
662
+ NEXPOSE_HOST_DETAIL_FIELDS.each do |f|
663
+ v = @report_data.delete(f.to_sym)
664
+ detail[f.to_sym] = v if v
665
+ end
666
+
667
+
668
+ db.report_host_details(host_object, detail)
669
+ end
670
+ end
671
+ host_object
672
+ end
673
+ end
674
+
675
+ def clean_formatted_text(txt)
676
+ txt.split(/\n/).map{ |t|
677
+ t.sub(/^\s+$/, '').
678
+ sub(/^(\s{6,20})/, ' ')
679
+ }.join("\n").gsub(/\n{4,10}/, "\n\n\n")
680
+ end
681
+
682
+ end
683
+
684
+ end
685
+ end
686
+