渗透测试-Openssl心脏出血漏洞复现
心臟滴血
早在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)
對于漏洞學(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 靶場:
下面簡單實(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)境如下:
| 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):
實(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python圆的半径计算圆的周长列表_用
- 下一篇: css3夜空北斗七星闪烁动画js特效