<순서>

[Debian 계열의 리눅스]

◎ 업그레이드 순서

◎ 커널업데이트 없이 업그레이드

◎ 특정버전 커널업그레이드(자동)

◎ 특정버전 커널업그레이드(수동)

◎ 구커널이미지 삭제



<내용>

[Debian 계열의 리눅스]

OS종류 : Debian, Ubuntu, Kali 등

패키지 설치, 업데이트, 삭제 명령어 : dpkg(package manager for Debian), apt-get(Advanced Packaging Tool package handling utility)


업그레이드 순서

1. 패키지 정보 업데이트

 # apt-get update

실제 패키지를 설치하지 않고 신규버전 패키지의 정보를 다운받아 이용 가능한 패키지의 정보를 /etc/apt/sources.list 파일에 업데이트 패키지 목록을 갱신하며 update 는 항상 upgrade 전에 실행되어야 합니다.


2.1. 패키지 업그레이드

 # apt-get upgrade -y

update 로부터 패키지 목록과 보유한 목록을 비교하여 장비내에 존재하는 실제 패키지 업그레이드를 수행합니다.

가장최신버전으로 설치하기 위해 사용되며 설치된 패키지가 제거되거나 설치되어 있지 않은 패키지가 설치되는 작업은 하지 않습니다.

-y : 프롬프트에 자동으로 yes라는 메시지가 표시됩니다. 모든 프롬프트에 대한 응답을 "예"라고 가정하고 비대화식으로 실행합니다.


2.2. 패키지 업그레이드 및 추가 패키지 설치

 # apt-get dist-upgrade

의존성 검사를 수행하면서 새로운 버전으로 업그레이드를 수행합니다.

컴퓨터에 설치된 꾸러미는 아니지만 사용에 필요한 추가 꾸러미를 설치하는 작업도 수행하기 때문에 이미 설치된 꾸러미를 최신 판으로 바꿔주는 upgrade 와는 차이가 있습니다.


◎ 커널업데이트 없이 업그레이드

1. 커널업데이트 금지 설정

 # apt-mark hold linux-image-generic linux-headers-generic

커널업데이트를 금지합니다.


2. 패키지 정보 업데이트

 # apt-get update


3. 패키지 업그레이드

 # apt-get upgrade -y


종합

 # apt-mark hold linux-image-generic linux-headers-generic && apt-get update && sleep 1 && apt-get upgrade -y

위의 1~3 단계를 한번에 실행합니다.


특정버전 커널업그레이드(자동)

1. 커널 정보 확인

 # uname -r

또는

 # cat /proc/version 

현재 부팅되어있는 커널 정보를 확인합니다.


2. 패키지 정보 업데이트

 # apt-get update


3. 리눅스 커널 이미지 버전 검색

 # apt-cache search linux-image

패키지 관리자의 리스트에서 리눅스 커널 이미지 버전을 검색합니다


4. 리눅스 커널 이미지 설치

 # apt-get install linux-image-버전

검색한 여러 버전중 가장 최신 버전을 위 명령어를 통해 입력하면 해당 커널 버전에 관련된 커널 패키지가 같이 설치됩니다.


5. 재부팅

 # reboot


◎ 특정버전 커널업그레이드(수동)

1. 커널 정보 확인

 # uname -r

또는

 # cat /proc/version 

현재 부팅되어있는 커널 정보를 확인합니다.


2. 패키지 다운로드

 # wget http://kernel.ubuntu.com/~kernel-ppa/mainline/해당내용

먼저 http://kernel.ubuntu.com/~kernel-ppa/mainline 에 접속해서 확인 후 필요 버전을 다운로드 합니다.


3. 패키지 설치

 # dpkg -i linux-headers-버전*.deb linux-image-버전*.deb

또는

 # dpkg -i *.deb 


4. grub2 업데이트

 # update-grub2

커널 이미지 정보가 반영되도록 grub2를 업데이트합니다.


5. 재부팅

 # reboot 


구커널이미지 삭제

리눅스는 커널 업데이트가 빈번합니다. 그리고 매번 업그레이드할 때마다, 이전의 커널 이미지는 삭제되지 않고 남아 있습니다. 때문에 커널 이미지를 삭제해주는 작업이 필요합니다.


1. 커널 정보 확인

 # uname -r

또는

 # cat /proc/version 

현재 부팅되어있는 커널 정보를 확인합니다.


2. 커널 리스트 확인

 # dpkg --list | grep linux-image

현재 설치되어있는 커널 리스트를 확인합니다.


3.1. 커널 이미지 삭제

 # apt-get remove linux-image-버전-generic

불필요한 커널 이미지를 삭제합니다.


3.2. 커널 이미지 삭제(설정파일 포함)

 # apt-get --purge remove linux-image-버전-generic

불필요한 커널 이미지와 함께 설정파일까지 모두 삭제합니다.


종합

 # purge-old-kernels --keep 1

purge-old-kernels 를 이용해서 위의 1~3 단계를 한번에 실행합니다. keep 는 구버전의 커널을 몇개까지 남겨 놓을지 설정하는 옵션입니다. 기본 값은 2입니다.


4. grub2 업데이트

 # update-grub2

삭제된 커널 이미지 정보가 반영되도록 grub2를 업데이트합니다.


5. 재부팅

 # reboot 


볼라틸리티(Volatility)는 최초 2006년 컴퓨터 공학자이자 기업가인 아론 월터스(Aaron Walters)에 의해 메모리 포렌식(memory forensics)관련 FATKit 프로젝트에서 출발하여 볼라툴즈 프로젝트(Volatools Project)로 발전했습니다.

그 이후 2007년 아론 월터스에 의해 볼라틸리티 프레임워크(Volatility Framework)개발팀인 볼라틸 시스템즈(http://volatilesystems.blogspot.kr/)가 만들어지고 현재는 아론 월터스가 회장으로 있는 볼러틸리티 재단(Volatility Foundation)의 사고조사 및 멀웨어 분석을 위한 오픈소스(OpenSource) 소프트웨어로 자리잡았습니다.

플러그인(Plugin)을 자신이 직접 만들어 사용이 가능한 이유로 메모리 분석과 관련된 다양한 기능을 가진 공개용 Plugin 파일이 개발되고 있습니다.

또한 침투 테스트(Pentest)를 목적으로 개발된 데비안 기반 운영체제인 칼리 리눅스(Kali Linux, http://www.kali.org/downloads)에도 포함되어 있습니다.

Volatility 는 파이썬(Python) 프로그래밍 언어로 작성되었고 Microsoft Windows, MacOSX 및 Linux 를 지원합니다.(버전 2.6기준)


[지원 포맷 형식]

Volatility 는 다양한 파일 포맷 형식을 지원하고 이러한 포맷 형식 간에 전환이 가능합니다.

  - Raw linear sample (dd)

  - Hibernation file (from Windows 7 and earlier)

  - Crash dump file

  - VirtualBox ELF64 core dump

  - VMware saved state and snapshot files

  - EWF format (E01) 

  - LiME format

  - Mach-O file format

  - QEMU virtual machine dumps

  - Firewire 

  - HPAK (FDPro)


[요구사항]

Python 2.6 또는 이후 버전(3.0 불가).

Web:

http://www.python.org


[관련 홈페이지]

For information or requests, contact:

Volatility Foundation


Web:

http://www.volatilityfoundation.org

http://volatility-labs.blogspot.com

http://volatility.tumblr.com

https://github.com/volatilityfoundation/volatility

VMware 주요 확장자에 대한 설명

.log – 가상 머신(Virtual Machine)에 대한 일반적인 활동 기록 파일

.vmdk – 게스트 운영체제(Guest OS)에 대한 실질적인 가상 하드 드라이브(Virtual Hard Drive)

.vmem – 게스트 운영체제에 대한 실질적인 가상 페이징 파일(Virtual Paging File)

.vmsn – VMware에서 생성하는 스냅샷(Snapshot) 파일로, 게스트 운영체제에 대한 상태 저장

.vmsd – VMware에서 생성한 스냅샷 파일에 대한 메타데이터(Metadata) 기록 파일

.nvram – 게스트 운영체제에 대한 바이오스(BIOS) 정보 기록 파일

.vmx – 게스트 운영체제에 대한 설정 기록 파일

.vmss – 게스트 운영체제를 일시 중지(Suspend) 상태로 변경할 경우, 당시의 게스트 운영체제 상태를 저장한 파일

 

VMware 가 가지고 있는 위와 같은 주요 확장자 파일들 중 메모리 덤프 파일은 .vmem 확장자를 가진 파일입니다. VMware 이미지에서 .vmem 확장자 파일을 추출하기 위해서는 현재 메모리 상태를 저장해야 됩니다. 실행 중인 이미지를 일시 중지(Suspend) 시키면 .vmem 파일이 생성되는데 해당 폴더에서 .vmem 파일을 복사하면 됩니다.

VMware 이미지는 메모리덤프를 위해 별도의 유틸리티가 필요 없네요.

ELF statifier 는 동적 링크된 실행 파일과 공유 라이브러리를 하나의 파일로 합치기 위한 툴로 동적 실행 파일에서 정적 실행 파일을 생성합니다. 침해사고 시스템을 분석할 때는 라이브러리에 의존하지 않기 위해 정적 실행 파일을 사용해야 하지만 정적 컴파일 된 파일은 사이즈가 크다는 단점이 존재합니다.

 

동적으로 링크 된 공유 라이브러리는 정적으로 링크 된 공유 라이브러리보다 디스크 공간을 효율적으로 사용하며, 보다 효율적인 방식으로 보안 업데이트를 수행 할 수 있습니다. 그리고 동적 라이브러리의 특정 버전으로 컴파일 된 실행 파일은 해당 버전의 공유 라이브러리가 실행중인 시스템에서만 사용이 가능합니다.

 

Fedora 9 와 openSUSE 11 를 각각 실행해 보면 일부 공유 라이브러리의 버전이 다른 것을 볼 수 있으며 이러한 버전 차이로 인해 컴퓨터간에 실행 파일을 복사하더라도 파일을 실행할 수 없습니다. 하지만 ELF Statifier 를 이용하면 동적 라이브러리를 찾는 실행 파일 대신에 공유 라이브러리를 포함한 정적으로 링크 된 실행 파일을 만들 수 있으며 Fedora 컴퓨터에서 컴파일 한 실행 파일을 다시 컴파일하지 않고도 openSUSE 시스템에서 실행할 수 있습니다. 물론 실행 파일을 복사하는 시스템과 실행 파일을 복사하려는 시스템은 동일한 아키텍처를 가져야합니다.

 

물론 이렇게하려면 정적 실행 파일에 필요한 공유 라이브러리 복사본이 포함되어 있기 때문에 일부 디스크 공간을 희생해야하지만 요즘에는 디스크 공간이 크기 때문에 중요하지 않습니다. 실행 파일이 libfoo 라는 공유 라이브러리에 동적으로 링크되어 있고 libfoo 에 대한 보안 업데이트가 있는 경우 어떻게 될지 고려해 보십시오. 응용 프로그램이 동적으로 링크되어 있다면 libfoo 의 공유 사본을 업데이트 할 수 있으며 응용 프로그램은 더 이상 이전 libfoo 의 보안 문제로 취약하지 않습니다. 반면에 정적으로 링크 된 실행 파일의 경우 이전 libfoo 라는 공유 라이브러리 복사본이 포함되어 있기 때문에 최신 libfoo 및 보안 업데이트를 적용하려면 정적으로 링크 된 실행 파일을 다시 만들어야 합니다.

 

[Statifier 설치]

ELF Statifier 는 openSUSE 10.3 에서는 1-Click 으로 설치되지만 Ubuntu 나 Fedora 에서는 1-Click 으로 설치되지 않습니다. 여기서는 ELF Statifier 1.6.14 버전을 사용했으며 ELF Statifier 는 자동 도구를 사용하지 않으므로 간단하게 호출하여 컴파일 할 수 있습니다. make 컴파일과 설치는 아래와 같습니다.

 

 # tar xzvf statifier-1.6.14.tar.gz 
 # cd ./statifier-* 
 # make 
 # make install

 

[ASLR 해제]

정적 실행 파일을 만들기 전 메모리상의 공격을 방어하기 위해 주소 공간배치를 난수화 시키는 기법(ASLR : Address Space Layout Randomization) 은 비활성화해야 합니다. 주소 공간배치를 난수화하면 실행 파일을 실행할 때마다 libc 함수의 위치가 항상 바뀌기 때문에 return-to-libc 공격과 같은 BOF 공격으로부터 메모리를 보호하게 됩니다. 하지만 정상적인 정적 실행 파일 또한 실행이 불가합니다.

([Linux] 메모리 보호 기법[Linux] 메모리 보호 기법 중 ASLR와 NX 설정값 확인 및 변경글을 참고해주세요.)

 

아래와 같이 randomize_va_space 매개 변수를 변경하여 보안을 해제합니다. randomize_va_space 변경은 실행 파일 자체에 대한 공격뿐만 아니라 버퍼 오버 플로우에 의존하여 시스템을 손상시키는 공격 시도에도 영향을 미칩니다. 주소 공간배치 난수화가 없으면 두 공격에 더 취약 해집니다.

아래와 같이 randomize_va_space를 0으로 설정하고 정적 실행 파일을 만들면 됩니다.

 # cd /proc/sys/kernel
 # cat randomize_va_space 
 2 
 # echo 0 > randomize_va_space 
 # cat randomize_va_space 
 0

 

[정적 실행 파일 생성]

다음으로 statifier 유틸리티를 사용하는 방법의 예로서, ls 명령에 대한 정적 실행 파일을 생성해보겠습니다.

먼저 동적으로 링크 된 실행 파일의 복사본을 만들고 동적으로 링크 된 파일을 검사합니다.

statifier 는 동적으로 링크 된 실행 파일의 경로를 첫 번째 인수로 사용하고 정적으로 링크 된 실행 파일을 두 번째 인수로 만들려는 경로로 실행합니다.

ldd 명령은 ls-static 이 동적으로 링크 된 라이브러리를 필요로하지 않다고 보여주고 있습니다.

다음 명령은 정적 실행 파일 ls 에서 바이너리 크기가 크게 증가한 것을 보여줍니다.

 

 # mkdir test
 # cd ./test 
 # cp -a /bin/ls ls-dynamic 
 # ls -lh 
 -rwxr-xr-x 1 root root 112K 2008-08-01 04:05 ls-dynamic 
 # ldd ls-dynamic 
 linux -gate.so.1 => (0x00110000) 
 librt.so.1 => /lib/librt.so.1 (0x00a3a000) 
 libselinux.so.1 => /lib/libselinux.so.1 (0x00a06000) 
 libacl.so .1 => /lib/libacl.so.1 (0x00d8a000) 
 libc.so.6 => /lib/libc.so.6 (0x0084e000) 
 libpthread.so.0 => /lib/libpthread.so.0 (0x009eb000 ) 
 /lib/ld-linux.so.2 (0x0082e000) 
 libdl.so.2 => /lib/libdl.so.2 (0x009e4000) 
 libattr.so.1 => /lib/libattr.so.1 (0x0606d000)
 # statifier ls-dynamic ls-static 
 # ldd ls-static 
 not a dynamic executable
 # ls -lh ls-static 
 -rwxr-x --- 1 root root 2.0M 2008-10-03 12:05 ls-static
 # ls-static / tmp 
 ... 

 

[문제해결1]

 # ls-static -lh 
 Segmentation fault

statified 실행 파일을 실행할 때 세그먼테이션 오류가 발생하면 스택 무작위화를 비활성화하고 statified 실행 파일을 다시 작성해야 합니다. 또한 정적 컴파일된 파일을 복사 후 실행하려면 ASLR 기능을 사용하지 않아야 합니다.

 

[문제해결2]

 조건  A-PC CentOS 실행 A-PC Ubuntu 실행 B-PC CentOS 실행 B-PC Ubuntu 실행
 A-PC CentOS에서
컴파일
 O   O   X  X
 B-PC CentOS에서
컴파일
 O  O  O  O

PC가 달라지면 실행이 안되는 경우도 발생 할 수 있으니 충분히 테스트해보시기 바랍니다.

 

[참고사이트]

원문 : https://www.linux.com/news/quickly-move-executable-between-systems-elf-statifier

ELF statifier 설명 : http://statifier.sourceforge.net/

ELF statifier 다운로드 : https://sourceforge.net/projects/statifier/

1. ASLR(Address Space Layout Randomization) 설정 값 확인 및 변경

ASLR(Address Space Layout Randomization) 설정 값을 확인합니다.

 # cat /proc/sys/kernel/randomize_va_space

 

randomize_va_space=0 //ASLR 해제

randomize_va_space=1 //랜덤 스택 & 라이브러리 활성화

randomize_va_space=2 //랜덤 스택 & 라이브러리 & 힙 활성화

 

ASLR(Address Space Layout Randomization) 설정 값을 변경합니다. 임시로 변경하는 방법이기 때문에 재부팅되면 설정 값이 기본 값(2)으로 변경됩니다.

 # echo 0 > /proc/sys/kernel/randomize_va_space
 # echo 1 > /proc/sys/kernel/randomize_va_space
 # echo 2 > /proc/sys/kernel/randomize_va_space

 

2. DEP / NX(Not Excutable) 설정 값 확인 및 변경

DEP / NX(Not Excutable) 설정 값을 확인합니다. 

 # cat /proc/sys/kernel/exec-shield

 

exec-shield=0 // ExecShield 보호 비활성화

exec-shield=1 // ExecShield 보호 활성화

 

DEP / NX(Not Excutable) 설정 값을 변경합니다. 임시로 변경하는 방법이기 때문에 재부팅되면 설정 값이 기본 값(1)으로 변경됩니다.

# echo 0 > /proc/sys/kernel/exec-shield
 # echo 1 > /proc/sys/kernel/exec-shield

 

3. sysctl 명령을 이용한 설정값 확인 및 변경

sysctl 명령은 커널 변수의 값을 제어하여 시스템을 최적화 할 수 있는 명령으로 시스템의 /proc/sys 디렉토리 밑에 있는 매개변수를 제어합니다. echo 명령을 사용하거나 sysctl 명령을 이용하여 /proc 디렉토리 밑에 있는 항목을 직접 편집하거나 설정할 수 있습니다.

 

sysctl 옵션
 -a : 현재 커널 매개변수와 값을 보여줍니다
 -p : sysctl 환경변수파일(기본값은 /etc/sysctl.conf)의 설정상태를 보여줍니다
 -n : 특정키에 대한 값을 보여줍니다.
 -w variable=value : 변수에 값을 설정합니다.
 -A : 테이블형재로 설정가능한 파라미터를 보여줍니다. -a 와 같습니다.

 

sysctl 명령을 이용하여 ASLR(Address Space Layout Randomization) 설정 값과 DEP / NX(Not Excutable) 설정 값을 확인합니다.

# sysctl -a | grep -E "exec-|randomi"
 kernel.exec-shield=1
 kernel.randomize_va_space=2

 

sysctl 명령을 이용하여 ASLR(Address Space Layout Randomization) 설정 값을 변경합니다. 임시로 변경하는 방법이기 때문에 재부팅되면 설정 값이 기본 값(2)으로 변경됩니다.

# sysctl -w kernel.randomize_va_space=0
 # sysctl -w kernel.randomize_va_space=1
 # sysctl -w kernel.randomize_va_space=2

 

sysctl 명령을 이용하여 DEP / NX(Not Excutable) 설정 값을 변경합니다. 임시로 변경하는 방법이기 때문에 재부팅되면 설정 값이 기본 값(1)으로 변경됩니다.

# sysctl -w kernel.exec-shield=0
 # sysctl -w kernel.exec-shield=1

 

시스템을 시작할 때부터 ASLR(Address Space Layout Randomization) 설정과 DEP / NX(Not Excutable) 설정 해제를 자동으로 설정하는 방법

/etc/sysctl.conf 파일 안에 아래 내용을 추가한 후 재부팅을 합니다.

# vi /etc/sysctl.conf
 kernel.randomize_va_space=0
 kernel.exec-shield=0

 

다른 메모리 보호 기법은 [Linux] 메모리 보호 기법을 참고해주세요.

[리눅스 메모리 보호 기법]

1. ASLR(Address Space Layout Randomization)

2. DEP / NX(Not Excutable)

3. ASCII-Armor

4. Stack canary

 

예제)

 # cat /proc/self/maps

스택, 힙, 라이브러리 등의 주소가 랜덤하게 바뀌는지 확인이 가능합니다.

 

1. ASLR(Address Space Layout Randomization)

 

메모리상의 공격을 방어하기 위해 주소 공간배치를 난수화 시키는 기법입니다. 스택, 힙, 라이브러리 등의 데이터 영역 주소등을 난수화 시킨 주소로 프로세스의 주소 공간에 배치하는 것입니다. 리눅스 커널 2.6.12 이후로 적용 되었습니다.

(상세한 내용은 [Linux] 메모리 보호 기법 중 ASLR와 NX 설정값 확인 및 변경을 참고해주세요)

 

2. DEP / NX(Not Excutable)

 

메모리상의 보호를 위해 stack 과 heap 에서 코드가 실행되는 것을 막는 기법입니다. 공격자가 BOF 공격을 일으키면 DEP 가 적용된 상태에서는 실행권한이 없으므로 프로그램에 대한 예외처리 후 종료가 됩니다.

 

3. ASCII-Armor

 

Libc 영역을 보호하기 위한 기법으로 상위주소를 \x00 으로 시작하게 만들어 공격자가 라이브러리를 호출하는 BOF 공격을 하여도 NULL 바이트가 삽입된 주소로 접근 할 수 없게 됩니다.

 

4. Stack canary

 

RET
SFP
BUFFER

 

위 처럼 되있는 메모리 구조가

 

RET
SFP
CANARY
BUFFER

 

이렇게 SFP와 BUFFER 데이터 사이에 CANARY 가 추가되어 스택의 BOF를 모니터링하는 역할을 담당합니다. BOF 가 발생하면 CANARY 데이터값의 변조로 오버플로우에 대한 경고를 하고 프로그램을 종료시킵니다. 

 

CANARY 데이터는 다음과 같이 구성되어 있습니다.

 

 1) Terminator canaries
 문자열 끝문자를 이용하여 canary 를 구성하는 방법으로 canary 값으로 NULL, CR, LF, Oxff 값의 조합이 사용됩니다. 공격자는 공격시,  종료문자로 구성된 canary 값에 접근을 할 수 없게됩니다.


 2) Random canary
 프로그램을 실행할 때마다 임의의 canary 값을 삽입을 합니다. 이에 따라 공격자는 Canary 값을 예측불가능하므로 공격에 어려움이  발생합니다.


 3) Null canary(0x00000000)
 메모리상의 공격을 막기위해 canary 값을 NULL 로 구성합니다. 공격자는 공격코드상에 NULL 값을 삽입할 수 없으므로 canary 값에  접근이 불가능합니다.

 

[참고 사이트]

https://bpsecblog.wordpress.com/2016/05/16/memory_protect_linux_1/

http://dokydoky.tistory.com/449

http://blog.naver.com/revsic/220531540037

[Windows] 메모리 덤프 형식(Memory Dump Format)
[Windows] 메모리 덤프#01
[Windows] 메모리 덤프#02
[Windows] 메모리 덤프#03

 

[Memory Dump 란?]

Memory Dump 는 System의 물리 Memory 를 File 형태로 저장하는 방법으로, 해당 File 의 구조는 실제 물리 Memory 구조와 동일합니다. 침해사고 분석 시 침해 시스템에 실시간 분석을 수행하면 해당 명령어로 인해 Memory 의 상태 및 Data 가 변경됩니다. 

 

이는 Memory 로부터 얻을 수 있는 중요한 정보를 놓칠 수 있는 가능성이 존재하므로 분석에 불리하게 작용할 수 있습니다. 이 같은 실시간 분석의 단점으로 인해 침해사고 시점의 휘발성 Data 를 File 로 간직하여 Memory 에 변화를 주지 않으면서 분석을 하기위해 Memory Dump 를 수행합니다. 

 

[Linux 에서 Memory Dump]

Linux는 운영체제의 모든 Resource 를 File 형태로 다룹니다. Linux 에서 Memory 접근은 장치 File 을 통해 이루어집니다.

 

과거에는 /dev/mem과 /dev/kmem 통해 직접적으로 리눅스 시스템에서 Memory 를 확보 할 수 있었으나, 보안상의 이유로 최신 커널에서는 이 액세스가 제한되거나 제거되었습니다. 하지만 fmem 이나 LiME 과 같은 프로젝트에서 로드 가능한 커널 모듈이 개발되어 Memory Dump 가 가능하게 되었습니다 . 

 

Linux 는 Kernel 과 함께 동작하는 많은 기능을 Module 의 형태로 제공합니다. 현재 Load 된 Module 을 확인하려면 lsmod 명령을 이용하면 됩니다. Module 은 insmod 명령으로 운영체제가 동작 중인 상태에서 쉽게 Load 할 수 있고, rmmod 로 쉽게 제거할 수 있습니다.

 

Kernel 은 Version 에 따라 구조가 달라질 수 있습니다. Kernel 은 운영체제의 핵심이므로 Kernel 동작을 방해하지 않으려면 Kernel Module 은 이러한 구조와 운영체제 환경에 잘 맞아야 합니다. Kernel 을 직접 다룰 수 있기 때문에 잘못하면 Kernel 의 기능을 오동작시키거나 정지시킬 수도 있습니다. 그래서 보통 Linux Kernel Module 은 Load 시킬 운영체제 환경에서 직접 Compile 합니다.

 

[LiME]

LiME 은 Joe Sylve 가 만든 툴이며 리눅스뿐만 아니라 안드로이드와 같은 리눅스 기반 디바이스의 Memory 를 덤프 할 수 있습니다. 안드로이드의 Memory 를 처음으로 Full Dump 를 한 도구이며 TCP 를 통해서도 Memory 를 덤프할 수 있습니다. Memory 를 획득하는 과정에서 Kernel 과 User 간의 상호작용을 최소화하여 획득 도구에 의한 Memory 의 훼손을 최소화 시켰습니다. LiME 은 다음의 웹페이지 (https://github.com/504ensicsLabs/LiME) 에서 다운로드 할 수 있습니다.

 

LiME 은 바이너리없이 소스로 배포되므로 직접 Compile 해야합니다. 먼저 미리 Compile 된 LKM 이 있는지 확인하거나 가상 컴퓨터에서 컴파일 및 테스트를 먼저 수행하는 것이 좋습니다. LiME 이 미리 Compile 한 LKM 를 확인할 수 있는 평판이 좋은 사이트 중 하나는 Cert.org 의 Linux Forensics Tools Repository(https://forensics.cert.org/) 입니다. Red Hat Enterprise Linux, CentOS 및 Fedora 를 위한 사이버포렌식 도구의 RPM 정보를 제공합니다.

 

:: 장점 ::

  • LKM 에 컴파일 된 LiME 은 크기가 작습니다.
  • 프로세스를 다시 시작할 필요가 없습니다.
  • LKM 에 신속하게 추가/제거 할 수 있습니다.
  • Memory Dump 를 로컬 디스크에 쓰지 않고 네트워크를 통해 전송할 수 있습니다.
  • Memory Dump 는 Volatility 와 호환됩니다.

 

:: 단점 ::

  • 실행파일이 아닌 컴파일방식으로 Memory Dump 를 수행하는 부분은 시스템이 변조되기 때문에 무결성이 손실될 수 있습니다.

 

[사용방법]

LiME 을 다운로드하고 컴파일을 합니다.

 [root@vmtest ~]# mkdir lime; cd lime
 [root@vmtest lime]# wget https://github.com/504ensicsLabs/LiME/archive/master.zip
 [root@vmtest lime]# upzip master.zip 
 [root@vmtest lime]# cd src 
 [root@vmtest src]# make
 ….
 make -C /lib/modules/2.6.32-431.5.1.el6.x86_64/build M=/root/lime/src modules
 …
 [root@vmtest src]# ls lime*.ko
 lime-2.6.32-431.5.1.el6.x86_64.ko

 

방법1. 로컬 시스템에 Memory 를 추출합니다.

추출된 결과파일을 저장할 경로와 이름, 파일형식을 지정해줍니다.

 [root@vmtest ~]# insmod lime-2.6.32-431.5.1.el6.x86_64.ko "path=/tmp/mem.img format=raw"

"File exists"에러가 발생하면 "rmmod lime"을 입력하여 모듈을 언로드 후 다시 실행하면 동작합니다.

 

:: 옵션 ::

path 를 이용하여 물리 메모리 이미지를 파일로 저장할 수 있으며 또한 원격지 서버로 전송할 수 있습니다. 

ex. 파일경로와 파일이름 혹은 tcp:<port>

format 은 메모리 이미지의 포맷을 결정하는 옵션입니다. 

ex. raw : RAW 포맷 이미지, lime : LiME 포맷 이미지

 

방법2-1. 원격 시스템에 Memory 를 추출합니다.

LiME의 가장 큰 장점은 로컬 디스크 또는 실제 파일에 대한 출력에만 국한되지 않는다는 것입니다. 로컬 시스템에 path=/tmp/mem.img 와 같이 출력 경로를 지정하는것 대신 path=tcp:4444 와 같이 TCP 서비스를 작성합니다.

 [root@vmtest ~]# insmod lime-2.6.32-431.5.1.el6.x86_64.ko "path=tcp:4444 format=lime"

 

그리고 netcat을 사용하여 원격 시스템에 연결하여 메모리 이미지를 조사용 랩톱으로 전송할 수 있습니다. 

 [User@laptop ~]# nc target.server.com 4444 > /tmp/mem.img

 

방법2-2. 원격 시스템에 Memory 를 추출합니다.

조사용 랩톱에서 netcat 을 이용해 포트 80 포트를 오픈합니다.

 [User@laptop ~]# nc –l 80 > /tmp/mem.img

 

원격 시스템에 LiME LKM을 실행하고 포트 4444에서 TCP 연결을 대기하도록 구성합니다.

 [root@vmtest ~]# insmod lime-2.6.32-431.5.1.el6.x86_64.ko "path=tcp:4444 format=lime"

 

원격 시스템의 다른 셸에서 netcat 을 이용하여 조사용 랩톱 (60.70.80.90은 랩톱 IP 주소)의 80 포트로  메모리 이미지를 전송합니다.

 [root@vmtest ~]# nc localhost 4444 | nc 60.70.80.90 80

 

Memory Dump 정보를 확인합니다.

[root@vmtest ~]# ls -lah /tmp/mem.img 
 -r--r--r--. 1 root root 1.0G Mar 9 08:11 /tmp/mem.img
 [root@vmtest ~]# strings /tmp/mem.img | head -n 3
 EMiL
 root (hd0,0)
 kernel /vmlinuz-2.6.32-431.5.1.el6.x86_64 ro root=/dev/mapper/vg_livecd-lv_root rd_NO_LUKS 

 

Memory Dump 가 완료되었으면 커널 모듈을 제거합니다.

[root@vmtest ~]# rmmod lime

 

Memory Dump 분석 전 복사본을 생성하여 분석작업을 진행하도록 합니다. 이때 빠지지않고 해야되는 중요한 것은 해시값을 계산하는 것입니다. md5sum 이나 shasum 을 사용해서 해시값을 계산하면 됩니다.

[root@vmtest ~]# md5sum mem.img
 db5fd6e1dabb055f8bc77fd67d95b588 mem.img


 [root@vmtest ~]# sha1sum mem.img
 0a67af1d5fdc59bf42f4ae93d97580135786fe3c mem.img


 [root@vmtest ~]# sha256sum mem.img
 63e5814134a140691b452ac6e353bab73458263709da4cebd2fd6484d33b8954 mem.img

 

이렇게 얻은 Memory Dump 파일은 Volatility 등의 분석툴을 사용하여 분석할 수 있습니다.

 

vmware-mount 를 이용하면 사용자 PC에 이미지를 마운트 할 수 있습니다.

용도로는 간단하게 내용을 보거나 파일을 복사하거나

이미지 OS 와 상관없이 부팅이 안될 때 디스크 검사를 통해 복구할 때 사용하면 되겠습니다.


 [사용자 PC OS 가 윈도우인 경우] 


이미지 내 드라이브 확인

vmware-mount.exe /p 이미지명

 C:\Program Files\VMware\VMware Workstation> vmware-mount.exe /p image.vmdk

 Volume 1 : 8378 MB, HPFS/NTFS

 Volume 2 : 8001 MB, HPFS/NTFS

이미지 내 볼륨이 몇개인지 확인합니다.


[이미지 마운트]

vmware-mount.exe 드라이브명 이미지명

 C:\Program Files\VMware\VMware Workstation> vmware-mount.exe z: image.vmdk

지정한 이미지를 z 드라이브로 마운트합니다.


이미지에 읽고/쓰기 권한

vmware-mount.exe /m:[w|n] 드라이브명 이미지명

 C:\Program Files\VMware\VMware Workstation> vmware-mount.exe /m:w z: image.vmdk

 또는

 C:\Program Files\VMware\VMware Workstation> vmware-mount.exe /m:n z: image.vmdk

/m:w 는 읽고/쓰기가 자유롭고 이미지를 언마운트 하더라도 이미지 내에 파일이 남게 됩니다.

/m:n 은 읽고/쓰기가 자유롭고 이미지를 언마운트 하게되면 이미지 내에 파일이 사라지게 됩니다.

※ 쓰기방지설정은 없습니다.


vmware-mount.exe /v:드라이브볼륨숫자 드라이브명 이미지명

 C:\Program Files\VMware\VMware Workstation> vmware-mount.exe /v:2 z: image.vmdk

Volume 2를 z 드라이브에 마운트합니다.


[마운트된 리스트 확인]

vmware-mount.exe /L

 C:\Program Files\VMware\VMware Workstation> vmware-mount.exe /L

 Currently mounted volumes:

 J:\ => C:\My Virtual Machines\Windows98\Windows98.vmdk

 K:\ => [storage1]WindowsXP2/WindowsXP2.vmdk


[이미지 언마운트]

vmware-mount.exe 드라이브명 /d /f

 C:\Program Files\VMware\VMware Workstation> vmware-mount.exe z: /d /f

시스템에서 가상 드라이브를 해제하고 드라이브 문자를 해제합니다.


사용 중 에러발생 시 관련 로그파일은 아래경로를 확인해보시기 바랍니다.

C:\Documents and Settings\<user>\Local Settings\Temp\vmware-<user>-<nnnn>/vmount.log

C:\Documents and Settings\<user>\Local Settings\Temp\vmware-<user>-<nnnn>/vmount-client.log


 [사용자 PC OS 가 리눅스인 경우] 


이미지 내 드라이브 확인

vmware-mount -p 이미지명

 # vmware-mount -p /vmware/CentOS/CentOS.vmdk

 Volume 1 : 102 MB, Linux

 Volume 2 : 19862 MB, Linux

 Volume 3 : 510 MB, Linux swap

이미지 내 볼륨이 몇개인지 확인합니다.


[이미지 마운트]

vmware-mount 이미지명 [partitionNumber] 마운트위치

또는

vmware-mount -f 이미지명 마운트위치

 # vmware-mount /path/to/disk [partitionNumber] /mount/point

 또는

 # vmware-mount -f /vmware/CentOS/CentOS.vmdk /mnt/CentOS 

지정한 이미지를 /mnt/CentOS 에 마운트합니다.

※ [partitionNumber]의 기본값은 1입니다.


[마운트된 리스트 확인]

vmware-mount -L

 # vmware-mount -L

 Disks with mounted partitions: 

 /vmware/guest/CentOS/CentOS.vmdk partition2 /mnt/CentOS 

 /vmware/guest/SUSE10/SUSE10.vmdk /mnt/suse10/


[이미지 언마운트]

vmware-mount -d 마운트포인트

vmware-mount -[x|X]

 # vmware-mount -d /mnt/CentOS

 또는

 # vmware-mount -x

 또는

# vmware-mount -X

※ -[x|X] 옵션은 모든 파티션에 대해 강제 언마운트를 진행합니다.


사용 중 에러발생 시 관련 로그파일은 아래경로를 확인해보시기 바랍니다.

/tmp/vmware-<user>/fuseMount.log


o 추가사항 o

혹시나 이미지를 잘 사용하다가 부팅이 안된다면 사용자 PC 에 마운트하여 디스크 검사를 진행해 보시기 바랍니다.

chkdsk 드라이브명

 C:\> chkdsk z:

디스크 검사가 완료되면 대부분 복구가 가능할겁니다.

VMware 이미지를 변환하기 전에는 병합이 필요합니다. VMware 이미지 병합은 링크를 참고해주세요.

 

◎ QEMU 을 통한 이미지 변환

QEMU 는?

- 가상화 소프트웨어 가운데 하나입니다.

- Fabrice Bellard 가 만들었으며 x86 이외의 기종을 위해 만들어진 소프트웨어 스택 전체를 가상머신 위에서 실행할 수 있다는 특징이 있습니다.

- 동적 변환기(Portable dynamic translation)를 사용합니다.

- PC 환경을 위한 프로세스 에뮬레이터로 프로세스뿐만 아니라 각종 주변기기까지를 에뮬레이터 합니다.

- 하나의 가상 컴퓨터를 구축해 주는 소프트웨어입니다. vmware, Xen, Virtualbox 와 같은 가상화 솔루션의 하나로 보시면 됩니다.

 

사용자 환경에 따라 리눅스나 윈도우용 QEMU를 설치하면 qemu-img 를 이용하여 이미지를 변환할 수 있습니다.

먼저, qemu-img 를 이용해서 이미지 정보를 확인하고, 생성하는 명령어부터 보겠습니다.

 

[이미지 정보 확인]

# qemu-img info 이미지명

 # qemu-img info image.raw

 

[이미지 생성]

# qemu-img create -f 이미지포맷명 이미지명 이미지크기

 # qemu-img create {-f raw} out.raw 4G

※ 기본포맷이 raw 이기 때문에 생략이 가능합니다.

 

o 이미지 포맷 o

raw : Raw 이미지

vdi : VirtualBox 이미지

vmdk : VMwarw 이미지

※ qemu-img 가 지원하는 이미지 포맷 종류는 더 있으나 여기서는 3가지만 알면 되겠습니다.

 

 # qemu-img create -f vmdk out.vmdk 4G
 또는
 # qemu-img create -f vmdk -o size=4G out.vmdk
 또는
 # qemu-img create -f vdi out.vdi 4G

 

이제 우리가 주로 사용하게 될 이미지를 변환하는 명령어를 보겠습니다.

 

[이미지 변환]

# qemu-img convert {-f 기본포맷} -O 변환포맷 기본이미지명 변환이미지명 {-q} {-p}

※ 기본포맷, -q , -p 옵션은 생략이 가능합니다.

 

o 이미지 포맷 o

raw : Raw 이미지

vdi : VirtualBox 이미지

vmdk : VMwarw 이미지

vhd(x) : HYPER-V 이미지

 # qemu-img convert {-f raw} -O vmdk in.raw out.vmdk
 또는
 # qemu-img convert {-f raw} -O vdi in.raw out.vdi
 또는
 # qemu-img convert {-f vmdk} in.vmdk {-O raw} out.img -p
또는
# qemu-img convert {-f vmdk} -O vhdx in.vmdk out.vhdx

※ VMDK 에서 VDI 는 직접 변환이 불가합니다.

 

-o : compat, backing_file, backing_fmt, encryption, cluster_size, preallocation, lazy_refcounts 등 관련 옵션이 굉장히 많은 듯 싶은데 정확한 설명을 찾아보기가 어렵네요. 특정 옵션의 경우 지원 가능한 포맷이 정해져 있습니다.

-O : 변환될 포맷을 지정합니다.

-p : 진행 상태 바를 표시합니다. (compare, convert, rebase 커맨드 한정) -p 옵션을 지원하지 않는 커맨드의 경우, 진행상황은 프로세스가 SIGUSR1 신호를 받았을 때 보고됩니다.

-q : 침묵 모드로 오류를 제외한 다른 메세지들을 출력하지 않습니다. -q와 -p를 동시에 사용하면 진행 상태 바가 표시되지 않습니다.

 

 Vmdk2Vhd 을 통한 이미지 변환

[이미지 변환]

Vmdk2Vhd는 링크에서 다운받으세요.

다운받은 압축파일을 해제하고 Vmdk2Vhd.exe를 엽니다. VMDK 파일을 선택하는 창이 열립니다.
소스 VMDK 및 대상 VHD를 선택하고 변환을 클릭합니다. 

 

◎ VBoxManage 을 통한 이미지 변환

VirtualBox 설치 시 제공되는 VBoxManage 를 이용해서 이미지를 변황해 보겠습니다.

Raw 이미지를 vmdk로 변환 합니다.

 C:\> VBoxManage convertfromraw in.raw out.vmdk --format VMDK 
 C:\> VBoxManage convertdd in.raw out.vmdk

 

VMDK 에서 VDI 로 직접 변환이 가능합니다.

 C:\> VBoxManage clonehd in.vmdk out.vdi {--format VDI}

※ 기본포맷이 VDI 이기 때문에 생략이 가능합니다.

 

 C:\> VBoxManage convertfromraw in.raw out.vdi --format VDI
 C:\> VBoxManage convertdd in.raw out.vdi

※ Raw 이미지에서 VDI 이미지로 변환도 가능합니다.

 

 C:\> VBoxManage clonehd in.vdi out.raw --format raw
 C:\> VBoxManage internalcommands converttoraw in.vdi out.raw

※ VDI 이미지에서 Raw 이미지로 변환도 가능합니다.

 

[VBoxManage 옵션설명]

VBoxManage clonehd <uuid>|<filename> <outputfile>

[--format VDI|VMDK|VHD|RAW|<other>]

[--variant Standard,Fixed,Split2G,Stream,ESX]

[--existing]

 

o qemu-img 참고사항 o

$ qemu-img --help
qemu-img version 2.0.0, Copyright (c) 2004-2008 Fabrice Bellard
usage: qemu-img command [command options]
QEMU disk image utility


Command syntax:
  check [-q] [-f fmt] [--output=ofmt]  [-r [leaks | all]] filename
  create [-q] [-f fmt] [-o options] filename [size]
  commit [-q] [-f fmt] [-t cache] filename
  compare [-f fmt] [-F fmt] [-p] [-q] [-s] filename1 filename2
  convert [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-O output_fmt] [-o options] [-s snapshot_id_or_name] [-l snapshot_param] [-S sparse_size] filename [filename2 [...]] output_filename
  info [-f fmt] [--output=ofmt] [--backing-chain] filename
  map [-f fmt] [--output=ofmt] filename
  snapshot [-q] [-l | -a snapshot | -c snapshot | -d snapshot] filename
  rebase [-q] [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
  resize [-q] filename [+ | -]size
  amend [-q] [-f fmt] -o options filename


Command parameters:
  'filename' is a disk image filename
  'fmt' is the disk image format. It is guessed automatically in most cases
  'cache' is the cache mode used to write the output disk image, the valid
    options are: 'none', 'writeback' (default, except for convert), 'writethrough',
    'directsync' and 'unsafe' (default for convert)
  'size' is the disk image size in bytes. Optional suffixes
    'k' or 'K' (kilobyte, 1024), 'M' (megabyte, 1024k), 'G' (gigabyte, 1024M),
    'T' (terabyte, 1024G), 'P' (petabyte, 1024T) and 'E' (exabyte, 1024P)  are
    supported. 'b' is ignored.
  'output_filename' is the destination disk image filename
  'output_fmt' is the destination format
  'options' is a comma separated list of format specific options in a
    name=value format. Use -o ? for an overview of the options supported by the
    used format
  'snapshot_param' is param used for internal snapshot, format
    is 'snapshot.id=[ID],snapshot.name=[NAME]', or
    '[ID_OR_NAME]'
  'snapshot_id_or_name' is deprecated, use 'snapshot_param'
    instead
  '-c' indicates that target image must be compressed (qcow format only)
  '-u' enables unsafe rebasing. It is assumed that old and new backing file
       match exactly. The image doesn't need a working backing file before
       rebasing in this case (useful for renaming the backing file)
  '-h' with or without a command shows this help and lists the supported formats
  '-p' show progress of command (only certain commands)
  '-q' use Quiet mode - do not print any output (except errors)
  '-S' indicates the consecutive number of bytes (defaults to 4k) that must
       contain only zeros for qemu-img to create a sparse image during
       conversion. If the number of bytes is 0, the source will not be scanned for
       unallocated or zero sectors, and the destination image will always be
       fully allocated
  '--output' takes the format in which the output must be done (human or json)
  '-n' skips the target volume creation (useful if the volume is created
       prior to running qemu-img)


Parameters to check subcommand:
  '-r' tries to repair any inconsistencies that are found during the check.
       '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all
       kinds of errors, with a higher risk of choosing the wrong fix or
       hiding corruption that has already occurred.


Parameters to snapshot subcommand:
  'snapshot' is the name of the snapshot to create, apply or delete
  '-a' applies a snapshot (revert disk to saved state)
  '-c' creates a snapshot
  '-d' deletes a snapshot
  '-l' lists all snapshots in the given image


Parameters to compare subcommand:
  '-f' first image format
  '-F' second image format
  '-s' run in Strict mode - fail on different image size or sector allocation
  
Supported formats: vvfat vpc vmdk vhdx vdi sheepdog sheepdog sheepdog raw host_device file qed qcow2 qcow parallels nbd nbd nbd dmg tftp ftps ftp https http cow cloop bochs blkverify blkdebug

 

VMware의 가상 하드 디스크 타입은 고정 크기 (Preallocated)나 가변 크기 (Growable; Dynamically Expanding) 로 설정할 수 있는데, 고정 크기의 경우 성능면에서는 가변 크기에 비해 우수하지만 사이즈가 크기 때문에 다른매체로 옮길 때는 상당히 불편합니다. 그래서 필요 시 타입을 변경할 수 있습니다.


가상 디스크의 타입을 변환하기 위해선 vmware-vdiskmanager 명령어에 -r 옵션을 사용하면 됩니다. 이 옵션을 사용하면 원본 가상 디스크 이미지 파일을 바탕으로 원하는 타입의 새로운 가상 디스크 이미지 파일이 만들어집니다.


[고정 크기에서 가변 크기로 변경]

C:\Program Files\VMware\VMware Workstation> vmware-vdiskmanager -r sourceDisk.vmdk -t 0 targetDisk.vmdk

위의 예에선 (고정 크기의) sourceDisk.vmdk 를 가변 크기 (-t 0) 의 targetDisk.vmdk 파일을 생성합니다.


[가변 크기에서 고정 크기로 변경]

C:\Program Files\VMware\VMware Workstation> vmware-vdiskmanager -r sourceDisk.vmdk -t 2 targetDisk.vmdk

위의 예에선 (가변 크기의) sourceDisk.vmdk 를 고정 크기 (-t 2) 의 targetDisk.vmdk 파일을 생성합니다.


o 옵션설명 o

-r <source-disk>     : convert the specified disk; need to specify destination disk-type


-t <disk-type>    : disk type id

Disk types:

        0                 : single growable virtual disk

        1                 : growable virtual disk split in 2Gb files

        2                 : preallocated virtual disk

        3                 : preallocated virtual disk split in 2Gb files




+ Recent posts