type
status
slug
tags
category
icon
password
Property
Sep 30, 2023 03:17 AM
date
summary
摘抄自这里,在原作者技术上增加部分检测项,项目中可以根据适当增删
🤔 前言
因项目需求,需要给 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 数字签名检测工具
工具下载
客户端测试项
测试项 | 测试结果 | 风险等级 |
DLL 劫持问题描述 | 安全/不安全 | 高风险/无 |
Remote Thread防御 | 安全/不安全 | 高风险/无 |
消息 Hook防御 | 安全/不安全 | 高风险/无 |
格式化字符串测试 | 安全/不安全 | 高风险/无 |
程序篡改测试 | 安全/不安全 | 高风险/无 |
程序反调试 | 安全/不安全 | 高风险/无 |
Debug信息 | 安全/不安全 | 中风险/无 |
静态分析保护 | 安全/不安全 | 中风险/无 |
编译选项检测 | 安全/不安全 | 中风险/无 |
签名检测 | 安全/不安全 | 低风险/无 |
静态分析 | 安全/不安全 | 高风险/无 |
数据文件检测 | 安全/不安全 | 中风险/无 |
📝Checklist
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 值检测,查看程序是否可以运行。
493 x 352
554 x 395
测试结果
使用 010 Editor 对其二进制数据进行修改之后发现程序还是可以照常运行。
安全建议:
在程序每次运行时检测其 Hash 值,如果 Hash 值发生变化,就结束该进程。
程序反调试
问题描述:程序可以进行调试的情况下,容易让攻击者进一步了解其函数逻辑关系,进行进一步攻击。
对应工具:OLLdbg
检测步骤:
使用 OD 对程序进行动态逆向分析
测试结果
经过测试,发现使用 OD 对本程序进行反编译并能够正常进行逆向分析,攻击者可能会通过此方法分析出其主题逻辑。
安全建议
Debug 信息
问题描述:程序在运行过程中,有可能因为程序员忘记将 debug 输出信息删除,导致运行过程中输出敏感信息,造成信息泄露。
对应工具:cmd、Debugview
检测步骤:使用 debugview 进行信息检查,如果有信息会显示出来,如图就是没有输出敏感信息。
测试结果
在正常情况下,程序启动并不会有敏感信息暴漏。
静态分析保护
问题描述:未经加壳或者混淆的程序,容易被进行反编译。攻击者通过静态反编译,得到程序逻辑代码(类 C 语言或者汇编语言),可以更好理解程序函数逻辑,进一步进行分析。
对应工具:IDA Pro、Exeinfo
检测步骤
使用 Exeinfo 检测本程序是否进行了加壳保护:
使用 IDA Pro 看是否能够进行静态分析:
测试结果
本客户端使用了 ASPack2.12 的壳,使用 OD 和 IDA Pro 不能直接进行逆向分析,加强了程序的安全性。
编译选项检测
问题描述:
Windows 提供大量机制帮助系统、软件抵抗外部攻击。如果开启相关安全编译选项,则是安全的。
对应工具:PEGetSecurity
检测步骤
利用工具检测得到报告如下,可以看到 ASLR、DEP、SafeSEH 几个项目中,基本都没有开启保护措施。
测试结果
经过测试,发现本程序的 ASLR(程序随机基址)、DEP(数据执行保护)、SEHSafe(异常机制)等编译选项都没有进行勾选。
安全建议
在程序进行编译的时候勾选这些编译选项,加强程序的安全性。
签名检测
问腿描述
程序进行可信电子证书签名,是用于辨别程序或者第三方库是否可信的重要途经之一,同时有效防止程序篡改或者被替换。
对应工具:数字签名检测工具
检测步骤
使用数字签名检测工具进行数字签名检测,如图所示:
测试结果
在本程序对应目录中发现没有进行签名
安全建议
使用企业证书进行内容签名
静态分析
问题描述:
通过静态分析代码中是否存在敏感信息和危险函数
对应工具:Ida pro
危险函数表
函数 | 严重性 | 解决方案 |
gets | 最危险 | 使用 fgets(buf, size, stdin)。这几乎总是一个大问题! |
strcpy | 很危险 | 改为使用 strncpy。 |
strcat | 很危险 | 改为使用 strncat。 |
sprintf | 很危险 | 改为使用 snprintf,或者使用精度说明符。 |
scanf | 很危险 | 使用精度说明符,或自己进行解析。 |
sscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
fscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
vfscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
vsprintf | 很危险 | 改为使用 vsnprintf,或者使用精度说明符。 |
vscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
vsscanf | 很危险 | 使用精度说明符,或自己进行解析。 |
streadd | 很危险 | 确保分配的目的地参数大小是源参数大小的四倍。 |
strecpy | 很危险 | 确保分配的目的地参数大小是源参数大小的四倍。 |
strtrns | 危险 | 手工检查来查看目的地大小是否至少与源字符串相等。 |
realpath | 很危险(或稍小,取决于实现) | 分配缓冲区大小为 MAXPATHLEN。同样,手工检查参数以确保输入参数不超过 MAXPATHLEN。 |
syslog | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
getopt | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
getopt_long | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
getpass | 很危险(或稍小,取决于实现) | 在将字符串输入传递给该函数之前,将所有字符串输入截成合理的大小。 |
getchar | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
fgetc | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
getc | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
read | 中等危险 | 如果在循环中使用该函数,确保检查缓冲区边界。 |
bcopy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
fgets | 低危险 | 确保缓冲区大小与它所说的一样大。 |
memcpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
snprintf | 低危险 | 确保缓冲区大小与它所说的一样大。 |
strccpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
strcadd | 低危险 | 确保缓冲区大小与它所说的一样大。 |
strncpy | 低危险 | 确保缓冲区大小与它所说的一样大。 |
vsnprintf | 低危险 | 确保缓冲区大小与它所说的一样大。 |
分析程序代码中的敏感信息和危险函数调用。
静态分析字符串没有发现敏感信息。
恶意函数分析没有发现恶意函数。
测试结果
在本程序没有发现敏感信息和危险函数
安全建议
删除硬编码敏感信息和危险函数调用。
数据文件检测
问题描述:
应用客户端数据文件中可能存储着各种敏感信息,威胁用户和客户端安全。
检测步骤:
尝试登陆运行程序
查看本地文件日志等,是否明文存储敏感信息。
测试结果
未检测到应用保存敏感信息到本地。
安全建议
删除硬编码敏感信息和危险函数调用。
🤗总结归纳
做为安服仔基本就是有手就行