红日攻防实验室

红日攻防实验室



代码审计第六节命令执行实战CMS

一次团队里面有人问了两个问题,自己面试时,面试官问了两个问题,自己感到特别疑惑。命令执行和命令注入是什么鬼?看到群里全是大牛宝宝们,在不断的给解答这样高端问题,看的宝宝心里是佩服的五体投地。下面直接把群里的截图给列出来。所以此次文章以命令执行为主进行开展。
1.png
2.png
此次文章以PHP命令执行开始开始进行讲解。命令执行简单点讲就是执行命令,不管是web还是操作系统,可以直接执行命令,就是命令执行了。如果你还是不懂,在windows调出黑黑的dos窗口进行执行几条简单命令。直接执行命令,所以在工作中如果遇到命令执行就可以成为高危漏洞了。都可以执行你操作系统命令了,所以这个危害性比较高。现在常见的有好多比如struts系列漏洞、jboss漏洞、jenkins等漏洞,如果可以执行命令,那么你的服务器就会很危险了。
Php代码执行相关背景介绍
当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system、exec、shell_exec、eval等,当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常命令中,造成命令执行攻击。一般命令执行也是调用php相关命令,system、exec、shell_exec、eval这几个命令使用率比较高。为了让大家更好的理解此漏洞,我们以dvwa和bwapp这两个靶场平台为例子,给大家进行讲解。

漏洞利用
首先我们分析dvwa高中低,三个级别代码有什么不同点
3.png
代码行数不超20行,所以核心代码就是两个if语句之间的句子。你看到shell_exec这个命令,就是执行命令句子。没有进过任何修饰,直接就执行ping命令。所以造成漏洞产生,直接执行ping命令是没有问题,如果你是一名测(hei)试(ke)人员,你就不会这样想,你的任务就是最全面进行测(zhuang)试(bi)。如果你对shell_exec函数一无所知,那么请参考一下文章进行恶补<pre>http://www.php100.com/html/php/hanshu/2013/0905/4680.html<;/pre>
4.png
你看到这个页面应该比较熟悉,和在dos窗口下执行命令一样,返回了ping结果操作。利用方式该怎么利用呢,可以利用;或者是&&进行对命令进行分割。
5.png
命令执行就是利用此漏洞进行最大限度利用,我们发现可以查看passwd文件。可以查看一些用户,利用这些用户组成相对应字典,对此服务器进行相对应暴力破解。
6.png
如果是window我们可以这样利用,进行增加用户名和密码。如果你不知道net user是什么意思,请大家自行补充一下知识。
不过给大家准备了一份常见dos命令表,如果你不清楚,请牢记,如果清楚,请跳过此节。
【常用DOS命令】

查看版本:ver
查看权限:whoami
查看配置:systeminfo
查看用户:net user
查看进程:tasklist
查看正在运行的服务:tasklist /svc
查看开放的所有端口:netstat -ano
查询管理用户名:query user
查看搭建环境:ftp 127.0.0.1
查看指定服务的路径:sc qc Mysql
添加一个用户:net user redBu11 redBu11  /add
提升到管理权限:net localgroup administrators redBu11 /add
添加用户并提升权限:net user redBu11 redBu11  /add & net localgroup administrators redBu11 /add
查看制定用户信息:net user redBu11
查看所有管理权限的用户:net localgroup administrators
加入远程桌面用户组:net localgroup “Remote Desktop Users” redBu11 /add
突破最大连接数:mstsc /admin /v:127.0.0.1
删除用户:net user redBu11 /del
删除管理员账户:net user administrator redBu11.asd
更改系统登陆密码:net password redBu11.asd
激活GUEST用户:net user guest /active:yes
开启TELNET服务:net start telnet
关闭麦咖啡:net stop “McAfee McShield”
关闭防火墙:net stop sharedaccess
查看当前目录的所有文件:dir c:windows\
查看制定文件的内容:type c:windows1.asp
把cmd.exe复制到c:windows的temp目录下并命名为cmd.txt:copy c:windowstempcookiescmd.exe c:windowstempcmd.txt
开3389端口的命令:REG ADD HKLMSYSTEMCurrentControlSetControlTerminal” “Server /v fDenyTSConnections /t REG_DWORD /d 0 /f
查看补丁:dir c:windows>a.txt&(for %i in (KB952004.log KB956572.log KB2393802.log KB2503665.log KB2592799.log KB2621440.log
KB2160329.log KB970483.log KB2124261.log KB977165.log KB958644.log) do @type a.txt|@find /i “%i”||@echo%i Not Installed!)&del /f /q /a a.txt

分析完初级代码以后,我们接着分析中级代码,中级代码比初级多了哪些函数
7.png
我们发现发了一个数组,另外多了一个str_replace这个函数,是什么意思呢,主要是指如果接收的ip中,带有&&和;的话就自动替换成空。
8.png
我们把等级换成中级以后,发现页面不会有任何提示,也不会像初级那样给出一些提示。
9.png
后来我们换个思路,用了一个数组里面没有的符号,进行操作。发现又可以绕过了。其实测试就是按照不同思路进行不同符号测试,只要不再白名单中,都可以进行绕过。中级分析完以后再分析高级部分,看看高级部分添加了符号,防止我们进行代码执行。
10.png
高级部分进行了小数点分割,而且利用is_number函数进行强制分割,如果不是ip不会进行显示。
11.png
如果高级部分还采用中级绕过方式,会提示我们无效ip。这里首先也是用stripslashes函数对获取到的IP地址进行了处理,主要是为了去掉转义后添加的斜杠,原因之前已经解释过,由于在high级别下会自动启用PHP的magic_quotes_gpc魔术引号,对所有的传值数据自动用addslashes()函数转义,所以需要用stripslashes()函数去除。
接下来使用了explode函数,以“.”为分隔符将$target变量中的IP地址进行分割,分割后会得到一个数组,并赋值给变量$octet。
接下来使用if语句,用is_numeric函数依次判断$octet数组中的每个值是否是数字型数据,并且还使用sizeof函数判断$octet数组中元素的个数是否是4个。这个判断条件就非常苛刻了,基本可以保证用户输入的必须是正确的IP地址,之前所使用的所有命令执行漏洞都无法生效了。
但是这里的问题也同样明显,这种过滤方法只能针对命令参数是IP地址的情况才起作用,如果我们希望去执行的是其它的系统命令,这种方法就不起作用了。
12.png
看bwapp命令执行还没有就这么一个,也给大家把代码贴出来了。Bwapp就不给大家讲解了。直接进行实例挖掘,这样可能更实例理解一点。
本次漏洞挖掘工具Firefox+notepad++
本次挖掘的cms为phpmywind,由于cms市场比较多,所以在选择性上也会选择一些以前旧版本,这样漏洞会多一些,对于讲解也会容易一些。目前最新版本为5.3,不会选择新版本测试。
13.png
14.png
这个是本机上面的cms,由于在审计前,需要大家进行下载安装,本次环境依然采用wamp进行测试。
每次分析前一定要对代码进行简单分析,才会更加熟悉代码,并且也要把环境搭建成功,看看界面有哪些功能,如果能黑盒进行简单渗透一下更好,如果不想黑盒,那可以直接来进行源代码。我的顺序一般是从index.php这个文件开始阅读,也会看看一些公共的配置文件,看看过滤哪些函数等。
15.png
配置文件你需要看一下。
16.png
从配置文件你还需要分析一下公共函数文件。
通过以上方式来进行熟悉代码以外,还可以进行安装好以后,尝试单击页面,看看都关联哪些文件
17.png
分析代码就给大家介绍到这里。由于我提前已经对代码进行简单分析了,所以直接就开始写过程了。如果你挖掘过几套代码执行的cms,就会发现一个问题,就会看到一个函数string2array,这个函数是什么意思呢,就是把字符转换成数组。前段时间挖掘过一个phpcms2008也是这个函数出现问题,导致代码执行。所以我们不尝先在代码中搜索一下看看哪里有引用这个函数。
18.png
通过搜索发现一共有三个文件引用了这个函数,所以我们的范围一下就缩小了很多。开始一个一个进行分析。
这个是在wooyun简单截个图,也是这个函数产生的问题,不一定所有的代码执行都是这个问题,至于我找到了几个代码执行,都是这样产生的。
19.png
我们在本地搭建一套phpcms2008源码,给大家进行演示命令执行。搭建完以后显示的效果。
20.png
由于是版本比较老,所以在搭建是出现的几个问题。简单给大家科普一下,如果你想搭建成功这套老版本的cms,需要5.2版本以前的mysql,才可以搭建成功,如果你的mysql版本比5.2版本大,你是搭建不成功这套源码。在最后一步建立数据库时,一直会报错。所以为了避免以上错误,希望大家选取5.2以前的mysql。
这是源码的大概一个文件和文件夹,里面会有一些核心文件,我也给大家分析过,从入口文件开始进行分析,查看核心函数文件,以及查看一些过滤函数或者搭建成功以后先进行黑盒进行测试,如果发现某一个地方有问题,但是黑盒就是测试不成功,可以把源码文件进行分析,最后找到漏洞。
21.png
入口文件标识很清楚,进入核心配置文件,查看其代码
22.png
红框标注文件,在此文件夹比较重要,要细致分析,避免放过漏洞。
23.png
经过对文件大量的分析,简单逻辑我们可以找到了。由其上文中给大家介绍过的那样,如果想找漏洞,一定要知道其中有哪些关键函数我们可以控制,另外在代码中,最容易出现的脆弱点是那个。我们看完配置文件,开始搜索一下string2array这个函数在什么地方出现过,重点来进行分析这个函数,根据上下文。
24.png
我们查找了容易出现问题的函数,最终发现大概有16个文件可能有问题,还有就是admin代表的是登陆后台部分,一般我们也不进行分析,那么只分析不是admin部分的地方。这样我们就可以省很大力气来进行审计。
25.png
后来进过分析,一共有几个文件这个string2array比较可疑,首先对common这个文件开始进行分析,40行以前是对模板的一个调用和修改,不用关心。
26.png
从上面往下面分析的时候,发现了这个extract这个函数文件,这个函数文件让我对这个文件有了兴趣。具体这个函数是什么意思,如果你不懂,我给大家一下连接自行脑补

http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2009/0723/3090.html 
http://www.oicto.com/php-extract-functio/</pre>
<?php
$a = 'Original';
$my_array = array("a" =&gt; "Cat","b" =&gt; "Dog", "c" =&gt; "Horse");
extract($my_array);
echo "\$a = $a; \$b = $b; \$c = $c";
?>

会把当前数组的值倒入到PHP extract() 函数从数组中把变量导入到当前的符号表中。所以上面的例子中把original的值已经修改。
27.png
28.png
接着我们分析一下函数模板文件,这个文件核心过滤文件,找到string2array这个函数以后,我们发现强制把字符转成数组的模式输出。过滤注入跨站的语句也在此文件中。我们发现只要data传过来,就可以执行,对data没有进行任何防护。
29.png
我们需要输入一个userid不存在的值,才会利用extact这个函数。所以我们输入一个不存在的值,查看结果输出什么呢?
30.png
成功输出phpinfo,证明我们猜想正确。命令执行就给大家介绍这么多。后续给大家介绍文件上传和下载以及逻辑漏洞。
本人博客:sec-redclub.com

 标签: none

作者  :  lyxw



关于我

about me

lyxw

联系我