作者:Saviour

这个APT源污染,需要同步下载大量的源服务器文件,我下完之后大约220多G。

系统:Ubuntu 16.04 LTS  
硬盘:500G  
软件:apt-mirror  
路径:/service/ubuntu/mirror  
木马:sudo apt-get install slurm  

第一个阶段:

为了测试我们将原版的slurm修改为我们测试之后的版本,用自定义好的测试文件将原版的slurm进行替换;

按照如下命令进行操作,如图:

image

图一(解压缩slurm deb包)

提示:将生成好的测试文件替换后,执行md5sum slurm计算md5值,将原先的slurm值替换掉,然后再使用dpkg打包deb

image

图二(计算替换后的slurm MD5值)

image

图三(替换DEBIAN目录下md5sum文件中的slurm值)

image

图四(dpkg进行slurm重打包 )

image

图五(将生成好的slurm包进行本地安装测试)

第二个阶段:

这个也是一个非常漫长的过程,需要同步APT源到本地,大约200多G。

同步完成之后,使用Apache搭建网站,并开启列目录功能,按照如下内容进行配置: image

图六(修改配置文件,设置网站目录,并开启列目录功能)

image

图七(开启之后的APT源列目录)

进行APT源测试,执行sudo apt-get update,同步本地APT源,看是否正常。

image

图八(同步本地APT源)

image

图九(同步本地APT源成功,无报错)

image

图十(测试通过本地APT源进行安装软件成功)

第三个阶段:

这个阶段将分析APT源软件的安装方式,研究一个完整的APT软件安装过程及过程中调用的文件,并试图将调用的文件内容进行特定修改,看APT是否能再次执行成功。

首先我们执行sudo apt-get install slurm进行原版软件安装,然后分析Apache访问日志,默认网站日志路劲:/etc/apache2/access.log

通过查看APT源网站访问,发现在初始APT源安装软件的时候,APT下载过InRelease、Packages.xz等文件; image

图十一(APT访问InRelease签名文件)

image

图十二(APT访问Packages.xz文件)

InRelease文件是一个gpg明文签名文件,里面包含了Packages.xz等md5、sha1、sha256、文件大小等校验值。 image

图十三(InRealse文件)

Packages.xz等文件(包括其他Packages开头文件),里面包含了其对应pool目录下的deb文件md5、sha1、sha256、文件大小等校验值。 image

图十四(Packages.xz文件)

通过对gpg进行了解,发现gpg可以进行签名伪造,比如ubuntu官方的签名邮箱为mirror@ubuntu.com,那么我们也可以使用官方签名的邮箱重新进行申请,获得一个签名key。 image

图十五(gpg key)

由于默认官方对Release文件进行了签名,那么我们在修改Release文件后必须对他进行重新签名,生成我们自己的Release文件(不然会在APT更新时报错)。

这次实验会用到的gpg命令如下:

gpg命令解析

gpg --gen-key 创建一个key
gpg --list-keys 查看key列表
gpg --armor --output public-key.txt --export [用户ID] 导出公钥
gpg --armor --output private-key.txt --export-secret-keys 导出私钥
gpg --keyserver hkp://keys.gnupg.net --send-keys [用户ID] 上传公钥到服务器
gpg --fingerprint [用户ID] 验证公钥
gpg --clearsign test.txt 明文签名文件

我使用的是Git Windows客户端进行gpg key 生成,然后将生成的key导入ubuntu中 image

图十六(gpg密钥生成)

默认Windows gpg密钥生成路径为:C:\Users[用户名].gnupg image

图十七(gpg密钥Windows目录)

将.gnupg文件夹导入ubuntu用户目录下,路仅为:/home/[用户名] image

图十八(gpg密钥ubuntu目录)

第四个阶段:

将我们重打包的slurm deb文件,md5、sha1、sha256、大小等信息收集起来,这里我们需要改两个文件,一个是Packages.xz、一个是InRealse文件,步骤如下:

将slurm文件md5、sha1、sha256、大小写入Packages.xz解压后文件对应的字段中 image

图十九(修改slurm对应的值)

改完slurm文件后,对Packages进行xz压缩,重新计算Packages.xz的md5、sha1、sha256、文件大小值,将获得的值写入Release文件对应的字段中。 image

图二十(修改Release对应的md5值)

image

图二十一(修改Release对应的sha1值)

image

图二十二(修改Release对应的sha256值)

改完后我们使用刚注册好的gpg key对Release文件进行明文签名,生成Release.asc文件

image

图二十三(对Release文件进行签名)

image

图二十四(签名后的Release文件)

最后阶段:

修改完成后,将生成的Release.asc改名为InRelease,并覆盖原先的InRelease文件,执行sudo apt-get update,看是否更新正常,如果报错请导入证书文件,如果报hash不匹配,有可能是你的Release里面的值或文件大小填写错误,填写正确后重新对Release文件进行签名即可,并进行覆盖,重新执行sudo apt-get update,无误后进行本次的最后一步sudo apt-get install slurm。

导入证书:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [证书公钥ID]

成功结果:

APT成功安装了我们自定义的APT源deb文件,这就意味着,此刻如果我安装的是一个被替换过之后的恶意文件,那么我的主机就被成功入侵了,由于有些用户喜欢使用root用户执行的apt命令,那么就导致恶意文件会以最高权限运行,导致服务器彻底沦陷。

image

图二十五(自定义slurm文件成功被安装)

实验目的:

1、 APT源是可以篡改的。 2、 警惕不明的第三方源; 3、 官方源也未必完全可信; image

实验说明:

此次实验不完全针对APT问题,也不排除YUM源等也存在此问题。


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/270/