rex 1.0.2 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +22 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -3
  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 +321 -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. data/rex.gemspec +20 -0
  492. metadata +528 -98
  493. data/CHANGELOG.rdoc +0 -7
  494. data/DOCUMENTATION.en.rdoc +0 -215
  495. data/DOCUMENTATION.ja.rdoc +0 -205
  496. data/Manifest.txt +0 -37
  497. data/README.ja +0 -73
  498. data/README.rdoc +0 -53
  499. data/Rakefile +0 -28
  500. data/bin/rex +0 -18
  501. data/lib/rex/generator.rb +0 -523
  502. data/lib/rex/info.rb +0 -16
  503. data/lib/rex/rexcmd.rb +0 -136
  504. data/sample/a.cmd +0 -1
  505. data/sample/b.cmd +0 -1
  506. data/sample/c.cmd +0 -4
  507. data/sample/calc3.racc +0 -47
  508. data/sample/calc3.rex +0 -15
  509. data/sample/calc3.rex.rb +0 -94
  510. data/sample/calc3.tab.rb +0 -188
  511. data/sample/error1.rex +0 -15
  512. data/sample/error2.rex +0 -15
  513. data/sample/sample.html +0 -32
  514. data/sample/sample.rex +0 -15
  515. data/sample/sample.rex.rb +0 -100
  516. data/sample/sample.xhtml +0 -32
  517. data/sample/sample1.c +0 -9
  518. data/sample/sample1.rex +0 -43
  519. data/sample/sample2.bas +0 -4
  520. data/sample/sample2.rex +0 -33
  521. data/sample/simple.html +0 -7
  522. data/sample/simple.xhtml +0 -10
  523. data/sample/xhtmlparser.racc +0 -66
  524. data/sample/xhtmlparser.rex +0 -72
  525. data/test/assets/test.rex +0 -12
  526. data/test/rex-20060125.rb +0 -152
  527. data/test/rex-20060511.rb +0 -143
  528. data/test/test_generator.rb +0 -184
@@ -0,0 +1,394 @@
1
+ # -*- coding: binary -*-
2
+ require "rex/parser/nokogiri_doc_mixin"
3
+
4
+ module Rex
5
+ module Parser
6
+
7
+ # If Nokogiri is available, define Nmap document class.
8
+ load_nokogiri && class NmapDocument < Nokogiri::XML::SAX::Document
9
+
10
+ include NokogiriDocMixin
11
+
12
+ def determine_port_state(v)
13
+ case v
14
+ when "open"
15
+ Msf::ServiceState::Open
16
+ when "closed"
17
+ Msf::ServiceState::Closed
18
+ when "filtered"
19
+ Msf::ServiceState::Filtered
20
+ when "unknown"
21
+ Msf::ServiceState::Unknown
22
+ end
23
+ end
24
+
25
+ # Compare OS fingerprinting data
26
+ def better_os_match(orig_hash,new_hash)
27
+ return false unless new_hash.has_key? "accuracy"
28
+ return true unless orig_hash.has_key? "accuracy"
29
+ new_hash["accuracy"].to_i > orig_hash["accuracy"].to_i
30
+ end
31
+
32
+ # Triggered every time a new element is encountered. We keep state
33
+ # ourselves with the @state variable, turning things on when we
34
+ # get here (and turning things off when we exit in end_element()).
35
+ def start_element(name=nil,attrs=[])
36
+ attrs = normalize_attrs(attrs)
37
+ block = @block
38
+ @state[:current_tag][name] = true
39
+ case name
40
+ when "status"
41
+ record_host_status(attrs)
42
+ when "address"
43
+ record_address(attrs)
44
+ when "osclass"
45
+ record_host_osclass(attrs)
46
+ when "osmatch"
47
+ record_host_osmatch(attrs)
48
+ when "uptime"
49
+ record_host_uptime(attrs)
50
+ when "hostname"
51
+ record_hostname(attrs)
52
+ when "port"
53
+ record_port(attrs)
54
+ when "state"
55
+ record_port_state(attrs)
56
+ when "service"
57
+ record_port_service(attrs)
58
+ when "script" # Not actually used in import?
59
+ record_port_script(attrs)
60
+ record_host_script(attrs)
61
+ # Ignoring post scripts completely
62
+ when "trace"
63
+ record_host_trace(attrs)
64
+ when "hop"
65
+ record_host_hop(attrs)
66
+ end
67
+ end
68
+
69
+ # When we exit a tag, this is triggered.
70
+ def end_element(name=nil)
71
+ block = @block
72
+ case name
73
+ when "os"
74
+ collect_os_data
75
+ @state[:os] = {}
76
+ when "port"
77
+ collect_port_data
78
+ @state[:port] = {}
79
+ when "host" # Roll everything up now
80
+ collect_host_data
81
+ host_object = report_host &block
82
+ if host_object
83
+ db.report_import_note(@args[:wspace],host_object)
84
+ report_services(host_object,&block)
85
+ report_fingerprint(host_object)
86
+ report_uptime(host_object)
87
+ report_traceroute(host_object)
88
+ end
89
+ @state.delete_if {|k| k != :current_tag}
90
+ @report_data = {:wspace => @args[:wspace]}
91
+ end
92
+ @state[:current_tag].delete name
93
+ end
94
+
95
+ # We can certainly get fancier with self.send() magic, but
96
+ # leaving this pretty simple for now.
97
+
98
+ def record_host_hop(attrs)
99
+ return unless in_tag("host")
100
+ return unless in_tag("trace")
101
+ hops = attr_hash(attrs)
102
+ hops["name"] = hops.delete "host"
103
+ @state[:trace][:hops] << hops
104
+ end
105
+
106
+ def record_host_trace(attrs)
107
+ return unless in_tag("host")
108
+ @state[:trace] = attr_hash(attrs)
109
+ @state[:trace][:hops] = []
110
+ end
111
+
112
+ def record_host_uptime(attrs)
113
+ return unless in_tag("host")
114
+ @state[:uptime] = attr_hash(attrs)
115
+ end
116
+
117
+ def record_host_osmatch(attrs)
118
+ return unless in_tag("host")
119
+ return unless in_tag("os")
120
+ temp_hash = attr_hash(attrs)
121
+ if temp_hash["accuracy"].to_i == 100
122
+ @state[:os] ||= {}
123
+ @state[:os]["osmatch"] = temp_hash["name"]
124
+ end
125
+ end
126
+
127
+ def record_host_osclass(attrs)
128
+ return unless in_tag("host")
129
+ return unless in_tag("os")
130
+ @state[:os] ||= {}
131
+ temp_hash = attr_hash(attrs)
132
+ if better_os_match(@state[:os],temp_hash)
133
+ @state[:os] = temp_hash
134
+ end
135
+ end
136
+
137
+ def record_hostname(attrs)
138
+ return unless in_tag("host")
139
+ if attr_hash(attrs)["type"] == "PTR"
140
+ @state[:hostname] = attr_hash(attrs)["name"]
141
+ end
142
+ end
143
+
144
+ def record_host_script(attrs)
145
+ return unless in_tag("host")
146
+ return if in_tag("port")
147
+ temp_hash = attr_hash(attrs)
148
+
149
+ if temp_hash["id"] and temp_hash["output"]
150
+ @state[:scripts] ||= []
151
+ @state[:scripts] << { temp_hash["id"] => temp_hash["output"] }
152
+ end
153
+ end
154
+
155
+ def record_port_script(attrs)
156
+ return unless in_tag("host")
157
+ return unless in_tag("port")
158
+ temp_hash = attr_hash(attrs)
159
+ if temp_hash["id"] and temp_hash["output"]
160
+ @state[:port][:scripts] ||= []
161
+ @state[:port][:scripts] << { temp_hash["id"] => temp_hash["output"] }
162
+ end
163
+ end
164
+
165
+ def record_port_service(attrs)
166
+ return unless in_tag("host")
167
+ return unless in_tag("port")
168
+ svc = attr_hash(attrs)
169
+ if svc["name"] && @args[:fix_services]
170
+ svc["name"] = db.nmap_msf_service_map(svc["name"])
171
+ end
172
+ @state[:port] = @state[:port].merge(svc)
173
+ end
174
+
175
+ def record_port_state(attrs)
176
+ return unless in_tag("host")
177
+ return unless in_tag("port")
178
+ temp_hash = attr_hash(attrs)
179
+ @state[:port] = @state[:port].merge(temp_hash)
180
+ end
181
+
182
+ def record_port(attrs)
183
+ return unless in_tag("host")
184
+ @state[:port] ||= {}
185
+ svc = attr_hash(attrs)
186
+ @state[:port] = @state[:port].merge(svc)
187
+ end
188
+
189
+ def record_host_status(attrs)
190
+ return unless in_tag("host")
191
+ attrs.each do |k,v|
192
+ next unless k == "state"
193
+ @state[:host_alive] = (v == "up")
194
+ end
195
+ end
196
+
197
+ def record_address(attrs)
198
+ return unless in_tag("host")
199
+ @state[:addresses] ||= {}
200
+ address = nil
201
+ type = nil
202
+ attrs.each do |k,v|
203
+ if k == "addr"
204
+ address = v
205
+ elsif k == "addrtype"
206
+ type = v
207
+ end
208
+ end
209
+ @state[:addresses][type] = address
210
+ end
211
+
212
+ def collect_os_data
213
+ return unless in_tag("host")
214
+ if @state[:os]
215
+ @report_data[:os_fingerprint] = {
216
+ :type => "host.os.nmap_fingerprint",
217
+ :data => {
218
+ :os_vendor => @state[:os]["vendor"],
219
+ :os_family => @state[:os]["osfamily"],
220
+ :os_version => @state[:os]["osgen"],
221
+ :os_accuracy => @state[:os]["accuracy"].to_i
222
+ }
223
+ }
224
+ if @state[:os].has_key? "osmatch"
225
+ @report_data[:os_fingerprint][:data][:os_match] = @state[:os]["osmatch"]
226
+ end
227
+ end
228
+ end
229
+
230
+ def collect_host_data
231
+ if @state[:host_alive]
232
+ @report_data[:state] = Msf::HostState::Alive
233
+ else
234
+ @report_data[:state] = Msf::HostState::Dead
235
+ end
236
+ if @state[:addresses]
237
+ if @state[:addresses].has_key? "ipv4"
238
+ @report_data[:host] = @state[:addresses]["ipv4"]
239
+ elsif @state[:addresses].has_key? "ipv6"
240
+ @report_data[:host] = @state[:addresses]["ipv6"]
241
+ end
242
+ end
243
+ if @state[:addresses] and @state[:addresses].has_key?("mac")
244
+ @report_data[:mac] = @state[:addresses]["mac"]
245
+ end
246
+ if @state[:hostname]
247
+ @report_data[:name] = @state[:hostname]
248
+ end
249
+ if @state[:uptime]
250
+ @report_data[:last_boot] = @state[:uptime]["lastboot"]
251
+ end
252
+ if @state[:trace] and @state[:trace].has_key?(:hops)
253
+ @report_data[:traceroute] = @state[:trace]
254
+ end
255
+ if @state[:scripts]
256
+ @report_data[:scripts] = @state[:scripts]
257
+ end
258
+ end
259
+
260
+ def collect_port_data
261
+ return unless in_tag("host")
262
+ if @args[:fix_services]
263
+ if @state[:port]["state"] == "filtered"
264
+ return
265
+ end
266
+ end
267
+ @report_data[:ports] ||= []
268
+ port_hash = {}
269
+ extra = []
270
+ @state[:port].each do |k,v|
271
+ case k
272
+ when "protocol"
273
+ port_hash[:proto] = v
274
+ when "portid"
275
+ port_hash[:port] = v
276
+ when "state"
277
+ port_hash[:state] = determine_port_state(v)
278
+ when "name"
279
+ port_hash[:name] = v
280
+ when "reason"
281
+ port_hash[:reason] = v
282
+ when "product"
283
+ extra[0] = v
284
+ when "version"
285
+ extra[1] = v
286
+ when "extrainfo"
287
+ extra[2] = v
288
+ when :scripts
289
+ port_hash[:scripts] = v
290
+ end
291
+ end
292
+ port_hash[:info] = extra.compact.join(" ") unless extra.empty?
293
+ # Skip localhost port results when they're unknown
294
+ if( port_hash[:reason] == "localhost-response" &&
295
+ port_hash[:state] == Msf::ServiceState::Unknown )
296
+ @report_data[:ports]
297
+ else
298
+ @report_data[:ports] << port_hash
299
+ end
300
+ end
301
+
302
+ def report_traceroute(host_object)
303
+ return unless host_object.kind_of? ::Mdm::Host
304
+ return unless @report_data[:traceroute]
305
+ tr_note = {
306
+ :workspace => host_object.workspace,
307
+ :host => host_object,
308
+ :type => "host.nmap.traceroute",
309
+ :data => { 'port' => @report_data[:traceroute]["port"].to_i,
310
+ 'proto' => @report_data[:traceroute]["proto"].to_s,
311
+ 'hops' => @report_data[:traceroute][:hops] }
312
+ }
313
+ db_report(:note, tr_note)
314
+ end
315
+
316
+ def report_uptime(host_object)
317
+ return unless host_object.kind_of? ::Mdm::Host
318
+ return unless @report_data[:last_boot]
319
+ up_note = {
320
+ :workspace => host_object.workspace,
321
+ :host => host_object,
322
+ :type => "host.last_boot",
323
+ :data => { :time => @report_data[:last_boot] }
324
+ }
325
+ db_report(:note, up_note)
326
+ end
327
+
328
+ def report_fingerprint(host_object)
329
+ return unless host_object.kind_of? ::Mdm::Host
330
+ return unless @report_data[:os_fingerprint]
331
+ fp_note = @report_data[:os_fingerprint].merge(
332
+ {
333
+ :workspace => host_object.workspace,
334
+ :host => host_object
335
+ })
336
+ db_report(:note, fp_note)
337
+ end
338
+
339
+ def report_host(&block)
340
+ if host_is_okay
341
+ scripts = @report_data.delete(:scripts) || []
342
+ host_object = db_report(:host, @report_data.merge( :workspace => @args[:wspace] ) )
343
+ db.emit(:address,@report_data[:host],&block) if block
344
+
345
+ scripts.each do |script|
346
+ script.each_pair do |k,v|
347
+ ntype =
348
+ nse_note = {
349
+ :workspace => host_object.workspace,
350
+ :host => host_object,
351
+ :type => "nmap.nse.#{k}.host",
352
+ :data => { 'output' => v },
353
+ :update => :unique_data
354
+ }
355
+ db_report(:note, nse_note)
356
+ end
357
+ end
358
+
359
+ host_object
360
+ end
361
+ end
362
+
363
+ def report_services(host_object,&block)
364
+ return unless host_object.kind_of? ::Mdm::Host
365
+ return unless @report_data[:ports]
366
+ return if @report_data[:ports].empty?
367
+ reported = []
368
+ @report_data[:ports].each do |svc|
369
+ scripts = svc.delete(:scripts) || []
370
+ svc_obj = db_report(:service, svc.merge(:host => host_object))
371
+ scripts.each do |script|
372
+ script.each_pair do |k,v|
373
+ ntype =
374
+ nse_note = {
375
+ :workspace => host_object.workspace,
376
+ :host => host_object,
377
+ :service => svc_obj,
378
+ :type => "nmap.nse.#{k}." + (svc[:proto] || "tcp") +".#{svc[:port]}",
379
+ :data => { 'output' => v },
380
+ :update => :unique_data
381
+ }
382
+ db_report(:note, nse_note)
383
+ end
384
+ end
385
+ reported << svc_obj
386
+ end
387
+ reported
388
+ end
389
+
390
+ end
391
+
392
+ end
393
+ end
394
+
@@ -0,0 +1,166 @@
1
+ # -*- coding: binary -*-
2
+
3
+ require 'rexml/document'
4
+
5
+ module Rex
6
+ module Parser
7
+
8
+ #
9
+ # Stream parser for nmap -oX xml output
10
+ #
11
+ # Yields a hash representing each host found in the xml stream. Each host
12
+ # will look something like the following:
13
+ # {
14
+ # "status" => "up",
15
+ # "addrs" => { "ipv4" => "192.168.0.1", "mac" => "00:0d:87:a1:df:72" },
16
+ # "ports" => [
17
+ # { "portid" => "22", "state" => "closed", ... },
18
+ # { "portid" => "80", "state" => "open", ... },
19
+ # ...
20
+ # ]
21
+ # }
22
+ #
23
+ # Usage:
24
+ # parser = NmapXMLStreamParser.new { |host|
25
+ # # do stuff with the host
26
+ # }
27
+ # REXML::Document.parse_stream(File.new(nmap_xml), parser)
28
+ # -- or --
29
+ # parser = NmapXMLStreamParser.new
30
+ # parser.on_found_host = Proc.new { |host|
31
+ # # do stuff with the host
32
+ # }
33
+ # REXML::Document.parse_stream(File.new(nmap_xml), parser)
34
+ #
35
+ # This parser does not maintain state as well as a tree parser, so malformed
36
+ # xml will trip it up. Nmap shouldn't ever output malformed xml, so it's not
37
+ # a big deal.
38
+ #
39
+ class NmapXMLStreamParser
40
+
41
+ #
42
+ # Callback for processing each found host
43
+ #
44
+ attr_accessor :on_found_host
45
+
46
+ #
47
+ # Create a new stream parser for NMAP XML output
48
+ #
49
+ # If given a block, it will be stored in +on_found_host+, otherwise you
50
+ # need to set it explicitly, e.g.:
51
+ # parser = NmapXMLStreamParser.new
52
+ # parser.on_found_host = Proc.new { |host|
53
+ # # do stuff with the host
54
+ # }
55
+ # REXML::Document.parse_stream(File.new(nmap_xml), parser)
56
+ #
57
+ def initialize(&block)
58
+ reset_state
59
+ on_found_host = block if block
60
+ end
61
+
62
+ def reset_state
63
+ @host = { "status" => nil, "addrs" => {}, "ports" => [], "scripts" => {} }
64
+ @state = nil
65
+ end
66
+
67
+ def tag_start(name, attributes)
68
+ begin
69
+ case name
70
+ when "address"
71
+ @host["addrs"][attributes["addrtype"]] = attributes["addr"]
72
+ if (attributes["addrtype"] =~ /ipv[46]/)
73
+ @host["addr"] = attributes["addr"]
74
+ end
75
+ when "osclass"
76
+ # If there is more than one, take the highest accuracy. In case of
77
+ # a tie, this will have the effect of taking the last one in the
78
+ # list. Last is really no better than first but nmap appears to
79
+ # put OSes in chronological order, at least for Windows.
80
+ # Accordingly, this will report XP instead of 2000, 7 instead of
81
+ # Vista, etc, when each has the same accuracy.
82
+ if (@host["os_accuracy"].to_i <= attributes["accuracy"].to_i)
83
+ @host["os_vendor"] = attributes["vendor"]
84
+ @host["os_family"] = attributes["osfamily"]
85
+ @host["os_version"] = attributes["osgen"]
86
+ @host["os_accuracy"] = attributes["accuracy"]
87
+ end
88
+ when "osmatch"
89
+ if(attributes["accuracy"].to_i == 100)
90
+ @host["os_match"] = attributes["name"]
91
+ end
92
+ when "uptime"
93
+ @host["last_boot"] = attributes["lastboot"]
94
+ when "hostname"
95
+ if(attributes["type"] == "PTR")
96
+ @host["reverse_dns"] = attributes["name"]
97
+ end
98
+ when "status"
99
+ # <status> refers to the liveness of the host; values are "up" or "down"
100
+ @host["status"] = attributes["state"]
101
+ @host["status_reason"] = attributes["reason"]
102
+ when "port"
103
+ @host["ports"].push(attributes)
104
+ when "state"
105
+ # <state> refers to the state of a port; values are "open", "closed", or "filtered"
106
+ @host["ports"].last["state"] = attributes["state"]
107
+ when "service"
108
+ # Store any service and script info with the associated port. There shouldn't
109
+ # be any collisions on attribute names here, so just merge them.
110
+ @host["ports"].last.merge!(attributes)
111
+ when "script"
112
+ # Associate scripts under a port tag with the appropriate port.
113
+ # Other scripts from <hostscript> tags can only be associated with
114
+ # the host and scripts from <postscript> tags don't really belong
115
+ # to anything, so ignore them
116
+ if @state == :in_port_tag
117
+ @host["ports"].last["scripts"] ||= {}
118
+ @host["ports"].last["scripts"][attributes["id"]] = attributes["output"]
119
+ elsif @host
120
+ @host["scripts"] ||= {}
121
+ @host["scripts"][attributes["id"]] = attributes["output"]
122
+ else
123
+ # post scripts are used for things like comparing all the found
124
+ # ssh keys to see if multiple hosts have the same key
125
+ # fingerprint. Ignore them.
126
+ end
127
+ when "trace"
128
+ @host["trace"] = {"port" => attributes["port"], "proto" => attributes["proto"], "hops" => [] }
129
+ when "hop"
130
+ if @host["trace"]
131
+ @host["trace"]["hops"].push(attributes)
132
+ end
133
+ end
134
+ rescue NoMethodError => err
135
+ raise err unless err.message =~ /NilClass/
136
+ end
137
+ end
138
+
139
+ def tag_end(name)
140
+ case name
141
+ when "port"
142
+ @state = nil
143
+ when "host"
144
+ on_found_host.call(@host) if on_found_host
145
+ reset_state
146
+ end
147
+ end
148
+
149
+ # We don't need these methods, but they're necessary to keep REXML happy
150
+ def text(str) # :nodoc:
151
+ end
152
+ def xmldecl(version, encoding, standalone) # :nodoc:
153
+ end
154
+ def cdata # :nodoc:
155
+ end
156
+ def comment(str) # :nodoc:
157
+ end
158
+ def instruction(name, instruction) # :nodoc:
159
+ end
160
+ def attlist # :nodoc:
161
+ end
162
+ end
163
+
164
+ end
165
+ end
166
+