Получение ключа RSA из запущенного экземпляра Apache?

26

Я создал пару ключей RSA для сертификата SSL и сохранил закрытый ключ /etc/ssl/private/server.key. К сожалению, это была единственная копия закрытого ключа, которая у меня была.

Тогда я случайно перезаписал файл на диске (да, я знаю).

Apache все еще работает и все еще обслуживает запросы SSL, что наводит меня на мысль, что может быть надежда на восстановление закрытого ключа. (Возможно, где-то есть символическая ссылка /procили что- то в этом роде?)

Этот сервер работает под управлением Ubuntu 12.04 LTS.

Натан Осман
источник

Ответы:

39

УСПЕХ!

Мне удалось получить закрытый ключ. Но это было нелегко. Вот что вам нужно сделать:

  1. Убедитесь, что вы не перезагружаете сервер или Apache. На этом игра окончена. Это также означает, что никакие сервисы мониторинга не перезапускают Apache.
  2. Возьмите этот файл - исходный код инструмента под названием passe-partout .
  3. Извлеките исходный код и настройте строку 9, Makefile.mainчтобы читать:

    $(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
    

    (Обратите внимание, что $(OBJS)и $(LDFLAGS)в обратном порядке.)

  4. Беги ./build.sh.
  5. Получите PID Apache, используя:

    service apache2 status
    
  6. Запустите passe-partoutкоманду от имени пользователя root:

    sudo passe-partout [PID]
    

    ... где [PID]это значение, которое вы получили на шаге № 5.

  7. Если программа завершится успешно, ваш текущий каталог будет содержать несколько дополнительных ключей:

    you@server:~# ls
    id_rsa-0.key  id_rsa-1.key  id_rsa-2.key
    

Если все прошло хорошо (и, надеюсь, все получилось), вам нужен один из этих ключей. Однако, если вы использовали более одного сертификата / ключевого файла, вам нужно выяснить, какой это. Вот как вы это делаете:

Сначала возьмите копию сертификата, соответствующего подписанному ключу. Предполагая, что файл назван server.crt, выполните следующую команду:

openssl x509 -noout -modulus -in server.crt | openssl md5

Это выведет значение, которое вам нужно будет сопоставить с каждым из ключей. Для каждого ключа выполните следующую команду:

openssl rsa -noout -modulus -in id_rsa-0.key | openssl md5

Если один из них совпадает, вы нашли ключ.


Кредит: эта статья указала мне на паспарту.

Натан Осман
источник
2
Хорошая находка по этой утилите.
Сокол Момот
3
+1 за рецензию (и виртуальный +1 за автора статьи: стыдно и по-прежнему записывать его помогает другим в этой ситуации).
Йоахим Зауэр
2
О, это невероятно и так грязно. Я люблю это.
Том О'Коннор
8

Скорее всего, он хранит ключ в памяти, что он и делает, потому что ему нужно сохранить копию после того, как он отбросит привилегии и / или расшифрует ключ, используя предоставленную ключевую фразу.

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

Тем не менее, если это произойдет, что он все еще открыт, /proc/${PID}/fd/${SOMETHING}может быть. Если вы перезаписали его, ваш ключ не будет там, потому что будут перезаписаны данные. Если вы скопировали что-то еще на его место (или удалили или отменили связь с ним, или рекурсивно удалили его родительский каталог), оно будет там.

Сокол Момот
источник
Я использовал, cpчтобы скопировать новый ключ вместо старого.
Натан Осман
Я просмотрел дескрипторы открытых файлов в /proc... ничего.
Натан Осман
Вероятно, тогда он не оставлял копию открытой, что является обычным случаем чтения секретных ключей; Ваши единственные варианты - выяснить, как и где он хранится из источника, извлечь его с помощью отладчика (при условии, что вы создали символы) и расшифровать его ... или заменить сертификат.
Сокол Момот
Я понял! Вы были правы - Apache хранит ключи в памяти, и я смог их восстановить. Пожалуйста, посмотрите мой ответ.
Натан Осман