本文最后更新于 2024-09-12,文章内容可能已经过时。

Linux入侵排查常用命令

一、账号安全

  1. 查看用户信息文件,检查有无UID为0的用户、有无新增的未知用户

    cat /etc/passwd | grep /bin/bash        #查看可登录用户
    awk -F: '$3==0{print $1}' /etc/passwd      #查看UID=0的用户
    more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"    #查看sudo权限的用户
    

    image-20240912202743740

    image-20240912202805161

    image-20240912202838292

  2. 查看当前登录用户及登录时长

    who、uptime、w

    # who 命令,查看当前登录系统的所有用户(tty 本地登陆  pts 远程登录)
    # uptime 命令,查看登陆多久、多少用户,负载状态
    # w 命令,显示已经登录系统的所用用户,以及正在执行的指令
    [root@192 ~]# w
     06:48:14 up  8:03,  6 users,  load average: 0.00, 0.02, 0.05
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    root     tty1                      04:17    1:30m  2.28s  2.28s -bash
    root     pts/0    192.168.219.1    04:27    2:14m  0.07s  0.00s vi test.py
    root     pts/1    192.168.219.1    05:01    1:38m  0.09s  0.09s -bash
    

    image-20240912202912699

  3. 排查用户登录信息

  4. 查看最近登录成功的用户及信息

    last

       [root@localhost ~]# last
       root     pts/0        192.168.219.1    Tue Feb 15 21:06   still logged in   
       root     pts/1        192.168.219.1    Tue Feb 15 18:30 - 19:49  (01:18)    
       root     pts/0        192.168.219.1    Tue Feb 15 15:00 - 17:32  (02:31)    
       root     tty1                          Tue Feb 15 14:41   still logged in   
       reboot   system boot  3.10.0-1160.el7. Tue Feb 15 14:00 - 21:06  (07:06)    
       wtmp begins Tue Feb 15 14:00:13 2022
       # 显示logged in表示用户还在登录
       # pts表示从SSH远程登录
       # tty表示从控制台登录,就是在服务器旁边登录
    
  5. 查看最近登录失败的用户及信息

    latsb

       [root@localhost ~]# lastb
       root     ssh:notty    192.168.219.1    Tue Feb 15 21:13 - 21:13  (00:00)    
       root     ssh:notty    192.168.219.1    Tue Feb 15 21:13 - 21:13  (00:00)    
       root     ssh:notty    192.168.219.1    Tue Feb 15 21:13 - 21:13  (00:00)    
       root     ssh:notty    192.168.219.1    Tue Feb 15 21:13 - 21:13  (00:00)    
       root     tty1                          Tue Feb 15 14:41 - 14:41  (00:00)    
       btmp begins Tue Feb 15 14:41:47 2022
       # ssh表示从SSH远程登录
       # tty表示从控制台登录
    
  6. 显示所有用户最近一次登录信息

    lastlog

       [root@localhost ~]# lastlog
       Username         Port     From             Latest
       root             pts/2    192.168.219.1    Wed Dec  8 05:17:57 -0500 2021
       bin                                        **Never logged in**
       daemon                                     **Never logged in**
       ......                                       ......
       ......                                     ......
       postfix                                    **Never logged in**
       chrony                                     **Never logged in**
       mysql                                      **Never logged in**
       zhang            pts/1                     Fri Nov 19 13:07:34 -0500 2021
    

image-20240912205903784

二、查询异常端口与进程

  1. 查看端口连接情况,分析可疑端口、IP、PID等信息

    netstat -antlp | more
    

    image-20220329100611477

  2. Local Address(本地地址)

    查看有无重要端口被连接,如 22,3306等。

  3. Foreign Address(外部地址)

    查看有无非常用IP或可疑IP连接。

    IP可以使用在线危险情报平台检索,如微步在线。

  4. PID/Program name(PID/程序名称)

    查看是否有可疑程序,如上面的截图中的bash,可能为bash执行反弹shell。

    注:若发现有异常连接需要持续观察,可以进行抓包获取流量,而后使用相关工具分析。

     # 将ens33网卡上目的端口为tcp 80端口的流量保存到target.pcap文件中
     tcpdump tcp and dst port 80 -i ens33 -w ./target.pcap
    

    将保存后的target.pcap文件放入流量分析工具如:wireshark等进行分析

  5. 检查可疑进程

  6. 使用 ps 列出系统中当前运行的那些进程,分析异常的进程名、PID,可疑的命令行等。

       [root@192 ~]# ps aux
       USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
       root          2  0.0  0.0      0     0 ?        S    Dec07   0:00 [kthreadd]
       .....
       root       7263  0.0  0.1 115548  1932 pts/3    S+   06:35   0:00 bash -i
       root       7267  0.0  0.1 155452  1864 pts/4    R+   06:35   0:00 ps aux
    

    此处PID为7263的进程所执行的 “ bash -i ”是十分可疑的,极有可能为反弹shell执行的命令。 我们可以使用“ kill -9 7263” 强制结束进程。

  7. 通过top命令显示系统中各个进程的资源占用状况,如发现资源占用过高的进程可以进一步排查。

  8. 进程排查分析

       #查看该进程启动的环境变量与命令行等信息: 
       ps eho command -p $PID
       #查看该进程启动时候所在的目录: 
       readlink /proc/$PID/cwd
       #查看下pid所对应的进程文件路径:
       ls -l /proc/$PID/exe
    

三、查询系统服务

  1. 查看自启服务

    # centos7 查看自启服务
    systemctl list-unit-files --type=service | grep "enabled"
    # centos6 查看自启服务
    chkconfig  --list  
    chkconfig --list | grep "3:on\|5:on"
    

image-20240912210550501

四、查询开机启动项

  1. 开机启动配置文件

  2. /etc/rc.local ,是/etc/rc.d/rc.local的软连接,用于添加开机启动命令。

  3. /etc/rc.d/rc[0~6].d , 各个启动级别的执行程序连接目录,系统的标准的运行级为3(完全多用户模式)。

  4. 排查入侵项

    # 查看rc.local中有无异常的开机启动命令
    more /etc/rc.local
    # 查看 /etc/rc.d/rc[0~6].d
    ls -l /etc/rc.d/rc3.d/            # 查看运行级别为3的执行程序连接目录下有无异常脚本
    

image-20240912210835379

五、查询定时任务

  1. cron相关文件

  2. /etc/crontab ,配置文件,配置 cron 任务运行环境变量等。

    image-20240912210940478

  3. /var/spool/cron/ ,存放着每个用户的crontab任务,每个任务以创建者的名字命名。

  4. /etc/cron.d/ ,此目录下存放的是系统级任务的任务文件。

  5. /etc/anacrontab ,这个文件存着系统级的任务。它主要用来运行每日的(daily),每周的(weekly),每月的(monthly)的任务。一般不在此文件安装自己的任务。

    image-20240912214733181

  6. /etc/cron.hourly//etc/cron.daily//etc/cron.weekly//etc/cron.monthly/等目录存放要在指定时间周期执行的脚本。

  7. 定时任务排查

    # 查看当前用户的cron(定时)任务
    crontab -l
    # crontab任务编辑
    crontab -e 
    # 删除当前用户的定时任务
    crontab -r
    # 查看以下目录中是否存在恶意脚本
    /etc/cron.d/*
    /etc/cron.daily/* 
    /etc/cron.hourly/* 
    /etc/cron.monthly/*
    /etc/cron.weekly/
    /var/spool/anacron/*
    

六、查询异常文件

  1. 查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以“.”为开头的文件目录

  2. 若能得知远控木马的创建时间的范围,可根据时间查找文件

    # 查找最近一天以内修改的文件:
    find / -mtime -1 -ls  | more 
    # 常用参数 
    -amin n : 在过去 n 分钟内被读取过
    -atime n : 在过去 n 天内被读取过的文件
    

    image-20240912215107396

  3. .ssh目录下的公钥文件

image-20240912215342067

  1. 具备u+s权限的可执行程序
find / -perm /u=s -type f 2>/dev/null

# /:表示从根目录开始查找。可以根据需要更改为其他目录的路径。
# -perm /u=s:表示检查文件的权限,/u=s表示检查用户(u)的权限是否为s。
# -type f:表示只查找文件,不包括目录。
# 2>/dev/null:将错误信息重定向到/dev/null,以忽略没有权限访问某些目录时的错误信息。

image-20240912215519251

排查webshell木马:

//搜索目录下适配当前应用的网页文件,查看内容是否有Webshell特征
find ./ type f -name “.jsp" | xargs grep “exec(”
find ./ type f -name ".php” | xargs grep “eval(”
find ./ type f -name “.asp" | xargs grep “execute(”
find ./ type f -name ".aspx” | xargs grep “eval(”

//对于免杀Webshell,可以查看是否使用编码
find ./ type f -name “*.php” | xargs grep “base64_decode”

# xargs:将标准输入的数据转换为命令行参数。它会将 find 命令的输出传递给 grep。

七、查看历史命令

  1. 查询某个用户在系统上的历史命令

  2. 使用root用户登录系统,检查/home目录下该用户主目录的 .bash_history 文件

       [root@192 zhang]# cat .bash_history
    

八、查看系统日志

  1. secure安全日志文件(var/log/secure

    检查系统错误登陆日志,统计IP重试次数,成功登录的时间、用户名和ip,确认账号是否存在暴力破解或异常登录的情况。

  2. 查看有多少IP可能在爆破主机的root帐号。

     # 统计多少IP登录失败及失败次数
     grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
    
  3. 登录成功的IP。

     grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
    
  4. 登录成功的日期、用户名、IP。

     grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'   
    

image-20240912221459278