Как извлечь приватные ключи из ssh-агента?
ssh-add -l
показывает, что к моему агенту SSH добавлено 3 ключа RSA.
ssh-add -L
отображает эти открытые ключи.
Как мне получить закрытые ключи, чтобы я мог сохранить их в файл? Или по замыслу это невозможно? Как это работает тогда?
Можно ли попросить ssh-agent выполнить операции с использованием закрытого ключа? Как я могу попросить его зашифровать / расшифровать номер для меня?
Это нормально, что я должен написать код для этого (язык программирования не имеет значения), но я бы предпочел использовать существующий инструмент или библиотеку.
6 ответов
Получить закрытый ключ или выполнить шифрование по протоколу между ssh и ssh-agent невозможно, но получить закрытый ключ можно, выгрузив память ssh-agent. В Linux вы должны быть пользователем root, чтобы сделать дамп памяти.
Я только что нашел очень хорошее объяснение о том, как работает ssh-agent: http://www.unixwiz.net/techtips/ssh-agent-forwarding.html. Это частично отвечает на некоторые мои вопросы.
Один из более умных аспектов агента - это то, как он может проверить личность пользователя (или, точнее, владение личным ключом), не раскрывая этот личный ключ никому.
Одним из преимуществ безопасности переадресации агентов является то, что закрытый ключ пользователя никогда не появляется в удаленных системах или в сети, даже в зашифрованном виде.
Таким образом, протокол между SSH-клиентом и ssh-agent не предоставляет SSH1 или SSH2 никакой возможности получить закрытые ключи от ssh-agent.
Однако в качестве пользователя root вы можете получить дамп памяти ssh-agent и попытаться извлечь секретный ключ оттуда. https://blog.netspi.com/stealing-unencrypted-ssh-agent-keys-from-memory делает именно это, и есть другие части программного обеспечения, упомянутые в разделе комментариев этой страницы. Тем не менее, программное обеспечение на этой странице не работает для меня на Debian Buster: дамп памяти не содержит никаких ключей, хотя ssh-add -l
отобразил ключ RSA.
TLDR:Используя инструмент, вы можете автоматизировать извлечение закрытых ключей SSH из дампа памяти агента SSH (от имени пользователя root).
Этот инструмент может одновременно извлечь несколько закрытых ключей SSH из ssh-агента. Он поддерживает типы закрытых ключей SSH RSA и SSH ED25519.
Он работает, как описано в упомянутых выше сообщениях в блогах, путем поиска волшебной строки в памяти, поиска структур, анализа нескольких структур для поиска экранированного закрытого ключа и деэкранирования (декодирования) байтов памяти закрытого ключа в печатаемый формат SSH. на экран.
Закрытые ключи, полученные с помощью этого инструмента, не зашифрованы и могут использоваться непосредственно для подключения к вашим серверам.
Дополнительную информацию см. в файле README проекта.
этотhttps://github.com/Kracken256/ssh-keyfinder
Раскрытие информации: я являюсь автором этого инструмента.
В моем случае я случайно удалил папку.ssh, но мои ключи загружены. Но так как я не могу восстановить их из ssh-add, мне пришлось использовать программное обеспечение для восстановления файлов.
Если в Windows 10, очевидно, метод, описанный в в этом сообщенииблоге, работал в 2018 году. Автор ссылается на контрольный код на github:
tl;dr
Закрытые ключи защищены DPAPI и хранятся в кусте реестра HKCU. Я выпустил здесь код PoC, чтобы извлечь и восстановить закрытый ключ RSA из реестра.
Это скорее вопрос системного администратора, но просто посмотрите в ~/.ssh/id_rsa или id_dsa секретные ключи. Они должны были войти в ssh-agent в первую очередь...
Вам, вероятно, не нужно. Скорее всего, вы просто хотите открытый ключ:
ssh-add -L > ~/.ssh/id_rsa.pub