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
@@ -2,328 +2,328 @@
2
2
  require "rex/parser/nokogiri_doc_mixin"
3
3
 
4
4
  module Rex
5
- module Parser
6
-
7
- # If Nokogiri is available, define Nexpose document class.
8
- load_nokogiri && class NexposeSimpleDocument < Nokogiri::XML::SAX::Document
9
-
10
- include NokogiriDocMixin
11
-
12
- attr_reader :text
13
-
14
- # Triggered every time a new element is encountered. We keep state
15
- # ourselves with the @state variable, turning things on when we
16
- # get here (and turning things off when we exit in end_element()).
17
- def start_element(name=nil,attrs=[])
18
- attrs = normalize_attrs(attrs)
19
- block = @block
20
- @state[:current_tag][name] = true
21
- case name
22
- when "device"
23
- record_device(attrs)
24
- when "service"
25
- record_service(attrs)
26
- when "fingerprint"
27
- record_service_fingerprint(attrs)
28
- record_host_fingerprint(attrs)
29
- when "description"
30
- @state[:has_text] = true
31
- record_host_fingerprint_data(name,attrs)
32
- when "vendor", "family", "product", "version", "architecture"
33
- @state[:has_text] = true
34
- record_host_fingerprint_data(name,attrs)
35
- when "vulnerability"
36
- record_service_vuln(attrs)
37
- record_host_vuln(attrs)
38
- when "id"
39
- @state[:has_text] = true
40
- record_service_vuln_id(attrs)
41
- record_host_vuln_id(attrs)
42
- end
43
- end
44
-
45
- # When we exit a tag, this is triggered.
46
- def end_element(name=nil)
47
- block = @block
48
- case name
49
- when "device" # Wrap it up
50
- collect_device_data
51
- host_object = report_host &block
52
- report_services(host_object)
53
- report_host_fingerprint(host_object)
54
- report_vulns(host_object)
55
- # Reset the state once we close a host
56
- @state.delete_if {|k| k != :current_tag}
57
- @report_data = {:wspace => @args[:wspace]}
58
- when "description"
59
- @state[:has_text] = false
60
- collect_service_fingerprint_description
61
- collect_host_fingerprint_data(name)
62
- @text = nil
63
- when "vendor", "family", "product", "version", "architecture"
64
- @state[:has_text] = false
65
- collect_host_fingerprint_data(name)
66
- @text = nil
67
- when "service"
68
- collect_service_data
69
- when "id"
70
- @state[:has_text] = false
71
- collect_service_vuln_id
72
- collect_host_vuln_id
73
- @text = nil
74
- when "vulnerability"
75
- collect_service_vuln
76
- collect_host_vuln
77
- @state[:references] = nil
78
- end
79
- @state[:current_tag].delete name
80
- end
81
-
82
- def report_vulns(host_object)
83
- vuln_count = 0
84
- block = @block
85
- return unless host_object.kind_of? ::Mdm::Host
86
- return unless @report_data[:vulns]
87
- @report_data[:vulns].each do |vuln|
88
- if vuln[:refs]
89
- vuln[:refs] << vuln[:name]
90
- else
91
- vuln[:refs] = [vuln[:name]]
92
- end
93
- vuln[:refs].uniq!
94
- data = {
95
- :workspace => host_object.workspace,
96
- :host => host_object,
97
- :name => vuln[:name],
98
- :info => vuln[:info],
99
- :refs => vuln[:refs]
100
- }
101
- if vuln[:port] && vuln[:proto]
102
- data[:port] = vuln[:port]
103
- data[:proto] = vuln[:proto]
104
- end
105
- db_report(:vuln,data)
106
- end
107
-
108
- end
109
-
110
- def collect_host_vuln_id
111
- return unless in_tag("device")
112
- return unless in_tag("vulnerability")
113
- return if in_tag("service")
114
- return unless @state[:host_vuln_id]
115
- @state[:references] ||= []
116
- ref = normalize_ref( @state[:host_vuln_id]["type"], @text )
117
- @state[:references] << ref if ref
118
- @state[:host_vuln_id] = nil
119
- @text = nil
120
- end
121
-
122
- def collect_service_vuln_id
123
- return unless in_tag("device")
124
- return unless in_tag("vulnerability")
125
- return unless in_tag("service")
126
- return unless @state[:service_vuln_id]
127
- @state[:references] ||= []
128
- ref = normalize_ref( @state[:service_vuln_id]["type"], @text )
129
- @state[:references] << ref if ref
130
- @state[:service_vuln_id] = nil
131
- @text = nil
132
- end
133
-
134
- def collect_service_vuln
135
- return unless in_tag("device")
136
- return unless in_tag("vulnerability")
137
- return unless in_tag("service")
138
- @report_data[:vulns] ||= []
139
- return unless actually_vulnerable(@state[:service_vuln])
140
- return if @state[:service]["port"].to_i == 0
141
- vid = @state[:service_vuln]["id"].to_s.downcase
142
- vuln = {
143
- :name => "NEXPOSE-#{vid}",
144
- :info => vid,
145
- :refs => @state[:references],
146
- :port => @state[:service]["port"].to_i,
147
- :proto => @state[:service]["protocol"]
148
- }
149
- @report_data[:vulns] << vuln
150
- end
151
-
152
- def collect_host_vuln
153
- return unless in_tag("vulnerability")
154
- return unless in_tag("device")
155
- return if in_tag("service")
156
- @report_data[:vulns] ||= []
157
- return unless actually_vulnerable(@state[:host_vuln])
158
- vid = @state[:host_vuln]["id"].to_s.downcase
159
- vuln = {
160
- :name => "NEXPOSE-#{vid}",
161
- :info => vid,
162
- :refs => @state[:references]
163
- }
164
- @report_data[:vulns] << vuln
165
- end
166
-
167
- def record_host_vuln_id(attrs)
168
- return unless in_tag("device")
169
- return if in_tag("service")
170
- @state[:host_vuln_id] = attr_hash(attrs)
171
- end
172
-
173
- def record_host_vuln(attrs)
174
- return unless in_tag("device")
175
- return if in_tag("service")
176
- @state[:host_vuln] = attr_hash(attrs)
177
- end
178
-
179
- def record_service_vuln_id(attrs)
180
- return unless in_tag("device")
181
- return unless in_tag("service")
182
- @state[:service_vuln_id] = attr_hash(attrs)
183
- end
184
-
185
- def record_service_vuln(attrs)
186
- return unless in_tag("device")
187
- return unless in_tag("service")
188
- @state[:service_vuln] = attr_hash(attrs)
189
- end
190
-
191
- def actually_vulnerable(vuln)
192
- vuln_result = vuln["resultCode"]
193
- vuln_result =~ /^V[VE]$/
194
- end
195
-
196
- def record_device(attrs)
197
- attrs.each do |k,v|
198
- next unless k == "address"
199
- @state[:address] = v
200
- end
201
- end
202
-
203
- def record_host_fingerprint(attrs)
204
- return unless in_tag("device")
205
- return if in_tag("service")
206
- @state[:host_fingerprint] = attr_hash(attrs)
207
- end
208
-
209
- def collect_device_data
210
- return unless in_tag("device")
211
- @report_data[:host] = @state[:address]
212
- @report_data[:state] = Msf::HostState::Alive # always
213
- end
214
-
215
- def record_host_fingerprint_data(name, attrs)
216
- return unless in_tag("device")
217
- return if in_tag("service")
218
- return unless in_tag("fingerprint")
219
- @state[:host_fingerprint] ||= {}
220
- @state[:host_fingerprint].merge! attr_hash(attrs)
221
- end
222
-
223
- def collect_host_fingerprint_data(name)
224
- return unless in_tag("device")
225
- return if in_tag("service")
226
- return unless in_tag("fingerprint")
227
- return unless @text
228
- @report_data[:host_fingerprint] ||= {}
229
- @report_data[:host_fingerprint].merge!(@state[:host_fingerprint])
230
- @report_data[:host_fingerprint][name] = @text.to_s.strip
231
- @text = nil
232
- end
233
-
234
- def report_host(&block)
235
- if host_is_okay
236
- db.emit(:address,@report_data[:host],&block) if block
237
- host_object = db_report(:host, @report_data.merge(
238
- :workspace => @args[:wspace] ) )
239
- if host_object
240
- db.report_import_note(host_object.workspace, host_object)
241
- end
242
- host_object
243
- end
244
- end
245
-
246
- def report_host_fingerprint(host_object)
247
- return unless host_object.kind_of? ::Mdm::Host
248
- return unless @report_data[:host_fingerprint].kind_of? Hash
249
- @report_data[:host_fingerprint].reject! {|k,v| v.nil? || v.empty?}
250
- return if @report_data[:host_fingerprint].empty?
251
- note = {
252
- :workspace => host_object.workspace,
253
- :host => host_object,
254
- :type => "host.os.nexpose_fingerprint"
255
- }
256
- data = {
257
- :desc => @report_data[:host_fingerprint]["description"],
258
- :vendor => @report_data[:host_fingerprint]["vendor"],
259
- :family => @report_data[:host_fingerprint]["family"],
260
- :product => @report_data[:host_fingerprint]["product"],
261
- :version => @report_data[:host_fingerprint]["version"],
262
- :arch => @report_data[:host_fingerprint]["architecture"]
263
- }
264
- db_report(:note, note.merge(:data => data))
265
- end
266
-
267
- def record_service(attrs)
268
- return unless in_tag("device")
269
- @state[:service] = attr_hash(attrs)
270
- end
271
-
272
- def record_service_fingerprint(attrs)
273
- return unless in_tag("device")
274
- return unless in_tag("service")
275
- @state[:service][:fingerprint] = attr_hash(attrs)
276
- end
277
-
278
- def collect_service_data
279
- return unless in_tag("device")
280
- port_hash = {}
281
- @report_data[:ports] ||= []
282
- @state[:service].each do |k,v|
283
- case k
284
- when "protocol"
285
- port_hash[:proto] = v
286
- when "port"
287
- port_hash[:port] = v
288
- when "name"
289
- sname = v.to_s.downcase.split("(")[0].strip
290
- if sname == "<unknown>"
291
- port_hash[:name] = nil
292
- else
293
- port_hash[:name] = db.nmap_msf_service_map(sname)
294
- end
295
- end
296
- end
297
- if @state[:service_fingerprint]
298
- port_hash[:info] = "#{@state[:service_fingerprint]}"
299
- end
300
- @report_data[:ports] << port_hash.clone
301
- @state.delete :service_fingerprint
302
- @state.delete :service
303
- @report_data[:ports]
304
- end
305
-
306
- def collect_service_fingerprint_description
307
- return unless in_tag("device")
308
- return unless in_tag("service")
309
- return unless in_tag("fingerprint")
310
- return unless @text
311
- @state[:service_fingerprint] = @text.to_s.strip
312
- @text = nil
313
- end
314
-
315
- def report_services(host_object)
316
- return unless host_object.kind_of? ::Mdm::Host
317
- return unless @report_data[:ports]
318
- return if @report_data[:ports].empty?
319
- reported = []
320
- @report_data[:ports].each do |svc|
321
- reported << db_report(:service, svc.merge(:host => host_object))
322
- end
323
- reported
324
- end
325
-
326
- end
5
+ module Parser
6
+
7
+ # If Nokogiri is available, define Nexpose document class.
8
+ load_nokogiri && class NexposeSimpleDocument < Nokogiri::XML::SAX::Document
9
+
10
+ include NokogiriDocMixin
11
+
12
+ attr_reader :text
13
+
14
+ # Triggered every time a new element is encountered. We keep state
15
+ # ourselves with the @state variable, turning things on when we
16
+ # get here (and turning things off when we exit in end_element()).
17
+ def start_element(name=nil,attrs=[])
18
+ attrs = normalize_attrs(attrs)
19
+ block = @block
20
+ @state[:current_tag][name] = true
21
+ case name
22
+ when "device"
23
+ record_device(attrs)
24
+ when "service"
25
+ record_service(attrs)
26
+ when "fingerprint"
27
+ record_service_fingerprint(attrs)
28
+ record_host_fingerprint(attrs)
29
+ when "description"
30
+ @state[:has_text] = true
31
+ record_host_fingerprint_data(name,attrs)
32
+ when "vendor", "family", "product", "version", "architecture"
33
+ @state[:has_text] = true
34
+ record_host_fingerprint_data(name,attrs)
35
+ when "vulnerability"
36
+ record_service_vuln(attrs)
37
+ record_host_vuln(attrs)
38
+ when "id"
39
+ @state[:has_text] = true
40
+ record_service_vuln_id(attrs)
41
+ record_host_vuln_id(attrs)
42
+ end
43
+ end
44
+
45
+ # When we exit a tag, this is triggered.
46
+ def end_element(name=nil)
47
+ block = @block
48
+ case name
49
+ when "device" # Wrap it up
50
+ collect_device_data
51
+ host_object = report_host &block
52
+ report_services(host_object)
53
+ report_host_fingerprint(host_object)
54
+ report_vulns(host_object)
55
+ # Reset the state once we close a host
56
+ @state.delete_if {|k| k != :current_tag}
57
+ @report_data = {:wspace => @args[:wspace]}
58
+ when "description"
59
+ @state[:has_text] = false
60
+ collect_service_fingerprint_description
61
+ collect_host_fingerprint_data(name)
62
+ @text = nil
63
+ when "vendor", "family", "product", "version", "architecture"
64
+ @state[:has_text] = false
65
+ collect_host_fingerprint_data(name)
66
+ @text = nil
67
+ when "service"
68
+ collect_service_data
69
+ when "id"
70
+ @state[:has_text] = false
71
+ collect_service_vuln_id
72
+ collect_host_vuln_id
73
+ @text = nil
74
+ when "vulnerability"
75
+ collect_service_vuln
76
+ collect_host_vuln
77
+ @state[:references] = nil
78
+ end
79
+ @state[:current_tag].delete name
80
+ end
81
+
82
+ def report_vulns(host_object)
83
+ vuln_count = 0
84
+ block = @block
85
+ return unless host_object.kind_of? ::Mdm::Host
86
+ return unless @report_data[:vulns]
87
+ @report_data[:vulns].each do |vuln|
88
+ if vuln[:refs]
89
+ vuln[:refs] << vuln[:name]
90
+ else
91
+ vuln[:refs] = [vuln[:name]]
92
+ end
93
+ vuln[:refs].uniq!
94
+ data = {
95
+ :workspace => host_object.workspace,
96
+ :host => host_object,
97
+ :name => vuln[:name],
98
+ :info => vuln[:info],
99
+ :refs => vuln[:refs]
100
+ }
101
+ if vuln[:port] && vuln[:proto]
102
+ data[:port] = vuln[:port]
103
+ data[:proto] = vuln[:proto]
104
+ end
105
+ db_report(:vuln,data)
106
+ end
107
+
108
+ end
109
+
110
+ def collect_host_vuln_id
111
+ return unless in_tag("device")
112
+ return unless in_tag("vulnerability")
113
+ return if in_tag("service")
114
+ return unless @state[:host_vuln_id]
115
+ @state[:references] ||= []
116
+ ref = normalize_ref( @state[:host_vuln_id]["type"], @text )
117
+ @state[:references] << ref if ref
118
+ @state[:host_vuln_id] = nil
119
+ @text = nil
120
+ end
121
+
122
+ def collect_service_vuln_id
123
+ return unless in_tag("device")
124
+ return unless in_tag("vulnerability")
125
+ return unless in_tag("service")
126
+ return unless @state[:service_vuln_id]
127
+ @state[:references] ||= []
128
+ ref = normalize_ref( @state[:service_vuln_id]["type"], @text )
129
+ @state[:references] << ref if ref
130
+ @state[:service_vuln_id] = nil
131
+ @text = nil
132
+ end
133
+
134
+ def collect_service_vuln
135
+ return unless in_tag("device")
136
+ return unless in_tag("vulnerability")
137
+ return unless in_tag("service")
138
+ @report_data[:vulns] ||= []
139
+ return unless actually_vulnerable(@state[:service_vuln])
140
+ return if @state[:service]["port"].to_i == 0
141
+ vid = @state[:service_vuln]["id"].to_s.downcase
142
+ vuln = {
143
+ :name => "NEXPOSE-#{vid}",
144
+ :info => vid,
145
+ :refs => @state[:references],
146
+ :port => @state[:service]["port"].to_i,
147
+ :proto => @state[:service]["protocol"]
148
+ }
149
+ @report_data[:vulns] << vuln
150
+ end
151
+
152
+ def collect_host_vuln
153
+ return unless in_tag("vulnerability")
154
+ return unless in_tag("device")
155
+ return if in_tag("service")
156
+ @report_data[:vulns] ||= []
157
+ return unless actually_vulnerable(@state[:host_vuln])
158
+ vid = @state[:host_vuln]["id"].to_s.downcase
159
+ vuln = {
160
+ :name => "NEXPOSE-#{vid}",
161
+ :info => vid,
162
+ :refs => @state[:references]
163
+ }
164
+ @report_data[:vulns] << vuln
165
+ end
166
+
167
+ def record_host_vuln_id(attrs)
168
+ return unless in_tag("device")
169
+ return if in_tag("service")
170
+ @state[:host_vuln_id] = attr_hash(attrs)
171
+ end
172
+
173
+ def record_host_vuln(attrs)
174
+ return unless in_tag("device")
175
+ return if in_tag("service")
176
+ @state[:host_vuln] = attr_hash(attrs)
177
+ end
178
+
179
+ def record_service_vuln_id(attrs)
180
+ return unless in_tag("device")
181
+ return unless in_tag("service")
182
+ @state[:service_vuln_id] = attr_hash(attrs)
183
+ end
184
+
185
+ def record_service_vuln(attrs)
186
+ return unless in_tag("device")
187
+ return unless in_tag("service")
188
+ @state[:service_vuln] = attr_hash(attrs)
189
+ end
190
+
191
+ def actually_vulnerable(vuln)
192
+ vuln_result = vuln["resultCode"]
193
+ vuln_result =~ /^V[VE]$/
194
+ end
195
+
196
+ def record_device(attrs)
197
+ attrs.each do |k,v|
198
+ next unless k == "address"
199
+ @state[:address] = v
200
+ end
201
+ end
202
+
203
+ def record_host_fingerprint(attrs)
204
+ return unless in_tag("device")
205
+ return if in_tag("service")
206
+ @state[:host_fingerprint] = attr_hash(attrs)
207
+ end
208
+
209
+ def collect_device_data
210
+ return unless in_tag("device")
211
+ @report_data[:host] = @state[:address]
212
+ @report_data[:state] = Msf::HostState::Alive # always
213
+ end
214
+
215
+ def record_host_fingerprint_data(name, attrs)
216
+ return unless in_tag("device")
217
+ return if in_tag("service")
218
+ return unless in_tag("fingerprint")
219
+ @state[:host_fingerprint] ||= {}
220
+ @state[:host_fingerprint].merge! attr_hash(attrs)
221
+ end
222
+
223
+ def collect_host_fingerprint_data(name)
224
+ return unless in_tag("device")
225
+ return if in_tag("service")
226
+ return unless in_tag("fingerprint")
227
+ return unless @text
228
+ @report_data[:host_fingerprint] ||= {}
229
+ @report_data[:host_fingerprint].merge!(@state[:host_fingerprint])
230
+ @report_data[:host_fingerprint][name] = @text.to_s.strip
231
+ @text = nil
232
+ end
233
+
234
+ def report_host(&block)
235
+ if host_is_okay
236
+ db.emit(:address,@report_data[:host],&block) if block
237
+ host_object = db_report(:host, @report_data.merge(
238
+ :workspace => @args[:wspace] ) )
239
+ if host_object
240
+ db.report_import_note(host_object.workspace, host_object)
241
+ end
242
+ host_object
243
+ end
244
+ end
245
+
246
+ def report_host_fingerprint(host_object)
247
+ return unless host_object.kind_of? ::Mdm::Host
248
+ return unless @report_data[:host_fingerprint].kind_of? Hash
249
+ @report_data[:host_fingerprint].reject! {|k,v| v.nil? || v.empty?}
250
+ return if @report_data[:host_fingerprint].empty?
251
+ note = {
252
+ :workspace => host_object.workspace,
253
+ :host => host_object,
254
+ :type => "host.os.nexpose_fingerprint"
255
+ }
256
+ data = {
257
+ :desc => @report_data[:host_fingerprint]["description"],
258
+ :vendor => @report_data[:host_fingerprint]["vendor"],
259
+ :family => @report_data[:host_fingerprint]["family"],
260
+ :product => @report_data[:host_fingerprint]["product"],
261
+ :version => @report_data[:host_fingerprint]["version"],
262
+ :arch => @report_data[:host_fingerprint]["architecture"]
263
+ }
264
+ db_report(:note, note.merge(:data => data))
265
+ end
266
+
267
+ def record_service(attrs)
268
+ return unless in_tag("device")
269
+ @state[:service] = attr_hash(attrs)
270
+ end
271
+
272
+ def record_service_fingerprint(attrs)
273
+ return unless in_tag("device")
274
+ return unless in_tag("service")
275
+ @state[:service][:fingerprint] = attr_hash(attrs)
276
+ end
277
+
278
+ def collect_service_data
279
+ return unless in_tag("device")
280
+ port_hash = {}
281
+ @report_data[:ports] ||= []
282
+ @state[:service].each do |k,v|
283
+ case k
284
+ when "protocol"
285
+ port_hash[:proto] = v
286
+ when "port"
287
+ port_hash[:port] = v
288
+ when "name"
289
+ sname = v.to_s.downcase.split("(")[0].strip
290
+ if sname == "<unknown>"
291
+ port_hash[:name] = nil
292
+ else
293
+ port_hash[:name] = db.nmap_msf_service_map(sname)
294
+ end
295
+ end
296
+ end
297
+ if @state[:service_fingerprint]
298
+ port_hash[:info] = "#{@state[:service_fingerprint]}"
299
+ end
300
+ @report_data[:ports] << port_hash.clone
301
+ @state.delete :service_fingerprint
302
+ @state.delete :service
303
+ @report_data[:ports]
304
+ end
305
+
306
+ def collect_service_fingerprint_description
307
+ return unless in_tag("device")
308
+ return unless in_tag("service")
309
+ return unless in_tag("fingerprint")
310
+ return unless @text
311
+ @state[:service_fingerprint] = @text.to_s.strip
312
+ @text = nil
313
+ end
314
+
315
+ def report_services(host_object)
316
+ return unless host_object.kind_of? ::Mdm::Host
317
+ return unless @report_data[:ports]
318
+ return if @report_data[:ports].empty?
319
+ reported = []
320
+ @report_data[:ports].each do |svc|
321
+ reported << db_report(:service, svc.merge(:host => host_object))
322
+ end
323
+ reported
324
+ end
325
+
326
+ end
327
327
 
328
328
  end
329
329
  end