渗透测试学习(2):在docker下搭建Kali-Linux环境
概述
先来谈谈这种方式的优缺点
优点:
- 可以不用运行额外的完整操作系统
- 可以直接在当前终端启动Kali,并使用其工具
缺点:
- 无法直接访问硬件,导致部分工具使用相当复杂
达到的效果:
过程概述:
- 从docker拉取kali-linux官方提供的映像
kalilinux/kali-rolling
; - 构建一个容器,进入容器的shell,更新软件源,并下载kali linux的工具包;
- 基于我们作出更改的容器,创建新的映像,我们的映像中将包含更新和工具包;
- 对Kali内部分数据目录映射到Docker Volumes,每次使用完Kali后,都会自动删除容器,并利用我们镜像和Volumes随时重新创建;
- 编写启动脚本,并将其设置在环境变量中。
完整过程
- 拉取Kali Linux 的官方Docker映像
1 | docker pull kalilinux/kali-rolling |
- 基于该映像构建一个容器,并进入shell
1 | docker run -ti kalilinux/kali-rolling |
这时候我们开启的这个kali仅仅是一个骨架,不包含任何工具,此时我们要使用apt工具,更新apt源
1 | apt update |
接下来我们安装Kali Linux的工具,我们可以安装Kali官方打包的meta packages,提供的详情可以查看:https : //www.kali.org/news/kali-linux-metapackages/。一般而言,我们都会先安装kali-tools-top10
1 | apt install kali-tools-top10 |
其他根据需要再安装,也可以安装all包,将安装kali官方所有的工具。
- 接下来我们需要根据我们更改后的容器构建一个新的映像。
首先我们需要退出(exit命令)当前Kali Linux,运行查看所有容器的命令
1 | docker ps -a |
通过这个命令,我们可以查看所有的Docker容器,我们需要的是其中的CONTAINER ID
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
获取到CONTAINER ID后,执行下列命令以构建我们的定制映像
1 | docker commit <CONTAINER ID> <custom name> |
在custom name处我们可以填入我们想要的名称,通过
1 | docker image ls |
即可看到我们自定义的映像。
- 在使用Docker时,不在停止的容器上浪费存储空间是一个优良的习惯。我们常常会在运行docker容器时,加入
--rm
使得在结束使用后容器自动销毁。
但是我们有不少数据,我们会希望在Kali的docker容器运行结束后能够持久花存储,因此这时候我们就用到持久化策略。
通常,我们使用Kali时数据保存在以下目录中:
- /root — home dir for root (downloads, notes, source code etc.)
- /var/lib/postgresql — Postgres database files (used by Metasploit)
我们可以将这两个目录映射到Docker Volumes上,在删除容器时保存我妈的数据。通过映射的Docker Volumes和我们创建的自定义映像我们即可随时重新创建我们的kali
1 | docker run -ti --rm --mount src=kali-root,dst=/root --mount src=kali-postgres,dst=/var/lib/postgresql <custom name> |
- 这些参数将会创建两个volume
kali-root
和kali-postgres
,并将这两个映射到创建的容器中(若已经存在名称为这两个的volume,则会直接映射) <custom name>
填入的是我们之前自定义映像的名称
- 接下来我们可以将上面运行的命令保存到一个文件中,并且给予运行权限,例如我们创建了一个叫kali的文件,里面写入我们的docker启动kali的命令,给予运行权限的命令为
1 | chmod +x kali |
然后我们可以将这个文件的目录写入我们环境变量中,例如我将kali保存在一个名字为docker-script
的文件夹中,并将其加入.zshrc
中
1 | export PATH=$PATH:~/docker-scripts |
然后我们在终端中即可使用kali
运行我们基于docker的kali-linux环境了。