SECURITY/FORENSICS

linux μ—μ„œ μƒμ„±ν•œ λ©”λͺ¨λ¦¬ 덀프 νŒŒμΌμ„ volatility 둜 λΆ„μ„ν•˜κΈ° :: profile λ§Œλ“€κΈ°, KASLR

\b\t 2020. 12. 26. 18:00

이 글은

volatility 둜 linux 파일 뢄석 μ‹œλ„ - linux ν”„λ‘œνŒŒμΌ λ§Œλ“€κΈ° - κ·ΈλŸΌμ—λ„ μƒκΈ°λŠ” 문제[KASLR]

λ₯Ό μ†Œκ°œν•˜λ©° ν•΄κ²°ν•˜λŠ” μˆœμ„œλ‘œ 이루어진닀.

 

 

volatility 둜 λ©”λͺ¨λ¦¬ 덀프 νŒŒμΌμ„ λΆ„μ„ν•˜λ €λ©΄ ν•΄λ‹Ή λ©”λͺ¨λ¦¬ 덀프 파일의 μš΄μ˜μ²΄μ œμ— λŒ€ν•œ ν”„λ‘œνŒŒμΌμ΄ μžˆμ–΄μ•Ό ν•œλ‹€.

volatility μ—λŠ” 기본적으둜 windows 에 λŒ€ν•œ ν”„λ‘œνŒŒμΌμ΄ ν¬ν•¨λ˜μ–΄ 있고,

windows 에 μ‚¬μš©ν•  수 μžˆλŠ” ν”ŒλŸ¬κ·ΈμΈλ“€μ΄ 많기 λ•Œλ¬Έμ— 기본적으둜 λ©”λͺ¨λ¦¬ 덀프 파일 뢄석을 μœ„ν•΄μ„œλΌλ©΄ windows κ°€ 더 μˆ˜μ›”ν•  수 μžˆλ‹€.

 

그런데 λ‚˜λŠ” VMware 에 λ§Œλ“  가상머신이 Ubuntu λΌμ„œ κ·Έλƒ₯ κ·Έ λ¨Έμ‹ μ˜ λ©”λͺ¨λ¦¬ 덀프λ₯Ό λ•„κ³ ,

λΆ„μ„ν•˜λ €κ³  μ‹œλ„ν•˜μ˜€λ‹€.

(그리고 맀우 ν›„νšŒν•˜μ˜€λ‹€)

 

ν•΄λ‹Ή 파일 이름은 file.vmem 이고 volatility λ₯Ό μ‚¬μš©ν•  λ•Œ κ°€μž₯ 기본적인 imageinfo ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•΄μ„œ μ–΄λ–€ μš΄μ˜μ²΄μ œμΈμ§€ μ•Œλ €κ³  ν–ˆμœΌλ‚˜,,,,

λ‹€μŒκ³Ό 같은 λ©”μ‹œμ§€κ°€ 뜨고 μ’…λ£Œλ˜μ§€ μ•Šμ•˜λ‹€.

ν•΄λ‹Ή ν”„λ‘œνŒŒμΌμ΄ μ—†μ–΄μ„œ μ–΄λ–€ 운영체제의 이미지 νŒŒμΌμΈμ§€ 검색을 λͺ»ν•˜κ³  μžˆλŠ” 것이닀.

 

 

κ·Έλž˜μ„œ μ²˜μŒμ—λŠ” volatilityfoundation μ—μ„œ 각쒅 ν”„λ‘œνŒŒμΌμ„ μ œκ³΅ν•˜λŠ” 것 (github.com/volatilityfoundation/profiles μ—μ„œ 보고 λ‹€μš΄λ°›μ„ 수 μžˆλ‹€)

을 μ°Ύμ•„ λ‹€μš΄λ°›μ•„μ„œ μ‹€ν–‰ν•˜λ €κ³  ν–ˆμœΌλ‚˜,

bash 버전 차이둜 인해 μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•Šμ•˜λ‹€.

κ²°κ΅­ 직접 ν”„λ‘œνŒŒμΌμ„ λ§Œλ“€κΈ°λ‘œ κ²°μ •ν•˜μ˜€λ‹€.

 

 

----------Linux ν”„λ‘œνŒŒμΌ λ§Œλ“€κΈ°---------

 

linux ν”„λ‘œνŒŒμΌμ€ module.dwarf 파일과 System.map νŒŒμΌμ„ ν™•λ³΄ν•΄μ„œ μ••μΆ•ν•˜λ©΄ λœλ‹€.

-module.dwarf : μ»€λ„μ˜ 데이터 ꡬ쑰에 λŒ€ν•œ λͺ…μ„Έμ„œ. [volatility λ₯Ό 톡해 얻을 수 있음]

-System.map : μ»€λ„μ˜ symbols 정보 [μ‹œμŠ€ν…œ λ‚΄μ—μ„œ 가지고 있음]

 

-κΈ°λ³Έ 사항: volatility κ°€ μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.

μ„€μΉ˜κ°€ μ•ˆλ˜μ–΄μžˆλ‹€λ©΄, 컀멘트 μ°½μ—μ„œ

$ git clone https://github.com/volatilityfoundation/volatility.git

 

 

-상세 κ³Όμ •:

1) 가상머신을 킨닀.

2) volatility/tools/linux ν΄λ”μ—μ„œ make --> module.dwarf 파일 생성

$ cd volatility/tools/linux

$ make

3) uname(μ‹œμŠ€ν…œ 정보 좜λ ₯) 확인 및 /boot ν΄λ”μ—μ„œ System.map 확인

$ uname -r

$ ls /boot

ν˜„μž¬ μ‹œμŠ€ν…œμ˜ μ΄λ¦„μœΌλ‘œ λ˜μ–΄μžˆλŠ” μ € System.map νŒŒμΌμ„ μ‚¬μš©ν•  것이닀.

 

4) zip λ§Œλ“€κΈ° <μ΅œμ’…>

$ zip [zipFileName].zip ./volatility/tools/linux/module.dwarf /boot/System.map-4.15.0-29-generic : λ‚΄ 상황

$ zip $(lsb_release -i -s)_$(uname -r)_profile.zip ./volatility/tools/linux/module.dwarf /boot/System.map-$(uname -r) 

: 이 λͺ…λ Ήμ–΄λ₯Ό κ·ΈλŒ€λ‘œ μ“°λ©΄ λœλ‹€.

(lsb_release -i -s 은 λ¦¬λˆ…μŠ€ 배포판 버전, uname -r 은 μ‹œμŠ€ν…œ 정보λ₯Ό κ°€μ Έμ˜¨λ‹€.)

 

이 λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•œ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™κ³ , Ubuntu_4.15.0-29-generic_profile.zip 파일이 μƒμ„±λ˜μ—ˆλ‹€.

이제 ν”„λ‘œνŒŒμΌμ΄ μƒμ„±λœ 것 !

 

-------------------------------------

 

 

μƒμ„±ν•œ ν”„λ‘œνŒŒμΌ ν˜Ήμ€ μœ„μ˜ volatilityfoundation μ—μ„œ μ œκ³΅ν•˜λŠ” ν”„λ‘œνŒŒμΌ zip 을 

C:\Python27\Lib\site-packages\volatility-2.6\volatility-master\volatility\plugins\overlays\linux

에 μΆ”κ°€ν•΄μ£Όλ©΄ ν•΄λ‹Ή λ²„μ „μ˜ λ¦¬λˆ…μŠ€μ— λŒ€ν•œ λ©”λͺ¨λ¦¬ 덀프 νŒŒμΌμ„ volatility 둜 뢄석할 수 있게 λœλ‹€.

(μœ„μ˜ κ²½λ‘œλŠ” μ‚¬μš©μž μ„€μ •λ§ˆλ‹€ λ‹€λ₯Ό 수 μžˆμœΌλ‹ˆ 전체적인 틀을 보고, μžμ‹ μ— 맞게 μ„€μ •ν•˜λ©΄ λœλ‹€.)

 

이 λ•Œ zip νŒŒμΌμ„ κ·ΈλŒ€λ‘œ λ„£μœΌλ©΄ λœλ‹€!

압좕을 ν’€ ν•„μš” μ—†μŒ.

 

μΆ”κ°€ν•΄μ€€ ν›„ volatility μ—μ„œ --info λ₯Ό 톡해 ν™•μΈν•˜λ©΄ μ„±κ³΅μ μœΌλ‘œ ν”„λ‘œνŒŒμΌμ΄ μ μš©λ¨μ„ 확인할 수 μžˆλ‹€.

(ν•΄λ‹Ή ν”„λ‘œνŒŒμΌ zip 파일 μ΄λ¦„μœΌλ‘œ 좜λ ₯이 λœλ‹€.

μœ„μ˜ μ˜ˆμ‹œμ™€λŠ” λ‹€λ₯Έ νŒŒμΌμ΄λ‹ˆ, 이 μ΄λ―Έμ§€λŠ” μ„±κ³΅μ μœΌλ‘œ ν”„λ‘œνŒŒμΌμ„ μΆ”κ°€ν–ˆλ‹€λŠ” 것이라고 μ΄ν•΄ν•˜λ©΄ λœλ‹€.)

 

 

그런데 μ΄λ ‡κ²Œ ν–ˆμŒμ—λ„ λ©”λͺ¨λ¦¬ 덀프 파일이 μ œλŒ€λ‘œ λΆ„μ„λ˜μ§€ μ•Šμ•˜λ‹€.

linux ν”ŒλŸ¬κ·ΈμΈμ„ (거의 λͺ¨λ‘) μ‚¬μš©ν•΄ λ³΄μ•˜μŒμ—λ„ μ•„λ¬΄λŸ° κ²°κ³Όκ°€ λ‚˜μ˜€μ§€ μ•Šμ•˜λ‹€.

 

μ΄μœ λŠ” KASLR λ•Œλ¬Έμ΄μ—ˆλ‹€.. (정말 μš•λ‚˜μ˜¬ λ»”ν–ˆλ‹€.)

 

 

---- KASLR: Kernel Address Space Layout Randomization ----

: kernel 의 이미지가 physical Memory 에 λ‘œλ”©λ˜λŠ” μ£Όμ†Œμ™€ Virtual Address 둜 λ§€ν•‘λ˜λŠ” μ£Όμ†Œλ₯Ό 각각 Randomize ν•΄μ„œ kernel 을 κ³΅κ²©ν•˜λŠ” ν•΄ν‚Ή κΈ°λ²•μœΌλ‘œλΆ€ν„° λ³΄ν˜Έν•˜λŠ” μˆ˜λ‹¨

 

λ²„μ „λ§ˆλ‹€ KASLR 이 μ μš©λ˜λŠ”μ§€ μ—¬λΆ€κ°€ λ‹€λ₯΄λ‹€.

 

1. KASLR 적용 μ—¬λΆ€ ν™•μΈν•˜κΈ°

 

$ sudo cat /proc/kallsyms

λ₯Ό ν•œ κ²°κ³Όκ°€ μž¬λΆ€νŒ…ν•œ 후에도 λ™μΌν•˜λ©΄ KASLR 적용이 μ•ˆλ˜λŠ” μ‹œμŠ€ν…œμ΄κ³ , λ‹€λ₯΄λ©΄ KASLR 적용이 λ˜λŠ” μ‹œμŠ€ν…œμΈ 것이닀.

 

kallsyms: Extract all kernel symbols for debugging

KASLR κ°€ μ μš©λœλ‹€λ©΄, kernel symbols 의 μ£Όμ†Œκ°€ μž¬λΆ€νŒ… ν›„ 달라지기 λ•Œλ¬Έμ— (KASLR λŠ” randomize μ‹œν‚€λ―€λ‘œ)

이λ₯Ό 톡해 확인할 수 μžˆλ‹€..

 

κ·ΈλŸ¬λ‹ˆ λͺ‡κ΅°λ° μ£Όμ†Œλ₯Ό 캑쳐해두고 μž¬λΆ€νŒ…ν•œ ν›„, κ·Έ λΆ€λΆ„μ˜ μ£Όμ†Œλ₯Ό ν™•μΈν•˜λ©΄ λ‹¬λΌμ‘ŒλŠ”μ§€ μ‰½κ²Œ 확인할 수 μžˆλ‹€.

쒌츑: Before / 우츑: After

λ‚˜λŠ” 확인해본 κ²°κ³Ό, μœ„μ™€ 같이 μ£Όμ†Œκ°€ 달라짐을 확인 ν•˜κ³  절망 ν–ˆλ‹€.

(κ·Έλž˜λ„ λ‹€ν–‰νžˆ, 친ꡬ의 λ„μ›€μœΌλ‘œ ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€......!)

 

2. ν•΄κ²°: kernel parameter 에 nokaslr μΆ”κ°€ν•˜κΈ°

 

!!주의!!

kernel parameter 을 λ°”κΏ€ λ•Œμ—λŠ” μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•˜κ³ ,

이 ν¬μŠ€νŒ…μ—μ„œ μ†Œκ°œν•˜λŠ” 방법은 ν˜„μž¬ λ‚˜μ˜ μ‹œμŠ€ν…œμ— 맞좘 κ²ƒμ΄λ‹ˆ μžμ‹ μ˜ μ‹œμŠ€ν…œκ³Ό λ‹€λ₯΄λ‹€λ©΄ 더 μ•Œμ•„λ³΄κ³  μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

κ·ΈλŸ¬λ‹ˆ KASLR 이 적용된 μ‹œμŠ€ν…œμ˜ ν•΄κ²° 방법은 kernel parameter 에 nokaslr 을 μΆ”κ°€ν•˜λŠ” 것이고

μžμ‹ μ˜ μ‹œμŠ€ν…œμ— λ§žμΆ°μ„œ kernel parameter 을 μˆ˜μ •ν•˜μ—¬μ•Ό ν•œλ‹€!

 

μ œλŒ€λ‘œ μ•Œμ•„λ³΄μ§€ μ•Šκ³  이 ν¬μŠ€νŒ…μ„ κ·ΈλŒ€λ‘œ λ”°λžλ‹€κ°€λŠ” λΆˆμƒμ‚¬κ°€ λ°œμƒν•  수 μžˆμŒμ„ 미리 κ²½κ³ ν•©λ‹ˆλ‹€.

(μ‹€μ œλ‘œ 저도 컴퓨터λ₯Ό 날릴 λ»”ν–ˆκΈ°μ—,, 이 ν¬μŠ€νŒ…μ„ κ·ΈλŒ€λ‘œ λ”°λžλ‹€κ°€ λ°œμƒν•˜λŠ” λΆˆμƒμ‚¬λŠ” μ±…μž„μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이건 저와 같은. κ²½μš°κ°€ μžˆμœΌμ‹  λΆ„κ»˜ 도움이 λ˜μ—ˆμœΌλ©΄ ν•˜λŠ” λ§ˆμŒμ— μž‘μ„±ν•©λ‹ˆλ‹€.)

-----

 

λ¨Όμ €

$ sudo vim /etc/default/grub

으둜 vim μ—λ””ν„°λ‘œ kernel parameter 을 μˆ˜μ •ν•  것이닀.

 

μ—΄λ©΄ GRUB_DISTRIBUTOR 이 보일텐데, 거기에

GRUB_CMDLINE_LINUX_DEFAULT="nokaslr"

을 μΆ”κ°€ν•˜λŠ” 것이 ν•΄κ²° 방법인데, 이걸 κ·ΈλŒ€λ‘œ μ μš©ν–ˆλ‹€κ°€λŠ” 컴퓨터λ₯Ό λ‹€ 날릴 μˆ˜λ„ μžˆλ‹€...

 

μ™œλƒλ©΄ λ‚˜μ—κ² 이미 GRUB_CMDLINE_LINUX_DEFAULT μš”μ†Œκ°€ 있기 λ•Œλ¬Έμ΄λ‹€.

κ·Έλž˜μ„œ λ‹€μŒκ³Ό 같이 ν•΄μ€˜μ•Ό ν•œλ‹€.

GRUB_CMDLINE_LINUX_DEFAULT="quiet nokaslr"

 

μˆ˜μ •ν•œ 것을 μ €μž₯ν•΄μ£Όκ³ ,

$ sudo update-grub

을 μ‹€ν–‰ν•œ λ‹€μŒ 이 λͺ…령이 μ •μƒμ μœΌλ‘œ λλ‚˜λ©΄ μž¬λΆ€νŒ…μ„ ν•˜λ©΄ λœλ‹€.

 

μž¬λΆ€νŒ…ν•  λ•Œ 이런 화면이 뜨면 μ„±κ³΅ν–ˆλ‹€κ³  보면 λœλ‹€ .

(ν™•μ‹€νžˆ ν™•μΈν•˜λ €λ©΄ μ•žμ„  KASLR 적용 μ—¬λΆ€ 확인법을 또 해보면 λœλ‹€)

 

-------------------------------------

 

 

λ§Œμ•½ KASLR 이 μ μš©λ˜μ—ˆμŒμ„ ν™•μΈν•œλ‹€λ©΄, λ©”λͺ¨λ¦¬ 덀프 νŒŒμΌμ€ λ¬Όλ‘  ν”„λ‘œνŒŒμΌλ„ λ‹€μ‹œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. γ…Žγ…Ž

 

그런데 κ·Έλ ‡κ²Œ ν¬λ§μ μ΄μ§€λŠ” μ•ŠλŠ” 것이

μ΄λŒ€λ‘œ μ§„ν–‰ν•˜μ˜€μŒμ—λ„ volatility μ—μ„œ ν•΄λ‹Ή λ©”λͺ¨λ¦¬ νŒŒμΌμ„ λΆ„μ„ν•˜λŠ”λ° λ‚˜μ˜€λŠ” 정보가 거의 μ—†μ—ˆλ‹€.

무엇이 λ¬Έμ œμΈμ§€λŠ” 아직도 λͺ¨λ₯΄κ² μ§€λ§Œ, linux_psscan 으둜 μ‹€ν–‰ν•œ 것 μ™Έμ—λŠ” λ‚˜μ˜€λŠ” 정보가 μ—†μ—ˆλ‹€.

κ·Έλž˜μ„œ κ²°κ΅­ λ‹€λ₯Έ μš΄μ˜μ²΄μ œμ—μ„œ λ©”λͺ¨λ¦¬ 덀프 νŒŒμΌμ„ μƒˆλ‘œ λ§Œλ“€μ–΄ μ‹€μŠ΅ν•˜μ˜€λ‹€.

κ·ΈλŸ¬λ‹ˆ, linux λ₯Ό 잘 μ•„λŠ” 뢄이 μ•„λ‹ˆλΌλ©΄ linux μ—μ„œ λ©”λͺ¨λ¦¬ 덀프 νŒŒμΌμ„ λ§Œλ“€μ–΄μ„œ volatility 둜 λΆ„μ„ν•˜λŠ” 것은 개인적으둠 μΆ”μ²œλ“œλ¦¬μ§€ μ•ŠλŠ”λ‹€.

 

fin.

 

 

Ref.

[1] www.andreafortuna.org/2019/08/22/how-to-generate-a-volatility-profile-for-a-linux-system

[2] cpuu.postype.com/post/665132

[3] z49x2vmq.github.io/2018/01/14/kaslr/

.