0X00为什么要写这篇文章对于小白来说,网络安全似乎有着非常完备的知识体系和漏洞发现过程,刚入门的朋友总是喜欢我选择web方向作为我的发展方向,因为web系统的渗透测试似乎给我更高的成就感,很多新手认为web似乎更容易学习,但是对于PC客户端漏洞发现,因为它涉及到一些电脑和很多人不敢接触操作系统的底层知识。事实上,PC客户端的漏洞比大家想象的要容易得多。甚至不需要精通汇编语言,就可以轻松挖掘出PC客户端的漏洞。但是汇编语言是PC客户端漏洞发现的基础,学好它还是很有必要的。另外,挖掘PC客户端漏洞与挖掘WEB漏洞是一样的。两者都需要细心和耐心。你必须学会??关注每一个细节,了解系统和软件是如何协同工作的。本文主要讲Windows下PC客户端漏洞发现。为了便于理解,不涉及ROP、内存溢出等高级内存威胁技术。请绕过它。0×01工具“工欲善其事,必先利其器”。PC客户端漏洞挖掘主要基于逆向工程和进程监控。在逆向工程方面,我推荐两个工具,一个是静态分析之王:IDApro,还有一个在动态调试中非常好用:Ollydbg(推荐大家使用我爱破解论坛的版本)。查看这两个逆向分析工具就可以找到,这里就不介绍了。进程监控工具主要分为进程本地行为监控和进程网络行为监控。我推荐本地行为监控工具:ProcessExplorer进程监控和Autoruns进程监控。这两个工具并不出名,但是使用起来很方便。ProcessExplorer进程监控Autoruns进程监控工具在本地监控工具中还有一个专门监控注册表的工具。这里有几点推荐:ProcessMonitor:一个强大的注册表监控工具,可以添加过滤规则,非常方便。Regshot:注册表备份比较工具,可以通过快照保存比较找出注册表中哪些值发生了变化。RegfromApp:也是一个进程监控工具,可以在选择进程后跟踪其对注册表的修改。网络行为监控工具当然是大名鼎鼎的Wireshark。当然还有一个工具,虽然很小,但是非常好用。它是TimeAlliance的一个工具,叫做WSExplorer(进程捕获包)。Wireshark年联的进程抓包工具WSExplorer非常方便。左边是进程,右边是抓取的数据包。有了上面的工具,我们就可以知道程序在我们的电脑上做了什么。知己知彼,方能百战百胜,才能开启下一步的漏洞发现。0×02缺陷对于开发者来说,不可能开发出一个完全没有缺陷的程序,尤其是当程序的体积非常大的时候,必然存在漏洞。我们需要知道的是哪些位置容易出现漏洞。客户端授权认证漏洞:正版客户端软件一般都有授权认证模块。这些授权认证方式的目的不外乎是“买的可以用,不买的不能用”。通常,注册用于验证。码与个人电脑的机器码绑定,或者与某种个人认证机制绑定,达到验证的目的。授权认证漏洞会导致软件和功能被破解、盗版程序流传等严重后果,授权认证漏洞往往是开发者在开发过程中没有注意授权认证的保密性和安全性造成的。客户端网络服务漏洞:此类漏洞一般是由于客户端在发送或接收数据包时没有进行严格的认证,导致无条件调用高级权限的服务。客户端功能逻辑漏洞:此类漏洞一般是由于客户端功能设计不合理导致的,可能导致非授权访问等严重后果。客户端溢出漏洞:这种漏洞包括了逆向工程中比较难的部分,主要是开发时对内存的错误管理,或者是程序本身的执行逻辑漏洞。本文仅涵盖前三个漏洞。0×03实际客户端功能逻辑漏洞:挖掘此类漏洞应重点关注客户端功能之间的逻辑,类似于web逻辑漏洞。不过不同的是,反编译部分也包含了功能逻辑漏洞。一般漏洞挖掘都是通过修改按键调用函数上面的跳转逻辑来进行的。主要原因是客户端逻辑太简单,逻辑判断用的少。此漏洞在功能齐全的客户端上并不常见。客户端授权认证漏洞:1.基于本地注册中心破解:部分软件虽然使用网络进行授权验证,但由于试用次数设计上的验证缺陷,通过修改注册中心会导致多次试用,导致在“不付费也能用”中,也就是出现了授权认证漏洞。以下客户端程序就是这种情况。我们刚打开的时候会提示还剩29次试炼。现在我们打开ProcessMonitor,使用过滤功能添加白名单,让Pm只显示进程的信息。添加过滤白名单只显示该进程。关键部分已经处理好了。然后停止所有捕获,关闭并重新启动客户端。反复多次后,我们监控每次打开客户端,都会自动做一次RegsetValue(修改注册表值),如下:经过测试,发现剩余的试用次数是整数30减去一个叫key下的值现在在注册表中。所以我们写一个BAT脚本,修改客户端指向的值,让它在客户端启动的时候自动运行,这样就可以将试验次数锁定在30次,不会减少。regaddHKCU\Software\clientname\onelocation/vNowtimes/tREG_DWORD/d0/f造成该漏洞的原因主要是识别试验次数的方法过于简单,直接写入注册表没有网络或加密。而键名又是那么的简单易懂,就叫做“Nowtimes”。这种在注册表中的漏洞发现和利用比较简单,但是问题是这样的漏洞还是挺多的,所以大家在挖掘的时候要注意注册表。另外,如果注册局禁止监控,我们可以使用REGshot保存前后快照进行对比分析。2.基于网络授权验证的主机欺骗要破解这部分需要一定的逆向工程知识。本次破解的客户端并没有设置试用机制,所以我们将目光投向了它的网络验证方式,看看客户端的网络授权验证方式是如何工作的。关键位置码处理随意输入一个注册码,输入一个注册码并确认,根据弹出的错误窗口定位到客户端的注册检测验证功能。拖入OLLYdbg,找到“注册码错误”这个字符串,跟踪到编译窗口。这样我们就得到了注册授权的服务器地址。为了进一步验证,我们使用wireshark来分析这个客户端注册时的网络请求。<>可以看出,客户端携带了我们的机器码和其他几个数据请求服务器的/verifycheck/login.php,然后返回到我们的程序集窗口。我们可以看到几个unicode编码,怀疑是服务器的回去记录一下。直接用浏览器访问,可以发现返回值与汇编窗口中的其中一条记录值相同,所以我们猜测可以构造一个假服务器,修改主机的hosts文件实现请求重定向,让我们的服务器返回注册成功的信息。修改hosts文件,将服务器域名绑定到我们自己的假服务器ip地址,在服务器上构造不同的payload,得到客户端不同的响应,说明漏洞成功了一半。此时,我们可以排除其他有效载荷,从而确认格式化日期返回值是注册成功的标志。于是我们构造一个格式化的时间,重新打开客户端输入任意注册码进行注册,就可以看到注册成功的窗口了。最终payload的漏洞是由于客户端软件过于简单,无法验证注册码返回的数据,很容易构造出注册成功的返回值。而且客户端的反编译能力也很差,反编译后直接可以看到敏感信息。在挖掘这类漏洞时,需要具备一定的逆向工程基础知识和一定的计算机网络基础知识,重点关注客户端与网络服务器的通信数据,利用抓包工具进行漏洞挖掘。客户端网络服务漏洞:由于想以此为例的漏洞厂商还没有修复,所以这里就不举例了。网络服务漏洞的发现主要采用客户端网络请求分析的方法。主要工具是前面提到的进程抓包工具和Wireshark。一种安全性极低的验证方式,使得任何人都可以以客户端的合法名义请求该网络服务,实现私网服务接口的无权限调用。经常出现在客户端VIP付费资源的试听服务,客户端付费的查询功能接口等,可以对不安全的客户端请求进行拦截分析,进而实现对非授权资源或接口的非授权调用。在挖掘此类漏洞时,我们需要更加关注客户端的网络传输层面,尽可能通过网络服务器分析客户端的每一个功能,从而进行漏洞挖掘。
