Сброс пароля контроллера UniFi

Как любой системный администратор, уверившийся в совершенстве собственной памяти и способности посреди ночи вспомнить 25-значный код установки Windows XP, поймал недавно такой вот exception.

В один прекрасный день, решив зайти проверить что там с моим контроллером UniFi, получил удивительное сообщение: Login error.
tv7rppuatjctpejrzzsbuhjv-iq.png

Почесав в затылке и вспомнив, как в один момент забыл пин-код от карты, который набивал чисто механически, начал перебирать возможные варианты. После получаса попыток, поиска заметок в блокноте, пересмотра склеротичек, наклеенных на монитор, понял, что надо искать обходные пути.

Сразу оговорюсь для любителей покритиковать — менеджер учетных записей/паролей, аля 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.

Упс. Откладываем идею декрипта на дальнюю полочку и идем другим путем.
Доступ к базе у нас есть, соответственно нужен просто хеш от известного нам пароля. А обновить запись в базе дело-то нехитрое.

Идем на :
Выбираем нужный алгоритм, вводим тот пароль, который будем использовать:

rhcfwthceeyhkuye6ni7xxzlf3g.png

Нажимаем волшебную Синенькую кнопочку:

0gojvw8_kxlstv8uztmywhokgdo.png

Полученный хеш аккуратненько копируем, далее он нам понадобится.

И вот настало время для финального шага:

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 (мы же ж для него пароль меняли), пароль вводим тот, для которого генерировали хеш.

И, вуаля, все работает, доступы есть, все счастливы и танцуют.

© Habrahabr.ru