RITSEC CTF 2018 Archivr

CTF/Writeup 2018. 11. 19. 22:14

일단 문제에 들어가보면 기본적으로 lfi가 터진다. 근데 파일명 뒤에 .php가 붙고 rfi류는 안터진다. lfi로 이걸 rce로 만들어야 하는데 일단 업로드 기능이 존재한다. 근데 업로드같은 경우 php랑 pht를 dat로 replace 시켜버린다. 


4096byte가지고 이후 문자 날리는형태랑 널류도 안먹혔고, 로그인 기능도 없어서 세션가지고 컨트롤도 불가능했다.


요럴때 쓸 수 있는게 일단 zip이랑 phar wrapper였는데 다행히도 이놈들이 활성화되어있어서 이걸로 문제를 풀 수 있었다.


대충 lfi로 소스코드 보고 업로드 되는 경로를 먼저 확인해봤다.


download.php


<?php

if ($_SERVER['REQUEST_METHOD'] == "POST") {

    $key = $_POST['key'];


    if (strpos($key, '.') !== false) {

        $key_parts = explode(".", $key);

        $hashed_key = md5(intval($key_parts[0])) . "." . $key_parts[1];


        $path = "uploads/" . md5($_SERVER['REMOTE_ADDR']) . "/" . $hashed_key;

        if (file_exists($path)) {

            header("Content-Disposition: attachment; filename=\"" . $key . "\"");

            die(file_get_contents($path));

        } else {

            $error = "File not found!";

        }

    } else {

        $error = "Invalid key!";

    }

}

?>


<html>

    <head>

        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

        <style>

            body {

                padding-top: 70px;

            }

            

            .fineprint {

                font-size: 2px;

                color: red;

            }

        </style>

    </head>

    <body>

        <nav class="navbar navbar-inverse navbar-fixed-top">

            <div class="container">

                <div class="navbar-header">

                    <a class="navbar-brand" href="/">Archivr</a>

                </div>

                <div id="navbar" class="collapse navbar-collapse">

                    <ul class="nav navbar-nav">

                        <li><a href="index.php?page=home">Home</a></li>

                        <li><a href="index.php?page=upload">Upload</a></li>

                        <li class="active"><a href="index.php?page=download">Download</a></li>

                    </ul>

                </div>

            </div>

        </nav>

        <div class="container">

<?php

if (isset($error)) {

?>

            <div class="alert alert-danger" role="alert">

                <?php echo $error; ?>

            </div>

<?php

}

?>

            <h3>File Download</h3>

            <form action="index.php?page=download" method="post" enctype="multipart/form-data">

                <div class="col-xs-4">

                    <div class="form-group">

                        <label for="upload">Enter retrieval key</label>

                        <input type="text" class="form-control" id="key" name="key" placeholder="1234567">

                    </div>

                    <div class="form-group">

                        <button type="submit" class="btn btn-primary">Submit</button>

                    </div>

                </div>

            </form>

        </div>

    </body>

</html>




upload.php


<?php

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    if ($_FILES['upload']['size'] > 5000) { //max 5KB

        die("File too large!");

    }

    $filename = $_FILES['upload']['name'];



    $upload_time = time();

    $upload_dir = "uploads/" . md5($_SERVER['REMOTE_ADDR']) . "/";


    $ext = "";

    if (strpos($filename, '.') !== false) {

        $f_ext = explode(".", $filename)[1];

        if (ctype_alnum($f_ext) && stripos($f_ext, "php") === false && stripos($f_ext, "pht") === false) {

            $ext = "." . $f_ext;

        } else {

            $ext = ".dat";

        }

    } else {

        $ext = ".dat";

    }


    $upload_path = $upload_dir . md5($upload_time) . $ext;

    mkdir($upload_dir, 0770, true);


    //Enforce maximum of 10 files

    $dir = new DirLister($upload_dir);

    if ($dir->getCount() >= 10) {

        unlink($upload_dir . $dir->getOldestFile());

    }


    move_uploaded_file($_FILES['upload']['tmp_name'], $upload_path);

    $key = $upload_time . $ext;

}

?>


<html>

    <head>

        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

        <style>

            body {

                padding-top: 70px;

            }

            

            .fineprint {

                font-size: 2px;

                color: red;

            }

        </style>

    </head>

    <body>

        <nav class="navbar navbar-inverse navbar-fixed-top">

            <div class="container">

                <div class="navbar-header">

                    <a class="navbar-brand" href="/">Archivr</a>

                </div>

                <div id="navbar" class="collapse navbar-collapse">

                    <ul class="nav navbar-nav">

                        <li><a href="index.php?page=home">Home</a></li>

                        <li class="active"><a href="index.php?page=upload">Upload</a></li>

                        <li><a href="index.php?page=download">Download</a></li>

                    </ul>

                </div>

            </div>

        </nav>

        <div class="container">

<?php

if (isset($key)) {

?>

            <div class="alert alert-success" role="alert">

                File uploaded! Retrieval key: <strong><?php echo $key; ?></strong>

            </div>

<?php

}

?>

            <h3>File Upload</h3>

            <form action="index.php?page=upload" method="post" enctype="multipart/form-data">

                <div class="col-xs-4">

                    <div class="form-group">

                        <label for="upload">Select a &lt;5KB file</label>

                        <input type="file" class="form-control-file" id="upload" name="upload">

                    </div>

                    <div class="form-group">

                        <button type="submit" class="btn btn-primary">Upload</button>

                    </div>

                </div>

            </form>

        </div>

    </body>

</html>



경로 중에 문제되는게 $_SERVER['REMOTE_ADDR'] 요놈이었는데 이 문제에서는 이걸 구할 방법이 없어보였다. 근데 보니까 웹 문제가 다 같은 도메인에 포트만 다르길래 다른 문제중에 RCE 됬던 쪽에서 이 값을 구해서 사용했다.


이제 필요한건 다 구했고 3.php 파일에 먼저 php 테스트 구문 넣어놓고 압축한뒤 업로드를 했다.


그 다음 해당 코드를 통해 확인한 파일 경로를 zip wrapper에 사용해줬더니 정상적으로 php코드가 lfi되는걸 볼 수 있었다.






시스템 명령어함수가 따로 disable되어있지 않아서 아래와 같이 명령어 실행이 가능했다.




대충 플래그 파일찾아서 출력해보니 플래그가 있었다.

RITSEC{uns3r1al1z3_4LL_th3_th1ng5}

'CTF > Writeup' 카테고리의 다른 글

TenDollar CTF 2018 Ninja  (0) 2018.12.01
TenDollar CTF 2018 I'm Blind Not Deaf  (0) 2018.12.01
RITSEC CTF 2018 Lazy Dev  (0) 2018.11.19
RITSEC CTF 2018 What a cute dog!  (0) 2018.11.19
RITSEC CTF 2018 Crazy Train  (0) 2018.11.19
블로그 이미지

JeonYoungSin

메모 기록용 공간

,