锁的测试:在 Linux 环境中验证安全性

作者:Jeramiah Bowling

你们中的许多人认为你们拥有安全的环境。你们遵循最佳实践。你们定期检查日志。然后,有些东西还是渗透进来了,尽管它可能没有造成严重破坏,但你会想知道它是如何发生的。许多公司 практикуют 被动安全,即部署安全措施,并根据日志、仪表板或其他输出假设它们有效。这种做法对于今天的安全形势来说是不够的。管理员必须采取积极的安全措施来有效地对抗威胁。积极的安全措施可以简单到验证密码策略,也可以复杂到运行全面的渗透测试。无论您选择哪种方法,定期进行安全评估来测试锁是否有效始终是一个好主意。这些“锁”包括操作系统、网络、应用程序以及最重要的,您环境中存在的安全策略。通过定期的安全评估,您可以更有信心地认为您的安全措施能够将坏人拒之门外。

本文分四个部分介绍安全评估。这些部分以实际攻击可能发生的相反顺序组织。到第四部分,我将把所有内容整合在一起,并解释这种攻击可能如何发生。我建议在进行以下任何测试之前,您应获得高层管理人员或您将要测试的网络和/或系统的所有者的批准。为了进一步最大程度地降低生产网络/系统的风险,以下测试应尽可能在生产时间之后执行。

为了协助进行此评估,我使用了一个预先构建的 VMware 虚拟机 (VM),其中安装了 BackTrack 发行版(可从 remote-exploit.org 获取)。BackTrack 是一个全面的安全审计和测试平台,其中预配置了许多工具,可在首次启动时立即使用。此处介绍的所有脚本和应用程序都应以 root 用户身份运行。只有第一节中的自定义脚本应在目标机器上本地运行。所有其他工具都应从 BackTrack VM 运行。

1. 全局思考,本地行动

让我们首先检查本地级别的锁。包含的脚本(列表 1)分析基本设置,以识别和清除常见的错误配置。它绝不是验证您所有安全措施的万能方法。该脚本已在基于 Red Hat 和 Debian 的系统上进行过测试,因此,不同系统的输出可能会有所不同。您可能还需要为自己的系统自定义脚本以确保功能。所有输出都放置在 /tmp/seccheck/hostname 目录中,其中 hostname 是您本地定义的主机名。

列表 1. 此脚本检查一些常见的错误配置。

#!/bin/bash

mycompname=$(hostname)
mydir=/tmp/seccheck/$mycompname
myoutput=$mydir/secoutput.txt
mkdir -p $mydir

sl()
{
  SECTION=$1
  echo >> $myoutput
  echo **********$SECTION********** >> $myoutput
  echo >> $myoutput
}

echo ^^^^^^^^^^ START OF OUTPUT ^^^^^^^^^^ > $myoutput

echo -n Is this a Red Hat \(r\) or a Debian based system \(d\)?
read REPLY

case "$REPLY" in
  'r')
    yum list updates > $mydir/patchcheck.txt
    sl "Service Runlevels";chkconfig --list >> $myoutput
    sl "Auth Messages";cat /var/log/secure|grep failure >> $myoutput
    ;;
  'd')
    apt-get update
    apt-get -qs upgrade > $mydir/patchcheck.txt
    sl "Startup Services";ls -l /etc/rc2.d >> $myoutput
    sl "Auth Messages";cat /var/log/auth.log|grep failure >> $myoutput
    ;;
esac

sl "lastb Results";lastb >> $myoutput
sl "inetd check"; file -f /etc/inetd.conf && \
    echo "Are you using inetd? You should be using xinetd instead." \
        >> $myoutput
sl "xinetd Services";ls -l /etc/xinetd.d >> $myoutput
sl "hosts.allow";cat /etc/hosts.allow |grep -v "#" >> $myoutput
sl "hosts.deny";cat /etc/hosts.deny |grep -v "#"  >> $myoutput
sl "iptables output";iptables --list >> $myoutput
sl "SUID Files";find / -perm -4000 -print >> $myoutput
sl "SGID Folders";find / -perm -2000 -print >> $myoutput
sl "SUDoers";cat /etc/sudoers|grep "="|grep -v "#" >> $myoutput

echo -n "Do you want to capture Password Files"
echo -n " for an offline Password Check (y or n?)"?
read REPLY2

if [ $REPLY2 = "y" ]; then
     cp /etc/passwd /tmp/seccheck/$mycompname
     cp /etc/shadow /tmp/seccheck/$mycompname
     echo Your Password and Shadow folders have been copied to
/tmp/secheck/$mycompname
else exit
fi

echo vvvvvvvvvv END OF OUTPUT vvvvvvvvvv >> $myoutput

与其逐行查看,不如让我们看一下脚本的输出。第一个提示符标识了基本发行版并检查了所需的补丁,然后将此信息输出到 /tmp/seccheck/hostname/patchcheck.txt。在补丁检查之后,主输出文件创建为 /tmp/seccheck/hostname/secoutput.txt。此文件的第一部分列出了启动时运行的本地服务。通过此信息,您可以查看和禁用任何不必要的服务。本节之后列出了失败的身份验证消息以及 lastb 命令的结果(图 1)。从这两个部分,您可以快速确定机器是否已被未经授权的用户访问。

Testing the Locks: Validating Security in a Linux Environment

图 1. 本地脚本的一些输出

接下来,脚本检查是否正在使用 inetd 守护程序。大多数现代发行版不再使用 inetd 超级服务器,但一些旧系统仍然使用。如果可能,您应该将这些服务器/服务转换为 xinetd。启用了 xinetd 的服务在随后的部分中列出。两个超级服务器都可以使用 TCP Wrappers 为特定服务提供基于主机的访问控制。TCP Wrappers 的访问控制存储在 hosts.allow 和 hosts.deny 文件中。这些文件的内容在 xinetd 部分之后输出。如果您使用 TCP Wrappers,则您的 hosts.deny 中应该有一个条目,内容为ALL:ALL以拒绝未明确允许访问的主机。接下来列出本地防火墙(如果使用)规则。

接下来,脚本列出了机器上找到的任何 SUID/SGID 文件和目录。应识别这些文件并验证其访问权限,因为它们经常被 rootkit 利用。之后,脚本连接 /etc/sudoers 文件的列表。在 sudoers 文件中找到的用户和组可以作为超级用户 (root) 或文件中定义的任何其他用户运行。您应该清点这些用户并验证他们是否需要 sudo 访问权限。

其他可以添加到此脚本中的实用程序/命令(但由于空间考虑而被省略)包括 ps、top、mount、route、history、find / -perm 777 和 testparm (Samba)。如果您使用 SELinux,您可以运行getsebool -a命令以确认策略执行。

在脚本的末尾,系统会提示您将机器的本地密码和 shadow 文件复制到 /tmp/seccheck 目录,以便您可以将它们传输到 VM 并在稍后使用 John the Ripper 执行暴力破解。脚本完成后,将 /tmp/seccheck 目录复制或刻录到可移动介质,以便在 BackTrack VM 上进行分析。启动 VM,以 root 用户身份登录,密码为“toor”。登录后,输入startx以启动 KDE。将包含密码和 shadow 文件的 seccheck 文件夹从可移动介质复制到 VM。

文件在 VM 本地后,让我们运行暴力密码破解来测试我们的密码策略。暴力破解可能很耗时。您可以使用单词列表来加速操作,其中一些单词列表可从 John 网站获得。要使用基本暴力破解开始破解,请在 VM 上打开终端并运行以下命令

/usr/local/john/unshadow /pathtopasswdfile/passwd 
 ↪/pathtoshadowfile/shadow > password.txt  

此命令将两个文件合并到 password.txt 中,成为传统的 UNIX 风格密码文件。接下来,在 VM 的终端中运行以下命令

john password.txt
Testing the Locks: Validating Security in a Linux Environment

图 2. John 在 BackTrack 上破解的哈希值及其明文密码

john 将其结果输出到终端,并写入 /usr/local/john/john.pot(图 2)。john 的一个非常好的功能是能够重新启动已终止的破解。如果您因任何原因需要终止 john,请使用 Ctrl-C 结束它。要恢复它,请输入

john --restore

在几分钟内,您应该会看到任何简单密码显示出来。更复杂的密码将花费更长的时间,具体取决于各种因素,例如复杂性、系统性能和单词列表的使用。

无论您何时运行 john,您都应该彻底审查 secoutput.txt 文件,记录其发现,并补救任何未达到我们定义的安全策略的情况。

2. 通信是关键

要验证的第二组锁位于您的网络上。任何全面的安全评估都必须包括验证网络是否正常运行。没有比简单观察更好的方法来验证这一点了。用于此目的的第一个工具是 Wireshark 网络协议分析器。Wireshark 将您的网卡置于混杂模式,并捕获本地网段上广播的任何流量。可能需要在网络的不同部分采集样本或使用 span 端口,以获得正常流量的良好表示。

要启动该程序,请在 VM 内打开终端并输入wireshark。打开后,单击“Capture”菜单,然后单击“Interfaces”。在“Interface options”窗口中,单击 eth0 旁边的“Start”以启动捕获(图 3)。如果您使用 BackTrack VM 以外的其他工具来运行 Wireshark,则可以选择不同的接口。再次单击“Capture”菜单,然后单击“Stop”以结束捕获。完成后,将捕获保存到文件。我建议您在一天中的随机时间采集不少于五分钟的捕获。如果您有一个繁忙的网络,捕获文件将很大(捕获时间越长 = 文件越大),但在我的经验中,五分钟对于大多数中小型网络来说足够了。扫描捕获文件以识别异常流量,并验证您可能已部署的任何网络级策略。例如,许多联网打印机默认情况下会广播 NetBIOS 以便在 Windows 网络上进行发现,但您可能不允许网络上存在 NetBIOS 流量。捕获还可以帮助查找未经批准运行的流氓用户 PC 或 VM。许多人在第一次运行捕获时感到惊讶。捕获的缺点是分析它们所需的时间。这就是我们的第二个网络工具 Snort 发挥作用的地方。

Testing the Locks: Validating Security in a Linux Environment

图 3. Wireshark 分析一直到数据包级别。

Snort 有很多用途,但传统上它被用作入侵检测系统 (IDS)。IDS 将网络流量与已知攻击签名的数据库进行模式匹配,以向管理员发出潜在入侵的警报。与 Wireshark 不同,Snort 聚合和分析其收集的数据,从而提供网络的概览。使用 Snort 时,您应该注意两件事:IDS 对误报很敏感,并且它们不会对正常流量发出警报。Snort 作为评估工具很有用,因为它可以告诉您在短时间内您的网络上是否存在任何重大问题。

BackTrack 团队方便地将 Snort 与 BASE Web 前端打包在发行版中。从 KDE 菜单中,选择“Services”→“Snort”→“Setup and Initialize Snort”。设置脚本将提示您输入 MySQL 的 root 用户和 Snort 用户密码,以便创建所需的表。在脚本结束时,打开 Web 浏览器并输入 http://youripaddress/base/base_db_setup.ph,在加载的页面上,单击“Create Base AG”按钮。现在,单击“Main Page”链接(图 4)以访问警报信息。与 Wireshark 不同,Snort 应运行更长的时间(在大多数情况下超过 24 小时),以提供良好的网络数据采样。

Testing the Locks: Validating Security in a Linux Environment

图 4. BASE 使 Snort 变得容易得多。

3. 发现盔甲上的裂缝:漏洞和应用程序扫描器

要测试的第三组锁位于您的网络上的操作系统和应用程序中,更具体地说,位于其中存在的漏洞中。查找这些漏洞的合理方法是对整个网络执行一次或多次广泛的漏洞扫描,然后对我们的关键应用程序执行任何特定于应用程序的扫描。让我们使用安全管理员集成网络工具 (SAINT) 作为我们的主要扫描器。

SAINT 通常只允许扫描两个 IP 地址 15 天,但 BackTrack 用户可以使用多达十个 IP 地址长达一年,方法是使用 KDE 菜单下的注册页面:“BackTrack”→“Vulnerability Identification”→“SAINT Exploit”→“SAINT Exploit License”。在此网页上,单击页面底部的“Get License”按钮,并在注册页面上提供必要的信息。继续注册,并生成用于扫描器的密钥。在 VM 上输入密钥后,从与“License”链接相同的 KDE 文件夹启动 SAINT,但单击“SAINT”链接。这将启动 Web 前端。单击“Scan Set-Up”选项卡。输入您要扫描的 IP 地址或范围(图 5)。在“Scanning Level”部分下,选中“Exhaustive”和“Full Port Scan”。在“Firewall”部分,选择“No Firewall Support”。您可以尝试使用这些选项中的任何一个来根据您的需求定制扫描。完成后,单击页面底部的“Scan Now”。扫描完成后,将显示结果(图 6)。您应该审查并记录扫描结果,并在可能的情况下修复发现的漏洞。

Testing the Locks: Validating Security in a Linux Environment

图 5. 将主机添加到 SAINT

Testing the Locks: Validating Security in a Linux Environment

图 6. SAINT 扫描的结果

在 SAINT 的这种广泛扫描之后,应该对您最有价值(因此也是更诱人的目标)的机器进行更具体的扫描。例如,让我们使用 BackTrack 上的另一个工具 Nikto 扫描 Web 服务器。Nikto 是一个成熟、简单的扫描工具,也是锁定 Web 服务器的绝佳资源。假设您的环境中有一个 Web 服务器,请从 VM 中的 KDE 菜单“BackTrack”→“Penetration”→“All”→“Nikto2”启动 Nikto shell,并从生成的 shell 中键入

nikto.pl -h yourwebserveripaddresshere

如您所见,输出非常简单,可以轻松重定向到文件以供以后分析(图 7)。与 SAINT 一样,您应该通过记录结果并修复发现的任何问题来跟进此扫描。

Testing the Locks: Validating Security in a Linux Environment

图 7. Nikto 扫描 Web 服务器

4. 踩点

要测试的最后一个锁在许多情况下是进入您网络的第一个入口,即边界。让我们通过将我们的 VM 放置在网络之外,然后针对我们面向公众的 IP 地址执行网络映射来测试它,以验证是否只有允许的服务被允许进出网络。我们使用经过时间考验的 Nmap 应用程序来担任此角色。

尽管 Nmap 在 BackTrack VM 上,但您需要更新到最新版本才能使用 zenmap 前端 GUI 的便捷新拓扑选项卡。从项目站点下载 Nmap,并使用通常的./configure, make, make install序列将其安装在 VM 上。从终端键入命令zenmap以启动 GUI。输入主机、主机范围或网络作为目标,从“Profile”下拉列表中选择“Regular Scan”,然后单击“Scan”。这将对主机/网络执行粗略扫描,并识别开放端口以及有关主机的其他可用信息,例如操作系统和应用程序版本(图 8 和 9)。请耐心等待;此过程可能需要一段时间。使用 Nmap 的结果来验证是否只有允许的主机和服务可以从外部访问。

Testing the Locks: Validating Security in a Linux Environment

图 8. 常规扫描的 Nmap 结果

Testing the Locks: Validating Security in a Linux Environment

图 9. zenmap 的拓扑选项卡可视化地图

让战斗开始

运行 Nmap 后,我们可以开始设想针对我们网络的攻击可能如何发生。假设我们可以从公共 DNS 或 whois 记录中收集我们网络的外部 IP。有了这些信息,我们针对这些 IP 地址运行网络映射,并识别主机操作系统和应用程序版本。手头有映射结果后,我们扫描所述主机是否存在漏洞,如本文第 3 节所述。如果我们幸运的话,我们会找到一个并针对它运行漏洞利用程序以控制该盒子。如果我们只想拥有该盒子,任务就完成了。但是,如果我们想要拥有其他主机或网络,我们可能会从内部开始新的映射,或者使用 Wireshark 等工具从拥有的盒子进行嗅探。如果我们被动地嗅探流量而不是映射,我们就不太可能触发任何 IDS 警报。那时,我们注意到到特定机器的 SSH 流量,因此我们尝试获取针对它的远程 shell。希望我们的本地配置中没有任何明显的漏洞,正如我们在第 1 节中检查的那样,否则我们可能会丢失另一个或多个盒子。

尽管这不是任何意义上的标准攻击蓝图,但它是一种可能的攻击途径。这里有太多的方法、技术、黑客、破解和攻击无法详细记录。通过执行像本文所示的定期评估,我们可以降低攻击风险,但不能消除它。不幸的是,防守比进攻要困难得多。坏人不关注安全(或不安全)的某一方面,他们只需要网络、操作系统或应用程序中的一个漏洞即可成功。希望在试用这里的工具后,您可以测试自己的锁,并安心地认为您的网络、您的系统和您的安全措施是有效的。

Jeramiah Bowling 担任系统管理员和网络工程师已超过十年。他为马里兰州亨特谷的一家区域会计和审计事务所工作,并拥有包括 CISSP 在内的多项行业认证。欢迎您在 jb50c@yahoo.com 发表评论。

加载 Disqus 评论