[2025-07-27] File Vulnerability 심화

🦥 본문

File Vulnerability for Windows

파일 시스템

윈도우는 리눅스와 달리 드라이브를 지정하는 데, 주 애플리케이션 파일은 C드라이브에 위치한다.

유닉스 계열의 운영 체제는 대부분이 파일로 구성되어 있어 파일에 접근하는 것으로도 특정 기능을 수행할 수 있지만 윈도우는 파일 시스템 접근만으로 시스템 제어가 어렵다. 즉, 기능마다 맞는 API를 사용해야 원하는 작업을 할 수 있다.

  • 로그 및 데이터 파일

| 디렉터리 | 설명 | | — | — | | C:\inetpub | IIS 서비스에서 웹 문서 및 기타 웹 서버에서 사용하는 파일을 저장합니다. | | C:\inetpub\wwwroot | IIS의 웹 문서가 저장되는 기본 경로입니다. | | C:\ApacheXY\htdocs, C:\www | Apache Web Server에서 문서 경로로 흔히 사용되는 디렉터리입니다. | | C:\Program Files | 각종 프로그램 및 데이터를 저장할 때 사용됩니다. 데이터베이스 등이 이에 속합니다. | | C:\ProgramData | 시스템의 각종 서비스에서 자료를 저장할 때 사용됩니다. 데이터베이스 등이 이에 속합니다. | | C:\ProgramData\MySQL\MySQL Server X.Y\Data | MySQL 데이터베이스의 데이터가 일반적으로 이곳에 저장됩니다. | | C:\Program Files\PostgreSQL\X.Y\data | PostgreSQL 데이터베이스의 데이터가 일반적으로 이곳에 저장됩니다. | | C:\Windows\System32\Winevt\Logs | 윈도 이벤트 로그를 저장할 때 사용합니다. | | C:\Windows\Prefetch | Superfetch 데이터를 저장합니다. 최근 사용한 애플리케이션 목록 등을 조회할 수 있습니다. |

  • 설정 파일

| 디렉터리 | 설명 | | — | — | | C:\Windows\System32\config | 시스템 단위 레지스트리 하이브 파일이 저장됩니다. | | C:\Boot | 부팅 관련 파일을 저장합니다. EFI 기반 시스템에서는 EFI 시스템 파티션에 저장됩니다. | | %UserProfile%\Ntuser.dat | %UserProfile% 디렉터리를 가진 사용자의 레지스트리가 저장됩니다. | | %UserProfile%\Local Settings\Application Data\Microsoft\Windows\UsrClass.dat | %UserProfile% 디렉터리를 가진 사용자의 확장 연결 정보 및 COM 클래스 등이 저장됩니다. | | C:\Windows\drivers\etc | hosts, services 와 같은 네트워크 관련 설정 파일을 저장합니다. | | C:\Program Files\Apache Software Foundation\Apache<버전>\conf | Apache Web Server의 설정 정보를 저장합니다. |

  • 설정 파일 중 개별 파일 정보

| 파일 | 설명 | | — | — | | C:\Boot\BCD | Boot Configuration Data 파일이 위치합니다. | | C:\ProgramData\MySQL\MySQL Server X.Y\my.ini | MySQL 데이터베이스 서버의 주 설정파일입니다. | | C:\Windows\System32\drivers\etc\hosts | 호스트네임의 실주소를 탐색할 때 사용되는 정적 호스트 맵 파일입니다. |

  • 프로그램 및 라이브러리

| 디렉터리 | 설명 | | — | — | | C:\Program Files | 각종 프로그램 및 데이터를 저장할 때 사용합니다. 데이터베이스 등이 이에 속합니다. | | C:\Windows\System32 | 시스템 파일 및 DLL들이 위치합니다. | | C:\Windows\SysWOW64 | 32비트 호환(Windows-on-Windows) 레이어상 시스템 파일 및 DLL들이 위치합니다. |

  • 장치 및 가상 파일
    • 디렉터리 경로 관련 정보

      디렉터리 설명
      \\.\ Win32 장치 파일 접근을 위한 경로 시작. NUL, CON 같은 기본 장치 이름에 자동 인식되므로 \\.\는 필요 없음.
      \\?\ NT 객체 관리자 하위체계에서 절대 경로 및 링크 접근 시작 경로. 일반적으로 \\.\와 비슷.
      \\?\GLOBALROOT\ 최상위 Object Manager 경로를 직접 접근하는 경로.
      \\?\GLOBALROOT\Device\ NT 장치 객체를 포함하는 디렉터리 경로.
      \??\ \\?\와 동일하게 사용 가능. 다만 특수 문자 주의.
      \\<호스트명>\공유명\ 네트워크상의 공유 폴더 접근을 위한 UNC 경로 시작 부분.
    • 장치 파일 관련 정보

      장치 파일 설명
      NUL, CON, AUX, PRN, COM1~4, LPT1~4 예약된 DOS 기본 장치 이름. NUL 등은 가상 장치로도 사용 가능.
      CON (\\.\CON) 현재 콘솔 장치를 나타냄.
      CONIN$ (\\.\CONIN$) 콘솔의 입력 장치를 나타냄.
      CONOUT$ (\\.\CONOUT$) 콘솔의 출력 장치를 나타냄.
      \\?\GLOBALROOT\Device\HarddiskVolume<N> 다른 드라이브를 선택할 때 사용. <N>은 드라이브 번호 (예: 0, 1, 2…)
  • 임시 파일 디렉터리
디렉터리 설명
C:\Windows\Temp 임시 파일을 저장합니다.
%UserProfile%\AppData\Local\Temp 일반적으로 사용자별 임시 파일이 저장되는 경로입니다.

파일 업로드 공격

일반적으로 윈도우 웹서버는 AUTHORITY/LocalService 또는 NT AUTHORITY/NetworkService 사용자 권한으로 실행되는 데, 일반 권한으로도 덮어쓸 수 있는 파일을 덮어써서 임의 코드를 실행할 수 있다.

  • Apache Web Server : 아파치 웹서버는 C:\ApacheXY\htdocs 또는 C:\www 디렉터리에서 설정 파일을 관리.
    • AccessFileName 를 통해 설정 파일을 분산 관리. 기본 값은 .htaccess . AllowOverrideAllowOverrideList 지시어를 통해 명시한 지시어만 사용 가능 → .htaccess 파일은 웹 서버의 권한만 있다면 덮어씌우기 가능.
    • 공격 방법
      • 웹쉘 : .php 확장자 이외의 다른 확장자를 PHP 스크립트로 해석하도록 가능 → 확장자 우회
      • 요청 리다이렉트 : 모든 요청을 공격자의 웹서버로 전달
      • 공유 라이브러리 : C:\www 디렉터리 내 파일들을 조작할 수 있다면 미리 업로드 한 라이브러리 파일을 로드하여 임의 코드 실행

          LoadFile "C:\www\path\to\my\injected\library.dll"
        
  • 시스템 파일 : 높은 권한을 획득했을 때 이용할 수 있는 시스템 파일 표

| 파일 경로 | 설명 | | — | — | | C:\Windows\System32\config\systemprofile | NT AUTHORITY\SYSTEM 사용자 프로필 계정 (Linux의 /root와 유사). | | C:\Windows\System32\config\System | HKEY_LOCAL_MACHINE\SYSTEM 레지스트리 하이브 파일 (주요 시스템 설정 정보). | | C:\Windows\System32\config\System.alt | System의 백업/대체 파일. | | C:\Windows\System32\config\System.log | System의 변경 로그 파일. | | C:\Windows\System32\config\System.sav | System의 저장/복구용 사본 파일. | | C:\Windows\System32\config\Software | HKEY_LOCAL_MACHINE\SOFTWARE 레지스트리 하이브 파일 (설치된 소프트웨어 관련 정보). | | C:\Windows\System32\config\Software.log | Software 레지스트리 변경 로그. | | C:\Windows\System32\config\Software.sav | Software의 저장/복구용 사본 파일. | | C:\Windows\System32\config\SAM | HKEY_LOCAL_MACHINE\SAM 레지스트리 하이브 파일 (사용자 인증 정보 등 포함). | | C:\Windows\System32\config\SAM.log | SAM 변경 로그. | | C:\Windows\System32\config\SAM.sav | SAM의 저장/복구용 사본 파일. | | C:\Windows\System32\config\Security | HKEY_LOCAL_MACHINE\Security 레지스트리 하이브 파일 (보안 데이터베이스). | | C:\Windows\System32\config\Security.alt | Security의 백업 파일. | | C:\Windows\System32\config\Security.log | Security 변경 로그. | | C:\Windows\System32\config\Security.sav | Security 저장/복구용 사본. | | C:\Windows\System32\config\Default | HKEY_USERS\DEFAULT 하이브 (사용자 기본 레지스트리 구조). | | C:\Windows\System32\config\Default.log | Default 변경 로그. | | C:\Windows\System32\config\Default.sav | Default 저장/복구용 사본. |

  • 사용자 설정 파일 : 일반 권한으로 접근할수 있는 설정 파일
디렉터리 설명
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup 현재 사용자의 시작 프로그램 목록이 저장됩니다.
%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\StartUp 모든 로컬 사용자의 시작 프로그램 목록이 저장됩니다.

윈도우 파일 및 경로

  • 윈도우 파일명 : 파일명 뒷부분에 . 또는 스페이스 문자가 포함될 경우 자동 제거
  • 경로 변환 : 유닉스 계열의 운영 체제를 호환하기 위해 /\로 변환
    • \을 필터링하는 경우 /를 사용하여 우회
      • \?\ 문자열로 시작하는 경로에 대해서는 문자 변환 X
      경로 실제 경로
      C:\Windows C:\Windows
      C:\htdocs\upload\foo\bar C:\htdocs\upload\foo\bar
      C:\htdocs\upload\baz\..\..\..\Windows C:\Windows
      \\?\C:\htdocs\upload\qux\..\.. C: \htdocs\upload\qux\..\..
      \\?\C:\htdocs\upload\quux\..\..\..\ C:\htdocs\upload\quux\..\..\..\

윈도우 경로 표기

  • 드라이브 및 디바이스 경로

    윈도우 역시 상대 경로를 지원. 상대 경로를 사용하면 \ 을 사용하지 않고 파일에 접근 가능

    DOS 프로그램을 호환하기 위해 =C: =D:와 같은 환경 변수를 통해 각 드라이브의 위치를 저장 가능. 환경 변수가 할당되어있지 않다면 최상위 경로를 가리킴

    NT Object Manager 네임스페이스 경로를 사용하여 특정 경로에 접근 가능.

    • NT 커널이 직접 인식하는 내부 경로 체계로 \??\, \Device\, \GLOBALROOT 같은 경로로 시작
    • 윈도우에서 미리 등록한 장치 및 드라이브 예약어로 \\?\GLOBALROOT\Device\HarddiskVolume[N] 과 같은 구문으로 볼륨을 지정
      • HarddiskVolume0 : 일반적으로 C: 드라이브
      • HarddiskVolume1 : D: 드라이브
    • \\?\GLOBALROOT\SystemRoot 를 통해 “C:\Windows” 디렉터리에 접근 가능
    • 웹 서버나 네트워크 공유 서비스가 존재할 때에는 \\?\127.0.0.1\c$ 와 같이 내부 서비스를 통해 파일에 접근 가능
      • c$ : 관리자 공유(관리자만 접근 가능한 드라이브 전체 공유)
      • 자기 자신의 C 드라이브의 Windows 폴더에 네트워크 경로로 접근하는 것과 같음
  • 드라이브 및 디바이스 접근 방법

| 유형 | 형식 | 예시 | 설명 | | — | — | — | — | | 드라이브 내 절대경로 | {경로명} | \Windows\system32\calc.exe, \Build\...\Common\LfdTypes.h | 루트(\)부터 시작하는 절대 경로 | | 드라이브 내 상대경로 | {경로명} | Documents\desktop.ini, ..\..\..\..\Dir1\..\..\Users | 현재 디렉터리를 기준으로 이동하는 상대경로 | | Win32 장치 경로 | \\.\{장치 경로명} | \\.\NUL, \\.\COM1, …, \\.\LPT4, \\.\PIPE\파이프명 | 장치 파일 및 파이프(IPC) 경로 | | UNC 경로 | \\{서버}\{공유명}\{경로}, \\?\UNC\... | \\smb.dreamhack.io\share, \\?\UNC\smb.dreamhack.io\share | 네트워크 공유 경로 | | NT 객체 경로 | \\?\{객체 경로명}, \\??\{객체 경로명} | \\?\C:\Windows\system32, \\??\GLOBALROOT\..., \\??\GLOBALROOT\SystemRoot | 커널 레벨 경로. 드라이브 문자 또는 볼륨명 사용 가능 | | 드라이브 절대 경로 | {드라이브 문자}:\{경로} | C:\Windows\system32\calc.exe, F:\Media\Intro.mp4 | 일반적으로 사용하는 절대 경로 | | 드라이브 상대 경로 | {드라이브 문자}:\{상대경로} | C:notes.txt, D:..\Test\other.doc | 드라이브 기준 상대경로 (현재 작업 디렉터리 기준 해석됨) |

  • DOS 8.3 파일명 : DOS 운영 체제의 파일명은 8바이트, 확장자 3바이트를 포함하여 최대 11 바이트 버퍼를 사용. 짧은 파일명(SFN)이라고도 불림
    • 윈도우 3.5부터는 SFN 제약을 없앤 긴 파일명(LFN)을 지원하지만 옛날 프로그램은 아직 8.3 방식으로만 파일명을 인식함. 그래서 호환을 위해 긴 파일명에 8.3 파일명 별칭을 부여
      • 별칭이 붙는다는 특징을 이용하여 확장자 우회 가능
      • fsutil.exe 8dot3name 명령어를 통해 별칭의 생성을 막을 수 있음
      • 규칙
        1. 파일명은 모두 대문자
        2. 스페이스, ASCII 제어 문자(STX, ESC 등) 및 ASCII 외 문자는 모두 제거
        3. '+'와 같은 특수 문자는 밑줄(_) 문자로 치환
        4. 파일명과 확장자는 각각 8바이트와 3바이트 이하의 문자열로 이뤄지고 '.' 문자를 포함할 수 없음
          • 고정 버퍼를 초과하는 파일은 다음과 같이 변환
            • Dreamhack.jpgDREAMH~1.JPG
            • Dreamhack.htmlDREAMH~1.HTM
          • 만약 첫 6바이트가 중복되는 파일이 생성 되는 경우에는
            • Dreamhill.jpgDREAMH~2.JPG
        5. 동일한 6자리 짧은 이름을 가진 네 개의 파일이 폴더 내에 있을 때에는 파일명에 해시값이 DRA4EF~1.JPG와 같이 포함

File Vulnerability for Linux

파일 시스템

유닉스 계열의 운영 체제는 다양한 객체들을 파일 시스템으로 제어

  • 로그 및 데이터 파일

| 디렉터리 | 설명 | | — | — | | /var/www | 웹 문서 및 기타 웹 서버에서 사용되는 파일을 저장합니다. | | /var/lib | 시스템의 각종 서비스에서 자료를 저장할 때 사용합니다. 데이터베이스 등 포함. | | /var/lib/mysql | MySQL 데이터베이스의 데이터가 저장됩니다. | | /var/lib/pgsql, /var/lib/postgresql | PostgreSQL 데이터베이스의 데이터가 저장됩니다. | | /var/log | 시스템 서비스 등의 로그를 저장할 때 사용됩니다. | | /var/cache | 캐시 데이터를 저장합니다. 삭제돼도 재생성 가능한 임시 성격의 데이터. | | /media | 제거 가능한 매체(USB, 외장 저장장치 등)를 마운트할 때 사용됩니다. | | /mnt | 기타 파일시스템을 임시로 마운트하는 용도로 주로 사용됩니다. |

  • 설정 파일

| 디렉터리 및 파일 | 설명 | | — | — | | /etc | 운영체제 초기 부팅 시 필요한 최소한의 명령어를 구현하는 프로그램 파일 저장 | | /etc/apache2, /etc/httpd | Apache Web Server의 설정 정보 저장 | | /etc/nginx | Nginx 웹 서버의 설정 정보 저장 | | /etc/mysql | MySQL 데이터베이스 서버의 설정 정보 저장 | | /opt/etc | 추가 설치된 프로그램의 설정 정보 저장 (없을 수도 있음) | | /etc/mysql/my.cnf | MySQL 데이터베이스 서버의 주 설정 파일 | | /etc/passwd, /etc/group | 사용자 및 그룹 정보 저장 | | /etc/shadow, /etc/gshadow | 사용자 인증 비밀번호 암호화 저장 (일반적 접근 불가, 관리자만 접근 가능) | | /etc/hostname | 현재 시스템의 호스트네임 저장 | | /etc/hosts | 호스트네임 ↔ IP 매핑을 위한 정적 순환표 저장 | | /etc/fstab | 등록된 파일시스템 목록 저장 |

  • 장치 및 가상 파일

| 디렉터리 및 파일 | 설명 | | — | — | | /dev | 각종 디스크 및 장치 파일을 제공합니다. | | /sys | 하드웨어(주변기기 등) 및 플랫폼에 접근할 수 있도록 합니다. | | /proc | 프로세스 및 시스템 정보를 제공하는 가상 파일시스템에 위치합니다. | | /proc/sys | 운영체제의 동작을 제어할 수 있는 각종 파라미터가 위치합니다. | | /proc/self/net 또는 /proc/net | 운영체제 네트워크 계층의 다양한 정보를 제공하는 파일들이 위치합니다. | | /dev/null, /dev/zero, /dev/full, /dev/random, /dev/urandom | 실제 장치는 아니지만 자주 사용되는 특수 파일입니다. | | /dev/pts | 유사터미널(PTY) 장치가 위치한 디렉터리로, SSH 터미널이나 터미널 에뮬레이터에서 사용됩니다. | | /dev/stdin → /proc/self/fd/0 | 표준 입력(standard input) 파일을 나타내는 심볼릭 링크입니다. | | /dev/stdout → /proc/self/fd/1 | 표준 출력(standard output) 파일을 나타내는 심볼릭 링크입니다. | | /dev/stderr → /proc/self/fd/2 | 표준 오류 |

  • 프로그램 및 라이브러리

| 디렉터리 | 설명 | | — | — | | /bin, /sbin | 운영체제 초기 부팅 시 필요한 최소한의 명령어를 구현하는 프로그램 파일 저장 | | /boot | 커널이나 부트로더 옵션 등 부팅에 필요한 파일 저장 | | /lib, /lib64, /libx32 | 부팅 시 필요한 최소한의 라이브러리 파일 저장 | | /opt | 추가적인 프로그램 저장 | | /usr/bin | 각종 명령어 및 프로그램 파일 저장 | | /usr/sbin | 시스템 관리자가 주로 사용하는 명령어 및 프로그램 파일 저장 | | /usr/lib, /usr/lib64, /usr/libx32 | 시스템에서 공유되는 라이브러리 파일 저장 | | /usr/share | 기타 시스템에서 공유되는 파일 저장 |

  • 임시 파일
디렉터리 설명
/tmp 임시 파일 저장. 시스템 재시작 시 삭제될 수 있음. 디스크나 메모리(tmpfs)에 존재 가능.
/var/tmp 임시 파일 저장. 시스템 재시작 시에도 유지되는 경향이 있음.
/run (/var/run) 부팅 후 생성되는 런타임 데이터 및 IPC 소켓 저장. 메모리상(tmpfs)에만 존재.
/var/run/postgresql PostgreSQL 소켓 등이 위치.
/var/run/mysqld MySQL 소켓 등이 위치.
/dev/shm shm_open(3)에서 사용하는 공유 메모리 공간. 일반적으로 메모리(tmpfs)에 존재하며, 시스템에 따라 존재하지 않을 수도 있음.

파일 업로드 공격

웹 서비스는 root 권한이 아닌 www-data, nginx, apache와 같이 일반 계정으로 실행

  • Apache Web Server 아파치 웹서버는 /etc/apache 또는 /etc/httpd 디렉터리에서 설정 파일을 관리.
    • 윈도우와 똑같이 AccessFileName 를 통해 설정 파일을 분산 관리. 기본 값은 .htaccess . AllowOverrideAllowOverrideList 지시어를 통해 명시한 지시어만 사용 가능 → .htaccess 파일은 웹 서버의 권한만 있다면 덮어씌우기 가능.
    • 공격 방법
      • 웹쉘 : 윈도우와 마찬가지로 .php 확장자 이외의 다른 확장자를 PHP 스크립트로 해석하도록 가능 → 확장자 우회
      • 요청 리다이렉트 : 윈도우와 마찬가지로 모든 요청을 공격자의 웹서버로 전달.
      • 동적 라이브러리 삽입 : 리눅스에서 CGI 스크립트를 사용하는 경우 동적 라이브러리를 프로세스에 삽입

          SetEnv LD_PRELOAD /var/www/path/to/my/injected/library.so
        
      • 공유 라이브러리 로드 : /etc/apache2 디렉터리 내 파일들을 조작할 수 있다면 미리 업로드 한 라이브러리 파일을 로드하여 임의 코드 실행.

        → 변경된 설정 파일을 웹 서버에 반영하기 위해서 서비스 재시작 필요

          LoadFile "/var/www/path/to/my/inejcted/library.so"
        
  • 설정 파일 : 일반 권한으로 접근할 수 있는 파일. /.profile/.ssh/authorized_keys 는 관리자가 로그온하는 계정과 웹 서버 계정이 같을 때에만 사용 가능

    파일 설명
    .htaccess Apache Web Server에서 웹 문서 디렉터리 내 서버 설정을 제어할 수 있습니다.
    .bashrc, /.profile 사용자 로그인 시 실행되는 셸 명령어를 지정합니다.
    ~/.ssh/authorized_keys 해당 사용자에 로그인할 수 있는 SSH 공개키를 지정합니다. 공격자가 자신의 키를 추가하면 시스템에 로그인 가능.
    ~/.ssh/config SSH 클라이언트 설정 파일로, 접속할 Host 등을 지정합니다. 악의적 호스트로 리디렉트 가능.
  • 루트 권한 : root 권한으로 공격 시 이용
    • 파일

    | 파일 | 설명 | | — | — | | /boot/initramfs-X.Y.Z.img | 부팅 시 초기 사용 파일을 저장한 이미지. 시스템 파티션 전환 시 삭제되므로 악성코드 삽입 시 탐지 어려울 수 있음. | | /etc/rc.local | 시스템 부팅 시 실행될 명령을 지정합니다. | | /etc/crontab | 시스템 부팅 후 주기적으로 실행될 명령을 지정합니다. | | /etc/profile | 사용자 로그인 시 매번 실행되는 명령을 지정합니다. |

    • 디렉터리
    디렉터리 설명
    /sys/firmware/efi/efivars EFI 시스템에서 부팅 옵션 변경 가능. (형식은 EFI 표준에 따름)
    /etc/profile.d 사용자가 로그인할 때 실행될 명령을 담은 스크립트를 저장하는 디렉터리
    /proc, /sys 루트 권한에서 시스템 제어 시 사용하는 가상 파일 시스템. 시스템 제어용 파일이 위치함

파일 다운로드 공격

  • 시스템 가상 파일 : 실제로 디스크에 존재하는 파일이 아닌 커널이 실시간으로 만들어서 제공하는 파일. 메모리상에서 동적으로 생성하여 제공.
    • 일반 권한으로 접근할 수 있는 시스템 파일 및 심볼릭 링크
      • 심볼릭 링크 : 파일이나 디렉터리에 대한 지름길 역할을 하는 특수 파일
    파일 경로 설명
    /proc/cpuinfo 시스템 CPU 정보를 조회할 수 있습니다.
    /proc/uptime 시스템의 구동 시간을 조회할 수 있습니다.
    /proc/version 시스템 커널 버전 정보를 조회할 수 있습니다.
    /proc/self/net/arp, /proc/net/arp 내부망에 연결된 호스트 정보(IP-MAC 매핑)를 조회합니다.
    /proc/self/net/route, /proc/net/route 기본 라우팅 테이블 정보를 조회합니다.
    /proc/self/net/tcp, /proc/net/tcp 현재 시스템의 TCP 연결 정보를 조회합니다.
    /proc/self/fd/<FD>, /dev/fd/<FD> 열려 있는 파일을 가리키는 심볼릭 링크입니다. (<FD>는 파일 디스크립터 번호)
    /proc/self/cmdline, /proc/self/environ 현재 프로세스의 명령줄 인자 및 환경 변수 정보를 가져옵니다. (환경 변수에 민감 정보 포함 가능)
    /proc/self/exe 현재 프로세스의 실행 파일을 가리키는 심볼릭 링크입니다.
    /proc/self/cwd 현재 프로세스의 작업 디렉터리(Current Working Directory)를 가리키는 심볼릭 링크입니다.
    /proc/self/maps 현재 프로세스의 메모리 매핑 및 사용 중인 라이브러리 파일명을 확인할 수 있습니다.
  • 설정 파일 : 일반 권한으로 접근 가능한 파일. 프로필 및 SSH 키 등은 관리자가 로그온하는 계정과 웹 서버의 계정이 같을 때 사용 가능

    파일 설명
    ~/.bash_history, ~/.zsh_history, ~/.python_history 사용자가 입력한 셸 명령어 및 인터프리터 명령 기록을 저장합니다.
    ~/.ssh/id_rsa, ~/.ssh/id_ed25519 사용자의 SSH 비밀키가 저장되어 있는 파일입니다.
    ~/.gnupg GPG(GNU Privacy Guard) 설정 및 비밀키, 공개키 정보가 저장됩니다.
    ~/.netrc FTP 서버 로그인 시 사용자 이름과 비밀번호 등을 저장하는 파일입니다.
    ~/.viminfo Vim 에디터에서 열었던 파일 목록, 검색 기록, 편집 정보 등이 저장됩니다.
  • 로그 파일

    파일 및 디렉터리 설명
    /var/log/apache2, /var/log/httpd Apache Web Server의 로그 저장 위치. 웹 서비스 접속 기록은 access.log, 에러 로그: error.log
    /var/log/nginx Nginx 웹 서버의 로그가 저장됩니다.
    /var/log/php-fpm FastCGI 기반 PHP 로그가 저장됩니다.
    /var/log/journal systemd 기반 시스템 로그 디렉터리입니다.
    /var/log/wtmp, /var/log/btmp, /var/log/lastlog 사용자 로그인/로그아웃, 실패한 로그인 시도, 마지막 접속 시간 등을 기록합니다.

File Vulnerability Cases

우회 공격

  • NULL 문자 : 문자열의 끝을 나타내거나 값을 초기화하는 용도로 사용. URL의 파라미터에 %00 을 삽입.
    • EX)

      URL 인코딩 입력 C 문자열 표기 실제 인식된 파일명
      foo/bar.jpg "foo/bar.jpg" foo/bar.jpg
      hello%00world "hello\0world" hello
      baz/qux.cfg%00.jpg "baz/qux.cfg\0.jpg" baz/qux.cfg
    • 파일명의 끝에 있는 문자열로 확장자를 판단하는 경우 실제 확장자 뒤에 널 문자를 삽입하여 확장자 검사 우회

      • 마지막 baz/qux.cfg%00.jpg 처럼 C에서는 .jpg로 판단하여 필터링을 하지 않는 데, 실제로 인식되는 파일명은 baz/qux.cfg이므로 우회
  • Path Traversal : 업로드 및 다운로드 경로를 조작. 이용자가 업로드하거나 다운로드 할 파일을 지정할 때 사용
    • foo + 이용자가 입력하는 파일명의 상황에서 \bar\..\baz 를 입력하는 경우
      • 윈도우는 bar가 없어도 자동으로 보정하여 foo\baz가 된다.
      • 리눅스의 경우에는 bar가 없으면 에러가 발생한다.

      → 앞 글자에서만 ../ 필터링을 하는 경우에는 윈도우는 취약점이 노출된다.

  • 정규식 확장자 검사 : 웹 서버와 응용 프로그램 마다 확장자를 검사하는 알고리즘이 다름. 다음은 정규식에 따른 확장자 검사 방법

    | 파일명 | (\..*) | (\.[^.]*\) | (\.[^.]+)$ | [^.](\.[^.]+)$ | | — | — | — | — | — | | no-extension | - | - | - | - | | dream.php | dream.php | dream.php | dream.php | dream.php | | dream.tar.gz | dream.tar.gz | dream.tar.gz | dream.tar.gz | dream.tar.gz | | .bashrc | .bashrc | .bashrc | .bashrc | - | | dream.jpg.php | dream.jpg.php | dream.jpg.php | dream.jpg.php | dream.jpg.php | | .php | .php | .php | .php | - |

    • (\..*) : . 문자 위에 있는 모든 부분 문자열을 찾음
    • (\.[^.]*\) : . 문자 위에 있는 모든 부분 문자열을 찾음
    • (\.[^.]+)$ : 가장 마지막에 위치한 . 기준으로 문자열을 찾음
      • .htaccess 같은 파일을 처리할 때에는 htaccess를 확장자로 인식
    • [^.](\.[^.]+)$ : 가장 마지막에 위치한 . 기준으로 이후에 있는 문자열을 모두 찾고, 시작 부분에 위치한 . 을 무시
      • 시작 부분에 위치한 . 을 무시한다는 것은 .php나 .bashrc 같은 파일명은 확장자 없음으로 처리
      • 웹 서버가 확장자만 있는 파일명을 모두를 확장자로 인식한다면 해당 검사 우회 가능. → 즉 .php 같은 파일이 확장자가 없는 파일명이라고 보고 차단하지 않지만 웹 서버는 php인 파일로 해석하여 실행
    • 정규식으로 필터링을 하는 경우 $ 문자가 문자열 끝이 아닌 줄의 끝을 의미. 즉, 개행 문자 \n 을 사이에 넣는 경우 우회가 가능
      • EX) dream.jpg\nwebshell.phpdream.jpg 로 인식하고 php를 필터링하지 못함
  • 문자열 치환 우회
    • EX) webshell.ph.**php**pwebshell.php
  • NTFS Alternate Data Stream
    • NFTS : 윈도우 NT 계열의 운영 체제가 사용하는 파일 시스템. 한 파일에 여러 개의 데이터 스트림을 붙일 수 있어서 하나의 파일 안에 다른 파일이나 데이터를 숨길 수 있음
    • ADS : NFTS 파일 시스템에서 지원하는 숨겨진 데이터 저장 공간. 즉 추가로 붙는 데이터 스트림을 일컫는 말

      구문 설명
      Filename:Stream Filename의 스트림 Stream을 참조합니다.
      Filename:Stream:$DATA Filename:Stream과 같은 의미입니다.
      Filename Filename의 기본 스트림을 참조합니다. 즉, :를 붙이지 않았을 때와 같습니다.
      Filename:$DATA Filename:과 같은 의미입니다.
      Dirname::$INDEX_ALLOCATION 해당 파일을 쓰게 되면 파일 대신 디렉터리가 생성됩니다. $INDEX_ALLOCATION은 NTFS 내부에서 관리하는 디렉터리 인덱스(데이터베이스 인덱스와 유사)의 속성 타입입니다.
      Dirname:$I30:$INDEX_ALLOCATION 해당 파일을 쓰게 되면 파일 대신 디렉터리가 생성됩니다. $I30은 속성 0x30($FILE_NAME)의 인덱스(I)를 뜻합니다.
      Filename:AttrName:$AttrType 상기한 구문의 기본형입니다. NTFS 데이터 스트림은 실제로는 $DATA 타입의 속성을 의미하며, 스트림명은 속성의 명칭을 의미합니다.
    • Shell.php::$DATA 를 통해 확장자 검사를 우회하지만 OS는 Shell.php::$DATA를 기본 스트림으로 인식하고 Shell.php로 실행
  • 와일드카드 : Window에서 FindFirstFile*FindNextFile* API를 통해 파일 디렉터리를 탐색하고 열람. 와일드카드 문자를 지원함.
    • 규칙

      와일드카드 설명
      * 0개 이상의 문자를 매칭합니다. 단, 문자의 패턴이 *.인 경우 .은 매칭되지 않습니다. 예: Foo*rFoo.bar
      ? 확장자 문자 이전 1개의 문자를 매칭합니다. 예: Q?xQux, Fo?Foo, Fox
      * (확장자 무시) * 문자와 유사하지만, 파일명과 확장자를 건너뛰어 매칭하지 않습니다. . 문자는 파일명의 일부로 인식되며, .으로 시작하는 파일명인 경우 .도 포함해 매칭됩니다. 예: Fo*.XFoo.XLS
      ? (확장자 무시) ?와 비슷하지만 . 뒤에 위치하면 파일의 끝은 매칭하지 않습니다. 예: Qux.?Qux.Z (끝을 제외)
      . 문자 . 자체를 매칭합니다. 예: File*txtFile.txt는 매칭됩니다
    • 공격 예시 : 허용하지 않은 문자도 추가적으로 지원

      • Webc*로 검색하면 Web.config까지 접근 가능
      • Web<< or Web”Config 를 검색하면 Web.config까지 접근 가능

파일 삭제 공격

중요 파일을 삭제하여 서비스를 마비시키거나 원격 코드 실행을 통한 공격 방법

  • EX) 그누보드(gnuboard)의 코드
// https://github.com/gnuboard/gnuboard5/blob/f83d336e0ba0b06e1b3b2886c4783049c65b2f08/common.php#L148-L199

$dbconfig_file = G5_DATA_PATH.'/'.G5_DBCONFIG_FILE;
if (file_exists($dbconfig_file)) {
    include_once($dbconfig_file);
    include_once(G5_LIB_PATH.'/common.lib.php');    // 공통 라이브러리

    $connect_db = sql_connect(G5_MYSQL_HOST, G5_MYSQL_USER, G5_MYSQL_PASSWORD) or die('MySQL Connect Error!!!');
    $select_db  = sql_select_db(G5_MYSQL_DB, $connect_db) or die('MySQL DB Error!!!');

    $g5['connect_db'] = $connect_db;

    sql_set_charset(G5_DB_CHARSET, $connect_db);
    if(defined('G5_MYSQL_SET_MODE') && G5_MYSQL_SET_MODE) sql_query("SET SESSION sql_mode = ''");
    if (defined('G5_TIMEZONE')) sql_query(" set time_zone = '".G5_TIMEZONE."'");
} else {
?>

<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>오류! <?php echo G5_VERSION ?> 설치하기</title>
<link rel="stylesheet" href="install/install.css">
</head>
<body>

<div id="ins_bar">
    <span id="bar_img">GNUBOARD5</span>
    <span id="bar_txt">Message</span>
</div>
<h1>그누보드5를 먼저 설치해주십시오.</h1>
<div class="ins_inner">
    <p>다음 파일을 찾을 수 없습니다.</p>
    <ul>
        <li><strong><?php echo G5_DATA_DIR.'/'.G5_DBCONFIG_FILE ?></strong></li>
    </ul>
    <p>그누보드 설치 후 다시 실행하시기 바랍니다.</p>
    <div class="inner_btn">
        <a href="<?php echo G5_URL; ?>/install/"><?php echo G5_VERSION ?> 설치하기</a>
    </div>
</div>
<div id="ins_ft">
    <strong>GNUBOARD5</strong>
    <p>GPL! OPEN SOURCE GNUBOARD</p>
</div>

</body>
</html>

<?php
    exit;
}

그누보드에서 config.php와 dbconfig.php는 기본 설정 파일

  1. dbconfig.php 파일이 있는지 확인
  2. 있으면 DB 연결하고 공통 설정을 로드
  3. 없으면 HTML로 설치 안내 페이지를 출력하고 종료

이 때, 공격자가 dbconfig.php을 삭제 후 설치 페이지에서 데이터베이스 연결 정보를 자신의 서버로 등록할 수 있으며, 이를 통해 정보 탈취 및 원격 코드 실행 가능

Categories:

Updated:

Leave a comment