基于xinetd利用docker部署pwn题目

一、安装docker

docker基本命令(参考docker入门,这一篇就够了。-CSDN博客

1、搜索镜像

docker search

docker search centos  #从docker hub中搜索docker名为centos的镜像

大家可以看到搜索出来的最上一行有几个表头,这里给大家介绍一下
name:代表此镜像的名称

description:此镜像的描述

stars:下载次数

official:是否由官方提供(官方提供可放心下载,可以基于此镜像做自己的镜像)

2、拉取镜像

docker pull ,默认是拉去docker hub上搜索到的最新版本(第一个)

docker pull centos

3、查看镜像

docker images  #查看已下载镜像。

4、使用U盘的方式导入镜像

比如把docker-centos-httpd.tar镜像上传到linux上,就需要用到==docker load -i ==命令

docker load -i /root/docker-centos-httpd.tar

导入之后可以使用docker images查看。

注意上图,tag代表标签,image id代表镜像ID。这是我们区别镜像的方式。
另外提一下,还有一种直接下载其他站点镜像的方法,命令如下:

docker pull hub.c.163.com/library/tomcat:latest

注:docker镜像相当于,对程序+程序依赖的库直接打包

5、Docker平台的基本使用方法

1、帮助命令

docker version     #显示docker详细信息
docker info       #显示docker的系统信息,包括镜像和容器的数量
docker --help     #docker帮助命令手册
 

2、镜像命令

docker images  #查看所有本地主机的镜像
docker search 镜像名           #搜索镜像
docker pull 镜像名 [标签]      #下载镜像(如果不写tag,默认是latest)
docker rmi 镜像名 [标签]       #删除镜像    docker rmi -f $(docker images -aq)  删除全部镜像
docker tag  镜像名:版本   新镜像名:版本    #复制镜像并且修改名称
docker commit  -a "xxx"  -c "xxx" 镜像ID 名字:版本   #提交镜像 
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;

docker load -i    /xxx/xxx.tar         #导入镜像
docker save -o   /xxx/xxx.tar          #保存一个镜像为一个tar包
 

3、容器命令

docker run [可选参数] image 命令 #启动容器(无镜像会先下载镜像)
#参数说明
--name = "Name"   容器名字
-c   后面跟待完成的命令
-d   以后台方式运行并且返回ID,启动守护进程式容器
-i   使用交互方式运行容器,通常与t同时使用
-t   为容器重新分配一个伪输入终端。也即启动交互式容器
-p   指定容器端口    -p 容器端口:物理机端口  映射端口
-P   随机指定端口
-v   给容器挂载存储卷

docker build  #创建镜像        -f:指定dockerfile文件路径   -t:镜像名字以及标签
docker logs 容器实例的ID          #查看容器日志
docker rename 旧名字  新名字      # 给容器重新命名
docker top    容器实例的ID                  #查看容器内进程
docker ps -a                    #列出所有容器(不加-a就是在运行的)
docker rm      容器实例的ID                 #删除容器(正在运行容器不能删除,除非加-f选项)
docker kill  容器实例的ID        #杀掉容器
docker history   容器实例的ID    #查看docker镜像的变更历史
docker start 容器实例的ID        #启动容器
docker restart 容器实例的ID       #重启容器
docker stop 容器实例的ID         #停止正在运行的容器
docker attach /docker exec  容器实例的ID   #同为进入容器命令,不同的是attach连接终止会让容器退出后台运行,而exec不会。并且,docker attach是进入正在执行的终端,不会情动新的进程,而docker exec则会开启一个新的终端,可以在里面操作。
docker image inspect  容器名称:容器标签       #查看容器内源数据
docker cp  容器id:容器内路径   目的主机路径           #从容器内拷贝文件到主机(常用)或者从主机拷贝到容器(一般用挂载)
exit                           #直接退出容器 
crlt + P + Q                   #退出容器但是不终止运行

二、克隆xinetd

命令:git clone https://github.com/Eadom/ctf_xinetd

关于ctf_xinetd下的目录介绍:

bin目录下面放的是flag和pwn题目程序文件;

默认是helloworld和flag,我们可以将它们替换成我们自己想要的flag和题目程序

(注意在做这些替换之前不要去创容器、拉取镜像这些,什么意思呢,如果你已经创好了这道题的容器,那么它里面放的就是helloworld和默认flag的内容,这时你再去bin目录里作更改是无效的,bin目录里内容虽然改了,但是容器里的东西是没改的,并且,对于容器中来说,helloworld和flag并不在bin目录,而是在 /home/ctf 目录下)

关于更换flag和pwn程序我们有两种方法:

(1)在创建容器之前,替换bin目录下的内容;

直接改flag的内容或者自己拉一个进去,再拉一个题目程序进去,并删掉原来的程序(helloworld),注意,拉进来的题目程序需要有可执行权限,我们使用chmod命令加权(chmod 750 stack)一般加到750就够了,加777权限更高但是风险也上去了,这里建议加750就行。

加权之后我们发现程序名变成了绿色,说明该程序已经具有可执行权限

(2)哪怕我们创建好了题目容器,后面又需要更换flag或者题目程序,我们可以使用docker cp 命令来替换:

docker cp 程序所在位置(如果你是在文件当前路径那就直接用文件名) 容器名:要添加到的位置

比如我们更换flag:docker cp flag eb5d199dfc0f:/home/ctf

#eb5d199dfc0f是你自己这道题的容器名
但是更建议各位创建容器之前就对bin目录里内容进行替换

接下来我们还需要改另外两个文件,如果不改,你只能连接本地,即nc 0.0.0.0 才能访问,而将0.0.0.0替换成你靶场地址时就无法访问。

因为我们下载的这个 ctf_xinetd 它里面默认端口是被映射到了9999,而我们前面说了,我们需要的是80,因此我们要将所有的9999替换成80。

1.vim ctf.xinetd
将port改为80(这里顺便把./后面的hellworld改成你放到bin目录下的程序名)

修改后wq保存退出 

2.vim Dockerfile
将expose改为80并保存退出

现在我们才开始创建容器:docker build -t "test" .(这个test是你创建的镜像的名称,应该是可以随便取的,但是我用的是pwn程序名,方便之后的管理和识别)

注意创建容器要在ctf——xinetd文件夹中打开终端

创建好后,我们启用它:docker run -d -p "0.0.0.0:8090:80" -h "stack" --name="stack" stack

这里的test换成你自己的bin目录下的pwn程序名,8090换成你自己希望放的一个未使用的端口。

启用成功后我们便可看到这个容器

我们直接nc 靶场地址 端口(本地就是127.0.0.1 端口)可以成功建立连接并获取flag,至此,我们在终端的部署完成,接下来只需将题目添加到CTFd前端即可

三、关于部署多道pwn题

1.使用的pwn_deploy_chroot介绍

特点:#一次可以部署多个题目到一个docker容器中
           #自动生成flag,并备份到当前目录
           #也是基于xinted + docker + chroot
           #利用python脚本根据pwn的文件名自动化地生成3个文件:pwn.xinetd,Dockerfile和                      docker- compose.yml
           #在/bin目录,利用自己编写的静态编译的catflag程序作为/bin/sh,这样system("/bin/sh") 实               际执行的只是读取flag文件的内容,完全不给搅屎棍任何操作的余地                 
           #默认从10000端口监听,多一个程序就+1,起始的监听端口可以在config.py配置,或者生              成pwn.xinetd和docker-compose.yml后自己修改这两个文件

2.环境配置

# 安装docker
curl -s https://get.docker.com/ | sh
# 安装 docker compose 和git
apt install docker-compose git
# 下载pwn_deploy_chroot
git clone https://github.com/giantbranch/pwn_deploy_chroot.git

3.操作步骤

1、将你要部署的pwn题目放到bin目录:我的已经将一个程序copy了3份作为示例,注意文件名不要含有特殊字符,文件名建议使用字母,下划线,横杆和数字,当然全字母的当然最好了

2、运行initialize.py,运行脚本后会输出每个pwn的监听端口

文件与端口信息,还有随机生成的flag默认备份到flags.txt

3、启动环境(请使用root用户执行命令)

    sudo docker-compose up --build -d

不出意外,题目就启动起来了

 注:Netstat命令是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况(许多新版本的 Linux 发行版推荐使用 ss 命令来替代 netstat,因为 ss 提供了更快和更详细的网络连接信息。)

测试一下test1,看看能否获取权限

成功!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值