[모각코]WebHaking(8강)&Reverse Engineering(1강)
07-28 수요일
Sever-side Advanced - File Vulnerability
리눅스 파일 시스템
웹 서버는 Unix 계열의 운영체제가 많이 사용되며, 그중 상당수가 Linux 운영체제 사용
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
호스트네임의 실주소를 탐색할 때 사용되는 정적 순람표 /etc/fstab
현재 시스템에 등록할 파일시스템의 목록을 저장 -
프로그램 및 라이브러리
디렉터리 설명 /bin, /sbin
운영체제 초기 부팅 시 필요한 최소한의 명령어를 구현하는 프로그램 파일을 저장 /boot
커널이나 부트로더 옵션 등 부팅에 필요한 파일을 저장 /lib, /lib64, /libx32, ...
운영체제 초기 부팅 시 필요한 최소한의 라이브러리 파일을 저장 /opt
추가적인 프로그램을 저장 /usr/bin
각종 명령어 및 프로그램 파일을 저장 /usr/sbin
시스템 관리자가 주로 사용하는 각종 명령어 및 프로그램 파일을 저장 /usr/lib, /usr/lib64, /usr/libx32, ...
시스템에서 공유되는 라이브러리 파일을 저장 /usr/share
기타 시스템에서 공유되는 파일을 저장 -
장치 및 가상파일
디렉터리 설명 /dev
각종 디스크 및 장치 파일을 제공 /sys
하드웨어(주변기기 등) 및 플랫폼에 접근 /proc
프로세스 및 시스템 정보를 제공하는 가상 파일시스템 /proc/sys
운영체제의 동작을 제어할 수 있는 각종 파라미터가 위치 /proc/self/net (또는 /proc/net)
운영체제 네트워크 계층의 다양한 정보를 제공 파일 설명 /dev/null, /dev/zero, /dev/full /dev/random, /dev/urandom
실제 물리적인 장치를 나타내지는 않지만 자주 사용되는 특수 파일 /dev/pts
유사터미널(pseudoterminal) TTY 장치가 위치한 디렉터리 /dev/stdin → /proc/self/fd/0
파일 디스크립터 0, 즉 표준 입력(standard input)에 사용된 파일을 나타내는 심볼릭 링크 /dev/stdout → /proc/self/fd/1
파일 디스크립터 1, 즉 표준 출력(standard output)에 사용된 파일을 나타내는 심볼릭 링크 /dev/stderr → /proc/self/fd/2
파일 디스크립터 2, 즉 표준 오류 출력(standard error)에 사용된 파일을 나타내는 심볼릭 링크 -
임시 파일
디렉터리 설명 /tmp
임시 파일을 저장(재시작(재부팅)시 삭제 될 수 있음) /var/tmp
임시 파일을 저장(재시작(재부팅)시에도 일반적으로 유지) un (/var/run)
부팅 후 생성된 각종 런타임 데이터 및 IPC 소켓 등이 이곳에 위치 /var/run/postgresql
PostgreSQL 소켓 등이 위치 /var/run/mysql
MySQL 소켓 등이 위치 /dev/shm
Linux shm_open(3) C 라이브러리 함수에서 사용
파일 업로드 시 공격 지점
시스템 관리자가 웹 서비스와 같은 계정으로 로그인 하면 코드 실행 등의 공격이 가능함
-
Apache Web Server
AllowOverride
나AllowOverrideList
디렉티브로 허용할 경우 추가적으로 설정 파일로 입력 받을 수 있음htaccess
파일이 허용되는 경우 이를 작성하여 웹 문서 디렉터리에 업로드 하면.php
확장자를 우회하여
웹쉘을 실행하거나 문서를 접근할 때 공격자의 웹 페이지가 접속되는 등의 영향을 미침
-
/proc(일반 권한)
/proc/<PID>/
대신proc/self/
를 사용하면 현재 프로세스를 접근할 수 있음
파일 업로드 시 파일 존재 여부를 확인한다면 아래 파일은 사용할 수 없음
/proc/<PID>/coredump_filter
/proc/<PID>/mem
/proc/<PID>/comm
/proc/<PID>/sched
/proc/<PID>/oom_adj, /proc/<PID>/oom_score_adj
-
설정 파일
- 웹 문서 설정, 쉘 명령어, SSH 공개키 지정 등
-
루트 권한
- 시스템 부팅 시 실행될 명령, 사용자 로그인 마다 실행되는 명령 지정 등
파일 다운로드 시 공격 지점
- 시스템 가상 파일
- 시스템 CPU정보, 구동 시간, 커널 버전 정보 등 조회
- 설정 파일
- 사용자가 입력한 쉘 명령어 저장, SSH 비밀키 위치 등
- 로그 파일
- 사용자 접속 기록 등을 저장하는 로그 파일
윈도우 파일시스템
Linux와 다르게 경로에서 드라이브 지정 가능, 대부분의 중요한 파일은 C:
에 위치한 경우가 많음
또한 파일시스템 접근만으로는 시스템 제어가 어려움
-
로그 파일
디렉터리 설명 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\dat
PostgreSQL 데이터베이스의 데이터 C:\Windows\System32\Winevt\Logs
윈도 이벤트 로그를 저장할 때 사용 C:\Windows\Prefetch
Superfetch 데이터를 저장 -
설정 파일
디렉터리 설명 C:\Windows\System32\config
시스템 단위 레지스트리 하이브 파일이 저장 C:\Boot
부팅 관련 파일을 저장 %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 장치 파일을 접근하는 경로의 시작 \\?\
NT 객체 관리자 하위체계의 객체 및 심볼릭 링크 등을 접근하는 경로의 시작 \\?\GLOBALROOT\
실제 Object Manager의 최상위 경로를 접근하는 경로 \\?\GLOBALROOT\Device
NT 장치 객체를 포함하는 디렉터리 \??\
\\?\
와 동일하게 사용\\<호스트명>\<공유명>\
네트워크상에 공유된 자원에 접근할 수 있느 UNC 경로 장치 파일 설명 NUL, CON, AUX, PRN, COM1, COM2, COM3, COM4, LPT1, LPT2, LPT3, LPT4, ...
예약된(reserved) DOS 기본 장치 이름 CON (\\.\CON)
현재 콘솔 장치 CONIN$ (\\.\CONIN$)
현재 콘솔 입력 장치 CONOUT$ (\\.\CONOUT$)
현재 콘솔 출력 장치 \\?\GLOBALROOT\Device\HarddiskVolume<N> ...
다른 드라이브를 선택할 때 C:\
와 같은 문법 대신 사용 -
임시 파일
디렉터리 설명 C:\Windows\Temp
임시 파일을 저장 %UserProfile%\AppData\Local\T
일반적으로 사용자별 임시 파일이 저장되는 경로
파일 업로드 시 공격 지점
-
Apache Web Server
AllowOverride
나AllowOverrideList
디렉티브로 허용할 경우 추가적으로 설정 파일로 입력 받을 수 있음htaccess
파일이 허용되는 경우 이를 작성하여 웹 문서 디렉터리에 업로드 하면.php
확장자를 우회하여
웹쉘을 실행하거나 문서를 접근할 때 공격자의 웹 페이지가 접속되는 등의 영향을 미침
-
시스템 파일
- 관리자 권한에서 접근 가능한 시스템 파일
-
사용자 설정 파일
- 사용자 권한에서 접근 가능한 파일
파일명 끝 마침표 자동 제거 및 자동 슬래시 변환
Windows 운영체제 에서는 파일명 끝에 .
이나 공백 문자를 덧쓰면 이를 자동으로 제거함
Unix 계열 운영체제와의 호환성을 위해 Windows 운영체제는 /
를 \
로 자동 변환함
(Linux 에서는 자동 변환하지 않음)
드라이브, 장치 및 UNC 접근
Windows 운영 체제에서는 파일 경로를 표기하는 구문이 다양함
따라서 웹 응용이 특정 문자나 패턴을 파일명에서 여과한다면 다른 구문을 통해 우회할 수 있음
DOS 8,3 파일명 사용
DOS 운영체제에서는 파일명 최대 8글자, 확장자 최대 3글자만을 허용하며, 모든 문자가 대문자여야 함 윈도 3.5 부터는 제약조건이 없는 파일명을 제공하며 DOS와의 호환을 위해 8.3 파일명 별칭을 부여함
따라서 webshell.phtml
은 WEBSHE1.PHT
로 .htaccess
는 HTACCE~1
등으로 별칭이 생겨
이를 통해 확장자 검사을 우회할 수 있음
NTFS Alternate Data Stream을 이용한 우회
파일 시스템에서 Fork라는 개념은 압축 파일 처럼 여러 종류의 데이터를 포함시킬 수 있도록 함
윈도의 NTFS 파일시스템은 이를 ADS(Alternate Data Stream)으로 구현,
이를 통해 파일명:스트림명
으로 접근할 수 있음
이러한 방식으로 다음과 같이 우회 가능함
Shell.php::$DATA.
는 .
자동 제거에 의해 Shell.php::$DATA
가 되며, 이는 스트림을 참조하므로,
Shell.php
와 같은 파일을 사용하게 됨
파일명 검증 부재
파일 경로에서 디렉터리 명은 /
또는 \
로 구분지으며, 현재 디렉토리는 .
로, 상위 디렉터리는 ..
로 나타냄
이처럼 다양한 소프트웨어에서는 파일 경로에서 일부 문자에 특수한 의미를 부여함
이러한 특수한 의미를 지닌 문자를 제대로 여과하지 않고 파일시스템에 사용하게 되면 취약점 발생
-
파일명 널(NULL) 문자 삽입
운영체제에서 NULL 문자가 삽입되면 이는 파일명의 끝으로 인식됨
만약 웹 응용에서 NULL 문자를 불허하지 않으면서 파일명의 끝으로 확장자 등을 검사하면,
확장자 뒤에 NULL 문자를 삽입함으로써 검사를 우회할 수 있음이를 방어하기 위해 Apache 등의 웹 서버는 NULL 문자를
400 Bad Request
응답과 함께 거부하며,
Python 및 PHP 등 언어의 내장 라이브러리 함수들은 파일명에 NULL문자가 있는지 검사함 -
Path Traversal
.
이나..
와 같은 특수문자를 웹 응용에서 경로를 탐지하지 못한다면 공격자는
상위 경로에 파일을 생성할 수 있게됨추가적으로 윈도우에서는
foo\bar\..\baz
와 같은 구문에서bar
가 실제 존재하지 않아도
foo/baz
로 해석해서 운영체제 간 응용을 포팅하는 도중 취약점 발생 가능 -
잘못된 확장자 검사
-
정규식(
$
은 줄의 끝을 의미)(\..*)
-
.
문자 뒤에 있는 모든 부분문자열 매칭
.jpg.php
확장자를 입력하면.php
를 분리하지 못해 여과에 실패 -
(\/[^.]*)
.
문자 뒤에 있는 모든 부분문자열 매칭하지만 또다른.
문자가 나오면 그 부분부터는 제외.jpg.php
확장자를 입력하면.jpg
만 인식하여 여과 실패
-
(\.[^.]*)$
- 가장 마지막에 등장하는
.
문자 뒤에 있는 모든 부분을 매칭 - 만일 서버가 두 개 이상의 확장자를 인식하면 여과에 실패
- 가장 마지막에 등장하는
[^.](\.[^.]*)$
- 가장 마지막에 등장하는
.
문자 뒤에 있는 부분을 매칭하나, 시작부분의.
무시 - 서버가 확장자만 있는 파일명 자체를 확장자로 인식하면 여과 실패
- 가장 마지막에 등장하는
-
-
파일명 문자열 치환 우회
대부분의 웹 서버는 확장자명으로 파일 종류를 판별하는데, 파일명 여과가 특정 부분문자열만
치환하거나 제거하는 방식으로 이루어지면, 공격자는 또다른 치환되는 문자열을 넣는 방식으로 우회할 수 있음-
.php
를 제거 여과 예시원본 치환 과정 결과 file.jpg file.jpg(유지) file.jpg webshell.php webshell .phpwebshell webshell.ph.phpp webshell.ph .phppwebshell.php
-
응용
파일 삭제 공격
대다수의 웹 응용에서는 config.php
와 같은 스크립트 파일로 설정 정보 관리
만일 공격자가 config
파일을 업로드 취약점을 통해 삭제하게 된다면 셋업 페이지를 통해
각종 설정을 변경하거나 웹 응용에 따라서 관리자 권한을 획들할 수 있음
Reverse Engineering
리버스 엔지니어링 - 이미 만들어진 시스템이나 장치에 대한 해체나 분석을 거쳐
그 대상 물체의 구조와 기능, 디자인 등을 알아내는 일련의 과정
정리
- 완성품의 설계도 없이 구조와 동작 과정을 알아내는 모든 단계
- 짧게 줄여 리버싱으로 통용됨
‘Software’ Reverse Engineering
소스 코드가 없는 상태에서 컴파일된 대상 소프트웨어의 구조를 여러가지 방법으로 분석하고,
메모리 덤프를 비롯한 바이너리 분석 결과를 토대로 동작 원리와 내부 구조를 파악
리버싱이 필요한 경우
-
Good Cases
- 판매된 지 너무 오래되어 제작사가 이미 개발을 중단한 프로그램에 대한 지원이 필요한 경우 ex) 디아블로 I
- 각종 프로그램의 보안성을 평가하거나 악성코드를 분석하는 경우
-
Bad Cases
- 키젠프로그램, 시리얼 넘버 생성기, 정품 크랙 등의 불법 프로그램
- 게임 핵
Disclaimer
리버싱은 각종 악성코드나 불법 프로그램의 분석 및 대응 수단으로도 효과적인 기술이지만,
소스 코드를 비롯한 전체적인 작동 원리를 알아낼 수 있다는 점에서, 각종 상용 프로그램의 지적 재산권을 침해 할 수 있는 양날의 검
따라서, 재배포, 무단 이용 등 저작권을 침해하는 리버싱은 법적인 문제로 이어질 수 있음
저작권법 제35조의3 (저작물의 공정한 이용) 제1항
제23조부터 제35조의2까지, 제101조의3부터 제101조의5까지의 경우 외에 저작물의 통상적인 이용 방법과 충돌하지 아니하고 저작자의 정당한 이익을 부당하게 해치지 아니하는 경우에는 보도ㆍ비평ㆍ교육ㆍ연구 등을 위하여 저작물을 이용할 수 있다.
저작권법 제101조의3 (프로그램의 저작재산권의 제한) 제1항 제6호
프로그램의 기초를 이루는 아이디어 및 원리를 확인하기 위하여 프로그램의 기능을 조사ㆍ연구ㆍ시험할 목적으로 복제하는 경우(정당한 권한에 의하여 프로그램을 이용하는 자가 해당 프로그램을 이용 중인 때에 한한다)
리버싱의 두 가지 방법
-
정적 분석 방법 (Static Analysis)
- 프로그램을 실행시키지 않고 분석
- 실행 파일을 구성하는 모든 요소, 대상 실행 파일이 실제로 동작할
CPU 아키텍처에 해당하는 어셈블리 코드를 이해하는 것이 필요
-
동적 분석 방법 (Dynamic Analysis)
- 프로그램을 실행시켜 입출력과 내부 동작 단계를 살피며 분석
- 실행 단계별로 자세한 동작 과정을 살펴봄
- 환경에 맞는 디버거를 이용해 단계별로 분석하는 기술을 익혀야 함
코드가 컴파일 되는 과정
Source Code -> Binary Code
사람이 이해할 수 있는 소스 코드를 컴퓨터가 이해할 수 있는 형태인 프로그램(바이너리)로 바꾸러면
컴파일을 거쳐야 함
컴파일러를 통해 단독적으로 실행 가능한 바이너리가 되기 위해서 컴파일 과정을 거침
Source Code -> ??? -> Binary Code
컴파일러가 각종 주석이나 매크로 등을 모두 미리 처리하여 다음 단계에서 변환할 준비를 함
이를 ‘중간 언어’ 라고 하며 이를 컴파일러가 최적화하여 어셈블리 코드로 만들어 줌
어셈블리 코드는 컴퓨터가 이해할 수 있는 기계코드를 사람이 알아보기 쉽게 명령어 단위로 표현한 것
어셈블리 코드와 기계 코드는 1:1 대응이 가능하므로, Assemblme 과정을 거쳐 실행 가능한 바이너리 완성
Source Code <- ??? <- Binary Code
바이너리를 분석하면 분석가는 컴파일러가 수행하는 과정을 역으로 진행해야 함
주어진 바이너리를 어셈블리 코드로 변환하고, 변환된 어셈블리 코드를 분석하면
대상 바이너리가 어떤 식으로 동작하는지 알 수 있음 (Disassemble(디스어셈블)
Static Analysis은 디스어셈블을 거쳐 나온 어셈블리 코드를 분석하여
소프트웨어의 동작 구조를 알아내는 과정
-
참고자료
- dreamhack WebHacking online lecture
-
dreamhack Reverse Engineering lecture