docker复现ctf&dockerfile编写ctf环境

docker复现ctf&dockerfile编写ctf环境

author:Mang0

出题以及复现经常要使用docker,以前学习的不系统,从头学习记录,备忘一下

0x00 基本概念

Docker 包括三个基本概念

  • 镜像(Image
  • 容器(Container
  • 仓库(Repository

0x01使用镜像

1.1获取镜像

docker pull ubuntu:16.04

docker run -it ubuntu:16.04 bash
  • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
  • bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash
  • exit 退出了这个容器。

1.2搜寻镜像

docker search ctf

1.3列出镜像

docker images == docker image ls

使用tag添加镜像标签

docker tag ubuntu:latest CTF:latest

1.4中间层镜像

$ docker image ls -a

只列出ubuntu的

docker image ls ubuntu

列出特定的某个镜像,也就是说指定仓库名和标签

$ docker image ls ubuntu:16.04

1.5 删除本地镜像

使用标签删除镜像

docker rmi myubuntu:latest

docker rmi 命令只是删除镜像多个标签中的指定标签而已, 并不影响镜像文件,但是镜像只剩下一个标签的时候要注意 再使用docker rmi命令会彻底删除镜像

强行删除

docker rmi -f ubuntu:16.04

docker rmi id

如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为:

docker image rm  【image id】

1.6 commit

Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

docker commit 的语法格式为:

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

使用history查看镜像历史

docker history ubuntu:16.04

新的镜像定制好后,我们可以来运行这个镜像。

docker run --name web2 -d -p 81:80 nginx:v2

1.7 上传镜像

docker tag test:latest user/test:latest

docker push user/test:latest

0x02 操作镜像

2.1创建镜像

docker create -it ubuntu:latests

docker start af

docker run -it –name dedefun -p 0.0.0.0:8080:80 dedefun:latest /bin/bash

其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。

守护态:

  docker run -d --name dedefun -p 0.0.0.0:8080:80 dedefun:latest /bin/bash

如果使用了 -d 参数运行容器。此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs 查看)。

启动已终止容器

可以利用 docker container start 命令,直接将一个已经终止的容器启动运行。

2.2 终止容器

docker stop ce5

docker start ce5 重启

通过 docker container ls 命令来查看容器信息。

$ docker container ls -a

2.3 进入容器

attach 命令

docker attach 是 Docker 自带的命令。下面示例如何使用该命令。

$ docker run -dit ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia

$ docker attach 243c
root@243c32535da7:/#

注意: 如果从这个 stdin 中 exit,会导致容器的停止。

exec 命令

-i -t 参数

docker exec 后边可以跟多个参数,这里主要说明 -i -t 参数。

只用 -i 参数时,由于没有分配伪终端,界面没有我们熟悉的 Linux 命令提示符,但命令执行结果仍然可以返回。

-i -t 参数一起使用时,则可以看到我们熟悉的 Linux 命令提示符。

$ docker run -dit ubuntu
69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
69d137adef7a        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           zealous_swirles

$ docker exec -i 69d1 bash

2.4导出容器

如果要导出本地某个容器,可以使用 docker export 命令。

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
7691a814370e        ubuntu:14.04        "/bin/bash"         36 hours ago        Exited (0) 21 hours ago                       test
$ docker export 7691a814370e > ubuntu.tar

这样将导出容器快照到本地文件。

2.5导入容器快照

可以使用 docker import 从容器快照文件中再导入为镜像,例如

$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
test/ubuntu         v1.0                9d37a6082e97        About a minute ago   171.3 MB

2.6删除容器

可以使用 docker container rm 来删除一个处于终止状态的容器。例如

$ docker container rm id

如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。

0x03 dockerfile

编写Dockerfile

FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。

COPY .[directory]:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的 directory 目录。

WORKDIR [directory]:指定接下来的工作路径为 directory。

RUN [cmd]:在/app目录下,运行[cmd]命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。

EXPOSE [port]:将容器 port 端口暴露出来, 允许外部连接这个端口。

CMD [cmd]:在容器启动后自动执行 [cmd] 命令
FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000

上面代码一共五行,含义如下。

  • FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
  • COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
  • WORKDIR /app:指定接下来的工作路径为/app
  • RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
  • EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。

创建image文件

 docker image build -t myctf .
docker build - < Dockerfile

-t用来指定 image 文件的名字,后面还可用冒号指定标签,如果不指定,则默认为latest

生成容器

docker container run 命令会从 image 文件生成容器。

 docker container run -p [port_local本地端口]:[port_container容器端口] -it image_name /bin/bash
  docker container run -p 8000:3000 -it koa-demo /bin/bash   这就是在容器离得3000端口映射到本地8000端口 访问本机的8000端口就可以查看

实战

cd 到dockerfile存在的文件下

sudo docker build -t phplfi:v1 .

sudo docker images

sudo docker run -d -p 2333:80 phplfi:v1

sudo docker run -it phplfi /bin/bash

0x04 容器文件

image 文件生成的容器实例,本身也是一个文件,称为容器文件。

# 列出本机正在运行的容器
$ docker container ls

# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all

# 移除不需要的容器文件
$ docker container rm [containerID]

# 容器中止后自动删除容器文件
$ docker container run --rm -p 8000:3000 -it image-file /bin/bash

0x05 网络配置

5.1映射容器端口到宿主主机的实现

容器允许外部访问,可以在 docker run 时候通过 -p-P 参数来启用。

docker run -it –name dedefun -p 0.0.0.0:8080:80 dedefun:latest /bin/bash

自动分配一个端口

docker run -it –name dedefun -p 0.0.0.0::8080 dedefun:latest /bin/bash

0x06 docker命令补齐

执行source xxx命令,先执行source /usr/share/bash-completion/completions/docker,再输入docker,然后按2次Tab键,提示错误如下:

docker bash: _get_comp_words_by_ref: command not found
bash: [: : integer expression expected
bash: [: : integer expression expected
bash: [: : integer expression expected
bash: _get_comp_words_by_ref: command not found
bash: [: : integer expression expected
bash: [: : integer expression expected
bash: [: : integer expression expected

注:第一行的docker,实际是输入的命令,其它是按Tab键的输出信息。

前面已经安装了bash_completion,于是想到执行

source /usr/share/bash-completion/bash_completion

0x06 复现柠檬牛ctf

git clone https://github.com/l3m0n/My_CTF_Challenges.git

cd My_CTF_Challenges

cd

docker build -t dedefun ./

docker run -it –name dedefun -p 0.0.0.0:8080:80 dedefun:latest /bin/bash

curl 127.0.0.1

cd var/www/html

发现只有index.html 就运行下start.sh

./start.sh

退出 exit或者 ctrl +d

 docker image ls

终止状态的容器可以用 docker container ls -a 命令看到

好文:Docker容器的创建、启动、和停止

1、容器是独立运行的一个或一组应用,及他们的运行环境。容器是Docker中的一个重要的概念。

2、docker容器的启动有三种方式
a.交互方式,基于镜像新建容器并启动
例如我们可以启动一个容器,打印出当前的日历表
[root@rocketmq-nameserver4 ~]# docker run my/python:v1 cal ##my/python:v1为镜像名和标签
img

我们还可以通过指定参数,启动一个bash交互终端。
[root@rocketmq-nameserver4 ~]# docker run -it my/python:v1 /bin/bash
img
参数-t让Docker分配一个伪终端并绑定在容器的标准输入上,-i让容器的标准输入保持打开。

使用docker run命令来启动容器,docker在后台运行的标准操作包括
1.检查本地是否存在指定的镜像,不存在则从公有仓库下载
2.使用镜像创建并启动容器
3.分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
4.从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去
5.从地址池分配一个ip地址给容器
6.执行用户指定的应用程序
7.执行完毕之后容器被终止
img
my/sinatra:v2基于training/sinatra镜像进行修改后的镜像,training/sinatra为公有仓库上的镜像。

b、短暂方式,直接将一个已经终止的容器启动运行起来
可以使用docker start命令,直接将一个已经终止的容器启动运行起来。

[root@rocketmq-nameserver4 ~]# docker run my/python:v1 /bin/echo hello test
hello test
命令执行完,控制台会打印”hello test”,container就终止了,不过并没有消失,
可以用”docker ps -n 5 “看一下最新前5个的container,第一个就是刚刚执行过的container,可以再次执行一遍:docker start container_id

不过这次控制台看不到”hello test”了,只能看到ID,用logs命令才能看得到:docker logs container_id。
可以看到两个”hello test”了,因为这个container运行了两次。
img

c、daemon方式,守护态运行
即让软件作为长时间服务运行,这就是SAAS啊!

例如我们启动centos后台容器,每隔一秒打印当天的日历。
$ docker run -d centos /bin/sh -c “while true;do echo hello docker;sleep 1;done”

启动之后,我们使用docker ps -n 5查看容器的信息

要查看启动的centos容器中的输出,可以使用如下方式:
$ docker logs $CONTAINER_ID ##在container外面查看它的输出
$ docker attach $CONTAINER_ID ##连接上容器实时查看:

3、终止容器
使用docker stop $CONTAINER_ID来终止一个运行中的容器。并且可以使用docker ps -a来看终止状态的容器。
img

终止状态的容器,可以使用docker start来重新启动。
img

使用docker restart命令来重启一个容器。
img

invalid argument “Mysqlonline” for t: Error parsing reference: “Mysqlonline” is not a valid repository/tag: repository name must be lowercase See ‘docker build –help’.

原因真正原因是名称中带了大写的M O,将大写改为小写,创建成功。

坑啊,文档中并没有哪里要求只能是小写。

docker run -it –name mysqlonline -p 0.0.0.0:8080:80 mysqlonline:latest /bin/bash

sudo apt install curl

xftp
202 ls
203 cd geekweb1/
204 clear
205 ls
206 pwd
207 docker build -t tset/img /root/geekweb1
208 docker images
209 docker rmi c8daa6cadc73
210 doker stop 036d7eabaf2e
211 docker 036d7eabaf2e
212 docker stop 036d7eabaf2e
213 docker rm 036d7eabaf2e
214 docker rmi c8daa6cadc73
215 lsa
216 cd ..
217 ls
218 rm -rf geekweb1


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 951207194@qq.com

文章标题:docker复现ctf&dockerfile编写ctf环境

文章字数:2,947

本文作者:Mang0

发布时间:2018-10-29, 21:57:39

最后更新:2018-11-02, 21:52:11

原始链接:http://mang0.me/archis/47a94ec3/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏