C/S架构安全

PC客户端实战模拟渗透

2021-10-07  本文已影响0人  book4yi

前言:


我是前言怪!bulabulabulabulabulabula~

BetaFast:


BetaFast是一款集合了诸多漏洞的PC客户端
项目地址:https://github.com/NetSPI/BetaFast

BetaFast是采用三层架构编写的:

第一层:客户端显示和采集数据
第二层:服务端接受web请求并处理业务逻辑
第三层:数据库服务器修改和获取应用服务器的数据

成功编译后直接打开应用程序,开局一个登录框:

利用Proxifier开启http代理,将流量转发给burp suite:

抓到登录的请求包后,进行SQL注入测试,发现存在时间盲注和堆叠注入:

后面想进行登录,但不知道密码,虽然知道是AES加密,也知道KEY和IV,但我太菜了,解不出来,后面利用注册接口注册了一个新用户:

利用注册的用户成功登录:

运行snoop,然后选择正在运行的BetaFast进程,就可以对它进行调试,菜单树可以展开,这里就能看到AdminVisiability的属性,它本来是设置为隐藏的。

将这个属性值设置为“显示”,就能看到只有管理员才能查看的功能菜单了,如图:

就修改属性值本身其实并不算是一个漏洞,但服务端如果没有做好鉴权工作的话,就可能产生一些严重的后果。此处可以通过一个普通用户创建管理员账号,并查看数据库中的所有账户。

另外付款页面的总金额数也是在客户端校验:

那我们就能通过snoop来修改金额,甚至把金额改成负数:

正常来将需要在服务器端进行对数据进行认证和输入验证

  • 输入验证和参数化查询—跟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,encrypteddecrypt,就可以查找程序是如何处理加密,身份认证和数据库连接信息。软件的搜索功能中还有一个筛选器,也可以限定只搜索特定的二进制文件和对象类型。

搜索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调用,并且显示参数。在这个例子中,我们会筛选出BetaFast在登录认证过程中API调用列表,注意看一下左侧的API过滤器。当我勾选相应的模块并且通过BetaFast认证时,summary这一栏瞬间就记录了50000多条API调用,占用了相当一部分的系统资源:

使用API Monitor来监控BetaFast程序,并不会突出显示一些特定的漏洞,并且几乎所有的主要功能都包含在单独的程序集中,所以API Monitor可能无法找到在库之间传递的大量敏感信息。但是这个工具在显示其他信息方面也是很有帮助的,如显示正在使用的系统资源,被引用或创建的文件,网络调用,安全调用等。除了信息收集外,我们再来看看攻击方面,它能够在加密之前拦截和修改数据,或者是收集库之间传递的明文密码和连接字符串。

可用于加载和运行单个方法调用。不需要加载程序并搜索方法调用的位置,不需要调试应用程序,而且一行代码都不用编写。如果测试时需要写一个方法,用.net SmokeTest执行也很简单,比在程序中找到正确的调用点简单得多。而且,对于在预写方法中测试各种数据输入也是非常有用的。

我们在BetaFast.exe程序中找到了一个硬编码的加密密码,具体来说,就是在LoginModelView这个类中,看下代码,在点击登录时,登录表单中的密码会被加密,然后与存储的值进行比较。

后面发现有解密函数,但是在程序中没有调用。由于IV和key在硬编码在了程序中,因此只需要输入密文即可

首先启动.net SmokeTest,然后创建一个LoginViewModel类的实例:

打开LoginViewModel类,将密码作为密文参数传递到解密函数中,然后就可以显示出明文密码了:

  • 加密数据库连接:隐藏敏感数据,防止网络窃取。只要执行了安全加密,也可以保护流量无法被修改。
  • 最小权限原则:由于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客户端常见漏洞挖掘

上一篇下一篇

猜你喜欢

热点阅读