PC客户端实战模拟渗透
前言:
我是前言怪!bulabulabulabulabulabula~
BetaFast:
BetaFast是一款集合了诸多漏洞的PC客户端
项目地址:https://github.com/NetSPI/BetaFast
BetaFast是采用三层架构编写的:
第一层:客户端显示和采集数据
第二层:服务端接受web请求并处理业务逻辑
第三层:数据库服务器修改和获取应用服务器的数据
成功编译后直接打开应用程序,开局一个登录框:
利用Proxifier开启http代理,将流量转发给burp suite:
抓到登录的请求包后,进行SQL注入测试,发现存在时间盲注和堆叠注入:
后面想进行登录,但不知道密码,虽然知道是AES加密,也知道KEY和IV,但我太菜了,解不出来,后面利用注册接口注册了一个新用户:
利用注册的用户成功登录:
运行snoop,然后选择正在运行的BetaFast进程,就可以对它进行调试,菜单树可以展开,这里就能看到AdminVisiability的属性,它本来是设置为隐藏的。
将这个属性值设置为“显示”,就能看到只有管理员才能查看的功能菜单了,如图:
就修改属性值本身其实并不算是一个漏洞,但服务端如果没有做好鉴权工作的话,就可能产生一些严重的后果。此处可以通过一个普通用户创建管理员账号,并查看数据库中的所有账户。
另外付款页面的总金额数也是在客户端校验:
那我们就能通过snoop来修改金额,甚至把金额改成负数:
正常来将需要在服务器端进行对数据进行认证和输入验证
- BetaFast修复措施:
- 输入验证和参数化查询—跟Beta Bank不同,不是流量拦截和修改的问题,BetaFast问题出在应用服务器处理用户输入上。客户端输入的任何数据,服务端都应该进行验证,而且sql语句应该采用参数化查询。
Beta Bank:
Beta Bank采用双层架构编写:
第一层:客户端显示和采集数据
第二层:数据库服务器处理业务逻辑,执行客户端数据查询和修改
数据库连接未加密,创建账号时可查看到用户名明文传输:
可以看到除了参数值混淆外,没有其他的防御措施,整个传输过程没有进行安全地加密。通过wireshark还观察到登录过程中的输出参数GUID,在应用程序的认证部分,这个过程接受GUID参数。
这个GUID就是我们业务中常说的会话ID,有了这个值,只要当前用户会话保持在线,攻击者就可以执行通过认证的操作。即便攻击者没有拿到账号或权限,也已经造成一定的影响了。
连接数据库查看是否存在SESSION信息:
这里发现取钱按钮已经禁用了,利用snoop启用按钮:
尝试取钱,观察wireshark发现执行了一个sql查询:
利用Echo Mirage直接修改sql语句,虽然不能改变数据包的长度,但是可以注释掉后面的sql语句
服务端响应了用户表信息,将得到的数据与列表进行对应,得到其中一个用户名The_Chairman:
文件系统和注册表测试:
利用Process Monitor设置过滤器如下:
开启Process Monitor进行监控,登录认证的时候,勾选“Remember Me”来记录凭证
在 Process Monitor 运行的情况下,对应用程序进行身份验证并允许它记住您的凭据。请注意,执行了两个 RegSetValue 操作,一个用于用户名,另一个用于密码。
定位到注册表相应路径后,发现登录账号密码被明文进行存储:
一般来说,凭证的注册表只有管理员和NT AUTHORITY\RESTRICTED,可以读取。因为是存储在HKEY_CURRENT_USER注册表中,因此只有高权限账户和当前用户才能看到凭证,但是还是有可能泄露。
BetaFast还有一个支付详情表单,Process Monitor可以分析这个LoadPaymentDetails按钮尝试去加载什么。
应用程序正在 C:\ProgramData\BetaFast\PaymentDetails\
目录中创建txt文件并写入用户支付相关信息:
到对应目录查找文件时,发现明文存储用户的敏感信息,包括用户名、卡号等:
并且该文件所有用户都可读:
信息泄露:
测试客户端时,我的习惯是优先查找是否存在敏感信息硬编码,比如凭证,加密密钥和连接字符串等:
配置文件敏感信息泄露:
利用dnSpy进行反编译,输入关键词key
,IV
,connection
,password
,encrypted
和decrypt
,就可以查找程序是如何处理加密,身份认证和数据库连接信息。软件的搜索功能中还有一个筛选器,也可以限定只搜索特定的二进制文件和对象类型。
搜索password
,找到一个硬编码的加密密码:
- 内存敏感信息泄露:
如果系统被攻击者破坏,存储在内存中的值可能会暴露。如果可能,将敏感数据分配给可变数据类型,例如数组。像字符串这样的不可变数据类型不能根据命令从内存中清除,但是只要不再需要数组的值,就可以从内存中清除它。
登录Beta Bank以后,在任务管理器中找到该应用程序,右键单击,然后单击创建转储文件
现在已经生成一个比较大的文件,这就是该进程内存中的所有内容。
仅检索字符串值来帮助分析这些数据,并对数据进行去重:
strings.exe BetaBank.DMP > string.txt
cat string.txt | uniq > string2.txt
发现登录的密码保存在内容当中:
或者利用HxD,既能编辑内存,也可用于查看。在 Beta Bank 运行时,单击 Open RAM 查看进程的实时内存:
搜索 The_Flairman 会显示内存中引用用户名的多个位置:
用 The_Chairman 替换了 The_Flairman 的每个实例:
保存这些编辑将覆盖当前的实时内存:
- 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类,将密码作为密文参数传递到解密函数中,然后就可以显示出明文密码了:
- Beta Bank修复措施:
- 加密数据库连接:隐藏敏感数据,防止网络窃取。只要执行了安全加密,也可以保护流量无法被修改。
- 最小权限原则:由于Beta Bank使用高权限用户连接数据库,因此当攻击者找到漏洞并加以利用,就可以完全控制数据库,执行任意操作。如果连接数据库的用户只拥有最小权限,那么攻击者只能执行权限以内的正常功能,可以减小危害。
- 密码加盐或者进行hash存储:加密本质上是可以逆向的。
- 强化身份验证逻辑:不要直接把通过网络发送的密码与数据库中存储的密码比对,这样的话,如果攻击者嗅探到密码,甚至不需要解密和破解hash,就可以直接利用。首先密码应该加密传输,然后服务器端对密码进行加盐或者hash处理,再与数据库中加盐过或经过hash加密的密码进行比对。
参考如下:
Introduction to Hacking Thick Clients: Part 1 - the GUI
Introduction to Hacking Thick Clients: Part 2 – The Network
Introduction to Hacking Thick Clients: Part 3 – The File System and Registry
Introduction to Hacking Thick Clients: Part 4 – The Assemblies
Introduction to Hacking Thick Clients: Part 5 – The API
Introduction to Hacking Thick Clients: Part 6 – The Memory
实战介绍Windows下的PC客户端常见漏洞挖掘