Сброс пароля контроллера UniFi
Как любой системный администратор, уверившийся в совершенстве собственной памяти и способности посреди ночи вспомнить 25-значный код установки Windows XP, поймал недавно такой вот exception.
В один прекрасный день, решив зайти проверить что там с моим контроллером UniFi, получил удивительное сообщение: Login error.
Почесав в затылке и вспомнив, как в один момент забыл пин-код от карты, который набивал чисто механически, начал перебирать возможные варианты. После получаса попыток, поиска заметок в блокноте, пересмотра склеротичек, наклеенных на монитор, понял, что надо искать обходные пути.
Сразу оговорюсь для любителей покритиковать — менеджер учетных записей/паролей, аля LastPass, используется. Собственно говоря, именно LastPass используется. И данные оттуда не способствовали удачной аутентификации.
Поискав на буржуйских форумах, необходимая информация для сброса пароля от любой учетки в контроллере была получена, осмыслена, переварена и собрана в краткую памятку.
Итак, дано:
1. Контроллер UniFi (не играет роли ОС — Linux or Windows) с доступом в саму операционку.
2. Доступ в Интернет.
3. Прямые руки.
Контроллер UniFi всю конфигурацию хранит в базе Mongo.
Проверяем, есть ли нужная нам информация по искомой учетной записи:
mongo --port 27117 ace --eval 'db.admin.find().forEach(printjson);'
В данном конкретном случае запрашиваем информацию для учетной записи admin.
Если ищем для учетки VasyaPupkin запрос будет выглядеть следующим образом:
mongo --port 27117 ace --eval 'db.VasyaPupkin.find().forEach(printjson);'
Выхлоп получаем приблизительно следующий:
MongoDB shell version: 2.6.12
connecting to: 127.0.0.1:27117/ace
{
"_id" : ObjectId("567bfd4fe4b0c81300ff3158"),
"email" : "admin@company.com",
"email_alert_enabled" : true,
"email_alert_grouping_enabled" : true,
"html_email_enabled" : true,
"is_professional_installer" : false,
"last_site_name" : "default",
"name" : "admin",
"requires_new_password" : false,
"time_created" : NumberLong(1450966351),
"ui_settings" : {
"dashboardConfig" : {
"dashboards" : {
"5b4c57aadc236c7de53e3c3c" : {
"order" : 1
}
},
"lastActiveDashboardId" : "5b4c57aadc236c7de53e3c3c"
},
"statisticsPreferBps" : true
},
"x_shadow" : "$6$0YiSt9dQ$YrNKedOCjOP2xl3y9FhRasafdhbdfadamBKIjZ4l9Mm4cy/m49dt0bN.sYaFvgVb5vce45KypFe07iNYc1"
}
Интересующее нас поле:
x_shadow" : "$6$0YiSt9dQ$YrNKedOCjOP2xl3y9FhRasafdhbdfadamBKIjZ4l9Mm4cy/m49dt0bN.sYaFvgVb5vce45KypFe07iNYc1"
После анализа гугления узнаем, что алгоритм шифрования — SHA-512 crypt (3) compatible.
Упс. Откладываем идею декрипта на дальнюю полочку и идем другим путем.
Доступ к базе у нас есть, соответственно нужен просто хеш от известного нам пароля. А обновить запись в базе дело-то нехитрое.
Идем на :
Выбираем нужный алгоритм, вводим тот пароль, который будем использовать:
Нажимаем волшебную Синенькую кнопочку:
Полученный хеш аккуратненько копируем, далее он нам понадобится.
И вот настало время для финального шага:
admin.mongo --port 27117 ace --eval 'db.admin.update({name:"admin"},{$set:{x_shadow:"$6$ee74396ce4c563de$oLm93BwJywYo1sUFgX8U0FC.p75t1Jv838.0defRCe36jgX6PU3h.m3NL6tjCs8Q/1Ymtge0DXz9shb//dyEN."}})'
Барабанная дробь… Нажимаем Enter.
MongoDB shell version: 2.6.12
connecting to: 127.0.0.1:27117/ace
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Идем на страницу аутентификации контроллера UniFi, вводим имя пользователя: admin (мы же ж для него пароль меняли), пароль вводим тот, для которого генерировали хеш.
И, вуаля, все работает, доступы есть, все счастливы и танцуют.