Примечание переводчика: Надеюсь отсылку в названии получилось передать
TL;DR
Мы покажем, как расшифровать пароли из резервной копии конфигурации Xerox WorkCentre и как во время реверсинга, мы нашли уязвимость внедрения команд (CVE-2021-27508).
«Printer Trick» - это то, как я назвал идею использования принтеров с учетными данными по умолчанию для проникновения в сеть. Это стало обычным явлением в наших тестах на проникновение. Впервые я применил эту технику во время одного из моих первых внутренних тестов на проникновение в 2016 году, и в инфраструктуре клиента мы обнаружили принтер с учетными данными по умолчанию. Более того, в конфигурации был сохранен пользователь-администратор домена для запроса в Active Directory (AD) адресов электронной почты, чтобы отправлять отсканированные документы на учетную запись электронной почты пользователя. Мы могли извлечь пароль администратора домена, настроив поддельный сервер LDAP и изменив конфигурацию принтера так, чтобы машина атакующего выступала в качестве сервера LDAP.
Перенесемся в 2021 год, и мы все еще видим принтеры с учетными данными по умолчанию во многих компаниях в настоящее время, либо для всех установленных принтеров, либо только для одного, который был настроен по-другому или забыт. Последний раз мы встречались с ним в феврале, когда мы проводили Red Teaming. Обнаружив, мы получили доступ к панели администрирования принтера с учетными данными по умолчанию. Здесь учетная запись AD использовалась для функции «сканирование в папку». В этом случае не было простого способа получить пароль учетной записи, поскольку учетные данные не передаются в виде открытого текста через SMB (который использовался для функции «сканирование в папку»). Однако это был принтер WorkCentre от Xerox, который имеет функцию, позволяющую клонировать конфигурацию, чтобы скопировать ее на другое устройство. Я уже использовал эту функцию раньше, чтобы извлечь пароль в виде открытого текста из файла клона. На этот раз это не сработало, прошивка была последней, а пароль был зашифрован в файле клона. Это особенность более новых прошивок.
После извлечения из файла конфигурации внутри файла клона [1] извлеченное значение выглядело следующим образом:
Как мы подходим к этому сейчас? Начнем с предположения, что файл клона можно импортировать на другие устройства. Таким образом, это должен быть зашифрованный пароль, а не хэш. Кроме того, ключ шифрования должен быть известен обоим устройствам. После проверки файла клона стало ясно, что он здесь не хранится. Таким образом, он уже должен быть на принтере и есть вероятность, что он присутствует в прошивке. Поскольку обновления прошивки общедоступны, я загрузил одно [2] и, вооружившись большим терпением, чтобы компенсировать отсутствие у меня практики реверса, начал копаться в нем.
Во-первых, нужно разобраться, что внутри прошивки. По мне, так они очень похожи на матрешки. Я использовал hex-редактор и команду tar, прежде чем вспомнил, что binwalk может анализировать и извлекать файловую систему, прежде чем заметил, что 7Zip также может это делать. Это выглядит так [3]:
И сразу пожалел об этом, обнаружив более 1000 вхождений этого слова, даже не считая двоичных файлов.
Следующая команда была более разумной. Ищем веб-страницу, которая создает файл клона в веб-интерфейсе:
На этой странице мы находим форму, которая отправляется при создании файла клона:
Похоже, вызывается какая-то функция,
Загрузив её в Ghidra, я быстро нашел функцию в экспорте:
И оттуда обнаружил, что эта функция в какой-то момент вызывает другую и вызывает двоичный файл
Возвращаясь к файловой системе, мы можем найти
Здесь я попытался понять весь процесс, но это глубокая кроличья нора, и гораздо более быстрый способ - найти строки, содержащие слово crypt, и быстро найти этот вызов функции:
Да, это статический ключ шифрования, и нет, он не приводится в этом сообщении в блоге. Имея всю информацию, которая у вас уже есть, будет достаточно легко найти ее самостоятельно.
Возвращаясь к теме, это вызов функции другой библиотеки,
Здесь мы узнаем, что последний байт зашифрованного пароля (AA) указывает, что используется AES256, и мы видим, что выполняется вызов
Это функция OpenSSL, и мы можем найти ее прототип в документации [4]:
Итак, у нас есть OpenSSL, расшифровывающий наш пароль с помощью статического ключа. Это должно быть легко сделать самостоятельно.
И действительно, оказывается, что это можно сделать с помощью простого скрипта:
И мы получаем свой пароль открытым текстом! Возвращаясь к истории, мы не могли использовать пароль во время оценки, потому что мне потребовалось несколько вечеров, чтобы разобраться во всем этом, и к тому времени проект был уже завершен.
Но знания стоили.
Итог: измените пароли на ваших принтерах и
Кроме того, в более поздних версиях прошивки можно дополнительно зашифровать файл клона с помощью пароля, указанного пользователем. Это усложнило бы анализ, поскольку этот первый уровень шифрования должен быть обращен, прежде чем он достигнет самих файлов конфигурации. Если файлы клонов нужно где-то хранить, обязательно используйте эту функцию. А если на вашем принтере его нет, обновите его прошивку!
Бонус - CVE-2021-27508
Если вы читали TL;DR, возможно, вы уже заметили его, библиотека
Ссылки
Основные сведения о файлах клонов 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
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, я быстро нашел функцию в экспорте:
И оттуда обнаружил, что эта функция в какой-то момент вызывает другую и вызывает двоичный файл
createClone:
Возвращаясь к файловой системе, мы можем найти
createClone и его аналог, installClone, в /opt/nc/bin. Здесь я попытался понять весь процесс, но это глубокая кроличья нора, и гораздо более быстрый способ - найти строки, содержащие слово crypt, и быстро найти этот вызов функции:
Да, это статический ключ шифрования, и нет, он не приводится в этом сообщении в блоге. Имея всю информацию, которая у вас уже есть, будет достаточно легко найти ее самостоятельно.
Возвращаясь к теме, это вызов функции другой библиотеки,
libessCrypto.so, которую мы также можем открыть в Ghidra. Здесь мы узнаем, что последний байт зашифрованного пароля (AA) указывает, что используется AES256, и мы видим, что выполняется вызов
EVP_DecryptInit:
Это функция 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
И мы получаем свой пароль открытым текстом! Возвращаясь к истории, мы не могли использовать пароль во время оценки, потому что мне потребовалось несколько вечеров, чтобы разобраться во всем этом, и к тому времени проект был уже завершен.
Но знания стоили.
Итог: измените пароли на ваших принтерах и
Кроме того, в более поздних версиях прошивки можно дополнительно зашифровать файл клона с помощью пароля, указанного пользователем. Это усложнило бы анализ, поскольку этот первый уровень шифрования должен быть обращен, прежде чем он достигнет самих файлов конфигурации. Если файлы клонов нужно где-то хранить, обязательно используйте эту функцию. А если на вашем принтере его нет, обновите его прошивку!
Бонус - 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