• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Трюки с принтером. Эпизод II: Атака клонов

Azrv3l

win32kfull
Эксперт
Регистрация
30.03.2019
Сообщения
215
Реакции
539
Примечание переводчика: Надеюсь отсылку в названии получилось передать

TL;DR

Мы покажем, как расшифровать пароли из резервной копии конфигурации Xerox WorkCentre и как во время реверсинга, мы нашли уязвимость внедрения команд (CVE-2021-27508).

«Printer Trick» - это то, как я назвал идею использования принтеров с учетными данными по умолчанию для проникновения в сеть. Это стало обычным явлением в наших тестах на проникновение. Впервые я применил эту технику во время одного из моих первых внутренних тестов на проникновение в 2016 году, и в инфраструктуре клиента мы обнаружили принтер с учетными данными по умолчанию. Более того, в конфигурации был сохранен пользователь-администратор домена для запроса в Active Directory (AD) адресов электронной почты, чтобы отправлять отсканированные документы на учетную запись электронной почты пользователя. Мы могли извлечь пароль администратора домена, настроив поддельный сервер LDAP и изменив конфигурацию принтера так, чтобы машина атакующего выступала в качестве сервера LDAP.

Перенесемся в 2021 год, и мы все еще видим принтеры с учетными данными по умолчанию во многих компаниях в настоящее время, либо для всех установленных принтеров, либо только для одного, который был настроен по-другому или забыт. Последний раз мы встречались с ним в феврале, когда мы проводили Red Teaming. Обнаружив, мы получили доступ к панели администрирования принтера с учетными данными по умолчанию. Здесь учетная запись AD использовалась для функции «сканирование в папку». В этом случае не было простого способа получить пароль учетной записи, поскольку учетные данные не передаются в виде открытого текста через SMB (который использовался для функции «сканирование в папку»). Однако это был принтер WorkCentre от Xerox, который имеет функцию, позволяющую клонировать конфигурацию, чтобы скопировать ее на другое устройство. Я уже использовал эту функцию раньше, чтобы извлечь пароль в виде открытого текста из файла клона. На этот раз это не сработало, прошивка была последней, а пароль был зашифрован в файле клона. Это особенность более новых прошивок.

После извлечения из файла конфигурации внутри файла клона [1] извлеченное значение выглядело следующим образом:
0x549F5884D68E3E853E9AA29DDCCA83C4AA

Как мы подходим к этому сейчас? Начнем с предположения, что файл клона можно импортировать на другие устройства. Таким образом, это должен быть зашифрованный пароль, а не хэш. Кроме того, ключ шифрования должен быть известен обоим устройствам. После проверки файла клона стало ясно, что он здесь не хранится. Таким образом, он уже должен быть на принтере и есть вероятность, что он присутствует в прошивке. Поскольку обновления прошивки общедоступны, я загрузил одно [2] и, вооружившись большим терпением, чтобы компенсировать отсутствие у меня практики реверса, начал копаться в нем.

Во-первых, нужно разобраться, что внутри прошивки. По мне, так они очень похожи на матрешки. Я использовал hex-редактор и команду tar, прежде чем вспомнил, что binwalk может анализировать и извлекать файловую систему, прежде чем заметил, что 7Zip также может это делать. Это выглядит так [3]:
  • Первый архив WorkCentre_7845-55-system-sw07504000101210.zip содержит второй архив WorkCentre_7845-55-system-sw07504000101210.zip
  • этот второй архив содержит DLM файл в dlms/WorkCentre7845-7855/WorkCentre_7845-55-system-sw#07504000101210#ENG_MOD.DLM
  • этот файл DLM содержит файл с именем 07504000101210/NC_App_075_041_01210.140
  • после извлечения мы можем получить доступ к файловой системе.
Здесь я сделал очень просто:
Bash:
$ grep -Ri clone

И сразу пожалел об этом, обнаружив более 1000 вхождений этого слова, даже не считая двоичных файлов.
Следующая команда была более разумной. Ищем веб-страницу, которая создает файл клона в веб-интерфейсе:
Bash:
$ find . -name cloning.php
./var/opt/nc/dlms/http/data/htdocs/properties/cloning.php

На этой странице мы находим форму, которая отправляется при создании файла клона:
Bash:
[CUT BY COMPASS]
<form action="/dummypost/xerox.set" method="POST">
<div>
<input type="hidden" name="_fun_function" value="HTTP_Set_Config_Attrib_fn">
<input type="hidden" name="_fun_function" value="HTTP_Config_Cloning_fn">
<input type="hidden" name="NextPage" value="/properties/cloning_dl.php">
[CUT BY COMPASS]

Похоже, вызывается какая-то функция, HTTP_Config_Cloning_fn. На этот раз я смог безопасно использовать grep и нашел библиотеку с именем libhttp_cloning.so, которая, похоже, экспортирует эту функцию.
Загрузив её в Ghidra, я быстро нашел функцию в экспорте:

1.png


И оттуда обнаружил, что эта функция в какой-то момент вызывает другую и вызывает двоичный файл createClone:

2.png


Возвращаясь к файловой системе, мы можем найти createClone и его аналог, installClone, в /opt/nc/bin.
Здесь я попытался понять весь процесс, но это глубокая кроличья нора, и гораздо более быстрый способ - найти строки, содержащие слово crypt, и быстро найти этот вызов функции:

3.png


Да, это статический ключ шифрования, и нет, он не приводится в этом сообщении в блоге. Имея всю информацию, которая у вас уже есть, будет достаточно легко найти ее самостоятельно.;)

Возвращаясь к теме, это вызов функции другой библиотеки, libessCrypto.so, которую мы также можем открыть в Ghidra.
Здесь мы узнаем, что последний байт зашифрованного пароля (AA) указывает, что используется AES256, и мы видим, что выполняется вызов EVP_DecryptInit:

4.png


Это функция OpenSSL, и мы можем найти ее прототип в документации [4]:
C++:
int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, const unsigned char *key, const unsigned char *iv);

Итак, у нас есть OpenSSL, расшифровывающий наш пароль с помощью статического ключа. Это должно быть легко сделать самостоятельно.
И действительно, оказывается, что это можно сделать с помощью простого скрипта:
Bash:
$ echo "549F5884D68E3E853E9AA29DDCCA83C4" | xxd -r -p | openssl aes-256-cbc -K 4E6F745468654B6579596F752772654C6F6F6B696E67466F72 -iv 0 -d
hex string is too short, padding with zero bytes to length
hex string is too short, padding with zero bytes to length
BurpIsNotBeef

И мы получаем свой пароль открытым текстом! Возвращаясь к истории, мы не могли использовать пароль во время оценки, потому что мне потребовалось несколько вечеров, чтобы разобраться во всем этом, и к тому времени проект был уже завершен.
Но знания стоили.

Итог: измените пароли на ваших принтерах и

5.png


Кроме того, в более поздних версиях прошивки можно дополнительно зашифровать файл клона с помощью пароля, указанного пользователем. Это усложнило бы анализ, поскольку этот первый уровень шифрования должен быть обращен, прежде чем он достигнет самих файлов конфигурации. Если файлы клонов нужно где-то хранить, обязательно используйте эту функцию. А если на вашем принтере его нет, обновите его прошивку!

Бонус - CVE-2021-27508
Если вы читали TL;DR, возможно, вы уже заметили его, библиотека libhttp_cloning.so вызывает команду оболочки с помощью system(). Поскольку я раньше проводил тесты веб-приложений (а не реверс-инжиниринг), я быстро проверял, проводилась ли дезинфекция и ничего не выделялось. Я сообщил об этом в Xerox, они могли подтвердить ошибку. Они выпустили бюллетень по безопасности со ссылками на обновленные прошивки здесь [5]. Мы опубликовали рекомендацию вместе с этим сообщением в блоге. Он доступен здесь: [6].

Ссылки
Основные сведения о файлах клонов Xerox можно найти в статье Deral Heiland [1]
А недавно Infiltrate Con поделился великолепным докладом Rapaël Rigo (@_trou_), в котором подробно рассказывается о том, как он разбирал несколько принтеров Xerox и каковы были результаты [7]

[1] http://h.foofus.net/goons/percx/Xerox_hack.pdf
[2] https://www.support.xerox.com/en-us/product/workcentre-7800-series/content/150523
[4] https://www.openssl.org/docs/man1.1.0/man3/EVP_DecryptInit.html
[5] https://securitydocs.business.xerox..._Mini_Bulletin_XRX21J_for_ConnectKey_v1.0.pdf
[6] https://www.compass-security.com/fi...command_injection_RCE_in_Xerox_WorkCentre.txt
[7] https://vimeo.com/showcase/8085537

От ТС
Оригинальный пост - тут
Хотелось бы добавить, что обожаю местный редактор сообщений.

Перевод:
Azrv3l cпециально для xss.pro

BTC: bc1qs2fk7zftnwwhhdrw9ge6ncxrspeyta7dymjwkj
XMR: 47XEeTRbHoHFVZ8eTMoMRvdwtpxyx2fee4XAWMyA18KEMAxGh2jMZurBpGtWSN1obMFo8HQXLvtyoTozSnW8CQy31zaSPBc
ETH: 0xEb8CdE54aBaA7186E9dB8A27f6898C9F02397bab
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх