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
@@ -7,96 +7,96 @@ module Parser
7
7
 
8
8
 
9
9
  class IP360ASPLXMLStreamParser
10
-
11
- @vulnid = nil
12
- @appid = nil
13
- @location = nil
14
10
 
15
- attr_accessor :on_found_aspl
11
+ @vulnid = nil
12
+ @appid = nil
13
+ @location = nil
16
14
 
17
- def initialize(&block)
18
- reset_state
19
- on_found_aspl = block if block
20
- end
15
+ attr_accessor :on_found_aspl
21
16
 
22
- def reset_state
23
- @aspl = {'vulns' => {'name' => { }, 'cve' => { }, 'bid' => { } },
24
- 'oses' => {'name' => { } } }
25
- @state = :generic_state
26
- end
17
+ def initialize(&block)
18
+ reset_state
19
+ on_found_aspl = block if block
20
+ end
27
21
 
28
- def tag_start(name, attributes)
29
- case name
30
- when "vulns"
31
- @location = "vulns"
32
- when "vuln"
33
- @vulnid = attributes['id'].strip
34
- when "name"
35
- @state = :is_name
36
- when "advisories"
37
- @c = ""
38
- @cfirst = 1
39
- @b = ""
40
- @bfirst = 1
41
- @x = Hash.new
42
- when "publisher"
43
- @state = :is_pub
44
- when "id"
45
- @state = :is_refid
46
- when "operatingSystems"
47
- @location = "os"
48
- when "operatingSystem"
49
- @osid = attributes['id'].strip
50
- end
51
- end
52
-
53
- def text(str)
54
- case @state
55
- when :is_name
56
- @aspl['vulns']['name'][@vulnid] = str if @location == "vulns"
57
- @aspl['oses'][@osid] = str if @location == "os"
58
- when :is_pub
59
- @x['pub'] = str
60
- when :is_refid
61
- @x['refid'] = str
62
- end
63
- end
22
+ def reset_state
23
+ @aspl = {'vulns' => {'name' => { }, 'cve' => { }, 'bid' => { } },
24
+ 'oses' => {'name' => { } } }
25
+ @state = :generic_state
26
+ end
64
27
 
65
- def tag_end(name)
66
- case name
67
- when "ontology"
68
- on_found_aspl.call(@aspl) if on_found_aspl
69
- reset_state
70
- when "advisory"
71
- if (@x['pub'] =~ /CVE/)
72
- if (@cfirst == 0)
73
- @c += ","
74
- end
75
- @c += @x['refid']
76
- @cfirst = 0
77
- elsif (@x['pub'] =~ /BugTraq/)
78
- if (@bfirst == 0)
79
- @b += ","
80
- end
81
- @b += @x['refid']
82
- @bfirst = 0
83
- end
84
- when "advisories"
85
- @aspl['vulns']['cve'][@vulnid] = @c
86
- @aspl['vulns']['bid'][@vulnid] = @b
87
- @c = ""
88
- @b = ""
89
- end
90
- @state = :generic_state
91
- end
28
+ def tag_start(name, attributes)
29
+ case name
30
+ when "vulns"
31
+ @location = "vulns"
32
+ when "vuln"
33
+ @vulnid = attributes['id'].strip
34
+ when "name"
35
+ @state = :is_name
36
+ when "advisories"
37
+ @c = ""
38
+ @cfirst = 1
39
+ @b = ""
40
+ @bfirst = 1
41
+ @x = Hash.new
42
+ when "publisher"
43
+ @state = :is_pub
44
+ when "id"
45
+ @state = :is_refid
46
+ when "operatingSystems"
47
+ @location = "os"
48
+ when "operatingSystem"
49
+ @osid = attributes['id'].strip
50
+ end
51
+ end
92
52
 
93
- # We don't need these methods, but they're necessary to keep REXML happy
94
- #
95
- def xmldecl(version, encoding, standalone); end
96
- def cdata; end
97
- def comment(str); end
98
- def instruction(name, instruction); end
99
- def attlist; end
53
+ def text(str)
54
+ case @state
55
+ when :is_name
56
+ @aspl['vulns']['name'][@vulnid] = str if @location == "vulns"
57
+ @aspl['oses'][@osid] = str if @location == "os"
58
+ when :is_pub
59
+ @x['pub'] = str
60
+ when :is_refid
61
+ @x['refid'] = str
62
+ end
63
+ end
64
+
65
+ def tag_end(name)
66
+ case name
67
+ when "ontology"
68
+ on_found_aspl.call(@aspl) if on_found_aspl
69
+ reset_state
70
+ when "advisory"
71
+ if (@x['pub'] =~ /CVE/)
72
+ if (@cfirst == 0)
73
+ @c += ","
74
+ end
75
+ @c += @x['refid']
76
+ @cfirst = 0
77
+ elsif (@x['pub'] =~ /BugTraq/)
78
+ if (@bfirst == 0)
79
+ @b += ","
80
+ end
81
+ @b += @x['refid']
82
+ @bfirst = 0
83
+ end
84
+ when "advisories"
85
+ @aspl['vulns']['cve'][@vulnid] = @c
86
+ @aspl['vulns']['bid'][@vulnid] = @b
87
+ @c = ""
88
+ @b = ""
89
+ end
90
+ @state = :generic_state
91
+ end
92
+
93
+ # We don't need these methods, but they're necessary to keep REXML happy
94
+ #
95
+ def xmldecl(version, encoding, standalone); end
96
+ def cdata; end
97
+ def comment(str); end
98
+ def instruction(name, instruction); end
99
+ def attlist; end
100
100
  end
101
101
 
102
102
  end
@@ -8,90 +8,90 @@ module Parser
8
8
 
9
9
  class IP360XMLStreamParser
10
10
 
11
- attr_accessor :on_found_host
11
+ attr_accessor :on_found_host
12
12
 
13
- def initialize(&block)
14
- reset_state
15
- on_found_host = block if block
16
- end
13
+ def initialize(&block)
14
+ reset_state
15
+ on_found_host = block if block
16
+ end
17
17
 
18
- def reset_state
19
- @host = {'hname' => nil, 'hid' => nil, 'addr' => nil, 'mac' => nil, 'os' => nil,
20
- 'vulns' => ['vuln' => {'vulnid' => nil, 'port' => nil, 'proto' => nil} ],
21
- 'apps' => ['app' => {'appid' => nil, 'svcid' => nil, 'port' => nil, 'proto' => nil } ],
22
- }
23
- @state = :generic_state
24
- end
18
+ def reset_state
19
+ @host = {'hname' => nil, 'hid' => nil, 'addr' => nil, 'mac' => nil, 'os' => nil,
20
+ 'vulns' => ['vuln' => {'vulnid' => nil, 'port' => nil, 'proto' => nil} ],
21
+ 'apps' => ['app' => {'appid' => nil, 'svcid' => nil, 'port' => nil, 'proto' => nil } ],
22
+ }
23
+ @state = :generic_state
24
+ end
25
25
 
26
- def tag_start(name, attributes)
27
- case name
28
- when "host"
29
- @host['hid'] = attributes['persistent_id']
30
- when "ip"
31
- @state = :is_ip
32
- when "dnsName"
33
- @state = :is_fqdn
34
- when "macAddress"
35
- @state = :is_mac
36
- when "os"
37
- @host['os'] = attributes['id']
38
- when "vulnerability"
39
- @x = Hash.new
40
- @x['vulnid'] = attributes['id']
41
- when "port"
42
- @state = :is_port
43
- when "protocol"
44
- @state = :is_proto
45
- when "application"
46
- @y = Hash.new
47
- @y['appid'] = attributes['application_id']
48
- @y['svcid'] = attributes['svcid']
49
- @y['port'] = attributes['port']
50
- @y['proto'] = attributes['protocol']
51
- @host['apps'].push @y
52
- end
53
- end
26
+ def tag_start(name, attributes)
27
+ case name
28
+ when "host"
29
+ @host['hid'] = attributes['persistent_id']
30
+ when "ip"
31
+ @state = :is_ip
32
+ when "dnsName"
33
+ @state = :is_fqdn
34
+ when "macAddress"
35
+ @state = :is_mac
36
+ when "os"
37
+ @host['os'] = attributes['id']
38
+ when "vulnerability"
39
+ @x = Hash.new
40
+ @x['vulnid'] = attributes['id']
41
+ when "port"
42
+ @state = :is_port
43
+ when "protocol"
44
+ @state = :is_proto
45
+ when "application"
46
+ @y = Hash.new
47
+ @y['appid'] = attributes['application_id']
48
+ @y['svcid'] = attributes['svcid']
49
+ @y['port'] = attributes['port']
50
+ @y['proto'] = attributes['protocol']
51
+ @host['apps'].push @y
52
+ end
53
+ end
54
54
 
55
- def text(str)
56
- case @state
57
- when :is_fqdn
58
- @host['hname'] = str
59
- when :is_ip
60
- @host['addr'] = str
61
- when :is_mac
62
- @host['mac'] = str
63
- when :is_port
64
- @x['port'] = str
65
- when :is_proto
66
- @x['proto'] = str
67
- end
68
- end
55
+ def text(str)
56
+ case @state
57
+ when :is_fqdn
58
+ @host['hname'] = str
59
+ when :is_ip
60
+ @host['addr'] = str
61
+ when :is_mac
62
+ @host['mac'] = str
63
+ when :is_port
64
+ @x['port'] = str
65
+ when :is_proto
66
+ @x['proto'] = str
67
+ end
68
+ end
69
69
 
70
- def tag_end(name)
71
- case name
72
- when "host"
73
- on_found_host.call(@host) if on_found_host
74
- reset_state
75
- when "vulnerability"
76
- @host['vulns'].push @x
77
- end
78
- @state = :generic_state
79
- end
70
+ def tag_end(name)
71
+ case name
72
+ when "host"
73
+ on_found_host.call(@host) if on_found_host
74
+ reset_state
75
+ when "vulnerability"
76
+ @host['vulns'].push @x
77
+ end
78
+ @state = :generic_state
79
+ end
80
80
 
81
- def cdata(d)
82
- #do nothing
83
- end
81
+ def cdata(d)
82
+ #do nothing
83
+ end
84
84
 
85
- # We don't need these methods, but they're necessary to keep REXML happy
86
- #
87
- def xmldecl(version, encoding, standalone) # :nodoc:
88
- end
89
- def comment(str) # :nodoc:
90
- end
91
- def instruction(name, instruction) # :nodoc:
92
- end
93
- def attlist # :nodoc:
94
- end
85
+ # We don't need these methods, but they're necessary to keep REXML happy
86
+ #
87
+ def xmldecl(version, encoding, standalone) # :nodoc:
88
+ end
89
+ def comment(str) # :nodoc:
90
+ end
91
+ def instruction(name, instruction) # :nodoc:
92
+ end
93
+ def attlist # :nodoc:
94
+ end
95
95
  end
96
96
 
97
97
  end
@@ -2,254 +2,254 @@
2
2
  require "rex/parser/nokogiri_doc_mixin"
3
3
 
4
4
  module Rex
5
- module Parser
5
+ module Parser
6
6
 
7
- # If Nokogiri is available, define Template document class.
8
- load_nokogiri && class MbsaDocument < Nokogiri::XML::SAX::Document
7
+ # If Nokogiri is available, define Template document class.
8
+ load_nokogiri && class MbsaDocument < Nokogiri::XML::SAX::Document
9
9
 
10
- include NokogiriDocMixin
10
+ include NokogiriDocMixin
11
11
 
12
- # Triggered every time a new element is encountered. We keep state
13
- # ourselves with the @state variable, turning things on when we
14
- # get here (and turning things off when we exit in end_element()).
15
- def start_element(name=nil,attrs=[])
16
- attrs = normalize_attrs(attrs)
17
- block = @block
18
- @state[:current_tag][name] = true
19
- case name
20
- when "SecScan"
21
- record_host(attrs)
22
- when "IP" # TODO: Check to see if IPList/IP is useful to import
23
- when "Check" # A list of MBSA checks. They have an ID and a Name.
24
- record_check(attrs)
25
- when "Advice" # Check advice. Free form text about the check
26
- @state[:has_text] = true
27
- when "Detail" # Check/Detail is where missing fixes are.
28
- record_detail(attrs)
29
- when "UpdateData" # Info about installed/missing hotfixes
30
- record_updatedata(attrs)
31
- when "Title" # MSB Title
32
- @state[:has_text] = true
33
- when "InformationURL" # Only use this if we don't have a Bulletin ID
34
- @state[:has_text] = true
35
- end
36
- end
12
+ # Triggered every time a new element is encountered. We keep state
13
+ # ourselves with the @state variable, turning things on when we
14
+ # get here (and turning things off when we exit in end_element()).
15
+ def start_element(name=nil,attrs=[])
16
+ attrs = normalize_attrs(attrs)
17
+ block = @block
18
+ @state[:current_tag][name] = true
19
+ case name
20
+ when "SecScan"
21
+ record_host(attrs)
22
+ when "IP" # TODO: Check to see if IPList/IP is useful to import
23
+ when "Check" # A list of MBSA checks. They have an ID and a Name.
24
+ record_check(attrs)
25
+ when "Advice" # Check advice. Free form text about the check
26
+ @state[:has_text] = true
27
+ when "Detail" # Check/Detail is where missing fixes are.
28
+ record_detail(attrs)
29
+ when "UpdateData" # Info about installed/missing hotfixes
30
+ record_updatedata(attrs)
31
+ when "Title" # MSB Title
32
+ @state[:has_text] = true
33
+ when "InformationURL" # Only use this if we don't have a Bulletin ID
34
+ @state[:has_text] = true
35
+ end
36
+ end
37
37
 
38
- # This breaks xml-encoded characters, so need to append
39
- def characters(text)
40
- return unless @state[:has_text]
41
- @text ||= ""
42
- @text << text
43
- end
38
+ # This breaks xml-encoded characters, so need to append
39
+ def characters(text)
40
+ return unless @state[:has_text]
41
+ @text ||= ""
42
+ @text << text
43
+ end
44
44
 
45
- # When we exit a tag, this is triggered.
46
- def end_element(name=nil)
47
- block = @block
48
- case name
49
- when "SecScan" # Wrap it up
50
- collect_host_data
51
- host_object = report_host &block
52
- if host_object
53
- db.report_import_note(@args[:wspace],host_object)
54
- report_fingerprint(host_object)
55
- report_vulns(host_object,&block)
56
- end
57
- # Reset the state once we close a host
58
- @state.delete_if {|k| k != :current_tag}
59
- when "Check"
60
- collect_check_data
61
- when "Advice"
62
- @state[:has_text] = false
63
- collect_advice_data
64
- when "Detail"
65
- collect_detail_data
66
- when "UpdateData"
67
- collect_updatedata
68
- when "Title"
69
- @state[:has_text] = false
70
- collect_title
71
- when "InformationURL"
72
- collect_url
73
- @state[:has_text] = false
74
- end
75
- @state[:current_tag].delete name
76
- end
45
+ # When we exit a tag, this is triggered.
46
+ def end_element(name=nil)
47
+ block = @block
48
+ case name
49
+ when "SecScan" # Wrap it up
50
+ collect_host_data
51
+ host_object = report_host &block
52
+ if host_object
53
+ db.report_import_note(@args[:wspace],host_object)
54
+ report_fingerprint(host_object)
55
+ report_vulns(host_object,&block)
56
+ end
57
+ # Reset the state once we close a host
58
+ @state.delete_if {|k| k != :current_tag}
59
+ when "Check"
60
+ collect_check_data
61
+ when "Advice"
62
+ @state[:has_text] = false
63
+ collect_advice_data
64
+ when "Detail"
65
+ collect_detail_data
66
+ when "UpdateData"
67
+ collect_updatedata
68
+ when "Title"
69
+ @state[:has_text] = false
70
+ collect_title
71
+ when "InformationURL"
72
+ collect_url
73
+ @state[:has_text] = false
74
+ end
75
+ @state[:current_tag].delete name
76
+ end
77
77
 
78
- def report_fingerprint(host_object)
79
- return unless host_object.kind_of? ::Mdm::Host
80
- return unless @report_data[:os_fingerprint]
81
- fp_note = @report_data[:os_fingerprint].merge(
82
- {
83
- :workspace => host_object.workspace,
84
- :host => host_object
85
- })
86
- db_report(:note, fp_note)
87
- end
78
+ def report_fingerprint(host_object)
79
+ return unless host_object.kind_of? ::Mdm::Host
80
+ return unless @report_data[:os_fingerprint]
81
+ fp_note = @report_data[:os_fingerprint].merge(
82
+ {
83
+ :workspace => host_object.workspace,
84
+ :host => host_object
85
+ })
86
+ db_report(:note, fp_note)
87
+ end
88
88
 
89
- def collect_url
90
- return unless in_tag("References")
91
- return unless in_tag("UpdateData")
92
- return unless in_tag("Detail")
93
- return unless in_tag("Check")
94
- @state[:update][:url] = @text.to_s.strip
95
- @text = nil
96
- end
89
+ def collect_url
90
+ return unless in_tag("References")
91
+ return unless in_tag("UpdateData")
92
+ return unless in_tag("Detail")
93
+ return unless in_tag("Check")
94
+ @state[:update][:url] = @text.to_s.strip
95
+ @text = nil
96
+ end
97
97
 
98
- def report_vulns(host_object, &block)
99
- return unless host_object.kind_of? ::Mdm::Host
100
- return unless @report_data[:vulns]
101
- return if @report_data[:vulns].empty?
102
- @report_data[:vulns].each do |vuln|
103
- next unless vuln[:refs]
104
- if vuln[:refs].empty?
105
- next
106
- end
107
- if block
108
- db.emit(:vuln, ["Missing #{vuln[:name]}",1], &block) if block
109
- end
110
- db_report(:vuln, vuln.merge(:host => host_object))
111
- end
112
- end
98
+ def report_vulns(host_object, &block)
99
+ return unless host_object.kind_of? ::Mdm::Host
100
+ return unless @report_data[:vulns]
101
+ return if @report_data[:vulns].empty?
102
+ @report_data[:vulns].each do |vuln|
103
+ next unless vuln[:refs]
104
+ if vuln[:refs].empty?
105
+ next
106
+ end
107
+ if block
108
+ db.emit(:vuln, ["Missing #{vuln[:name]}",1], &block) if block
109
+ end
110
+ db_report(:vuln, vuln.merge(:host => host_object))
111
+ end
112
+ end
113
113
 
114
- def collect_title
115
- return unless in_tag("SecScan")
116
- return unless in_tag("Check")
117
- collect_bulletin_title
118
- @text = nil
119
- end
114
+ def collect_title
115
+ return unless in_tag("SecScan")
116
+ return unless in_tag("Check")
117
+ collect_bulletin_title
118
+ @text = nil
119
+ end
120
120
 
121
- def collect_bulletin_title
122
- return unless @state[:check_state]["ID"] == 500.to_s
123
- return unless in_tag("UpdateData")
124
- return unless @state[:update]
125
- return if @text.to_s.strip.empty?
126
- @state[:update]["Title"] = @text.to_s.strip
127
- end
121
+ def collect_bulletin_title
122
+ return unless @state[:check_state]["ID"] == 500.to_s
123
+ return unless in_tag("UpdateData")
124
+ return unless @state[:update]
125
+ return if @text.to_s.strip.empty?
126
+ @state[:update]["Title"] = @text.to_s.strip
127
+ end
128
128
 
129
- def collect_updatedata
130
- return unless in_tag("SecScan")
131
- return unless in_tag("Check")
132
- return unless in_tag("Detail")
133
- collect_missing_update
134
- @state[:updates] = {}
135
- end
129
+ def collect_updatedata
130
+ return unless in_tag("SecScan")
131
+ return unless in_tag("Check")
132
+ return unless in_tag("Detail")
133
+ collect_missing_update
134
+ @state[:updates] = {}
135
+ end
136
136
 
137
- def collect_missing_update
138
- return unless @state[:check_state]["ID"] == 500.to_s
139
- return if @state[:update]["IsInstalled"] == "true"
140
- @report_data[:missing_updates] ||= []
141
- this_update = {}
142
- this_update[:name] = @state[:update]["Title"].to_s.strip
143
- this_update[:refs] = []
144
- if @state[:update]["BulletinID"].empty?
145
- this_update[:refs] << "URL-#{@state[:update][:url]}"
146
- else
147
- this_update[:refs] << "MSB-#{@state[:update]["BulletinID"]}"
148
- end
149
- @report_data[:missing_updates] << this_update
150
- end
137
+ def collect_missing_update
138
+ return unless @state[:check_state]["ID"] == 500.to_s
139
+ return if @state[:update]["IsInstalled"] == "true"
140
+ @report_data[:missing_updates] ||= []
141
+ this_update = {}
142
+ this_update[:name] = @state[:update]["Title"].to_s.strip
143
+ this_update[:refs] = []
144
+ if @state[:update]["BulletinID"].empty?
145
+ this_update[:refs] << "URL-#{@state[:update][:url]}"
146
+ else
147
+ this_update[:refs] << "MSB-#{@state[:update]["BulletinID"]}"
148
+ end
149
+ @report_data[:missing_updates] << this_update
150
+ end
151
151
 
152
- # So far, just care about Host OS
153
- # There is assuredly more interesting things going on in here.
154
- def collect_advice_data
155
- return unless in_tag("SecScan")
156
- return unless in_tag("Check")
157
- collect_os_name
158
- @text = nil
159
- end
152
+ # So far, just care about Host OS
153
+ # There is assuredly more interesting things going on in here.
154
+ def collect_advice_data
155
+ return unless in_tag("SecScan")
156
+ return unless in_tag("Check")
157
+ collect_os_name
158
+ @text = nil
159
+ end
160
160
 
161
- def collect_os_name
162
- return unless @state[:check_state]["ID"] == 10101.to_s
163
- return unless @text
164
- return if @text.strip.empty?
165
- os_match = @text.match(/Computer is running (.*)/)
166
- return unless os_match
167
- os_info = os_match[1]
168
- os_vendor = os_info[/Microsoft/]
169
- os_family = os_info[/Windows/]
170
- os_version = os_info[/(XP|2000 Advanced Server|2000|2003|2008|SBS|Vista|7 .* Edition|7)/]
171
- if os_info
172
- @report_data[:os_fingerprint] = {}
173
- @report_data[:os_fingerprint][:type] = "host.os.mbsa_fingerprint"
174
- @report_data[:os_fingerprint][:data] = {
175
- :os_vendor => os_vendor,
176
- :os_family => os_family,
177
- :os_version => os_version,
178
- :os_accuracy => 100,
179
- :os_match => os_info.gsub(/\x2e$/,"")
180
- }
181
- end
182
- end
161
+ def collect_os_name
162
+ return unless @state[:check_state]["ID"] == 10101.to_s
163
+ return unless @text
164
+ return if @text.strip.empty?
165
+ os_match = @text.match(/Computer is running (.*)/)
166
+ return unless os_match
167
+ os_info = os_match[1]
168
+ os_vendor = os_info[/Microsoft/]
169
+ os_family = os_info[/Windows/]
170
+ os_version = os_info[/(XP|2000 Advanced Server|2000|2003|2008|SBS|Vista|7 .* Edition|7)/]
171
+ if os_info
172
+ @report_data[:os_fingerprint] = {}
173
+ @report_data[:os_fingerprint][:type] = "host.os.mbsa_fingerprint"
174
+ @report_data[:os_fingerprint][:data] = {
175
+ :os_vendor => os_vendor,
176
+ :os_family => os_family,
177
+ :os_version => os_version,
178
+ :os_accuracy => 100,
179
+ :os_match => os_info.gsub(/\x2e$/n,"")
180
+ }
181
+ end
182
+ end
183
183
 
184
- def collect_detail_data
185
- return unless in_tag("SecScan")
186
- return unless in_tag("Check")
187
- if @report_data[:missing_updates]
188
- @report_data[:vulns] = @report_data[:missing_updates]
189
- end
190
- end
184
+ def collect_detail_data
185
+ return unless in_tag("SecScan")
186
+ return unless in_tag("Check")
187
+ if @report_data[:missing_updates]
188
+ @report_data[:vulns] = @report_data[:missing_updates]
189
+ end
190
+ end
191
191
 
192
- def collect_check_data
193
- return unless in_tag("SecScan")
194
- @state[:check_state] = {}
195
- end
192
+ def collect_check_data
193
+ return unless in_tag("SecScan")
194
+ @state[:check_state] = {}
195
+ end
196
196
 
197
- def collect_host_data
198
- return unless @state[:address]
199
- return if @state[:address].strip.empty?
200
- @report_data[:host] = @state[:address].strip
201
- if @state[:hostname] && !@state[:hostname].empty?
202
- @report_data[:name] = @state[:hostname]
203
- end
204
- @report_data[:state] = Msf::HostState::Alive
205
- end
197
+ def collect_host_data
198
+ return unless @state[:address]
199
+ return if @state[:address].strip.empty?
200
+ @report_data[:host] = @state[:address].strip
201
+ if @state[:hostname] && !@state[:hostname].empty?
202
+ @report_data[:name] = @state[:hostname]
203
+ end
204
+ @report_data[:state] = Msf::HostState::Alive
205
+ end
206
206
 
207
- def report_host(&block)
208
- if host_is_okay
209
- db.emit(:address,@report_data[:host],&block) if block
210
- host_info = @report_data.merge(:workspace => @args[:wspace])
211
- db_report(:host, host_info)
212
- end
213
- end
207
+ def report_host(&block)
208
+ if host_is_okay
209
+ db.emit(:address,@report_data[:host],&block) if block
210
+ host_info = @report_data.merge(:workspace => @args[:wspace])
211
+ db_report(:host, host_info)
212
+ end
213
+ end
214
214
 
215
- def record_updatedata(attrs)
216
- return unless in_tag("SecScan")
217
- return unless in_tag("Check")
218
- return unless in_tag("Detail")
219
- update_attrs = attr_hash(attrs)
220
- @state[:update] = attr_hash(attrs)
221
- end
215
+ def record_updatedata(attrs)
216
+ return unless in_tag("SecScan")
217
+ return unless in_tag("Check")
218
+ return unless in_tag("Detail")
219
+ update_attrs = attr_hash(attrs)
220
+ @state[:update] = attr_hash(attrs)
221
+ end
222
222
 
223
- def record_host(attrs)
224
- host_attrs = attr_hash(attrs)
225
- @state[:address] = host_attrs["IP"]
226
- @state[:hostname] = host_attrs["Machine"]
227
- end
223
+ def record_host(attrs)
224
+ host_attrs = attr_hash(attrs)
225
+ @state[:address] = host_attrs["IP"]
226
+ @state[:hostname] = host_attrs["Machine"]
227
+ end
228
228
 
229
- def record_check(attrs)
230
- return unless in_tag("SecScan")
231
- @state[:check_state] = attr_hash(attrs)
232
- end
229
+ def record_check(attrs)
230
+ return unless in_tag("SecScan")
231
+ @state[:check_state] = attr_hash(attrs)
232
+ end
233
233
 
234
- def record_detail(attrs)
235
- return unless in_tag("SecScan")
236
- return unless in_tag("Check")
237
- @state[:detail_state] = attr_hash(attrs)
238
- end
234
+ def record_detail(attrs)
235
+ return unless in_tag("SecScan")
236
+ return unless in_tag("Check")
237
+ @state[:detail_state] = attr_hash(attrs)
238
+ end
239
239
 
240
- # We need to override the usual host_is_okay because MBSA apparently
241
- # doesn't report on open ports at all.
242
- def host_is_okay
243
- return false unless @report_data[:host]
244
- return false unless valid_ip(@report_data[:host])
245
- return false unless @report_data[:state] == Msf::HostState::Alive
246
- if @args[:blacklist]
247
- return false if @args[:blacklist].include?(@report_data[:host])
248
- end
249
- return true
250
- end
240
+ # We need to override the usual host_is_okay because MBSA apparently
241
+ # doesn't report on open ports at all.
242
+ def host_is_okay
243
+ return false unless @report_data[:host]
244
+ return false unless valid_ip(@report_data[:host])
245
+ return false unless @report_data[:state] == Msf::HostState::Alive
246
+ if @args[:blacklist]
247
+ return false if @args[:blacklist].include?(@report_data[:host])
248
+ end
249
+ return true
250
+ end
251
251
 
252
- end
252
+ end
253
253
 
254
254
  end
255
255
  end