Linux服务器入侵排查基础

1.账号安全

①检查用户信息文件/etc/passwd

    Linux 系统中的 /etc/passwd 文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读操作。

首先我们先了解一下这个文件包含哪些内容:

[root@test1 ~]#cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
...省略部分输出...

/etc/passwd文件中,每一行记录都对应一个用户,每个用户信息都以":"作为分隔符,划分为7个字段,以root用户为例,每一个字段的含义如下:
root:x:0:0:root:/root:/bin/bash

root x 0 0 root /root bin/bash
用户名 密码占位符 UID(用户ID) GID(组ID) 用户描述信息 宿主目录(用户家目录) 用户默认登录的shell

“x” 表示此用户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow 文件中,所以它在passwd文件中只是密码占位符

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

注意:无密码只允许本机登陆,远程不允许登陆

②检查影子文件/etc/shadow

    /etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。
    由于/etc/passwd文件允许所有用户读取,易导致用户密码泄露,因此 Linux 系统将用户的密码信息从 /etc/passwd 文件中分离出来,并单独放到了此文件中。
    /etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。如果这个文件的权限发生了改变,则需要注意是否是恶意攻击。

首先我们先了解一下这个文件包含哪些内容:

[root@test1 ~]#cat /etc/shadow
root:$6$la0iiDGd$wnyBHkI3gmMFF2SwvmdttozfhLoZJA62Dg0FY6rp9rkfYZOMznMNpPCL6IiutFsHRz2lsshq/qrKysd1X6X/i/:18619:0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::
...省略部分输出...

/etc/shadow文件与/etc/passwd文件一样,每一行记录都对应一个用户,每个用户信息都以":"作为分隔符,不同的是,/etc/shadow文件每行用户信息划分为9个字段,以root用户为例,每一个字段的含义如下:
root:$6…/i/:18619:0:99999:7:::

root $6…/i/ 18619 0 99999 7
用户名 加密后的密码 最后一次修改时间(算法是今天的时间减去jan,1,1970得到的时间间隔) 最小修改时间间隔,也就是用户最少多少天后才能改密码的天数(默认为0,表示可以在任何时间修改) 密码有效期,也就是用户最多多少天后一定要修改密码的天数,系统会强制用户修改密码(默认为99999,改为1 也能让密码改不了) 过期前多少天时间会被警告(改为-1 则永远不会提示) 密码过期后的宽限时间(过期后多少天内账号变为inactive状态,可登陆,但不能操作) 账号失效时间(多少天后账号会过期,无法登陆) 保留参数

    这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。需要注意的是:这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 "!"、"*" 或 "x" 使密码暂时失效。

扫描二维码关注公众号,回复: 12367171 查看本文章

③查看当前登录用户及登录时长

[root@test1 ~]#who   //查看当前登录系统的所有用户(tty:本地登录、pts:远程登录)
[root@test1 ~]#w     //显示已经登录系统的所有用户,以及他们正在执行的程序,单独执行 w 指令会显示所有的用户,也可指定用户名称,仅显示某位用户的相关信息
[root@test1 ~]#uptime  //查看登陆多久、用户个数,负载状态

④检查用户登录信息

#查看所有用户最近一次的登录信息
[root@test1 ~]#lastlog
#显示logged in表示用户还在登录
#pts表示从SSH远程登录
#tty表示从控制台登录,就是在服务器旁边登录

[root@test1 ~]#last  #详细显示用户最近登录信息,而不是最近一次

#在排查服务器的时候,黑客没有在线,可以使用last命令排查黑客什么时间登录的有的黑客登录时,会将/var/log/wtmp文件删除或者清空,这样我们就无法使用last命令获得有用的信息了。
#在黑客入侵之前,必须使用chattr +a对/var/log/wtmp文件进行锁定,避免被黑客删除

#查看最近登录失败的用户及信息
[root@test1 ~]#lastb
# ssh表示从SSH远程登录
# tty表示从控制台登录

⑤排查sudo用户配置文件/etc/sudoers

sudo执行命令的流程:
当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限
–>确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认(当然也可以配置免密,可以看我这篇博文:https://blog.csdn.net/weixin_44901564/article/details/108123217)
–>若密码输入成功,则开始执行sudo后续的命令

1.查询特权用户特权用户(uid 为0)[root@test1 ~]#awk -F: '$3==0{print $1}' /etc/passwd
2. 查询可以远程登录的帐号信息:
[root@test1 ~]#awk '/\$1|\$6/{print $1}' /etc/shadow
3. 查看所有具有sudo权限的用户,如非管理需要,普通帐号应删除sudo权限:
[root@test1 ~]#cat /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
4.禁用或删除多余及可疑的帐号
[root@test1 ~]#usermod -L user    # 禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头
[root@test1 ~]#userdel user       # 删除 user 用户
[root@test1 ~]#userdel -r user    # 将删除 user 用户,并且将 /home 目录下的 user 目录一并删除

2.查看账号执行过的命令

打开 /home 各帐号目录下的 .bash_history,查看普通帐号执行的历史命令,为历史的命令增加登录的 IP 地址、执行命令时间等信息(一般在使用的过程中,都是根据自己的实际情况去配置,不是固定的)
注意:历史操作命令的清除:history -c

3.检查端口

1.列出所有的tcp与udp端口使用情况,分析得到进程得到zabbix_server相应pid号为11514

[root@test1 ~]#netstat -antlp | more

在这里插入图片描述
2.使用 ps 命令,得到pid号为11514相应的运行命令:

[root@test1 ~]#ps aux | grep 11514 

在这里插入图片描述
3.查看 pid 所对应的进程文件路径(proc这个目录建议深入了解一下)

[root@test1 ~]#ls -l /proc/11514/exe

在这里插入图片描述
补充:
①netstat命令
netstat 是一个告诉我们系统中所有 tcp/udp/unix socket 连接状态的命令行工具。它会列出所有已经连接或者等待连接状态的连接。 该工具在识别某个应用监听哪个端口时特别有用,我们也能用它来判断某个应用是否正常的在监听某个端口。
常用选项:

-r, --route              显示路由表
-i, --interfaces         显示接口信息表-s, --statistics         显示网络协议汇总信息
-n, --numeric            不解析域名-p, --programs           为端口显示pid或者软件名称        -o, --timers             显示计时器
-c, --continuous         连续显示
-l, --listening          显示正在监听的服务端口
-a, --all                显示所有端口(默认只显示: connected 的端口)

实例:
#查看路由器表
[root@test1 ~]#netstat -rn
#查看正在监听的tcp端口,并显示对应的监听程序
[root@test1 ~]#netstat -ntpl
#查看正在监听的udp端口,并显示对应的监听程序
[root@test1 ~]#netstat -nupl
#显示所有tcp连接及监听端口
[root@test1 ~]#netstat -ant
#显示所有udp连接及监听端口及连接的程序
[root@test1 ~]#netstat -anup

②ss命令
ss命令可以用来获取socket统计信息,也可以显示和netstat类似的内容。ss的优势在于能够显示更多更详细的有关TCP和连接状态的信息,而且速度比netstat更快。
当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢,但是ss命令利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。
常用选项:

-h, --help 	      帮助
-V, --version     显示版本号
-t, --tcp         显示 TCP 协议的 sockets
-u, --udp         显示 UDP 协议的 sockets
-x, --unix        显示 unix domain sockets,与 -f 选项相同
-n, --numeric     不解析服务的名称,如 "22" 端口不会显示成 "ssh"
-l, --listening   只显示处于监听状态的端口
-p, --processes   显示监听端口的进程(Ubuntu 上需要 sudo)
-a, --all         对 TCP 协议来说,既包含监听的端口,也包含建立的连接
-r, --resolve     把IP解释为域名,把端口号解释为协议名称

实例:
#如果不添加选项 ss 命令默认输出所有建立的连接(不包含监听的端口),包括 tcp, udp, and unix socket 三种类型的连接:
[root@test1 ~]#ss
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 172.16.197.208:http 192.168.0.11:53029
ESTAB 0 252 172.16.197.208:ssh 192.168.0.11:62310
ESTAB 0 0 172.16.197.208:http 192.168.0.11:53172

#查看进程使用的socket
[root@test1 ~]#ss -pl
#显示所有的TCP连接
[root@test1 ~]#ss -at
#显示所有的UDP连接
[root@test1 ~]#ss -au

更多的用法请百度,就不一一举例了。。。

4.分析进程

①根据pid号查看进程

[root@test1 ~]#lsof -p pid号

②通过服务名查看该进程打开的文件

[root@test1 ~]#lsof -c sshd

③通过端口号查看进程

[root@test1 ~]#lsof -i :22

④查看进程的启动时间点

[root@test1 ~]#ps -p 11514 -o lstart //11514为进程pid号

在这里插入图片描述
⑤根据pid强行停止进程
[root@test1 ~]#kill -9 11514

5.检查开机启动项

①查看运行级别命令

[root@test1 ~]#runlevel

②开机启动配置文件

[root@test1 ~]#/etc/rc.local
[root@test1 ~]#/etc/rc.d/rc[0~6].d

启动Linux系统时,会运行一些脚本来配置环境——rc脚本。在内核初始化并加载了所有模块之后,内核将启动一个守护进程叫做init或init.d。这个守护进程开始运行/etc/init.d/rc中的一些脚本。这些脚本包括一些命令,用于启动运行Linux系统所需的服务。

③开机执行脚本的两种方法
a.在/etc/rc.local的exit 0语句之间添加启动脚本。脚本必须具有可执行权限
在这里插入图片描述
b.使用update-rc.d命令

  当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在/etc/init.d目录下,然后在/etc/rc.d/rc[n].d(n表示数字)文件中建立软链接即可
  此命令可以指定脚本的执行序号,序号的取值范围是0-99,序号越大,越迟执行

语法:

update-rc.d 脚本名或服务 <remove|defaults|disable|enable>
1./etc/init.d目录下创建链接文件到后门脚本:
[root@test1 ~]#ln -s <脚本路径> /etc/init.d/backdoor
2、用 update-rc.d 命令将连接文件 backdoor 添加到启动脚本中去
[root@test1 ~]#update-rc.d backdoor defaults 99 //非root用户需要用sudo提权

上面说了这些跟开启启动有关的东西,所以在做入侵排查的时候就要注意了:
重点查看以下目录与文件,防止被放进了后门脚本:
/etc/rc.local
/etc/rc.d/rc[0~6].d

1.查看运行等级
[root@test1 ~]#runlevel
N 5
2.查看/etc/rc.d/rc5.d/目录
[root@test1 ~]#ls -l /etc/rc.d/rc5.d/

6.检查计划任务

/var/spool/cron/crontabs/目录

/var/spool/cron/这个目录是以账号来区分每个用户自己的执行计划,例如用root用户创建定时任务,那么就会在/var/spool/cron/crontabs/目录下生成文件root,保存的就是root的定时任务的配置

1.列出当前用户的定时任务配置
[root@test1 ~]#crontab -l  
2.删除当前用户的cron任务,本质上就是删除/var/spool/cron/crontabs/目录下相对应的用户的定时任务配置
[root@test1 ~]#crontab -r  
/etc/crontab      只允许root用户修改
/var/spool/cron/  存放着每个用户的crontab任务,每个任务以创建者的名字命名
/etc/cron.d/      将文件写到该目录下,格式和/etc/crontab相同
把脚本放在以下目录中:
/etc/cron.hourly/  每小时执行一次
/etc/cron.daily/   每天执行一次
/etc/cron.weekly/  每周执行一次
/etc/cron.monthly/ 每个月执行一次

在做入侵排查的时候,重点关注以下目录中是否存在恶意脚本:
/var/spool/cron/*
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*

7.检查异常文件

按照三种方式查找修改文件:
名称
文件大小
时间

①根据名称查找文件

[root@test1 ~]#find / -name 文件名

②依据文件大小查找

[root@test1 ~]#find / -size +1000M
# +1000M表示大于1000M的文件,-10M代表小于10M的文件

③依据时间查找
-atime 文件的访问时间
-mtime 文件内容修改时间
-ctime 文件状态修改时间(文件权限,所有者/组,文件大小等,当然文件内容发生改变,ctime也会随着改变)
注意:系统进程/脚本访问文件,atime/mtime/ctime也会跟着修改,不一定是人为的修改才会被记录

a.查找最近一天内修改的文件,显示文件的详细信息,使用-ls输出形式
[root@test1 ~]#find / -mtime -1 -ls  | more
b.查找3天前修改的文件
[root@test1 ~]#find ./ -mtime +3 -ls

④根据属主和属组查找
-user 根据属主查找
-group 根据属组查找
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
注意:系统中没有属主或者没有属组的文件或目录,也容易造成安全隐患,建议删除。

a.查看所有者是root的文件
[root@test1 ~]#find ./ -user root -type f
b.查看所属组是root的文件
[root@test1 ~]#find ./ -group root -type f

补充:
按照CPU使用率从高到低排序
[root@test1 ~]#ps -ef --sort -pcpu
按照内存使用率从高到低排序
[root@test1 ~]#ps -ef --sort -pmem

1.查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以“…”为名的文件夹具有隐藏属性。
2.得到发现WEBSHELL、远控木马的创建时间,如何找出同一时间范围内创建的文件?
可以使用find命令来查找,如find /opt -iname “*” -atime 1 -type f 找出 /opt 下一天前访问过的文件。
3针对可疑文件可以使用 stat 进行创建修改时间。

8.检查系统日志

日志默认存放位置:/var/log/
必看日志:secure、history
查看日志配置情况:more /etc/rsyslog.conf

日志文件说明表

日志文件 说明
/var/log/cron 记录了系统定时任务相关的日志
/var/log/cups 记录打印信息的日志
/var/log/dmesg 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/mailog 记录邮件信息
/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/btmp 记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/log/utmp 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/log/secure 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中

日志分析技巧

1.定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
2.定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c
3.查找爆破用户名字典
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

4.登录成功的IP有哪些:   
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
5.登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}' 

6.过滤出增加用户的日志
grep "useradd" /var/log/secure 
7.过滤出删除用户的日志
grep "userdel" /var/log/secure
8.过滤出su切换用户的相关日志
grep "su" /var/log/secure
日志格式如下:
Jan 19 17:47:49 test1_120 su: pam_unix(su-l:session): session opened for user root by ops(uid=0)
9.过滤出sudo授权执行命令的相关日志
grep "sudo" /var/log/secure
Jan 19 17:47:59 test1_120 sudo:     ops : TTY=pts/1 ; PWD=/home/ops ; USER=root ; COMMAND=/bin/grep sudo /var/log/secure

猜你喜欢

转载自blog.csdn.net/weixin_44901564/article/details/112652471