вторник, 28 декабря 2010 г.

ManageEngine ServiceDesk. Хранение паролей в БД.

Если забыли пароль к учетной записи администратора программного продукта ManageEngine ServiceDeskPlus, то достаточно ознакомиться с топиком на официальном форуме ServiceDesk Admin Password Reset. Но мы пойдем дальше...
и будем разбираться как храниться этот пароль в базе данных. Для этого немного разберемся с имеющимися табличками в БД. Если имеется только имя пользователя нам понадобиться 5 табличек для того чтобы получить хэш-пароля:
  • aaaUser (получаем user_id относительно имени пользователя), 
  • aaaLogin (получаем login_id относительно user_id), 
  • aaaAccount (получаем account_id относительно login_id), 
  • aaaAccPassword (получаем password_id относильено account_id), 
  • aaaPassword (получаем хэш - password, algorithm, salt)
Для разбора принципа генерации хэша мне понадобилось 30 минут свободного времени и темповая учетная запись в системе. Этой учетке сбрасываем пароль на пустую строку несколько раз с сохранением результатов. Пример сброса пароля:
http://sd/resetPwd.do?domainName=-&loginName=vasya&newPwd=&resetPwdButton=
Можно заметить, что поле algorithm содержит значение md5, а хэш больно похож на закодированную строку base64. Из этого делаем предположение, что обязательно должны присутствовать эти два варианта преобразования. Еще один момент поле salt - является значением текущего времени и скорее всего используется в процессе формирования хэша, т.к. явно сбрасывается при установке нового пароля пользователю (это видно и в топике ServiceDesk Admin Password Reset). 

Хэш-пароля - 24 символа. Если это base64, то исходная строка будет 24/4*3=18-2=16 символов.
Декодируем строку хэша через base64, результат - набор плохо читаемых символов. 

Пойдем с другой стороны, преобразуем salt через md5, получили строку из 32 символов, что есть в два раза больше чем должна быть для исходной строки для base64. Проверим свою теорию и преобразуем результирующую строку base64 из hex-строки в обычную. 

Ура! Вот она.

Напишем маленький скрипт для демонстрации выполненных наших работ. Под рукой оказался только хостинг с php на борту, им и воспользуемся:
$hash = base64_encode( pack( 'H*', md5( $pass.$salt ) ) );
Эта строка поможет вам создать любой пароль для учетной записи, но для этого вам нужно будет указать переменные $pass - будущий пароль и $salt - любое значение времени в формате unix.

Но это работает только для локальных учетных записей программного продукта, а как происходит работа с учетными записями из ActiveDirectory я пока не разобрался, да и нет на это сейчас времени.

Комментариев нет:

Отправить комментарий