Mengambil kunci RSA dari instance Apache yang sedang berjalan?

26

Saya membuat keypair RSA untuk sertifikat SSL dan menyimpan kunci pribadi /etc/ssl/private/server.key. Sayangnya ini adalah satu-satunya salinan kunci pribadi yang saya miliki.

Kemudian saya tidak sengaja menimpa file di disk (ya, saya tahu).

Apache masih berjalan dan masih melayani permintaan SSL, membuat saya percaya bahwa mungkin ada harapan dalam memulihkan kunci pribadi. (Mungkin ada tautan simbolis di suatu tempat /procatau sesuatu?)

Server ini menjalankan Ubuntu 12.04 LTS.

Nathan Osman
sumber

Jawaban:

39

KEBERHASILAN!

Saya dapat mengambil kunci pribadi. Tapi itu tidak mudah. Inilah yang perlu Anda lakukan:

  1. Membuat yakin Anda tidak me-restart server atau Apache. Permainan berakhir pada saat itu. Itu juga berarti memastikan bahwa tidak ada layanan pemantauan yang me-restart Apache.
  2. Ambil file ini - kode sumber untuk alat bernama passe-partout .
  3. Ekstrak kode sumber dan sesuaikan baris 9 Makefile.mainuntuk membaca:

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

    (Perhatikan bahwa $(OBJS)dan $(LDFLAGS)terbalik secara berurutan.)

  4. Lari ./build.sh.
  5. Raih PID Apache menggunakan:

    service apache2 status
    
  6. Jalankan passe-partoutperintah sebagai root:

    sudo passe-partout [PID]
    

    ... di mana [PID]nilai yang Anda ambil di langkah # 5.

  7. Jika program berhasil, direktori Anda saat ini akan memiliki banyak kunci tambahan:

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

Jika semuanya berjalan dengan baik (dan semoga berhasil), salah satu kunci itu adalah yang Anda butuhkan. Namun, jika Anda memiliki lebih dari satu sertifikat / keyfile yang digunakan, maka Anda perlu mencari tahu yang mana itu. Begini cara Anda melakukannya:

Pertama ambil salinan sertifikat yang cocok dengan kunci yang ditandatangani. Dengan asumsi file bernama server.crt, jalankan perintah berikut:

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

Ini akan menghasilkan nilai yang harus Anda cocokkan dengan masing-masing tombol. Untuk setiap tombol, jalankan perintah berikut:

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

Jika salah satunya cocok, Anda telah menemukan kuncinya.


Kredit: artikel ini menunjuk saya untuk lulus.

Nathan Osman
sumber
2
Bagus temukan pada utilitas itu.
Falcon Momot
3
+1 untuk writeup (dan +1 virtual untuk penulis artikel: malu dan masih menuliskannya membantu orang lain dalam situasi itu).
Joachim Sauer
2
Oh itu luar biasa, dan sangat kotor. Aku menyukainya.
Tom O'Connor
8

Kemungkinan besar itu menyimpan kunci dalam memori, yang dilakukan karena perlu menyimpan salinan setelah menjatuhkan hak istimewa dan / atau mendekripsi kunci menggunakan frasa sandi yang disediakan.

Secara teori, Anda bisa mengeluarkannya dari gambar proses jika Anda memasang debugger, meskipun jika mereka mengikuti praktik terbaik, itu akan dienkripsi terhadap sesuatu dalam memori.

Yang mengatakan, jika itu terjadi masih terbuka, /proc/${PID}/fd/${SOMETHING}mungkin itu. Jika Anda menimpanya, kunci Anda tidak akan ada karena data yang ditimpa akan ada. Jika Anda menyalin sesuatu ke tempatnya (atau menghapus atau membatalkan tautannya, atau menghapus direktori induknya secara rekursif), itu akan ada di sana.

Falcon Momot
sumber
Saya biasa cpmenyalin kunci baru di tempat yang lama.
Nathan Osman
Saya melihat melalui deskriptor file terbuka di /proc... tidak ada.
Nathan Osman
Kemungkinan besar itu tidak membuat salinan tetap terbuka, yang merupakan kasus biasa untuk membaca kunci pribadi; satu-satunya pilihan Anda adalah mencari tahu bagaimana dan di mana itu disimpan dari sumber, menariknya menggunakan debugger (dengan asumsi Anda dibuat dengan simbol), dan mendekripsi ... atau mengganti sertifikat.
Falcon Momot
Saya mendapatkannya! Anda benar - Apache menyimpan kunci di memori dan saya dapat mengambilnya. Tolong lihat jawaban saya.
Nathan Osman