[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
.AllowOverride
와AllowOverrideList
지시어를 통해 명시한 지시어만 사용 가능 →.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 폴더에 네트워크 경로로 접근하는 것과 같음
- NT 커널이 직접 인식하는 내부 경로 체계로
-
드라이브 및 디바이스 접근 방법
| 유형 | 형식 | 예시 | 설명 |
| — | — | — | — |
| 드라이브 내 절대경로 | {경로명}
| \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
명령어를 통해 별칭의 생성을 막을 수 있음- 규칙
- 파일명은 모두 대문자
- 스페이스, ASCII 제어 문자(STX, ESC 등) 및 ASCII 외 문자는 모두 제거
'+'
와 같은 특수 문자는 밑줄(_
) 문자로 치환- 파일명과 확장자는 각각 8바이트와 3바이트 이하의 문자열로 이뤄지고
'.'
문자를 포함할 수 없음- 고정 버퍼를 초과하는 파일은 다음과 같이 변환
Dreamhack.jpg
→DREAMH~1.JPG
Dreamhack.html
→DREAMH~1.HTM
- 만약 첫 6바이트가 중복되는 파일이 생성 되는 경우에는
Dreamhill.jpg
→DREAMH~2.JPG
- 고정 버퍼를 초과하는 파일은 다음과 같이 변환
- 동일한 6자리 짧은 이름을 가진 네 개의 파일이 폴더 내에 있을 때에는 파일명에 해시값이
DRA4EF~1.JPG
와 같이 포함
- 윈도우 3.5부터는 SFN 제약을 없앤 긴 파일명(LFN)을 지원하지만 옛날 프로그램은 아직 8.3 방식으로만 파일명을 인식함. 그래서 호환을 위해 긴 파일명에 8.3 파일명 별칭을 부여
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
.AllowOverride
와AllowOverrideList
지시어를 통해 명시한 지시어만 사용 가능 →.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가 없으면 에러가 발생한다.
→ 앞 글자에서만
../
필터링을 하는 경우에는 윈도우는 취약점이 노출된다. - 윈도우는 bar가 없어도 자동으로 보정하여
- foo + 이용자가 입력하는 파일명의 상황에서
-
정규식 확장자 검사 : 웹 서버와 응용 프로그램 마다 확장자를 검사하는 알고리즘이 다름. 다음은 정규식에 따른 확장자 검사 방법
| 파일명 |
(\..*)
|(\.[^.]*\)
|(\.[^.]+)$
|[^.](\.[^.]+)$
| | — | — | — | — | — | | 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.php
→dream.jpg
로 인식하고 php를 필터링하지 못함
- EX)
- 문자열 치환 우회
- EX)
webshell.ph.**php**p
→webshell.php
- EX)
- 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*r
→Foo.bar
?
확장자 문자 이전 1개의 문자를 매칭합니다. 예: Q?x
→Qux
,Fo?
→Foo
,Fox
*
(확장자 무시)*
문자와 유사하지만, 파일명과 확장자를 건너뛰어 매칭하지 않습니다..
문자는 파일명의 일부로 인식되며,.
으로 시작하는 파일명인 경우.
도 포함해 매칭됩니다. 예:Fo*.X
→Foo.XLS
?
(확장자 무시)?
와 비슷하지만.
뒤에 위치하면 파일의 끝은 매칭하지 않습니다. 예:Qux.?
→Qux.Z
(끝을 제외).
문자 .
자체를 매칭합니다. 예:File*txt
와File.txt
는 매칭됩니다 -
공격 예시 : 허용하지 않은 문자도 추가적으로 지원
Webc*
로 검색하면 Web.config까지 접근 가능Web<<
orWeb”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는 기본 설정 파일
- dbconfig.php 파일이 있는지 확인
- 있으면 DB 연결하고 공통 설정을 로드
- 없으면 HTML로 설치 안내 페이지를 출력하고 종료
이 때, 공격자가 dbconfig.php을 삭제 후 설치 페이지에서 데이터베이스 연결 정보를 자신의 서버로 등록할 수 있으며, 이를 통해 정보 탈취 및 원격 코드 실행 가능
Leave a comment