逆向工程码头图像

2021-03-18 16:06:14

这始于咨询Snafu:政府组织A获得了政府组织B开发了界面。政府组织B将部分工作分包给某人。托管和维护的托管和维护稍后被签约为私营部门公司C.公司C.公司发现的是,某人(长期不复存在)的分包机建立了自定义码头图像,并使其成为构建系统的依赖,但没有组织原始dockerfile。将C公司留下了合同义务来管理他们Hadno源代码的Docker Image。 C公司偶尔打电话给我做各种各样的事情,所以做一些关于这个神秘主义的Docker Image成为我的工作。

幸运的是,Docker Image格式比它的透明度更加透明。需要一点侦探工作,但只需通过拉开图像文件即可弄清楚很多。作为一个例子,这是一种快速演练,可让漂亮的代码格式化器。

首先让我们让Docker守护程序拉动图像,然后将图像提取到文件:

正如您所看到的,Docker使用很多哈希来命名。让我们来看看Manifest.json。它是难以阅读的紧凑的JSON,但JQ JSON瑞士队牛仔队漂亮打印它:

$ JQ。 masmest.json [{" config&#34 ;:" 88f38be28f05f38dba94f81728ab96594f81728ab96594f81728ab96594f81728a9c3b0f25b.json"" rocotags&#34 ;: [" tmknom / preettier:2.0.5" ]"层&#34 ;: [" a9cc4ace48cd792ef888ade20810f82f6c24aaf2436f30337a2a712cd054dc97 / layer.tar"," d4f612de5397f1fc91272cfbad245b89eac8fa4ad9f0fc10a40ffbb54a356cb4 / layer.tar"," 6c37da2ee7de579a0bf5495df32ba3e7807b0a42e2a02779206d165f55f1ba70 / layer.tar" ]

请注意,三个层对应于三个散列名为目录。我们稍后会看他们。现在,让我们在Config键指向的JSON文件中。这很长,所以我只会在这里转储第一位:

$ JQ。 88f38be28f05f38dba94ce0c1328ebe2b963b65848ab96594f8172a9c3b0f25b.json | head-n 20 {"架构&#34 ;:" amd64"" config&#34 ;: {" hostname&#34 ;:"" ," domainname&#34 ;:"&#34 ;,#34;用户&#34 ;:""" attactstdin&#34 ;: false,&# 34; attachstdout&#34 ;: false," attachstderr&#34 ;: false," tty&#34 ;: false," Openstdin&#34 ;: false," stdinonce" :false," env&#34 ;: [" path = / usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin&#34 ; ]," cmd&#34 ;: [" - 帮助" ]," argseScaped":真实的,"图像&#34 ;:" sha256:93E72874B338C1E07340501D8EBE259D4F16265D2840F88C4C754E1C01BA0A&#34 ;,

Warning: Can only detect less than 5000 characters

$ mkdir文件$ cd文件$ tar xf ../layer.tar $ lsbin dev等home lib媒体mnt opt proc root sbin srv sys tmp usr var $ cat等/高山-31.6 如果您提取高山:3.11.6并提取它,您将发现它内部的一个非空图层,并且tlayer.tar InteiDentical到Play.tar在PrettierImage的基础层中。 只是为了它的攻击,另外两个非空层是什么? 第二层是包含压缩机的主层。 它有528个条目,包括漂亮,一堆依赖性和证书更新: 第三层是由Workdir / Work语句创建的,并且它恰好包含一个条目: