【C/S 架构安全测试】客户端安全测试小结
前言
因项目需求,需要给 C/S 客户端应用系统做一次安全测试,特写此片文章来记录一下实战过程中所涉及的知识,欢迎各路大佬指点。
在做 C/S 客户端测试的时候,跟以往渗透测试有一定的区别,我们通常都是 web 渗透测试或者 app 渗透,前期都是基于信息收集、漏洞扫描、漏洞利用、拿到 WebShell 之后进入目标内网进一步的操作,但是 C/S 客户端的测试类似于逆向、二进制这一类,多数都是对本地客户端的文件使用工具进行扫描查看是否存在漏洞缺陷,能否被利用(DLL 劫持、数字签名、键盘钩子、反编译调试),那么下面就简单分享一下 C/S 客户端测试的操作以及工具的使用。
一、工具列举
- WireShark ---------------> V3.2.2 流量分析工具
- 远程线程注入工具 -----> V1.0 远程线程注入工具
- AKLT --------------------- > V3.0 键盘钩子工具
- 010 Editor ---------------> V10.0 二进制文件分析工具
- Hash 检测工具 ----------> V1.04 Hash 检测工具
- Olldbg --------------------> V1.10 反调试工具
- IDA Pro -------------------> V7.0 反编译与调试工具
- Exeinfo -------------------> V0.0.5.9 PE 文件信息查看工具
- PEGetSecurity ----------> V1.0 编译选择检测工具
- PEiD -----------------------> V0.95 PE 查壳工具
- DigitalSignCheck --------> V1.3 数字签名检测工具
二、下载地址
- WireShark -> 点击前往下载
- 远程线程注入工具 -> 点击前往下载
- AKLT-> 点击前往下载
- 010 Editor -> 点击前往下载
- Hash 检测工具 -> 点击前往下载
- Olldbg -> 点击前往下载
- IDA Pro -> 点击前往下载
- Exeinfo -> 点击前往下载
- PEGetSecurity -> 点击前往下载
- PEiD -> 点击前往下载
- DigitalSignCheck -> 点击前往下载
三、客户端测试项
Windows 客户端安全测试
Windows 中可以看到多种客户端,我们主要以其开发语言以及图形化界面进行分类
编程语言分类
- C/C++
- net C#
- Virtual Basic
- Delphi
图形界面分类
- MFC
- QT
- WPF
程序预分析
开发技术
预分析项描述:通过检查文件名称、文件内容或者其编译特征,可以得知程序的开发技术(包括开发语言、开发框架、编译器等)。了解其开发技术可以在安全测试中进行更加具有针对性的测试。
相关工具
010 Editor、Exeinfo、IDA Pro
首先使用 exeinfo 进行检测,发现客户端加了壳,得不开发语言等相关信息然后使用 IDA Pro 进行测试,发现也无法通过 IDA Pro 找出相关函数,只能识别出一些高亮调用的 api检测步骤:
1、通览安装目录相关文件初步判断;
2、使用 PEiD 检查;
3、使用 IDA Pro 加载程序浏览特征;
4、进行签名检测,如果不是客户签名那么基本属于第三方库;
5、识别第三方库来源以及最可能的功能;
四、C/S 客户端测试项
DLL 劫持问题描述
Windows 中程序通过 dll 加载进行代码复用。在加载工程中,其按照一定的顺序进行 dll 查找,如果在其顺序中的低权限目录放入 dll,则程序会将对应 dll 进行加载并执行其中的代码造成恶意代码执行的风险。
对应工具:Evil DLL 检测步骤:开始使用 Rattler 对主程序 xx.exe 进行 dll 劫持测试下边是测试出来存在 dll 劫持风险的 dll 文件测试结果:将恶意文件名称改为 xx.dll,然后放在客户端程序目录下,执行客户端显示的结果“弹出计算器”,说明 shellcode 已经成功执行。恶意代码成功执行安全建议:
对所使用的 DLL,尽量使用绝对路径。
在所有需调用加载 DLL 前,检测当前目录是否存在系统 DLL(例如安装程序的安装告警)。
在所有需调用加载 DLL 前,对 DLL 的 Hash 值进行校验。
调用 SetDllDirectory(L “”) 把 当前目录 从 DLL 搜索目录中排除
RemoteThread 防御
对应工具:远程线程注入工具
检测步骤:使用远程线程注入工具来对客户端进行测试
测试结果
经过测试,攻击者可以通过对客户端进行远程线程注入来达到攻击目的,如图所示,弹出计算器,说明 shellcode 执行成功。
安全建议
当创建线程时,系统会向当前进程所有 dll 发送 DLL_THREAD_ATTACH 通知,此时新的线程已经被创建但尚未执行,更精确的说已经创建了线程内核对象、线程堆栈等资源正处于初始化阶段。只有在每个 dll 正常处理了 DLL_THREAD_ATTACH 线程才开始执行对于远程线程本质上和本地线程完全一样,区别在于由其他进程创建如果在接受 DLL_THREAD_ATTACH 时通知结束线程,线程就无法执行,也防止了远程线程注入的效果。
消息 Hook 防御
问题描述:SetWindowsHookEx 是 Windows 提供的消息钩子函数,恶意软件可以通过这个函数进行全局消息钩取以得到目标敏感信息
对应工具:AFLK
检测步骤:使用 AFLK 进行键盘消息的劫持
测试结果
通过使用 AFLK 进行键盘监听,在攻击者拥有管理员权限的情况下可以对客户端进行账号和密码中键盘输入进行监听,并有明文显示。
安全建议
开发者可以使用 Hook Windows 系统 API 函数 KeUserModeCallback 来检测监听事件,以达到防止消息钩子的注入。
格式化字符串测试
问题描述:格式化字符串漏洞的存在,可以在输入格式化字符串的过程中获取内存的信息,甚至构造 payload 进行命令执行。
对应工具:IDA Pro
检测步骤
把程序拖进 IDA Pro 进行分析,暂时没有发现可能造成格式化字符串漏洞相关函数
测试结果:此客户端使用了加壳,所以不能进行静态分析,攻击者无法利用格式化字符串漏洞进行攻击。
程序篡改测试
问题描述:程序可以进行 patch,如果程序在进行 patch 之后程序仍然可以正常运行,则用户无法感知程序被篡改而造成信息泄露。
对应工具:010 Editor、Hash 检测工具
检测步骤:
使用 010 Editor 修改程序二进制数据:
1、 修改数据之前计算程序的 Hash 值和使用 010 Editor 查看二进制数据。
使用 010 Editor 修改其二进制数据之后再次进行 Hash 值检测,查看程序是否可以运行。
测试结果:
使用 010 Editor 对其二进制数据进行修改之后发现程序还是可以照常运行。
安全建议:
在程序每次运行时检测其 Hash 值,如果 Hash 值发生变化,就结束该进程。
程序反调试
问题描述:程序可以进行调试的情况下,容易让攻击者进一步了解其函数逻辑关系,进行进一步攻击。
对应工具:OLLdbg
检测步骤:
使用 OD 对程序进行动态逆向分析
测试结果
经过测试,发现使用 OD 对本程序进行反编译并能够正常进行逆向分析,攻击者可能会通过此方法分析出其主题逻辑。
安全建议
1、 使用peb字段检测程序是否被调试
a) BeingDebugged(通过FS寄存器过去PEB位置,在PEB地址+2的地址就是这个字段)
b) NtGlobalFlag(也在peb中)
2、 使用一些系统API来检测程序是否被调试,比如:
a) lsDebuggerPresent()
b) ZwQueryInfoemationProcess()
3、 对父进程进行:
a) 检测父进程,因为一般我们双击打开的软件父进程为“explorer.exe”,如果我们双击打开的进程父进程不是它,那么就可以判定为有调试器存在。
Debug 信息
问题描述:程序在运行过程中,有可能因为程序员忘记将 debug 输出信息删除,导致运行过程中输出敏感信息,造成信息泄露。
对应工具:cmd、Debugview
检测步骤:使用 debugview 进行信息检查,如果有信息会显示出来,如图就是没有输出敏感信息。
测试结果:
在正常情况下,程序启动并不会有敏感信息暴漏。
静态分析保护
问题描述:未经加壳或者混淆的程序,容易被进行反编译。攻击者通过静态反编译,得到程序逻辑代码(类 C 语言或者汇编语言),可以更好理解程序函数逻辑,进一步进行分析。
对应工具:IDA Pro、Exeinfo
检测步骤
使用 Exeinfo 检测本程序是否进行了加壳保护:
使用 IDA Pro 看是否能够进行静态分析:
测试结果
本客户端使用了 ASPack2.12 的壳,使用 OD 和 IDA Pro 不能直接进行逆向分析,加强了程序的安全性。
编译选项检测
问题描述:
Windows 提供大量机制帮助系统、软件抵抗外部攻击。如果开启相关安全编译选项,则是安全的。
对应工具:PEGetSecurity
检测步骤
powershell -ep bypass
Import the module
Import-Module .\Get-PESecurity.psm1
C:\PS> Get-PESecurity -directory F:\Tools\PESecurity-master\PESecurity-master -recursive | Export-CSV file.csv
利用工具检测得到报告如下,可以看到 ASLR、DEP、SafeSEH 几个项目中,基本都没有开启保护措施。
测试结果
经过测试,发现本程序的 ASLR(程序随机基址)、DEP(数据执行保护)、SEHSafe(异常机制)等编译选项都没有进行勾选。
安全建议
在程序进行编译的时候勾选这些编译选项,加强程序的安全性。
签名检测
问腿描述
程序进行可信电子证书签名,是用于辨别程序或者第三方库是否可信的重要途经之一,同时有效防止程序篡改或者被替换。
对应工具:数字签名检测工具
检测步骤
使用数字签名检测工具进行数字签名检测,如图所示:
测试结果
在本程序对应目录中发现没有进行签名
安全建议
使用企业证书进行内容签名
后续待补充。。。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于