dstruct 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. checksums.yaml +15 -0
  2. data/README.markdown +23 -0
  3. data/examples/smb_example.rb +35 -0
  4. data/lib/rex.rb +108 -0
  5. data/lib/rex/LICENSE +29 -0
  6. data/lib/rex/arch.rb +104 -0
  7. data/lib/rex/arch/sparc.rb +75 -0
  8. data/lib/rex/arch/x86.rb +524 -0
  9. data/lib/rex/assembly/nasm.rb +104 -0
  10. data/lib/rex/codepage.map +104 -0
  11. data/lib/rex/compat.rb +389 -0
  12. data/lib/rex/constants.rb +124 -0
  13. data/lib/rex/elfparsey.rb +9 -0
  14. data/lib/rex/elfparsey/elf.rb +121 -0
  15. data/lib/rex/elfparsey/elfbase.rb +256 -0
  16. data/lib/rex/elfparsey/exceptions.rb +25 -0
  17. data/lib/rex/elfscan.rb +10 -0
  18. data/lib/rex/elfscan/scanner.rb +226 -0
  19. data/lib/rex/elfscan/search.rb +44 -0
  20. data/lib/rex/encoder/alpha2.rb +31 -0
  21. data/lib/rex/encoder/alpha2/alpha_mixed.rb +68 -0
  22. data/lib/rex/encoder/alpha2/alpha_upper.rb +79 -0
  23. data/lib/rex/encoder/alpha2/generic.rb +90 -0
  24. data/lib/rex/encoder/alpha2/unicode_mixed.rb +116 -0
  25. data/lib/rex/encoder/alpha2/unicode_upper.rb +123 -0
  26. data/lib/rex/encoder/bloxor/bloxor.rb +327 -0
  27. data/lib/rex/encoder/ndr.rb +90 -0
  28. data/lib/rex/encoder/nonalpha.rb +61 -0
  29. data/lib/rex/encoder/nonupper.rb +64 -0
  30. data/lib/rex/encoder/xdr.rb +107 -0
  31. data/lib/rex/encoder/xor.rb +69 -0
  32. data/lib/rex/encoder/xor/dword.rb +13 -0
  33. data/lib/rex/encoder/xor/dword_additive.rb +13 -0
  34. data/lib/rex/encoders/xor_dword.rb +35 -0
  35. data/lib/rex/encoders/xor_dword_additive.rb +53 -0
  36. data/lib/rex/encoding/xor.rb +20 -0
  37. data/lib/rex/encoding/xor/byte.rb +15 -0
  38. data/lib/rex/encoding/xor/dword.rb +21 -0
  39. data/lib/rex/encoding/xor/dword_additive.rb +92 -0
  40. data/lib/rex/encoding/xor/exceptions.rb +17 -0
  41. data/lib/rex/encoding/xor/generic.rb +146 -0
  42. data/lib/rex/encoding/xor/qword.rb +15 -0
  43. data/lib/rex/encoding/xor/word.rb +21 -0
  44. data/lib/rex/exceptions.rb +275 -0
  45. data/lib/rex/exploitation/cmdstager.rb +10 -0
  46. data/lib/rex/exploitation/cmdstager/base.rb +190 -0
  47. data/lib/rex/exploitation/cmdstager/bourne.rb +105 -0
  48. data/lib/rex/exploitation/cmdstager/debug_asm.rb +140 -0
  49. data/lib/rex/exploitation/cmdstager/debug_write.rb +134 -0
  50. data/lib/rex/exploitation/cmdstager/echo.rb +164 -0
  51. data/lib/rex/exploitation/cmdstager/printf.rb +122 -0
  52. data/lib/rex/exploitation/cmdstager/tftp.rb +71 -0
  53. data/lib/rex/exploitation/cmdstager/vbs.rb +126 -0
  54. data/lib/rex/exploitation/egghunter.rb +425 -0
  55. data/lib/rex/exploitation/encryptjs.rb +78 -0
  56. data/lib/rex/exploitation/heaplib.js.b64 +331 -0
  57. data/lib/rex/exploitation/heaplib.rb +107 -0
  58. data/lib/rex/exploitation/js.rb +6 -0
  59. data/lib/rex/exploitation/js/detect.rb +69 -0
  60. data/lib/rex/exploitation/js/memory.rb +81 -0
  61. data/lib/rex/exploitation/js/network.rb +84 -0
  62. data/lib/rex/exploitation/js/utils.rb +33 -0
  63. data/lib/rex/exploitation/jsobfu.rb +513 -0
  64. data/lib/rex/exploitation/obfuscatejs.rb +336 -0
  65. data/lib/rex/exploitation/omelet.rb +321 -0
  66. data/lib/rex/exploitation/opcodedb.rb +819 -0
  67. data/lib/rex/exploitation/powershell.rb +62 -0
  68. data/lib/rex/exploitation/powershell/function.rb +63 -0
  69. data/lib/rex/exploitation/powershell/obfu.rb +98 -0
  70. data/lib/rex/exploitation/powershell/output.rb +151 -0
  71. data/lib/rex/exploitation/powershell/param.rb +23 -0
  72. data/lib/rex/exploitation/powershell/parser.rb +183 -0
  73. data/lib/rex/exploitation/powershell/psh_methods.rb +70 -0
  74. data/lib/rex/exploitation/powershell/script.rb +99 -0
  75. data/lib/rex/exploitation/ropdb.rb +190 -0
  76. data/lib/rex/exploitation/seh.rb +93 -0
  77. data/lib/rex/file.rb +160 -0
  78. data/lib/rex/image_source.rb +10 -0
  79. data/lib/rex/image_source/disk.rb +58 -0
  80. data/lib/rex/image_source/image_source.rb +44 -0
  81. data/lib/rex/image_source/memory.rb +35 -0
  82. data/lib/rex/io/bidirectional_pipe.rb +161 -0
  83. data/lib/rex/io/datagram_abstraction.rb +35 -0
  84. data/lib/rex/io/ring_buffer.rb +369 -0
  85. data/lib/rex/io/stream.rb +312 -0
  86. data/lib/rex/io/stream_abstraction.rb +209 -0
  87. data/lib/rex/io/stream_server.rb +221 -0
  88. data/lib/rex/job_container.rb +200 -0
  89. data/lib/rex/logging.rb +4 -0
  90. data/lib/rex/logging/log_dispatcher.rb +180 -0
  91. data/lib/rex/logging/log_sink.rb +43 -0
  92. data/lib/rex/logging/sinks/flatfile.rb +56 -0
  93. data/lib/rex/logging/sinks/stderr.rb +44 -0
  94. data/lib/rex/mac_oui.rb +16581 -0
  95. data/lib/rex/machparsey.rb +9 -0
  96. data/lib/rex/machparsey/exceptions.rb +34 -0
  97. data/lib/rex/machparsey/mach.rb +209 -0
  98. data/lib/rex/machparsey/machbase.rb +408 -0
  99. data/lib/rex/machscan.rb +9 -0
  100. data/lib/rex/machscan/scanner.rb +217 -0
  101. data/lib/rex/mime.rb +10 -0
  102. data/lib/rex/mime/encoding.rb +17 -0
  103. data/lib/rex/mime/header.rb +78 -0
  104. data/lib/rex/mime/message.rb +150 -0
  105. data/lib/rex/mime/part.rb +50 -0
  106. data/lib/rex/nop/opty2.rb +109 -0
  107. data/lib/rex/nop/opty2_tables.rb +301 -0
  108. data/lib/rex/ole.rb +202 -0
  109. data/lib/rex/ole/clsid.rb +44 -0
  110. data/lib/rex/ole/difat.rb +138 -0
  111. data/lib/rex/ole/directory.rb +228 -0
  112. data/lib/rex/ole/direntry.rb +237 -0
  113. data/lib/rex/ole/docs/dependencies.txt +8 -0
  114. data/lib/rex/ole/docs/references.txt +1 -0
  115. data/lib/rex/ole/fat.rb +96 -0
  116. data/lib/rex/ole/header.rb +201 -0
  117. data/lib/rex/ole/minifat.rb +74 -0
  118. data/lib/rex/ole/propset.rb +141 -0
  119. data/lib/rex/ole/samples/create_ole.rb +27 -0
  120. data/lib/rex/ole/samples/dir.rb +35 -0
  121. data/lib/rex/ole/samples/dump_stream.rb +34 -0
  122. data/lib/rex/ole/samples/ole_info.rb +23 -0
  123. data/lib/rex/ole/storage.rb +392 -0
  124. data/lib/rex/ole/stream.rb +50 -0
  125. data/lib/rex/ole/substorage.rb +46 -0
  126. data/lib/rex/ole/util.rb +154 -0
  127. data/lib/rex/parser/acunetix_nokogiri.rb +406 -0
  128. data/lib/rex/parser/apple_backup_manifestdb.rb +132 -0
  129. data/lib/rex/parser/appscan_nokogiri.rb +367 -0
  130. data/lib/rex/parser/arguments.rb +108 -0
  131. data/lib/rex/parser/burp_session_nokogiri.rb +291 -0
  132. data/lib/rex/parser/ci_nokogiri.rb +193 -0
  133. data/lib/rex/parser/foundstone_nokogiri.rb +342 -0
  134. data/lib/rex/parser/fusionvm_nokogiri.rb +109 -0
  135. data/lib/rex/parser/group_policy_preferences.rb +185 -0
  136. data/lib/rex/parser/ini.rb +186 -0
  137. data/lib/rex/parser/ip360_aspl_xml.rb +103 -0
  138. data/lib/rex/parser/ip360_xml.rb +98 -0
  139. data/lib/rex/parser/mbsa_nokogiri.rb +256 -0
  140. data/lib/rex/parser/nessus_xml.rb +121 -0
  141. data/lib/rex/parser/netsparker_xml.rb +109 -0
  142. data/lib/rex/parser/nexpose_raw_nokogiri.rb +686 -0
  143. data/lib/rex/parser/nexpose_simple_nokogiri.rb +330 -0
  144. data/lib/rex/parser/nexpose_xml.rb +172 -0
  145. data/lib/rex/parser/nmap_nokogiri.rb +394 -0
  146. data/lib/rex/parser/nmap_xml.rb +166 -0
  147. data/lib/rex/parser/nokogiri_doc_mixin.rb +233 -0
  148. data/lib/rex/parser/openvas_nokogiri.rb +172 -0
  149. data/lib/rex/parser/outpost24_nokogiri.rb +240 -0
  150. data/lib/rex/parser/retina_xml.rb +110 -0
  151. data/lib/rex/parser/unattend.rb +171 -0
  152. data/lib/rex/parser/wapiti_nokogiri.rb +105 -0
  153. data/lib/rex/payloads.rb +2 -0
  154. data/lib/rex/payloads/win32.rb +3 -0
  155. data/lib/rex/payloads/win32/common.rb +27 -0
  156. data/lib/rex/payloads/win32/kernel.rb +54 -0
  157. data/lib/rex/payloads/win32/kernel/common.rb +55 -0
  158. data/lib/rex/payloads/win32/kernel/migration.rb +13 -0
  159. data/lib/rex/payloads/win32/kernel/recovery.rb +51 -0
  160. data/lib/rex/payloads/win32/kernel/stager.rb +195 -0
  161. data/lib/rex/peparsey.rb +10 -0
  162. data/lib/rex/peparsey/exceptions.rb +30 -0
  163. data/lib/rex/peparsey/pe.rb +210 -0
  164. data/lib/rex/peparsey/pe_memdump.rb +61 -0
  165. data/lib/rex/peparsey/pebase.rb +1662 -0
  166. data/lib/rex/peparsey/section.rb +128 -0
  167. data/lib/rex/pescan.rb +11 -0
  168. data/lib/rex/pescan/analyze.rb +366 -0
  169. data/lib/rex/pescan/scanner.rb +230 -0
  170. data/lib/rex/pescan/search.rb +68 -0
  171. data/lib/rex/platforms.rb +2 -0
  172. data/lib/rex/platforms/windows.rb +52 -0
  173. data/lib/rex/poly.rb +134 -0
  174. data/lib/rex/poly/block.rb +480 -0
  175. data/lib/rex/poly/machine.rb +13 -0
  176. data/lib/rex/poly/machine/machine.rb +830 -0
  177. data/lib/rex/poly/machine/x86.rb +509 -0
  178. data/lib/rex/poly/register.rb +101 -0
  179. data/lib/rex/poly/register/x86.rb +41 -0
  180. data/lib/rex/post.rb +7 -0
  181. data/lib/rex/post/dir.rb +51 -0
  182. data/lib/rex/post/file.rb +172 -0
  183. data/lib/rex/post/file_stat.rb +220 -0
  184. data/lib/rex/post/gen.pl +13 -0
  185. data/lib/rex/post/io.rb +182 -0
  186. data/lib/rex/post/meterpreter.rb +5 -0
  187. data/lib/rex/post/meterpreter/channel.rb +446 -0
  188. data/lib/rex/post/meterpreter/channel_container.rb +54 -0
  189. data/lib/rex/post/meterpreter/channels/pool.rb +160 -0
  190. data/lib/rex/post/meterpreter/channels/pools/file.rb +62 -0
  191. data/lib/rex/post/meterpreter/channels/pools/stream_pool.rb +103 -0
  192. data/lib/rex/post/meterpreter/channels/stream.rb +87 -0
  193. data/lib/rex/post/meterpreter/client.rb +483 -0
  194. data/lib/rex/post/meterpreter/client_core.rb +352 -0
  195. data/lib/rex/post/meterpreter/dependencies.rb +3 -0
  196. data/lib/rex/post/meterpreter/extension.rb +32 -0
  197. data/lib/rex/post/meterpreter/extensions/android/android.rb +128 -0
  198. data/lib/rex/post/meterpreter/extensions/android/tlv.rb +40 -0
  199. data/lib/rex/post/meterpreter/extensions/espia/espia.rb +58 -0
  200. data/lib/rex/post/meterpreter/extensions/espia/tlv.rb +17 -0
  201. data/lib/rex/post/meterpreter/extensions/extapi/adsi/adsi.rb +71 -0
  202. data/lib/rex/post/meterpreter/extensions/extapi/clipboard/clipboard.rb +169 -0
  203. data/lib/rex/post/meterpreter/extensions/extapi/extapi.rb +45 -0
  204. data/lib/rex/post/meterpreter/extensions/extapi/service/service.rb +104 -0
  205. data/lib/rex/post/meterpreter/extensions/extapi/tlv.rb +77 -0
  206. data/lib/rex/post/meterpreter/extensions/extapi/window/window.rb +56 -0
  207. data/lib/rex/post/meterpreter/extensions/extapi/wmi/wmi.rb +75 -0
  208. data/lib/rex/post/meterpreter/extensions/incognito/incognito.rb +94 -0
  209. data/lib/rex/post/meterpreter/extensions/incognito/tlv.rb +22 -0
  210. data/lib/rex/post/meterpreter/extensions/kiwi/kiwi.rb +361 -0
  211. data/lib/rex/post/meterpreter/extensions/kiwi/tlv.rb +76 -0
  212. data/lib/rex/post/meterpreter/extensions/lanattacks/dhcp/dhcp.rb +78 -0
  213. data/lib/rex/post/meterpreter/extensions/lanattacks/lanattacks.rb +43 -0
  214. data/lib/rex/post/meterpreter/extensions/lanattacks/tftp/tftp.rb +49 -0
  215. data/lib/rex/post/meterpreter/extensions/lanattacks/tlv.rb +17 -0
  216. data/lib/rex/post/meterpreter/extensions/mimikatz/mimikatz.rb +128 -0
  217. data/lib/rex/post/meterpreter/extensions/mimikatz/tlv.rb +16 -0
  218. data/lib/rex/post/meterpreter/extensions/networkpug/networkpug.rb +57 -0
  219. data/lib/rex/post/meterpreter/extensions/networkpug/tlv.rb +16 -0
  220. data/lib/rex/post/meterpreter/extensions/priv/fs.rb +118 -0
  221. data/lib/rex/post/meterpreter/extensions/priv/passwd.rb +61 -0
  222. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +109 -0
  223. data/lib/rex/post/meterpreter/extensions/priv/tlv.rb +29 -0
  224. data/lib/rex/post/meterpreter/extensions/sniffer/sniffer.rb +117 -0
  225. data/lib/rex/post/meterpreter/extensions/sniffer/tlv.rb +27 -0
  226. data/lib/rex/post/meterpreter/extensions/stdapi/constants.rb +396 -0
  227. data/lib/rex/post/meterpreter/extensions/stdapi/fs/dir.rb +284 -0
  228. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +399 -0
  229. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file_stat.rb +104 -0
  230. data/lib/rex/post/meterpreter/extensions/stdapi/fs/io.rb +48 -0
  231. data/lib/rex/post/meterpreter/extensions/stdapi/net/arp.rb +59 -0
  232. data/lib/rex/post/meterpreter/extensions/stdapi/net/config.rb +256 -0
  233. data/lib/rex/post/meterpreter/extensions/stdapi/net/interface.rb +129 -0
  234. data/lib/rex/post/meterpreter/extensions/stdapi/net/netstat.rb +97 -0
  235. data/lib/rex/post/meterpreter/extensions/stdapi/net/resolve.rb +106 -0
  236. data/lib/rex/post/meterpreter/extensions/stdapi/net/route.rb +67 -0
  237. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket.rb +139 -0
  238. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_client_channel.rb +180 -0
  239. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/tcp_server_channel.rb +168 -0
  240. data/lib/rex/post/meterpreter/extensions/stdapi/net/socket_subsystem/udp_channel.rb +209 -0
  241. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +38146 -0
  242. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/buffer_item.rb +48 -0
  243. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_advapi32.rb +2102 -0
  244. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_crypt32.rb +32 -0
  245. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_iphlpapi.rb +97 -0
  246. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_kernel32.rb +3852 -0
  247. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_netapi32.rb +100 -0
  248. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ntdll.rb +168 -0
  249. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_psapi.rb +32 -0
  250. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_shell32.rb +32 -0
  251. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_user32.rb +3170 -0
  252. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_version.rb +41 -0
  253. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wlanapi.rb +87 -0
  254. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_wldap32.rb +128 -0
  255. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/def/def_ws2_32.rb +613 -0
  256. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +388 -0
  257. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_function.rb +111 -0
  258. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_helper.rb +149 -0
  259. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper.rb +27 -0
  260. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/mock_magic.rb +515 -0
  261. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/multicall.rb +319 -0
  262. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/platform_util.rb +23 -0
  263. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/railgun.rb +301 -0
  264. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/tlv.rb +56 -0
  265. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util.rb +106 -0
  266. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/util.rb +676 -0
  267. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager.rb +96 -0
  268. data/lib/rex/post/meterpreter/extensions/stdapi/stdapi.rb +151 -0
  269. data/lib/rex/post/meterpreter/extensions/stdapi/sys/config.rb +128 -0
  270. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log.rb +192 -0
  271. data/lib/rex/post/meterpreter/extensions/stdapi/sys/event_log_subsystem/event_record.rb +41 -0
  272. data/lib/rex/post/meterpreter/extensions/stdapi/sys/power.rb +60 -0
  273. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process.rb +408 -0
  274. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/image.rb +129 -0
  275. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/io.rb +55 -0
  276. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/memory.rb +336 -0
  277. data/lib/rex/post/meterpreter/extensions/stdapi/sys/process_subsystem/thread.rb +141 -0
  278. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry.rb +328 -0
  279. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_key.rb +193 -0
  280. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/registry_value.rb +102 -0
  281. data/lib/rex/post/meterpreter/extensions/stdapi/sys/registry_subsystem/remote_registry_key.rb +188 -0
  282. data/lib/rex/post/meterpreter/extensions/stdapi/sys/thread.rb +180 -0
  283. data/lib/rex/post/meterpreter/extensions/stdapi/tlv.rb +236 -0
  284. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +259 -0
  285. data/lib/rex/post/meterpreter/extensions/stdapi/webcam/webcam.rb +201 -0
  286. data/lib/rex/post/meterpreter/inbound_packet_handler.rb +30 -0
  287. data/lib/rex/post/meterpreter/object_aliases.rb +83 -0
  288. data/lib/rex/post/meterpreter/packet.rb +709 -0
  289. data/lib/rex/post/meterpreter/packet_dispatcher.rb +543 -0
  290. data/lib/rex/post/meterpreter/packet_parser.rb +94 -0
  291. data/lib/rex/post/meterpreter/packet_response_waiter.rb +83 -0
  292. data/lib/rex/post/meterpreter/ui/console.rb +142 -0
  293. data/lib/rex/post/meterpreter/ui/console/command_dispatcher.rb +86 -0
  294. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/android.rb +383 -0
  295. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +939 -0
  296. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/espia.rb +109 -0
  297. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi.rb +65 -0
  298. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/adsi.rb +198 -0
  299. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/clipboard.rb +444 -0
  300. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/service.rb +199 -0
  301. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/window.rb +118 -0
  302. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/extapi/wmi.rb +108 -0
  303. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/incognito.rb +242 -0
  304. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/kiwi.rb +509 -0
  305. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks.rb +60 -0
  306. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/dhcp.rb +254 -0
  307. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/lanattacks/tftp.rb +159 -0
  308. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/mimikatz.rb +182 -0
  309. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/networkpug.rb +232 -0
  310. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv.rb +62 -0
  311. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/elevate.rb +97 -0
  312. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/passwd.rb +52 -0
  313. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/priv/timestomp.rb +133 -0
  314. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/sniffer.rb +204 -0
  315. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi.rb +66 -0
  316. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +527 -0
  317. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/net.rb +448 -0
  318. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/sys.rb +906 -0
  319. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +318 -0
  320. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/webcam.rb +343 -0
  321. data/lib/rex/post/meterpreter/ui/console/interactive_channel.rb +99 -0
  322. data/lib/rex/post/permission.rb +26 -0
  323. data/lib/rex/post/process.rb +57 -0
  324. data/lib/rex/post/thread.rb +57 -0
  325. data/lib/rex/post/ui.rb +52 -0
  326. data/lib/rex/proto.rb +15 -0
  327. data/lib/rex/proto/addp.rb +218 -0
  328. data/lib/rex/proto/dcerpc.rb +7 -0
  329. data/lib/rex/proto/dcerpc/client.rb +362 -0
  330. data/lib/rex/proto/dcerpc/exceptions.rb +151 -0
  331. data/lib/rex/proto/dcerpc/handle.rb +48 -0
  332. data/lib/rex/proto/dcerpc/ndr.rb +73 -0
  333. data/lib/rex/proto/dcerpc/packet.rb +264 -0
  334. data/lib/rex/proto/dcerpc/response.rb +188 -0
  335. data/lib/rex/proto/dcerpc/uuid.rb +85 -0
  336. data/lib/rex/proto/dcerpc/wdscp.rb +3 -0
  337. data/lib/rex/proto/dcerpc/wdscp/constants.rb +89 -0
  338. data/lib/rex/proto/dcerpc/wdscp/packet.rb +94 -0
  339. data/lib/rex/proto/dhcp.rb +7 -0
  340. data/lib/rex/proto/dhcp/constants.rb +34 -0
  341. data/lib/rex/proto/dhcp/server.rb +334 -0
  342. data/lib/rex/proto/drda.rb +6 -0
  343. data/lib/rex/proto/drda/constants.rb +50 -0
  344. data/lib/rex/proto/drda/packet.rb +253 -0
  345. data/lib/rex/proto/drda/utils.rb +124 -0
  346. data/lib/rex/proto/http.rb +7 -0
  347. data/lib/rex/proto/http/client.rb +722 -0
  348. data/lib/rex/proto/http/client_request.rb +472 -0
  349. data/lib/rex/proto/http/handler.rb +47 -0
  350. data/lib/rex/proto/http/handler/erb.rb +129 -0
  351. data/lib/rex/proto/http/handler/proc.rb +61 -0
  352. data/lib/rex/proto/http/header.rb +173 -0
  353. data/lib/rex/proto/http/packet.rb +414 -0
  354. data/lib/rex/proto/http/request.rb +354 -0
  355. data/lib/rex/proto/http/response.rb +151 -0
  356. data/lib/rex/proto/http/server.rb +385 -0
  357. data/lib/rex/proto/iax2.rb +2 -0
  358. data/lib/rex/proto/iax2/call.rb +326 -0
  359. data/lib/rex/proto/iax2/client.rb +218 -0
  360. data/lib/rex/proto/iax2/codecs.rb +5 -0
  361. data/lib/rex/proto/iax2/codecs/alaw.rb +16 -0
  362. data/lib/rex/proto/iax2/codecs/g711.rb +2176 -0
  363. data/lib/rex/proto/iax2/codecs/mulaw.rb +17 -0
  364. data/lib/rex/proto/iax2/constants.rb +262 -0
  365. data/lib/rex/proto/ipmi.rb +57 -0
  366. data/lib/rex/proto/ipmi/channel_auth_reply.rb +89 -0
  367. data/lib/rex/proto/ipmi/open_session_reply.rb +36 -0
  368. data/lib/rex/proto/ipmi/rakp2.rb +36 -0
  369. data/lib/rex/proto/ipmi/utils.rb +125 -0
  370. data/lib/rex/proto/natpmp.rb +7 -0
  371. data/lib/rex/proto/natpmp/constants.rb +19 -0
  372. data/lib/rex/proto/natpmp/packet.rb +45 -0
  373. data/lib/rex/proto/ntlm.rb +8 -0
  374. data/lib/rex/proto/ntlm/base.rb +327 -0
  375. data/lib/rex/proto/ntlm/constants.rb +75 -0
  376. data/lib/rex/proto/ntlm/crypt.rb +412 -0
  377. data/lib/rex/proto/ntlm/exceptions.rb +17 -0
  378. data/lib/rex/proto/ntlm/message.rb +534 -0
  379. data/lib/rex/proto/ntlm/utils.rb +765 -0
  380. data/lib/rex/proto/ntp.rb +3 -0
  381. data/lib/rex/proto/ntp/constants.rb +12 -0
  382. data/lib/rex/proto/ntp/modes.rb +130 -0
  383. data/lib/rex/proto/pjl.rb +31 -0
  384. data/lib/rex/proto/pjl/client.rb +163 -0
  385. data/lib/rex/proto/proxy/socks4a.rb +441 -0
  386. data/lib/rex/proto/rfb.rb +13 -0
  387. data/lib/rex/proto/rfb/cipher.rb +82 -0
  388. data/lib/rex/proto/rfb/client.rb +205 -0
  389. data/lib/rex/proto/rfb/constants.rb +50 -0
  390. data/lib/rex/proto/sip.rb +4 -0
  391. data/lib/rex/proto/sip/response.rb +61 -0
  392. data/lib/rex/proto/smb.rb +8 -0
  393. data/lib/rex/proto/smb/client.rb +2064 -0
  394. data/lib/rex/proto/smb/constants.rb +1064 -0
  395. data/lib/rex/proto/smb/crypt.rb +37 -0
  396. data/lib/rex/proto/smb/evasions.rb +67 -0
  397. data/lib/rex/proto/smb/exceptions.rb +867 -0
  398. data/lib/rex/proto/smb/simpleclient.rb +173 -0
  399. data/lib/rex/proto/smb/simpleclient/open_file.rb +106 -0
  400. data/lib/rex/proto/smb/simpleclient/open_pipe.rb +57 -0
  401. data/lib/rex/proto/smb/utils.rb +104 -0
  402. data/lib/rex/proto/sunrpc.rb +2 -0
  403. data/lib/rex/proto/sunrpc/client.rb +196 -0
  404. data/lib/rex/proto/tftp.rb +13 -0
  405. data/lib/rex/proto/tftp/client.rb +344 -0
  406. data/lib/rex/proto/tftp/constants.rb +39 -0
  407. data/lib/rex/proto/tftp/server.rb +497 -0
  408. data/lib/rex/random_identifier_generator.rb +177 -0
  409. data/lib/rex/registry.rb +14 -0
  410. data/lib/rex/registry/hive.rb +132 -0
  411. data/lib/rex/registry/lfkey.rb +51 -0
  412. data/lib/rex/registry/nodekey.rb +54 -0
  413. data/lib/rex/registry/regf.rb +25 -0
  414. data/lib/rex/registry/valuekey.rb +67 -0
  415. data/lib/rex/registry/valuelist.rb +29 -0
  416. data/lib/rex/ropbuilder.rb +8 -0
  417. data/lib/rex/ropbuilder/rop.rb +271 -0
  418. data/lib/rex/script.rb +42 -0
  419. data/lib/rex/script/base.rb +61 -0
  420. data/lib/rex/script/meterpreter.rb +16 -0
  421. data/lib/rex/script/shell.rb +10 -0
  422. data/lib/rex/service.rb +49 -0
  423. data/lib/rex/service_manager.rb +154 -0
  424. data/lib/rex/services/local_relay.rb +424 -0
  425. data/lib/rex/socket.rb +788 -0
  426. data/lib/rex/socket/comm.rb +120 -0
  427. data/lib/rex/socket/comm/local.rb +526 -0
  428. data/lib/rex/socket/ip.rb +132 -0
  429. data/lib/rex/socket/parameters.rb +363 -0
  430. data/lib/rex/socket/range_walker.rb +470 -0
  431. data/lib/rex/socket/ssl_tcp.rb +345 -0
  432. data/lib/rex/socket/ssl_tcp_server.rb +188 -0
  433. data/lib/rex/socket/subnet_walker.rb +76 -0
  434. data/lib/rex/socket/switch_board.rb +289 -0
  435. data/lib/rex/socket/tcp.rb +79 -0
  436. data/lib/rex/socket/tcp_server.rb +67 -0
  437. data/lib/rex/socket/udp.rb +165 -0
  438. data/lib/rex/sslscan/result.rb +201 -0
  439. data/lib/rex/sslscan/scanner.rb +206 -0
  440. data/lib/rex/struct2.rb +5 -0
  441. data/lib/rex/struct2/c_struct.rb +181 -0
  442. data/lib/rex/struct2/c_struct_template.rb +39 -0
  443. data/lib/rex/struct2/constant.rb +26 -0
  444. data/lib/rex/struct2/element.rb +44 -0
  445. data/lib/rex/struct2/generic.rb +73 -0
  446. data/lib/rex/struct2/restraint.rb +54 -0
  447. data/lib/rex/struct2/s_string.rb +72 -0
  448. data/lib/rex/struct2/s_struct.rb +111 -0
  449. data/lib/rex/sync.rb +6 -0
  450. data/lib/rex/sync/event.rb +85 -0
  451. data/lib/rex/sync/read_write_lock.rb +177 -0
  452. data/lib/rex/sync/ref.rb +58 -0
  453. data/lib/rex/sync/thread_safe.rb +83 -0
  454. data/lib/rex/text.rb +1813 -0
  455. data/lib/rex/thread_factory.rb +43 -0
  456. data/lib/rex/time.rb +66 -0
  457. data/lib/rex/transformer.rb +116 -0
  458. data/lib/rex/ui.rb +22 -0
  459. data/lib/rex/ui/interactive.rb +304 -0
  460. data/lib/rex/ui/output.rb +85 -0
  461. data/lib/rex/ui/output/none.rb +19 -0
  462. data/lib/rex/ui/progress_tracker.rb +97 -0
  463. data/lib/rex/ui/subscriber.rb +160 -0
  464. data/lib/rex/ui/text/color.rb +98 -0
  465. data/lib/rex/ui/text/dispatcher_shell.rb +538 -0
  466. data/lib/rex/ui/text/input.rb +119 -0
  467. data/lib/rex/ui/text/input/buffer.rb +79 -0
  468. data/lib/rex/ui/text/input/readline.rb +129 -0
  469. data/lib/rex/ui/text/input/socket.rb +96 -0
  470. data/lib/rex/ui/text/input/stdio.rb +46 -0
  471. data/lib/rex/ui/text/irb_shell.rb +62 -0
  472. data/lib/rex/ui/text/output.rb +86 -0
  473. data/lib/rex/ui/text/output/buffer.rb +62 -0
  474. data/lib/rex/ui/text/output/buffer/stdout.rb +26 -0
  475. data/lib/rex/ui/text/output/file.rb +44 -0
  476. data/lib/rex/ui/text/output/socket.rb +44 -0
  477. data/lib/rex/ui/text/output/stdio.rb +53 -0
  478. data/lib/rex/ui/text/output/tee.rb +56 -0
  479. data/lib/rex/ui/text/progress_tracker.rb +57 -0
  480. data/lib/rex/ui/text/shell.rb +403 -0
  481. data/lib/rex/ui/text/table.rb +346 -0
  482. data/lib/rex/zip.rb +96 -0
  483. data/lib/rex/zip/archive.rb +130 -0
  484. data/lib/rex/zip/blocks.rb +184 -0
  485. data/lib/rex/zip/entry.rb +122 -0
  486. data/lib/rex/zip/jar.rb +283 -0
  487. data/lib/rex/zip/samples/comment.rb +32 -0
  488. data/lib/rex/zip/samples/mkwar.rb +138 -0
  489. data/lib/rex/zip/samples/mkzip.rb +19 -0
  490. data/lib/rex/zip/samples/recursive.rb +58 -0
  491. metadata +536 -0
@@ -0,0 +1,132 @@
1
+ # -*- coding: binary -*-
2
+ #
3
+ # This is a Ruby port of the Python manifest parsing code posted to:
4
+ # http://stackoverflow.com/questions/3085153/how-to-parse-the-manifest-mbdb-file-in-an-ios-4-0-itunes-backup/3130860#3130860
5
+ #
6
+
7
+ module Rex
8
+ module Parser
9
+ class AppleBackupManifestDB
10
+
11
+ attr_accessor :entry_offsets
12
+ attr_accessor :entries
13
+ attr_accessor :mbdb, :mbdx
14
+ attr_accessor :mbdb_data, :mbdx_data
15
+ attr_accessor :mbdb_offset, :mbdx_offset
16
+
17
+ def initialize(mbdb_data, mbdx_data)
18
+ self.entries = {}
19
+ self.entry_offsets = {}
20
+ self.mbdb_data = mbdb_data
21
+ self.mbdx_data = mbdx_data
22
+ parse_mbdb
23
+ parse_mbdx
24
+ end
25
+
26
+ def self.from_files(mbdb_file, mbdx_file)
27
+ mbdb_data = ""
28
+ ::File.open(mbdb_file, "rb") {|fd| mbdb_data = fd.read(fd.stat.size) }
29
+ mbdx_data = ""
30
+ ::File.open(mbdx_file, "rb") {|fd| mbdx_data = fd.read(fd.stat.size) }
31
+
32
+ self.new(mbdb_data, mbdx_data)
33
+ end
34
+
35
+ def parse_mbdb
36
+ raise ArgumentError, "Not valid MBDB data" if self.mbdb_data[0,4] != "mbdb"
37
+ self.mbdb_offset = 4
38
+ self.mbdb_offset = self.mbdb_offset + 2 # Maps to \x05 \x00 (unknown)
39
+
40
+ while self.mbdb_offset < self.mbdb_data.length
41
+ info = {}
42
+ info[:start_offset] = self.mbdb_offset
43
+ info[:domain] = mbdb_read_string
44
+ info[:filename] = mbdb_read_string
45
+ info[:linktarget] = mbdb_read_string
46
+ info[:datahash] = mbdb_read_string
47
+ info[:unknown1] = mbdb_read_string
48
+ info[:mode] = mbdb_read_int(2)
49
+ info[:unknown2] = mbdb_read_int(4)
50
+ info[:unknown3] = mbdb_read_int(4)
51
+ info[:uid] = mbdb_read_int(4)
52
+ info[:gid] = mbdb_read_int(4)
53
+ info[:mtime] = Time.at(mbdb_read_int(4))
54
+ info[:atime] = Time.at(mbdb_read_int(4))
55
+ info[:ctime] = Time.at(mbdb_read_int(4))
56
+ info[:length] = mbdb_read_int(8)
57
+ info[:flag] = mbdb_read_int(1)
58
+ property_count = mbdb_read_int(1)
59
+ info[:properties] = {}
60
+ 1.upto(property_count) do |i|
61
+ k = mbdb_read_string
62
+ v = mbdb_read_string
63
+ info[:properties][k] = v
64
+ end
65
+ self.entry_offsets[ info[:start_offset] ] = info
66
+ end
67
+ self.mbdb_data = ""
68
+ end
69
+
70
+ def parse_mbdx
71
+ raise ArgumentError, "Not a valid MBDX file" if self.mbdx_data[0,4] != "mbdx"
72
+
73
+ self.mbdx_offset = 4
74
+ self.mbdx_offset = self.mbdx_offset + 2 # Maps to \x02 \x00 (unknown)
75
+
76
+ file_count = mbdx_read_int(4)
77
+
78
+ while self.mbdx_offset < self.mbdx_data.length
79
+ file_id = self.mbdx_data[self.mbdx_offset, 20].unpack("C*").map{|c| "%02x" % c}.join
80
+ self.mbdx_offset += 20
81
+ entry_offset = mbdx_read_int(4) + 6
82
+ mode = mbdx_read_int(2)
83
+ entry = entry_offsets[ entry_offset ]
84
+ # May be corrupted if there is no matching entry, but what to do about it?
85
+ next if not entry
86
+ self.entries[file_id] = entry.merge({:mbdx_mode => mode, :file_id => file_id})
87
+ end
88
+ self.mbdx_data = ""
89
+ end
90
+
91
+ def mbdb_read_string
92
+ raise RuntimeError, "Corrupted MBDB file" if self.mbdb_offset > self.mbdb_data.length
93
+ len = self.mbdb_data[self.mbdb_offset, 2].unpack("n")[0]
94
+ self.mbdb_offset += 2
95
+ return '' if len == 65535
96
+ val = self.mbdb_data[self.mbdb_offset, len]
97
+ self.mbdb_offset += len
98
+ return val
99
+ end
100
+
101
+ def mbdb_read_int(size)
102
+ val = 0
103
+ size.downto(1) do |i|
104
+ val = (val << 8) + self.mbdb_data[self.mbdb_offset, 1].unpack("C")[0]
105
+ self.mbdb_offset += 1
106
+ end
107
+ val
108
+ end
109
+
110
+ def mbdx_read_string
111
+ raise RuntimeError, "Corrupted MBDX file" if self.mbdx_offset > self.mbdx_data.length
112
+ len = self.mbdx_data[self.mbdx_offset, 2].unpack("n")[0]
113
+ self.mbdx_offset += 2
114
+ return '' if len == 65535
115
+ val = self.mbdx_data[self.mbdx_offset, len]
116
+ self.mbdx_offset += len
117
+ return val
118
+ end
119
+
120
+ def mbdx_read_int(size)
121
+ val = 0
122
+ size.downto(1) do |i|
123
+ val = (val << 8) + self.mbdx_data[self.mbdx_offset, 1].unpack("C")[0]
124
+ self.mbdx_offset += 1
125
+ end
126
+ val
127
+ end
128
+ end
129
+
130
+
131
+ end
132
+ end
@@ -0,0 +1,367 @@
1
+ # -*- coding: binary -*-
2
+ require "rex/parser/nokogiri_doc_mixin"
3
+
4
+ module Rex
5
+ module Parser
6
+
7
+ # If Nokogiri is available, define AppScan document class.
8
+ load_nokogiri && class AppscanDocument < Nokogiri::XML::SAX::Document
9
+
10
+ include NokogiriDocMixin
11
+
12
+ # The resolver prefers your local /etc/hosts (or windows equiv), but will
13
+ # fall back to regular DNS. It retains a cache for the import to avoid
14
+ # spamming your network with DNS requests.
15
+ attr_reader :resolv_cache
16
+
17
+ # If name resolution of the host fails out completely, you will not be
18
+ # able to import that Scan task. Other scan tasks in the same report
19
+ # should be unaffected.
20
+ attr_reader :parse_warning
21
+
22
+ def start_document
23
+ @parse_warnings = []
24
+ @resolv_cache = {}
25
+ end
26
+
27
+ def start_element(name=nil,attrs=[])
28
+ attrs = normalize_attrs(attrs)
29
+ block = @block
30
+ @state[:current_tag][name] = true
31
+ case name
32
+ when "Issue" # Start of the stuff we want
33
+ collect_issue(attrs)
34
+ when "Entity" # Start of the stuff we want
35
+ collect_entity(attrs)
36
+ when "Severity", "Url", "OriginalHttpTraffic"
37
+ @state[:has_text] = true
38
+ end
39
+ end
40
+
41
+ def end_element(name=nil)
42
+ block = @block
43
+ case name
44
+ when "Issue" # Wrap it up
45
+ record_issue
46
+ # Reset the state once we close an issue
47
+ @state = @state.select do
48
+ |k| [:current_tag, :web_sites].include? k
49
+ end
50
+ when "Url" # Populates @state[:web_site]
51
+ @state[:has_text] = false
52
+ record_url
53
+ @text = nil
54
+ report_web_site(&block)
55
+ handle_parse_warnings(&block)
56
+ when "Severity"
57
+ @state[:has_text] = false
58
+ record_risk
59
+ @text = nil
60
+ when "OriginalHttpTraffic" # Request and response
61
+ @state[:has_text] = false
62
+ record_request_and_response
63
+ report_service_info
64
+ page_info = report_web_page(&block)
65
+ if page_info
66
+ form_info = report_web_form(page_info,&block)
67
+ if form_info
68
+ report_web_vuln(form_info,&block)
69
+ end
70
+ end
71
+ @text = nil
72
+ end
73
+ @state[:current_tag].delete name
74
+ end
75
+
76
+ def report_web_vuln(form_info,&block)
77
+ return unless(in_issue && has_text)
78
+ return unless form_info.kind_of? Hash
79
+ return unless @state[:issue]
80
+ return unless @state[:issue]["Noise"]
81
+ return unless @state[:issue]["Noise"].to_s.downcase == "false"
82
+ return unless @state[:issue][:vuln_param]
83
+ web_vuln_info = {}
84
+ web_vuln_info[:web_site] = form_info[:web_site]
85
+ web_vuln_info[:path] = form_info[:path]
86
+ web_vuln_info[:query] = form_info[:query]
87
+ web_vuln_info[:method] = form_info[:method]
88
+ web_vuln_info[:params] = form_info[:params]
89
+ web_vuln_info[:pname] = @state[:issue][:vuln_param]
90
+ web_vuln_info[:proof] = "" # TODO: pick this up from <Difference> maybe?
91
+ web_vuln_info[:risk] = @state[:issue][:risk]
92
+ web_vuln_info[:name] = @state[:issue]["IssueTypeID"]
93
+ web_vuln_info[:category] = "imported"
94
+ web_vuln_info[:confidence] = 100 # Seems pretty binary, noise or not
95
+ db.emit(:web_vuln, web_vuln_info[:name], &block) if block
96
+ web_vuln = db_report(:web_vuln, web_vuln_info)
97
+ end
98
+
99
+ def collect_entity(attrs)
100
+ return unless in_issue
101
+ return unless @state[:issue].kind_of? Hash
102
+ ent_hash = attr_hash(attrs)
103
+ return unless ent_hash
104
+ return unless ent_hash["Type"].to_s.downcase == "parameter"
105
+ @state[:issue][:vuln_param] = ent_hash["Name"]
106
+ end
107
+
108
+ def report_web_form(page_info,&block)
109
+ return unless(in_issue && has_text)
110
+ return unless page_info.kind_of? Hash
111
+ return unless @state[:request_body]
112
+ return if @state[:request_body].strip.empty?
113
+ web_form_info = {}
114
+ web_form_info[:web_site] = page_info[:web_site]
115
+ web_form_info[:path] = page_info[:path]
116
+ web_form_info[:query] = page_info[:query]
117
+ web_form_info[:method] = @state[:request_headers].cmd_string.split(/\s+/)[0]
118
+ parsed_params = parse_params(@state[:request_body])
119
+ return unless parsed_params
120
+ return if parsed_params.empty?
121
+ web_form_info[:params] = parsed_params
122
+ web_form = db_report(:web_form, web_form_info)
123
+ @state[:web_forms] ||= []
124
+ unless @state[:web_forms].include? web_form
125
+ db.emit(:web_form, @state[:uri].to_s, &block) if block
126
+ @state[:web_forms] << web_form
127
+ end
128
+ web_form_info
129
+ end
130
+
131
+ def parse_params(request_body)
132
+ return unless request_body
133
+ pairs = request_body.split(/&/)
134
+ params = []
135
+ pairs.each do |pair|
136
+ param,value = pair.split("=",2)
137
+ params << [param,""] # Can't tell what's default
138
+ end
139
+ params
140
+ end
141
+
142
+ def report_web_page(&block)
143
+ return unless(in_issue && has_text)
144
+ return unless @state[:web_site]
145
+ return unless @state[:response_headers]
146
+ return unless @state[:uri]
147
+ web_page_info = {}
148
+ web_page_info[:web_site] = @state[:web_site]
149
+ web_page_info[:path] = @state[:uri].path
150
+ web_page_info[:body] = @state[:response_body].to_s
151
+ web_page_info[:query] = @state[:uri].query
152
+ code = @state[:response_headers].cmd_string.split(/\s+/)[1]
153
+ return unless code
154
+ web_page_info[:code] = code
155
+ parsed_headers = {}
156
+ @state[:response_headers].each do |k,v|
157
+ parsed_headers[k.to_s.downcase] ||= []
158
+ parsed_headers[k.to_s.downcase] << v
159
+ end
160
+ return if parsed_headers.empty?
161
+ web_page_info[:headers] = parsed_headers
162
+ web_page = db_report(:web_page, web_page_info)
163
+ @state[:web_pages] ||= []
164
+ unless @state[:web_pages].include? web_page
165
+ db.emit(:web_page, @state[:uri].to_s, &block) if block
166
+ @state[:web_pages] << web_page
167
+ end
168
+ web_page_info
169
+ end
170
+
171
+ def report_service_info
172
+ return unless(in_issue && has_text)
173
+ return unless @state[:web_site]
174
+ return unless @state[:response_headers]
175
+ banner = @state[:response_headers]["server"]
176
+ return unless banner
177
+ service = @state[:web_site].service
178
+ return unless service.info.to_s.empty?
179
+ service_info = {
180
+ :host => service.host,
181
+ :port => service.port,
182
+ :proto => service.proto,
183
+ :info => banner
184
+ }
185
+ db_report(:service, service_info)
186
+ end
187
+
188
+ def record_request_and_response
189
+ return unless(in_issue && has_text)
190
+ return unless @state[:web_site]
191
+ really_original_traffic = unindent_and_crlf(@text)
192
+ split_traffic = really_original_traffic.split(/\r\n\r\n/)
193
+ request_headers_text = split_traffic.first
194
+ content_length = 0
195
+ if request_headers_text =~ /\ncontent-length:\s+([0-9]+)/mni
196
+ content_length = $1.to_i
197
+ end
198
+ if(content_length > 0) and (split_traffic[1].to_s.size >= content_length)
199
+ request_body_text = split_traffic[1].to_s[0,content_length]
200
+ else
201
+ request_body_text = nil
202
+ end
203
+ response_headers_text = split_traffic[1].to_s[content_length,split_traffic[1].to_s.size].lstrip
204
+ request = request_headers_text
205
+ return unless(request && response_headers_text)
206
+ response_body_text = split_traffic[2]
207
+ req_header = Rex::Proto::Http::Packet::Header.new
208
+ res_header = Rex::Proto::Http::Packet::Header.new
209
+ req_header.from_s request_headers_text.dup
210
+ res_header.from_s response_headers_text.dup
211
+ @state[:request_headers] = req_header
212
+ @state[:request_body] = request_body_text
213
+ @state[:response_headers] = res_header
214
+ @state[:response_body] = response_body_text
215
+ end
216
+
217
+ # Appscan tab-indents which makes parsing a little difficult. They
218
+ # also don't record CRLFs, just LFs.
219
+ def unindent_and_crlf(text)
220
+ second_line = text.split(/\r*\n/)[1]
221
+ indent_level = second_line.size - second_line.lstrip.size
222
+ unindented_text_lines = []
223
+ text.split(/\r*\n/).each do |line|
224
+ if line =~ /^\t{#{indent_level}}/
225
+ unindented_line = line[indent_level,line.size]
226
+ unindented_text_lines << unindented_line
227
+ else
228
+ unindented_text_lines << line
229
+ end
230
+ end
231
+ unindented_text_lines.join("\r\n")
232
+ end
233
+
234
+ def record_risk
235
+ return unless(in_issue && has_text)
236
+ @state[:issue] ||= {}
237
+ @state[:issue][:risk] = map_severity_to_risk
238
+ end
239
+
240
+ def map_severity_to_risk
241
+ case @text.to_s.downcase
242
+ when "high" ; 5
243
+ when "medium" ; 3
244
+ when "low" ; 1
245
+ else ; 0
246
+ end
247
+ end
248
+
249
+ # TODO
250
+ def record_issue
251
+ return unless in_issue
252
+ return unless @report_data[:issue].kind_of? Hash
253
+ return unless @state[:web_site]
254
+ return if @state[:issue]["Noise"].to_s.downcase == "true"
255
+ end
256
+
257
+ def collect_issue(attrs)
258
+ return unless in_issue
259
+ @state[:issue] = {}
260
+ @state[:issue].merge! attr_hash(attrs)
261
+ end
262
+
263
+ def report_web_site(&block)
264
+ return unless @state[:uri]
265
+ uri = @state[:uri]
266
+ hostname = uri.host # Assume the first one is the real hostname
267
+ address = resolve_issue_url_address(uri)
268
+ return unless address
269
+ unless @resolv_cache.values.include? address
270
+ db.emit(:address, address, &block) if block
271
+ end
272
+ port = resolve_port(uri)
273
+ return unless port
274
+ scheme = uri.scheme
275
+ return unless scheme
276
+ web_site_info = {:workspace => @args[:wspace]}
277
+ web_site_info[:vhost] = hostname
278
+ service_obj = check_for_existing_service(address,port)
279
+ if service_obj
280
+ web_site_info[:service] = service_obj
281
+ else
282
+ web_site_info[:host] = address
283
+ web_site_info[:port] = port
284
+ web_site_info[:ssl] = scheme == "https"
285
+ end
286
+ web_site_obj = db_report(:web_site, web_site_info)
287
+ @state[:web_sites] ||= []
288
+ unless @state[:web_sites].include? web_site_obj
289
+ url = "#{uri.scheme}://#{uri.host}:#{uri.port}"
290
+ db.emit(:web_site, url, &block) if block
291
+ db.report_import_note(@args[:wspace], web_site_obj.service.host)
292
+ @state[:web_sites] << web_site_obj
293
+ end
294
+ @state[:service] = service_obj || web_site_obj.service
295
+ @state[:host] = (service_obj || web_site_obj.service).host
296
+ @state[:web_site] = web_site_obj
297
+ end
298
+
299
+ def check_for_existing_service(address,port)
300
+ db.get_service(@args[:wspace],address,"tcp",port)
301
+ end
302
+
303
+ def resolve_port(uri)
304
+ @state[:port] = uri.port
305
+ unless @state[:port]
306
+ @parse_warnings << "Could not determine a port for '#{@state[:scan_name]}'"
307
+ end
308
+ return @state[:port]
309
+ end
310
+
311
+ def resolve_address(host)
312
+ return @resolv_cache[host] if @resolv_cache[host]
313
+ address = Rex::Socket.resolv_to_dotted(host) rescue nil
314
+ @resolv_cache[host] = address
315
+ if address
316
+ block = @block
317
+ db.emit(:address, address, &block) if block
318
+ end
319
+ return address
320
+ end
321
+
322
+ # Alias this
323
+ def resolve_issue_url_address(uri)
324
+ if uri.host
325
+ address = resolve_address(uri.host)
326
+ unless address
327
+ @parse_warnings << "Could not resolve address for '#{uri.host}', skipping."
328
+ end
329
+ else
330
+ @parse_warnings << "Could not determine a host for this import."
331
+ end
332
+ address
333
+ end
334
+
335
+ def handle_parse_warnings(&block)
336
+ return if @parse_warnings.empty?
337
+ @parse_warnings.each do |pwarn|
338
+ db.emit(:warning, pwarn, &block) if block
339
+ end
340
+ end
341
+
342
+ def record_url
343
+ return unless in_issue
344
+ return unless has_text
345
+ uri = URI.parse(@text) rescue nil
346
+ return unless uri
347
+ @state[:uri] = uri
348
+ end
349
+
350
+ def in_issue
351
+ return false unless in_tag("Issue")
352
+ return false unless in_tag("Issues")
353
+ return false unless in_tag("XmlReport")
354
+ return true
355
+ end
356
+
357
+ def has_text
358
+ return false unless @text
359
+ return false if @text.strip.empty?
360
+ @text = @text.strip
361
+ end
362
+
363
+ end
364
+
365
+ end
366
+ end
367
+