[Dreamhack] Logical Bug: Path Traversal

Sisyphus·2022년 9월 4일
0

Dreamhack - System Hacking

목록 보기
37/49

서론

사용자에게 각자의 디렉터리를 생성해주고, 그 디렉터리를 자유롭게 활용할 수 있게 해주는 서비스가 있다면, 당연히 사용자는 자신의 디렉터리만 접근할 수 있도록 해야 합니다.

Path Traversal은 위와 같은 서비스가 있을 때, 사용자가 허용하지 않은 경로에 접근할 수 있는 취약점을 말합니다. 사용자가 접근하려는 경로에 대한 검사가 미흡하여 발생하며, 임의 파일 읽기 및 쓰기의 수단으로 활용될 수 있습니다.



리눅스 경로

절대 경로

루트 디렉터리(/)부터 파일에 이를 때까지 거쳐야 하는 디렉터리 명을 모두 연결하여 구성합니다.

Ex) /a/b/c/target

상대 경로

현재 디렉터리를 기준으로 다른 파일에 이르는 경로를 상대적으로 표현한 것입니다. 이전 디렉터리는 .. 현재 디렉터리는 .로 표현합니다.

Ex) ../../../target



Path Traversal

// Name: path_traversal.c
// Compile: gcc -o path_traversal path_traversal.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int kMaxNameLen = 0x100;
const int kMaxPathLen = 0x200;
const int kMaxDataLen = 0x1000;
const char *kBasepath = "/tmp";

int main() {
  char file_name[kMaxNameLen];
  char file_path[kMaxPathLen];
  char data[kMaxDataLen];
  FILE *fp = NULL;
  
  // Initialize local variables
  memset(file_name, '\0', kMaxNameLen);
  memset(file_path, '\0', kMaxPathLen);
  memset(data, '\0', kMaxDataLen);
  
  // Receive input from user
  printf("File name: ");
  fgets(file_name, kMaxNameLen, stdin);
  
  // Trim trailing new line
  file_name[strcspn(file_name, "\n")] = '\0';
  
  // Construct the `file_path`
  snprintf(file_path, kMaxPathLen, "%s/%s", kBasepath, file_name);
  
  // Read the file and print its content
  if ((fp = fopen(file_path, "r")) == NULL) {
    fprintf(stderr, "No file named %s", file_name);
    return -1;
  }
  
  fgets(data, kMaxDataLen, fp);
  printf("%s", data);
  
  fclose(fp);
  
  return 0;
}
$ ./path_traversal
File name: ../etc/passwd
root:x:0:0:root:/root:/bin/bash

path traversal은 서버의 중요한 데이터를 공격자에게 노출시키는 취약점입니다. 만약 파일에 데이터를 쓸 수 있다면, /etc/passwd를 조작하여 root의 비밀번호를 제거하거나 ssh의 설정을 변경하는 등 서버에 위협이 되는 행위를 할 수 있습니다.

0개의 댓글