CTF

Dreamhack CTF Season 3 Round #6 Wirte up

Goblebin 2023. 6. 25. 10:03
반응형

mmapped

3-Cipher

 

위 두 문제는 내가 공부한 분야도 아니고 대회 끝나기 1시간 전부터 문제를 풀기 시작해서 풀이에 도전하지 않았다.

 

 

 


 

 

64se64

문제 코드는 아래와 같다.

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Welcome</title>
</head>

<body>
  <h1>Welcome! 👋</h1>
  <form method="POST">
    <input type="hidden" name="64se64_encoding" value="IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwphc2M9WzY4LCA3MiwgMTIzLCA5OCwgMTAxLCA0OCwgNTIsIDU0LCA5OCwgNTUsIDUzLCA1MCwgNTAsIDk3LCA5NywgNTAsIDEwMSwgNTAsIDU2LCAxMDIsIDUwLCA1NSwgNTQsIDEwMSwgNDgsIDk5LCA1NywgNDksIDQ4LCA1MywgNTAsIDQ5LCAxMDIsIDUwLCA1MSwgOTcsIDQ4LCA1MywgNTYsIDU1LCA0OCwgNDgsIDUzLCA5NywgNTYsIDUxLCA1NSwgNTUsIDUxLCA1NSwgNDgsIDk3LCA0OSwgNDksIDEwMSwgNTMsIDEwMSwgNTIsIDEwMCwgOTksIDQ5LCA1MywgMTAyLCA5OCwgNTAsIDk3LCA5OCwgMTI1XQphcnI9WzAgZm9yIGkgaW4gcmFuZ2UoNjgpXQpmb3IgaSBpbiByYW5nZSgwLDY4KToKICAgIGFycltpXT1jaHIoYXNjW2ldKQpmbGFnPScnLmpvaW4oYXJyKQpwcmludChmbGFnKQ==">
  </form>
</body>
</html>

 

value 안에 있는 값을 복사해서 base64로 디코딩하면 아래와 같은 코드가 나온다. 이 코드를 파이썬으로 실행시키면 플래그가 출력된다.

#!/usr/bin/env python3
asc=[68, 72, 123, 98, 101, 48, 52, 54, 98, 55, 53, 50, 50, 97, 97, 50, 101, 50, 56, 102, 50, 55, 54, 101, 48, 99, 57, 49, 48, 53, 50, 49, 102, 50, 51, 97, 48, 53, 56, 55, 48, 48, 53, 97, 56, 51, 55, 55, 51, 55, 48, 97, 49, 49, 101, 53, 101, 52, 100, 99, 49, 53, 102, 98, 50, 97, 98, 125]
arr=[0 for i in range(68)]
for i in range(0,68):
    arr[i]=chr(asc[i])
flag=''.join(arr)
print(flag)

 

 

 


 

 

 

phpreg

index.php와 step2.php 코드가 있다. 중요한 부분만 보겠다.

아래의 index.php에서 step2.php 페이지로 post 메소드를 통해 2가지 값을 보낸다.

<form method="post" action="/step2.php">
	<input type="text" placeholder="Nickname" name="input1">
	<input type="text" placeholder="Password" name="input2">
	<input type="submit" value="제출">
</form>

 

step2.php 코드를 보면 첫번째 입력값은 input_name에 두번째 입력값은 input_pw에 들어간다.

input_pw에 a부터 z까지 A부터 Z까지의 알파벳 대소문자가 존재하는지 확인하고 존재한다면 "alphabet in the pw :(" 문자열을 출력한다. 

input_name에 nyang(대소문자 구분 X)이라는 문자열이 들어갔다면 없애고

input_pw에는 특정한 정규 표현식이 들어간다면 "d4y0r50ng"문자열로 치환한다.

 

마지막 if문에서는 name변수에 "dnyang0310", pw변수에 "d4y0r50ng+1+13"이 들어갔는지 확인한다.

<?php
          // POST request
          if ($_SERVER["REQUEST_METHOD"] == "POST") {
            $input_name = $_POST["input1"] ? $_POST["input1"] : "";
            $input_pw = $_POST["input2"] ? $_POST["input2"] : "";

            // pw filtering
            if (preg_match("/[a-zA-Z]/", $input_pw)) {
              echo "alphabet in the pw :(";
            }
            else{
              $name = preg_replace("/nyang/i", "", $input_name);
              $pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8]\!/", "d4y0r50ng", $input_pw);

              if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13") {
                echo '<h4>Step 2 : Almost done...</h4><div class="door_box"><div class="door_black"></div><div class="door"><div class="door_cir"></div></div></div>';

 

index.php의 input1에 "dnynyangang0310" input2에 "2@123319!+1+13"를 입력하면 step2.php페이지의 cmd라인 코드가 있는 곳으로 접근할 수 있다. 아래는 step2.php의 cmd라인 코드 부분이다.(보기 불편해도 정리하긴 귀찮아서 어쩔 수 없다.)

		$cmd = $_POST["cmd"] ? $_POST["cmd"] : "";

                if ($cmd === "") {
                  echo '
                        <p><form method="post" action="/step2.php">
                            <input type="hidden" name="input1" value="'.$input_name.'">
                            <input type="hidden" name="input2" value="'.$input_pw.'">
                            <input type="text" placeholder="Command" name="cmd">
                            <input type="submit" value="제출"><br/><br/>
                        </form></p>
                  ';
                }
                // cmd filtering
                else if (preg_match("/flag/i", $cmd)) {
                  echo "<pre>Error!</pre>";
                }
                else{
                  echo "<pre>--Output--\n";
                  system($cmd);
                  echo "</pre>";
                }
              }
              else{
                echo "Wrong nickname or pw";
              }
            }
          }
          // GET request
          else{
            echo "Not GET request";
          }
      ?>

 

입력창(cmd)에 "flag"라는 문자열을 입력하면 "Error"문자열을 출력하기 때문에 "fl*.txt" 등으로 우회해야한다.

일단 flag파일이 어디에 있는지 모르기 때문에 "ls -al ../../../" 명령어를 통해 파일을 찾았다.

"ls -al ../"을 입력하니 dream이라는 디렉터리가 존재하였고 "ls -al ../dream"명령어를 통해 들어가보니 flag.txt 파일이 있었다. "cat ../dream/fl*.txt"명령어로 플래그가 출력된다.

 

 

반응형