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?)
Saya dapat mengambil kunci pribadi. Tapi itu tidak mudah. Inilah yang perlu Anda lakukan:
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.
Ekstrak kode sumber dan sesuaikan baris 9 Makefile.mainuntuk membaca:
$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDFLAGS)
(Perhatikan bahwa $(OBJS)dan $(LDFLAGS)terbalik secara berurutan.)
Lari ./build.sh.
Raih PID Apache menggunakan:
service apache2 status
Jalankan passe-partoutperintah sebagai root:
sudo passe-partout [PID]
... di mana [PID]nilai yang Anda ambil di langkah # 5.
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:
+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.
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.
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.sumber
cp
menyalin kunci baru di tempat yang lama./proc
... tidak ada.