去年处理某次安全事件时,我发现攻击者留下的webshell在日志中几乎不留痕迹。传统基于规则匹配的检测手段完全失效,最终是通过分析异常流量特征才定位到恶意请求。这次经历让我意识到,流量分析能力才是对抗高级webshell的终极武器。
webshell作为攻击者维持权限的"后门程序",其通信流量往往伪装成正常业务请求。Practice2这个靶场环境模拟了真实攻防场景中webshell的隐蔽通信,通过分析这类流量模式,我们可以掌握以下核心技能:
Practice2提供的pcap包包含以下关键特征:
建议使用Wireshark 3.6+版本分析,关键过滤语法:
bash复制http.request.method == "POST" # 重点检查POST请求
frame.time >= "2023-01-01" # 按时间范围筛选
tcp contains "eval" # 查找危险函数关键词
除了常规抓包工具,推荐以下专项分析工具链:
| 工具名称 | 用途 | 关键参数示例 |
|---|---|---|
| Tshark | 命令行提取特定字段 | -Y "http.request.uri contains 'admin'" |
| HttpReplay | 可视化重放HTTP会话 | --highlight "response.code==200" |
| CyberChef | 在线解码加密数据 | 使用Magic模块自动识别编码方式 |
实操提示:先使用Wireshark的"Export Objects > HTTP"功能导出所有传输文件,再用D盾等工具静态检测可疑脚本。
通过统计视图发现以下异常点:
请求间隔规律性
TCP窗口大小异常
TLS指纹可疑
python复制# 检测到非常用密码套件
if 'TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256' in pcap:
alert('可能为C2通信')
恶意请求普遍存在:
通过正则匹配发现可疑路径:
regex复制/(admin|manage|tmp)\/[a-f0-9]{32}\.(php|jsp)/i
针对加密流量的处理步骤:
bash复制python xorbrute.py -f payload.bin -l 4 -c 20
yara复制rule webshell {
strings: $eval = "eval(" nocase
condition: $eval and filesize < 10KB
}
部署以下检测脚本到Zeek(Bro):
bro复制event http_message_done(c: connection, is_orig: bool, stat: http_message_stat)
{
if (c$http?$uri && /cmd=.*&pwd=[a-f0-9]{32}/ in c$http$uri) {
NOTICE([$note=Webshell::Activity,
$conn=c,
$msg=fmt("可疑的webshell参数: %s", c$http$uri)]);
}
}
针对加密webshell的改进规则:
suricata复制alert http any any -> $HOME_NET any (
msg:"ET WEB_SHELL Base64 Encoded PHP Exec";
flow:established,to_server;
content:"POST"; http_method;
content:"=eval"; http_client_body;
content:"base64_decode"; nocase;
pcre:"/=\s*eval\s*\(\s*base64_decode\s*\(/i";
metadata:former_category WEB_SHELL;
classtype:web-application-attack;
sid:2023156;
)
使用Argus生成流量统计特征:
code复制ra -r practice2.pcap -s stime flgs proto sbytes dbytes \
-c , > flow_features.csv
关键特征维度:
攻击者常用手法:
检测方法:
python复制def check_time_anomaly(req_time, file_mtime):
delta = abs((req_time - file_mtime).total_seconds())
if 60 < delta < 300: # 1-5分钟差异
return True
return False
通过以下特征发现无文件webshell:
bash复制grep -P 'eval|assert|popen' /proc/[0-9]*/maps
c复制// 检测匿名共享内存
if (shm->flags & SHM_ANON) && shm->size > 4096:
audit_alert("SUSPICIOUS_SHM")
检测ICMP/DNS隐蔽通信:
wireshark复制# DNS隧道特征
dns.qry.name matches /[a-z0-9]{32}\.com/ &&
dns.qry.type == TXT &&
frame.len > 512
| 层级 | 检测手段 | 覆盖场景 |
|---|---|---|
| 边界 | NTA+IPS联动 | 已知漏洞利用 |
| 主机 | EDR行为监控 | 内存webshell |
| 日志 | SIEM关联分析 | 低频渗透活动 |
| 流量 | 全流量审计 | 加密信道通信 |
初级筛选
深度分析
sql复制SELECT src_ip, COUNT(*)
FROM http_log
WHERE uri LIKE '%=cmd%'
GROUP BY src_ip
HAVING COUNT(*) > 3;
关联溯源
禁用危险函数(nginx示例):
nginx复制location ~* \.php$ {
fastcgi_param PHP_ADMIN_VALUE "
disable_functions =
exec,passthru,shell_exec,system,
proc_open,popen,curl_exec,curl_multi_exec,
parse_ini_file,show_source";
}
实施微隔离的iptables规则:
bash复制# 限制Web服务器出站
iptables -A OUTPUT -p tcp --dport 80 -j REJECT
iptables -A OUTPUT -p tcp --dport 443 -j REJECT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
关键日志采集项:
常见误判场景处理:
| 误报类型 | 判别方法 | 处置建议 |
|---|---|---|
| 文件上传 | 检查Content-Disposition头 | 添加业务白名单 |
| 管理接口 | 验证认证头+源IP | 建立合法访问基线 |
| 监控探测 | 分析User-Agent合法性 | 更新检测规则阈值 |
处理流程示例:
mermaid复制graph TD
A[触发告警] --> B{是否已知业务?}
B -->|是| C[加入白名单]
B -->|否| D{是否高危特征?}
D -->|是| E[立即阻断]
D -->|否| F[人工研判]
推荐进阶研究材料:
实战训练建议:
在真实环境中,我发现最有效的检测策略是组合以下要素:
最后分享一个快速验证技巧:对可疑流量执行tcp.reconstruct_stream()后,用vim的xxd模式查看16进制视图,往往能发现隐藏的PE文件头或脚本特征。