Linux应急响应排查

对于一般的Linux机器被入侵,第一要务是止损,止损的步骤如下。

  • 如果业务允许,最好先关停除ssh外的对外开放服务,因为往往拿到机器权限后没有办法第一时间锁定入侵源
  • 对入侵者的权限维持(反弹shell/后门…)进行查杀等操作(关键操作及时取证)

准备工作

  • 防止命令被替换,最好使用busybox进行排查,下载地址
    1
    2
    chmod +x busybox
    ./busybox COMMAND

进程

1) 通过pstree查看正常父进程下的异常子进程

1
2
3
4
5
pstree -aup
./busybox pstree -p
$
systemd─├─php-fpm───5*[php-fpm]
├─php-fpm───50*[php-fpm]

如果使用ps去查询进程,没有办法清晰的查看父子进程的关系,容易有遗漏,以下是在该机器上反弹shell后pstree得到的结果。

1
2
3
4
5
6
$
├─php-fpm,17883
├─php-fpm,17911,www
│ │ └─sh,11498 -c /bin/sh -c "cd "/data/wwwroot/default/dvwa";ping -c20 www.baidu.com;echo [S];pwd;echo [E]" 2>&1
│ │ └─sh,11499 -c cd /data/wwwroot/default/dvwa;ping -c20 www.baidu.com;echo [S];pwd;echo [E]
│ │ └─ping,11500 -c20 www.baidu.com

很清楚的看到php-fpm底下起了sh进程

2) 查看进程启动时间

使用ps命令列出进程时,可能由于进程较多,优先排查入侵时间附近的进程

1
2
3
4
5
ps -aux
$
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 191000 3932 ? Ss 806 16:41 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 806 0:00 [kthreadd]

3) 使用unhide查看隐藏进程

为了尽可能的维持权限,入侵者可能会将相关后门进程隐藏,隐藏的方式有以下几种

  • 替换top ps 等系统命令
  • 劫持文件ld.so.preload
  • 劫持libc库
  • 使用mount将其他目录挂载到/proc/pid
  • 修改内核(rootkit)

其中前三种可以使用unhide工具进行查杀,原因为前三种方式无法修改/proc下的文件信息,因此使用unhide调用系统函数读取proc再将读取的信息与ps做对比,即可发现隐藏进程。

针对挂载的隐藏方式,使用命令mount -l查看是否有到/proc下的挂载,有的话使用umount /proc/pid取消挂载,查看对应进程是否恶意

针对修改内核的隐藏方式,使用命令lsmod查看是否有加载异常模块, 但rootkit可删除struct module中的lsmod相关信息,从而躲避检测,具体可参考Rootkit技术(二)隐藏LKM

网络

1) 使用netstat命令检查已建立连接

1
2
3
4
5
netstat -antlp | grep EST
$
tcp 0 0 10.207.224.2:22 172.28.2.1:32971 ESTABLISHED 671/sshd: admin
tcp 0 0 10.207.224.2:19288 10.207.224.3:5555 ESTABLISHED 1896/bash
tcp 0 0 127.0.0.1:42008 127.0.0.1:1234 TIME_WAIT -

上述命令可监控如下场景

  • 反弹shell(进程名为bash/sh/python/php/java/perl等等)
  • 非正常ssh登录(企业中往往使用堡垒机登录机器,而黑客则会使用获得权限的机器进行横向渗透,因此非堡垒机的ssh连接均为异常连接)
  • 即使服务监听地址是127.0.0.1,也有可能通过端口反弹等形式反弹到外网,因此需要结合进程做判断

SSH

1) 查看SSH登录日志

1
cat /var/log/secure

登录失败的情况也需要关注,登录失败的ip可用于关联分析其他恶意行为,以及登录失败的日志也可能被用作后门,具体可参考 记一次安全应急响应中遇到的利用SSH日志触发的后门分析

2) 查看known_hosts

1
cat ~/.ssh/known_hosts

known_hosts文件会记录通过ssh,scp访问的计算机的ip以及公钥

3) pam相关

1
2
cat /etc/pam.d/sshd
ll /lib64/security/pam_unix.so

查看sshd的pam配置文件以及认证文件是否存在异常,具体可参考文章Linux PAM&&PAM后门

目录

  • 应用目录
    • Nginx: 查找nginx.conf配置文件,定位应用目录。检索目录下是否有异常文件(webshell)以及检索相应log日志是否有攻击或入侵痕迹
    • Apache: 查找apache2.confapache.conf等配置文件,定位应用目录。检索目录下是否有异常文件(webshell)以及检索相应log日志是否有攻击或入侵痕迹
    • webshell检测工具可使用长亭牧云
  • /tmp
  • /var/tmp
  • /dev/shm

history

  • 用户目录下的history(通过/etc/passwd定位用户目录,查询每个目录下的.bash_history文件)

启动项

  • inittab
    • inittab的启动脚本主要在/etc/rc.d下,配置文件则在/etc/inittab/etc/init/*.conf
  • systemd