为了学习 PWN,一个好的虚拟环境是必不可少的。一开始我选择了vm ware虚拟机,但是好景不长,不久我就发现采用虚拟机过于臃肿。
所以我需要一个更加轻量的虚拟化容器。最后我选择了docker。
docker这个东西类似于沙箱,因为Linux类系统内核一样,有所区别的只有他们的用户层程序。所以只需要一个能够承载其他发行版Linux用户程序的容器,就可以模拟出所有的Linux系统。甚至可以定义和打包自己的Linux环境。因为没有内核和没用的第三方软件的空间,docker相当轻量,也给自定义开发环境带来了很大的自由。所以我尝试着把部分Linux虚拟机迁移到docker上。
菜鸟教程上说,Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。
因此,Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。但是这个虚拟环境是所有docker共用的,所以相对虚拟机来说还是划算的。
接下来我们就开始搭建docker环境。
开搞
准备
我们需要在docker hub上注册一个账号。docker最强的地方在于他的容器足够轻量,可以在网络上进行同步管理。所以一个docker hub账号必不可少。然后在你的账户下新建一个仓库,用来备份之后的镜像。
docker hub 官网:https://registry.hub.docker.com
接下来我就可以创建一个自己的环境了。
然后就是一些基础的命令教程,这篇文章并不是 docker 教程,而是一个心路历程,希望别人看了以后不会踩同样的坑。docker 自身的命令帮助相当详细,上手不会太难。
然后就是 docker 镜像下载加速。因为一些众所周知的原因,我们这里拉取 docker hub 上镜像的速度相当慢,这个时候需要一些加速手段。这个就自行百度吧。毕竟镜像加速的手段要以你所在的时间的可用手段为准。
需要的目标环境
我现在需要一个以ubuntu系统为蓝本的docker。然后需要 g++ gcc 编译器,gdb调试器,gdb的peda插件,git用于代码管理。ssh-server用来方便系统从外部连接到docker,同时方便用vscode连接到docker编写代码。然后一个VIM编辑器方便docker修改部分配置文件。
创建虚拟环境
我们首先要去 dockerhub 找一个基础镜像。我选择的是 ubuntu,因为 ubuntu 较为易用(我比较熟悉)。我们用这个命令拉取镜像
docker pull ubuntu
我们通过 docker images
这个命令来查看所有的镜像。
在上面 REPOSITORY 是你在docker hub上的项目名,如果你刚从ubuntu上下载下来应该是ubuntu
。我自己的是 lixiao189/testubuntu
。tag 是镜像的标签,常常用来区分版本。
接下来就是构建docker了。docker镜像的构建我们可以通过 dockerfile 来进行。关于dockerfile的编写与使用,可以参看这篇博客
https://www.cnblogs.com/wdliu/p/10469257.html
假如你目标明确的话,这一部就应该能直接完成镜像的构建。但不幸的是,因为是第一次上手,我有一些软件漏了。所以接下来就是进docker搞了。先用命令生成一个容器
docker run -it -p 23:22 -u root lixiao189/testubuntu:v5.01
上面这个命令中 -it
是 -i
和 -t
选项的结合,-p
是指定端口映射,23是你的本机端口,22是你的docker端口,因为docker中我们要开启ssh服务,所以要将ssh服务的22号端口映射到本机的23号端口上,然后-u
是指定用户名。这里是root,接下来我们制定镜像,镜像名由 docker hub 上的仓库名和 tag 标签组成。
接下来我们就得到了一个容器,并且会自动进入。然后进去完成用户添加,和漏掉的软件安装就好了。然后按下 ctrl+D
退出docker。退出的时候 docker 会自动停止。然后就是 docker 的提交了。docker 可以采用 commit 选项提交。之后就能生成一个新的镜像。接下来我们只要用 docker 的 push 选项将本地镜像提交到 hub 上。这两个命令的用法可以自己百度,或者用 --help
选项获取帮助
假如说你 ssh-server 安装好了,就可以通过这些命令来启动容器,同时自启动 ssh 服务。
docker start hackubuntu # 后台启动镜像
docker exec -t hackubuntu service ssh start # 启动 ssh 服务
由于我讲虚拟机映射到本机的 23 号端口,因此用下面的命令连结ssh。
ssh 127.0.0.1 -p 23 -l node # node 是容器中的一个普通账户
docker 的镜像确实都是很精简的,就是自己配置需要跟花时间。访问速度也很快,启动秒开。可以在mac上还套了层虚拟机,要是在 linux 上体验应该更佳。