Linux主机入侵排查基础

admin 2025年6月11日19:20:18评论18 views字数 9129阅读30分25秒阅读模式

0x00 前言

主要介绍下Linux下入侵排查的基础姿势;

0x01 入侵现象

异常现象

  • 服务器异常现象

    • CPU/内存飙升

    • 服务器卡顿

    • 异常流量

    • 异常网络连接

    • 服务器无法登录

    • ......

  • 僵尸网络

    • DNS服务器报毒

    • 挖矿

    • ......

  • 主机失陷

    • XnoteDDoS病毒

    • 挖矿

    • ......

0x02 入侵排查基础

排查思路

  • 使用工具进行日志分析

  • 查看进程和CPU负载情况

  • 使用lsof -i -PnR命令查看网络通信情况

  • 使用lsof+md5sum命令确认elf文件hash并通过搜索引擎获取相关威胁情报

系统信息

uname -a                        # 查看系统信息who                             # 查看当前用户ifconfig                        # 查看网络信息

端口连接

查看黑客是否进行进行远控,DDOS,篡改网卡类型,进行流量嗅探等操作;

步骤

1、可使用netstat命令分析可疑端口、可疑IP、可疑PID及程序进程,当然可灵活配合grep命令,获取需要的信息

netstat –an                                                 # 查看系统所有活动的socket连接netstat -utnpl                                              # 端口监听情况netstat -antlp | morenetstat -anop | grep -i listen                              # -p可打印出进程PIDnetstat -antlp | grep LISTEN | grep 1080                    # 检测本地socks代理lsof -i tcp                                                 # 查看TCP连接信息lsof -i udp                                                 # 查看UDP连接信息lsof -i:{port} -PnR                                         # 查看端口连接及相关进程

2、从安全网关或者其它途径获取可疑IP后,可监控与可疑IP通信的进程

while true; do netstat -antp | grep {ip}; done

3、有时检测到可疑域名,可在host文件中添加规则使可疑域名重定向到一个随机的IP地址,然后对其进行监控并获取到与之通信的进程

vim /etc/hosts192.168.53.23 xxx.evil.com                                 # 写入/etc/hosts尾部while true; do netstat -antp | grep 192.168.53.23; done    # 获取通信进程

4、查看相关进程文件

ip link | grep PROMISC                                      # 正常网卡不该在promisc模式,可能存在snifferarp -a                                                      # 查看arp记录是否正常lsof -i:port -PnR                                           # 显示使用该端口的进程PIDls -l /proc/$PID/exe                                        # 查看pid对应进程文件路径file /proc/$PID/exe                                         # 查看pid对应进程文件路

5、流量抓取

Linux下可使用tcpdump抓包并在windows下使用wireshark、科来等软件进行分析,tcpdump抓包具体可参考该博客;

应急处理

在确认有可疑网络连接后可使用iptables屏蔽相关网络ip或域名;

iptables -A OUTPUT -d {IP} -j DROP                      # 屏蔽IPiptables -I INPUT -p tcp --dport 443 -m string --string "xxx.xxx" --algo bm -j DROP    #封锁域名

进程排查

定位进程

1、查看进程

ps -auxps -eftop -ctop -b -n 1                            # 只显示异常所有进程信息pstree -a

2、查看进程关联文件

lsof -p {pid}                             # 查看进程所打开的端口和文件lsof -i:port                              # 查看端口对应进程lsof -c {progressname}                    # 查看进程关联文件lsof -g {gid}                             # 查看相关联的lib文件strace -f -p {pid}                        # 跟踪分析目标进程ls -al /proc/$PID/exe                     # 查看pid对应进程文件路径file /proc/$PID/exe                       # 查看pid对应进程文件路径lsof filename                             # 查看打开目标文件的所有进程pmap -q {pid}                             # 分析可疑进程内存

3、检测/etc/inetd.conf文件,内容为本机所开启的远程服务;

查看隐藏进程

ps -ef | awk '{print}' | sort -n | uniq >1ls /proc | sort -n | uniq >2diff 1 2

应急处理

1、清除可疑进程的进程链

ps -elf {pid}kill -9 {pid}

2、删除病毒文件

ls -al /proc/{PID}/exerm -rf {exe_path}

服务排查

基础

1、进程PID有以下默认分配规则:

  • 0:不使用;

  • 1-1023:系统保留,只能由root用户使用;

  • 1024-4999:由客户端自由分配;

  • 5000-65535:由服务器端程序自由分配;

2、可通过查看/etc/services文件来获取网络服务,内容字段从左往右依次为:“服务名称”、“使用端口”、“协议名称”以及“别名”;

服务启动设置

1、使用chkconfig [-level 运行级别] [独立服务名] [on|off]命令设置,例如:

chkconfig -level 2345 httpd on                        # 开机自启

关于level如果未指定默认是2345,其中数字含义如下:

  • 0:关机

  • 1:单用户模式

  • 2:无网络连接的多用户命令行模式

  • 3:有网络连接的多用户命令行模式

  • 4:不可用,系统保留

  • 5:图形界面下的多用户模式

  • 6:重启

notes:可通过runlevel命令查看系统运行级别;

2、修改/etc/rc.d/rc.local文件,加入以下内容:

/etc/init.d/httpd start

3、使用ntsysv命令管理自启动,可管理独立服务和xinetd服务;

应急处理

1、查看服务

chkconfig --list                                                     # 查看服务自启动状态,可看到所有RPM包安装服务chkconfig --list | grep "3:on|5:on"ps aux | grep crond                                                  # 查看当前服务service --status-all                                                 # 查看所有服务systemctl | grep -E ".service.*running" | awk -F. '{ print $1 }'    # 查看所有服务

2、查看源码包安装的服务,一般是以下目录

  • /usr/local/

  • /etc/rc.d/init.d/

3、删除相关服务

chkconfig --del servicename                             # 删除RPM包服务

启动项排查

基础

  • init:文件名,是系统启动的第一个脚本;

  • init.d:目录名,目录内存放各个服务的启动脚本,例如sshd, httpd等;

  • rcX.d:目录名,X代表运行级别,目录内有每个服务在init.d内启动脚本的链接文件,根据链接文件的名字来的启动状态;

    • K开头表示系统加载时时关闭的服务,S开头表示系统加载时启动的服务;

当需要开机自启动程序时,只需要将脚本复制到/etc/init.d目录下,然后在/etc/rc.d/rc*.d中建立软链接即可。例如:

ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh

排查

Linux下启动项路径一般有:

/etc/init.d//etc/xinetd.d/etc/init.d/rc.local/etc/rc.local/etc/rc.d/rc[0~6].d/etc/profile.d/

1、查看这些目录下有无可疑脚本,例如:

ls -alt /etc/init.d/

2、查看这些目录修改时间,如:

stat /etc/rc.local

计划任务排查

基础

默认编写的crontab文件会保存在 /etc/crontab或/var/spool/cron/username下;

1、计划任务查询命令如下:

crontab -u username -l             # 列出目标用户cron服务的详细内容crontab -r                         # 删除每个用户cront任务(谨慎:删除所有的计划任务)crontab -e                         # 使用编辑器编辑当前的crontab文件

2、使用anacron实现异步定时任务调度:

vim /etc/anacrontab@daily 10 example.daily /bin/bash /home/backup.sh

排查

使用more命令查看以下目录中是否有恶意脚本:

  • /var/spool/cron/*

  • /var/spool/anacron/*

  • /var/log/cron

  • /etc/crontab

  • /etc/cron.d/*

  • /etc/cron.daily/*

  • /etc/cron.hourly/*

  • /etc/cron.monthly/*

  • /etc/cron.weekly/*

  • /etc/anacrontab

账户排查

当前活动账户

1、使用w命令查看当前用户活动会话,并显示用户正在执行的指令;

Linux主机入侵排查基础

2、使用who命令查询utmp文件并报告当前登录的每个用户,who的缺省输出包括用户名、终端类型、登录日期及远程主机(tty本地登陆  pts远程登录);

3、使用users命令打印当前登录的用户,每个用户名对应一个登录会话;

4、使用uptime命令查看机器开机时间、用户数和负载情况:

Linux主机入侵排查基础

系统账户

通过查看/etc/passwd和/etc/shadow文件可获取系统中所有有效账户;

1、/etc/passwd中一行表示一个账户,其形式如下:

root:x:0:0:root:/root:/bin/bash

其组成形式为:用户名:密码:用户ID:组ID:用户说明:主目录:登陆之后shell

notes:无密码只允许本机登陆,远程不允许登陆;

2、/etc/shadow存储了用户密码HASH,其形式如下:

root:$6$Bd3Hypzt$Vm2ryb4lXyFBO/tJeYcs6CFir46/PulD/thwhOX1hyS7qLRn8riOeblxFv8gG74z11YuBy/HMKQcICRpK7Oz60:16662:0:99999:7:::

组成形式为:户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留

3、可通过/etc/sudoers文件查看具有sudo特权的账户

more /etc/sudoers | grep -v "^#|^$" | grep "ALL=(ALL)" # 查看看具有sudo权限的账户

用户登录检查

主要命令如下:

last                                            # 查看系统的成功登录、关机、重启等情况,数据源为/var/log/wtmp, var/log/btmplastb                                           # 查看登录失败情况,读取var/log/btmplastlog                                         # 查看用户上一次登录情况,读取/var/log/lastloglast -x reboot                                  # 查看重启记录last -x shutdown                                # 查看关机记录

notes:/var/log/lastlog记录登录的用户,/var/log/secure记录大多数应用的账户和密码与登录成功与否。/var/log/messages记录运行信息和认证信息,对于追查恶意用户的登录行为有很大帮助;

应急处理

1、查看特权、新增、修改账户 

less /etc/passwd                                                   # 查看是否有新增用户ls -l /etc/passwd                                                  # 查看passwd最后修改时间awk -F: '$3==0 {print $1}' /etc/passwd                             # 查看是否存在特权用户awk '/$1|$6/{print $1}' /etc/shadow                              # 查看可远程登录账户cat /etc/passwd  | grep -E "/bin/bash$"                            # 查看可登陆账户more /etc/sudoers | grep -v "^#|^$" | grep "ALL=(ALL)"            # 查看看具有sudo权限的账户awk -F: '{a[$3]++}END{for(i in a)if(a[i]>1)print i}' /etc/passwd   # 检查UID相同的用户,防止克隆用户more /etc/group | grep -v '^#' | gawk -F: '{if ($1!="root"&&$3==0) print $1}'  # 检测root组用户more /etc/ssh/sshd_config |grep PermitEmptyPassword | grep -v "#"awk -F: 'length($2)==0 {print $1}' /etc/shadow                     # 查看是否存在空口令用户

notes:需要检查/etc/passwd文件权限,其默认权限为644。另外UID为0的账户不一定为可疑账户;

2、禁用或删除多余及可疑账户

usermod -L username                                      # 禁用账户,账户无法登录userdel username                                         # 删除用户userdel -r username                                      # 删除用户,并将/home/username目录一并删除

历史命令排查

通过.bash_history查看账户执行过的命令。运气好可能通过记录关联到如下信息:

  • wget 远程某主机(域名&IP)的远程文件;

  • 尝试连接内网主机(ssh, scp),便于分析攻击者意图;

  • 打包某敏感数据或代码(tar, zip等命令);

  • 对系统进行配置,包括命令修改、远控木马类,可由此找到攻击者关联信息;

历史记录查看

1、使用history命令查看root的历史命令;

2、打开/home各账户目录下的.bash_history,查看对应账户的历史命令;

常见的过滤命令如下:

more /root/.bash_history | grep -E "((wget|curl).*.(sh|pl|py))" | grep -v grep    # 查看下载的脚本文件history | egrep "(useradd|groupadd)" | grep -v grep                                # 查看新增用户history | egrep "(userdel|groupdel)" | grep -v grep                                # 查看已删除账户history | grep sz | grep -v grep | awk '{print $3}'                                # 查看文件下载历史记录more /root/.mysql_history                                                          # mysql操作历史history | grep -E "(whois|sqlmap|nmap|beef|nikto|john|ettercap|backdoor|proxy|msfconsole|msf)" | grep -v grep  # 查看可疑命令

打开/home目录下各账户目录下的.bash_history,可查看该账户执行的历史命令,运气好可找到如下信息:

  • 对系统进行配置,包括命令修改、远控木马类,可找到攻击者关联信息;

  • 尝试连接内网某主机(sshscp),便于分析攻击者意图;

  • 打包某敏感数据或代码,tarzip 类命令;

  • wget远程某主机(域名&IP)的远控文件;

notes:如果黑客使用history -c清理相关的日志,使用cat ~/.bash_history仍可查看相关的记录;

加固

1、保存1万条命令

sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile

2、为历史命令增加登录IP、执行命令时间等信息

在/etc/profile文件尾部添加如下配置信息:

USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`if [ "$USER_IP" = "" ]thenUSER_IP=`hostname`fiexport HISTTIMEFORMAT="%F %T $USER_IP `whoami` "shopt -s histappendexport PROMPT_COMMAND="history -a"

3、配置生效

source /etc/profile

文件排查

webshell检测

直接将web服务打包服务到windows下然后使用D盾查杀,或直接用命令匹配关键字;

RPM check检测

1、检测rpm安装包命令是否被篡改

rpm -Va                 # 列举全部软件包的变化情况

如果一切均校验正常将不会产生任何输出,如果有不一致的地方,就会显示出来,输出格式是8位长字符串。每个字符都用以表示文件与RPM数据库中一种属性的比较结果 ,如果是. (点) 则表示测试通过。验证内容中的8个信息的具体内容如下:

  • S:文件大小是否改变

  • M:文件的类型或文件的权限(rwx)是否被改变

  • 5:文件MD5校验是否改变(可以看成文件内容是否改变)

  • D:设备中,从代码是否改变

  • L :路径是否改变

  • U:文件的属主(所有者)是否改变

  • G:文件的属组是否改变

  • T:文件的修改时间是否改变

2、如果检测出命令被替换,可使用以下命令还原回来:

rpm -qf /bin/ls                            # 查询ls命令属于哪个软件包mv /bin/ls /tmprpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.e16.i686.rpm | cpio -idv ./bin/ls         # 提取rpm包中的ls并复制到到当前目录cp ./bin/ls /bin/

敏感文件检测

1、敏感目录分析

查看是否存在文件变更或篡改:

  • /tmp, /var/tmp, /dev/shm, /etc/init.d/目录下是否有可疑文件;

  • /usr/bin, /usr/sbin目录是否存在命令替换;

2、可通过计算文件的md5值来判断常用命令(ls, find ,ps, top, who, last, chsh, passwd, cat, crontab, netstat等)是否被修改或替换

whereis psmd5sum /usr/bin/ps

3、可用stat和ls命令查看命令文件修改日期来判断其是否被修改

ls -alt /bin/                                      # 按时间逆序查看文件stat /usr/local/bin                                # 查看文件详情

4、对敏感目录文件进行文件类型检查

file {filename}

5、查找特权文件

find / *.jsp  -perm 4777find / -user root -perm -4000 -print 2>/dev/nullfind / -perm -u=s -type f 2>/dev/nullfind / -user root -perm -4000 -exec ls -ldb {} ;

6、查找隐藏文件

ls -al /tmp

7、分析新增/修改文件(如某网站在一天前被篡改,根据确定时间去反推变更的文件)

find /var/www/html -iname "*" -atime 1 -type f                                  # 找出一天前访问过的文件find / -ctime 2                                                                 # 最近使用文件find /etc/ /usr/bin/ /usr/sbin/ /bin/ /usr/local/bin/ -type f -mtime 7          # 最近修改文件

8、确定可疑文件后,查找打开该文件的进程

lsof {filename}       # 查看打开目标文件的所有进程

Others

系统配置检查

1、分析系统路径和配置,查看有无可疑信息

echo $PATHcat /etc/profilecat /etc/profile.d/cat /etc/bashrc

2、分析用户配置

cat ~/.bash_profilecat ~/.bashrccat ~/.bash_logincat ~/.bash_logout

3、查看DNS配置和HOSTS文件

cat /etc/resolv.confcat /etc/hosts

4、查看预加载库

echo $LD_PRELOADunset $LD_PRELOAD                            # 如发现该变量被篡改,可解除该变量./busybox cat /etc/ld.so.preload             # 绕过hook后门隐藏strace -f -e trace=file /bin/cat             # 跟踪文件系统调用access("/etc/ld.so.preload",R_OK)lsattr /etc/ld.so.preload                    # 清理后门配置echo > /etc/ld.so.preload

5、文件分析

strings /usr/bin/.sshd | egrep '[1-9]{1,3}.[1-9]{1,3}.'          # 二进制文件字符串检索readelf {filename}                                                 # elf文件分析ldd {filename}                                                     # 文件分析

ssh后门检测

1、配置检查

strings /usr/bin/.sshd | egrep '[1-9]{1,3}.[1-9]{1,3}.'                                     # 查看sshd文件是否包含IP信息ssh -V                                                                                        # 查看ssh版本stat /usr/sbin/sshd                                                                           # 查看sshd文件时间stat /etc/ssh/sshd_config                                                                     # 查看ssh配置文件时间

2、跟踪ssh进程

ps aux | grep sshd | grep -v grep                                                 # 获取ssh进程pidstrace -o aa.out -ff -p {PID}grep open aa.out* | grep -v -e No -e null -e denied| grep WR

3、查看ssh相关目录是否存在可疑的公钥

ls -la /etc/sshmore ~/.ssh/id_rsamore /root/.ssh/id_rsals -la /root/.ssh/*.pubfind / -name authorized_keysstat /root/.ssh/authorized_keys

PAM后门检测

1、检查pam_unix.so的修改时间

stat /lib/security/pam_unix.so                # 32位stat /lib64/security/pam_unix.so              # 64位

2、pam配置文件检查

stat /etc/pam.d/sshdvim /etc/pad.d/sshd

3、通过strace跟踪ssh

ps aux | grep sshd                                                 # 获取ssh进程pidstrace -o out.txt -ff -p {PID}grep open out.txt* | grep -v -e No -e null -e denied| grep WR

strace后门排查

1、使用alias命令即可发现异常;

2、strace跟踪strace

ps -aux | grep stracestrace -o out.txt -ff -p {PID}

之后再调用内核ptrace特性来进行排查;

0x03 重要安全处置命令

1、有些病毒文件会自动修改crontab,这时可使用chattr命令来锁定目录:

chattr +i {pathname}

2、使用lsattr可显示文件属性:

lsattr filename

输出结果若为:----i--------,则表明没有删除权限;

3、在删除一些病毒文件时要先去除其执行权限,避免在删除操作时被恶意攻击:

chmod 000 {filename}

0x04 总结

Linux下恶意软件以僵尸网络蠕虫和挖矿病毒为主。由于Linux大多作为服务器暴露在公网,且Web应用漏洞层出不穷,所以很容易遭受大范围入侵,如常见的病毒:DDG, systemdMiner, BillGates, watchdogs, XorDDos等。平时使用时要使用高强度密码,并及时升级系统(包括使用的组件)、打补丁,做好安全防范;

原文始发于微信公众号(98KSec):Linux主机入侵排查基础

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月11日19:20:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Linux主机入侵排查基础https://cn-sec.com/archives/846803.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息