引言
由于个别原因,需要对某进销存系统进行一次测试,尽可能拿到服务器权限。
已经拿到某台部署好此系统的主机权限,打包下载该软件包安装文件夹。
由于本人对软件逆向了解并不深入,本次测试纯属巧合。
如有错误,望大佬们指教、多多谅解。
为了避免不必要的麻烦,图片打码比较严重,请各位多多谅解!
架构
该软件部署会进行数据同步,服务器与客户端SQL Server数据库中个别表和库会进行同步,由于配置不当,其实最初已经发现了可以通过弱口令,连接客户端的数据库,即可读得用户名及加密后的密码。加密后的密码不是MD5加密,经过观察分析,有如下特征:
- 密文与原密码位数相同
- 明文前N位相同时密文前N位也相同
由此猜测加密方式应该为可逆的,非哈希加密,由于本人未深入学习过密码学,因此放弃了这个入口,来通过软件作为入口。
下文为避免敏感信息,本文假设分析软件为:xxxcms进销存系统。
逆向分析
由于此系统由多部份组成,而与服务器进行同步交互登录的部分为:xxxstart.exe,因此通过此二进制文件作为入口:
打开神器IDA,加载二进制文件,F5可以看到有如下函数:
进入WinMain函数入口,可以看到大概就是获取命令行参数然后调用FN_RunExecutable
继续跟进FN_RunExecutable
可以看到没什么内容,又进行了一次调用,双击跟进:
借助一下万能的搜索引擎:
浏览发现与此处情况相同,只是引用DLL不同,此程序引用PBVM60.dll,文章中为PBVM125.dll
此处接触到了一个古老的东西PowerBuilder,编译后文件后缀为.pbd,PowerBuilder词条解释为:
PowerBuilder是Powersoft(美国著名的数据库应用开发工具厂商,现已被德国SAP集团旗下的Sybase公司收购)推出的可视化数据库集成开发工具,它是一个专业的客户机/服务器应用程序开发工具。PowerBuilder当前的最新版本是12.6,最新版本最大特点是支持了Odata,且和APPEON结合可以达到写一套程序可以在C/S、手机(android和iOS)和WEB平台上使用。它能够设计传统的基于客户机/服务器体系结构的应用系统,从6.0版本开始也能够开发基于Internet的应用系统(Web.PB)。
因此可以猜到主要的登录交互及功能都通过.pbd文件实现,在程序文件夹中找到了xxxstart.pbd文件,这里借助PBKiller来对此文件进行反编译,由于未进行加密混淆,因此程序结构和代码格外清晰,看到了w_halt以命名,猜测与密码加盐相关:
查看w_halt的cb_1控件属性,如下图,可得知为登录按钮:
点击Events查看函数调用,确定为登录验证函数:
接下来可以看出核心函数为ypassword函数,但是未在xxxstart.pbd中找到此函数定义,通过查看所有的属性及函数,发现在某处引用了xxx_login.pbd,因此继续对此文件继续分析(中间有个插曲时PBKiller在查看较大的窗体时就会卡死崩溃掉,shudepb又不允许虚拟机执行,因此改用了DePB_1.0_fix进行分析才找到xxx_login.pbd调用)
此处找到了ypassword函数,但是更关注connect_db和loginpassword相关函数
这里得到可以看到函数加盐过程:
流程大概为:
先将明文转为大写,取得长度,然后通过ASCII码生成一个0-9,A-Z的数组,再以初值为1,2,3,分别以步长为3取数组重新组合,生成新的数组,最后通过key密钥逐个取值转ASCII码运算后进行取值,逐次得到加密后的密文,加密算法改写为python,如下:
此处可以通过改写反向解密所有密文即可,但是为了进一步深入,我们查看connect_db相关函数,可看到如下代码:
大意为通过获取名为xxxbc.dll的文件中的节,获取bc1-bc7变量来获得数据库连接参数,因此通过IDA继续分析此dll,结构大概如下:
到此获得了数据库连接的IP、库名等相关参数以及用户名和密码,尝试连接,但是连接失败,分析代码发现找到的密码并不是真正的密码,还需要通过login_password函数进行一次加密,通过改写的python代码进行加密,得到密码,连接成功,,测试XP_CMDSHELL是否能执行,执行成功,如下:
至于后续提权这些常规操作就不赘述了
总结
在渗透中经常会遇到各种场景和问题,作为一般以Web打点的Web狗,在这次巧合下进行了简单的逆向来打点,虽然操作都比较简单,主要分享下思路和中间遇到的问题,各位大佬请多多谅解!