[Из песочницы] Небезопасное хранение паролей в IBM WebSphere
По работе часто сталкиваюсь с продуктами IBM: WebSphere Application Server (WAS) и другими на его основе. И как и все иногда забываю пароли, в особенности это касается тестовых систем или тех, которым не уделяешь должного внимания.В очередной раз не вспомнив пароля, решил посмотреть, а как его хранит наш сервер приложений. Проанализировав несколько файлов конфигурации, таких как security.xml, wimconfig.xml и resources.xml обнаружил все пароли когда-либо введённые в консоли администрирования, в том числе и пароль главного админа. Хранились они во вполне безобидном на первый взгляд виде.
serverPassword=»{xor}KD4sPjsyNjE=» Xor, конечно, настораживает, но мы ведь не знаем ключа и соли, которую могли бы использовать (но не использовали). Помня со студенческих лет свойство xor, что: если a ⊕ b = c, то a ⊕ c = b … нашёл ключ для той системы, где пароль известен: 283E2C3E3B323631 ⊕ 77617361646D696E = 5F (ASCII код _) Конечно же он всегда одинаков, то есть пароль хранится фактически отрытым текстом, xor на _ не скрывает его даже от пользователей не понимающих ничего в шифровании. Напомню, что так хранятся все пароли: для хранилищ ключей, для доступа к Active Directory, для доступа к базе, которая ввиду специфики использования WAS зачастую хранит информацию, доступ к которой должен быть максимально ограничен. Любой, получивший доступ к файлам конфигурации, становится автоматически администратором сервера приложений и получает пароли от баз данных и других ресурсов.Продукты линейки WebSphere достаточно дороги и недоступны малым и даже средним компаниям. Например, на сегодняшний день лицензия WAS для среднего 2-х сокетного сервера x86 стоит порядка $200 000, WebSphere Portal в несколько раз дороже. Обычно его не ставят на x86, для RISC лицензия стоит ещё дороже. В основном их используют в госорганах и банковской сфере, а в таких организация требования к безопастности особые, например, разделение ролей (администратор ОС, БД, сервера приложений). В такой ситуации это технически нереализуемо.
Написал небольшой скрипт, чтоб «вспоминать» пароли на лету.
import base64
char = ''
input = raw_input («Enter:»)
data = base64.b64decode (input)
for character in data:
hex_char = hex (int (character.encode ('hex'), 16) ^ int ('_'.encode ('hex'), 16))[2:]
char = char + hex_char.decode ('hex')
print 'Password:', char Алгоритм неизменен во всех версия WAS, включая самую последнюю 8.5.5 и во всех продуктах на его базе: Portal Server, BPM, ESB и другие. Надеюсь, в версии 8.6 или хотя бы 9 пароли будут шифроваться AES.