주요 내용으로 건너뛰기

lmc - 리눅스 메모리 포렌식을 위한 자동화 스크립트

lmc(Linux Memory Capturer) - Script for automating Linux memory capture and analysis

KISA에서 2018년 3분기 사이버 침해사고 정보공유세미나가 있었고 제가 "리눅스 환경에서의 메모리 포렌식"이라는 주제로 발표를 했습니다.

사실 발표 내용은 리눅스 메모리 포렌식에 대한 개념부터 실습, 난제와 발전방향 등을 통들어서 했었고, 본 블로그 포스트는 그중 자동화 스크립트에 대한 소개 및 공유를 위해 남겨둡니다.


우선 메모리 포렌식은 이미 Volatility나 Rekal 같은 좋은 오픈소스 도구들에 의해 널리 사용되고 있습니다. 그러나 대부분은 Windows 환경에서의 실습을 위주로합니다. 그 이유는 리눅스 시스템의 Kernel 이 워낙 광범위하게 진화하고 있는데다가 다양한 Distribution이 도처에 산재되어 있기 때문에 해당 운영체제에 정확히 일치하는 프로파일(Profile)을 만들기 어렵기 때문입니다.


이와 관련해서 이미 Hal Pomeranz (hal@deer-run.com)라는 분이 2014년에 SANS DFIR Summit에서 Automating Linux Memory Capture 라는 제목으로 발표를 하신 적이 있고, 해당 코드는 아래의 Github에서 참고할 수 있습니다.

그러나 아쉽게도 이 스크립트는 현재 3년이상 업데이트되지 않고 있습니다. 또한, 설치시에 몇가지 환경설정이 초창기버전과 달라졌기 때문에 사용자가 직접 패키지를 찾아서 일일이 설치하고 경로를 맞춰주어야 합니다. 저 같은 경우 여러번 하다보니 나름대로 명령어의 적용 순서를 경험적으로 익히게 되었는데, 이걸 처음하는 경우 상당히 난감할 수 있고 또한 같은 환경을 여러번 다시 구축해야 할 때 여전히 피로감을 느끼게 되는 것이 싫었습니다.

그래서 제가 halpomeranz의 Github repo에서 fork 기능을 이용하여 스크립트를 일부 수정 보완하였습니다. 아무리 그래도 이름하나는 지어줘야겠다는 생각에서, 원래의 lmg(Linux Memory Grabber)에서 lmc(Linux Memory Capturer)로 한글자 바꿔보았습니다. ㅎㅎ

아래의 Github에서 영문버전 README.md 파일을 확인하실 수 있습니다.


여기에서는 한국어로 약간의 부연설명을 드리겠습니다.


시작하기

여기에서는 lmc 스크립트를 사용하는 방법을 간단히 소개합니다. 해당 스크립트는 LiME 으로 메모리 덤프를 추출하고, dwarfdump 방식으로 해당 시스템의 운영체제 프로파일을 생성합니다. 그리고 Volatility 를 이용하여 해당 이미지를 분석할 수 있게 돕습니다. 이 모든 과정을 자동화(Automating)한 스크립트이며, 본 스크립트의 원저자는 Hal Pomeranz입니다. 저는 그의 코드를 수정보완하였습니다.

이 테스트는 Ubuntu 12.04, 14.04, 16.04, 17.10, 18.04 에서 테스트하였으며 Kali Linux 2018.3 버전에서도 정상 작동되는 것을 확인하였습니다. 아마 Debian 계열에서는 문제없이 잘 작동할 것으로 예상됩니다. 혹여 다른 리눅스 Distro나 기타 환경에서 작동이 되지 않는 경우를 발견하시면 cpuu@icloud.com 으로 제보부탁드립니다. 참고적으로 제가 수행해본 환경은 Amazon AWS EC2를 이용하여 구축한 각종 클라우드 환경, 그리고 Oracle Virtual Box 를 이용한 환경 및 실제 리눅스 장비에서 테스트해보았으며, 최대 32GB RAM을 탑재한 메인프레임 서버에서도 정상 작동함을 확인했습니다.


사전설치

본격적인 설치를 하기 전에 기본적으로 깔아야 할 Dependency 패키지들을 아래 명령어로 인스톨합니다.


lmc 설치

cpuu의 github에서 lmc 스크립트를 다운로드하고, setup.sh 를 통해 한번에 설치를 완료할 수 있습니다.

이 스크립트는 대략적으로 아래와 같은 순서로 작동합니다.

  • 리눅스 메모리 덤프를 위한 LiME 프로젝트를 다운로드하고, 저장 경로를 지정한 뒤 일부 코드를 패치한다.
  • 리눅스 운영체제 프로파일 설정을 위한 dwarfdump 를 설치한다.
  • 메모리 덤프 분석을 위한 volatility 를 다운로드하고 설치한다. 이때 필요한 참조 패키지들도 전부 설치한다.

설치가 완료되면 이제 메모리 캡처 및 분석을 수행할 수 있습니다.


리눅스 메모리 캡처하기

이제 루트사용자 권한을 부여하여 sudo ./lmc 명령어를 입력하면, lmc 스크립트가 자동으로 LiME 모듈을 빌드하고 Volatility 에서 원활히 분석할 수 있도록 프로파일 등을 만드는 작업을 수행합니다. 

수행시 다음 두개의 질문을 물어봅니다.

  • Try to build LiME kernel module? [N|y]
  • Compile profile for this system? [N|y]

처음 질문은 LiME의 커널 모듈을 빌드하겠냐는 것이고, 두번째는 해당 시스템의 Profile 을 만들것이냐는 물음입니다. 사실 맨 처음 수행하는 경우에는 별 고민업이 둘다 Yes를 선택하시면 되겠습니다. (두번째 이상부터는 같은 프로파일을 두번 만들 필요는 없으니..)

실행화면은 대략 아래와 같습니다.

cpuu@ubuntu:~/lmc$ sudo ./lmc

Try to build LiME kernel module? [N|y] y

make -C /lib/modules/4.15.0-34-generic/build M="/home/osboxes/lmc/lime/src" modules
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-34-generic'
Makefile:976: "Cannot use CONFIG_STACK_VALIDATION=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel"
CC [M] /home/osboxes/lmc/lime/src/tcp.o
CC [M] /home/osboxes/lmc/lime/src/disk.o
CC [M] /home/osboxes/lmc/lime/src/main.o
CC [M] /home/osboxes/lmc/lime/src/hash.o
LD [M] /home/osboxes/lmc/lime/src/lime.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/osboxes/lmc/lime/src/lime.mod.o
LD [M] /home/osboxes/lmc/lime/src/lime.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-34-generic'
strip --strip-unneeded lime.ko
mv lime.ko lime-4.15.0-34-generic-x86_64.ko
LiME module is /home/osboxes/lmc/lime/src/lime-4.15.0-34-generic-x86_64.ko
Dumping memory in "lime" format to /home/osboxes/lmc/capture/osboxes-2018-09-18_22.03.28
This could take a while...Done!
Cleaning up...Done!
Grabbing a copy of /bin/bash...Done!
Writing volatilityrc to /home/osboxes/lmc/capture/osboxes-2018-09-18_22.03.28...Done!

Compile profile for this system? [N|y] y

make -C //lib/modules/4.15.0-34-generic/build M="/home/osboxes/lmc/volatility/tools/linux" clean
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-34-generic'
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-34-generic'
rm -f module.dwarf
make -C //lib/modules/4.15.0-34-generic/build CONFIG_DEBUG_INFO=y M="/home/osboxes/lmc/volatility/tools/linux" modules
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-34-generic'
Makefile:976: "Cannot use CONFIG_STACK_VALIDATION=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel"
CC [M] /home/osboxes/lmc/volatility/tools/linux/module.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: modpost: missing MODULE_LICENSE() in /home/osboxes/lmc/volatility/tools/linux/module.o
see include/linux/module.h for more information
CC /home/osboxes/lmc/volatility/tools/linux/module.mod.o
LD [M] /home/osboxes/lmc/volatility/tools/linux/module.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-34-generic'
dwarfdump -di module.ko > module.dwarf
make -C //lib/modules/4.15.0-34-generic/build M="/home/osboxes/lmc/volatility/tools/linux" clean
make[1]: Entering directory '/usr/src/linux-headers-4.15.0-34-generic'
CLEAN /home/osboxes/lmc/volatility/tools/linux/.tmp_versions
CLEAN /home/osboxes/lmc/volatility/tools/linux/Module.symvers
make[1]: Leaving directory '/usr/src/linux-headers-4.15.0-34-generic'
adding: module.dwarf (deflated 89%)
adding: boot/System.map-4.15.0-34-generic (deflated 79%)


모든 작업은 자동으로 처리되며, 완료된 후에는 ../capture/<hostname>-YYYY-MM-DD_hh.mm.ss/ 라는 디렉토리가 생성되어 있습니다. 해당 디렉토리에는 아래와 같은 파일들이 포함되어 있습니다.

Filename
Description
hostname-YYYY-MM-DD_hh.mm.ss-memory.limethe RAM capture
hostname-YYYY-MM-DD_hh.mm.ss-profile.zipVolatility(TM) profile
hostname-YYYY-MM-DD_hh.mm.ss-bashcopy of target's /bin/bash
volatilityrcprototype Volatility config file


메모리 덤프 분석하기

메모리 덤핑이 완료되었으면, capture 디렉토리에 volatilityrc 라는 파일이 생성된 것을 볼 수 있습니다. 

해당 파일은 volatility 에서 환경설정을 쉽게할 수 있도록 만든 파일입니다. 내용은 아래와 같은 형식입니다.

이를 이용해 volatility에서 플러그인을 적용할 때 --conf-file=../capture/osboxes-2018-09-18_22.03.28/volatilityrc 와 같은 형식으로 설정하면 됩니다.


linux_banner 플러그인

volatilityrc 파일의 환경설정을 이용하여 간단히 linux_banner 플러그인을 수행해보겠습니다.


linux_pslist 플러그인

pslist 플러그인은 현재 활성상태인 프로세스의 init_task 심볼부터 task_struct->tasks 로 이어지는 링크드 리스트 자료구조를 따라 내용을 표출해줍니다.

Ubuntu 18.04의 프로파일에 알맞게 pslist 가 해석되어 표출
Ubuntu 18.04의 프로파일에 알맞게 pslist 가 해석되어 표출

[.. 이하 내용 생략..]


기타 다른 플러그인

리눅스에서 사용할 수 있는 volatility 의 다른 플러그인들은 아래의 공식 홈페이지 및 개발진의 도서에서 참고할 수 있습니다.


USB 에다가 설치하신 다음 분석 대상 리눅스 서버에 꼽고 바로 스크립트 구동하시면 별다른 번거로운 작업 없이 덤프 및 프로파일을 깔끔하게 추출하실 수 있을 것입니다. 

그럼, Happy Forensics!

정보보안에 관심이 많은 대학원생, 소프트웨어 엔지니어/서버관리자

CPUU 님의 창작활동을 응원하고 싶으세요?

댓글

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.