---
# System prepended metadata

title: HITCON2020 擺攤設計
tags: [擺攤, HITCON]

---

# 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，順便來按讚ＸＤ
:::

- 前情提要：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/'
```
