По работе часто сталкиваюсь с продуктами 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.
Автор: mirwide