Lấy khóa RSA từ một phiên bản đang chạy của Apache?


26

Tôi đã tạo cặp khóa RSA cho chứng chỉ SSL và lưu trữ khóa riêng trong /etc/ssl/private/server.key. Thật không may, đây là bản sao duy nhất của khóa riêng mà tôi có.

Sau đó, tôi vô tình ghi đè lên tệp trên đĩa (vâng, tôi biết).

Apache vẫn đang chạy và vẫn phục vụ các yêu cầu SSL, khiến tôi tin rằng có thể có hy vọng khôi phục khóa riêng. (Có lẽ có một liên kết tượng trưng ở đâu đó trong /prochoặc một cái gì đó?)

Máy chủ này đang chạy Ubuntu 12.04 LTS.

Câu trả lời:


39

SỰ THÀNH CÔNG!

Tôi đã có thể lấy khóa riêng. Nhưng nó không dễ dàng. Đây là những gì bạn cần làm:

  1. Hãy chắc chắn rằng bạn không khởi động lại máy chủ hoặc Apache. Trò chơi kết thúc tại thời điểm đó. Điều đó cũng có nghĩa là đảm bảo rằng không có dịch vụ giám sát nào khởi động lại Apache.
  2. Lấy tệp này - mã nguồn cho một công cụ có tên là passe-partout .
  3. Trích xuất mã nguồn và điều chỉnh dòng 9 của Makefile.mainđể đọc:

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

    (Lưu ý rằng $(OBJS)$(LDFLAGS)được đảo ngược theo thứ tự.)

  4. Chạy đi ./build.sh.
  5. Lấy PID của Apache bằng cách sử dụng:

    service apache2 status
    
  6. Chạy passe-partoutlệnh dưới quyền root:

    sudo passe-partout [PID]
    

    ... Đâu [PID]là giá trị bạn đã lấy ở bước # 5.

  7. Nếu chương trình thành công, thư mục hiện tại của bạn sẽ có một loạt các khóa bổ sung:

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

Nếu mọi việc suôn sẻ (và hy vọng nó đã làm được), một trong những chìa khóa đó là chìa khóa bạn cần. Tuy nhiên, nếu bạn có nhiều chứng chỉ / keyfile đang sử dụng, thì bạn cần tìm ra nó là cái nào. Đây là cách bạn làm điều đó:

Đầu tiên lấy một bản sao của chứng chỉ phù hợp với khóa đã ký. Giả sử tập tin được đặt tên server.crt, hãy chạy lệnh sau:

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

Điều này sẽ xuất ra một giá trị mà bạn sẽ cần phải khớp với từng phím. Đối với mỗi khóa, hãy chạy lệnh sau:

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

Nếu một trong số chúng khớp, bạn đã tìm thấy khóa.


Tín dụng: bài viết này chỉ cho tôi để vượt qua.


2
Tìm thấy tốt trên tiện ích đó.
Falcon Momot

3
+1 cho bài viết (và +1 ảo cho tác giả bài viết: xấu hổ và vẫn viết nó giúp người khác trong tình huống đó).
Joachim Sauer

2
Oh đó là tuyệt vời, và rất bẩn. Tôi thích nó.
Tom O'Connor

8

Nhiều khả năng nó đang lưu trữ khóa trong bộ nhớ, điều này đúng bởi vì nó cần giữ một bản sao sau khi nó bỏ các đặc quyền và / hoặc giải mã khóa bằng cụm mật khẩu được cung cấp.

Về lý thuyết, bạn có thể lấy nó ra khỏi hình ảnh quá trình nếu bạn đính kèm trình gỡ lỗi, mặc dù nếu chúng tuân theo các thực tiễn tốt nhất, nó sẽ được mã hóa theo thứ gì đó trong bộ nhớ.

Điều đó nói rằng, nếu nó xảy ra mà nó vẫn mở, /proc/${PID}/fd/${SOMETHING}có thể là nó. Nếu bạn ghi đè lên nó, khóa của bạn sẽ không ở đó vì dữ liệu ghi đè sẽ có. Nếu bạn đã sao chép một cái gì đó khác vào vị trí của nó (hoặc xóa hoặc hủy liên kết nó, hoặc xóa đệ quy thư mục mẹ của nó), nó sẽ ở đó.


Tôi đã sử dụng cpđể sao chép khóa mới thay cho khóa cũ.
Nathan Osman

Tôi đã xem qua các mô tả tập tin mở trong /proc... không có gì.
Nathan Osman

Nó có thể đã không giữ một bản sao mở, đó là trường hợp thông thường để đọc các khóa riêng tư; các tùy chọn duy nhất của bạn là tìm ra cách thức và nơi nó được lưu trữ từ nguồn, rút ​​nó ra bằng trình gỡ lỗi (giả sử bạn được xây dựng bằng các ký hiệu) và giải mã nó ... hoặc thay thế chứng chỉ.
Falcon Momot

Tôi đạt được rồi! Bạn đã đúng - Apache giữ các khóa trong bộ nhớ và tôi đã có thể lấy chúng. Xin vui lòng xem câu trả lời của tôi.
Nathan Osman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.