# HITCON2020 擺攤設計
###### tags: `HITCON`、`擺攤`
:::info
[TOC]
:::
* 設計LOGO貼紙
> 我試設計看看XDDD [name=Ting]
<img src="https://i.imgur.com/Uye9dcc.jpg" width=400px>
* 用活動代幣當獎品
* 弄個排行榜(for挑戰者)?[name=Ting]
## 活動構想草稿
* 簡易流程大綱
```
Step 1:
-> crypto(如:A 發現,公司內的 B 和 C 有本交換日記,內容用他們兩個約定好的符號撰寫(對稱加密),解開可以得到他們一起建立的網站)
-> misc(如:拼圖拼出QR code)
Step 2:
-> web(拿到網址)
-> pwn(拿到檔案)
Step 3:
-> 用解出來的Flag可以再幹麻(解謎)之類的?
```
* 第一步可能有不同進入題目、取得下載連結的方式,有不同支線
* 桌面佈置成像辦公室桌面一樣(放兩台電腦?)
* 進入題目的方式:翻找桌上筆記本的內容、日記內容、條碼下面的數字之類的
## Story
### 故事接龍
- 發現辦公室戀情,交換日記,內容用約定好的符號撰寫,解開得到他們一起建立的網站
- 駭入人資資料庫,取得職員個資 [name=david]
- 網站有漏洞
- 利用個資破解某某的電腦密碼 (實體攤位) [name=david]
- 爛密碼
- 破解 msg.exe: 得到他們的簡訊資料
- 用簡單逆向找到登入帳密,進入 msg.exe
- eg. 程式讀檔,用 DES 解開成明文,然後比對
- 或者帳號輸入處有 overflow 漏洞,可以直接跳到已登入函式
- 登入以後有兩階段驗證,但隨機產生器跟時間有關
- 旁邊有 app 可以修改系統時間
- 一起建立的網站上,放著一些公司的八卦
### 故事細節
:::info
可以在“粉專”po一些資訊(e.g 密碼/IP/Port...),讓玩家可以做recon,順便來按讚XD
:::
- 前情提要:A 跟 B 是一對十分恩愛的情侶, 但是從某個時後開始, B 就跟他們的共同好友 C 密集聯絡, 並且連聊天內容都不給 A 看, 引起 A 的醋意, A 決定起身調查
- crypto (1) [name=JyunD]
- 某天趁 B 出門, A 從 B 的書桌上找到一本筆記本, 看似是交換日記, 但是內容卻怎麼樣也看不懂
- 翻著翻著, A 發現最後一頁有神秘的符號, 看似可以將日記內容解密, 於是開始用符號一一對照
- 解開後得到一個連結, 連上去是一個簡陋的網站, 並且需要帳號密碼登入後才能使用
- 簽到簿,其中一頁是 table
- web 1~3 [name=🎃] [name=david]
- 於是 A 開始想辦法得到帳號密碼
- 他從網站文件找到許多線索, 最後得到一組帳號密碼, 並嘗試登入
- 登入才發現帳號沒有權限, 必須要是 admin
> eg. 看到一堆 [已刪除訊息]
- 最後透過 sql injection 才成功登入 admin
> 才能看到被刪除的訊息,歷史紀錄之類的
> 1. 登入:
> - 透過 robots.txt 後門登入
> - 透過 injection,配合 src 研究如何登入 (難)
> 2. 發現權限不夠:
> - 回第一步研究 injection 提權登入
> - 直接用 injection 撈資料 (難++)
> - (profile 也有 injection)
- 刪除的訊息接到 yen 網站
- rev/pwn [name=Yen]
- new ver
- 進入到後台(admin)之後,發現有一張叫bin.jpg的檔案
- 抓下來後發現其實是個ELF(這邊應該可以加一點rev),簡單的BOF(或者其他pwn的題目),拿到了shell
- ~~然後做內網滲透~~ 發現另外一台主機(之後接到pentest)
> "[已刪除訊息] 欸我們要不要換個平台啊,不然網站到時候被駭就糟了www"
> "[已刪除訊息] 同意+1"
> "[已刪除訊息] 改用這個吧,密碼老樣子 [附件: bin.jpg]"
- old ver
- 進去後, A 發現網站的成員不只有 B, C, 還有很多認識的朋友也在裡面
- 看到討論串頁面, 在則留言後有人提議使用 `msg` 來討論, 不然網站被駭入就糟了, 並且附上 `msg` 的載點
- 下載後, 透過 reverse 找到了網站主機有對外開放一個特別的 port 以及神秘數字
- 解開得到 png 檔
- pentest [name=Artis] <-- 要變成 stego 了QQ
- new ver.
- 藉由「某種方式」得到 `qrcode.png`
- 掃描後顯示 `There is something 'in' the picture. Hint1: strings`
- `strings qrcode.png` 在最後一行看到 `Hint2: zsteg`
- `zsteg qrcode.png` 得到表單網址
> https://drive.google.com/file/d/1OC5I9xM1KojHpYTuJKw-icUcFHL1p6UY/view?usp=sharing
- old ver.
- 透過 `nc` 連到 port 後, 回答一系列問題(前面的總整, e.g. 某個符號的意思->A的帳號是->神秘數字是多少), 並連上網站主機
- banner 提到: `/root/qrcode.png` 絕對不能給 A 發現, 而連上的主機並沒有權限閱覽, 所以要 privilege escalation
- 最後拿到 `/root/qrcode.png`, 發現打開是一張不能掃的二維碼
- 發現二維碼用文字編輯器打開後, 尾端有一個短網址
- 解開得到 google 表單
- google 表單 (故事結尾) [name=瓈方]
- 短網址跳到是 google 表單, 內容是填寫參加 A 生日派對的相關資料
> 表單網址(https://forms.gle/vBe1sQckPAdRmsSd9)
- 原來他們準備幫 A 辦生日派對, 不想讓 A 知道這件事情, 所以才設置層層關卡
- (包裝成派對調查之類的)
- 全破以後發代幣 / 點數
## Overall Flow
1. 一本筆記本,前幾頁給我們寫對話 & 密文 + table,解開密文後得到 url1
2. url1 可以看各種使用者的訊息,透過 sqli 取得 admin 使用者後得到 url2
3. url2 中有 fmt 的通關遊戲,會得到 qrcode
4. qrcode 解完後會有 google 表單 (故事ending)
5. ending 結束後有心得回饋/調查,做完後得到一組序號,可以透過此序號來攤位換精美小獎品 (代幣/點數)
> Hints: 按讚打卡 / 講笑話 (?)
> 題目開 github 串起來,寫 docker-compose (可請南瓜幫忙)
## 場佈
- 最晚 8:00 到
- 前一天也開放哦 (但我到不了Q)
- Server:
- Wifi 分享器然後提供本地服務,多幾台 / 遠端備用
- 或者大會可能會發 IP (?)
> 最後是直接放遠端
- 筆記本:
- 簽到簿,其中幾頁是故事 & 密文 table
- 劇情南瓜可以想一些
- 也可以星期三把筆記本拿來ADL實驗室大家來幫忙寫(?
- 南瓜有舊的筆記本
- 白板:
- 一些裝飾 / 畫畫
- 上面也可以放一些規則 / 故事情節描述
- 貼紙:好像快好了
> 結果老闆做了快一個禮拜還沒做好
- 代幣:yen 問一下怎麼提供
## 排行榜
- 全破名單 / 排行榜
- ~~or 闖關成功證書~~
- 網站排行 or 在白板上簽名
- jason 幫忙?
- (但白板要容易碰得到...)
> ~~https://reurl.cc/0OX14x~~
> https://reurl.cc/GrEN8Z
> 最後是使用 google script,表單送出後,直接對目標 google doc 做寫入。
## 其他
- 用白板筆寫的口號挖空 (?)
## 未來改進
- 雷點的部分,有寫在 [Writeup](https://hackmd.io/f6F44XrDSDW5MV9zMn1t2A?view) 裡。
- Crypto 因為原本只設想是針對全英文網址,但後來網址出現數字,導致一個有 rotation 一個沒有,造成混淆以及難度上的提升。
- Web 生成的額外 token,原本是成功用 admin 登入後才會彈出來,結果條件沒設好,變成是只要看到 "小辣椒" 的頁面,就會看到 token。(這是最後才改上去的,沒有經過仔細的測試)
- 
- 題目可能可以再簡單一些,只有六個人解開 (但有 12 個人以上來挑戰)
## Crypto
```python
import string
import math
import numpy as np
table = '''
0 l i u d x
e w q p 6 k
r g 4 z . 9
5 n 8 2 m b
h v 1 a o t
s c 3 7 j y
'''
plaintext = "hao.kang.der.zai.zhe.li:ip.140.115.59.92.port.8000!.don't.let.him.see.this.it's.top.secret!!!"
ciphertext = "05 10 32 42 14 10 55 02 42 44 31 15 42 51 10 54 42 51 05 31 42 11 54 : 54 34 42 24 22 00 42 24 24 03 42 03 52 42 52 33 42 34 32 15 01 42 23 00 00 00 ! 42 44 32 55 ' 01 42 11 31 01 42 05 54 50 42 40 31 31 42 01 05 54 40 42 54 01 ' 40 42 01 32 34 42 40 31 13 15 31 01 ! ! !"
def encrypt(plaintext, table):
table = list(np.array(list(map(lambda x: x.split(),table.split('\n\n')))).flatten())
return ' '.join([str(table.index(p)%6)+(str(math.floor(table.index(p)/6))) if p in table else p for p in plaintext])
def decrypt(cipher, table):
table = list(map(lambda x: x.split(),table.split('\n\n')))
return ''.join([ table[int(c[1])][int(c[0])] if c not in string.ascii_letters else c for c in cipher.split()])
def trans_caesar(cipher , offset):
return "".join([ chr(((ord(c) - ord('a') + offset) % 26) + ord('a')) if c in string.ascii_letters else c for c in cipher])
plaintext = "https://www.google.com/"
offset = 15
cipher1 = trans_caesar(plaintext, -1*offset)
# 'seead://hhh.rzzrwp.nzx/'
cipher2 = encrypt(cipher1, table)
# '05 01 01 34 40 35 24 24 04 04 04 42 02 32 32 02 11 31 42 13 32 50 24'
plaintext = decrypt(cipher2, table)
# 'seead://hhh.rzzrwp.nzx/'
plaintext = trans_caesar(plaintext, offset)
# 'https://www.google.com/'
```