Как любой системный администратор, уверившийся в совершенстве собственной памяти и способности посреди ночи вспомнить 25-значный код установки Windows XP, поймал недавно такой вот exception.
В один прекрасный день, решив зайти проверить что там с моим контроллером UniFi, получил удивительное сообщение: Login error.
Почесав в затылке и вспомнив, как в один момент забыл пин-код от карты, который набивал чисто механически, начал перебирать возможные варианты. После получаса попыток, поиска заметок в блокноте, пересмотра склеротичек, наклеенных на монитор, понял, что надо искать обходные пути.
Сразу оговорюсь для любителей покритиковать — менеджер учетных записей/паролей, аля LastPass, используется. Собственно говоря, именно LastPass используется. И данные оттуда не способствовали удачной аутентификации.
Поискав на буржуйских форумах, необходимая информация для сброса пароля от любой учетки в контроллере была получена, осмыслена, переварена и собрана в краткую памятку.
Итак, дано:
1. Контроллер UniFi(не играет роли ОС — Linux or Windows) с доступом в саму операционку.
2. Доступ в Интернет.
3. Прямые руки.
Контроллер UniFi всю конфигурацию хранит в базе Mongo. Проверяем, есть ли нужная нам информация по искомой учетной записи:
1 |
mongo --port 27117 ace --eval 'db.admin.find().forEach(printjson);' |
В данном конкретном случае запрашиваем информацию для учетной записи admin.
Если ищем для учетки VasyaPupkin запрос будет выглядеть следующим образом:
1 |
mongo --port 27117 ace --eval 'db.VasyaPupkin.find().forEach(printjson);' |
Выхлоп получаем приблизительно следующий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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" } |
Интересующее нас поле:
1 |
x_shadow" : "$6$0YiSt9dQ$YrNKedOCjOP2xl3y9FhRasafdhbdfadamBKIjZ4l9Mm4cy/m49dt0bN.sYaFvgVb5vce45KypFe07iNYc1" |
После анализа гугления узнаем, что алгоритм шифрования — SHA-512 crypt(3) compatible.
Упс. Откладываем идею декрипта на дальнюю полочку и идем другим путем.
Доступ к базе у нас есть, соответственно нужен просто хеш от известного нам пароля. А обновить запись в базе дело-то нехитрое.
Идем на : https://encode-decode.com/sha3-512-generator-online/
Выбираем нужный алгоритм, вводим тот пароль, который будем использовать:
Нажимаем волшебную Синенькую кнопочку:
Полученный хеш аккуратненько копируем, далее он нам понадобится.
И вот настало время для финального шага:
1 |
admin.mongo --port 27117 ace --eval 'db.admin.update({name:"admin"},{$set:{x_shadow:"$6$ee74396ce4c563de$oLm93BwJywYo1sUFgX8U0FC.p75t1Jv838.0defRCe36jgX6PU3h.m3NL6tjCs8Q/1Ymtge0DXz9shb//dyEN."}})' |
Барабанная дробь… Нажимаем Enter.
1 2 3 |
MongoDB shell version: 2.6.12 connecting to: 127.0.0.1:27117/ace WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) |
Идем на страницу аутентификации контроллера UniFi, вводим имя пользователя: admin (мы же ж для него пароль меняли), пароль вводим тот, для которого генерировали хеш.
И, вуаля, все работает, доступы есть, все счастливы и танцуют.
Взято здесь: https://habr.com/ru/post/439396/