文章

HITCON Community 2023 - Re:CTF Writeup

考古題

misc

1. unreadable

題目

image

解題

嘗試了各種不同工具,像是 BinWalk, file, hexdump 最後使用 xxd 看到文字排列成的圖像 圖像就是 flag 的字串 還嘗試了 hexedit 也可以成功的 image

頭要轉一下

2. fbi-warning

題目

image

解題

給了一個網站,介面應該是日本的 2ch 論壇 題目要我們找到使用者 Ωrange 的 IP 位置,並且提示了 ip 是 217.x.x.x

進去網站後可以看到,使用者 Ωrange 發布了一個回文,並且附帶一張圖片 image

推文中給了一個網址 https://tinyurl.com/fbi-hack 點進去後發現並沒有有用的資訊… image

原本以為是 injection 類型的題目 在網頁亂點一通後,基本上功能都是死的 最後在網頁原始碼發現

1
<!-- GazouBBS v3.0 --><!-- ふたば改0.8 -->

爬文後發現原始碼有公開:https://hackmd.io/LsRB6pWMQKeGvv6HRb8Xk:

ID生成方式是將 ip 串 IDSEED 串 日期 後 使用 “id” 這個字串作為 slat 做 crypt 加密 最後取後 8 碼來當 ID

define("IDSEED", 'idの種');

if(DISP_ID){
if($email&&DISP_ID==1){
  $now .= " ID:???";
}else{
  $now.=" ID:".substr(crypt(md5($_SERVER["REMOTE_ADDR"].IDSEED.gmdate("Ymd", $time+9*60*60)),'id'),-8);
}
}

回推是不可能的,所以直接暴力解 因為題目有提示ip開頭為 217 所以就從 217.0.0.1 嘗試到 217.255.255.255 把每個結果拿去看發文者 ID:E98SXRsI 做比對 就可以抓出 ip 了

前面一直認為 ‘idの種’ 是伺服器那邊會隨便輸入一串字串,結果沒想到就是直接使用 ‘idの種’ …

3. EV3 Arm

題目

image

解題

題目給了一個 機器人寫字的影片 和 ev3arm.rbf 程式碼 影片中機器人寫出了 hitcon{ 影片就結束了 https://youtu.be/VNAVl6F1-7E

ev3arm.rbf 內則是控制馬達動作的程式碼

ev3arm
 ├─ StartBlock
 ├─ MediumMotor.Time MotorPort: (馬達A) | Speed: -35 | Seconds: 0.55 | Brake_At_End: Brake
 ├─ MediumMotor.Degrees MotorPort: D | Speed: -10 | Degrees: 90 | Brake_At_End: Brake
 ├─ MediumMotor.Time MotorPort: A | Speed: 35 | Seconds: 0.4 | Brake_At_End: Brake
 ├─ MediumMotor.Degrees MotorPort: D | Speed: 10 | Degrees: 45 | Brake_At_End: Brake
 ├─ MediumMotor.Time MotorPort: A | Speed: -35 | Seconds: 0.55 | Brake_At_End: Brake
 ├─ Move.Degrees Ports: B+C | Steering: 0 | Speed: 20 | Degrees: 20 | Brake_At_End: Brake
 ├─ MediumMotor.Degrees MotorPort: D | Speed: -10 | Degrees: 45 | Brake_At_End: Brake
 ├─ MediumMotor.Time MotorPort: A | Speed: 35 | Seconds: 0.4 | Brake_At_End: Brake
 ├─ MediumMotor.Degrees MotorPort: D | Speed: 10 | Degrees: 90 | Brake_At_End: Brake
 ├─ Move.Degrees Ports: B+C | Steering: 0 | Speed: 30 | Degrees: 15 | Brake_At_End: Brake
 ├─ MediumMotor.Degrees MotorPort: D | Speed: -10 | Degrees: 30 | Brake_At_End: Brake
 ├─ MediumMotor.Time MotorPort: A | Speed: -35 | Seconds: 0.55 | Brake_At_End: Brake
 ├─ MediumMotor.Time MotorPort: A | Speed: 35 | Seconds: 0.4 | Brake_At_End: Brake
 ...
 ...
 ...

接著根據影片的動作去反推出每個馬達的代號 用 python 逐行提取用了哪個馬達和移動多少 我主要分成了六個動作

  1. 筆往上(馬達A) (不寫字)
  2. 筆往下(馬達A) (寫字)
  3. 左移(馬達D)
  4. 右移(馬達D)
  5. 上移(馬達B+C)
  6. 下移(馬達B+C)

接著用模擬書寫的功能就可以得到答案,雖然程式沒寫得很完整,但還是能看出 flag 內容XD image

web

1. papapa

題目

image

解題

題目只給了一個網址 image

原因是憑證無效 image

查看憑證內容 發現擁有者是 very-secret-area-for-ctf.chal.kikihost.xyz image

直接修改網址看看能不能進,發現進不去 去查了一下 dns 發現也沒有對應的內容 應該是內部私人 dns 之類的 image

使用 burp 改請求 host image

順利噴出 flag image

2. yeeclass

題目

image

解題

當黑箱解的時候只解到把 cookie 砍掉進入 flag 頁面可以看到 flag 上傳者和詳細的上傳時間

進去網頁可以看到是一個繳作業的系統 不過都沒其他按鈕,所以先試著登入看看 帳號密碼亂打就可以進了,不過用同個帳號再登入就要使用剛剛亂打的密碼 所以這邊的登入是,如果帳號不存在就直接註冊一個 image

登入之後出現了繳交和上傳作業的按鈕,不過 Flag 的作業已經被關閉了 沒按鈕可點 image

先去 Public Homework,發現網址有 ?homeworkid=2 image

試試看把 ?homeworkid=2 改成 ?homeworkid=1 發現權限不足,表示這頁面應該是 Flag 沒錯了 image

看看目前的 cookie 有 PHPSESSID 和 session 查資料後得知 PHPSESSID 是一個唯一值 伺服器會根據這個 ID 在伺服器內找資料 所以更改這個的意義不大

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[
{
    "domain": "rectf.hitcon2023.online",
    "hostOnly": true,
    "httpOnly": false,
    "name": "PHPSESSID",
    "path": "/",
    "sameSite": "unspecified",
    "secure": false,
    "session": true,
    "storeId": "0",
    "value": "49d29fa6ee8451e390335c91487aeb67",
    "id": 1
},
{
    "domain": "rectf.hitcon2023.online",
    "expirationDate": 1692669998.959451,
    "hostOnly": true,
    "httpOnly": true,
    "name": "session",
    "path": "/",
    "sameSite": "lax",
    "secure": false,
    "session": false,
    "storeId": "0",
    "value": "9d9eeef6-215a-457c-a960-2da4197305b2.fsR3JwH7egQWEOYt4tHDE0fcgwQ",
    "id": 2
}
]

不過在好奇心的驅使下,我嘗試把 cookie 刪除後重新整理頁面 發現順利的進入的 Flag 頁面

拿到 SourceCode 後去看了 這時可以看到有一個名為 Flag 的作業 顯示了上傳者和異常詳細的上傳時間 image

根據其他上傳頁面,可以看到上傳後作業的網址是一個 hash 所以如果我們知道時間,應該可以直接推測出上傳後的檔案名稱 image

黑箱解的時候卡在這,我嘗試使用自己上傳作業的時間 去做各種不同的 hash 來比對這網站是使用哪種 但都比不出來

有了 SourceCode 之後直接衝去看 hash 的部分 發現是使用了 uniqid 這個函數生成字串 它會使用微秒的部分去生成一組字串 並且這個字串的開頭會是 username_ 接著把這個字串拿去做 sha1

1
2
3
4
5
6
7
8
$id = uniqid($_SESSION["username"]."_");
            $submit_query = $pdo->prepare("INSERT INTO submission (`hash`, userid, homeworkid, content) VALUES (?, ?, ?, ?)");
            $submit_query->execute(array(
                hash("sha1", $id),
                $_SESSION["userid"],
                $_POST["homeworkid"],
                $_POST["content"]
            ));

所以現在只要用上傳的時間 2023-08-16 04:09:35.584096 去做uniqid(“flagholder_”,)之後 拿去做 sha1 沒意外的話就可以得到 flag 的頁面了

$username = "flagholder_";
$id = uniqid("username",);
$myans = hash("sha1", $id)

先用自己上傳的時間和hash在本地端嘗試

1
奇怪我覺得我程式沒寫錯,弄了一個晚上炸不出答案

最後發現程式邏輯沒錯,但時區錯了

確認程式沒問題後寫成腳本去戳網站 寫成只要 http code 200 就噴網址出來 最後拿到 flag

4. babyfirst(卡死,暫時放棄)

題目

image

解題

題目給了一個網站,進去看到內容可以發現,這個網站會根據 ip 來分配 sandbox

<?php
    highlight_file(__FILE__);

    $dir = './sandbox/' . $_SERVER['REMOTE_ADDR'];echo 'Your sandbox:'.$dir.'/';
    if ( !file_exists($dir) )
        mkdir($dir,0777,true);
    chdir($dir);

    $args = $_GET['args'];
    for ( $i=0; $i<count($args); $i++ ){
        if ( !preg_match('/^\w+$/', $args[$i]) )
            exit();
    }
    exec("/bin/orange " . implode(" ", $args));
?>
Your sandbox:./sandbox/60.250.162.9/
Warning: implode(): Invalid arguments passed in /var/www/html/index.php on line 14

進去自己的空間看看,啥都沒有,返回上一層看有沒有其他東西 image

恩好 image

總之先回到首頁看程式碼,可以看到

1
$_GET['args']

表示我們是可以帶入參數的 但由於正規表達是: ‘/^\w+$/’ 只能輸入大小寫英文字母和底線

想嘗試用 wget 載腳本過去 但網址符號幾乎都被擋了

忽然想到 AIS3 某堂課有講到 可以把 ip 變成純數字 之後可以試試看這個方向

一些紀錄

活動內容

HITCON Community 2023 - CTF 回來了,讓我們歡迎「Re:CTF 活動」! https://hackmd.io/@HITCON/ReCTF

日期:8月 11日 21:00 (GMT+8) - 8月 18日 平台開放時間:預計至 8 月 25 日

題目

image

大佬們的分數

image

本文章以 CC BY 4.0 授權