# 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。(這是最後才改上去的,沒有經過仔細的測試) - ![](https://i.imgur.com/6v5JxiK.jpg) - 題目可能可以再簡單一些,只有六個人解開 (但有 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/' ```