在日常繁琐的运维工作中,对linux服务器进行安全检查是一个非常重要的环节。今天,分享一下如何检查linux系统是否遭受了入侵?


一、是否入侵检查

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
1)检查系统日志
检查系统错误登陆日志,统计IP重试次数(last命令是查看系统登陆日志,比如系统被reboot或登陆情况)
[root@localhost ~] # last
 
2)检查系统用户
查看是否有异常的系统用户
[root@localhost ~] # cat /etc/passwd
  
查看是否产生了新用户,UID和GID为0的用户
[root@localhost ~] # grep "0" /etc/passwd
  
查看 passwd 的修改时间,判断是否在不知的情况下添加用户
[root@localhost ~] # ls -l /etc/passwd
  
查看是否存在特权用户
[root@localhost ~] # awk -F: '$3==0 {print $1}' /etc/passwd
  
查看是否存在空口令帐户
[root@localhost ~] # awk -F: 'length($2)==0 {print $1}' /etc/shadow
 
3)检查异常进程
注意UID为0的进程
使用 ps  -ef命令查看进程
  
察看该进程所打开的端口和文件
[root@localhost ~] # lsof -p pid命令查看
  
检查隐藏进程
[root@localhost ~] # ps -ef | awk '{print }' | sort -n | uniq >1
[root@localhost ~] # ls /porc |sort -n|uniq >2
[root@localhost ~] # diff 1 2
 
4)检查异常系统文件
[root@localhost ~] # find / -uid 0 –perm -4000 –print
[root@localhost ~] # find / -size +10000k –print
[root@localhost ~] # find / -name "…" –print
[root@localhost ~] # find / -name ".." –print
[root@localhost ~] # find / -name "." –print
[root@localhost ~] # find / -name " " –print
 
5)检查系统文件完整性
[root@localhost ~] # rpm –qf /bin/ls
[root@localhost ~] # rpm -qf /bin/login
[root@localhost ~] # md5sum –b 文件名
[root@localhost ~] # md5sum –t 文件名
 
6)检查RPM的完整性
[root@localhost ~] # rpm -Va #注意相关的/sbin,/bin,/usr/sbin,/usr/bin
输出格式说明:
S – File size differs 
M – Mode differs (permissions)
5 – MD5  sum  differs 
D – Device number mismatch
L – readLink path mismatch
U – user ownership differs
G – group ownership differs
T – modification  time  differs
 
7)检查网络
[root@localhost ~] # ip link | grep PROMISC(正常网卡不该在promisc模式,可能存在sniffer)
[root@localhost ~] # lsof –i
[root@localhost ~] # netstat –nap(察看不正常打开的TCP/UDP端口)
[root@localhost ~] # arp –a
 
8)检查系统计划任务
[root@localhost ~] # crontab –u root –l
[root@localhost ~] # cat /etc/crontab
[root@localhost ~] # ls /etc/cron.*
 
9)检查系统后门
[root@localhost ~] # cat /etc/crontab
[root@localhost ~] # ls /var/spool/cron/
[root@localhost ~] # cat /etc/rc.d/rc.local
[root@localhost ~] # ls /etc/rc.d
[root@localhost ~] # ls /etc/rc3.d
 
10)检查系统服务
[root@localhost ~] # chkconfig —list
[root@localhost ~] # rpcinfo -p(查看RPC服务)
 
11)检查rootkit
[root@localhost ~] # rkhunter -c
[root@localhost ~] # chkrootkit -q


二、linux系统被入侵/中毒的表象

1
2
3
4
5
6
7
8
9
10
比较常见的中毒表现在以下三个方面:
1)服务器出去的带宽会跑高这个是中毒的一个特征。
因为服务器中毒之后被别人拿去利用,常见的就是拿去当肉鸡攻击别人;再者就是拿你的数据之类的。
所以服务器带宽方面需要特别注意下,如果服务器出去的带宽跑很高,那肯定有些异常,需要及时检查一下!
  
2)系统里会产生多余的不明的用户
中毒或者被入侵之后会导致系统里产生一些不明用户或者登陆日志,所以这方面的检查也是可以看出一些异常的。
  
3)开机是否启动一些不明服务和crond任务里是否有一些来历不明的任务?
因为中毒会随系统的启动而启动的,所以一般会开机启动,检查一下启动的服务或者文件是否有异常,一般会在 /etc/rc . local 和crondtab -l 显示出来。


三、顺便说下一次Linux系统被入侵/中毒的解决过程

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
在工作中碰到系统经常卡,而且有时候远程连接不上,从本地以及远程检查一下这个系统,发现有不明的系统进程。
初步判断就是可能中毒了!!!
  
解决过程:
1)在监控里检查一下这台服务器的带宽,发现服务器出去的带宽跑很高,所以才会导致远程连接卡甚至连接不上,这是一个原因。
为什么服务器出去的带宽这么高且超出了开通的带宽值?这个原因只能进入服务器系统里检查了。
  
2)远程进入系统里检查了下,  ps  -aux查到不明进程 ,立刻关闭它。
  
3)检查一下开机启动项:
#chkconfig --list | grep 3:on
服务器启动级别是3的,我检查一下了开机启动项,没有特别明显的服务。
然后检查了一下开机启动的一个文件
#more /etc/rc.local
看到这个文件里被添加了很多未知项,注释了它。
  
4)然后在远程连接这台服务器的时候,还是有些卡。
检查了一下系统的计划任务crond,使用crondtab -l 命令进行查看,看到很多注释行。
这些注释行与 /etc/rc . local 的内容差不多。最后备份下 /var/spool/cron/root 文件(也就是root下的 crontab 计划任务内容),就删除了 crontab 内容,然后停止crond任务,并chkconfig crond off 禁用它开机启动。
  
5)为了彻底清除危害,我检查了一下系统的登陆日志(last命令查看),看到除了root用户之外还有其它的用户登陆过。
检查了一下 /etc/passwd  ,看到有不明的用户,立刻用 usermod  -L XXX 禁用这些用户。
然后更新了下系统的复杂密码。
----------------------------------------------------
禁用/锁定用户登录系统的方法
1.  usermod  -L username 锁定用户
     usermod  -U username 解锁
2.  passwd  -l username 锁定用户
     passwd  -u username 解锁
3.修改用户的shell类型为 /sbin/nologin /etc/passwd 文件里修改)
4.在 /etc/ 下创建空文件nologin,这样就锁定了除root之外的全部用户
----------------------------------------------------


四、怎样确保linux系统安全

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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
1)从以往碰到的实例来分析,密码太简单是一个错
用户名默认,密码太简单是最容易被入侵的对象,所以切忌不要使用太过于简单的密码,先前碰到的那位客户就是使用了太简单的且规则的密码 1q2w3e4r5t, 这种密码在扫描的软件里是通用的,所以很容易被别人扫描出来的。
  
2)不要使用默认的远程端口,避免被扫描到
扫描的人都是根据端口扫描,然后再进行密码扫描,默认的端口往往就是扫描器的对象,他们扫描一个大的IP 段,哪些开放22端口且认为是 ssh 服务的linux系统,所以才会猜这机器的密码。更改远程端口也是安全的一个措施!
  
3)使用一些安全策略进行保护系统开放的端口
使用iptables或者配置 /etc/hosts .deny 和 /etc/hosts .allow进行白名单设置
可以对 /etc/passwd /etc/group /etc/sudoers /etc/shadow 等用户信息文件进行锁定(chattr +ai)
  
4)禁 ping 设置
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
---------------------------------------------------------
发现一次服务器被getshell渗透的解决办法:
1)使用 top 命令发现一个python程序占用了95%的cpu
2)使用 ps  -ef| grep  python发现下面程序:
    python -c  import  pty;pty.spamn( "/bin/sh" )
这个程序命令表示通过webshell反弹shell回来之后获取真正的ttyshell进行渗透到服务器里。 kill 掉这个进程!
3)发现在 /var/spool/cron 下面设置了一个nobody的定时执行上面获取getshell的渗透命令!果断删除这个任务!
4)ss -a发现一个可疑ip以及它的进程,果断在iptables里禁止这个ip的所有请求:
    -I INPUT -s 180.125.131.192 -j DROP
-----------------------------------------------------------------------------------------------------------
比如:
在一台服务器上,已经启动了80端口的nginx进程,但是执行“ lsof  -i:80”或者 "ps -ef" 命令后,没有任何信息输出!这是为什么?
怀疑机器上的 ps 命令被人黑了!执行:
 
[root@locahost ~] # which ps
/bin/ps
[root@locahost ~] # ls -l /bin/ps
-rwxr-xr-x. 1 root root 85304 5月  11 2016  /bin/ps
[root@locahost ~] # stat /bin/ps
   File:  "/bin/ps"
   Size: 85304       Blocks: 168        IO Block: 4096   普通文件
Device: fc02h /64514d     Inode: 13549       Links: 1
Access: (0755 /-rwxr-xr-x )  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-05-07 17:14:37.862999884 +0800
Modify: 2016-05-11 07:23:09.000000000 +0800
Change: 2017-05-07 17:14:37.146999967 +0800
  
发现 ps 命令的二进制文件果然在近期被改动过。
解决办法:可以拷贝别的机器上的 /bin/ps 二进制文件覆盖本机的这个文件。
-------------------------记一次Linux操作系统被入侵的排查过程--------------------------------------
 
某天突然发现IDC机房一台测试服务器的流量异常,几乎占满了机房的总带宽,导致其他服务器程序运行业务受阻!
意识到了这台测试机被人种了木马,于是开始了紧张的排查过程:
  
1)运行 ps top 命令
发现了两个陌生名称的程序(比如mei34hu)占用了大部分CPU资源,显然这是别人植入的程序!
果断尝试 kill 掉这两个进程, kill 后,测试机流量明显降下去。然而不幸的是,不一会儿又恢复了之前的状态。
  
2)将IDC这台测试机的外网关闭。远程通过跳板机内网登陆这台机器。
  
3)查看这些陌生程序所在路径
查找程序路径:
ls  /proc/ 进程号 /exe ,然后再次 kill 掉进程,又会生成一个新的进程名,发现路径也是随机在PATH变量的路径中变换,有时在 /bin 目录,有时在 /sbin ,有时在 /usr/bin 目录中。
看来还有后台主控程序在作怪,继续查找。
  
4)尝试查找跟踪程序
查看 /bin /sbin /usr/bin 等目录下是否存在以.开头的文件名,发现不少,而且部分程序移除后会自动生成。
[root@localhost ~] # ls /usr/bin/.    //按Tab键补全
./  ../  . ssh .hmac
  
这说明还没找到主控程序。
  
5)接着用 strace 命令跟踪这些陌生程序:
[root@localhost ~] # strace /bin/mei34hu
  
结果发现在跟踪了这个程序后,它居然自杀了(把自己进程文件干掉了)!然后想用 netstat 看下网络连接情况,结果居然查不到任何对外的网络连接,于是开始怀疑命令被修改过了。
使用stat 查看系统命令 ps ls  netstat 、pstree等等:
[root@localhost ~] # which ps
/usr/bin/ps
[root@localhost ~] # which ls
alias  ls = 'ls --color=auto'
     /usr/bin/ls
[root@localhost ~] # which netstat
/usr/bin/netstat
[root@localhost ~] # stat /usr/bin/netstat
[root@localhost ~] # stat /usr/bin/ps
[root@localhost ~] # stat /usr/bin/ls
......
  
发现修改时间都是在最近的3天内,这让我猛然想起传说中的rootkit用户态级病毒!!
有可能是这台测试机刚安装好系统后,设置了root密码为123456,之后又把它放到过公网上被人入侵了。
  
接着查一下它在相关路径中还放了哪些程序:
[root@localhost ~] # find /bin -mtime -3 -type f | xargs rm -f
[root@localhost ~] # find /usr/bin -mtime -3 -type f | xargs rm -f
[root@localhost ~] # find /use/sbin -mtime -3 -type f | xargs rm -f
[root@localhost ~] # find /sbin -mtime -3 -type f | xargs rm -f
  
将上面查找出的3天前的程序统统都删掉,并强制断电,重启服务器!然而可恨的是这些程序在机器重启后又好端端的运行以来!
很明显,这些程序都被设置了开机自启动
  
6)查看系统启动项
[root@localhost ~] # find /etc/rc.d/ -mtime -3 ! -type d
  
果然这些程序都被设置了开机自启动。于是,就再来一次删除,然后暴力重启服务器。
[root@localhost ~] # find /bin -mtime -3 -type f | xargs rm -f
[root@localhost ~] # find /usr/bin -mtime -3 -type f | xargs rm -f
[root@localhost ~] # find /use/sbin -mtime -3 -type f | xargs rm -f
[root@localhost ~] # find /sbin -mtime -3 -type f | xargs rm -f
[root@localhost ~] # find /etc/rc.d/ -mtime -3 ! -type d | xargs rm -f
  
重启完服务器后,用 top 命令查看,系统CPU使用率也不高了。居然这样就被干掉了。
  
7)顾虑到系统常用命令中(如 ls ps 等)可能会隐藏启动进程,这样一旦执行又会拉起木马程序。于是再查看下系统中是否创建了除root以外的管理员账号:
[root@localhost ~] # awk -F":" '{if($3 == 0) print $1}' /etc/passwd
root
  
结果发现只输入了root这一个用户,说明系统用户是正常的。
其实,当系统被感染rootkit后,系统已经变得不可靠了,唯一的办法就是重装系统了。
  
8)对于一些常用命令程序的修复思路:找出常用命令所在的rpm包,然后强制删除,最后在通过yum安装(由于外网已拿掉,可以通过squid代理上网的yum下载)
[root@localhost ~] # rpm -qf /bin/ps
[root@localhost ~] # rpm -qf /bin/ls
[root@localhost ~] # rpm -qf /bin/netstat
[root@localhost ~] # rpm -qf /usr/bin/pstree
  
然后将上面命令查找出来的rpm包强制卸载
[root@localhost ~] # rpm -e --nodeps ......
[root@localhost ~] # rpm -e --nodeps ......
[root@localhost ~] # rpm -e --nodeps ......
[root@localhost ~] # rpm -e --nodeps ......
  
接着再重新安装
[root@localhost ~] # yum install -y procps coreutils net-tools psmisc
  
最后重启下系统即可。除了上面这次排查之外,还可以:
1)结合服务器的系统日志 /var/log/messages /var/log/secure 进行仔细检查。
2)将可疑文件设为不可执行,用chattr +ai将几个重要目录改为不可添加和修改,再将进程杀了,再重启
3)chkrootkit之类的工具查一下
  
对于以上这些梳理的木马排查的思路要清楚,排查手段要熟练。遇到问题不要慌,静下心,细查系统日志,根据上面的排查思路来一步步处理,这样Hacker就基本 "投降" 了~~~