본문 바로가기

Information Security/Digital Forensic

[Digital Forensic] Memory Analysis with Volatility3

반응형

* Memory Forensic : 대표적인 휘발성 정보로, Live Forensic을 수행 할 시 수집해야 할 주요 증거물로 사용
- 최근 악성코드 동향 중, 파일 형태가 아닌 메모리에만 적재되어 코드가 수행되는 등의 In Memory 악성코드도 존재
해당 게시물은 volatility 3를 기준으로 Memory Dump를 분석하는 준비 과정에 대한 설명을 상세히 함

 

 

* Memory Forensic의 난해한 부분

  • 침해 사고가 발생되어 조사를 수행하는 경우, 침해 시점부터 상당 시간이 경과되거나 재부팅 등의 사유로 Memory의 악성 정보가 남아 있지 않는 경우가 상당함
  • Memory Dump를 수행하는 과정은 침해 당한 호스트에 접속하여 수행하게 되는데 이 과정에서 상당히 시간이 소요
    (Windows는 굉장히 쉬운편이나, Linux 계열의 운영체제는 과정이 굉장히 복잡한 편)

 

 

 

* volatility

- 오픈 소스 메모리 포렌식 도구

- Memory Dump 파일과 이에 매칭되는 Profile 또는 ISF 정보를 토대로 분석 가능 (단, 32GB의 메모리가 분석 한계)

- volatility 2 (with python2 and profile)volatility 3 (with python3 and ISF)로 버전이 분류

분류 내용
volatility 2 * python2 버전과 함께 사용되는 구버전


* Profile
- Memory 이미지에서 프로세스 프로필(프로세스 정보를 포함한 데이터 구조)을 가져오는데 사용
- 프로세스 이름, PID, UID, GID, 메모리 사용량 등의 정보가 총괄 된 파일


* Memory Dump 분석 시, Profile을 직접 지정해야하는 불편함 존재
volatility 3 * python3 버전과 함께 사용되는 최신 버전(비교적 최신)


* ISF (Image Symbol File)
- Memory 이미지에서 Segment(메모리 이미지의 데이터 구조) 정보를 가져오는데 사용
- Sgement 시작/끝 주소, 크기, 보호 모드, 커널 모듈, 드라이버, 커널 구성 요소 위치 등의 정보가 총괄 된 파일


* Memory Dump 분석 시, ISF를 자동으로 인식(특정 경로에 위치만 하면 인식)하는 편리함 존재

* Profile과 ISF
- 핵심은 운영 체제 버전별로 필요한 파일이 모두 다르며, 커널 정보에 따라서도 생성하는 과정이 상이
다행스럽게도, 윈도우의 경우 volatility 3에서 ISF (Symbol) 정보를 자동으로 검색하여 메모리 덤프만 필요
(그리고 운영체제, 커널 정보의 분기가 굉장히 많은 Linux 계열은 이를 다 충당할 수 없기 때문에 직접 생성이 필요)
진짜 욕나오는 여정이었다... 왜 리눅스 계열의 ISF 생성이 힘든지는 아래를 참조하면 쉽게 이해가 가능

 

 

 

* Memory 분석 준비 과정 (volatility setting 및 Memory Dump)

1) Volatilty Setting
- ISF를 생성해야 하기 때문에, Memory Dump를 수행하는 피해 대상 호스트에서 직접 아래 과정 수행이 필요
- 실제 침해 사고 시는 몇몇 필요 파일이 설치되어 있을테지만, 아래는 빈 깡통 AWS Ubuntu22.04를 기준으로 설명

# Ubuntu 깡통 인스턴스 기준으로 volatility3 설치 과정 진행

apt update
git clone https://github.com/volatilityfoundation/volatility3.git

cd volatiltiy 3
apt install python3-pip # volatility3는 python3로 구동

apt install libsnappy-dev
pip3 install -r requirements.txt # volatility에 필요한 모듈 설치

python3 setup.py build
python3 setup.py install
python3 vol.py -h # 정상 설치 확인

2) ISF (Symbol) 파일 생성을 위한 dwarf 설치

# dwarf2json 설치

git clone https://github.com/volatilityfoundation/dwarf2json.git

apt install golang-go

cd dwarf2json
go mod download github.com/spf13/pflag
go build

./dwarf2json --help # 정상 설치 확인

3) 디버깅 심볼 설치
- 리눅스 커널에서 디버깅 심볼 정보를 토대로 Volatility Plugin이 관련 내용을 해석
- 일정 버전 이후부터, 리눅스 커널의 디버깅 정보를 제거했기 때문에, 해당 디버깅 정보가 담긴 심볼 정보가 필요
- 즉, 컴파일에 사용된 gcc 버전까지 정확히 일치해야하므로 대충 만들어서 끼워 맞추면 되지 않을까?는 통하지 않음

# 리눅스 운영체제 패키지 정보 확인
uname -r
# 5.15.0-1031-aws


# 디버깅 심볼 설치
# 참조 사이트 : https://wiki.ubuntu.com/Debug Symbol Packages
# (단, 아래 4줄의 코드는 통째로 실행되어야하며 debian, ubuntu 외의 타 유형의 리눅스는 명령어가 다를 수 있음)
echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
sudo tee -a /etc/apt/sources.list.d/ddebs.list


# 디버깅 심볼 Key 설치
apt install ubuntu-dbgsym-keyring # 해당 명령어는 Ubuntu만 사용하며, Debian 계열은 필요 없음
apt-key adv --keyserver keyserver.ubuntu.com -—recv-keys F2EDC64DC5AEE1F6B9C621F0C8CAB6595FDFF622


apt update # 심볼 설치가 완료되면, 업데이트 필요

4) 디버깅 정보가 포함된 커널 이미지 설치

# apt install linux-image-일치버전명(uname -r 정보)-dbg 또는 -dbgsym
# 여기서는 uname -r 정보를 이미 알고있으니 수동으로 입력하여 설치 진행
# dbg가 안된다면, dbgsym으로 설치 진행할 것


apt install linux-image-5.15.0-1035-aws-dbgsym
# 설치 후, ls -l /boot로 System.map-5.15.0-1035-aws 파일이 설치된 것을 확인할 수 있음

5) ISF 파일 생성 (json format)

ISF 생성에 필요한 파일 내용
Linux Kernel DWARF
(vmlinux)
* 커널 디버깅 정보가 포함된 ELF 포맷의 커널 이미지
- 시스템에 기본적으로 존재하는 vmlinuz는 커널 디버깅 정보가 삭제(strip)된 커널 이미지 파일 존재
(/boot 경로에 vmlinuz가 기본적으로 존재)
- 해당 정보는 디버깅 정보가 없기 때문에 ISF 파일을 생성하는데 사용될 수 없음
- dbgsym이 디버깅 정보가 포함된 커널 이미지(vmlinux)까지 다운로드를 수행


* vmlinux만 있어도 ISF 생성은 가능하나, 더 정확한 분석을 위해서 System.map이 필요
System.map * 디버깅(포렌식)에 사용할 수 있는 Symbol들의 메모리 위치 Map을 저장한 파일
- System.map 파일만으로 ISF를 생성하면 분석이 되지 않음 (일종의 부가 정보)
# ISF 생성
cd /dwarf2json


# 생성 명령어 예시
# ./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-다운된_Symbol파일 --system-map /boot/System.map-다운된_System.map파일 > 이름.json


./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.15.0.1035-aws --system-map /boot/System.map-5.15.0.1035-aws > Ubuntu22.04-5.15.0.1035-aws.json


mkdir /volatility3/volatility3/symbols/linux
# 생성 후 ls로 확인 및 mv로 linux symbol 식별 경로로 이동 (symbol 전용 경로가 존재하는 경로)로 이동
mv ./Ubuntu22.04-5.15.0.1035-aws.json /volatility3/volatility3/symbols/linux

6) Memory Dump
- Microsoft에서 만든 AVML(A portable volatile memory acquisition) Tool 사용
- 단, 기타 활성 정보들도 모두 수집하기 위해 UAC(Unix-like Artifacts Collector) Tool 사용

# uac download
git clone https://github.com/tclahr/uac

cd /uac
./uac -a artifacts/ -p full /tmp && /uac/tools/avml/bin/linux/x86_64/avml /volatility3/output.lime
# lime 형식의 output.lime 메모리 덤프와 추가 활성 증거를 모두 수집하는 Tool 사용


# lime 형식으로 메모리를 덤프하는 이유
# Volatility3 사용 시, raw format의 메모리 덤프 파일을 인식하지 못하는 Case가 존재

7) 정상 동작 확인

# vol.py가 있는 volatility3 경로로 이동하여 Test 가능
cd /volatility3


# python3 vol.py -f 메모리덤프파일명.lime linux.명령어
python3 vol.py -f output.lime linux.bash.Bash

정상적으로 volatility3 명령어를 수행 확인

 

 

 

* Volatility3 명령어
- Windows Vol3 명령어 : https://blog.onfvp.com/post/volatility-cheatsheet/

 

Volatility 3 CheatSheet

Comparing commands from Vol2 > Vol3

blog.onfvp.com

- Linux Vol3 명령어

명령어 (Plugin) 내용
linux.bash.Bash  Recovers bash command history from memory.
linux.check_afinfo.Check_afinfo Verifies the operation function pointers of network protocols.
linux.check_creds.Check_creds Checks if any processes are sharing credential structures
linux.check_idt.Check_idt Checks if the IDT has been altered
linux.check_modules.Check_modules Compares module list to sysfs info, if available
linux.check_syscall.Check_syscall Check system call table for hooks.
linux.elfs.Elfs Lists all memory mapped ELF files for all processes.
linux.keyboard_notifiers.Keyboard_notifiers Parses the keyboard notifier call chain
linux.kmsg.Kmsg Kernel log buffer reader
linux.lsmod.Lsmod Lists loaded kernel modules.
linux.lsof.Lsof Lists all memory maps for all processes.
linux.malfind.Malfind Lists process memory ranges that potentially contain injected code.
linux.proc.Maps Lists all memory maps for all processes.
linux.pslist.PsList Lists the processes present in a particular linux memory image.
linux.pstree.PsTree
Plugin for listing processes in a tree based on their parent process ID.
linux.tty_check.tty_check
Checks tty devices for hooks

 

 

 

 

반응형

'Information Security > Digital Forensic' 카테고리의 다른 글

Linux Filesystem  (0) 2023.06.28
Windows File System  (0) 2023.06.26
[Digital Forensic] Linux Forensic  (2) 2023.05.19
[Digital Forensic] Windows Forensic  (0) 2023.05.16
[Digital Forensic] Digital Forensic Concept summary  (0) 2023.05.15