PCTF 的一道简单 docker 题小记

一句话概括

老规矩,这篇文章的主要是通过一道简单的 CTF 题分析如何通过 docker image 得到 dockerfile

比赛题目

说来是一道比较简单的赛题了,但是因为是鼎鼎大名的 plainCTF,所以没有小视,题目如下:

1
docker pull whowouldeverguessthis/public

做题思路

拉取 image,在 dockerhub 上查看 image 信息

拉取命令是同上的,然后是查看 image 是否有相应的 dockerfile,发现 dockerhub 上并没有任何有效的信息

把 image run 起来

1
docker run -dit whowouldeverguessthis/public

查看 container 内的内容

1
2
3
4
5
docker exec -it cotainerID /bin/bash
$: ls
... flag ...
$: cat flag
I'm sorry, but your princess is in another castle

到这里思路突然就卡住了,然后就进行了一些尝试

尝试

  • 查看 container 中运行的进程
    利用 ps, lsof, netstat 等等查看,发现并没有多余的进程信息,这样也就排除了它包含有 web server 等内容的可能性

    注意,这里列出的指令容器里本身都是没有的,需要自己安装,但是刚刚脑抽忘了在 container 里做源更新,所以啥都没装上,于是只能在 proc 文件夹底下看进程的具体信息,发现进程也就只有序号为 1 的初始进程以及做 ssh 的进程,因此断定这种考虑是一个跑偏的思路

  • 查看 image 的信息,试图找出来 image 构建的过程
    首先用的是 docker inspect 命令看镜像具体的内容,没有实质性的发现;
    然后想起来现在仍然没有看到构建镜像的 dockerfile,因此考虑如何能够通过镜像看到其构建的过程,Google 一下,发现真的有这种操作,docker 提供一个 docker history 的命令,运行尝试一下
    1
    2
    3
    4
    5
    6
    $: docker history howouldeverguessthis/public
    IMAGE CREATED CREATED BY SIZE COMMENT
    969996089570 20 hours ago /bin/sh -c echo "I'm sorry, but your princes… 50B
    <missing> 20 hours ago /bin/sh -c echo "PCTF{well_it_isnt_many_poin… 51B
    <missing> 2 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
    <missing> 2 months ago /bin/sh -c #(nop) ADD file:34b9952e66cb98287… 68.9MB

WOW!!! 发现了有没有!但是。。。它被压缩显示了,如何把这个展开?问一下大佬师弟有没有相关经验,果然师弟聪慧过人,在 docker history 后面加上了 help 就发现了秘密

1
2
3
4
5
$: docker history --no-trunc howouldeverguessthis/public|awk '{print $8}'
"I'm
"PCTF{well_it_isnt_many_points_what_did_you_expect}"
CMD
ADD

GET!

总结

虽然是一道很简单的签到题,但是给我最大的启示就是对于出题意图的思考和逐步排除的做法,其实这道题的本质是逆向,通过 docker image 逆向出构建的方式

0%