NOT4DOG
방명록 RSS 태그 글쓰기 관리자
 
[CTF] Dreamhack crawling 문제 Write-up
CTF Write-up 2022-01-14 20:56:05

반응형

문제) 해당 문제는 Dreamhack CTF Season 1 Round #12에 출제된 문제입니다.

          드림이는 웹 크롤링 사이트를 구축했습니다.
          크롤링 사이트에서 취약점을 찾고 flag를 획득하세요!

 

문제와 함께 Dockerfile과 app.py 파일을 제공한다.

우선 메인 페이지에 접속해 내 블로그 주소를 입력하니 정상적인 크롤링이 되는것을 확인할 수 있다.

크롤링 작동 화면

 

이번에 Dockerfile과 app.py를 열어보았다.

app.py Code

빨간색 부분은 공인 아이피만 입력이 가능하게끔 작성 되어있다.

 

노란색 부분은 입력값을 검사하는 부분인데, IP 주소값이 0.0.0.0인 경우 false 반환,

사설 IP인 경우 "Can you access my admin page~?" 문자열을 반환하고,

HTTP Referer를 검사해 localhost 이거나 127.0.0.1일 경우에도 false를 반환한다.

 

초록색 부분은 FLAG를 출력하는 부분인데 127.0.0.1 즉, localhost 가 입력값으로 주어진 경우에만

FLAG를 출력해준다. 또한 아래쪽에 작성된 코드를 보면 Port Number가 3333일 경우에만 작동한다.

 

localhost ip 접근 불가

 

localhost 문자열 접근 불가

 

이를 우회할 방법을 생각하다가, 입력값 검사 시 HTTP Referrer를 검사한다는 것을 알았다.

참조 주소만 검사하기에 실제 주소를 단축링크 등으로 감싸 입력하면 검사를 우회할 수 있다.

링크 단축 서비스 사용
단축된 링크 복사

 

FLAG가 나올줄 알았는데 나오지 않아 app.py를 다시 살펴보던 중,

localhost의 루트(/)에는 index.html (서버의 기본 페이지)만 있고,

FLAG는 /admin에 존재한다는 것을 확인하여, http://localhost:3333/admin 으로 다시 진행했다.

FLAG 획득

 

반응형


[CTF] Dreamhack FFFFAAAATTT 문제 Write-up
CTF Write-up 2022-01-13 20:40:26

반응형

문제) FIXFIXFIX! FFFAAATTT!

         (문제파일 다운로드에서 받지 마시고, 아래의 링크를 통해서 문제파일을 다운받으시기 바랍니다.)
         문제파일 : https://drive.google.com/file/d/17ESNJryAYuHa3M5GiBIb9r2JNhXLqKBa/view?usp=sharing

 

FFFFAAAATTTT.001

 

drive.google.com

 

문제와 함께 파일이 하나 주어진다.

문제를 읽었을 때 FAT32 File System 관련 문제임을 알수있고, 부트레코드 관련 문제일거라 추측할 수 있다.

파일을 받아 HxD로 열어보면 (기타설정 - 디스크 이미지 열기 - 512 선택) 

시스템 이미지 파일임을 확인할 수 있다.

Fix the Disk!! 문자열 확인 (손상됨)

 

문제는 섹터0 부분에 Fix the Disk!! 라는 문자열이 들어가있어 정상 인식이 불가능한것으로 보인다.

더 자세한 정보를 얻기위해 FTK imager Tool을 사용해 파일을 열어보았다.

FTK 파일 시스템 인식 불가

동일하게 파일시스템을 인식하지 못한다. 보통 이럴경우 부트레코드의 변조나 손상이 주된 이유다.

 

부트레코드란, 컴퓨터 부팅을 시작하는 데 필요한 데이터를 유지 관리하는 데 사용되는 하드 디스크의

저장소 공간 섹션이다. 일반적으로 부팅 레코드는 하드 드라이브의 첫 번째 섹터에 보관되므로

시스템이 응용 프로그램을 시작하는 데 필요한 파일을 쉽게 찾고 읽고 실행할 수 있다.

파일에 액세스하고 부팅을 시작하는 데 필요한 모든 코드는 마스터 부팅 레코드에 포함된다.

 

다시 HxD로 돌아가 BR을 찾아보기로 했다.

보통 FAT32 시스템 이미지의 백업 BR는 섹터 6번에 위치하고 있다.

섹터6에 위치한 백업 BR

 

이 BR을 복사해 적절한 위치에 삽입해주면 인식이 될것으로 보인다.

적절한 위치는 Fix the Disk!!가 도배되어있던 섹터0 영역이다.

보통의 시스템 부트레코드는 섹터0 영역에 위치한다.

정상 BR 덮어쓰기

 

섹터6 영역에 있던 BR을 복사해 섹터0 영역에 덮어씌우고 저장한다.

이제 저장한 파일을 FTK imager를 사용해 열어보았다.

정상적인 파일시스템 인식성공

 

아까와는 다르게 파일시스템 (FAT32) 과 시스템 내부 폴더, 파일들을 정상적으로 확인할 수 있다.

root 폴더 내부

 

내부를 살펴보던중 root Directory 내부에 Dreamhack이라는 폴더를 발견할 수 있었다.

Dreamhack 폴더 내부

 

Dreamhack 폴더를 열어보니 jpeg, png, zip 파일 등이 있었고,

FTK의 Export files 기능을 사용해 Dreamhack 폴더를 추출하였다.

Dreamhack 폴더 내부

 

그 중 noway!.zip 파일을 열어보니 파일은 손상되었지만 부분적인 접근은 가능했다.

noway!.zip 파일 내부 noway! 폴더에 들어가보니 FLAG가 존재할법한 .txt 파일들이 있었다.

하지만 해당 파일들에는 암호가 설정되어 있었다.

암호가 설정되어 있는 파일들

 

암호를 찾기위해 파일시스템 내부의 파일들을 살펴보던 와중,

앞서 추출한 그림 파일들에 의심이 가 HxD로 열어보았다.

그림 파일 중 GG.PNG 파일을 열어보니 zip 파일의 비밀번호를 획득할 수 있었다.

.zip PW : DHDHFIX

 

얻은 비밀번호로 noway!.zip 파일 내부 FINISH_FIX.txt 파일을 열어보니

FLAG를 확인할 수 있었다.

FLAG 획득

 

반응형


[CTF] Dreamhack rev-basic-4 문제 Write-up
CTF Write-up 2022-01-10 13:25:09

반응형

문제) Reversing Basic Challenge #4

          이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여

          correct 또는 wrong을 출력하는 프로그램이 주어집니다.

          해당 바이너리를 분석하여 correct를 출력하는 입력값을 알아내세요.

          획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.

          예시) 입력 값이 Apple_Banana일 경우 flag는 DH{Apple_Banana}

 

문제와 같이 chall4.exe 파일을 제공한다.

이전 rev-basic 문제들과 비슷하기에 ida를 이용해서 로직을 먼저 확인했다.

이번에도 동일하게 sub_140001000 함수에서 비교가 이루어지는것을 확인할 수 있다.

sub_140001000 함수에서 비교가 일어난다

이번에는 sub_140001000 함수의 Pseudo code를 확인하였다.

sub_140001000 Pseudo code

__int64 __fastcall sub_140001000(__int64 a1)
{
  int i; // [rsp+0h] [rbp-18h]

  for ( i = 0; (unsigned __int64)i < 0x1C; ++i )
  {
    if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i] )
      return 0i64;
  }
  return 1i64;
}

코드를 대략적으로 분석해보니 Left Shift, 자릿수 소거 등을 이용해서

최종적으로 hex값의 앞뒤가 바뀌는것을 확인할 수 있다.

만약 0010 1100 이 입력으로 들어가면 출력으로 1100 0010이 나온다.

이를 토대로 a1 배열값을 찾아 위 알고리즘에 맞게 변환해주면 FLAG를 얻을 수 있다.

 

a1 배열의 값이 있는곳은 위에 sub_140001000 함수에서 확인할 수 있다.

byte_140003000[i] 에 있는 값을 참조하므로 Hex View에서 해당 위치를 조회해 보았다.

a1 배열의 Hex Value

그렇다면 a1 배열의 값은

{ 24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27
13 26 26 C6 56 F5 C3 C3 F5 E3 E3 } 임을 확인할 수 있다.

 

나는 16진수값을 텍스트로 변환해주는 사이트를 이용했다.

물론 위 sub_140001000 알고리즘을 기반으로 c언어나 python을 사용해 작성해도 된다.

 

FLAG 획득

여기서 주의해야할 점은 위 알고리즘에 따라 (XXXX YYYY → YYYY XXXX)

a1 배열 16진수 값의 앞, 뒤를 서로 바꿔 변환해주어야 한다. 

이 점에 유의해서 변환하니 FLAG를 얻을 수 있었다.

반응형


[CTF] Dreamhack image-storage 문제 Write-up
CTF Write-up 2021-12-31 20:45:05

반응형

문제) php로 작성된 파일 저장 서비스입니다.

파일 업로드 취약점을 이용해 플래그를 획득하세요. 플래그는 /flag.txt에 있습니다.

 

문제와 같이 upload.php 등 Source php Code를 제공한다.

<?php
  if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_FILES)) {
      $directory = './uploads/';
      $file = $_FILES["file"];
      $error = $file["error"];
      $name = $file["name"];
      $tmp_name = $file["tmp_name"];
     
      if ( $error > 0 ) {
        echo "Error: " . $error . "<br>";
      }else {
        if (file_exists($directory . $name)) {
          echo $name . " already exists. ";
        }else {
          if(move_uploaded_file($tmp_name, $directory . $name)){
            echo "Stored in: " . $directory . $name;
          }
        }
      }
    }else {
        echo "Error !";
    }
    die();
  }
?>
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Image Storage</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="/">Image Storage</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/list.php">List</a></li>
            <li><a href="/upload.php">Upload</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/><br/>
    <div class="container">
      <form enctype='multipart/form-data' method="POST">
        <div class="form-group">
          <label for="InputFile">파일 업로드</label>
          <input type="file" id="InputFile" name="file">
        </div>
        <input type="submit" class="btn btn-default" value="Upload">
      </form>
    </div> 
</body>
</html>

upload.php를 살펴보았을 때 별 다른 필터링 Code는 보이지 않았다.

 

Main Page

그래서 FLAG를 보기 위한 php Code를 upload하면 확인이 가능해보인다.

 

FLAG 파일을 보기위한 php Code를 간단하게 만들어서 upload 했다.

 

test.php가 upload된 화면

해당 test.php를 사용하여 FLAG를 획득할 수 있었다.

반응형