1
docker快速搭建环境的思路
Docker是个好东西,希望你有一个。
Docker的出现不止在开发领域,在安全领域也有很多用处,最基础的就是漏洞环境了。
之前我也写过一系列低级的文章来描述docker的使用,以及docker怎么快速搭建漏洞环境。
今天就来一篇实战的和说一些高级用法~
之前我说过能快速搭建起漏洞环境才是王道,至于你搞出来的容器像不像一些大牛github上开源漏洞环境的dockerfile那么优雅。倒不是重点了~
用最挫的办法docker cp docker commit完成得比别人快,比别人更快的复现不就行了,能够快速复现出PoC你的时效性就高,攻防是争分夺秒的。
这次,我想对wordpress插件进行研究,顺便输出几个PoC。
很懒的我自然不会配一个环境了,由于戒掉了在物理机上用phpstudy 的习惯(实在是不安全啊…)所以就基本改用docker了。
docker pull了一个wordpress镜像,wordpress在官方是有镜像的。然后再拉一个mysql的镜像连接起来,官方的数据库没有封装mysql进去的,详情可以看wordpress github的docker file:https://github.com/docker-library/wordpress/。
原本以为又是安逸的一天,一切都顺顺利利的,我运行起docker然后安装上插件,然后复现,写PoC,走人。没想到蛋碎一地,碰到了好多问题。
2
docker link的介绍
首先介绍下docker link,映射网络端口不是吧container彼此连接起来的唯一方法。Docker的linking系统允许你吧多个 container连接起来, 让他们彼此交互信息。Docker的linking会创建一种父子级别的关系。 父container可以看到他的子container提供的信息。
Docker的linking系统依赖于container的名字。我们已经注意到了每个container都会被自动的分配一个名字
比如我起一个pentest的docker,那么就会打开自动为其分配一个名字,这里分配的名字是practical_morse。如下图:
为了容器连接的方便,我们通常会为其指定一个名称,可以用docker run –-name xxxx来指定名称。
但是值得注意的一点,如果我们指定名称来启动docker,那么这个名称的容器信息会被永久的存在硬盘里面,这点与自动分配docker名称启动是不一样的。哪怕我们停止或者删除容器还是会存在。下次如果你还要指定相同的名称会报如下错误。
我们可以通过docker rename,双击tab键来看看我的硬盘里面存在哪些指定名称。
tab会自动补齐,显示,这样比docker history去看更方便。
解决命名问题的方法有两种:
一种是刚刚说的docker name,运行命令:docker rename pentest xxxxx
第二种是在启动的时候指定--rm,这样在停止容器的时候就不会将名称留在硬盘里头了,运行命令:docker run --rm --name pentest pentest:v8
我兴致冲冲的准备启动mysql容器后将wordpress的容器与之连接。
接着我们聊聊docker link的用法:
首先我们要启动一个父容器,也就是mysql容器,然后启动子容器连接它。
docker run --rm --name wordpress --link mysql:latest
3
碰到的坑
一、发现虚拟机的磁盘空间不足,
在我运行完mysql镜像的时候,我用docker ps查看是否有正在运行的镜像,即镜像有没有运行成功。
出现了如下状况,运行失败了。
这时候老司机肯定想到用docker history排坑。而我用的是,直接运行,不让他在后台运行。
这种不带参数的运行方式会爆出异常的原因。
我们发现/dev/sda1占用率是100%...
悲催,貌似在创建虚拟机的时候没有选择自动扩容,只能手动扩容了。
用到的工具gparted:https://sourceforge.net/projects/gparted/files/
重启ubuntu的时候选择以这个软件的镜像启动,bios快速启动cddvd。
依次删除 linux-swap项, extended项, 最后只剩下sda1和未分配, 然后右键"sda1"项进行调整大小, 将磁盘容量调整到合适的大小并预留空间作为交换区,交换区的大小为你系统内存的大小
再右键"未分配"进行扩展分区出extended分区,然后新建逻辑分区linux-swap
扩容成功。
4
连接wordpress容器与mysql容器
1、 wordpress容器的参数介绍
启动 WordPress 容器时可以指定的一些环境参数包括:
-e WORDPRESS_DB_USER=... 缺省为 “root”
-e WORDPRESS_DB_PASSWORD=...
缺省为连接mysql容器的环境变量 MYSQL_ROOT_PASSWORD 的值
-e WORDPRESS_DB_NAME=... 缺省为 “wordpress”
-e WORDPRESS_AUTH_KEY=...
-e WORDPRESS_SECURE_AUTH_KEY=...
-e WORDPRESS_LOGGED_IN_KEY=...
-e WORDPRESS_NONCE_KEY=...
-e WORDPRESS_AUTH_SALT=...
-e WORDPRESS_SECURE_AUTH_SALT=...
-e WORDPRESS_LOGGED_IN_SALT=...
-e WORDPRESS_NONCE_SALT=... 缺省为随机 sha1 串
运行命令:
docker run --name mysql_vul -e MYSQL_ROOT_PASSWORD=vaf -d mysql
docker run --rm --name wordpress --link mysql_vul:mysql -p 8080:80 -d wordpress_test
2、 wordpress官方容器upload_max_filesize上传大小的限制
这里我们需要修改php.ini。
在docker中有三种方法修改:
A、 在docker file中修改
RUN touch /usr/local/etc/php/conf.d/uploads.ini && echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini
B、 修改 .htaccess文件
用find . -name ‘.htaccess’命令,我的文件地址在:/var/www/html/.htaccess
增加以下内容:
C、 创建一个uploads.ini文件
将其上传至/usr/local/etc/php/conf.d目录。
使用docker cp命令
docker cp upload.ini 47f4:/usr/local/etc/php/conf.d/upload.ini
重启apache之后就可以放飞自己了。
5
漏洞复现
说来也是吐血,原本简简单单的一个漏洞复现到现在才到了这一步。
不过也没事,以后wordpress的靶场基本就现启现用了(多是复现、研究一些插件的漏洞)。
在wordpress的官方网站:https://cn.wordpress.org/plugins/
基本是搜索不到这个存在漏洞的插件的,官方对待这种爆出漏洞的插件除了下架基本就是杀一个程序员祭天了。
你搜索这个漏洞插件那么wordpress官方就会把你定位到一个官方的安全插件,PV。
搜索存在漏洞的插件推荐以下网站,大部分都能找到的。
第三个是wpscan的官网,wpscan可以说是一块不错的渗透工具
1、 http://chooseplugin.com/plugin-info/
2、 http://wp-plugins-directory.com/
3、 https://wpvulndb.com/
然后复现就是一句话的事情了~
给出payload:
Python版本的exp可以去github上搜索呀,暂时不放链接了。
参考链接:
http://www.vapidlabs.com/advisory.php?v=178
http://www.vapidlabs.com/advisory.php?v=179
http://www.vapidlabs.com/advisory.php?v=180
http://www.vapidlabs.com/advisory.php?v=181
http://www.vapidlabs.com/advisory.php?v=182