librex 0.0.68 → 0.0.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (528) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +1 -1
  3. data/Rakefile +18 -16
  4. data/lib/rex.rb +14 -10
  5. data/lib/rex/LICENSE +2 -2
  6. data/lib/rex/arch.rb +76 -76
  7. data/lib/rex/arch/sparc.rb +57 -58
  8. data/lib/rex/arch/x86.rb +506 -496
  9. data/lib/rex/assembly/nasm.rb +83 -84
  10. data/lib/rex/compat.rb +228 -173
  11. data/lib/rex/constants.rb +47 -37
  12. data/lib/rex/elfparsey.rb +0 -3
  13. data/lib/rex/elfparsey/elf.rb +107 -110
  14. data/lib/rex/elfparsey/elfbase.rb +244 -247
  15. data/lib/rex/elfparsey/exceptions.rb +0 -3
  16. data/lib/rex/elfscan.rb +0 -3
  17. data/lib/rex/elfscan/scanner.rb +184 -166
  18. data/lib/rex/elfscan/search.rb +35 -38
  19. data/lib/rex/encoder/alpha2.rb +1 -2
  20. data/lib/rex/encoder/alpha2/alpha_mixed.rb +52 -53
  21. data/lib/rex/encoder/alpha2/alpha_upper.rb +62 -63
  22. data/lib/rex/encoder/alpha2/generic.rb +77 -78
  23. data/lib/rex/encoder/alpha2/unicode_mixed.rb +101 -97
  24. data/lib/rex/encoder/alpha2/unicode_upper.rb +106 -107
  25. data/lib/rex/encoder/bloxor/bloxor.rb +326 -0
  26. data/lib/rex/encoder/ndr.rb +68 -68
  27. data/lib/rex/encoder/nonalpha.rb +50 -51
  28. data/lib/rex/encoder/nonupper.rb +50 -51
  29. data/lib/rex/encoder/xdr.rb +78 -78
  30. data/lib/rex/encoder/xor.rb +52 -53
  31. data/lib/rex/encoder/xor/dword.rb +1 -2
  32. data/lib/rex/encoder/xor/dword_additive.rb +1 -2
  33. data/lib/rex/encoders/xor_dword.rb +17 -18
  34. data/lib/rex/encoders/xor_dword_additive.rb +35 -36
  35. data/lib/rex/encoding/xor.rb +0 -1
  36. data/lib/rex/encoding/xor/byte.rb +3 -4
  37. data/lib/rex/encoding/xor/dword.rb +3 -4
  38. data/lib/rex/encoding/xor/dword_additive.rb +72 -73
  39. data/lib/rex/encoding/xor/exceptions.rb +2 -3
  40. data/lib/rex/encoding/xor/generic.rb +129 -130
  41. data/lib/rex/encoding/xor/qword.rb +3 -4
  42. data/lib/rex/encoding/xor/word.rb +3 -4
  43. data/lib/rex/exceptions.rb +100 -101
  44. data/lib/rex/exploitation/cmdstager.rb +3 -3
  45. data/lib/rex/exploitation/cmdstager/base.rb +170 -156
  46. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  47. data/lib/rex/exploitation/cmdstager/debug_asm.rb +110 -113
  48. data/lib/rex/exploitation/cmdstager/debug_write.rb +106 -109
  49. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  50. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  51. data/lib/rex/exploitation/cmdstager/tftp.rb +34 -27
  52. data/lib/rex/exploitation/cmdstager/vbs.rb +95 -98
  53. data/lib/rex/exploitation/egghunter.rb +359 -346
  54. data/lib/rex/exploitation/encryptjs.rb +60 -60
  55. data/lib/rex/exploitation/heaplib.rb +76 -76
  56. data/lib/rex/exploitation/js.rb +6 -0
  57. data/lib/rex/exploitation/js/detect.rb +69 -0
  58. data/lib/rex/exploitation/js/memory.rb +81 -0
  59. data/lib/rex/exploitation/js/network.rb +84 -0
  60. data/lib/rex/exploitation/js/utils.rb +33 -0
  61. data/lib/rex/exploitation/jsobfu.rb +448 -424
  62. data/lib/rex/exploitation/obfuscatejs.rb +301 -301
  63. data/lib/rex/exploitation/omelet.rb +257 -257
  64. data/lib/rex/exploitation/opcodedb.rb +699 -699
  65. data/lib/rex/exploitation/ropdb.rb +189 -0
  66. data/lib/rex/exploitation/seh.rb +68 -68
  67. data/lib/rex/file.rb +96 -49
  68. data/lib/rex/image_source.rb +0 -3
  69. data/lib/rex/image_source/disk.rb +45 -48
  70. data/lib/rex/image_source/image_source.rb +33 -36
  71. data/lib/rex/image_source/memory.rb +17 -20
  72. data/lib/rex/io/bidirectional_pipe.rb +118 -115
  73. data/lib/rex/io/datagram_abstraction.rb +13 -14
  74. data/lib/rex/io/ring_buffer.rb +273 -273
  75. data/lib/rex/io/stream.rb +284 -284
  76. data/lib/rex/io/stream_abstraction.rb +183 -181
  77. data/lib/rex/io/stream_server.rb +193 -193
  78. data/lib/rex/job_container.rb +167 -167
  79. data/lib/rex/logging.rb +0 -1
  80. data/lib/rex/logging/log_dispatcher.rb +113 -113
  81. data/lib/rex/logging/log_sink.rb +17 -17
  82. data/lib/rex/logging/sinks/flatfile.rb +36 -36
  83. data/lib/rex/logging/sinks/stderr.rb +27 -27
  84. data/lib/rex/mac_oui.rb +16572 -16571
  85. data/lib/rex/machparsey.rb +0 -1
  86. data/lib/rex/machparsey/exceptions.rb +0 -1
  87. data/lib/rex/machparsey/mach.rb +160 -161
  88. data/lib/rex/machparsey/machbase.rb +367 -368
  89. data/lib/rex/machscan.rb +0 -1
  90. data/lib/rex/machscan/scanner.rb +175 -176
  91. data/lib/rex/mime/encoding.rb +17 -0
  92. data/lib/rex/mime/header.rb +58 -58
  93. data/lib/rex/mime/message.rb +140 -137
  94. data/lib/rex/mime/part.rb +41 -12
  95. data/lib/rex/nop/opty2.rb +90 -90
  96. data/lib/rex/nop/opty2_tables.rb +273 -273
  97. data/lib/rex/ole.rb +0 -4
  98. data/lib/rex/ole/clsid.rb +26 -30
  99. data/lib/rex/ole/difat.rb +121 -125
  100. data/lib/rex/ole/directory.rb +205 -209
  101. data/lib/rex/ole/direntry.rb +217 -221
  102. data/lib/rex/ole/fat.rb +79 -83
  103. data/lib/rex/ole/header.rb +178 -182
  104. data/lib/rex/ole/minifat.rb +49 -53
  105. data/lib/rex/ole/propset.rb +113 -117
  106. data/lib/rex/ole/samples/create_ole.rb +8 -9
  107. data/lib/rex/ole/samples/dir.rb +10 -11
  108. data/lib/rex/ole/samples/dump_stream.rb +14 -15
  109. data/lib/rex/ole/samples/ole_info.rb +5 -6
  110. data/lib/rex/ole/storage.rb +372 -376
  111. data/lib/rex/ole/stream.rb +33 -37
  112. data/lib/rex/ole/substorage.rb +20 -24
  113. data/lib/rex/ole/util.rb +137 -141
  114. data/lib/rex/parser/acunetix_nokogiri.rb +398 -398
  115. data/lib/rex/parser/apple_backup_manifestdb.rb +116 -116
  116. data/lib/rex/parser/appscan_nokogiri.rb +359 -359
  117. data/lib/rex/parser/arguments.rb +88 -88
  118. data/lib/rex/parser/burp_session_nokogiri.rb +258 -258
  119. data/lib/rex/parser/ci_nokogiri.rb +184 -184
  120. data/lib/rex/parser/foundstone_nokogiri.rb +334 -333
  121. data/lib/rex/parser/fusionvm_nokogiri.rb +94 -94
  122. data/lib/rex/parser/ini.rb +167 -167
  123. data/lib/rex/parser/ip360_aspl_xml.rb +84 -84
  124. data/lib/rex/parser/ip360_xml.rb +77 -77
  125. data/lib/rex/parser/mbsa_nokogiri.rb +224 -224
  126. data/lib/rex/parser/nessus_xml.rb +100 -100
  127. data/lib/rex/parser/netsparker_xml.rb +89 -75
  128. data/lib/rex/parser/nexpose_raw_nokogiri.rb +677 -677
  129. data/lib/rex/parser/nexpose_simple_nokogiri.rb +322 -322
  130. data/lib/rex/parser/nexpose_xml.rb +105 -105
  131. data/lib/rex/parser/nmap_nokogiri.rb +386 -386
  132. data/lib/rex/parser/nmap_xml.rb +116 -116
  133. data/lib/rex/parser/nokogiri_doc_mixin.rb +223 -221
  134. data/lib/rex/parser/openvas_nokogiri.rb +162 -162
  135. data/lib/rex/parser/outpost24_nokogiri.rb +239 -0
  136. data/lib/rex/parser/retina_xml.rb +90 -90
  137. data/lib/rex/parser/unattend.rb +171 -0
  138. data/lib/rex/parser/wapiti_nokogiri.rb +89 -89
  139. data/lib/rex/payloads/win32/common.rb +14 -14
  140. data/lib/rex/payloads/win32/kernel.rb +36 -36
  141. data/lib/rex/payloads/win32/kernel/common.rb +32 -32
  142. data/lib/rex/payloads/win32/kernel/recovery.rb +27 -27
  143. data/lib/rex/payloads/win32/kernel/stager.rb +170 -170
  144. data/lib/rex/peparsey.rb +0 -3
  145. data/lib/rex/peparsey/exceptions.rb +0 -3
  146. data/lib/rex/peparsey/pe.rb +196 -199
  147. data/lib/rex/peparsey/pe_memdump.rb +35 -38
  148. data/lib/rex/peparsey/pebase.rb +1633 -1652
  149. data/lib/rex/peparsey/section.rb +115 -124
  150. data/lib/rex/pescan.rb +0 -3
  151. data/lib/rex/pescan/analyze.rb +351 -351
  152. data/lib/rex/pescan/scanner.rb +182 -182
  153. data/lib/rex/pescan/search.rb +59 -59
  154. data/lib/rex/platforms/windows.rb +37 -37
  155. data/lib/rex/poly.rb +111 -110
  156. data/lib/rex/poly/block.rb +419 -417
  157. data/lib/rex/poly/machine.rb +12 -0
  158. data/lib/rex/poly/machine/machine.rb +829 -0
  159. data/lib/rex/poly/machine/x86.rb +508 -0
  160. data/lib/rex/poly/register.rb +70 -70
  161. data/lib/rex/poly/register/x86.rb +22 -22
  162. data/lib/rex/post.rb +0 -1
  163. data/lib/rex/post/dir.rb +35 -36
  164. data/lib/rex/post/file.rb +140 -141
  165. data/lib/rex/post/file_stat.rb +198 -199
  166. data/lib/rex/post/io.rb +167 -168
  167. data/lib/rex/post/meterpreter.rb +1 -1
  168. data/lib/rex/post/meterpreter/channel.rb +389 -390
  169. data/lib/rex/post/meterpreter/channel_container.rb +33 -34
  170. data/lib/rex/post/meterpreter/channels/pool.rb +129 -130
  171. data/lib/rex/post/meterpreter/channels/pools/file.rb +35 -36
  172. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +72 -73
  173. data/lib/rex/post/meterpreter/channels/stream.rb +62 -63
  174. data/lib/rex/post/meterpreter/client.rb +442 -436
  175. data/lib/rex/post/meterpreter/client_core.rb +326 -310
  176. data/lib/rex/post/meterpreter/dependencies.rb +0 -1
  177. data/lib/rex/post/meterpreter/extension.rb +12 -13
  178. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +35 -36
  179. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  180. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  181. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  182. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  183. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  184. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  185. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  186. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +70 -71
  187. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  188. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  189. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  190. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +22 -78
  191. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  192. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +4 -4
  193. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  194. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  195. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +38 -39
  196. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +1 -1
  197. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +95 -96
  198. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +39 -40
  199. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +80 -85
  200. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +94 -95
  201. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +207 -147
  202. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +258 -259
  203. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +366 -301
  204. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +72 -73
  205. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +24 -25
  206. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  207. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +227 -149
  208. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +107 -108
  209. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  210. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  211. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +41 -42
  212. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +102 -101
  213. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +151 -152
  214. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +142 -142
  215. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +185 -185
  216. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38118 -38117
  217. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +7 -7
  218. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2086 -2084
  219. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +15 -15
  220. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +80 -80
  221. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3835 -3833
  222. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +84 -28
  223. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +151 -137
  224. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +15 -6
  225. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3155 -3155
  226. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +70 -70
  228. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +596 -596
  230. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +310 -301
  231. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +71 -61
  232. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +100 -100
  233. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +14 -14
  234. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +488 -488
  235. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +273 -264
  236. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +5 -5
  237. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +240 -238
  238. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +17 -15
  239. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +61 -61
  240. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +654 -635
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +49 -49
  242. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +103 -102
  243. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +98 -68
  244. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +165 -166
  245. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +16 -17
  246. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +34 -36
  247. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +363 -364
  248. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +102 -103
  249. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +28 -29
  250. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +303 -304
  251. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +113 -114
  252. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +260 -261
  253. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +165 -166
  254. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +69 -70
  255. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +160 -161
  256. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +143 -144
  257. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +29 -12
  258. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +230 -231
  259. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +181 -44
  260. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +12 -13
  261. data/lib/rex/post/meterpreter/object_aliases.rb +56 -57
  262. data/lib/rex/post/meterpreter/packet.rb +591 -592
  263. data/lib/rex/post/meterpreter/packet_dispatcher.rb +506 -496
  264. data/lib/rex/post/meterpreter/packet_parser.rb +72 -73
  265. data/lib/rex/post/meterpreter/packet_response_waiter.rb +56 -57
  266. data/lib/rex/post/meterpreter/ui/console.rb +112 -112
  267. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +53 -53
  268. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +911 -854
  269. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +86 -86
  270. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  271. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  272. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  273. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  274. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  275. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  276. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +220 -220
  277. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  278. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  279. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  280. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  281. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  282. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +173 -173
  283. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +40 -40
  284. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +75 -77
  285. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +30 -30
  286. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +105 -105
  287. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +182 -182
  288. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +37 -37
  289. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +504 -482
  290. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +401 -330
  291. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +883 -581
  292. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +296 -299
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +320 -153
  294. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +78 -78
  295. data/lib/rex/post/permission.rb +0 -1
  296. data/lib/rex/post/process.rb +39 -40
  297. data/lib/rex/post/thread.rb +41 -42
  298. data/lib/rex/post/ui.rb +35 -36
  299. data/lib/rex/proto/addp.rb +218 -0
  300. data/lib/rex/proto/dcerpc/client.rb +344 -344
  301. data/lib/rex/proto/dcerpc/exceptions.rb +128 -128
  302. data/lib/rex/proto/dcerpc/handle.rb +32 -32
  303. data/lib/rex/proto/dcerpc/ndr.rb +56 -56
  304. data/lib/rex/proto/dcerpc/packet.rb +249 -245
  305. data/lib/rex/proto/dcerpc/response.rb +170 -170
  306. data/lib/rex/proto/dcerpc/uuid.rb +65 -65
  307. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  308. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  309. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  310. data/lib/rex/proto/dhcp.rb +0 -1
  311. data/lib/rex/proto/dhcp/constants.rb +0 -1
  312. data/lib/rex/proto/dhcp/server.rb +303 -304
  313. data/lib/rex/proto/drda/constants.rb +1 -1
  314. data/lib/rex/proto/drda/packet.rb +186 -186
  315. data/lib/rex/proto/drda/utils.rb +104 -104
  316. data/lib/rex/proto/http.rb +1 -0
  317. data/lib/rex/proto/http/client.rb +692 -820
  318. data/lib/rex/proto/http/client_request.rb +472 -0
  319. data/lib/rex/proto/http/handler.rb +25 -25
  320. data/lib/rex/proto/http/handler/erb.rb +104 -104
  321. data/lib/rex/proto/http/handler/proc.rb +37 -37
  322. data/lib/rex/proto/http/header.rb +149 -149
  323. data/lib/rex/proto/http/packet.rb +388 -382
  324. data/lib/rex/proto/http/request.rb +332 -335
  325. data/lib/rex/proto/http/response.rb +132 -72
  326. data/lib/rex/proto/http/server.rb +348 -338
  327. data/lib/rex/proto/iax2/call.rb +310 -310
  328. data/lib/rex/proto/iax2/client.rb +197 -197
  329. data/lib/rex/proto/iax2/codecs/alaw.rb +4 -4
  330. data/lib/rex/proto/iax2/codecs/mulaw.rb +4 -4
  331. data/lib/rex/proto/ipmi.rb +57 -0
  332. data/lib/rex/proto/ipmi/channel_auth_reply.rb +88 -0
  333. data/lib/rex/proto/ipmi/open_session_reply.rb +35 -0
  334. data/lib/rex/proto/ipmi/rakp2.rb +35 -0
  335. data/lib/rex/proto/ipmi/utils.rb +125 -0
  336. data/lib/rex/proto/natpmp.rb +1 -5
  337. data/lib/rex/proto/natpmp/constants.rb +4 -4
  338. data/lib/rex/proto/natpmp/packet.rb +25 -25
  339. data/lib/rex/proto/ntlm/base.rb +271 -271
  340. data/lib/rex/proto/ntlm/constants.rb +61 -61
  341. data/lib/rex/proto/ntlm/crypt.rb +348 -352
  342. data/lib/rex/proto/ntlm/exceptions.rb +3 -3
  343. data/lib/rex/proto/ntlm/message.rb +468 -471
  344. data/lib/rex/proto/ntlm/utils.rb +746 -746
  345. data/lib/rex/proto/pjl.rb +30 -0
  346. data/lib/rex/proto/pjl/client.rb +162 -0
  347. data/lib/rex/proto/proxy/socks4a.rb +440 -440
  348. data/lib/rex/proto/rfb.rb +1 -8
  349. data/lib/rex/proto/rfb/cipher.rb +46 -49
  350. data/lib/rex/proto/rfb/client.rb +179 -182
  351. data/lib/rex/proto/rfb/constants.rb +18 -21
  352. data/lib/rex/proto/smb/client.rb +1954 -1843
  353. data/lib/rex/proto/smb/constants.rb +533 -516
  354. data/lib/rex/proto/smb/crypt.rb +21 -21
  355. data/lib/rex/proto/smb/evasions.rb +43 -43
  356. data/lib/rex/proto/smb/exceptions.rb +791 -791
  357. data/lib/rex/proto/smb/simpleclient.rb +142 -286
  358. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  359. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  360. data/lib/rex/proto/smb/utils.rb +81 -81
  361. data/lib/rex/proto/sunrpc/client.rb +158 -158
  362. data/lib/rex/proto/tftp.rb +0 -1
  363. data/lib/rex/proto/tftp/client.rb +289 -289
  364. data/lib/rex/proto/tftp/constants.rb +9 -10
  365. data/lib/rex/proto/tftp/server.rb +466 -467
  366. data/lib/rex/random_identifier_generator.rb +176 -0
  367. data/lib/rex/registry.rb +1 -1
  368. data/lib/rex/registry/hive.rb +88 -88
  369. data/lib/rex/registry/lfkey.rb +25 -25
  370. data/lib/rex/registry/nodekey.rb +30 -30
  371. data/lib/rex/registry/regf.rb +10 -10
  372. data/lib/rex/registry/valuekey.rb +43 -43
  373. data/lib/rex/registry/valuelist.rb +13 -13
  374. data/lib/rex/ropbuilder/rop.rb +254 -253
  375. data/lib/rex/script.rb +21 -22
  376. data/lib/rex/script/base.rb +51 -50
  377. data/lib/rex/script/meterpreter.rb +2 -2
  378. data/lib/rex/service.rb +24 -24
  379. data/lib/rex/service_manager.rb +132 -132
  380. data/lib/rex/services/local_relay.rb +398 -398
  381. data/lib/rex/socket.rb +758 -763
  382. data/lib/rex/socket/comm.rb +95 -95
  383. data/lib/rex/socket/comm/local.rb +507 -440
  384. data/lib/rex/socket/ip.rb +118 -118
  385. data/lib/rex/socket/parameters.rb +351 -350
  386. data/lib/rex/socket/range_walker.rb +445 -368
  387. data/lib/rex/socket/ssl_tcp.rb +323 -317
  388. data/lib/rex/socket/ssl_tcp_server.rb +173 -158
  389. data/lib/rex/socket/subnet_walker.rb +48 -48
  390. data/lib/rex/socket/switch_board.rb +259 -259
  391. data/lib/rex/socket/tcp.rb +58 -56
  392. data/lib/rex/socket/tcp_server.rb +42 -42
  393. data/lib/rex/socket/udp.rb +152 -152
  394. data/lib/rex/sslscan/result.rb +200 -0
  395. data/lib/rex/sslscan/scanner.rb +205 -0
  396. data/lib/rex/struct2.rb +0 -1
  397. data/lib/rex/struct2/c_struct.rb +162 -163
  398. data/lib/rex/struct2/c_struct_template.rb +21 -22
  399. data/lib/rex/struct2/constant.rb +6 -7
  400. data/lib/rex/struct2/element.rb +30 -31
  401. data/lib/rex/struct2/generic.rb +60 -61
  402. data/lib/rex/struct2/restraint.rb +40 -41
  403. data/lib/rex/struct2/s_string.rb +60 -61
  404. data/lib/rex/struct2/s_struct.rb +97 -98
  405. data/lib/rex/sync.rb +0 -1
  406. data/lib/rex/sync/event.rb +62 -72
  407. data/lib/rex/sync/read_write_lock.rb +149 -149
  408. data/lib/rex/sync/ref.rb +42 -42
  409. data/lib/rex/sync/thread_safe.rb +59 -59
  410. data/lib/rex/text.rb +1803 -1315
  411. data/lib/rex/thread_factory.rb +25 -25
  412. data/lib/rex/time.rb +44 -44
  413. data/lib/rex/transformer.rb +91 -91
  414. data/lib/rex/ui/interactive.rb +265 -265
  415. data/lib/rex/ui/output.rb +66 -60
  416. data/lib/rex/ui/progress_tracker.rb +79 -79
  417. data/lib/rex/ui/subscriber.rb +144 -134
  418. data/lib/rex/ui/text/color.rb +76 -76
  419. data/lib/rex/ui/text/dispatcher_shell.rb +512 -505
  420. data/lib/rex/ui/text/input.rb +96 -96
  421. data/lib/rex/ui/text/input/buffer.rb +58 -58
  422. data/lib/rex/ui/text/input/readline.rb +114 -114
  423. data/lib/rex/ui/text/input/socket.rb +77 -77
  424. data/lib/rex/ui/text/input/stdio.rb +24 -24
  425. data/lib/rex/ui/text/irb_shell.rb +45 -41
  426. data/lib/rex/ui/text/output.rb +64 -60
  427. data/lib/rex/ui/text/output/buffer.rb +42 -42
  428. data/lib/rex/ui/text/output/buffer/stdout.rb +25 -0
  429. data/lib/rex/ui/text/output/file.rb +24 -24
  430. data/lib/rex/ui/text/output/socket.rb +24 -24
  431. data/lib/rex/ui/text/output/stdio.rb +29 -29
  432. data/lib/rex/ui/text/output/tee.rb +36 -36
  433. data/lib/rex/ui/text/progress_tracker.rb +37 -37
  434. data/lib/rex/ui/text/shell.rb +371 -361
  435. data/lib/rex/ui/text/table.rb +320 -284
  436. data/lib/rex/zip.rb +0 -1
  437. data/lib/rex/zip/archive.rb +115 -94
  438. data/lib/rex/zip/blocks.rb +101 -100
  439. data/lib/rex/zip/entry.rb +108 -99
  440. data/lib/rex/zip/jar.rb +261 -206
  441. data/lib/rex/zip/samples/comment.rb +1 -2
  442. data/lib/rex/zip/samples/mkwar.rb +12 -13
  443. data/lib/rex/zip/samples/mkzip.rb +1 -2
  444. data/lib/rex/zip/samples/recursive.rb +29 -30
  445. metadata +424 -446
  446. data/lib/rex/arch/sparc.rb.ut.rb +0 -19
  447. data/lib/rex/arch/x86.rb.ut.rb +0 -94
  448. data/lib/rex/assembly/nasm.rb.ut.rb +0 -23
  449. data/lib/rex/encoder/ndr.rb.ut.rb +0 -45
  450. data/lib/rex/encoder/xdr.rb.ut.rb +0 -30
  451. data/lib/rex/encoders/xor_dword_additive.rb.ut.rb +0 -13
  452. data/lib/rex/encoding/xor.rb.ts.rb +0 -15
  453. data/lib/rex/encoding/xor/byte.rb.ut.rb +0 -22
  454. data/lib/rex/encoding/xor/dword.rb.ut.rb +0 -16
  455. data/lib/rex/encoding/xor/dword_additive.rb.ut.rb +0 -16
  456. data/lib/rex/encoding/xor/generic.rb.ut.rb +0 -121
  457. data/lib/rex/encoding/xor/word.rb.ut.rb +0 -14
  458. data/lib/rex/exceptions.rb.ut.rb +0 -45
  459. data/lib/rex/exploitation/egghunter.rb.ut.rb +0 -28
  460. data/lib/rex/exploitation/javascriptosdetect.js +0 -1014
  461. data/lib/rex/exploitation/javascriptosdetect.rb +0 -43
  462. data/lib/rex/exploitation/omelet.rb.ut.rb +0 -27
  463. data/lib/rex/exploitation/opcodedb.rb.ut.rb +0 -280
  464. data/lib/rex/exploitation/seh.rb.ut.rb +0 -20
  465. data/lib/rex/file.rb.ut.rb +0 -17
  466. data/lib/rex/io/ring_buffer.rb.ut.rb +0 -135
  467. data/lib/rex/nop/opty2.rb.ut.rb +0 -24
  468. data/lib/rex/parser/arguments.rb.ut.rb +0 -68
  469. data/lib/rex/parser/ini.rb.ut.rb +0 -30
  470. data/lib/rex/post/meterpreter/extensions/stdapi/railgun.rb.ts.rb +0 -18
  471. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb.ut.rb +0 -39
  472. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb.ut.rb +0 -37
  473. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb.ut.rb +0 -52
  474. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb.ut.rb +0 -43
  475. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb.ut.rb +0 -128
  476. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb.ut.rb +0 -64
  477. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb.ut.rb +0 -29
  478. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb.ut.rb +0 -155
  479. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb.ut.rb +0 -128
  480. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb.ut.rb +0 -124
  481. data/lib/rex/proto.rb.ts.rb +0 -9
  482. data/lib/rex/proto/dcerpc.rb.ts.rb +0 -10
  483. data/lib/rex/proto/dcerpc/client.rb.ut.rb +0 -492
  484. data/lib/rex/proto/dcerpc/handle.rb.ut.rb +0 -86
  485. data/lib/rex/proto/dcerpc/ndr.rb.ut.rb +0 -42
  486. data/lib/rex/proto/dcerpc/packet.rb.ut.rb +0 -57
  487. data/lib/rex/proto/dcerpc/response.rb.ut.rb +0 -16
  488. data/lib/rex/proto/dcerpc/uuid.rb.ut.rb +0 -47
  489. data/lib/rex/proto/drda.rb.ts.rb +0 -18
  490. data/lib/rex/proto/drda/constants.rb.ut.rb +0 -24
  491. data/lib/rex/proto/drda/packet.rb.ut.rb +0 -110
  492. data/lib/rex/proto/drda/utils.rb.ut.rb +0 -85
  493. data/lib/rex/proto/http.rb.ts.rb +0 -13
  494. data/lib/rex/proto/http/client.rb.ut.rb +0 -96
  495. data/lib/rex/proto/http/handler/erb.rb.ut.rb +0 -22
  496. data/lib/rex/proto/http/handler/erb.rb.ut.rb.rhtml +0 -1
  497. data/lib/rex/proto/http/handler/proc.rb.ut.rb +0 -25
  498. data/lib/rex/proto/http/header.rb.ut.rb +0 -47
  499. data/lib/rex/proto/http/packet.rb.ut.rb +0 -166
  500. data/lib/rex/proto/http/request.rb.ut.rb +0 -215
  501. data/lib/rex/proto/http/response.rb.ut.rb +0 -150
  502. data/lib/rex/proto/http/server.rb.ut.rb +0 -80
  503. data/lib/rex/proto/ntlm.rb.ut.rb +0 -181
  504. data/lib/rex/proto/rfb.rb.ut.rb +0 -40
  505. data/lib/rex/proto/smb.rb.ts.rb +0 -9
  506. data/lib/rex/proto/smb/client.rb.ut.rb +0 -224
  507. data/lib/rex/proto/smb/constants.rb.ut.rb +0 -19
  508. data/lib/rex/proto/smb/simpleclient.rb.ut.rb +0 -129
  509. data/lib/rex/proto/smb/utils.rb.ut.rb +0 -21
  510. data/lib/rex/proto/tftp/server.rb.ut.rb +0 -29
  511. data/lib/rex/service_manager.rb.ut.rb +0 -33
  512. data/lib/rex/socket.rb.ut.rb +0 -108
  513. data/lib/rex/socket/comm/local.rb.ut.rb +0 -76
  514. data/lib/rex/socket/parameters.rb.ut.rb +0 -52
  515. data/lib/rex/socket/range_walker.rb.ut.rb +0 -56
  516. data/lib/rex/socket/ssl_tcp.rb.ut.rb +0 -40
  517. data/lib/rex/socket/ssl_tcp_server.rb.ut.rb +0 -62
  518. data/lib/rex/socket/subnet_walker.rb.ut.rb +0 -29
  519. data/lib/rex/socket/switch_board.rb.ut.rb +0 -53
  520. data/lib/rex/socket/tcp.rb.ut.rb +0 -65
  521. data/lib/rex/socket/tcp_server.rb.ut.rb +0 -45
  522. data/lib/rex/socket/udp.rb.ut.rb +0 -45
  523. data/lib/rex/test.rb +0 -36
  524. data/lib/rex/text.rb.ut.rb +0 -193
  525. data/lib/rex/transformer.rb.ut.rb +0 -39
  526. data/lib/rex/ui/text/color.rb.ut.rb +0 -19
  527. data/lib/rex/ui/text/progress_tracker.rb.ut.rb +0 -35
  528. data/lib/rex/ui/text/table.rb.ut.rb +0 -56
@@ -4,190 +4,190 @@ require "rex/parser/nokogiri_doc_mixin"
4
4
  require 'msf/core'
5
5
 
6
6
  module Rex
7
- module Parser
8
-
9
- # If Nokogiri is available, define the document class.
10
- load_nokogiri && class CIDocument < Nokogiri::XML::SAX::Document
11
-
12
- include NokogiriDocMixin
13
-
14
- attr_reader :text
15
-
16
- def initialize(*args)
17
- super(*args)
18
- @state[:has_text] = true
19
- end
20
-
21
- # Triggered every time a new element is encountered. We keep state
22
- # ourselves with the @state variable, turning things on when we
23
- # get here (and turning things off when we exit in end_element()).
24
- def start_element(name=nil,attrs=[])
25
- attrs = normalize_attrs(attrs)
26
- block = @block
27
-
28
- r = { :e => name }
29
- attrs.each { |pair| r[pair[0]] = pair[1] }
30
-
31
- if @state[:path]
32
- @state[:path].push r
33
- end
34
-
35
- case name
36
- when "entity"
37
- @state[:path] = [ r ]
38
- record_device(r)
39
- when "property"
40
- return if not @state[:address]
41
- return if not @state[:props]
42
- @state[:props] << [ r["type"], r["key"]]
43
- end
44
- end
45
-
46
- # When we exit a tag, this is triggered.
47
- def end_element(name=nil)
48
- block = @block
49
- case name
50
- when "entity" # Wrap it up
51
- if @state[:address]
52
- host_object = report_host &block
53
- report_services(host_object)
54
- report_vulns(host_object)
55
- end
56
- # Reset the state once we close a host
57
- @report_data = {:wspace => @args[:wspace]}
58
- @state[:root] = {}
59
- when "property"
60
- if @state[:props]
61
- @text.strip! if @text
62
- process_property
63
- @state[:props].pop
64
- end
65
- end
66
- @state[:path].pop
67
- @text = nil
68
- end
69
-
70
- def record_device(info)
71
- if info["class"] and info["class"] == "host" and info["name"]
72
- address = info["name"].to_s.gsub(/^.*\//, '')
73
- return if address !~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/
74
- @state[:address] = address
75
- @state[:props] = []
76
- end
77
- end
78
-
79
- def process_property
80
- return if not @state[:props]
81
- return if not @state[:props].length > 0
82
- @state[:root] ||= {}
83
- @cobj = @state[:root]
84
- property_parser(0)
85
- end
86
-
87
- def property_parser(idx)
88
- return if not @state[:props][idx]
89
- case @state[:props][idx][0]
90
- when "container", "ports", "entity", "properties"
91
- @cobj[ @state[:props][idx][1] ] ||= {}
92
- @cobj = @cobj[ @state[:props][idx][1] ]
93
- else
94
- @cobj[ state[:props][idx][1] ] = @text
95
- end
96
- property_parser(idx + 1)
97
- end
98
-
99
- def report_host(&block)
100
- @report_data = {
101
- :ports => [:ignore],
102
- :state => Msf::HostState::Alive,
103
- :host => @state[:address]
104
- }
105
-
106
- if @state[:root]["dns names"] and @state[:root]["dns names"].keys.length > 0
107
- @report_data[:name] = @state[:root]["dns names"].keys.first
108
- end
109
-
110
- if host_is_okay
111
- @report_data.delete(:ports)
112
-
113
- db.emit(:address, @report_data[:host],&block) if block
114
- host_object = db_report(:host, @report_data.merge(
115
- :workspace => @args[:wspace] ) )
116
- if host_object
117
- db.report_import_note(host_object.workspace, host_object)
118
- end
119
- host_object
120
- end
121
- end
122
-
123
- def report_services(host_object)
124
- return unless host_object.kind_of? ::Mdm::Host
125
-
126
- snames = {}
127
- ( @state[:root]["services"] || {} ).each_pair do |sname, sinfo|
128
- sinfo.each_pair do |pinfo,pdata|
129
- snames[pinfo] = sname.dup
130
- end
131
- end
132
-
133
- reported = []
134
- if @state[:root]["tcp_ports"]
135
- @state[:root]["tcp_ports"].each_pair do |pn, ps|
136
- ps = "open" if ps == "listen"
137
- svc = { :port => pn.to_i, :state => ps, :proto => 'tcp'}
138
- if @state[:root]["Banners"] and @state[:root]["Banners"][pn.to_s]
139
- svc[:info] = @state[:root]["Banners"][pn.to_s]
140
- end
141
- svc[:name] = snames["#{pn}-tcp"] if snames["#{pn}-tcp"]
142
- reported << db_report(:service, svc.merge(:host => host_object))
143
- end
144
- end
145
-
146
- if @state[:root]["udp_ports"]
147
- @state[:root]["udp_ports"].each_pair do |pn, ps|
148
- ps = "open" if ps == "listen"
149
- svc = { :port => pn.to_i, :state => ps, :proto => 'udp'}
150
- svc[:name] = snames["#{pn}-udp"] if snames["#{pn}-tcp"]
151
- reported << db_report(:service, svc.merge(:host => host_object))
152
- end
153
- end
154
-
155
- ( @state[:root]["services"] || {} ).each_pair do |sname, sinfo|
156
- sinfo.each_pair do |pinfo,pdata|
157
- sport,sproto = pinfo.split("-")
158
- db_report(:note, {
159
- :host => host_object,
160
- :port => sport.to_i,
161
- :proto => sproto,
162
- :ntype => "ci.#{sname}.fingerprint",
163
- :data => pdata
164
- })
165
- end
166
- end
167
-
168
- reported
169
- end
170
-
171
- def report_vulns(host_object)
172
- vuln_count = 0
173
- block = @block
174
- return unless host_object.kind_of? ::Mdm::Host
175
- return unless @state[:root]["Vulnerabilities"]
176
- @state[:root]["Vulnerabilities"].each_pair do |cve, vinfo|
177
- vinfo.each_pair do |vname, vdesc|
178
- data = {
179
- :workspace => host_object.workspace,
180
- :host => host_object,
181
- :name => vname,
182
- :info => vdesc,
183
- :refs => [ cve ]
184
- }
185
- db_report(:vuln, data)
186
- end
187
- end
188
- end
189
-
190
- end
7
+ module Parser
8
+
9
+ # If Nokogiri is available, define the document class.
10
+ load_nokogiri && class CIDocument < Nokogiri::XML::SAX::Document
11
+
12
+ include NokogiriDocMixin
13
+
14
+ attr_reader :text
15
+
16
+ def initialize(*args)
17
+ super(*args)
18
+ @state[:has_text] = true
19
+ end
20
+
21
+ # Triggered every time a new element is encountered. We keep state
22
+ # ourselves with the @state variable, turning things on when we
23
+ # get here (and turning things off when we exit in end_element()).
24
+ def start_element(name=nil,attrs=[])
25
+ attrs = normalize_attrs(attrs)
26
+ block = @block
27
+
28
+ r = { :e => name }
29
+ attrs.each { |pair| r[pair[0]] = pair[1] }
30
+
31
+ if @state[:path]
32
+ @state[:path].push r
33
+ end
34
+
35
+ case name
36
+ when "entity"
37
+ @state[:path] = [ r ]
38
+ record_device(r)
39
+ when "property"
40
+ return if not @state[:address]
41
+ return if not @state[:props]
42
+ @state[:props] << [ r["type"], r["key"]]
43
+ end
44
+ end
45
+
46
+ # When we exit a tag, this is triggered.
47
+ def end_element(name=nil)
48
+ block = @block
49
+ case name
50
+ when "entity" # Wrap it up
51
+ if @state[:address]
52
+ host_object = report_host &block
53
+ report_services(host_object)
54
+ report_vulns(host_object)
55
+ end
56
+ # Reset the state once we close a host
57
+ @report_data = {:wspace => @args[:wspace]}
58
+ @state[:root] = {}
59
+ when "property"
60
+ if @state[:props]
61
+ @text.strip! if @text
62
+ process_property
63
+ @state[:props].pop
64
+ end
65
+ end
66
+ @state[:path].pop
67
+ @text = nil
68
+ end
69
+
70
+ def record_device(info)
71
+ if info["class"] and info["class"] == "host" and info["name"]
72
+ address = info["name"].to_s.gsub(/^.*\//, '')
73
+ return if address !~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/
74
+ @state[:address] = address
75
+ @state[:props] = []
76
+ end
77
+ end
78
+
79
+ def process_property
80
+ return if not @state[:props]
81
+ return if not @state[:props].length > 0
82
+ @state[:root] ||= {}
83
+ @cobj = @state[:root]
84
+ property_parser(0)
85
+ end
86
+
87
+ def property_parser(idx)
88
+ return if not @state[:props][idx]
89
+ case @state[:props][idx][0]
90
+ when "container", "ports", "entity", "properties"
91
+ @cobj[ @state[:props][idx][1] ] ||= {}
92
+ @cobj = @cobj[ @state[:props][idx][1] ]
93
+ else
94
+ @cobj[ state[:props][idx][1] ] = @text
95
+ end
96
+ property_parser(idx + 1)
97
+ end
98
+
99
+ def report_host(&block)
100
+ @report_data = {
101
+ :ports => [:ignore],
102
+ :state => Msf::HostState::Alive,
103
+ :host => @state[:address]
104
+ }
105
+
106
+ if @state[:root]["dns names"] and @state[:root]["dns names"].keys.length > 0
107
+ @report_data[:name] = @state[:root]["dns names"].keys.first
108
+ end
109
+
110
+ if host_is_okay
111
+ @report_data.delete(:ports)
112
+
113
+ db.emit(:address, @report_data[:host],&block) if block
114
+ host_object = db_report(:host, @report_data.merge(
115
+ :workspace => @args[:wspace] ) )
116
+ if host_object
117
+ db.report_import_note(host_object.workspace, host_object)
118
+ end
119
+ host_object
120
+ end
121
+ end
122
+
123
+ def report_services(host_object)
124
+ return unless host_object.kind_of? ::Mdm::Host
125
+
126
+ snames = {}
127
+ ( @state[:root]["services"] || {} ).each_pair do |sname, sinfo|
128
+ sinfo.each_pair do |pinfo,pdata|
129
+ snames[pinfo] = sname.dup
130
+ end
131
+ end
132
+
133
+ reported = []
134
+ if @state[:root]["tcp_ports"]
135
+ @state[:root]["tcp_ports"].each_pair do |pn, ps|
136
+ ps = "open" if ps == "listen"
137
+ svc = { :port => pn.to_i, :state => ps, :proto => 'tcp'}
138
+ if @state[:root]["Banners"] and @state[:root]["Banners"][pn.to_s]
139
+ svc[:info] = @state[:root]["Banners"][pn.to_s]
140
+ end
141
+ svc[:name] = snames["#{pn}-tcp"] if snames["#{pn}-tcp"]
142
+ reported << db_report(:service, svc.merge(:host => host_object))
143
+ end
144
+ end
145
+
146
+ if @state[:root]["udp_ports"]
147
+ @state[:root]["udp_ports"].each_pair do |pn, ps|
148
+ ps = "open" if ps == "listen"
149
+ svc = { :port => pn.to_i, :state => ps, :proto => 'udp'}
150
+ svc[:name] = snames["#{pn}-udp"] if snames["#{pn}-tcp"]
151
+ reported << db_report(:service, svc.merge(:host => host_object))
152
+ end
153
+ end
154
+
155
+ ( @state[:root]["services"] || {} ).each_pair do |sname, sinfo|
156
+ sinfo.each_pair do |pinfo,pdata|
157
+ sport,sproto = pinfo.split("-")
158
+ db_report(:note, {
159
+ :host => host_object,
160
+ :port => sport.to_i,
161
+ :proto => sproto,
162
+ :ntype => "ci.#{sname}.fingerprint",
163
+ :data => pdata
164
+ })
165
+ end
166
+ end
167
+
168
+ reported
169
+ end
170
+
171
+ def report_vulns(host_object)
172
+ vuln_count = 0
173
+ block = @block
174
+ return unless host_object.kind_of? ::Mdm::Host
175
+ return unless @state[:root]["Vulnerabilities"]
176
+ @state[:root]["Vulnerabilities"].each_pair do |cve, vinfo|
177
+ vinfo.each_pair do |vname, vdesc|
178
+ data = {
179
+ :workspace => host_object.workspace,
180
+ :host => host_object,
181
+ :name => vname,
182
+ :info => vdesc,
183
+ :refs => [ cve ]
184
+ }
185
+ db_report(:vuln, data)
186
+ end
187
+ end
188
+ end
189
+
190
+ end
191
191
  end
192
192
  end
193
193
 
@@ -2,339 +2,340 @@
2
2
  require "rex/parser/nokogiri_doc_mixin"
3
3
 
4
4
  module Rex
5
- module Parser
6
-
7
- # If Nokogiri is available, define Template document class.
8
- load_nokogiri && class FoundstoneDocument < Nokogiri::XML::SAX::Document
9
-
10
- include NokogiriDocMixin
11
-
12
- def start_document
13
- @report_type_ok = true # Optimistic
14
- end
15
-
16
- # Triggered every time a new element is encountered. We keep state
17
- # ourselves with the @state variable, turning things on when we
18
- # get here (and turning things off when we exit in end_element()).
19
- def start_element(name=nil,attrs=[])
20
- attrs = normalize_attrs(attrs)
21
- block = @block
22
- return unless @report_type_ok
23
- @state[:current_tag][name] = true
24
- case name
25
- when "ReportInfo"
26
- check_for_correct_report_type(attrs,&block)
27
- when "Host"
28
- record_host(attrs)
29
- when "Service"
30
- record_service(attrs)
31
- when "Port", "Protocol", "Banner"
32
- @state[:has_text] = true
33
- when "Vuln" # under VulnsFound, ignore risk 0 things
34
- record_vuln(attrs)
35
- when "Risk" # for Vuln
36
- @state[:has_text] = true
37
- when "CVE" # Under Vuln
38
- @state[:has_text] = true
39
- end
40
- end
41
-
42
- # When we exit a tag, this is triggered.
43
- def end_element(name=nil)
44
- block = @block
45
- return unless @report_type_ok
46
- case name
47
- when "Host" # Wrap it up
48
- collect_host_data
49
- host_object = report_host &block
50
- if host_object
51
- db.report_import_note(@args[:wspace],host_object)
52
- report_fingerprint(host_object)
53
- report_services(host_object)
54
- report_vulns(host_object)
55
- end
56
- # Reset the state once we close a host
57
- @state.delete_if {|k| k != :current_tag}
58
- when "Port"
59
- @state[:has_text] = false
60
- collect_port
61
- when "Protocol"
62
- @state[:has_text] = false
63
- collect_protocol
64
- when "Banner"
65
- collect_banner
66
- @state[:has_text] = false
67
- when "Service"
68
- collect_service
69
- when "Vuln"
70
- collect_vuln
71
- when "Risk"
72
- @state[:has_text] = false
73
- collect_risk
74
- when "CVE"
75
- @state[:has_text] = false
76
- collect_cve
77
- end
78
- @state[:current_tag].delete name
79
- end
80
-
81
- # Nothing technically stopping us from parsing this as well,
82
- # but saving this for later
83
- def check_for_correct_report_type(attrs,&block)
84
- report_type = attr_hash(attrs)["ReportType"]
85
- if report_type == "Network Inventory"
86
- @report_type_ok = true
87
- else
88
- if report_type == "Risk Data"
89
- msg = "The Foundstone/Mcafee report type '#{report_type}' is not currently supported"
90
- msg << ",\nso no data will be imported. Please use the 'Network Inventory' report instead."
91
- else
92
- msg = ".\nThe Foundstone/Macafee report type '#{report_type}' is unsupported."
93
- end
94
- db.emit(:warning,msg,&block) if block
95
- @report_type_ok = false
96
- end
97
- end
98
-
99
- def collect_risk
100
- return unless in_tag("VulnsFound")
101
- return unless in_tag("HostData")
102
- return unless in_tag("Host")
103
- risk = @text.to_s.to_i
104
- @state[:vuln][:risk] = risk
105
- @text = nil
106
- end
107
-
108
- def collect_cve
109
- return unless in_tag("VulnsFound")
110
- return unless in_tag("HostData")
111
- return unless in_tag("Host")
112
- cve = @text.to_s
113
- @state[:vuln][:cves] ||= []
114
- @state[:vuln][:cves] << cve unless cve == "CVE-MAP-NOMATCH"
115
- @text = nil
116
- end
117
-
118
- # Determines if we should keep the vuln or not. Note that
119
- # we cannot tie them to a service.
120
- def collect_vuln
121
- return unless in_tag("VulnsFound")
122
- return unless in_tag("HostData")
123
- return unless in_tag("Host")
124
- return if @state[:vuln][:risk] == 0
125
- @report_data[:vulns] ||= []
126
- vuln_hash = {}
127
- vuln_hash[:name] = @state[:vuln]["VulnName"]
128
- refs = []
129
- refs << "FID-#{@state[:vuln]["id"]}"
130
- if @state[:vuln][:cves]
131
- @state[:vuln][:cves].each {|cve| refs << cve}
132
- end
133
- vuln_hash[:refs] = refs
134
- @report_data[:vulns] << vuln_hash
135
- end
136
-
137
- # These are per host.
138
- def record_vuln(attrs)
139
- return unless in_tag("VulnsFound")
140
- return unless in_tag("HostData")
141
- return unless in_tag("Host")
142
- @state[:vulns] ||= []
143
-
144
- @state[:vuln] = attr_hash(attrs) # id and VulnName
145
- end
146
-
147
- def record_service(attrs)
148
- return unless in_tag("ServicesFound")
149
- return unless in_tag("Host")
150
- @state[:service] = attr_hash(attrs)
151
- end
152
-
153
- def collect_port
154
- return unless in_tag("Service")
155
- return unless in_tag("ServicesFound")
156
- return unless in_tag("Host")
157
- return if @text.nil? || @text.empty?
158
- @state[:service][:port] = @text.strip
159
- @text = nil
160
- end
161
-
162
- def collect_protocol
163
- return unless in_tag("Service")
164
- return unless in_tag("ServicesFound")
165
- return unless in_tag("Host")
166
- return if @text.nil? || @text.empty?
167
- @state[:service][:proto] = @text.strip
168
- @text = nil
169
- end
170
-
171
- def collect_banner
172
- return unless in_tag("Service")
173
- return unless in_tag("ServicesFound")
174
- return unless in_tag("Host")
175
- return if @text.nil? || @text.empty?
176
- banner = normalize_foundstone_banner(@state[:service]["ServiceName"],@text)
177
- unless banner.nil? || banner.empty?
178
- @state[:service][:banner] = banner
179
- end
180
- @text = nil
181
- end
182
-
183
- def collect_service
184
- return unless in_tag("ServicesFound")
185
- return unless in_tag("Host")
186
- return unless @state[:service][:port]
187
- @report_data[:ports] ||= []
188
- port_hash = {}
189
- port_hash[:port] = @state[:service][:port]
190
- port_hash[:proto] = @state[:service][:proto]
191
- port_hash[:info] = @state[:service][:banner]
192
- port_hash[:name] = db.nmap_msf_service_map(@state[:service]["ServiceName"])
193
- @report_data[:ports] << port_hash
194
- end
195
-
196
- def record_host(attrs)
197
- return unless in_tag("HostData")
198
- @state[:host] = attr_hash(attrs)
199
- end
200
-
201
- def collect_host_data
202
- @report_data[:host] = @state[:host]["IPAddress"]
203
- if @state[:host]["NBName"] && !@state[:host]["NBName"].empty?
204
- @report_data[:name] = @state[:host]["NBName"]
205
- elsif @state[:host]["DNSName"] && !@state[:host]["DNSName"].empty?
206
- @report_data[:name] = @state[:host]["DNSName"]
207
- end
208
- if @state[:host]["OSName"] && !@state[:host]["OSName"].empty?
209
- @report_data[:os_fingerprint] = @state[:host]["OSName"]
210
- end
211
- @report_data[:state] = Msf::HostState::Alive
212
- @report_data[:mac] = @state[:mac] if @state[:mac]
213
- end
214
-
215
- def report_host(&block)
216
- return unless in_tag("HostData")
217
- if host_is_okay
218
- db.emit(:address,@report_data[:host],&block) if block
219
- host_info = @report_data.merge(:workspace => @args[:wspace])
220
- db_report(:host,host_info)
221
- end
222
- end
223
-
224
- def report_fingerprint(host_object)
225
- fp_note = {
226
- :workspace => host_object.workspace,
227
- :host => host_object,
228
- :type => 'host.os.foundstone_fingerprint',
229
- :data => {:os => @report_data[:os_fingerprint] }
230
- }
231
- db_report(:note, fp_note)
232
- end
233
-
234
- def report_services(host_object)
235
- return unless in_tag("HostData")
236
- return unless host_object.kind_of? ::Mdm::Host
237
- return unless @report_data[:ports]
238
- return if @report_data[:ports].empty?
239
- @report_data[:ports].each do |svc|
240
- db_report(:service, svc.merge(:host => host_object))
241
- end
242
- end
243
-
244
- def report_vulns(host_object)
245
- return unless in_tag("HostData")
246
- return unless host_object.kind_of? ::Mdm::Host
247
- return unless @report_data[:vulns]
248
- return if @report_data[:vulns].empty?
249
- @report_data[:vulns].each do |vuln|
250
- db_report(:vuln, vuln.merge(:host => host_object))
251
- end
252
- end
253
-
254
- # Foundstone's banners are pretty free-form
255
- # and often not just banners. Clean them up
256
- # for the :info field, delegate off for other
257
- # protocol data we can use.
258
- def normalize_foundstone_banner(service,banner)
259
- return "" if(banner.nil? || banner.strip.empty?)
260
- if first_line_only? service
261
- return (first_line banner)
262
- elsif needs_more_processing? service
263
- return process_service(service,banner)
264
- else
265
- return (first_line banner)
266
- end
267
- end
268
-
269
- # Services where we only care about the first
270
- # line of the banner tag.
271
- def first_line_only?(service)
272
- svcs = %w{
273
- vnc ftp ftps smtp oracle-tns nntp ssh ntp
274
- }
275
- 9.times {|i| svcs << "vnc-#{i}"}
276
- svcs.include? service
277
- end
278
-
279
- # Services where we need to do more processing
280
- # before handing the banner back.
281
- def needs_more_processing?(service)
282
- svcs = %w{
283
- microsoft-ds loc-srv http https sunrpc netbios-ns
284
- }
285
- svcs.include? service
286
- end
287
-
288
- def first_line(str)
289
- str.split("\n").first.to_s.strip
290
- end
291
-
292
- # XXX: Actually implement more of these
293
- def process_service(service,banner)
294
- meth = "process_service_#{service.gsub("-","_")}"
295
- if self.respond_to? meth
296
- self.send meth, banner
297
- else
298
- return (first_line banner)
299
- end
300
- end
301
-
302
- # XXX: Register a proper netbios note as the regular
303
- # scanner does.
304
- def process_service_netbios_ns(banner)
305
- mac_regex = /[0-9A-Fa-f:]{17}/
306
- @state[:mac] = banner[mac_regex]
307
- first_line banner
308
- end
309
-
310
- # XXX: Make this behave more like the smb scanner
311
- def process_service_microsoft_ds(banner)
312
- lm_regex = /Native LAN Manager/
313
- lm_banner = nil
314
- banner.each_line { |line|
315
- if line[lm_regex]
316
- lm_banner = line
317
- break
318
- end
319
- }
320
- lm_banner || first_line(banner)
321
- end
322
-
323
- def process_service_http(banner)
324
- server = nil
325
- banner.each_line do |line|
326
- if line =~ /^Server:\s+(.*)/
327
- server = $1
328
- break
329
- end
330
- end
331
- server || first_line(banner)
332
- end
333
-
334
- alias :process_service_https :process_service_http
335
- alias :process_service_rtsp :process_service_http
336
-
337
- end
5
+ module Parser
6
+
7
+ # If Nokogiri is available, define Template document class.
8
+ load_nokogiri && class FoundstoneDocument < Nokogiri::XML::SAX::Document
9
+
10
+ include NokogiriDocMixin
11
+
12
+ def start_document
13
+ @report_type_ok = true # Optimistic
14
+ end
15
+
16
+ # Triggered every time a new element is encountered. We keep state
17
+ # ourselves with the @state variable, turning things on when we
18
+ # get here (and turning things off when we exit in end_element()).
19
+ def start_element(name=nil,attrs=[])
20
+ attrs = normalize_attrs(attrs)
21
+ block = @block
22
+ return unless @report_type_ok
23
+ @state[:current_tag][name] = true
24
+ case name
25
+ when "ReportInfo"
26
+ check_for_correct_report_type(attrs,&block)
27
+ when "Host"
28
+ record_host(attrs)
29
+ when "Service"
30
+ record_service(attrs)
31
+ when "Port", "Protocol", "Banner"
32
+ @state[:has_text] = true
33
+ when "Vuln" # under VulnsFound, ignore risk 0 things
34
+ record_vuln(attrs)
35
+ when "Risk" # for Vuln
36
+ @state[:has_text] = true
37
+ when "CVE" # Under Vuln
38
+ @state[:has_text] = true
39
+ end
40
+ end
41
+
42
+ # When we exit a tag, this is triggered.
43
+ def end_element(name=nil)
44
+ block = @block
45
+ return unless @report_type_ok
46
+ case name
47
+ when "Host" # Wrap it up
48
+ collect_host_data
49
+ host_object = report_host &block
50
+ if host_object
51
+ db.report_import_note(@args[:wspace],host_object)
52
+ report_fingerprint(host_object)
53
+ report_services(host_object)
54
+ report_vulns(host_object)
55
+ end
56
+ # Reset the state once we close a host
57
+ @state.delete_if {|k| k != :current_tag}
58
+ @report_data = {:wspace => args[:wspace]}
59
+ when "Port"
60
+ @state[:has_text] = false
61
+ collect_port
62
+ when "Protocol"
63
+ @state[:has_text] = false
64
+ collect_protocol
65
+ when "Banner"
66
+ collect_banner
67
+ @state[:has_text] = false
68
+ when "Service"
69
+ collect_service
70
+ when "Vuln"
71
+ collect_vuln
72
+ when "Risk"
73
+ @state[:has_text] = false
74
+ collect_risk
75
+ when "CVE"
76
+ @state[:has_text] = false
77
+ collect_cve
78
+ end
79
+ @state[:current_tag].delete name
80
+ end
81
+
82
+ # Nothing technically stopping us from parsing this as well,
83
+ # but saving this for later
84
+ def check_for_correct_report_type(attrs,&block)
85
+ report_type = attr_hash(attrs)["ReportType"]
86
+ if report_type == "Network Inventory"
87
+ @report_type_ok = true
88
+ else
89
+ if report_type == "Risk Data"
90
+ msg = "The Foundstone/Mcafee report type '#{report_type}' is not currently supported"
91
+ msg << ",\nso no data will be imported. Please use the 'Network Inventory' report instead."
92
+ else
93
+ msg = ".\nThe Foundstone/Macafee report type '#{report_type}' is unsupported."
94
+ end
95
+ db.emit(:warning,msg,&block) if block
96
+ @report_type_ok = false
97
+ end
98
+ end
99
+
100
+ def collect_risk
101
+ return unless in_tag("VulnsFound")
102
+ return unless in_tag("HostData")
103
+ return unless in_tag("Host")
104
+ risk = @text.to_s.to_i
105
+ @state[:vuln][:risk] = risk
106
+ @text = nil
107
+ end
108
+
109
+ def collect_cve
110
+ return unless in_tag("VulnsFound")
111
+ return unless in_tag("HostData")
112
+ return unless in_tag("Host")
113
+ cve = @text.to_s
114
+ @state[:vuln][:cves] ||= []
115
+ @state[:vuln][:cves] << cve unless cve == "CVE-MAP-NOMATCH"
116
+ @text = nil
117
+ end
118
+
119
+ # Determines if we should keep the vuln or not. Note that
120
+ # we cannot tie them to a service.
121
+ def collect_vuln
122
+ return unless in_tag("VulnsFound")
123
+ return unless in_tag("HostData")
124
+ return unless in_tag("Host")
125
+ return if @state[:vuln][:risk] == 0
126
+ @report_data[:vulns] ||= []
127
+ vuln_hash = {}
128
+ vuln_hash[:name] = @state[:vuln]["VulnName"]
129
+ refs = []
130
+ refs << "FID-#{@state[:vuln]["id"]}"
131
+ if @state[:vuln][:cves]
132
+ @state[:vuln][:cves].each {|cve| refs << cve}
133
+ end
134
+ vuln_hash[:refs] = refs
135
+ @report_data[:vulns] << vuln_hash
136
+ end
137
+
138
+ # These are per host.
139
+ def record_vuln(attrs)
140
+ return unless in_tag("VulnsFound")
141
+ return unless in_tag("HostData")
142
+ return unless in_tag("Host")
143
+ @state[:vulns] ||= []
144
+
145
+ @state[:vuln] = attr_hash(attrs) # id and VulnName
146
+ end
147
+
148
+ def record_service(attrs)
149
+ return unless in_tag("ServicesFound")
150
+ return unless in_tag("Host")
151
+ @state[:service] = attr_hash(attrs)
152
+ end
153
+
154
+ def collect_port
155
+ return unless in_tag("Service")
156
+ return unless in_tag("ServicesFound")
157
+ return unless in_tag("Host")
158
+ return if @text.nil? || @text.empty?
159
+ @state[:service][:port] = @text.strip
160
+ @text = nil
161
+ end
162
+
163
+ def collect_protocol
164
+ return unless in_tag("Service")
165
+ return unless in_tag("ServicesFound")
166
+ return unless in_tag("Host")
167
+ return if @text.nil? || @text.empty?
168
+ @state[:service][:proto] = @text.strip
169
+ @text = nil
170
+ end
171
+
172
+ def collect_banner
173
+ return unless in_tag("Service")
174
+ return unless in_tag("ServicesFound")
175
+ return unless in_tag("Host")
176
+ return if @text.nil? || @text.empty?
177
+ banner = normalize_foundstone_banner(@state[:service]["ServiceName"],@text)
178
+ unless banner.nil? || banner.empty?
179
+ @state[:service][:banner] = banner
180
+ end
181
+ @text = nil
182
+ end
183
+
184
+ def collect_service
185
+ return unless in_tag("ServicesFound")
186
+ return unless in_tag("Host")
187
+ return unless @state[:service][:port]
188
+ @report_data[:ports] ||= []
189
+ port_hash = {}
190
+ port_hash[:port] = @state[:service][:port]
191
+ port_hash[:proto] = @state[:service][:proto]
192
+ port_hash[:info] = @state[:service][:banner]
193
+ port_hash[:name] = db.nmap_msf_service_map(@state[:service]["ServiceName"])
194
+ @report_data[:ports] << port_hash
195
+ end
196
+
197
+ def record_host(attrs)
198
+ return unless in_tag("HostData")
199
+ @state[:host] = attr_hash(attrs)
200
+ end
201
+
202
+ def collect_host_data
203
+ @report_data[:host] = @state[:host]["IPAddress"]
204
+ if @state[:host]["NBName"] && !@state[:host]["NBName"].empty?
205
+ @report_data[:name] = @state[:host]["NBName"]
206
+ elsif @state[:host]["DNSName"] && !@state[:host]["DNSName"].empty?
207
+ @report_data[:name] = @state[:host]["DNSName"]
208
+ end
209
+ if @state[:host]["OSName"] && !@state[:host]["OSName"].empty?
210
+ @report_data[:os_fingerprint] = @state[:host]["OSName"]
211
+ end
212
+ @report_data[:state] = Msf::HostState::Alive
213
+ @report_data[:mac] = @state[:mac] if @state[:mac]
214
+ end
215
+
216
+ def report_host(&block)
217
+ return unless in_tag("HostData")
218
+ if host_is_okay
219
+ db.emit(:address,@report_data[:host],&block) if block
220
+ host_info = @report_data.merge(:workspace => @args[:wspace])
221
+ db_report(:host,host_info)
222
+ end
223
+ end
224
+
225
+ def report_fingerprint(host_object)
226
+ fp_note = {
227
+ :workspace => host_object.workspace,
228
+ :host => host_object,
229
+ :type => 'host.os.foundstone_fingerprint',
230
+ :data => {:os => @report_data[:os_fingerprint] }
231
+ }
232
+ db_report(:note, fp_note)
233
+ end
234
+
235
+ def report_services(host_object)
236
+ return unless in_tag("HostData")
237
+ return unless host_object.kind_of? ::Mdm::Host
238
+ return unless @report_data[:ports]
239
+ return if @report_data[:ports].empty?
240
+ @report_data[:ports].each do |svc|
241
+ db_report(:service, svc.merge(:host => host_object))
242
+ end
243
+ end
244
+
245
+ def report_vulns(host_object)
246
+ return unless in_tag("HostData")
247
+ return unless host_object.kind_of? ::Mdm::Host
248
+ return unless @report_data[:vulns]
249
+ return if @report_data[:vulns].empty?
250
+ @report_data[:vulns].each do |vuln|
251
+ db_report(:vuln, vuln.merge(:host => host_object))
252
+ end
253
+ end
254
+
255
+ # Foundstone's banners are pretty free-form
256
+ # and often not just banners. Clean them up
257
+ # for the :info field, delegate off for other
258
+ # protocol data we can use.
259
+ def normalize_foundstone_banner(service,banner)
260
+ return "" if(banner.nil? || banner.strip.empty?)
261
+ if first_line_only? service
262
+ return (first_line banner)
263
+ elsif needs_more_processing? service
264
+ return process_service(service,banner)
265
+ else
266
+ return (first_line banner)
267
+ end
268
+ end
269
+
270
+ # Services where we only care about the first
271
+ # line of the banner tag.
272
+ def first_line_only?(service)
273
+ svcs = %w{
274
+ vnc ftp ftps smtp oracle-tns nntp ssh ntp
275
+ }
276
+ 9.times {|i| svcs << "vnc-#{i}"}
277
+ svcs.include? service
278
+ end
279
+
280
+ # Services where we need to do more processing
281
+ # before handing the banner back.
282
+ def needs_more_processing?(service)
283
+ svcs = %w{
284
+ microsoft-ds loc-srv http https sunrpc netbios-ns
285
+ }
286
+ svcs.include? service
287
+ end
288
+
289
+ def first_line(str)
290
+ str.split("\n").first.to_s.strip
291
+ end
292
+
293
+ # XXX: Actually implement more of these
294
+ def process_service(service,banner)
295
+ meth = "process_service_#{service.gsub("-","_")}"
296
+ if self.respond_to? meth
297
+ self.send meth, banner
298
+ else
299
+ return (first_line banner)
300
+ end
301
+ end
302
+
303
+ # XXX: Register a proper netbios note as the regular
304
+ # scanner does.
305
+ def process_service_netbios_ns(banner)
306
+ mac_regex = /[0-9A-Fa-f:]{17}/
307
+ @state[:mac] = banner[mac_regex]
308
+ first_line banner
309
+ end
310
+
311
+ # XXX: Make this behave more like the smb scanner
312
+ def process_service_microsoft_ds(banner)
313
+ lm_regex = /Native LAN Manager/
314
+ lm_banner = nil
315
+ banner.each_line { |line|
316
+ if line[lm_regex]
317
+ lm_banner = line
318
+ break
319
+ end
320
+ }
321
+ lm_banner || first_line(banner)
322
+ end
323
+
324
+ def process_service_http(banner)
325
+ server = nil
326
+ banner.each_line do |line|
327
+ if line =~ /^Server:\s+(.*)/
328
+ server = $1
329
+ break
330
+ end
331
+ end
332
+ server || first_line(banner)
333
+ end
334
+
335
+ alias :process_service_https :process_service_http
336
+ alias :process_service_rtsp :process_service_http
337
+
338
+ end
338
339
 
339
340
  end
340
341
  end