厚客户端渗透测试介绍是一个系列博客文章,上一篇我们讲到了程序集的测试,这一章我们来看看API的测试。
示例应用下载地址:BetaFast Github repo。
已发布文章
信息收集
测试应用程序时,搞清楚程序表面背后的逻辑是非常重要的。想象一下你们见过的最大的桌面应用程序,可能跟我测试过的体量庞大的厚客户端相比,都算不了什么。测试这些庞杂的厚客户端需要团队合作和坚持不懈的精神。我曾经做过一个demo的测试,花了6个小时,都没有看完整个应用程序的逻辑和代码。即使代码没有进行混淆,我也不可能读完,完全搞懂每句代码的意思。
不过好在有大牛开发了工具,可以帮助我们测试。
API Monitor
首先来介绍下API Monitor。这个工具会监控进程中的所有API调用,并且显示参数。在这个例子中,我们会筛选出BetaFast在登录认证过程中API调用列表,注意看一下左侧的API过滤器。当我勾选相应的模块并且通过BetaFast认证时,summary这一栏瞬间就记录了50000多条API调用,占用了相当一部分的系统资源:
以我的经验来看,使用API Monitor来监控BetaFast程序,并不会突出显示一些特定的漏洞,并且几乎所有的主要功能都包含在单独的程序集中,所以API Monitor可能无法找到在库之间传递的大量敏感信息。但是这个工具在显示其他信息方面也是很有帮助的,如显示正在使用的系统资源,被引用或创建的文件,网络调用,安全调用等。除了信息收集外,我们再来看看攻击方面,它能够在加密之前拦截和修改数据,或者是收集库之间传递的明文密码和连接字符串。
发起调用
下面我们看看高级测试。有一款测试工具叫“.net SmokeTest”,可用于加载和运行单个方法调用。不需要加载程序并搜索方法调用的位置,不需要调试应用程序,而且一行代码都不用编写。如果测试时需要写一个方法,用.net SmokeTest执行也很简单,比在程序中找到正确的调用点简单得多。而且,对于在预写方法中测试各种数据输入也是非常有用的。
请看下面这个加密方法!使用上篇文章介绍到的反编译器,我们在BetaFast.exe程序中找到了一个硬编码的加密密码,具体来说,就是在LoginModelView这个类中,看下代码,在点击登录时,登录表单中的密码会被加密,然后与存储的值进行比较。
加密方法如下:
再往下看,是解密方法,但是在程序中没有调用。由于IV和key在硬编码在了程序中,因此只需要输入密文即可:
下一步自然就是解密硬编码在代码中的加密密码了。首先启动.net SmokeTest,然后创建一个LoginViewModel类的实例:
打开LoginViewModel类,将密码作为密文参数传递到解密函数中,然后就可以显示出明文密码了:
还有一个powershell解密脚本,几年前的NetSPI的一篇博客中也有提到,以下代码可以运行来调用特定的方法:
# Load Assembly $Assembly = [System.Reflection.Assembly]::LoadFile("C:\Users\netspi\Desktop\Examples\3-Tier\BetaFast.exe") # Create binding $BindingFlags= [Reflection.BindingFlags] "NonPublic,Instance" # Target the class $Instance = new-object "BetaFast.ViewModel.LoginViewModel" # Call the methods $Instance.GetType().GetMethod("Encrypt",$BindingFlags).Invoke($Instance,"Spring1980!") $Instance.GetType().GetMethod("Decrypt",$BindingFlags).Invoke($Instance,"PE/jSP7tOGDLoZLXRvPtlA==")
可以看到Spring1980!成功加密,而PE/jSP7tOGDLoZLXRvPtlA== 也成功解密:
本文翻译自:https://blog.netspi.com/introduction-to-hacking-thick-clients-part-5-the-api/如若转载,请注明原文地址