【C/S 架构安全测试】客户端应用程序测试(测试项补充)
前言
客户端应用程序安全测试项以及测试工具介绍、测试方法!!!
本篇文章参考大佬:vlan911 共享的客户端应用程序测试文献,深表感谢!!!
一、客户端测试
1.1 程序加壳检测
问题描述:使用 DIE 文件类型识别文件查看客户端程序文件的编译器连接器信息。对 exe 文件进行检查,未发现既有加壳防护。
测试过程:使用测试工具 DIE 查壳发现系统未对安装程序加壳,以下为检查结果。
已做加壳处理的结果
风险分析:未加壳的程序可以对目标的开发语言进行检测,不做抗逆向、抗反汇编的安全措施,攻击者会利用该漏洞对目标程序进行调试、分析和篡改。
修复建议:建议对客户端敏感程序文件进行加壳处理,并且注意加壳质量,避免使用弱保护壳。可以使用 VMProtect 等加壳方式,具有较高的安全性。
1.2 签名检测
问题描述:程序进行可信电子证书签名,是用于辨别程序或者第三方库是否可信的重要途径之一,同时有效防止程序篡改或者被替换。
测试过程:Windows 操作系统对自身的程序都进行了签名,以确保程序的完整性和可用性,避免被恶意替换。
可以使用 sigcheck 工具检测,该工具可以对某一个目录里所有的文件进行签名检查
以下为签名的样子
风险分析:未加壳的程序可以对目标的开发语言进行检测,不做抗逆向、抗反汇编的安全措施,攻击者会利用该漏洞对目标程序进行调试、分析和篡改。
修复建议:建议对客户端敏感程序文件进行加壳处理,并且注意加壳质量,避免使用弱保护壳。可以使用 VMProtect 等加壳方式,具有较高的安全性。
1.3 逆向分析/反编译保护
问题描述:使用 IDA 对程序文件逆向分析,观察 IDA 能否获取到程序的汇编代码。对于能力高超的攻击者来说,没有静态分析保护的程序可以更加容易的针对程序制定攻击计划,分析程序中的缺陷代码。攻击程序中的漏洞,甚至截获操作信息。
测试过程:使用 IDA 对程序文件逆向分析,以下为检查结果:
使用脱壳工具对运行程序 exe 进行脱壳(此程序是运行程序,不是安装包)
使用 IDA 查看 Lite.exe,以下是未加壳的样子
以下为加壳后加固后的 IDA 查看结果
风险分析:未加壳/弱壳的程序可以对目标的开发语言进行检测,不做抗逆向、抗反汇编的安全措施,攻击者会利用该漏洞对目标程序进行调试、分析和篡改。
修复建议:建议对客户端敏感程序文件进行加壳处理,并且注意加壳质量,避免使用弱保护壳。可以使用 VMProtect 等加壳方式,具有较高的安全性。
1.4 动态调试防护
问题描述:使用 X64DBG 对客户端程序进行动态调试,检查客户端程序是否存在动态调试的防护功能,能否有效的避免动态调试获取程序的执行流程。
测试过程:使用 X64DBG 对客户端程序进行动态调试,检查客户端程序是否存在动态调试的防护功能,能否有效的避免动态调试获取程序的执行流程。
一直按下一步即可,观察能否调出登录程序页面。
风险分析:使用 X64DBG 对客户端程序进行动态调试,检查客户端程序是否存在动态调试的防护功能,能否有效的避免动态调试获取程序的执行流程。
修复建议:建议对客户端程序增加花指令混淆等防护动态调试的安全措施。或者对客户端程序进行加壳处理,当检测到调试程序的时候立即断开进程,使程序崩溃最佳。
1.5 客户都程序完整性校验
问题描述:程序可以进行修改,如果程序在进行修改之后程序仍然正常运行,则用户无法感知程序被篡改而造成信息泄露。
测试过程:修改二进制程序文件,篡改文件中的某一个字节,重新运行客户端程序,观察客户端程序是否会检测出文件已被篡改。
观察客户端程序是否会检测出文件已被篡改。
使用 Winhex 工具打开小葵,而后搜索关键字 zj,以字符或者 16 进制搜索都可以
修改一处,而后另存即可。
点击另存为即可!!!
打开修改后的程序,发现依然可以打开
风险分析:使用 X64DBG 对客户端程序进行动态调试,检查客户端程序是否存在动态调试的防护功能,能否有效的避免动态调试获取程序的执行流程。
修复建议:建议对客户端程序增加花指令混淆等防护动态调试的安全措施。或者对客户端程序进行加壳处理,当检测到调试程序的时候立即断开进程,使程序崩溃最佳。
1.6 键盘消息记录
问题描述:SetWindowsHookEx 是 windows 提供的消息钩子函数,恶意软件可以通过这个函数进行全局消息钩取,得到目标的。
测试过程:使用 AKLT 对用户的输入进行监测,查看是否能够获取到用户的输入
开始检测
风险分析:SetWindowsHookEx 是 windows 提供的消息钩子函数,恶意软件可以通过这个函数进行全局消息钩取,得到目标的。
修复建议:开发者可以使用 Hook Windows 系统 API 函数 KeUserModeCallback 来检测监听事件,以达到防止消息钩子的注入。
1.7 DLL 注入
问题描述:测试过程中,使用进程注入工具对客户端进行 DLL 注入操作,观察注入后产生的结果。
测试过程:使用 procexp 检查 Lite.exe 程序 DLL 运行情况
使用 MSF 生成 wtsapi32.dll 文件做注入使用
当前系统监听 1003 端口为未连接状态
使用 DLL 注入工具,对 DLL 文件进行注入攻击
此时注入功能,1003 端口被开启,且处于监听状态
此时查看进程查看器,DLL 已被注入
MSF 建议监听,成功获取 Session
风险分析:DLL 注入会导致恶意的 DLL 文件被注入程序,在攻击者获取系统权限之后可以通过此方法进行 DLL 注入进行后期的权限维持操作,隐蔽性极高。
修复建议:调用 LoadLibrary()、LoadLibraryEX()、CreateProcess()等函数时,在程序中指定 DLL 的绝对路径;加载任何 DLL 前先校验文件的签名,签名不正确的 DLL 不能被加载。
1.8 DLL 劫持
问题描述:DLL 劫持指的是,攻击者通过一些手段来劫持或者替换正常的 DLL,欺骗正常程序加载预先准备好的恶意 DLL,而后实现其恶意的目的。
测试过程:使用 ImpulsiveDLLHijack 工具进行劫持探测
运行结果,存在劫持
将 calc.dll 文件重命名为 profapi.all,而后存放入运行程序相同的文件夹下
此时再次运行主程序,计算器成功被弹出,且主程序可以正常运行,并未警示
风险分析:攻击者利用 DLL 劫持,可以将恶意的 DLL 文件存放在客户端文件夹内,而后随主程序启动而启动,利用此特性达到监控用户的目的,常用于社工钓鱼、后期的权限维持等。
修复建议:调用 LoadLibrary()、LoadLibraryEX()、CreateProcess()等函数时,在程序中指定 dll 的绝对路径;加载任何 DLL 前先校验文件的签名,签名不正确的 DLL 不能被加载。
1.9 本地文件安全
问题描述:检测所有的本地文件,查看是否存在配置文件泄露数据库密码、用户密码缓存文件等。
测试过程:搜索所有的本地安装后的敏感文件,类似 " Config"等文件,发现存在数据库用户名密码文件本地存放。
风险分析:泄露了数据库用户名密码,导致攻击者可直接访问数据库获取敏感信息。
修复建议:删除不必要的配置文件,或者将敏感信息删除、隐藏。
1.10 网络数据传输安全
问题描述:网络数据传输,可通过抓包工具进行数据流量的抓取,如 SQL 语句暴露,攻击者可通过暴漏的 SQL 语句来对服务器进行攻击。
测试过程:使用工具拦截登录请求包,发现泄露了明文的 SQL 语句
风险分析:远程攻击者可以利用此查询语句得到数据库表名、库名、字段等敏感信息,而后可能构造特殊的 SQL 语句对特有的参数进行注入攻击从而更快的得到数据库的信息(直接抓包修改原始 SQL 语句查询其他内容)
修复建议:如果存在敏感信息,在数据进行传输的过程中对敏感信息进行加密处理,以提高程序数据的安全性。
1.11 本地注册表安全
问题描述:部分应用登录后。可能会将登录信息存放在注册表里,导致用户名密码等敏感信息泄露。
测试过程:实际上这类问题极少,介绍这个东西的主要原因其实还是因为很多的 MSI 类的病毒在落地后会修改注册表,已通过这种方式达到长期驻留的目的,所以在这里介绍一下,笔者在测试 C/S 架构客户端的过程中,并没有遇到过将用户名密码等信息存放在注册表的情况,所以在这里只介绍方法,使用的工具。
使用 Regshot 注册表对比工具,在安装包安装前将系统注册表进行快照处理
而后在程序安装后,输入用户名密码,登录后,再次使用注册表工具进行快照
注册表生成后,会自动生成用于比对的 html 文件,我们可以直接双击打开,观看注册表的变化。
我们通过此方式可以快速的定位程序安装并启动后,注册表的变化。实际上不仅仅是常规的安全评估,在反病毒的过程中我们也可以通过此方式来观测注册表键值的变化,来获得病毒落地后的一些行为。
下图为注册表新添加的防火墙规则,我们并没有发现此程序有将敏感信息存放在注册表的行为,但是却又新增防火墙规则的行为;通常情况下,病毒落地后都会通过添加防火墙出栈规则以及入栈规则,来达到权限维持和隐蔽行为的目的,所以通过此种方式我们可以在获取病毒样本的情况下对病毒的行为有一个更深层次的了解。
风险分析:远程攻击者可以利用此缺陷,通过查看注册表获取用户的敏感信息。
修复建议:建议不要将用户敏感信息存放在注册表里。
1.12 内存安全
问题描述:部分应用登录后,可能会将登录信息存放在内存里,导致用户敏感信息泄露。
测试过程:这里推荐使用 Process Hacker 工具
首先我们输入用户名密码,而后点击登录,这里建议大家登录成功后去查看内存信息
我们打开 Process Hacker 工具,而后在页面中找到我们的主程序进程
双击我们的主程序进程后,点击 " Memory"
接着点击左上角的 options -> strings
我们默认就可以,直接点击确认
此时进入到内存页面,我们可以进行关键字筛选,比如说输入 " username" " password"关键字进行筛选,看看有没有学泄露数据库查询语句 Filter -> Contains
我们可以看到,内存里并没有泄露什么有用的东西,而泄露内存的样子笔者并没有遇到过,所以在这里套一张网上的截图给大家。
风险分析:远程攻击者可以利用此缺陷,通过查看内存信息获取用户的敏感信息。
修复建议:建议不要将用户敏感信息存放在内存里。
1.13 本地调试安全
问题描述:部分应用开启本地调试功能后,登录后的用户名和密码会被保存在调试日志内,这样就可能被有心人利用,从而获取用户的登录信息。
测试过程:在运行主程序的目录下打开 cmd 命令行 或者 powershell
而后在与小葵相同的目录下会生成 log.log 文件,并且程序会运行。我们输入任意内容,而后关闭程序,查看日志。
打开日志,发现并没有记录任何内容。
接下来我们看一下网上有内容的样子,里面泄露了用户名密码等敏感信息。
风险分析:远程攻击者可以利用此缺陷,通过查看调试信息获取用户的敏感信息。
修复建议:建议检测程序运行状态,不允许开启调试模式,或对安装目录下的文件进行 Hash 校验。
二、服务端测试
2.1 HTTP 抓包方式
实际上服务端测试方式与常规的 Web 应用测试功能点是类似的,区别在于我们如何拦截程序的数据包
通常情况下,客户端大致分为 HTTP 协议与 TCP/私有协议通信:
其中 HTTP 协议测试的方法并不难,我推荐大家使用 Proxifier 工具对此应用进行全局代理,而后在将 burpsuite 挂上,这样就可以拦截数据了,下面简单介绍一下如何使用,笔者遇到的客户端走的都是 TCP 协议或者是私有协议,所以没遇到过 HTTP 协议的,我就在这意思一下,给大家提供一下思路。
点击 " 配置文件" -> " 代理服务器" ,配置代理,设置 burpsuite 的即可
而后选择 " 配置文件" -> " 代理规则",我们可以在代理程序那里不填,默认任意,或者选择固定的程序;这里建议大家添加要测试的程序,这样可以减少干扰
按照如下填写后,只要客户端走的是 HTTP 协议,那么我们就可以拦截到数据包,但是大多情况都是走的 TCP 协议或者是私有协议。
2.2 TCP 协议抓包方式
这里我们可以使用 WireShark,测试遇到 TCP 协议的时候,因为流量大多数都是加密的,部分是明文的,以下为某次测试的 modbus 协议的数据包
或者使用 EchoMirage 工具进行进行拦截,process->inject 而后选择对应的进程即可。
如下图,只要产生通信我们就可以拦截到 TCP 的数据包甚至是数据库流量,(声明一下:这个当然不是微信的流量)
2.3 常见漏洞列表
TCP 流量的漏洞少之又少,但如果能直接拦截到数据库的流量,那么写个脚本就可以执行 SQL 语句了,比如说添加用户、修改密码,但是前提你要知道数据库对应的表名字段之类的信息。
那么我们如果遇到 TCP 传输数据或者不能抓包的,能测什么漏洞呢?
- SQL 注入
- 整数溢出
- XSS
- 用户名枚举
- 弱口令
- 空口令
- …
总结
以上就是对于客户端(C/S 架构)应用程序测试的漏洞点位以及测试工具的介绍,在进行 C/S 客户端进行测试的时候可以参考本博客(C/S 架构安全测试)专栏所需测试点进行逐步漏洞排查,后续也会持续更新更多关于安全测试的干货文章,感谢您能读到现在,也欢迎各位大佬批评指正!!!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于