文章目录
前言
因项目需求,需要给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(异常机制)等编译选项都没有进行勾选。
安全建议
在程序进行编译的时候勾选这些编译选项,加强程序的安全性。
签名检测
问腿描述
程序进行可信电子证书签名,是用于辨别程序或者第三方库是否可信的重要途经之一,同时有效防止程序篡改或者被替换。
对应工具:数字签名检测工具
检测步骤
使用数字签名检测工具进行数字签名检测,如图所示:
测试结果
在本程序对应目录中发现没有进行签名
安全建议
使用企业证书进行内容签名
后续待补充。。。