docker集成lamp—tp5反序列化漏洞

一、win 11安装docker

安装之前首先得保证电脑开启了下面两个选项

docker 搭建tp6 compose docker tp5_thinkphp

docker v20.10.24下载地址:http://docker.p2hp.com/

docker默认安装在C盘,无法在安装时修改安装位置。通过mklink建立软链接的方式,修改安装位置:

#管理员权限下执行,需要在E盘提前新建Docker,且安装docker前建立起软链接
mklink /j "C:\Program Files\Docker" "E:\Docker"

执行完这条命令后再安装docker,会在C:\Program Files\Docker生成链接文件,实际保存在E:\Docker中。

安装完成后,启动docker报错。提示需要更新wsl。以管理员身份运行cmd,wsl --update更新到wsl2版本。

修改镜像保存地址(放在C盘占空间)

默认镜像位置:C:\Users\32897\AppData\Local\Docker\wsl

docker 搭建tp6 compose docker tp5_Docker_02

在想更换的盘符目录下创建同样的文件夹,我这里是:E:\Dockerdata

然后关闭docker程序以及swl (使用命令:wsl --shutdown)

一定要确保所有wsl应用都停止:wsl --list -v

docker 搭建tp6 compose docker tp5_thinkphp_03

导出docker镜像文件

wsl --export docker-desktop-data "E:\Dockerdata\docker-desktop-data.tar"
wsl --export docker-desktop "E:\Dockerdata\docker-desktop.tar"

成功导出

docker 搭建tp6 compose docker tp5_thinkphp_04

注销docker-desktop-data、docker-desktop

wsl --unregister docker-desktop-data
wsl --unregister docker-desktop

指定文件夹重新导入

wsl --import docker-desktop-data "E:\Dockerdata\data" "E:\Dockerdata\docker-desktop-data.tar"  --version 2
wsl --import docker-desktop "E:\Dockerdata\distro" "E:\Dockerdata\docker-desktop.tar" --version 2

docker 搭建tp6 compose docker tp5_docker_05

看到自定义的文件夹中生成了镜像文件

docker 搭建tp6 compose docker tp5_php_06

重新启动

docker 搭建tp6 compose docker tp5_php_07

导入命令时要注意:–version 2

更改源

"registry-mirrors": [
      "https://registry.docker-cn.com",
      "https://xxxxx.mirror.aliyuncs.com"
  ]
  #第一个为docker中国官方的镜像,第二个为阿里云专属镜像(登录自己的阿里云账号即可:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors)

docker 搭建tp6 compose docker tp5_docker_08

注册一个docker账号可以使用其维护的官方仓库:https://hub.docker.com/

本地登录即可使用

二、搭建lnmp平台

1、安装linux系统镜像
  • 搜索Ubuntu镜像
docker search --filter stars=50 ubuntu

docker 搭建tp6 compose docker tp5_php_09

下载官方库中,starts最多的,默认为最新版本

  • 拉取镜像到本地
docker pull ubuntu

等待一会

docker 搭建tp6 compose docker tp5_php_10

查看一下下载的镜像

docker images

docker 搭建tp6 compose docker tp5_php_11

2、启动容器
  • 加载镜像使其成为一个容器
#使用容器搭建一个网站,(-d)后台启动,使用(-i)交互模式
#映射容器80端口到本地8080端口(还有3306端口)以及容器目录到本地目录
docker run -id -p 8080:80 -p 3309:3306 -v E:\www:/var/www/html --name web-lamp ubuntu 

#也可以直接进入到容器,使用-t选项
docker run -ti -p 8080:80 -p 3309:3306 -v E:\www:/var/www/html --name web-lamp ubuntu /bin/bash
  • 登录到容器
    如果要进入容器,首先得确保已经启动
#查看所有容器
docker ps -a  

#启动容器
docker start 容器名或容器id   

#进入容器shell界面
docker exec -it 容器名或容器id /bin/bash

我这里直接进入到交互式shell界面,exit退出交互模式后,容器就关闭了,需要重新开启在登录

docker 搭建tp6 compose docker tp5_php_12

3、搭建lamp
  • 下载需要的软件
apt-get update
apt install -y nginx php-fpm mysql-client mysql-server vim

这里需要选择一下时区亚洲、上海

docker 搭建tp6 compose docker tp5_php_13

  • 配置nginx环境
    打开:/etc/php/7.4/fpm/pool.d/www.conf
    记住这个文件路径:/run/php/php7.4-fpm.sock

docker 搭建tp6 compose docker tp5_反序列化_14

去掉这句注释:listen.allowed_clients = 127.0.0.1

docker 搭建tp6 compose docker tp5_反序列化_15

打开:/etc/nginx/sites-enabled/default

去掉这几行注释,加上index.php,要注意这个文件路径:/run/php/php7.4-fpm.sock

docker 搭建tp6 compose docker tp5_thinkphp_16

要注意这个大括号闭合,踩坑了

  • 启动PHP、nginx和mysql服务
service php7.4-fpm start
service nginx start
service mysql start

docker 搭建tp6 compose docker tp5_php_17

访问测试一下

nginx搭建成功

docker 搭建tp6 compose docker tp5_docker_18

在/var/www/html中新建一个phpinfo.php用来查看phpifo信息

php搭建成功

docker 搭建tp6 compose docker tp5_反序列化_19

  • 安装PHP拓展
apt install php7.4-mysql php7.4-curl php7.4-json php7.4-mbstring php7.4-xml php7.4-intl

#安装完成后重启
service php7.4-fpm restart

重新访问一下phpifo,发现拓展已安装

docker 搭建tp6 compose docker tp5_php_20

  • 配置mysql
    配置mysql安全策略:mysql_secure_installation
    具体配置视情况而定
    注意:
    MySQL 5.7.6 及更高版本,并且默认认证插件是 caching_sha2_password,则无法使用 mysql_secure_installation 更改“root”用户密码。
    caching_sha2_password 认证插件要求密码必须包含至少一个数字、一个小写字母、一个大写字母和一个特殊字符,并且长度必须至少为 8 个字符。
    执行这条命令需要输入root用户密码,这里设置一下root用户密码为root,需要先启动mysql
    我这里下载了最新的版本,因此需要手动配置,配置安全策略时就不选更改root用户命令了。
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'ROOt@123';

docker 搭建tp6 compose docker tp5_反序列化_21

成功配置

4、搭建tp5.0.24环境

由于前面加载镜像的时候,将本地的目录和容器里的目录进行了映射,方便上传源码文件

在本地将thinkphp5.0.24文件放到对应目录即可,本地访问:http://127.0.0.1:8080/Thinkphpv5.0.24/public/?a=1。其中a=1 的1可以替换为base64编码的poc

docker 搭建tp6 compose docker tp5_Docker_22

为了方便测试,我将poc也放上去:http://127.0.0.1:8080/Thinkphpv5.0.24/public/poc.php

docker 搭建tp6 compose docker tp5_php_23

webshell名为:a.php12ac95f1498ce51d2d96a249c09c1998.php

docker 搭建tp6 compose docker tp5_thinkphp_24

三、环境容器打包成镜像

容器打包

docker commit -a="restorejustice" web-lamp restorejustice/thinkphp5.0.24rce

#解释
web-lamp为要打包的容器
restorejustice/thinkphp5.0.24rce为仓库名(一般为个人账户id)/镜像名,默认tag为lastas

docker 搭建tp6 compose docker tp5_Docker_25

上传到个人仓库,上传了几次成功

4849)]

三、环境容器打包成镜像

容器打包

docker commit -a="restorejustice" web-lamp restorejustice/thinkphp5.0.24rce

#解释
web-lamp为要打包的容器
restorejustice/thinkphp5.0.24rce为仓库名(一般为个人账户id)/镜像名,默认tag为lastas

docker 搭建tp6 compose docker tp5_反序列化_26

上传到个人仓库,上传了几次成功

docker 搭建tp6 compose docker tp5_反序列化_27


docker 搭建tp6 compose docker tp5_Docker_28