德斯软件资讯9月5日消息,嗅探、中间人sql注入、反编译——例如,桌面软件安全问题
今天这篇文章不打算讲太多理论,讲讲我最近遇到的一个案例。从技术上来说,这个例子并不深刻,有一点运气的成分,但是足够典型,我可以说出很多道理来装逼。那么,我们开始吧。
1.1特定于公司的CRM系统
什么是CRM系统?如果不知道,请自己谷歌一下。从数据上看,它包含了一个公司所有客户的机密信息。如果泄露出去,后果会很严重。下面是我偶然发现的一个网站,有一个CRM软件的下载链接。一开始我以为这是一家CRM公司,但是看起来不像。
从网站的其他信息来看,好像是公司内部的一个CRM系统,我就下载了。
是直接登录界面。我先随便输入了一个用户名,没有输入密码。
然后我输入了另一个“admin”。
通过简单的尝试,可以确定这不是一般的CRM系统,是定制的,可以在外网使用。是否有绑定的电脑,外网服务器的IP,外网直连的数据库服务器都是未知的。我们抓住袋子确认一下。
1.2抓取数据包分析
启动Wireshark,然后单击登录按钮,并立即停止捕获数据包。我发现了一系列TDS包。
下面的信息确认了这个软件是直接连接到数据库服务器的,不通过后端服务接口返回数据。
查询语句很明显,但也很奇怪。开发人员正在用用户名查询密码,然后他要做的就是将返回的密码与用户输入的密码进行比较。幸运的是,它返回的密码是加密的。
按照sqlserver的理解,在登录认证阶段,默认是加密传输,不会暴露用户名和密码,但是我们可以从数据包中分析出数据库的版本和服务器的基本信息。
访问的数据库名称:
服务器名称:
当然,从名字上看,应该是win7系统,win7是一个很棒的服务器。
版本:
SqlServer 10.0,应该是2008版。
好了,简单总结一下。通过数据包捕获分析,我们得到目标服务器的IP,至少有80和1433个开放端口,win7操作系统,SQLServer2008数据库和连接的目标数据库的名称。下面可以从三个方向努力。一种是找到服务器和web应用的漏洞进行渗透。二是继续利用软件本身的漏洞。三是攻击数据库。我们不知道当前应用程序登录数据库所使用的账号的权限是什么,但可以大致判断软件编写者的编程水平。从编程层面可以推断出90%的可能性是sa用户或者sa权限。邪恶的想法是这样的。截取并修改查询语句,创建一个新的数据库管理账号,然后使用工具直接连接。那你不控制数据库吗?控制了数据库还有机会控制服务器吗?试着找出答案。
1.3测试中间人攻击
这台机器不需要中间人攻击吧?不过我很想用Ettercap的滤镜和替换功能,可以省去很多麻烦。
首先在虚拟机中启动我的Kali Linux,然后在Kali中启动Etercap进行Arp欺骗测试(Etercap的详细使用方法请参考google,这里简单说明)。
第一步是打开路由转发功能。
#启用IP路由和转发功能
echo 1 & gt/proc/sys/net/ipv4/ip_forward
第二步:在“/etc/ettercap/etter.conf”中配置转发。
第三步,arp欺骗。
第四步是测试。
用driftnet测试是否可以拦截主机的镜像请求,如果可以,证明arp欺骗成功。
1.4过滤和替换数据结构
上面的测试证明了中间人攻击是可行的,那么我们就开始构造过滤脚本吧。首先,创建一个1433.filter文件,并输入以下内容:
搜索和替换的内容需要按需构建。搜索的内容可以在刚才的数据包捕获工具中获得,也就是从数据库中查询密码的sql语句,而替换的内容我要它在这里执行这样一条语句:
用密码='YouGotHacked1# '创建登录黑客;
让我们回头看看要搜索的元素请求数据。
select Employee_UserName,Employee _ PassWord from E _ Employee,其中Employee_State= 217,Employee_UserName='admin '
这些数据在每个字符后都填充了\x00的空字节,这是不可打印的,也就是说我们需要把所有的内容转换成十六进制,然后再填充\x00。
还有一个问题需要注意,被替换的数据必须和原数据长度相同,否则会造成TCP数据传输中断。手工做这个有点麻烦。我还是写个小程序修一下吧。
def stringToHex(string,padLength=0):
s1=
让我们将1433.filter文件生成为Ettercap可以使用的ef文件。
再次运行Ettercap:
单击软件的登录按钮。
当我们看到过滤脚本打印的“成功替换”时,真的成功了吗?
我用vs2015的数据库连接工具连接,奇迹就这么出现了:
连接成功。但是,权限有问题。我们可以再次修改Sql语句来提高它的权限,比如下面这句话:
更改服务器角色sysadmin添加成员hacker
这一步就不详细演示了,流程同上。让我们回到另一个分支去寻找软件本身的弱点。
1.5反编译和解密
看完下面的内容,你一定会觉得我以上的操作都是徒劳的,问题几分钟就解决了。这个例子没错,但是上面的方法比较笼统,也不难,需要先掌握。
在软件的安装目录中,我首先看到了几个这样的dll文件:
作为学长。NET程序员,我就知道是用。NET当我看到这个名字的时候。所以首先找到配置文件,看看程序员是否在这里写了数据库连接字符串。
连接在这里,但是加密了。
但在这一点上,我对这个节目没有欲望。就算保护的很好,也还是个. NET程序,我能破解(专业破解。网而不倒)。但是,令人失望的是,这个程序连基本代码都搞不清楚,当然,它没有外壳,也没有代码加密。用反编译工具随便点一下,然后复制几段代码:
我还是忍不住吐槽这个代码写的太烂了,但是我成功解密了连接字符串,成功登录数据库。我不是sa用户,但我有SA权限。我试过xp_cmdshell,数据库默认是禁用的。执行以下sql语句来解封,
sp_configure '显示高级选项',1
改装
去
sp_configure 'xp_cmdshell ',1
改装
去
1.6摘要—体系结构、权限管理、加密/解密、源代码保护
好了,又要装了。这个总结是给我这样的程序员的,平时话很多,写代码也很多。
首先,权限管理必须严格控制。为什么公司使用的系统要链接到外网,以便任何人都可以下载?数据库权限控制,不同系统划分不同账号。这是基础知识(我经常不分他们,只是为了偷懒)。不同的帐户控制不同的权限,甚至可以将帐户细化到读/写、表和存储过程级别。由于用户有角色,我们的代码也必须有访问权限。当您想要访问代码内部的数据时,不要添加if-else,而应该在调用开始之前将其排除在外。
第二,可以使用必须连接到互联网的程序。为什么不把数据访问和核心业务逻辑放在远程服务器上,开放接口给客户端调用?原因只有一个。程序员太懒了。我在winform订婚了。你想让我从事什么样的服务器?不要!连基本的分层和服务划分都不重视,给基础设施留下了安全隐患。同时,客户端的安全漏洞直接导致服务器被攻破。
第三,像。NET/Java不能绝对防止反编译,只是时间问题。但不代表不要做程序保护,加壳,源码混淆,汇编加密,rsa加解密结合服务器获取的动态汇编构建技术可以把90%的初级用户挡在门外。大开大门是不对的。
这些话题就不展开了,网上搜一大堆。
好了,没什么可继续的了,就到此为止吧。