---
# System prepended metadata

title: CTF intro
tags: [Enlightened, NISRA, '2021']

---

# CTF intro

:::danger
請愛惜共筆，勿進行惡意刪減
:::

**C**apture **T**he **F**lag

:::info
[NISRA CTF](https://class.enlightened.nisra.net/)
[NISRA Target Server](http://peko.nisra.net/)
請大家愛惜server，不要欺負它peko QQ
[Chess 學長的鐵人賽](https://ithelp.ithome.com.tw/users/20130066/ironman/3448)
:::

### 請先下載以下兩份檔案
[SimpleKeyCheck](https://drive.google.com/file/d/1JW-sSJbdPNNr3W_ygnNVPR0atrGfsUaL/view?usp=sharing)
[simple-rev](https://drive.google.com/file/d/12aVSD_-MszMwTANjwDYkg1HpiWPkIS8u/view?usp=sharing)

---

:::spoiler Table of Content
[TOC]
:::

## 常見的幾種形式

* Jeopardy
* Attack & Defence
* King of the Hill
<!---->

### Jeopardy

* pwn
* reverse
* Web
    * 有漏洞的web服務
    * 利用漏洞在網頁中找出flag
    * XSS SQLinjection...
* Crypto
    * 數學
    * 古典 凱薩 維吉尼亞..
    * 現代 RSA ...
* Misc
    * 通靈(?
* Forensic
    * 數位鑑識
    * 各種log, 封包, Dump

### 練習地方

* CTF Time
* Pico CTF
* NISRA Training

### 國內的競賽

* AIS3 Pre Exam
* AIS3 EOF
* 合勤控 榮耀資戰 (只辦過一屆
* 金盾獎 (行政院主辦)
* Balsn CTF
<!--都好難嗚嗚-->

## 課程環境

- 這次靶機走 http 協定，**切勿拿真的帳號密碼註冊**
- ~~偷偷說有彩蛋，所以課程全部結束後還可以去挖挖看~~

## 基本的網路 & 網站架構

- 用 HTTP/HTTPS 協定對目標伺服器請求資料
- HTTP
	- 超文本傳輸協議 **H**yper**t**ext **T**ransfer **P**rotocal
	- 定義如何向伺服器請求資料
- Example:
    - GET 請求時，利用 HTTP/1.1 協議請求在 peko.nisra.net 這個 server 在 / (根目錄) 的所有資料
    ```htmlmixed=
    GET / HTTP/1.1
    Host: peko.nisra.net
    ```
- HTTP Vs. HTTPS 
    - HTTP 
        - **沒有**對傳輸資料做加密
    - HTTPS（HTTP secure）
    	- **允許**對傳輸資料進⾏加密
        - HTTPS 需要向憑證頒發機構申請相關憑證

### 我們到底做了啥

- 回顧我們平常上網做了那些動作
    1. 打開 瀏覽器（Browser）來顯示和找東西
    2. 打網址
        - IP Address
          相當於你家門牌
        - Domain Name
    3. 看到漂漂亮亮的網站
        - Request & Response
            - HTTP/HTTPS
## 前端？後端？

![](https://i.imgur.com/Av40uwl.png)

### 前端

- **前端的所有東⻄都會直接顯⽰給使⽤者**
- 網頁三兄弟 Review
  前端的**所有東西**會直接給使用者看
	- HTML
		- 網頁顯示內容 & 架構
		- 內容的順序不重要
		  結構最好乾淨明瞭
    - CSS
        - 網⾴的畫⾯跟排版
    - JavaScript
        - 畫面互動
- What can front-end do？
	- 減少驗證資料成本
    	- 檢查資料
    		- 強制輸入
    		- 檢查密碼是否相同
    	- 限制輸入資料格式
    		- [0~9]{14, 16}檢查信用卡號
    	- 其他殺手技巧請詳閱公開說明書
	- 顯示正確的內容
- 後台 == 後端？
    - 後台是工程師為了方便管理網站所撰寫的管理介面
    - 一般使用者不會直接看到的管理介面
    - `xxxx.com/admin.php` : 簡化管理人員對於網站狀況的理解和資料的更新

### 後端

- LAMP
	- **L**inux
	  > 去看 Day 02 OS
	  > [Sauce Here](https://hackmd.io/@nisra/SJko9QrkF/%2Fqa7ZB34hSrCwnU3z_tptWg)
	  > [name=404/懶得打字的OS講師]
	- **A**pache
	    - Web 伺服器軟體之⼀
        - 處裡 Server 接收到的 HTTP 協定
        - ~~不是那個直升機~~
	- **M**ySQL
		- 網頁資料庫
		  SQL 的一種
		- 負責管理所有網站要儲存的資料
	- **P**HP
		- ~~全世界最好的語言~~
        - ⼀種伺服器端**程式語⾔**
            - 動態語言
        	- 高度擴充性
            - 存在黑魔法
              請各位法師就定位
            - 弱型別語言
            	- 有 `==` 與 `===` 的差別
            		- `==` 只比較記憶體中的值
            		  ex. 字串"11" == 整數11
            		- `===` 除了值相同外，還要型態相同
			:::spoiler PHP MD5 Example
            ```php=
            if($a != $b && md5($a) == md5($b))
            {
                echo 'T';
            }
            ```
			- 在這例子中
			  如果\$a一定跟\$b不一樣的話
			  兩個出來的md5有可能相等嗎?
			- `0e` 開頭的字串會被轉成 `int` 整數
			:::
    	- 處理網站前端的請求
        - 驗證資料
        - 溝通資料庫
        - 動態顯示網頁資料

#### What is SQL

- **S**tructured **Q**uery **L**anguage 結構化查詢語言
- 專門用來處理資料的存取與管理
- 三層架構
	1. Database 資料庫
	2. Table 表
	3. Column
	- 一個資料庫裡面有多張表
	  一張表裏面又有多個 column
	  ![](https://i.imgur.com/TOj9lTm.png)
- 一定具備四個基礎行為 : CRUD
	1. Create
	2. Read
	3. Update
	4. Delete
- 資料庫會被攻擊
  但不是直接對資料庫攻擊
  利用**後端語言**溝通資料庫時的語法漏洞進行攻擊

#### SQLi

```php=
<?php

$name = $_POST['name'];

$query = "INSERT INTO `Students`(name) VALUES ('" .$name . "')"

?>
```

如果name那邊輸入`Robert'); DROP TABLE Students;--`
`Students` 這個Table會被刪除
- 直接把輸入放入 SQL 語法中
- 完全沒有過濾輸入

### robot.txt <br>^Google爬蟲退散給我手動爬^

- `robots.txt`：包含檢索器可存取網站哪些部分的相關規則
  存於網頁根目錄
  > 但你不是爬蟲工具
- 存放於網站根目錄下的ASCII編碼文字檔案
    - 必須全部小寫
        - 避免 url 大小寫敏感問題
- 管理後台
    - 避免後台被索引~但直接看到所有Dissallow?!!~
        - 利用路徑匹配，間接禁止索引真正位置

```robot.txt
User-agent: *
[x] Disallow: /you_will_never_see_me/
[o] Disallow: /you_will_never
```

<!--小天使們已集體陣亡，歡迎各位支援-->

## Hash 雜湊、哈希

![](https://i.imgur.com/6vu7Ggr.png)

- 將任意長度的字串轉成固定長度
- 特性
	- 雪崩效應
	  字串即使只有動一個字，Hash 結果差異很大
		- md5(1234) = 81dc9bdb52d04dc20036dbd8313ed055
		- md5(1235) = 9996535e07258a7bbfd8b132435c5962
	- 無法回推
	  可以從 X 算出 Hash(X)，但無法從 Hash(X) 算出 X
	- 抗碰撞
	  很難找到兩個不同字串 X 與 X’符合 Hash(X) = Hash(X')
- 用途
	- 驗證資料完整性
		- 用安全通道傳檔案 Hash 值
		  就可用較不安全通道傳大檔案
	- 在不取得明文的情況下驗證資料正確性
		- 儲存使用者密碼的Hash
		  確保管理員無從得知明文
- 常見雜湊函式
    - MD5 (128 bits) ~不安全~
    - SHA-1 (160 bits) ~不安全~
    - SHA-256 (256 bits)、SHA-512 (512 bits)
- 好用工具推推
    - [CyberChef](https://gchq.github.io/CyberChef/)
    - [MD5爆破](https://cmd5.com/)

## Encode

### 摩斯電碼

- 一個中年轉職的勵志故事
    - 哲學系 -> 畫畫 -> 航海 -> 發明電報
- 可用光、電、聲音傳輸
- 訊號間有不同停頓時間
    - 點劃之間 1 單位
    - 字母之間 3 單位
    - 單字之間 7 單位
![](https://i.imgur.com/hS6QnSl.png =300x280)
- [Morse Code Translator](https://morsecode.world/international/translator.html)

### 名詞介紹

- 編碼 (Encoding)
    - 是資訊從一種形式或格式轉換為另一種形式的過程。
- 解碼 (Decoding)：
    - 編碼的逆過程，即將資料從另一種形式轉換回來。
- ==編碼 ≠ 加密==
    - 只要知道是哪種編碼就GG
- 詳見 Day 01 **隱寫術** 簡報
    - Binary Encode
    - ASCII
        - [ASCII to Hex](https://www.asciitohex.com/)
    - Hex Encode
- Base64 Encode
    - ASCII = 8 bit
    - Base64 = 6 bits
    - **如果原文不整除3，結尾會出現對應數量的 `=`**
![](https://i.imgur.com/qdcglpI.png)
- URL Encode
    - 為了避開有特殊意義的符號 `& = # ?`
    - 編碼為 `%` 加上該字元之 ASCII ~Hex表示~
    - Google search：我是誰＆我在哪
    > 還記得 Info Leakage 的 Line 小劇場嗎 QAQ

## 替換式加密

- 替換密碼是字母作有系統的代換，直到訊息被替換成其它難以解讀的字。
- 單表加密：
	- 字母的替換規則是一對一對應
	  Ex: 凱撒密碼
- 多表加密：
	- 字母的替換規則是一對多對應
	  Ex: 維吉尼亞密碼
	  > 去看 Day 02 Crypto
	  > [Sauce Here](https://hackmd.io/@nisra/SJko9QrkF/%2Fi4alEZccT8q9oE0z9VrP_Q)
	  > [name=Andy/古典密碼神人Crypto講師][name=Comment by 404/懶得打字的OS講師]

## 好油喔 Peko <br>^開玩笑的開打啦你各位^

:::warning
[NISRA ペコ Server](http://peko.nisra.net/)
請大家愛惜server，不要欺負它peko QQ
:::

### Playground 01 <br>^網頁三兄弟知多少^

- `F12` 按起來啦你各位
- 三兄弟：HTML, CSS, JS
  > 前端的**所有東西**會直接給使用者看
- Bottom Line：敏感資料鼻要放前端會出事

### Playground 02 <br>^JavaScript\ XSS\ game^

- XSS
	- Cross-site Scripting
	- 利用輸入欄位輸入 JS 的 Script Tag 攻擊
	  => 利用特殊語法規避輸入字元規則
	1. ==最大的問題== 無條件相信使用者輸入
		1. 輸入過濾 ( 拋棄所有`\`
		2. 限制輸入 ( 禁止輸入`\`
		3. 改寫輸入 ( `＜` 改寫成 `&lt`
		   > 棒棒der
	2. Content Security Policy
		- 用規則阻擋語法執行
		  規定信任的^語法^/~腳本~來源
- 無法導入正常的JS區塊
	- JS 在 HTML 很多地方都能執行

### Playground 03 <br>^你還記得當年的鍵盤神技嗎！^

- keyup
    - 可以監聽鍵盤被按壓
- keycode
    - 對應的是鍵盤按壓下去時被監聽的資料

<!--直接在console跑showflag(secretCode)就出來ㄌㄡ-->
<!-- 暴雷www -->
<!-- 話說，用 ctrl + / 就可以直接跑出註解ㄌ-->
<!-- 原來如此，我之前每次都手打xDD -->

<!-- 可以請問XSS Storage的確切作法ㄇ 要在哪裡問-->
<!-- 你只要在 events 塞 JS 並且成功彈出 alert，就代表你成功了 -->

###### tags: `Enlightened` `NISRA` `2021`
<style>
.navbar-brand::after { content: " × NISRA"; }
</style>