Heartbleed 漏洞是 OpenSSL 函式庫中的一個嚴重缺陷,允許攻擊者竊取伺服器記憶體中的敏感資訊,例如使用者密碼、私鑰等。此漏洞影響廣泛,波及眾多使用 TLS/SSL 加密的網站和應用程式。為有效防範 Heartbleed 漏洞,開發者和資安人員需瞭解其運作原理和檢測方法。Nmap 提供了專用指令碼 ssl-heartbleed 可快速檢測伺服器是否存在此漏洞。此外,也可以使用 Python 指令碼模擬 Heartbleed 攻擊,驗證伺服器的安全性。OpenSSL 提供了生成自簽名憑證和私鑰的功能,可用於測試和開發環境。及時更新 OpenSSL 版本並修復相關漏洞,是防範 Heartbleed 攻擊的關鍵措施。
A.1 Docker 基礎映像檔範例
作為 Docker 容器的基礎,以下是映像檔使用的基本組態。
FROM buildpack-deps:wily
EXPOSE 80 443
# 安裝作業系統先決條件:
RUN DEBIAN_FRONTEND=noninteractive \
apt-get update -q -y && \
apt-get dist-upgrade -q -y && \
apt-get install -q -y \
apache2 \
build-essential \
curl \
cython \
djvulibre-bin \
gettext \
ghostscript \
git \
less \
libapache2-mod-wsgi \
libapache2-mod-xsendfile \
libhdf5-dev \
libjpeg-dev \
libffi-dev \
libfreetype6-dev \
libldap2-dev \
libmagickwand-dev \
libreoffice-script-provider-python \
libsasl2-dev \
libssl-dev \
libtiff-dev \
libtiff-tools \
libxml2-dev \
libxslt-dev \
locate \
mysql-client \
nano \
netcat \
texlive-latex-base \
poppler-utils \
python-dev \
python-openssl \
python-software-properties \
sendmail \
subversion \
sudo \
ssl-cert \
unzip \
vim \
wget
RUN a2enmod rewrite && \
a2enmod wsgi && \
a2enmod xsendfile && \
a2enmod proxy && \
a2enmod headers && \
a2enmod proxy_http
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# 為每個 bash 會話匯出 xterm
RUN sed -i '1s/^/export TERM=xterm\n/' /etc/bash.bashrc
# 如果 pip 不是原生模組,則從 pypa.io 取得
RUN python -m pip version && \
python -m pip install -U pip || \
curl --silent --show-error --retry 5 \
https://bootstrap.pypa.io/get-pip.py | python2.7
# supervisor 與 Invenio 無關,但特定於此佈署。
# ubuntu 自帶的版本太舊,不符合需求。
RUN pip install supervisor
內容解密:
- 基礎映像檔選擇:使用
buildpack-deps:wily作為基礎映像檔,這提供了基本的建置環境。 - 連線埠暴露:暴露 80 和 443 連線埠,用於 HTTP 和 HTTPS 服務。
- 安裝必要套件:安裝了多個開發和執行環境所需的套件,包括 Apache、Git、Python 相關套件等。
- 啟用 Apache 模組:啟用了多個 Apache 模組,如
rewrite、wsgi、xsendfile等,以支援不同的功能需求。 - 清理套件快取:清理了
apt-get的快取和暫存檔案,以減少映像檔大小。 - 設定 bash 環境:修改了
/etc/bash.bashrc以在每個 bash 會話中匯出TERM=xterm。 - 安裝 pip:檢查並安裝或更新
pip,以確保 Python 包管理工具的可用性。 - 安裝 supervisor:安裝了
supervisor,用於程式管理。
A.2 官方 NMAP Heartbleed 擴充套件
local match = require('match')
local nmap = require('nmap')
local shortport = require('shortport')
local sslcert = require('sslcert')
local stdnse = require('stdnse')
local string = require("string")
local table = require('table')
local vulns = require('vulns')
local have_tls, tls = pcall(require,'tls')
assert(have_tls, "This script requires the tls.lua library from https://nmap.org/nsedoc/lib/tls.html")
description = [[
檢測伺服器是否容易受到 OpenSSL Heartbleed 漏洞(CVE-2014-0160)的影響。
程式碼根據 Jared Stafford (jspenguin@jspenguin.org) 編寫的 Python 指令碼 ssltest.py。
]]
---
-- @usage
-- nmap -p 443 --script ssl-heartbleed <target>
--
-- @output
-- PORT STATE SERVICE
-- 443/tcp open https
-- | ssl-heartbleed:
-- | VULNERABLE:
-- | The Heartbleed Bug is a serious vulnerability in the popular OpenSSL cryptographic software library. It allows for stealing information intended to be protected by SSL/TLS encryption.
-- | State: VULNERABLE
-- | Risk factor: High
-- | Description:
-- | OpenSSL versions 1.0.1 and 1.0.2-beta releases (including 1.0.1f and 1.0.2-beta1) of OpenSSL are affected by the Heartbleed bug.
author = "Patrik Karlsson <patrik@cqure.net>"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
categories = { "vuln", "safe" }
local arg_protocols = stdnse.get_script_args(SCRIPT_NAME .. ".protocols") or {'TLSv1.0', 'TLSv1.1', 'TLSv1.2'}
portrule = function(host, port)
return shortport.ssl(host, port) or sslcert.getPrepareTLSWithoutReconnect(port)
end
-- 後續程式碼省略,請參閱原始碼取得完整內容。
內容解密:
- 指令碼功能:此 Lua 指令碼用於檢測目標伺服器是否存在 Heartbleed 漏洞。
- 使用方法:透過
nmap命令結合--script ssl-heartbleed引數來執行此指令碼。 - 輸出結果:指令碼會輸出目標伺服器的 SSL/TLS 連線埠狀態,並指出是否存在 Heartbleed 漏洞。
- 指令碼作者與版權:由 Patrik Karlsson 編寫,遵循與 Nmap 相同的授權條款。
Heartbleed 漏洞檢測指令碼分析與實作
Heartbleed 漏洞是 OpenSSL 加密軟體函式庫中的一個嚴重漏洞,允許攻擊者竊取本應由 SSL/TLS 加密保護的資訊。本文將深入分析用於檢測 Heartbleed 漏洞的 NMap 外掛程式指令碼和 Jared Stafford 的 Python 指令碼,並詳細解釋其實作原理。
NMap 外掛程式指令碼分析
程式碼結構與功能
NMap 外掛程式指令碼主要用於檢測目標伺服器是否存在 Heartbleed 漏洞。以下為關鍵程式碼片段:
local status, err = s:send(hb)
if not status then
stdnse.debug1("Couldn’t send heartbeat request: %s", err)
s:close()
return nil
end
內容解密:
此段程式碼嘗試傳送 Heartbeat 請求到目標伺服器。如果傳送失敗,將記錄錯誤訊息並關閉連線。
while(true) do
local status, typ, ver, len = recvhdr(s)
if not status then
stdnse.debug1('No heartbeat response received, server likely not vulnerable')
break
end
if typ == 24 then
local pay
status, pay = recvmsg(s, 0x0fe9)
s:close()
if #pay > 3 then
return true
else
stdnse.debug1('Server processed malformed heartbeat, but did not return any extra data.')
break
end
end
end
內容解密:
此迴圈接收伺服器的回應。如果收到 Heartbeat 回應(型別為 24),則進一步處理回應內容。如果回應內容大於 3 位元組,表示伺服器可能存在漏洞。
Python 指令碼分析
程式碼結構與功能
Jared Stafford 的 Python 指令碼同樣用於檢測 Heartbleed 漏洞。以下是關鍵程式碼片段:
def hit_hb(s):
s.send(hb)
while True:
typ, ver, pay = recvmsg(s)
if typ is None:
print 'No heartbeat response received, server likely not vulnerable'
return False
內容解密:
此函式傳送 Heartbeat 請求並接收伺服器的回應。如果未收到回應,則認為伺服器可能不易受攻擊。
if typ == 24:
print 'Received heartbeat response:'
hexdump(pay)
if len(pay) > 3:
print 'WARNING: server returned more data than it should - server is vulnerable!'
else:
print 'Server processed malformed heartbeat, but did not return any extra data.'
return True
內容解密:
如果收到 Heartbeat 回應,則檢查回應內容的長度。如果長度大於 3,表示伺服器傳回了多餘的資料,可能存在漏洞。
Heartbleed 漏洞檢測流程
圖表翻譯: 此圖表展示了 Heartbleed 漏洞的檢測流程。首先建立連線並傳送 Client Hello,接著接收 Server Hello 並檢查是否支援 Heartbeat 擴充。如果支援,則傳送 Heartbeat 請求並接收回應,根據回應內容判斷伺服器是否存在漏洞。
心跳出血漏洞(Heartbleed Bug)分析與技術探討
前言
心跳出血漏洞(Heartbleed Bug)是OpenSSL函式庫中的一個嚴重安全漏洞,影響了大量使用TLS/SSL加密協定的網站和應用程式。本文將深入分析該漏洞的技術細節,並探討其影響和修復方法。
漏洞原理
心跳出血漏洞存在於OpenSSL的TLS heartbeat擴充套件中,該擴充套件允許客戶端傳送一個「心跳」(heartbeat)請求到伺服器,以保持連線的有效性。然而,OpenSSL實作中的一個錯誤導致伺服器在回應心跳請求時,未能正確檢查請求中的資料長度,從而洩露了伺服器記憶體中的敏感資訊。
程式碼分析
以下是一個用於測試心跳出血漏洞的Python指令碼範例:
import sys
import socket
# ...
def hit_hb(s):
# 傳送心跳請求
s.send(hb)
while True:
# 接收伺服器回應
typ, ver, pay = recvmsg(s)
if typ == None:
print('伺服器關閉連線')
return
# 檢查伺服器回應是否為心跳回應
if typ == 24:
print('收到心跳回應:')
print(pay)
# 如果回應長度大於3,表示可能存在漏洞
if len(pay) > 3:
print('可能存在心跳出血漏洞')
return
if __name__ == '__main__':
main()
內容解密:
此指令碼主要功能是測試目標伺服器是否存在心跳出血漏洞。首先,建立與目標伺服器的連線並傳送客戶端問候訊息。然後,等待伺服器回應並檢查是否為伺服器問候訊息。接著,傳送心跳請求並接收伺服器回應。如果收到心跳回應且長度大於3,則可能存在心跳出血漏洞。
OpenSSL憑證和私鑰生成
為了確保網站或應用程式的安全,通常需要生成自簽名的TLS憑證和私鑰。以下是使用OpenSSL生成憑證和私鑰的範例:
openssl req -x509 -newkey rsa:2048 -nodes -keyout private_key.pem -out certificate.pem -days 365
生成的憑證和私鑰檔案內容如下:
---
--BEGIN CERTIFICATE
---
--
MIIDpjCCAo6gAwIBAgIJAODt+0TypuiwMA0GCSqGSIb3DQEBDQUAMGgxCzAJBgNVBAYTAk5PMRIwEAYDVQQIDAlUcm9uZGhlaW0xEjAQBgNVBAcMCVRyb25kaGVpbTENMAsGA1UECgwETlROVTE...
---
--END CERTIFICATE
---
--
---
--BEGIN PRIVATE KEY
---
--
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC...
---
--END PRIVATE KEY
---
--
內容解密:
憑證檔案包含公開金鑰和相關資訊,而私鑰檔案則包含對應的私密金鑰。這些檔案在設定TLS/SSL加密連線時非常重要。
圖表翻譯:
此圖示展示了AWS例項在Dirtycow攻擊後的狀態檢查結果。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Heartbleed 漏洞檢測與分析
package "安全架構" {
package "網路安全" {
component [防火牆] as firewall
component [WAF] as waf
component [DDoS 防護] as ddos
}
package "身份認證" {
component [OAuth 2.0] as oauth
component [JWT Token] as jwt
component [MFA] as mfa
}
package "資料安全" {
component [加密傳輸 TLS] as tls
component [資料加密] as encrypt
component [金鑰管理] as kms
}
package "監控審計" {
component [日誌收集] as log
component [威脅偵測] as threat
component [合規審計] as audit
}
}
firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成
@enduml圖表翻譯: 此圖展示了在執行Dirtycow攻擊後,AWS例項的狀態檢查結果。攻擊導致例項狀態檢查失敗,表示例項可能已經受到損害。