原文链接:
某知名系统漏洞挖掘与利用思路探索
https:
//mp.weixin.qq.com/s?__biz=MzI4NTcxMjQ1MA==&mid=2247583419&idx=1&sn=e5b929573bf27da3b5465922036b0952
*左右滑动查看更多
一、分析历程
首先是下载对应的二进制安装包。
01、获取要分析的文件
根据原有的下载链接:
https:
//www.gnway.com/prod/res.php?id=tkpro_server
*左右滑动查看更多
可以跳转到以下网址:
https:
//www.gnway.com/download.php
*左右滑动查看更多
看看有没有要分析的东西。
02、寻找架构信息
如果想要快速实现逆向分析的话,就是要快速发现关键功能点在哪里实现,例如微信的核心功能在WeChatWin.dll,这个也一样,要找到架构中关键的代码。其实根据别人的分析文章就可以知道,关键代码在GNRemote.dll中。
不知道也没关系,我们是可以跟踪到关键代码部分的,首先找到web服务是通过服务启动的,运行在Pid == 0的位置,也就是服务态。用户态执行的程序则是GNAdmin.exe。
在服务中可以看到运行的程序是GNWebServer.exe。
简单看看程序的导入导出函数,就可以发现GNAdmin.exe是一个本地管理程序,是作为Http Client与服务端通信的(大概率因为实际上这个程序开发的时候大量使用LoadLibrary显式导入dll)。
实际上根据命名规则,一般叫Server的总不会是客户端吧,所以先观察GNWebServer的行为或者功能。实际跟踪的过程中发现他调用CreateProcess启动子进程来执行关键操作。这里直接使用Process Hacker分析进程树(Process Tree)。
看名字就知道,GNTKProProxy.exe是代理使用,用来将本地域名访问解析为ip地址,一个是WebHelper,应该是用来辅助的,推测ESLUSBService.exe则是“异速联”USB服务?总之应该不是核心代码,所以重点在GNCore.exe上。
(这里跳过了GNWebServer.exe的分析过程,因为分析之后发现其实核心代码不在它的进程空间中。)
在对GNCore.exe的分析中则发现隐式加载了GNRemote.dll,并调用了其中的功能函数。而GNCore.exe的功能则是分析请求并且通过路由分发到对应的函数上进行处理。
(想要知道为什么这么做,可以使用httplib库[可参见文末推荐阅读链接1],写一下http server和http client就可以发现核心功能的实现必须按照一套约定的程序进行)。
可以找到关键代码(分发函数)如下:
关键代码(远程调用)如下:
这个时候我们就掌握了基本的调用关系和调用链。
03、分析功能点
分析功能点的思路按照不同的思考方向有不同的选择,但最终还是殊途同归,目的只有一个,就是寻找可利用的漏洞点,以获取程序或者主机控制权为最高目的,过程中可能发现DLL劫持、拒绝服务等其他中低危漏洞。
1、以攻击者思路出发快速定位高危漏洞点。
a、直接寻找鉴权函数(可以尝试绕过鉴权,或者通过调用关系反过来检查哪些函数无需鉴权)。
b、直接寻找危险函数(命令语句、SQL语句拼接或者子进程、线程创建)。
2、逆向工程思路出发了解整体程序运行逻辑。
a、按照调用规则寻找调用逻辑(整体分析,通过工程学掌握整个程序)。
b、寻找大型工程都会有的log函数(一般都有)(尝试hook或者调用,用于分析整体逻辑)。
c、fuzz构造报错或者其他异常数据(结合日志进行漏洞寻找)。
在这里还是以文章中提到的SQL注入漏洞和信息泄漏漏洞为例,复现漏洞成因。
导出的所有函数都是我们可以调用的,我们接下来就在这些函数中进行寻找。
文章中的思路就是按照攻击者思维出发,首先寻找无需鉴权的函数,我们可以首先寻找到鉴权函数,然后检查哪些函数调用过鉴权函数,没有调用鉴权函数的又有哪些自定义鉴权了,通过做排除法最终可以找到哪些函数是可以通过访客权限直接调用的。
鉴权函数如下:
简单版本:
复杂版本:
代码中的定义的奇奇怪怪的鉴权如下:
1.跳转到数据库鉴权:
2.还有嵌入到函数中的鉴权:
总之一番过滤之后,就可以找到我们要关注的函数了(还有其他的函数这里就没有截图了,而且这里面有些还是需要鉴权的,需要慢慢清理)。
04、信息泄漏
检查过不需要鉴权的函数的后,我们发现有个函数名为GetUsers居然不需要鉴权,按照渗透的经验,我们都不需要用户名枚举就能拿到系统中存在的全部用户了,结合弱口令我们往往就能进入目标系统了。
那么我们就需要去验证是否能够利用该漏洞了,这个时候可以发现在外网无法验证该漏洞,找了好几个网站但是无法利用。
甚至连burp抓包都无法抓到返回包,一时间陷入僵局。
直到笔者询问了x7iao师傅,他告诉笔者,这时我们首先要尝试curl来请求,因为它会发送最基础的HTTP请求包。
转机出现了,curl提示无法解析HTTP/0.9协议的返回包。
现在大家常用的基本是HTTP/1.1协议,有部分网站甚至已经采用了HTTP/2.0协议-支持WebSocket,而HTTP/0.9是第一个版本的HTTP协议,早已过时[可参见文末推荐阅读链接2]。在这里的关键是它的返回包没有协议头,造成了HTTP/0.9协议只支持一种内容,即纯文本。
回来看代码,原因应该是GNCore.exe组装返回的时候逻辑不够严密,并非添加返回头来包裹GNRemote.dll的返回数据,而是直接将GNRemote.dll的返回内容提交给了我们,所以导致我们的浏览器无法解析返回数据包的包头,最终报错。
那么解决方法就很简单了,curl支持使用--http0.9来兼容HTTP/0.9协议的返回包。我们可以先使用curl来验证。
可以看到已经拿到了系统登录过的用户名称。
curl终究只是测试使用的,我们还可以利用python实现中转,这样我们就可以利用我们常用的工具来辅助进行渗透测试了。这里就不展开细说了,因为下一篇章里会用到。
05、SQL注入
文章中提到的另一个漏洞就是SQL注入了,原因是通过id查询用户时直接拼接了我们传入的数据,而没有做check。
看伪代码就可以发现跟常规的漏洞点非常相似,很直接。看到SQL注入我们总忘不掉sqlmap的便捷,那么问题也是一样的,返回的数据格式有异常,sqlmap如何进行解析。还是x7iao师傅教了一手python中转注入。
我们利用python做服务器,接收到用户的请求之后做处理再发送给服务器,同时从服务器接受数据之后先处理再返回给sqlmap。
1.首先写一个recv函数,用来获取服务器的返回数据。
2.然后我们实现一个SQL注入的接口,用来做中转。
3.然后我们就又可以使用sqlmap愉快地进行自动化注入了。
06、密码的解密
接下来是文章中的最后一部分,也是二进制含量最高的一部分,如何解密数据库中存储的密码。
跳过繁复的正向分析,我们使用IDA的插件FindCrypto,可以看到直接找到了加密算法Blowfish、DES,编码算法BASE64,散列算法MD5,校验算法CRC32,随机数生成算法VC8 Random的关键常量。
在对这些算法有着了解的情况下,我们就可以直接定位到加密算法的位置,通过对参数进行分析,找到加解密所使用的key和iv等数据。(FindCrypto只能找常量,如果常量被替换,就只能通过分析算法来看是否是某种已知的算法,典型类似于换表base64)。
回溯分析可以很快找到关键调用链。
1、下断点在加密函数中断住。
2、回溯分析堆栈查看函数调用情况。
3、IDA中跟随分析相对应的返回地址作用。
4、回到ChangePassword函数中,找到调用链。
函数调用链。
在这里通过对比分析就可以看到所使用的s盒和p盒内容完全是公开的标准算法,所以我们通过函数调用的上下文即可找到key的生成算法,接着使用python实现解密算法就可以对我们在注入中获取的passwrod进行解密了。
1. 对比数据
S盒:
P盒:
标准算法中的数据[可参见文末推荐阅读链接3] :
2.分析加密函数和参数
3.找到密钥
4.实现解密
07、其他细节
2、能否hook日志函数,捕获程序运行时的调试信息?
3、能否破解许可[可参见文末推荐阅读链接4]?
二、安全加固建议
1、针对SQL语句的拼接和执行,最好的做法还是在代码中进行预编译,而不是对用户的输入进行直接拼接。
2、如果一定要拼接用户的输入作为代码执行,那么一定要过滤关键字符,确保用户输入的有效性。
3、严格的权限控制加上足够的密码强度能够显著提高攻击者的实施难度,阻止攻击者对漏洞进行利用。
三、总结
01、渗透工作中的处理思路
·BS架构
1.提取云端API接口、服务器地址。
2.检查加解密、签名方法。
·CS架构
1.是否有内置用户、默认登陆用户,权限认证绕过。
2.检查通信协议。
3.符号还原、获取源代码。
4.二进制漏洞发现和利用。
02、开发、脚本、密码学
1、在二进制分析中,没见过的代码往往逆向分析难度很大,需要多尝试各类开发语言与架构。同时在带着攻击者思维编程时,就可以了解到开发者可能存在的问题和可能的应对方法,为我们的绕过和攻击创造思路和条件。
2、脚本是用来提升工作效率的一种主要方式,通过归纳和总结实现重复工作,不仅可以提高工作效率,还可以验证你是否掌握一类漏洞或者相关知识。
3、在密码法、个人信息保护规定、等级保护管理办法的出台和正式实施后,直接的明文存储、明文传输越来越少见,我们需要能够对常见的加解密、编解码和散列算法进行识别(起码认识名字),这样在渗透中往往可以构造加密后的数据进行尝试。
参考文章及推荐阅读:
[
]:GitHub - yhirose/cpp-httplib: A C++ header-only HTTP/HTTPS server and client library
https:
//github.com/yhirose/cpp-httplib
[
]HTTP
0.9
HTTP
1.0
HTTP
1.1
HTTP
2.0
区别 - 武培轩 - 博客园
https:
//www.cnblogs.com/wupeixuan/p/8642100.html
[
]BlowFish加解密原理与代码实现
https:
//cloud.tencent.com/developer/article/1836650
[
]为什么即使世界最知名的软件程序,也无法阻止被人破解的命运?
https:
//www.zhihu.com/question/27448355/answer/36735119
*左右滑动查看更多
原文始发于微信公众号(安恒信息安全服务):九维团队-绿队(改进)| 一次二进制漏洞的复现过程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论