ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • linux μ—μ„œ μƒμ„±ν•œ λ©”λͺ¨λ¦¬ 덀프 νŒŒμΌμ„ volatility 둜 λΆ„μ„ν•˜κΈ° :: profile λ§Œλ“€κΈ°, KASLR
    SECURITY/FORENSICS 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/

    .

     

     

     

    λŒ“κΈ€

Designed by Tistory.