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

內容解密:

  1. 基礎映像檔選擇:使用 buildpack-deps:wily 作為基礎映像檔,這提供了基本的建置環境。
  2. 連線埠暴露:暴露 80 和 443 連線埠,用於 HTTP 和 HTTPS 服務。
  3. 安裝必要套件:安裝了多個開發和執行環境所需的套件,包括 Apache、Git、Python 相關套件等。
  4. 啟用 Apache 模組:啟用了多個 Apache 模組,如 rewritewsgixsendfile 等,以支援不同的功能需求。
  5. 清理套件快取:清理了 apt-get 的快取和暫存檔案,以減少映像檔大小。
  6. 設定 bash 環境:修改了 /etc/bash.bashrc 以在每個 bash 會話中匯出 TERM=xterm
  7. 安裝 pip:檢查並安裝或更新 pip,以確保 Python 包管理工具的可用性。
  8. 安裝 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

-- 後續程式碼省略,請參閱原始碼取得完整內容。

內容解密:

  1. 指令碼功能:此 Lua 指令碼用於檢測目標伺服器是否存在 Heartbleed 漏洞。
  2. 使用方法:透過 nmap 命令結合 --script ssl-heartbleed 引數來執行此指令碼。
  3. 輸出結果:指令碼會輸出目標伺服器的 SSL/TLS 連線埠狀態,並指出是否存在 Heartbleed 漏洞。
  4. 指令碼作者與版權:由 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例項的狀態檢查結果。攻擊導致例項狀態檢查失敗,表示例項可能已經受到損害。