如何破解SSS扫描工具
最近实在是忙得不亦乐乎,一边埋头整理开学要上交的网络安全研究课题,一边在网上清理恶意网站。我的爱机也跟着我连轴转,没有多少休息的时间(还好我的机器是双Xeon的服务器,哈哈)。一天突然要用到SSS,立刻到黑白网络上Down了一个下来。结果一注册傻眼了,这个SSS 竟然用上了网络认证,注册机生成的注册文件根本没法通过认证。忽然想起了05年《黑客在线》上有一个文章介绍SSS,翻来看看。这不看还好,看完了我差点没从6楼跳下去。杂志上面写着:“面对SSS无法破解的问题,小编采用虚拟机恢复大法……”我真的绝望了,看来N多的高人已经对这个SSS束手无策,我还能做什么呢?难道就只能这样了吗?
不过,我就是不信邪,非得要把这个SSS破掉不可。爆破?不太可能。其它的方法呢?我又不会(检讨一下,当年破解没学好)。干脆顺水推舟,由着SSS来算了。
灵巧的破解
首先,咱们还是老方法,用注册机生成一个注册文件。这个注册文件不是万能的,但是没有它是万万不能的。填写注册信息,按Generate就OK了。
好了,我们先不管它,让它一边凉快去(蝴蝶:不管它你生成它做什么?欠扁……),不是这个意思,等一会才能用到它啦。
在下一步之前,必须说一个东西:host文件。这个文件大家不会不知道吧?它的功能就是替代DNS进行域名解析,以便达到快速访问的目的,而且它在查询中的优先权要比网络上的任何DNS服务器都高。所以,只要改host文件,就可以“绑架”域名了。有很多朋友的机器,就算输入了正确的网址,也会上一些恶意网站,多半是这个文件被修改了的原因。需要注意,这个文件没有后缀名,位于%windir%system32driversetc下(Windows 2000/XP/2003系统),我们用记事本把这个文件打开,在里面加入这么一行:
127.0.0.1 www.safety-lab.com
这个www.safety-lab.com是SSS的官方站点,我们这么做就是为了欺骗SSS,让它连接到自己的机器上。因为经过我的Sniffer抓包发现,SSS在认证注册的时候,向http://www.safety-lab.com/update/db/keys.php提交了用户数据,并且在验证失败的时候,服务器端返回了一个1。有经验的朋友一眼就能看出来,SSS应该就是靠这个返回值来判断用户是否合法。也就是说,只要让这个值变成0,我们就可以成功注册了。
有人会问了,你怎么知道返回0,就是注册成功呢?不可能是别的数字吗?其实这个我也是猜一半,用社会工程学推导一半。其实,有时玩黑客并不一定只需要技术,还需要那么一点点的运气。
我们先来架设一个Web服务器,既然大家都是Windows用户,就用IIS好了(以下配置IIS的过程是在2003系统下实现的,2000/XP可能有所不同,请参考相关资料)。进入站点的属性—〉主目录—〉配置—〉映射,为.dat,.pl和.php三种后缀的文件添加映射。可执行文件框里,你的.asp文件是怎么设置的,不动就行。
这样做的目的是让这三种后缀名的文件,在IIS中都可以被当作ASP文件执行。其实,用别的语言实现也可以的,不过笔者只会ASP,没办法。设置好映射,我们来做几个文件,“忽悠忽悠”SSS。
最要紧的就是先注册了,否则什么功能也不能用。我们来分析一下这个keys.php的代码(其实是asp语言,这个keys.php在IIS中是被当成asp执行的):
[以下代码在keys.php中]
<%
Dim crc,name,founder ‘定义几个变量
founderr=true ’为了防止程序出错,把控制错误的变量设为true
if request("crc")<>"" and request("name")<>"" then
founderr=false
end if
if founderr=false then
response.write "<html><body>0" ’如果有输入,就返回一个值
response.end
end if
if founderr=true then
response.write "<html><body>1" ’处理意外情况,防止SSS收不到返回值而挂掉。
response.end
end if
%>
这段代码很简单,只接受SSS发送上来的CRC和NAME两个变量,并返回一个值。大家可能看出来了,这个返回值<html>和<body>标签并没有结束,其实这不需要结束。因为我分过析Sniffer抓到的完整的数据包,发现就是这样的。也许是Safety-Lab故意做的一个陷阱吧,管他呢,能注册就OK。
我们的host文件不是已经改好了吗?那就把以上的代码保存成keys.php,放到你的IIS根目录下的/update/db/下(如果你的IIS根目录在E:inetpubwwwroot,就放在E:inetpubwwwrootupdatedb)。然后我们打开SSS,导入注册文件,点击Done,看看,这不就完事了?
不过,单单破解,并不能满足我们的要求。如果现在你用在线升级,仍然会失败。而且还会把你刚注册上去的授权撤销。那怎么办呢?嘿嘿,接着往后看不就知道了?
破了软件不能升级,那就跟用D版XP一个感觉——很不爽。所以,又花了点功夫,把升级的限制也解除了,虽然不是很完善,但确实可以检测升级了。
还是老方法,用Sinffer把升级过程的包抓下来,分析一下。我们看到SSS的升级程序访问了以下面:(前面都是http://www.safety-lab.com/,省略)
updatedbkeys.php 还是验证身份,阴险……
updatesssupdate.dat 这是一个数据文件(功能未知);
updatedbgetdbaudits.pl 一个数据引导文件,用于生成更新列表。
先拿出来分析,然后各个击破。这个keys.php刚才讲过了,我就不说了。update.dat文件好像是一个引索文件,据我的观察,它还是在变动的,但是它却是没有经过服务器的解析,可以直接下载下来,但为了保持数据最新,我们还是用动态的方法来处理吧。先看一段代码吧:
[以下代码在update.dat中]
<%
On error resume next ’没别的意思,防止出错而以
Dim sURL
Dim Retrieval
Function GetURL(url)
Set Retrieval = Server.CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "GET", url, False, "", ""
.Send
GetURL = .ResponseText
End With
Response.BinaryWrite retrieval.responseBody ’输出二进制到浏览器
Set Retrieval = Nothing
End Function
sURL = "http://safety-lab.com/update/sss/update.dat" ’这个是要获取地址
Response.Write GetURL(sURl)
%>
这是ASP编程中很经典的一个函数的应用。这个面的作用就是让IIS到另一个站点,取得一个面,然后传回客户端。假设这个存在于主机A上的面指向的是主机B上的内容,但是主机A的客户通过访问这个面,就可以在主机A上看见主机B上的东西。但是,这个和普通网中用JavaScript实现的面重定向是不同的:JavaScript是让客户端重新定向,这个是以IIS为中介的服务器的重定向。
尤其是针对程序请求的面的时候。因为程序不会识别那些由JavaScript语言组成的重定向语句,而这样的方法则不需要客户端的支持。哦,差点忘了一个事情,如果你的机器上有类似VisNetic Firewall一类的带有IDS功能的防火墙,把它关闭,否则会出错的。我当时调试的时候,这个update.dat怎么访问都有问题,后来发现是VisNetic的过滤功能把请求给过滤了。
再来看另外一个文件代码:
[以下代码在getdbaudits.pl中]
<%
On error resume next
Dim outformat,sURL
outformat=request("outformat")
Dim Retrieval
Function GetURL(url)
Set Retrieval = Server.CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "GET", url, False, "", ""
.Send
GetURL = .ResponseText
End With
Response.BinaryWrite retrieval.responseBody ’输出二进制到浏览器
Set Retrieval = Nothing
End Function
sURL = "http://safety-lab.com/update/db/getdbaudits.pl?outformat=" & outformat
Response.Write GetURL(sURl)
%>
这个文件和上一个文件是大同小异,只不过多了一个对变量的处理而已。明白ASP的朋友一眼就能看出来,不太清楚的,向高人讨教一下吧。这个面请求的应该是更新列表,不过不算太大,全部返回的数据也就有8-10KB。我们很快就能看到结果。
看见了吧?这就得到了更新列表了。我猜有很多人可能马上就要去点击那个Next按钮了吧?别着急,这里有问题需要处理。先兜个圈子,给大家说说我原来的思路,以下的过程仅仅是概念讲解,大家无需跟着操作。
我仍然是采用了Sniffer抓包的方法,看到升级程序访问了updatedbgetaudits.pl文件,而且后面足足跟了有825个字符的变量!我不在文章里列出来了,免得占用空间(详见光盘:数据.txt)。这些变量虽然多,但是交给程序处理还是游刃有余的。于是乎,我写了一个对应的面:
[以下代码在getaudits.pl中]
<%
On error resume next
Dim outformat,sURL
outformat=Request.ServerVariables("Query_String")