NEWS.ALL
Ruizhao's News Reader

打造你的云渗透主机:阿里云部署Kali Docker

FreeBuf /2020-04-07

一、环境

阿里云服务器

注:硬盘剩余空间最好大于45G,因为kali的docker镜像2G+kali所有工具包16G+保存的新镜像19G ≈ 37G……

硬盘剩余空间大于50G

CentOS 7.6

docker 19.03.6

二、安装docker

docker最好在CentOS7以上的系统安装,因为它对Linux内核版本有要求,具体可以百度。

安装依赖

docker依赖于系统的一些必要的工具,可以提前安装。

yum install -y yum-utils device-mapper-persistent-data lvm2

2、添加软件源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker-ce

yum clean allyum makecache fast yum -y install docker-ce

docker换源

更新docker源为中国国内源。

在/etc/docker下编辑或新建daemon.json:

vi /etc/docker/daemon.json

添加内容:

{ "registry-mirrors": [ "https://kfwkfulq.mirror.aliyuncs.com", "https://2lqq34jg.mirror.aliyuncs.com", "https://pee6w651.mirror.aliyuncs.com", "https://registry.docker-cn.com", "http://hub-mirror.c.163.com" ], "dns": ["114.114.114.114","8.8.8.8"] }

启动服务

通过systemctl启动服务,并设置开机启动docker。

systemctl start docker systemctl enable docker

5、查看版本

使用docker version查看当前的版本,顺便看看是否启动成功。

docker version

三、拉取kali镜像

拉取kali镜像保存到本地:

docker pull kalilinux/kali-linux-docker

命令说明:

docker pull [userName/]<仓库名>[:tag] 1.拉取一个docker官方的镜像,由于官方的仓库叫顶级仓库,不需要加docker用户名,直接用<仓库名>[:tag]。 2.tag用以标识不同版本的镜像。如果不加tag,默认拉取最新版本,也就是latest。 3.拉取某个docker用户自己制作的镜像,需要加用户名以唯一标识出这个镜像。

查看本地镜像:

docker images

四、创建kali容器

用本地镜像创建容器

docker run -id --restart=always --name=kali2020 -p 2222:22 -p 4444:4500 a1765e8e381e

命令说明:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS包括: -i 保持打开容器的标准输入。由于容器默认执行命令是bash,在-d后台运行时,必须指定-i保持打开标准输入,否则容器无限退出、重启 -d 容器后台运行,不交互 --restart=always docker每次启动,都会启动该容器 --name=<容器名> 设置该容器名字 -p <HostPorts>:<containerPorts> 映射宿主机端口到容器端口 -t 分配一个伪终端并绑定到容器的标准输入 IMAGE::= [userName/]<仓库名>[:tag] | <local kali image`s ID> COMMAND 容器创建后执行的命令。默认为bash等。 #如果想直接进入shell交互界面,就用-it参数,去掉-d,最后再加上命令/bin/bash

查看创建的容器的列表:

docker ps -a # -a 列出所有容器

附:

删除容器 docker rm -f <容器名|容器ID> 终止容器 docker stop <容器名|容器ID> 启动容器 docker start <容器名|容器ID> 查看容器日志,在查错时用 docker logs <容器名|容器ID>

进入容器

docker exec -it kali2020 /bin/bash

命令说明:

docker exec -it <containerName | containerID > <command> -i 保持打开容器的标准输入 -t 分配一个伪终端并绑定到容器的标准输入

附:

退出容器终端: 快捷键CTRL+D 或 exit

五、配置kali

修改root口令

passwd root

换源

备份源配置文件,然后编辑

cp /etc/apt/sources.list /etc/apt/sources.list.bak nano /etc/apt/sources.list

粘贴以下内容:

deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb http://mirrors.ustc.edu.cn/kali kali-rolling main contrib non-free deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main contrib non-free deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free

更新软件列表:

apt-get update

安装常用工具

apt-get -y install vim git python net-tools openssh-server

配置OpenSSH

 nano /etc/ssh/sshd_config

添加“PermitRootLogin yes”(允许远程登录root用户):

PermitRootLogin yes

重启服务:

service ssh restart

配置云服务器的防火墙

打开2222、4444-4500端口,这些都是映射到kali容器的端口。

以阿里云为例:

然后点击克隆这条刚添加的规则,修改为:

最终规则列表如图:

附:安全组策略的说明

规则方向:出方向 | 入方向 授权策略:允许 | 拒绝 协议类型:全部 | TCP | UDP | ICMP | GRE 端口范围:1~65535;注意即使是一个端口,也要写成范围,如 22/22,不能只写 22。例如 1/200、80/80、22/22、-1/-1。 授权类型:地址段访问 | 安全组访问 授权对象:如果授权类型为地址段访问,授权对象填写 IP 或者 CIDR 网段格式 如:0.0.0.0/0 或者 192.168.0.0/24。仅支持 IPV4。如果授权类型为安全组访问,授权对象从安全组的列表中选择一个安全组。 优先级:1-100,数值越小,优先级越高。

检查是否能ssh登录kali

在xshell里尝试登录kali

成功登录:

安装kali渗透工具包

大概16G左右。

apt-get -y install kali-linux-all

保存新镜像

在docker容器中做出的修改如果想维持,则必须保存到新镜像里,否则下次启动时,所做的一切更改都会消失。

#先停止运行容器kali2020 docker stop kali2020 docker commit <containername|ID> <userName>/<仓库名>[:<tag>] -m "任何说明文字" #如果不写tag,默认为latest

创建后,可以docker images查看生成的新镜像。

如果命名错了,可以用docker tag 命令重新打标记

docker tag <containerID> <userName>/<仓库名>[:<tag>]

删除原镜像

kali的原镜像已经没用了,可以删除,删除前,必须停止或删除基于该镜像的所有容器:

docker rm -f <containerID | name>

删除镜像:

docker -rmi <imageID>

数据持久化

创建数据卷以实现数据持久化。数据卷的概念参见:1

创建一个数据卷,每次kali容器启动时,可以把host主机某个目录挂载到kali容器的某个目录,在kali中工作时,把需要保存的文件都保存到这个目录,这样,即使删除(docker rm)kali容器,这些数据也不会丢失

另外,如果有其他容器需要共享这些数据时,也可以挂载这个数据卷以获得/修改这些数据。

创建数据卷

创建一个数据卷,命名为“vol_kali”:

docker volume create vol_kali

也可以在创建容器的时候创建数据卷,例如:

docker run -id -v /root/vol_kali:/root --restart=always --name=kali2020 -p 2222:22 -p 4444:4500 a1765e8e381e

-v参数指定数据卷,该实例表示把host主机的/root/val_kali目录挂载到kali容器的/root目录。

查看数据卷列表

查看所有数据卷:

docker volume ls

数据卷在宿主机的路径

查看数据卷在宿主机的保存路径:

docker inspect vol_kali

挂载数据卷

我们用自己刚做好的kali镜像创建容器,并在启动容器时挂载kali专用的数据卷(之前创建的vol_kali)到kali的/root目录下。

docker run -id -v vol_kali:/root --restart=always --name=kali2020 -p 2222:22 -p 4444:4500 a1765e8e381e

六、日常运维

不需要容器运行的时候可以pause或stop:

docker stop <容器名|ID>

需要启动时,先查看容器列表:

docker ps -a

启动:

docker start <容器名|ID>

七、(可选)上传dockerhub

可以把安装和配置好的自定义的kali容器上传到dockerhub,以后要用拉取就行。

注册dockerhub(略)

在dockerhub新建一个仓库

这些操作和github较相似。略。

基于容器创建一个新的镜像

如果之前的步骤里保存了新镜像,也可以省略这一步。基于kali容器创建新镜像:

#先停止运行容器kali2020 docker stop kali2020 docker commit <containername|ID> <userName>/<仓库名>[:<tag>] -m "任何说明文字" #如果不写tag,默认为latest

创建后,可以docker images查看生成的新镜像。

如果命名错了,可以用docker tag 命令重新打标记

docker tag <containerID> <userName>/<仓库名>[:<tag>]

登录dockerhub

docker login

上传

把本地镜像上传到dockerhub。

docker push <userName>/<仓库名>[:<tag>]

支持断点传输。由于网络原因,可能中断。重新执行即可。

*本文原创作者:阿哥有鸟无巢,本文属于FreeBuf原创奖励计划,未经许可禁止转载