Если забыли пароль к учетной записи администратора программного продукта 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 я пока не разобрался, да и нет на это сейчас времени.
Комментариев нет:
Отправить комментарий