Kali-KM_Security Study

Pulling the Plug

Forensic/Theory2017. 3. 22. 22:56

서론

이번 포스팅에서 다루고자 하는 주제는 바로 "Pulling the Plug" 이다. 단어 그대로 연결되어 있는 플러그를 뽑는다는 것으로 주로 장치의 강제 종료를 의미한다. PC 나 핸드폰 등 강제로 전원이나 배터리를 분리하여 종료시킨적이 한번 쯤은 있을 것이다. 필자의 경우 핸드폰에 대해서는 잘 모르니 PC 에 한해서만 이야기 해보고자 한다. 그렇다면 이 강제 종료에 대해 무슨 생각을 할 수 있기에 포스팅까지 할까? 


사실 별거 없다. 당연히 PC 에 무리가 간다는 것쯤이야 모두가 알고있다. 하지만 약간의 악성코드와 포렌식 측면의 고려 사항을 추가하면 고민해볼 가치는 있다고 생각한다. 필자도 포렌식에 대해서는 얕은 지식만 가지고 있어 깊이 다루기는 어렵지만 알고 있는 지식에 한해 이 주제에 대해 이야기해보고자 한다. 개인적인 의견이 다분하며 전문적인 내용은 거의 없으므로 시간이 많이 남는 사람들에 한해 가볍게 읽기를 권한다.





본론

정상적인 PC 종료 과정

PC 의 정상적인 종료 과정에는 무엇이 있는지 먼저 알아보자. Windows PC 의 종료 과정은 부팅과정 비하여 훨씬 간소화 된 절차를 거친다. 종료는 주로 CSRSS (Client/Server Runtime Subsystem) 및 WinLogon, 이 두 가지 구성 요소로 처리 된다. 대략적인 순서에 대해 알아보자.


Windows 에서 시스템 종료 명령을 내리면 ExitWindowsEx 함수를 호출한다. 이 함수는 RPC(원격 프로시저 호출) 을 사용하여 CSRSS 에게 시스템 종료 메시지를 보낸다. CSRSS가 이 메시지를 받은 후, WinLogon 에도 다른 메시지를 보낸다. 메시지를 받은 WinLogon 은 ExitWindowsEx 함수를 호출한 것이 자기 자신이 아님을 확인한다. 확인 후 자신이 호출한 것이 아니라면 사용자를 대신해 WinLogon 이 한번 더 ExitWindowsEx 함수를 호출한다.


두 번째 호출로 인해 CSRSS 에는 또 다시 RPC 를 통해 종료 메시지가 전달된다. 하지만 이번엔 위와 다르게 WinLogon 에서 ExitWindowsEx 함수가 호출된 것임을 확인하고 종료를 승인한다. 종료가 승인되면 CSRSS 는 각 사용자의 Interactive 세션에서 실행되는 모든 프로세스를 종료하는 작업을 수행한다. CSRSS 가 Interactive 사용자 세션에서 실행되고 있는 모든 프로세스를 종료할 때가 되면, 실행 중인 프로세스들의 셧다운 레벨 역순으로 종료 순서를 지정한다.


CSRSS 가 유저 세션 프로세스를 모두 종료한 뒤, shutdown 이 발생하고 있음을 세션 0에서 실행 중인 시스템 프로세스에 알린다. 이제 WinLogon 이 NtShutdownSystem 함수를 호출하며 제어를 반환한다. 그 다음 PoSetSystemPowerState 를 호출하며 아래의 작업을 진행한다.


 * I/O 관리자는 shutdown IRP 를 등록 된 모든 장치 드라이버에 보낸다. 이를 통해 각 장치 드라이버는 종료하기 전에 필수적으로 해야 할 작업을 수행한다. 

 * 메모리 관리자는 수정 된 메모리 페이지를 파일 데이터와 함께 디스크에 다시 기록한다.

 * 구성 관리자는 레지스트리 변경 사항을 각각의 하이브 파일에 기록하도록 한다.

 * I/O 관리자는 모든 파일 시스템 드라이버에 종료를 알려 변경 된 데이터 저장 등의 동작을 수행하도록 한다.

 * 마지막으로, 전원 관리자는 시스템 전원을 끄므로 shutdown 과정을 완료한다.


위와 같은 과정을 통해 정상적인 PC 의 종료를 확인할 수 있다.



비정상적인 PC 종료 과정

그렇다면 정상적인 종료가 아닌 '비정상적인' PC 종료에 대하여 간략히 알아보자. 우선 비정상적인 종료의 경우 위와 같이 특정 신호(API 호출이나 IRP 등)를 전달할 수 없게 된다. 특히 제목과 같이 전원 플러그를 바로 뽑아버린다면 정상적인 과정에서 볼 수 있던 Flush 작업이 모두 진행되지 않는다. 이로 인해 손실되는 데이터는 당연히 존재하게 된다.


PC 의 전원이 갑자기 차단되면 기존에 동작하고 있던 하드 디스크 표면에 물리적인 손상 또한 생길 수가 있다. 반복적인 손상은 하드디스크에 배드섹터를 유발 할 수 있으며, 이는 기능적인 측면 뿐만 아니라 여러 측면에서 불편함을 가지고 올 수 있다. 또한 위에서 언급했던 바와 같이 각 드라이버와 장치들이 수행하던 작업 데이터의 기록이 이루어지지 않는다. 변경 사항이 저장되지 않는다면 드라이버 동작 간에 문제를 유발할 수 있다. 그리고 개인적인 생각에서 문제가 될 수 있는 것은 사후 분석을 위한 데이터 수집 중 휘발성 데이터가 문제가 된다는 것이다. 우선 아래 RFC 3227 에서 언급하는 휘발성 데이터 순서를 보자.


 1. registers, cache
 2. routing table, arp cache,process table, kernel staistics, memory
 3. temporary file sysem
 4. disk
 5. remote logging and monitoring data that is relevant to the system in question
 6. physical configuration, network topology
 7. archival media 


휘발성 데이터의 경우 비휘발성 데이터보다 데이터 수집이 빠르게 이루어져야 한다. 그렇지 않다면 휘발성 데이터는 모두 손실될 수 있기 때문이다. 중요한 데이터는 디스크에 저장되어 있으니깐 상관없지 않느냐라고 할 수 있지만 메모리, 레지스터 등등 휘발성 데이터에도 중요한 데이터는 존재하고 있다. 


가령, Fileless 형태의 악성코드가 네트워크 연결을 통해 악성 실행 데이터를 받아와 메모리에서만 동작한다고 가정해보자. 동작 중인 악성코드에 의해 이상 징후를 느낀 사용자가 갑작스레 PC 를 종료하면 메모리에 있던 악성코드에 대한 정보는 모두 손실된다. 결국 사용자는 추후에도 어떤 악성코드에 의해 감염된 것인지 알기 어려울 것이다. 


이처럼 PC 를 강제 종료하는 것을 추천하는 경우는 결코 많지 않을 것이다.



결론

본론을 통해 PC 의 정상적인 종료 과정과, 그렇지 않은 경우에 나타날 수 있는 상황에 대하여 알아보았다. 사실 본론은 매우 편파적으로 'PC 를 강제 종료하면 안된다.' 라는 입장으로 쓰였다. 이렇게 서술한 이유는 모두가 알다시피 일반적인 상황에서는 PC 를 강제종료하지 않아야 한다는 것을 알고 있기 때문이다.


하지만 PC 를 강제 종료 해야할까? 라는 고민이 들 순간들에 대하여 몇 가지 언급해보자.

* 랜섬웨어에 의해 사용자 파일이 암호화 되고 있다.

* 어떠한 악성코드에 의해 PC 에 이상 증상(팝업 창 출력 등)이 연속적으로 나타나고 있다.


이러한 상황을 맞이한다면 어떻게 해야할까? 우선 필자가 위 상황에 놓인 경우 두 가지 행동으로 상황을 마무리 할 것이다. 첫째, 실행 중인 프로세스 목록을 확인하여 의심되는 프로세스를 종료한다. 하지만 의심되는 프로세스가 보이지 않고 종료했다하더라도 다시 실행되어 동작하는 경우를 가정하자. 그렇다면 둘째로 바로 PC 를 강제종료 시킬 것이다. 이렇게 하므로 악성코드의 동작을 저지할 수 있다.


대부분의 사용자는 이와 유사한 행동을 취할 것이라 생각한다. 하지만 개인이 아닌 기업의 입장에서 생각해보면 이는 큰 위험이 될 수 있다. 우선 운영 중인 서버에 악성코드가 나타났다고 생각해보자(참고로 서버를 잠시 종료해도 상관없다고 가정하자). 서버의 경우 하나의 개인이 아닌 기업이 가진 자산이다. 첫 번째 상황의 경우 랜섬웨어가 확실하다면 서버를 강제 종료해도 괜찮을 것이다. 하지만 두 번째 상황에 놓인 경우 역시 강제 종료하려 한다면 큰 리스크를 갖게 된다.

어떠한 악성코드인지 모르는 상황에서 섣불리 강제 종료해버린다면 그 증거들을 놓칠 수 있기 때문이다. 하지만 강제 종료하지 않는다면 서버 장치에서 어떠한 동작이 추가적으로 일어날지 모른다. 혹여나 악성코드에 대한 증거를 놓치면 그에 따른 치료 방향 또한 잡기 어려워지며, 이는 서버 장치 운영에 무리가 될 수 있다. 과연 어떠한 선택을 해야 할까.


사실 정답은 없다. 단지 어떠한 면을 우선으로 하느냐에 따라 강제종료 할 수도 있고, 하지 않을 수도 있다. 선택하는 사람의 몫인 것이다. 하지만 이러한 상황을 맞이하게 된다면 어떻게 행동해야 할지 한번 쯤 생각해보는 것도 나쁘지 않을까 생각한다.




참고자료

* OverClock, "Windows: The startup and shutdown process", http://www.overclock.net/t/1453560/windows-the-startup-and-shutdown-process

* faqs, "RFC 3227 - Guidelines for Evidence Collection and Archiving", http://www.faqs.org/rfcs/rfc3227.html#b

'Forensic > Theory' 카테고리의 다른 글

Pulling the Plug  (0) 2017.03.22
Unicode 확장자 변조(RLO)  (3) 2016.05.15
Windows Event Log (2) – 주요 이벤트 로그  (0) 2016.02.01
Windows Event Log (1) – 이벤트 로그의 개념  (2) 2016.02.01
Volume Shadow Copy 분석  (1) 2016.01.18
NTFS FIle System (9) $UsnJrnl  (0) 2016.01.16

Comment +0

지난 2005년 경부터 일부 피싱에 사용된 Unicode RLO 방식을 이용하여 악성코드의 확장자를 다른 형태로 보이도록 하는 형태의 악성코드가 지속적으로 나타나고 있다. 유니코드란 아스키 코드보다 더 크게 모든 문자를 표현하는 문자셋이라 할 수 있다. 각 나라마다 고유의 문자들이 있는데 이를 ASCII 문자로만으로는 표현할 수가 없다.


일반적으로 문자는 왼쪽에서 오른쪽으로 읽지만, 일부 국가에서는 오른쪽에서부터 문자를 읽기도 한다. 이를 컴퓨터에 표현하기 위한 Unicoode는 바로 0x202E로 "Right to Left Override"라는 문자이다. 해당 문자에 대한 정보는 아래와 같다.

이전부터 악성 파일과 관련되어 모르는 exe 파일은 열어보아서는 안된다라는 내용의 이야기는 많이 들을 수 있었다. 그렇기에 일반적인 사용자들도 더 이상 모르는 실행 파일을 함부로 실행시키지는 않는다. 그렇기에 공격자들은 이러한 확장자를 감추려 하거나 변조하는 등으로 사용자를 속이려 한다. 유니코드 확장자 변조에는 위에서 언급한 0x202E가 사용된다. 아래 파일을 보자.

위 그림에서 볼 수 있듯이 파일의 이름은 "testrcs.mp4"이다. 일반적으로 보았을 때 그냥 정상적인 MP4 파일과 같이 볼 수 있다. 하지만 우측의 파일 유형을 보면 '화면보호기(scr)'로 나타나는 것을 확인할 수 있다. 어떻게 된 것일까? CMD를 통해 해당 디렉터리에서 파일의 이름을 다시 확인해보자.

CMD를 통해 확인한 결과에서는 "test 4pm.scr"로 나타나는 것을 확인할 수 있다. 바로 test라는 문자열과 4pm 이라는 문자열 사이에 0x202E가 들어가 있는 것이다. 그렇기에 0x202E 이후의 내용 "4pm.scr"은 반전되어 "rcs.mp4"로 나타내는 것이다. 이를 통해 scr파일을 mp4파일로 착각하도록 할 수 있다.


그렇다면 직접 실습을 진행해보자. 우선 RLO 유니코드 문자를 가지고 와야하는데 이는 0x202E로 바로 나타내도 되지만 편리하게 문자열 셋에서 구할 수가 있다. Windows+R을 입력한 뒤 나타나는 창에 charmap을 입력해보자. 그렇다면 아래와 같은 문자표가 나타난다.

그 다음 '고급 보기'를 체크하여 나타나는 항목에서 유니코드로 이동에 "0x202E"를 입력해준다. 그렇다면 아래의 그림과 같이 나타나는데 해당 문자를 복사해주면 준비가 끝난다.

두 개의 파일 1234abcd.mal과 2234abcd.mal을 준비한다. 그리고 두 번째 파일에서 원하는 부분에 해당 문자를 복사해보자. 아래와 같이 "2234ablam.dc"로 출력되는 것을 확인할 수가 있다. 

이와 같이 확장자를 변조할 수가 있으며, 이에 추가적으로 해당 실행파일이 아이콘 또한 변조된 이름과 같이 보이게 하면 자연스럽게 실행을 유도할 수가 있다. 따라서 어떠한 파일이든 다운을 받았다면 실행을 시키지 말고, 파일의 이름을 한번 의심해보고 반드시 파일의 유형까지 확인해보아야 한다.



Reference


http://egloos.zum.com/voidns/v/2409436

http://cleverdj.tistory.com/48

http://viruslab.tistory.com/1986

http://www.fileformat.info/info/unicode/char/202e/index.htm

http://jvinci.tistory.com/228


'Forensic > Theory' 카테고리의 다른 글

Pulling the Plug  (0) 2017.03.22
Unicode 확장자 변조(RLO)  (3) 2016.05.15
Windows Event Log (2) – 주요 이벤트 로그  (0) 2016.02.01
Windows Event Log (1) – 이벤트 로그의 개념  (2) 2016.02.01
Volume Shadow Copy 분석  (1) 2016.01.18
NTFS FIle System (9) $UsnJrnl  (0) 2016.01.16

Comment +3

1. 개요


  이벤트 로그에 대하여 학습을 하기 위해 이벤트 ID에 대하여 알아보았다. 너무 많은 이벤트들이 존재하기에 어떤 이벤트가 중요한 것인지 불필요한지 직접 확인 하기에는 번거로움이 크다. 따라서 이번 문서에서는 많은 이벤트들 중에서 유심히 보아야 할 로그에 대하여 학습하고자 한다.

  이에 대하여 NSA에서는 Spotting the Adversary with Windows Event Log Monitoring에 대하여 글을 작성하였으며 이를 토대로 해당 문서를 작성하고자 한다. 위에서 언급한 해당 문서에서는 크게 16개의 카테고리에 대하여 설명을 한다. 이러한 로그에 대하여 학습해보자.

표 1. NSA – 16가지 이벤트 카테고리

  아래의 테이블은 각 카테고리와 이를 나타내는 이벤트 ID에 대하여 정리된 것이다. 이러한 표에서 몇 가지에 대하여 상세하게 알아보자.


2. 이벤트 카테고리


2.1 Application Whitelisting

  응용프로그램 화이트 리스트 이벤트는 차단된 응용 프로그램을 찾기 위해 수집되어야 한다. 차단된 응용프로그램들은 악의적일 수가 있으며, 승인되지 않은 소프트웨어의 실행을 시도하고자 한다. 응용프로그램 화이트 리스트 이벤트는 SRP(소프트웨어 제한 정책)이나 AppLocker가 네트워크 상에서 사용될 때 수집 될 수 있다.

그림 1. Whitelisting Events

2.2 Application Crashes

  응용 프로그램 충돌에 관한 이벤트들은 충돌이 발생했을 때, 이것이 악의적인 것에 의한 것인지 아닌지 판단하는데 도움을 준다. BSOD, Windows Error Reporting(WER), 응용 프로그램 충돌들은 이벤트를 발생시킨다. 만약 EMET(Microsoft Enhanced Mitigation Experience Toolkit)을 사용하고 있다면, EMET 로그들도 수집될 것이다.

그림 2. Application Events

2.3 System or Service Failures

  시스템과 서비스 실패는 조사하는데 있어 흥미로운 이벤트들이다. 서비스 동작은 보통 실패하지 않는다. 만약 서비스가 실패했을 경우, 관리자로서 이를 검토하여야 한다. 만약 윈도우 서비스가 지속적으로 실패할 경우, 이는 공격자가 해당 서비스를 대상으로 하고 있음을 나타내는 것이다.

그림 3. System Events

2.4 Windows Update Errors

  컴퓨터는 알려진 취약점을 대비하기 위하여 최신 상태를 유지해야 한다. 그럴 가능성은 거의 없지만, 이러한 패치가 때로는 적용하는데 실패하기도 한다. 업데이트를 실패하는 것은 운영체제나 응용프로그램의 취약점을 피하기 위하여 해결해야만 한다.

그림 4. Windows Update Failed Event

2.5 Windows Firewall

  만약 클라이언트 환경이 호스트 기반의 윈도우 방화벽의 사용하고 있다면, 방화벽의 상태를 나타내는 이벤트들이 수집된다. 예를 들어, 만약 방화벽이 활성화에서 비활성화로 전환된다면 이에 대한 로그가 남는 것이다. 일반적인 사용자는 방화벽의 상태나 규칙을 변경하지 않는다.

그림 5. Firewall Events

2.6 Clearing Event Logs

  정상적인 동작을 하는 동안 이벤트 로그 데이터가 지워질 가능성은 거의 없으며, 악의적인 공격자들이 그들의 행동을 감추기 위해 이벤트 로그를 지웠을 가능성은 높다. 이벤트 로그가 지워져을 때 이는 분명히 의심할 만한 사항이다. 이벤트 로그를 수집하는 것은 공격자가 자신의 행동을 감추기 더 어렵게 하는 이점이 있다.

  하지만 공격자가 이벤트를 지웠을 경우 이것이 새로운 이벤트로 기록이 된다. 따라서 로그를 지웠다는 새로운 이벤트가 발견된다면, 이에 맞게 추가적인 행동을 취해야 한다. 가령 VSS를 확인한다거나 삭제된 로그를 복구하는 조치를 취하면 좋을 것이다.

그림 6. Log Activity Events

2.7 Software and Service Installation

  일반적인 네트워크 동작의 일부로써, 새로운 소프트웨어나 서비스가 설치되며 이러한 활동에 대해서 이벤트가 생성 된다. 관리자들은 새롭게 설치된 소프트웨어나 시스템 서비스에 대한 로그를 통해 확인할 수가 있으며, 네트워크에 위험하지 않은지 추가적인 확인할 수가 있다.

그림 7. Software and Service Events

  여기서 이벤트 ID 800에 대하여 알아야 더 언급하자면, 윈도우 7에서 해당 이벤트는 매일 오전 12:30에 응용프로그램 활동에 대하여 요약을 제공하기 위하여 생성된다. 이 이벤트는 설치되거나 제거된 응용 프로그램의 수를 찾는 관리자들에게 편의를 제공할 것이다.

2.8 Account Usage

  사용자 계정 정보는 수집과 감사 될 수가 있다. 로컬 계정 사용을 추적하는 것은 Pass the Hash 활동과 인가되지 않은 다른 계정의 사용을 탐지할 수 있게 도와준다. 원격 데스크톱 로그인 이나 권한 그룹에 사용자를 추가하거나, 계정 잠금과 같은 추가적인 정보들은 추적될 수가 있다.

  권한 그룹에 추가된 사용자 계정은 실제로 권한 그룹에 속한 사용자임을 보증하기 위하여 더 면밀히 감시되어야 한다. 권한 그룹의 인가되지 않은 멤버는 악의적인 활동이 발생할 수 있음을 나타낸다.

그림 8. Account Activity Events

  도메인 계정 잠금 이벤트는 로컬 계정 잠금 이벤트가 로컬 컴퓨터에 생성되는 것에 반하여 도메인 컨트롤러에 생성된다. 또 위에서 성공적으로 사용자 계정에 로그인한 이벤트 (ID: 4624)에서는 로그온 유형에 대하여 반드시 확인해주어야 한다. 이에 대한 설명은 2.15의 로그온 유형 표를 참고하자.

2.9 Kernel Driver Signing

  윈도우 비스타 64비트에서 커널 드라이브 서명은 커널에 악의적인 드라이버들이나 행동이 삽입되는 것에 대해 막도록 하는 효과가 있다. 변경되어 보호되고 있는 드라이버의 표시는 악의적인 활동을 나타낼 수가 있거나 디스크 에러와 조사를 보장한다.

그림 9. Kernel Driver Signing Events

2.10 Group Policy Errors

  도메인 컴퓨터의 관리는 관리자가 보안과 그룹 정책의 규제를 높이는 것을 허가한다. 그룹 정책 에러로 인해 정책을 적용하지 못하는 것은 보안의 안전함을 감소시킨다. 따라서 관리자는 즉시 이러한 이벤트들에 대해 조사하여야 한다.

그림 10. Group Policy Errors Events

2.11 Windows Defender Activities

  Spyware나 Malware는 심각한 문제들을 남기기에 마이크로소프트는 Windows Defender라는 Anti-Spyware와 Anti-Virus를 개발하였다. 이러한 악의적인 프로그램을 감지, 제거, 예방한다는 알림은 조사되어야 한다. Windows Defender가 도작하는데 실패했다는 알림은, 관리자가 추가적인 감염이나 이러한 가능성을 방지하기 위해 즉시 올바르게 만들어야 한다. 만약 서드파티 안티바이러스나 안티스파이웨어 제품이 올바르게 사용되고 있다면, 이러한 로그는 필요하지 않다.

그림 11. Windows Defender Activities Event

2.12 Mobile Device Activities

  무선 장치들은 많은 곳에 존재하며 기업의 무선 장치 활동을 기록하는 것은 중요하다. 프로토콜에 관계 없이 통신을 위해 사용되는 무선장치들은 다른 네트워크를 오가며 손상될 수가 있다. 그러므로 어떤 휴대용 네트워크 장치를 추적하는 것은 손상이 일어나는 것을 방지하는데 유용하다. 아래의 이벤트들의 생성은 얼마나 자주 장치를 연결해제 하거나, 재연결 하는 가에 따라 빈번히 생성된다.

그림 12. Mobility related Events

2.13 External Media Detection

  USB 장치를 감지하는 것은 많은 환경에서 중요하다. 아래의 나타나는 이벤트와 이벤트 로그들은 오직 윈도우 8 이상에서만 사용이 가능하다.

그림 13. External Media Detection Events

  만약 윈도우 7이하의 경우에는 Microsoft-Windows-Driverframeworks-Usermode를 확인하면 된다. 해당 부분에서 이벤트 ID 1003, 2000, 2001, 1004를 통하여 USB가 연결되었다는 것을 확인할 수가 있으며 반대로 해당 USB가 해제된 것은 1006, 1008, 2900, 2901 등을 통해 확인할 수가 있다.

2.14 Printing Services

  문서를 인쇄하는 것은 많은 환경에서 일상적인 작업을 위해 필수적이다. 매우 많은 양의 인쇄는 어떤 문서가 인쇄되었는지, 누구의 것인지에 대하여 추적하거나 확인하는데 있어 어렵게 한다. 처리를 위해 프린터로 전달되는 문서들은 다양한 방식으로 로깅하기 위해 기록될 수 있다.

  각 인쇄 작업은 프린터 서버나 프린터 그 자체 또는 요청된 기계에 기록될 수가 있다. 이러한 동작들에 대한 로그를 기록하는 것은 인쇄된 특정 문서들을 발견할 수가 있다. 아래의 이벤트들은 문서를 인쇄하기 위해 요청되는 클라이언트 장비에서 생성된 것이다.

그림 14. Printing Services Events

2.15 Pass the Hash Detection

  사용자 계정에 Pass the Hash(PTH)를 검출하는 것은 XML로 고급 필터링 옵션을 구성하는 커스텀 뷰를 생성하는 것이 요구된다. 이벤트 쿼리 언어는 XPath에 기반한다. 아래의 추천된 쿼리 리스트는 PTH 공격을 감지하는데 제한된다. 이러한 쿼리들은 도메인의 일부가 아닌 로컬 계정을 사용하는 공격자의 행동을 밝히는데 초점이 맞추어져 있다.

  아래의 쿼리 리스트는 도메인의 일부가 아닌 다른 장치로 원격 연결을 시도하는 로컬 계정이 보여주는 이벤트들을 포착한다. 아래의 XPath 쿼리들은 이벤트 뷰어의 Custom Views를 통해 사용된다.

  성공적인 PTH은 Securiy Log의 이벤트 ID 4624를 야기한다. 도메인 로그온이 아닌 익명의 NTLM 인증은 로그온 유형이 3으로 나타난다. 아래에는 해당 이벤트에 대한 설명이 나와있으며 아래의 표에서 로그온 유형에 따른 설명들을 확인할 수가 있다.

그림 15. Logon Success – PTH Event

표 2. Logon Type

  로그온 유형에 따라 해당 로그인의 의미가 많이 중요해질 수가 있으므로 위의 표를 상기하여야 한다. 아래에 있는 쿼리 리스트에서 <DOMAIN NAME>에 실제 도메인 이름을 넣어주면 해당 쿼리가 올바르게 동작한다.

<QueryList>

<Query Id="0" Path="ForwardedEvents">

<Select Path="ForwardedEvents">

*[System[(Level=4 or Level=0) and (EventID=4624)]]

and

*[EventData[Data[@Name='LogonType'] and (Data='3')]]

and

*[EventData[Data[@Name='AuthenticationPackageName'] = 'NTLM']]

and

*[EventData[Data[@Name='TargetUserName'] != 'ANONYMOUS LOGON']]

and

*[EventData[Data[@Name='TargetDomainName'] != '<DOMAIN NAME>']]

</Select>

</Query>

</QueryList> 

  PTH를 통한 로그온 시도에 실패했을 경우 이는 이벤트 ID 4625를 야기한다. 이 역시 로그온 타입이 3으로 도메인 로그온이 아닌 익명의 로그온 계정이 NTLM 인증을 하고자 할 때 생성된다.

그림 16. Logon Fail – PTH Events

<QueryList>

<Query Id="0" Path="ForwardedEvents">

<Select Path="ForwardedEvents">

*[System[(Level=4 or Level=0) and (EventID=4625)]]

and

*[EventData[Data[@Name='LogonType'] and (Data='3')]]

and

*[EventData[Data[@Name='AuthenticationPackageName'] = 'NTLM']]

and

*[EventData[Data[@Name='TargetUserName'] != 'ANONYMOUS LOGON']]

and

*[EventData[Data[@Name='TargetDomainName'] != '<DOMAIN NAME>']]

</Select>

</Query>

</QueryList>

2.16 Remote Desktop Logon Detection

  원격 데스크탑 계정 활동 이벤트는 GUI 이벤트 뷰어를 통해 확인하기 쉽지 않다. 계정이 원격으로 클라이언트에 연결될 때, 일반적인 로그온 성공 이벤트가 생성된다. 커스텀 쿼리 필터는 행해진 로그온 유형을 분류하는데 도움을 줄 수 있다. 아래의 쿼리는 원격 데스크톱을 사용한 로그인을 보여준다. 원격 데스크톱 활동은 특정 관리자가 이를 사용하며 이는 제한된 설정에서 진행되어야 한다. 또한 이러한 활동은 모니터링 되어야만 한다. 만약 예상치 못한 로그인 활동이 있을 경우 이에 대해선 반드시 조사하여야 한다.

  아래의 XPath 쿼리는 이벤트 뷰어의 커스텀 뷰를 통해 사용된다. 이벤트 ID 4624와 4634는 각 각 언제 사용자가 로그온 했는지, 로그오프 했는지를 나타낸다. 로그온 타입 10은 이러한 원격 로그인에 대해 나타낸다.

그림 17. Remote Desktop Login Events

<QueryList>

<Query Id="0" Path="ForwardedEvents">

<Select Path="ForwardedEvents">

<!-- Collects Logon and Logoffs of RDP -->

<!-- Remote Desktop Protocol Connections -->

*[System[(Level=4 or Level=0) and (EventID=4624 or EventID=4634)]]

and

*[EventData[Data[@Name='LogonType']='10')]]

and

(*[EventData[Data[5]='10')]]

or

*[EventData[Data[@Name='AuthenticationPackageName'] = 'Negotiate']])

</Select>

</Query>

</QueryList>

 

3. 결론


2장의 내용을 통하여 어떠한 로그들이 어떠한 용도로 활용되어야 하는지에 대하여 알아보았다. 위의 내용이 옳다는 것만은 아니다. 당연히 이외에도 유심히 보아야 할 이벤트로그는 많이 존재할 것이다. 그러한 추가적인 내용을 공부하기 전에 이번 문서를 통해 어떠한 식으로 접근하여야 하는가에 대하여 알아보았다고 할 수 있다.

이벤트 로그를 공부하면서 많은 이벤트를 접하게 될 때 www.eventid.net/을 통해 찾아볼 수 있으며, 대부분의 경우 구글에 검색하면 많은 정보들을 볼 수가 있다.

  

출처


* 블로그, Spotting the Adversary with Windows Event Log Monitoring

http://www.redblue.team/2015/09/spotting-adversary-with-windows-event.html

* 블로그, 윈도우 이벤트 로그 분석 #기초

http://elven.kr/archives/361

* 문서, Spotting the Adversary with Windows Event Log Monitoring.pdf

    https://www.nsa.gov/ia/_files/app/spotting_the_adversary_with_windows_event_log_monitoring.pdf

'Forensic > Theory' 카테고리의 다른 글

Pulling the Plug  (0) 2017.03.22
Unicode 확장자 변조(RLO)  (3) 2016.05.15
Windows Event Log (2) – 주요 이벤트 로그  (0) 2016.02.01
Windows Event Log (1) – 이벤트 로그의 개념  (2) 2016.02.01
Volume Shadow Copy 분석  (1) 2016.01.18
NTFS FIle System (9) $UsnJrnl  (0) 2016.01.16

Comment +0

1. 이벤트 로그


  로그란 감사 설정된 시스템의 모든 기록을 담고 있는 데이터라 할 수 있다. 이러한 데이터에는 성능, 오류, 경고 및 운영 정보 등의 중요 정보가 기록되며, 특별한 형태의 기준에 따라 숫자와 기호 등으로 이루어져 있다. 이러한 로그는 운영체제가 업그레이드 됨에 따라 버전 별로 형태와 경로가 조금 상이하다. 각 운영체제 별 이벤트 로그의 특징은 아래의 그림과 같다.


그림 1. 운영체제 별 로그 특징


  이러한 로그를 분석하여 필요로 하는 유용한 정보를 만들어 낼 수가 있으며 로그 데이터 분석을 통해 얻을 수 있는 정보는 다음과 같이 다양하게 활용될 수가 있다.


표 1. 로그 데이터 분석의 활용


  이러한 로그 데이터는 시스템에서 발생하는 모든 문제에 대한 유일한 단서가 될 수 있으며, 시스템에서 발생한 오류 및 보안 결함에 대하여 검색이 가능하다. 또한 잠재적인 시스템 문제를 예측하는데 사용할 수가 있다.

  장애 발생시 복구에 필요한 정보로 활용하거나, 침해 사고가 발생된 경우 로그에 남아 있는 근거들을 자료로 활용할 수가 있다. 이렇게 살펴본 바와 같이 로그 데이터는 중요한 의미를 가지고 있으며, 그렇기에 올바른 분석이 더욱 요구 된다.



2. 로그 관리 및 분석


  로그 분석에 필요한 정보로는 로그 설정 방법, 파일의 저장 위치, 로그에서 나타내는 정보를 말할 수가 있다. 그리고 로그를 관리하기 위해서는 로그의 실시간 저장 및 무결성을 확보해야 하는데, 이를 위해선 시스템의 로컬에 로그를 저장하기 보다는 원격 로그서버를 구축하거나 DB서버와 연동하는 방식도 사용된다. 기초적인 Windows의 로그에 대하여 알아보자.


2.1 이벤트 로그의 이해

  Windows 시스템에서는 시스템의 로그가 이벤트 로그형식으로 관리되며, 이벤트 로그를 확인하기 위해서는 Windows의 Event Viewer를 이용하여야 한다. Event Viewer를 실행시키면 아래의 그림과 같은 모습을 나타내는 것을 확인할 수가 있다.


그림 2. 윈도우 이벤트 뷰어


  Windows 시스템은 응용 프로그램 로그, 보안 로그, 시스템 로그와 같이 세 가지 로그를 이벤트에 기록하며, OS 구성에 따라 디렉터리 서비스 로그, 파일 복제 서비스 로그, DNS 서버 로그가 추가될 수가 있다. 주요 이벤트 별 특징은 다음과 같다.


표 2. Windows 시스템 이벤트 로그 종류


이러한 로그들은 이벤트 뷰어를 통해 쉽게 확인할 수가 있다. 그렇다면 이벤트 뷰어를 통해 어떻게 나타나는지 아래의 그림을 통해 확인해보자.


그림 3. 이벤트 헤더와 설명


  각 이벤트를 확인하면 위와 같은 정보들이 나타난다. 위의 상자와 같은 부분에서 어떠한 경로에 있는지 등에 대한 정보가 있으며, 아래에는 해당 이벤트에 대한 정보들이 나타나 있다. 상단의 탭에서 Details를 누르면 좀 더 많은 정보들을 확인할 수가 있다.

  위 그림에서 하단의 Level이라 되어 있는 곳을 보자. Level에는 Information이라 되어 있다. 이처럼 이벤트 뷰어에서는 이벤트의 형태를 다섯 가지의 유형으로 구분한다. 이러한 다섯 가지 유형에 대해 아래의 그림을 통해 확인하자.


표 3. 이벤트 유형


2.2 이벤트 로그 설정 확인

  이벤트 로그에 대하여 개략적으로 알아보았다. 그렇다면 이러한 이벤트 로그의 설정을 확인하는 방법에 대하여 알아보자. 이벤트 로그를 설정하기 위해선 크게 두 가지 방법이 있으며 바로 레지스트리를 이용하는 방법과 이벤트 뷰어를 이용하는 방법이다. 이에 대해 알아보자.


레지스트리를 통한 확인

  레지스트리를 통해 확인하는 방법에 대하여 먼저 알아보자. 우선 Win+R을 통해 실행 창이 나타나면 regedit를 입력하여 레지스트리 편집기를 띄우자. 그리고 아래의 경로로 이동하면 이벤트 로그에 관한 설정이 나타나는 것을 확인할 수가 있다.


그림 4. 레지스트리를 통한 이벤트 로그 설정

위와 같이 나타나는 것을 확인할 수가 있다. 좌측의 키에는 응용프로그램, 보안, 시스템 등이 존재하는 것을 확인할 수가 있다. 우측은 각 항목들을 통해 로그에 대한 설정이 기록되어 있는 것을 확인할 수가 있다. 몇 가지 항목이 의미하는 것에 대하여 알아보자.

표 4. 레지스트리 - 항목 설명


이벤트 뷰어를 통한 확인

이벤트 뷰어에서도 각 이벤트 로그에 대한 속성을 변경할 수가 있다. 해당 속성을 변경하고자 한다면, 해당 이벤트의 속성에 들어가야 한다. 아래의 그림을 보자.


그림 5. 이벤트 뷰어 - Disabled


  현재 위의 그림에서 붉게 표시한 바와 같이, Driverframeworks-UserMode는 모니터링 설정이 되어 있지 않은 것을 확인할 수가 없다. 만약 모니터링 되고 있지 않은 항목에 대하여 모니터링이 필요하다고 생각되면 우측을 클릭하면 된다.


그림 6. 이벤트 뷰어 – 설정


우클릭을 하여 나타나는 목록 중에서 Properties에 들어가서 설정을 할 수가 있으며, Properties 밑에 있는 Enable Log를 통해서도 모니터링 하도록 설정할 수가 있다. 이렇게 설정을 바꾼 뒤, 해당 이벤트가 발생하게 되면 로그가 남는 것을 확인할 수가 있다.


그림 7. 이벤트 뷰어 - Enable

 

  

3. 이벤트 로그 감사 정책


  감사정책이란 개체 액세스, 로그온/로그오프, 감사 정책 설정 변경 등의 보안 관련 로그를 기록하며, 지정한 이벤트 범주의 사용자나 시스템 동작을 기록하도록 정책 설정이 가능하다. 감사 정책의 자세한 설명 및 로그 관리를 위한 권장 값은 다음과 같다.


표 5. 감사 정책 권장 값


3.1 로컬 보안 정책 설정

  이러한 감사 정책을 확인하기 위해 로컬 보안 정책을 확인해보자. 제어판에서 관리도구 중 로컬 보안 정책을 선택하거나 Local Security Policy를 찾아서 실행한 다음 Local Policies의 하위에 있는 Audit Policy를 확인하면 된다. 아래의 그림을 보자.


그림 8. Local Security Policy


  위와 같이 설정되어 있는 것을 확인할 수가 있다. 현재 감사하지 않음으로 되어 있는 것을 확인할 수가 있다. 이를 감사로 변경하면 감사가 시작된다. 이러한 감사정책을 구성하기 전에 유의해야 할 사항들에 대하여 알아보자.

  첫 째, 지나친 감사 범위 설정은 중요 로그 검색에 어려움을 동반한다. 불필요한 로그까지 저장되기 때문에, 검색의 어려움뿐만 아니라 시스템의 성능 저하 및 로그 관리의 어려움을 발생 시킬 수 있으므로 시스템 감사 구성에 필요한 항목을 사전에 선정하여야 한다.

  둘 째, 잘못된 이벤트 로그 크기 설정은 용량 한계로 시스템이 중지될 수가 있다. 시스템 장애가 발생한다는 것은 서비스를 위해 서버를 운영하는 기업에서는 많은 손실을 야기할 수 있다. Windows는 이러한 문제를 방지하기 위해 기본 설정으로 오래된 항목을 덮어씌우는 옵션이 설정되어 있다.


3.2 보안 템플릿을 통한 감사 정책 구성

  보안 템플릿이란 보안 구성을 표시하는 파일로 로컬 컴퓨터 및 그룹 정책 개체를 적용하거나 보안 분석에 사용된다. 이러한 보안 템플릿을 이용하면 손쉽게 감사 정책 구성을 공유할 수가 있고, 반대로 공유된 감사 정책을 구성할 수가 있다.


그림 9. 보안 템플릿 구성


  템플릿을 구성하는 방법은 위의 그림과 같다. 좌측의 키에서 Security Settings에 놓고 상단 탭의 Action을 선택하면 위와 같이 나타나는 것을 확인할 수가 있다. Import Policy를 선택하면 다른 템플릿을 통해 감사 정책을 구성할 수가 있다.

  반대로 현재의 감사 정책 구성을 다른 PC에 공유하거나 백업해놓고자 할 경우 Export Policy를 선택하여야 한다. 선택 후 저장 경로를 설정해주면 *.inf와 같은 형식으로 저장이 되는 것을 확인할 수가 있을 것이다.



4. 보안 감사 이벤트 설명


그렇다면 어떤 이벤트를 보아야 할까? 우선 이벤트 로그는 기존의 Evt에서 비스타 이후 부터 Evtx로 사용되고 있다. 실제 로그 파일의 헤더 및 구성의 변경이 있지만 대부분의 이벤트가 Evt ID 값에 4096 값을 더해주면Evtx 형태의 이벤트 ID 값이 된다. 각 감사에 따른 주요한 이벤트들의 목록의 아래의 표들과 같다. [표 출처 - http://elven.kr/archives/361 ]


개체 액세스 검사
파일, 폴더, 레지스트리 등 개체에 액세스 하는 사용자의 이벤트를 감시할지 여부를 결정합니다.
개체에 대한 접근 성공 여부를 감사하며, 개체 액세스 감사를 실행하면 보안 로그에 관련 로그가 기록됩니다.

 Type 1 – 이벤트 ID Type 2 – 이벤트 ID내용
 5604656개체에 대한 접근 허가
 5624658개체에 대한 핸들 닫힘 – 이벤트 종료
 5634659삭제할 목적으로 개체에 접근
 5644660보호된 개체의 삭제

계정 관리 감사
컴퓨터의 각 계정 관리 이벤트를 감사할지 여부를 결정합니다.
해당 이벤트의 예로는 사용자 계정 및 그룹 생성/수정/삭제, 암호 설정 및 변경 등이 해당됩니다.

 Type 1 – 이벤트 ID Type 2 – 이벤트 ID내용
6244720사용자 계정 생성
625 사용자 계정 유형 변경
6264722사용할 수 있는 사용자 계정
6274723암호 변경 시도
6284724사용자 계정 암호 설정
6294725사용하지 않는 사용자 계정
6304726삭제된 사용자 계정
6364732보안 사용 로컬 그룹 구성원 추가
6374733보안 사용 로컬 그룹 구성원 제거
6424738변경된 사용자 계정
643 변경된 도메인 정책
6444740사용자 계정 잠김

계정 로그온 이벤트 감사
계정 유효성을 검사하는 컴퓨터가 아닌 다른 컴퓨터에서의 로그온/로그오프 감사 여부를 결정합니다.
해당 감사 항목은 침입 감지에 유용하게 사용할 수 있습니다.

 Type 1 – 이벤트 ID Type 2 – 이벤트 ID내용
6804776로그인 성공 정보
6814777로그인 실패 정보

로그인 이벤트 감사
감사 이벤트를 기록하는 컴퓨터에 대해 사용자 로그온/로그오프 또는 네트워크 연결의 각 인스턴스 감사 여부를 결정합니다.
성공 감사는 로그온 시도가 성공할 때 생성되며, 이 항목은 침입 감지에 유용하게 사용할 수 있습니다.
해당 감사는 계정 로그온 이벤트 감사 보다 상제 정보를 로깅합니다.

 Type 1 – 이벤트 ID Type 2 – 이벤트 ID내용
5284624성공적인 로그인
5294625알 수 없는 계정이나 잘못된 암호를 이용한 로그인 시도
530 로그인 시 허용 시간 이내에 로그인 실패
531 사용지 금지된 계정을 통한 로그인 시도
532 사용 기간이 만료된 계정을 통한 로그인 시도
533 로그인이 허용되지 않은 계정을 통한 로그인 시도
534 허용되지 않은 로그인 유형을 통한 로그인 시도
535 암호 사용 기간 만료
537 위의 사항에 해당되지 않으나 로그인에 실패한 경우
5384634로그오프
539 로그인하려는 계정이 잠겨 있음
540 로그인 성공

프로세스 추적 감사
프로세스 활성화/종료 및 간접적 개체 액세스 등의 이벤트에 대한 자세한 추적 정보를 감사할지 여부를 결정합니다.
윈도우 XP SP2 및 서버 2003 SP1 이상에서 프로세스 추적 감사를 사용하면 윈도우 방화벽 구성 요소의 작동 모드 및 상태에 대한 정보도 기록합니다.

 Type 1 – 이벤트 ID Type 2 – 이벤트 ID내용
5924688새 프로세스 생성
5934689프로세스 종료
5944690개체에 대한 힌트의 중복
5954691개체에 대한 간접적인 접근

시스템 이벤트 감사
컴퓨터를 다시 시작하거나 종료할 경우 또는 컴퓨터 보안이나 보안 로그에 영향을 주는 이벤트가 발생할 경우 이를 감사할지 여부를 결정합니다. 이러한 이벤트는 매우 중요하기 때문에 조직의 모든 컴퓨터에 대하여 이 정책 설정을 [사용] 설정할 필요가 있습니다.

 Type 1 – 이벤트 ID Type 2 – 이벤트 ID내용
5124608윈도우 시동
5134609윈도우 종료
5144610LSA (Local Security Authority) 인증 패키지 로드
5154611신뢰할 수 있는 로그인 프로세스가 LSA로 등록
5164612저장 공간의 부족으로 인해 보안 이벤트 메세지 손실
517 보안 로그 삭제

로그온 유형에 따라 아래와 같이 분류할 수 있습니다.
이 중에서 “로그온 유형 10” 의 경우 원격 접속 이벤트로 사고 분석 시 가장 빈번히 활용됩니다.

로그온 유형 2대화식콘솔에서 키보드로 로그인 (KVM 포함)
로그온 유형 3네트워크네트워크를 통한 원격 로그인 (파일 공유, IIS 접속 등)
로그온 유형 4스케쥴스케쥴에 등록된 배치 작업 실행 시 미리 설정된 계정 정보로 로그인
로그온 유형 5서비스서비스가 실행될 때 미리 설정된 계정 정보로 로그인
로그온 유형 7잠금해제화면보호기 잠금 해제시
로그온 유형 8네트워크유형 3과 비슷하나 계정 정보를 평문으로 전송할 때 발생
로그온 유형 9새자격실행(RunAS)에서 프로그램 실행 시 /netonly 옵션을 줄 때
로그온 유형 10원격 대화식터미널 서비스, 원격 접속, 원격지원으로 로그인
로그온 유형 11캐시된 캐화식PC에 캐시로 저장된 암호로 자동 입력 로그인

  위의 표는 보안 감사 정책에 따라 구분된 것으로 실제 이벤트 뷰어를 통해서 확인할 때는 해당 항목을 찾는데 번거로움이 있을 수 있다. 따라서 아래의 그림과 같이 주요한 몇 개의 이벤트만 따로 정리할 수가 있다.



출처


* 블로그, 윈도우 이벤트 로그 분석 #기초

* 안랩, 전문가 칼럼, 윈도우 로그 관리 및 분석 방법

* MSDN, 보안 템플릿 정의


Comment +2

  • 감사합니다 2019.11.10 04:29

    좋은 정보 감사합니다~
    그럼 혹시 usb를 컴퓨터에 연결하면 “이벤트 뷰어-windows 로그-보안” 이곳에 작업범주 logon(이벤트 id 4624)랑 special logon(이벤트 id 4672)로 저장이 되어 보여지나요?

  • 감사합니다 2019.11.10 05:06

    안녕하세요 너무 좋은 정보 감사드립니다!’급한 마음에 이렇게 긴 질문을 드리게 됐는데 질문 드려도 괜찮을까요?ㅠㅠ
    너무너무 감사합니다ㅜㅜ
    1. usb가 접속되는 것을 로그로 모니터링 하도록 컴퓨터에 지정하지 않았을 경우에도, windows로그/보안에서 usb 꽂은 시간에 logon 됐다고 뜨면 usb 꽂은 걸로 알 수 있을까요?
    2. 제가 특정 시간에 usb가 연결 됐는지 알고 싶은데
    그 시간 동안(10분 넘게) windows로그/보안에 아무 이벤트도 저장된게 없으면 그 시간에 usb를 연결하지 않았다고 생각해도 될까요?

볼륨 섀도우 카피 ( Volume Shadow Copy )


  시스템 복원 지점은 윈도우 비스타 이후로 넘어오면서 '복원지점' 대신 '볼륨 섀도우 카피(Volume Shadow Copy)를 사용하고 있다. 시스템 복원 지점은 운영체제 재설치 없이 시스템을 백업한 과거의 특정 시점으로 복원하는 기능으로 운영체제 설치 시 기본으로 활성화되어 있다. 시스템 복원 지점은 아래와 같은 방법으로 설정할 수가 있다.

  위의 그림과 같이 System에서 좌측의 Advanced system settings를 클릭하여 들어가면 아래와 같은 창을 볼 수가 있다. 여기서 "System Protection"이라는 탭에 해당 항목들이 존재한다. Create...를 통하여 새로운 복원 지점을 형성할 수가 있으며, 사안의 "System Restore..."를 통해 이전에 설정된 복원지점으로 복원할 수가 있다.


접근 방법


  VSC에 접근하는 방법에 대하여 알아보자. 접근하기 위해선 해당 경로를 아는 것이 우선이므로 관리자권한으로 CMD를 열고 vssadmin list shadows 를 입력해주자. 그러면 현재 가지고 있는 VSC 만큼 그 결과가 출력될 것이다. 아래의 그림을 보자.

  2개의 VSC가 출력되고 있는 것을 확인할 수가 있다. 출력 결과를 통해 해당 섀도우 카피가 생성된 시점을 확인할 수가 있으며 해당 폴더에 접근하고자 할때 중요한 "Shadow Copy Volume"을 확인할 수가 있다. 위에 드래그 한 부분과 같이 해당 경로를 복사해놓자. 그 후 아래의 그림과 같이 mklink 명령어를 통해 링크폴더를 생성한다.

  그러면 해당 폴더에 접근 할 수 있는 것을 확인할 수가 있고, 필자는 C:\vsc에 링크를 걸었다. 링크를 설정한 후 해당 디렉터리로 이동하면 카피되어 있는 이전의 C:\의 모습이 보이는 것을 확인할 수가 있다.

 

복원 지점 생성 시점

  위에선 복원 지점을 직접 생성하는 방법에 대하여 알아보았다. 하지만 매번 직접 생성해야한다면 불편함이 있다. 따라서 기본적으로 시스템 복원지점이 생성되는 경우는 아래와 같이 나열할 수가 있다.

- 초기 시스템 검사 시 : 운영체제를 설치하고 처음 시작할 때, 시스템 검사와 함께 생성한다.

- 주기적인 생성 : 시스템이 켜져 있는 경우 24시간 마다 생성하며, 24시간 이상 꺼져 있는 경우에는 다음 부팅 시 생성한다.

- 프로그램 설치 및 제거 시 : 윈도우 설치 관리자(Windows Installer)에 의해 시스템을 설치하거나 제가할 때 생성한다.

- 자동 업데이트 시 : 자동 업데이트를 통해 다운 받은 업데이트 파일이 설치되기 전 자동으로 생성한다.

- 시스템 복원 전 : 시스템 복원 작업은 시스템을 변경시키므로 복원 작업 전에 생성한다.

- 사용자가 수동으로 생성 : 시스템 복원 마법사를 통해 사용자가 수동으로 생성한다.

  복원 지점은 한번 생성되면 다음 복원지점이 생성될 때까지 시스템을 모니터링하며 관련된 내용을 계속 추가한다. 다음은 3개의 복원 지점이 생성된 경우이다. 첫 번째 복원 지점(RP1)이 생성된 이후, 각 이벤트가 발생할때마다 관련된 백업 내용이 RP1 폴더에 계속 추가된다. 추가는 두번째 복원지점(RP2)이 생성될 때까지 계속된다. 현재는 3번 째 복원 지점이 생성된 이후에 관련 이벤트가 발생하는 중이다. 이때, 두번째 복원 지점(RP2)로 시스템을 복원했다면 "EVENT #1-3"이 적용된 이후의 상태로 복원 된다.


복원 지점에 백업되는 정보

  각 복원 지점 폴더에 추가되는 이벤트 관련 내용이라는 것은 이벤트가 발생할 때마다 관련된 내용이 폴더에 백업된다. 복원 지점 간의 발생하는 시스템의 모든 행위를 백업하기는 어렵다. 그러기 위해선 백업용 저장매체를 추가적으로 장착해야할 뿐 아니라 시스템 행위를 RAID 1과 같이 미러링 하는 것이므로 성능 하락의 원인이 될 것이다. 따라서, 윈도우는 기본적으로 복원에 가장 필요한 정보만 백업한다.

복원가능 : - 레지스트리    - 사용자 프로파일    - COM+DB    -WFP.dll캐시    - WMI DB    - IIS Metabase    - filelist.xml:<Include>설정항목

복원불가 : - DRM 설정    - SAM Hive의 password    - WPA 설정    - 사용자 프로파일에 저장되는 사용자가 생성한 데이터

HKLM\SYSTEM\ControlSet001\Control\BackupRestore\FileNotToSnapshot에 설정된 항목

HKLM\SYSTEM\ControlSet001\Control\BackupRestore\FilesNotToBackup 에 설정된 항목

- HKLM\SYSTEM\ControlSet001\Control\BackupRestore\KeysNotToRestore에 설정된 항목

filelist.xml에 <Include>가 설정되지 않은 항목


* 레지스트리에 설정된 복원 제외 항목

  복원 가능한 정보 중 가장 중요한 레지스트리와 filelist.xml에 대해 살펴보자. 우선 레지스트리는 복원 지점이 생성된 순간, 스냅샷 형태로 백업된다. 최초 복원지점 생성 시에는 레지스트리 전체가 백업된 다음, 복원지점이 추가될 때마다 변경된 부분이 백업된다. 이렇게 백업된 스냅샷은 레지스트리 분석 도구로 분석이 가능하다. filelist.xml은 모니터링할 목록을 설정하는 파일로 위치는 다음과 같다.

- %SystemRoot%\System32\Restore\filelist.xml

  Filelist.xml에서 확인할 수 있는 내용은 크게 3가지로 구분되어 있다. <FILES>는 모니터링할 파일이 설정되어 있으며, <DIRECTORIES>는 모니터링할 디렉터리가 설정되어 있고, 마지막으로 <EXTENSIONS>는 모니터링할 확장자가 설정되어 있다.

  이러한 각 노드는 다시 <Exclude>와 <Include>로 나뉘어 지는데 각 각 제외할 목록과 포함할 목록을 가지고 있다. 즉, 복원 지점에 백업하기 위해 모니터링할 파일, 디렉터리, 확장자에 대한 포함/제외 여부를 설정할 수 있다. 이렇게 세분화되는 이유는 백업에 따른 우선순위 때문이다. <FILE>가 우선 순위가 가장 높고 <EXTENSIONS>가 가장 낮기 때문에, 두 부분에서 각 각 포함/제외가 다르다면 우선순위에 따라 결정이 되는 것이다.

  이와 같이 filelist.xml에 설정된 파일들은 생성, 변경, 삭제 이벤트가 발생할 때마다 이벤트 내역, 경로, 파일의 복사본 등이 백업된다. 하지만 파일을 삭제할 때 Shift+Del과 같이 휴지통을 거치지 않고 삭제하게 되면 파일의 복사본은 백업되지 않고 삭제한 기록만 남게된다. 파일/ 폴더에 대한 모니터링은 시스템 복원 필터 드라이버(%SystemRoot%\System32\drivers\sr.sys)에 의해 추적 감시 된다. 해당 드라이버는 시스템 복원 기능에 의해 설정된 파일들이 변경이 일어날 때마다, 변경에 대한 로그를 기록하고 복사본을 생성한다.


복원 과정

  한번 직접 복원을 해보자. 해당 설정에 들어가 복원을 클릭하면 아래와 같이 나타난다. 여기서 영향을 받는 프로그램 검색을 클릭하면 복구를 하므로 사라지는 프로그램과 복구되는 프로그램의 목록을 볼 수가 있다. 이를 확인한 뒤 다음을 클릭하여 계속 진행하자.


  아래와 같이 마지막 화면 창이 나타난다. 이에 대해 경고문을 읽고 조심하여야한다. 복구를 통해 오히려 손실되는 프로그램이 있을 수도 있으므로 테스트는 VM환경에서 진행하는 것이 좋다.


  마침을 누르면 복원이 진행되는 것을 확인할 수가 있다. 여기서부턴 되돌릴 수 없으므로 유념하여야 한다. 복구가 완료되면 부팅 되는 것을 확인할 수가 있으며 설정에 따라 지정된 디렉터리 및 파일들이 남게 된다. 이렇게 쉽게 복원을 진행할 수가 있다.


활용 방안


삭제된 피알 복구

  filelist.xml에 <Include>되어 있는 파일들은 삭제될 경우 복사본인 백업 파일이 생성된다. 휴지통을 거치지 않고 Shift+Del 키를 이용한 경우 복사본이 남지 않지만, 삭제한 흔적은 확인할 수 있다. 따라서, 용의자 혹은 공격자가 악의적인 파일을 생성/실해한 후 흔적을 지우기 위해 파일을 삭제했다면 복원지점에서 관련된 흔적을 찾을 수 있다. 실제로 최근의 악성코드와 관련된 침해 사고는 자신의 흔적을 은폐하기 위해 관련 파일을 모두 삭제한다. 이 경우, 사건을 인지하고 초기 대응이 빠르다면 삭제된 흔적을 쉽게 발견할 수 있지만, 늦은 대응이라면 발견할 수 없는 삭제 흔적을 복원지점을 통해 발견할 수 있다.


설치/제거된 프로그램

  삭제된 파일과 마찬가지로 윈도우 설치관리자에 의해 설치/삭제된 프로그램 목록도 확인가능하다. 따라서, 윈도우 설치가 필요한 프로그램을 분석 시스템에 설치한 후 삭제하였더라고 복원지점을 확인하면 해당 흔적을 확인할 수 있다.


악의적인 드라이버 설치 흔적

  WHQL에 의해 인증되지 않은 드라이버를 설치 할 때도 복원지점이 생성된다. 따라서 커널 루트킷을 만들기 위해 설치하는 악의적인 드라이버의 흔적도 발견할 수가 있다.


악성코드 삭제 흔적

  PE 파일은 기본적으로 filelist.xml에 <Include> 되어 있다. 따라서, <Exclude>된 디렉터리가 아닌 곳에서 실행하고 삭제했다면 악성코드 복사본이 복원지점에 저장되어 있다. 따라서, 악성코드를 삭제하여 해당 파일을 찾을 수 없는 경우에도 타임라인 분석을 이용하다보면 복원지점에서 복사본이 발견되는 경우가 자주 있다.



참고

http://www.forensicswiki.org/wiki/Windows_Shadow_Volumes

http://forensic-proof.com/archives/2854

https://technet.microsoft.com/en-us/library/ee923636(v=ws.10).aspx

http://blogs.msdn.com/b/adioltean/archive/2008/02/28/a-simple-way-to-access-shadow-copies-in-vista.aspx

'Forensic > Theory' 카테고리의 다른 글

Windows Event Log (2) – 주요 이벤트 로그  (0) 2016.02.01
Windows Event Log (1) – 이벤트 로그의 개념  (2) 2016.02.01
Volume Shadow Copy 분석  (1) 2016.01.18
NTFS FIle System (9) $UsnJrnl  (0) 2016.01.16
NTFS File System (8) $LogFile  (0) 2016.01.13
NTFS File System (7) INDEX  (0) 2016.01.02

Comment +1

$UsnJrnl


  응용 프로그램이 특정 파일의 변경 여부를 파악하기 위해 사용한다. 기본적으로 Windows 7부터 활성화가 되어 있으며 비활성화 되어 있을 경우, Fsutil로 활성화 시 킬 수 있다. UsnJrnl은 $Max 속성과 $J 속성으로 구성되는데 $MAX는 변경 로그의 기본 메타 데이터를 저장하며 $J속성은 실제 변경 로그 레코드를 저장하고 있다.

  여기서 $J의 각 레코드들은 USN(Updata Sequence Number)정보를 가지며, 이러한 USN 정보를 통해 각 레코드들의 순서를 구분한다. 실제 USN 값은 $J 속성 내에서의 레코드의 Offset 값을 가지고 있으며, USN 값은 MFT 엔트리의 $STANDARD_INFORMATION 속성에도 저장되어 있다. UsnJrnl은 MFT 엔트리의 10번째인 $Extend 디렉터리 안에 존재하고 있다. /$Extend/$UsnJrnl 와 같은 경로를 가지고 있다.

 기록 되는 로그 데이터의 양은 일반적으로 컴퓨터를 계속 사용할 경우 1~2일 정도의 로그가 남으며, 규칙적(하루 8시간)으로 사용할 경우 4~5일 정도의 로그가 남는다.


$UsnJrnl 구조


$Max 속성의 구조

  $Max 속성은 32 Byte의 고정된 크기를 가지며 해당 속성에 저장되는 정보는 아래와 같이 로그 데이터의 최대 크기, 그리고 $UsnJrnl 파일의 생성시간, 마지막으로 현재 저장된 레코드 중 가장 작은 USN 값을 갖으며, 해당 값을 통해 $J 속성 내 첫 번째 레코드로 바로 이동이 가능하다.


$J 속성의 구조

  $J 속성은 가변적은 크기를 가지며, 로그 레코드들이 연속적으로 나열된다. 또한 속성의 앞 부분은 0으로 채워진 "Sparse Area"를 가지고 있다. 아래의 그림은 내 PC의 $UsnJrnl:$J를 나타낸 것으로 0부터 0x57800000 전 까지는 모두 0으로 채워져 있는 것을 확인할 수가 있다. 이러한 구조를 가지는 이유는 운영체제가 $J 속성에 저장되는 로그 데이터의 크기를 일정하게 유지하려고 하기 때문이다.

  $J 속성은 새로운 로그 레코드들이 할당 될 때마다 속성 끝에 추가되며, 추가된 레코드들의 총 크기가 "Allocation Size"를 넘으면 추가 레코드들을 포함하여 전체 로그 데이터의 크기가 "Maximum Size"를 넘는지 확인한다. 만약 전체 로그 데이터의 크기가 "Maximum Size"를 넘는다면 로그 데이터의 앞 부분을 "Allocation Size" 만큼 0으로 채워 "Sparse Area"로 만든다.

  따라서 $J 속성의 논리적인 크기는 계속 커지지만 실제 데이터가 할당된 영역은 일정하게 유지되며, 일반적으로 0x2000000~0x23FFFFF의 로그 데이터를 저장한다.

  MFT Reference Numbr 대신 Parent MFT Reference Number를 사용하는 이유는 전자를 사용할 경우, 해당 파일이 삭제되었을 때 전체 경로를 못 얻을 수도 있기 떄문이다. 

<Reason Flag>

<Source Information>

<File Attribute>



출처 및 참고

F-INSIGHT-NTFS-Log-TrackerKorean.pdf

Comment +0

개요


$LogFile?

  지금까지의 과정은 $MFT를 위주로 진행되어왔다. 이제 MFT Entry 2번($MFT가 0번)에 위치하는 $LogFile에 대하여 알아보자. 추후에 학습할 $UsnJrnl이 변경 로그라면 $LogFile은 트랜젝션 로그이다. 이 역시 각 볼륨마다 하나씩 존재하며 만약 NTFS가 정전이나 기타 오류로 인해 갑작스럽게 중단되면 운영체제는 $LogFile에 저장된 로그를 바탕으로 현재 진행되는 작업의 이전 상태로 파일 시스템을 복구한다.


  파일이나 디렉터리의 생성, 삭제, 데이터 작성, 파일명 변경 등 트랜잭션 작업 내용은 레코드 단위로 기록되며, $LogFile의 작업 레코드에 저장된다. 각 작업 레코드는 고유의 LSN($LogFile Sequence Number)를 가지며 이는 순차적으로 증가한다. 이러한 각 레코드는 복구를 위해 작업 데이터(Redo)와 작업 전 데이터(Undo)를 갖는다.


$LogFile Size



  일반적인 하드 디스크 볼륨에서는 64MB인것을 알 수가 있으며 볼륨 용량에 따라 크기가 달라질 수는 있지만 기본적으로는 최대 64 MB 이하이다. 만약 이러한 $LogFile의 크기를 변경하고자 할 때는 chkdsk 명령의 /L 옵션에 따라 크기 조절이 가능하며 '/L:파일크기(KB 단위)' 형식의 옵션을 주면 $LogFile의 크기를 변경할 수 있으며 크기를 지정하지 않는다면 위의 그림과 같이 현재 크기를 나타낸다.




구조


$LogFile의 전체적인 구조

  $LogFile은 아래의 그림과 같이 재시작영역(Restart Area)과 로깅 영역(Logging Area)으로 나뉘어진다. 각 영역의 구성 단위는 0x1000(4096)바이트 크기의 페이지이다. 재시작 영역은 파일의 가장 첫 두 페이지(0x0000~0x20000)에 해당하고 가장 마지막 작업에 대한 정보를 가지고 있다.


  로깅 영역은 재시작 영역 외의 영역(0x2000~)을 말하며 실제 작업 레코드들이 기록된다. 로깅 영역은 다시 버퍼 페이지 영역과 일반 페이지 영역으로 구성된다. 이에 대한 건 좀 더 뒤에서 이야기할 것이다.



$LogFile 재시작 영역 구조



  위에서 말한 바와 같이 재시작 영역은 가장 마지막 작업 레코드를 가리키며 이는 현재 작업 중인 내용으로 0x0000부터 두 페이지(0x2000)로 구성이 된다. 여기서 두 번째 페이지는 백업용으로 사용되며 각 페이지는 매직넘버(RSTR)로 시작한다. 운영체제는 이 영역에서 마지막 레코드에 대한 정보를 가져와서 파일 시스템을 복구하는 것이다. 위의 그림은 재시작 영역의 페이지 헤더 구조이며 Cuurent LSN 필드에 마지막 작업 레코드의 LSN 정보를 저장하고 있다.



  위 그림은 실제 $LogFile을 Hex Editor로 열어서 확인한 것으로 상단의 그림은 첫 번째 페이지 영역으로 매직넘버 RSTR로 시작하는 것을 확인할 수가 있다. 하단의 그림은 두 번째 페이지 영역(0x1000~0x2000)의 시작 부분으로 위와 같은 구조를 가지고 있으며 백업을 위한 공간임을 알 수가 있다.


* 재시작 영역은 운영체제가 어떠한 파일 시스템의 정리를 수행할 경우 어떠한 트랜잭션을 참고해야 하는지 판단하는데 도움을 주는 구조체이며, 성공적인 마지막 트랜잭션을 위한 어떤 로깅 영역을 가리키는 포인터를 포함한다.



$LogFile 로깅 영역 구조


  로깅 영역에는 실제 작업 레코드들이 기록되며 버퍼 페이지 영역과 일반 페이지 영역으로 나뉘어진다. 여기서 버퍼 페이지 영역은 첫 두 페이지(0x2000~0x4000)가 존재하고 두 번째 페이지는 위와 같이 백업용이며 순차적으로 레코드가 기록된다. 여기서 만약 버퍼 페이지가 레코드로 가득 차게 되면 페이지 내용을 일반 페이지 영역으로 기록을 넘기는 형식으로 작업이 진행된다. 따라서 가장 최근의 작업 레코드들은 버퍼 페이지 영역에 남게 된다.


  일반페이지 영역은 버퍼 페이지를 제외한 나머지 영역(0x4000~)을 말하며 버퍼 페이지가 모두 채워지면 기록된 내용을 받는 역할을 한다. 만약 작업 레코드들이 파일 끝까지 가득 차게 되면 위의 그림과 같이 일반 페이지 영역 시작부분부터 다시 덮어쓰는 방식으로 진행된다.


* Redo 필드는 어떤 동작이었는지에 대한 정보를 저장하며, Undo 필드는 어떤 동작을 어떻게 원래대로 되돌리는지 설명하는 정보를 저장한다.



Page 구조



  페이지는 $LogFile의 기본 구성 단위이며 크기는 0x1000(4096 Bytes)로 고정되어 있다. 페이지는 하나의 헤더와 다수의 작업 레코드들로 구성되어 있으며 마지막 레코드가 페이지를 넘어가면 다음 페이지에 이어서 기록이 된다. 위의 그림은 이 구조를 나타낸 것으로, 페이지 헤더에 매직 넘버('RCRD')가 나오는 것을 확인할 수가 있으며 Last LSN 필드의 정보를 통해 페이지 내에서 가장 나중에 기록된 작업 레코드의 LSN 정보를 획득할 수 있다. Next Record Offset 필드의 정보를 통해 페이지 내에서 가장 나중에 기록된 작업 레코드의 위치를 알 수가 있다.


 Magic Number

 "RCRD" 

 Last LSN 

 페이지를 넘어가는 레코드를 포함해서 가장 큰 LSN 

 Next Record Offset  

 Last LSN에 해당 하는 레코드의 페이지 내 Offset 

 Last End LSN 

 페이지를 넘어가지 않는 레코드들 중에 가장 큰 LSN 


  결국 운영체제는 재시작 영역의 Currsnt LSN 필드에서 가장 마지막에 기록된 LSN 정보를 가져와서 해당 LSN 정보를 Last LSN 값으로 가진 페이지를 찾고, 그 페이지의 Next Record Offset을 가져와 실제 마지막 기록된 레코드의 위치를 찾는다.



작업 레코드 구조



  작업 레코드에는 실제 트랜젝션 작업의 내용이 기록되며 위의 그림과 같이 여러 작업 레코드가 순차적으로 모여서 하나의 트랜젝션 작업을 이룬다. 가장 첫 레코드를 Checkpoint 레코드라 하며 마지막 레코드를 Commit 레코드라 한다. 그 외 중간에 있는 레코드들은 Update 레코드라 한다.


  Checkpoint 레코드 외의 레코드들은 자신의 이전 작업 레코드의 LSN 값을 가지고 있다. 따라서 파일 시스템 복구 시, 운영체제는 트랜젝션 작업을 구성하는 레코드들을 역추적하면서 각 레코드들의 Undo 데이터를 사용하여 복구할 수가 있다.


[이미지 출처 - zrungee Blog]


  작업 레코드는 레코드 헤더와 데이터 영역으로 구성된다. 레코드 헤더는 고정된 0x58 크기를 가지며 데이터 영역은 Redo와 Undo 데이터가 들어가기 때문에 크기가 가변적이다. 따라서 작업 레코드의 크기도 가변적이며 큰 레코드는 여러 개의 페이지를 사용하기도 한다. 그리고 하나의 작업 레코드가 끝나면 바로 이어서 다음 작업 레코드가 이어진다. 상세한 작업 레코드 헤더 구조는 위의 그림과 같으며 각 필드에 대한 설명은 아래의 표와 같다.



  Redo Op 필드와 Undo Op 필드는 실제 레코드가 어떠한 작업을 수행하였는지에 대한 정보를 가진다. 각 Op가 가지는 연산 코드의 의미는 아래와 같다.




출처 및 참고

http://www.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?curPage=1&menu_dist=2&seq=19518

http://zrungee.tistory.com/206

'Forensic > Theory' 카테고리의 다른 글

Volume Shadow Copy 분석  (1) 2016.01.18
NTFS FIle System (9) $UsnJrnl  (0) 2016.01.16
NTFS File System (8) $LogFile  (0) 2016.01.13
NTFS File System (7) INDEX  (0) 2016.01.02
Cluster Run 직접 확인해보기 - MFT엔트리찾기  (0) 2015.12.31
NTFS File System (6) MFT $SIA & $FN $DATA  (0) 2015.12.31

Comment +0

NTFS 인덱스


 NTFS에서는 자료들을 빠르게 검색할 수 있도록 인덱스 구조로 관리하고 있다. 이의 대표적인 예가 바로 디렉터리이며 이러한 인덱스의 구조에 대하여 알아보자. NTFS가 인덱스로 관리하는 데이터는 아래의 표와 같다.

 이러한 인덱스 관리 방법으로는 트리를 사용하는데 NTFS에서 사용하는 B 트리의 형태는 아래의 그림과 같다. 루트 노드는 최상위에 존재하며 시작점이 되는 노드이며 하위의 자식 노드를 가질 때 자신보다 왼쪽은 작은 값, 오른쪽은 자신보다 큰 값이 위치한다. 이를 통해 자신보다 낮은 노드를 찾기 위해선 왼쪽으로 가면 되고 높다면 오른쪽으로 가면 되는 편의성을 갖는다.

 위의 그림과 같이 NTFS의 Index Node는 마지막에 노드의 끝을 알려주는 End of Node가 포함되어 있다. 이러한 End of Node를 제외하고 n개의 Index 엔트리를 담는 인덱스 노드가 가질 수 있는 자식의 노드 수는 n+1개가 되며, 위 그림에선 Root Index Node가 담고 있는 Index Entry는 3개 인 것을 알 수가 있다.

 Index Node는 크게 Index Node Header와 Index Entry로 나눌 수가 있다. 인덱스 엔트리의 크기는 가변적이기에 마지막에 End of Node가 필요한 것이다. 이러한 인덱스 노드는 독립적으로 존재하지 않으며 반드시 $INDEX_ROOT속성이나 $INDEX_ALLOCATION 속성에 속해야 한다. 어떤 노드가 $INDEX_ROOT에 속한다면 그 노드는 index의 최상위 노드(Root Index Node)가 되는 것이다. 최상위 노드를 제외하면 다른 모든 노드들은 $INDEX_ALLOCATION 속성에 속하게 된다.

 인덱스 노드가 $INDEX_ROOT 속성에 존재하는 경우 $INDEX_ROOT 헤더가 index node header 앞에 붙고, $INDEX_ALLOCATION 속성에 존재할 경우 Index Record 헤더가 앞에 붙게 된다. 아래의 그림에서 이를 확인할 수가 있다. $INDEX_ROOT에 속한 경우 $INDEX_ROOT 헤더가 붙는 것을 확인할 수가 있으며 그 자식 인덱스 노드들은 $INDEX_ALLOCATION 속성에 속하기 때문에 Index Record 헤더가 붙는 것을 확인할 수가 있다.


구조


 우선 아래의 첫번째 사진은 $INDEX_ROOT에 속한 경우의 구조이며, 아래의 경우 $INDEX_ALLOCATION 속성에 속했을 때의 구조를 나타내고 있다. 두 그림에서와 같이 공통적으로 Index Node Header를 포함하고 있으며 해당 헤더 앞에 각 각 Index Root Header와 Index Record Header가 오는 것을 확인할 수가 있다. 우선 공통적으로 나타나는 Index Node Header의 구조와 Index Entry의 구조에 대하여 먼저 살펴보자.


INDEX NODE HEADER

• Offset to Start of index entry list : 인덱스 엔트리 목록의 시작 위치(첫번째 Index Entry가 있는 위치 값)

• Offset to Endof used portion of index entry list: 인덱스 엔트리의 실제 크기(인덱스 노드 헤더 포함)

• Offset to end of Allocated index entry list buffer : 인덱스 엔트리의 할당 크기(인덱스 노드 헤더 포함)

• Flags

0x00: 인덱스 노드의 자식노드가 없음        0x01: 인덱스 노드의 자식노드가 있음

 Flag를 제외하고 어떤 크기나 위치를 담는 항목으로 해당 인덱스 노드가 담고 있는 Index Entry 중 하나라도 자식을 가진다면 Flags 항목 값은 1로 설정이 된다. 이와 똑같은 의미를 갖는 Flag가 각각의 Index Entry에도 존재하고 있다. 위 4개의 항목 중 2번째와 3번째 항목의 값을 통해 Index Node에서 삭제된 Index Entry의 정보를 조사할 수 있다. 아래의 그림과 같이 실제 크기와 할당된 크기의 차이를 통해서 확인할 수가 있다.


INDEX ENTRY

•File Reference Address for filename : 해당 파일 및 디렉터리의 파일 참조 주소

•Length of this entry : 해당 인덱스 엔트리의 총 크기

•Length of content : 해당 인덱스 엔트리가 담고있는 $FINE_NAME 속성의 크기

•Flags 

0x01: 자식 노드가 존재         0x02: 노드의 마지막 엔트리(End of Node)

•VCN of child node in $INDEX_ALLOCATION 

해당 인덱스 엔트리가 자식노드를 가지는경우 $INDEX_ALLOCATION 속성에 위치한 자식 인덱스 노드의 위치

 위에서 $FILE_NAME Attribute가 되어 있는 이유는 해당 크기가 가변적이기도 하며 End of Node에선 이 항목이 생략되어 있기 때문이다. 마지막 항목의 경우 해당 인덱스 엔트리가 자식 노드를 가질 경우에 이 항목이 존재하는 것으로 이 항목의 위치를 알아내는 방법은 2번째 항목인 'Length of this entry'에서 -8을 하면 된다. 이를 통해 얻은 VCN 값은 $INDEX_ALLOCATION 속성에 담겨 있는 자식 Index Node의 위치 값이다.


INDEX_ROOT Header

•Type of attribute in index : 인덱스 엔트리가 담고 있는 속성 식별값(디렉터리의 경우0x30, $FILE_NAME)

•Collation sorting rule : 인덱스 엔트리가 담고 있는 형식(형식에맞게정렬됨)

0x00: Binary / 0x01: File Name / 0x02: Unicode String / 0x10: Unsigned Long /

0x11: SID / 0x12: Security Hash / 0x13 : Multiple Unsigned Logs

•Size of each index record in bytes : $INDEX_ALLOCATION 속성이 가지는 인덱스 레코드의 바이트 크기

•Size of each index record in Clusters : $INDEX_ALLOCATION 속성이 가지는 인덱스 레코드의 클러스터 크기

 해당 속성은 인덱스의 최상위인 루트에 해당하는 인덱스 노드를 담는 속성으로 인덱스 크기가 작으면 $INDEX_ROOT만으로 인덱스를 구성하고자 한다. 이 경우 거주(Resident) 형식이기 때문에 많은 Index Entry를 담지 못한다. 크기가 점차 커지므로 모두 담지 못할 경우 $INDEX_ALLOCATION 속성을 만들어 커진 인덱스를 관리한다. $INDEX_ALLOCATION 속성이 생기면 Index Record의 할당을 관리하기 위한 $BITMAP 속성도 같이 생긴다.


INDEX RECORD HEADER

•Signature : $INDEX_ALLOCATION의 시그니처(“INDX”)

•Offset to Fixuparray : Fixuparray의 위치

•Number of entries in Fixuparray : Fixuparray에 저장된 항목의 수

•$LogFileSequence Number (LSN) : $LogFile에 존재하는 해당 파일의 트랜잭션 위치 값

•The VCN of this record in the full index stream : $INDEX_ALLOCATION에서 해당 인덱스 레코드가 저장된 위치- Index Record의 시작 VCN

 최상위 인덱스 노드를 제외한 모든 인덱스 노들들은 이 속성에 담기게 된다. 이 속성의 내용은 Index Record라는 구조체들로 구성되며 하나의 Index Record는 하나의 Index Node를 담고 있다. 아래의 그림과 같이 Index Node의 구조는 $INDEX_ROOT의 속성안에 담기는 것과 동일하며 Index Node가 $INDEX_ALLOCATION 속성에 존재할 경우 Index Record라는 구조 안에 존재하게 된다는 것이다.

 마지막 항목의 시작 VCN은 해당 Index record가 $INDEX_ALLOCATION 속성 데이터 내에서 어느 부분에 존재하는지를 알 수 있도록 해주는 항목이다. VCN과 관련하여 아래의 그림을 참고하자.


$BITMAP

 인덱스 레코드의 할당 상태를 관리하기 위한 속성으로 위와 같은 할당 정보를 표현한다. 할당 정보를 관리하는 데이터로는 $MFT와 $INDEX_ALLOCATION이 있으며 위의 그림과 같은 구조를 지닌다. 아래의 그림과 같이 되어있을 경우 1번째와 3번째 MFT Entry가 현재 사용중임을 나타낸다.




정리


 NTFS가 인덱스를 관리할 때 3가지 속성을 사용한다고 이야기 하였다. $INDEX_ROOT 속성은 최상위 Index Node를 담고 있는 속성으로 이 속성만으로 구성이 될 수 있는데 이는 '작은 인덱스'라 한다. Index Entry가 너무 적어서 $INDEX_ROOT 속성만으로 충분하기 때문이다. 작은 인덱스의 구조는 아래의 그림과 같다.

 이에 반해 $INDEX_ROOT 뿐만이 아니라 $INDEX_ALLOCATION, $BITMAP 모두 갖춘 인덱스를 큰 인덱스라 하며, 일반적으로 볼륨에 담겨 있는 대부분의 인덱스가 이러한 형태이다. 위의 작은 인덱스 구조에 다른 파일들이 추가되었을 경우에 대하여 알아보자.

우선 $INDEX_ROOT 속성에 있던 BBB.TXT 파일의 Index Entry가 자식 노드인 것을 알 수가 있으며, $INDEX_ALLOCATION, $BITMAP 속성이 추가된 것을 확인할 수가 있다. $INDEX_ALLOCATION 속성이 관리하는 Index Record 2개가 클러스터를 할당 받아 새로 생성되어 그 안에 Root Index Entry를 가지고 있게 된다. EEEEE.TXT 부분을 보게 되면 파일의 Index Entry 2개가 존재하는데 DOS 형식의 이름을 가지지 않은 파일들은 2개의 Index Entry를 가지고 있게 된다. $Bitmap 속성의 경우 각각의 bit들은 Index Record들과 1대 1로 대응한다.


출처 및 참고

http://blog.naver.com/PostView.nhn?blogId=bitnang&logNo=70184788707&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

(FP) NTFS.pdf

Comment +0

직접찾아보자


 NTFS File System을 공부하며 직접 MFT 엔트리를 찾아보고 싶었다. 그렇기에 간단한 실습을 준비해보았다. 우선 바탕화면에 찾기 쉽도록 독특한 이름의 파일을 생성해야 한다 생각했으며 파일의 이름은 ^^%%&&.txt이며 $DATA의 내용도 찾기 쉽도록 ^&*^&*^&*....과 같이 하였다.


 우선 해당 MFT 엔트리를 찾기 위해 HxD를 관리자 권한으로 열어 C: 드라이브를 연다. 그러면 OEM ID - NTFS와 함께 나타나는 것을 확인할 수가 있다. 그 다음 해당 제목인 ^^%%&&.txt를 유니코드 문자열로 찾도록 한다. 그리고 검색을 시작한다. 조금 시간이 걸리기도 하며 FILE 시그니처가 아닌 다른 부분에서도 몇 번 같은 문자가 확인이 된다. 계속 지나가 FILE 시그니처와 2섹터를 가지며 해당 이름을 포함한 부분을 찾아보았다. 그렇게 찾은 주소가 063f490800 이였다. 아래의 그림을 보자.


 속성 식별 값과 속성 크기를 통해 4개의 속성 식별 값이 존재하는 것을 확인할 수가 있다. $SIA, $FN, $OBJECT_ID, 그리고 이번 포스팅의 포인트인 $DATA (Non-resident)가 있다. 다른 부분은 대체로 일반 적인 모습을 띄고 있다.

 이제 $DATA 부분을 보면 Non-resident 속성이기 떄문에 클러스터 런이 존재하는 것을 확인할 수가 있고 위의 그림과 같이 0x41이 클러스터 런의 첫 바이트이다. 이에 대한건 이전에 포스팅하였으므로 설명은 생략하고 바로 해석을 해보자.

 뒷자리가 1이므로 해당 클러스터는 1개가 있다는 것을 알 수가 있고 해당 위치는 드래그한 부분과 같이 0x01D39E47이라는 것을 알 수가 있다. 여기서 원래는 0x01D39E47에 해당 데이터가 존재하는 줄 알았는데 아니였다. 바로 볼륨의 시작에서부터 1D39E47 번째 클러스터에 위치하고 있다는 것이였다. 따라서 뒤에 000을 붙여주면 해당 오프셋이 나온다. 0x01D39E47000을 보면 위의 그림과 같이 제대로 해당 $DATA의 내용이 출력되는 것을 확인할 수가 있다. 만약 파일의 크기가 작다면 클러스터런이 아니라 $DATA의 속성헤더 뒤에 내용이 나왔을 것이다.


 이러한 NTFS에선 하나의 파일이 여러 곳에 분산되어 저장되어 있더라도 해당 파일의 MFT엔트리를 참고하여 $DATA 클러스터런을 통해 각 각 떨어진 데이터들이 연속된 곳에 저장된 것처럼 보이게 한다. 분산된 데이터를 HxD로 열면 하나로 쭉이어져있는 것처럼 출력되는 것은 운영체제가 이를 클러스터 런을 따라 출력을 해주므로 가능한 것이다. 따라서 비연속적으로 저장된 데이터는 이러한 MFT엔트리를 통해 따라가야할 것이다.



'Forensic > Theory' 카테고리의 다른 글

NTFS File System (8) $LogFile  (0) 2016.01.13
NTFS File System (7) INDEX  (0) 2016.01.02
Cluster Run 직접 확인해보기 - MFT엔트리찾기  (0) 2015.12.31
NTFS File System (6) MFT $SIA & $FN $DATA  (0) 2015.12.31
NTFS File System (5) MFT -Attribute  (0) 2015.12.30
NTFS File System (4) MFT  (0) 2015.12.29

Comment +0

MFT - Attribute

$STANDARD_INFORMATION ($SIA)

 모든 파일에 기본적으로 존재하는 속성이다. 기본적으로 존재하는 속성인 만큼 파일의 시간정보, 파일 특성, 소유자 및 보안 ID 등의 기본적인 속성 정보를 가지고 있다. 속성 타입 번호는 0x10(16)임을 이전에 확인할 수가 있었다. 속성의 크기는 윈도우 버전에 따라 조금 상이한데 윈도우2000,XP이상(72바이트), 윈도우NT(48바이트)를 갖는다. 이제 구조에 대해서 한번 살펴보자. 

속성 헤더가 먼저 나온 뒤 $STANDARD_INFORMATION의 속성내용들이 나오는 것을 확인할 수가 있다. 각 항목에 대한 설명은 아래의 표와 같다.


 위의 그림은 실제 내 PC $MFT의 내용이다. 이를 해석하면 다음과 같다. 우선 생성 시간, 수정시간, MFT수정시간, 마지막 접근 시간이 모두 같은 것을 확인할 수가 있다. 이는 $MFT가 생성된 시점으로, 즉 포멧된 후의 시점이라는 것이다. 이를 통해서도 언제 포멧을 했는지 알 수가 있다.

 시간 값 8 바이트를 변환하면 Wed, 29 July 2015 11:41:01 +0900 이라는 것을 알 수가 있다. 플래그에 대해 알아보면 0x06임을 알 수가 있다. 이는 시스템 파일과 숨긴파일이라는 것을 알 수가 있다. 그외에 버전 최대값, 버전 번호, 클래스ID, 소유자 ID, Quota Charged는 사용하지 않는 것을 확인할 수가 있으며 보안 ID는 0x100임을 확인할 수 있고, 마지막으로 USN이 0임을 알 수가 있다.



$FILE_NAME ($FN)

 자주 쓰이는 속성 중 하나인 $SIA에 대해 위에서 알아보았다. 이제 또 다른 하나인 $FILE_NAME에 대하여 알아보자. $FN은 파일의 이름을 저장하기 위해 존재하며 다양한 부가 정보들이 저장되어 있다. NTFS에선 빠른 탐색을 위해 만들어 둔 인덱스 구조인 $I30에도 저장되며 일반적으로 파일 이름 변경을 제외하고는 $I30 인덱스의 $FILE_NAME 속성만 갱신한다. $FN의 구조는 아래의 그림과 같다.

 $MFT의 $FN 속성의 모습이다. 공통헤더와 Resident헤더가 존재하고 그 뒤부터 부모 디렉터리의 파일 참조 주소를 시작으로 속성내용이 시작 나온다. 우선 붉은 색의 8바이트 0x00050000000005는 루트 디렉터리의 MFT 엔트리 번호이며 생성, 수정, MFT수정, 마지막 접근 시간은 모두 같은 것을 확인할 수가 있으며 이는 변환하면 Wed, 29 July 2015 11:41:01 +0900 임을 알 수가 있다.

 해당 파일이 할당된 크기는 0x0000000000004000으로 크기는 4 KB로 할당되었던 것과 실제 사이즈도 4KB임을 확인할 수가 있다. Flags의 값은 $SIA에서 보았듯이 시스템파일과 숨긴파일이라는 것을 알 수가 있다. 해당 속성의 Reparsepoint는 없는 것을 확인할 수가 있으며 파일 이름의 길이가 4인 것과 표현 방식이 Win32&DOS인 것을 확인하고 마지막에 해당 이름의 16진수 값인 $MFT가 유니코드의 형태로 나타나는 것을 확인할 수가 있다.


$SIA & $FN - Time Stamp 

$SIA와 $FN 둘 다 4가지 시간 값을 갖는다. 생성시간, 수정시간, MFT Record 업데이트 시간, 최근접근시간이 존재하는데 이 두개의 속성은 약간의 차이를 갖는다. $SIA는 생성시간을 제외하고 모두 업데이트를 한다. 이에 반해 $FN은 폴더/파일 생성시 동일한 시간을 기록하고 다시 변경하지 않는다(단, 폴더 이름 변경 시 예외 - 폴더 이름 변경시 원래 $SIA의 시간과 같게 Update한다.).


$DATA

 $DATA는 파일의 데이터를 저장하는 속성이다. 파일의 데이터가 약 700 Byte 이상이면 Non-Resident로 저장된다고 이전 포스팅을 통해서 확인할 수가 있었다. 이 경우 별도의 클러스터를 할당 받아 데이터를 저장하며 이를 클러스터 런을 통해 관리한다는 것을 살펴보았다. 만약 Resident라면 속성 헤더 이후에 바로 속성 내용인 파일 데이터 스트림 위치가 나온다. 

 하나의 파일에서 $DATA 속성을 2 이상 가질 수가 있는데 이를 ADS라 한다. ADS에 대해선 이전에 http://kali-km.tistory.com/entry/ADS 에서 설명을 하였으므로 자세한 설명은 하지 않겠다. 다만 ADS는 반드시 속성 이름을 가지고 있어야하며, ADS 속성은 파일크기에 포함되지 않는다는점, ADS에 악의적인 데이터를 숨길 수가 있다는 점과 마지막으로 폴더가 $DATA를 갖는 경우도 일반적이지 않으므로 유의하여야 한다.


ADS

좌측의 그림은 XXX##xxx.txt라는 파일을 생성한 뒤 해당 MFT를 찾은 것이며, 우측은 해당 파일에 'ads-km'이라는 이름의 ADS를 추가한 것이다. 그림을 통해 차이를 확인할 수가 있다. 우선 차이나는 부분은 우측의 붉은 부분을 통해 표시하였으며 파란 상자는 속성 식별값이 위치한 것이다.

 그림에서와 같이 기존의 파일은 $SIA, $FN, $DATA와 같이 기본적인 3가지 속성을 가지고 있지만, 우측은 4개의 속성을 가지고 있는 것을 확인할 수가 있다. 우선 위에서부터 차이나는 점에 대해 하나 하나 짚어보자.

 MFT Entry Header에서는 $LogFile Sequence Number(LSN)의 값이 변한 것으로 이는 $LogFile에 존재하는 해당 파일의 트랜잭션 위치 값이 변화했음을 의미한다. 그 다음 0x168에서 0x1A0로 변한 것은 사용하는 MFT Entry 크기가 360 Byte에서 416 Byte로 증가했음을 의미한다. 다음 속성 ID 값도 변화한것을 볼 수가 있다. 이제 0x30 부분을 보면 0x05에서 0x0C로 변화한것은 데이터 무결성을 판단하기 위해 존재하는 Fixup Array이다. 이 Fixup Signature의 값 또한 변화하였음을 확인할 수가 있고 각 섹터의 마지막 2 Byte도 변화했다는 것을 알 수가 있다.

 이제 Attribute 부분에 대하여 알아보자. 우선 0x10인 $SIA에서 생성 시간과 접근시간은 그대로 인것을 확인할 수가 있다. 하지만 파일의 수정 시간과 MFT Entry 갱신 시간은 변화하였음을 알 수가 있다. 또한 USN의 값도 변화한 것을 확인할 수가 있다. $FN은 $SIA와는 다르게 시간 값에도 아무런 변화가 없음을 확인할 수가 있다.

 첫 $DATA 속성을 보면 별 다른 변화가 없지만, MFT Entry의 End Marker인 "0xFFFFFFFF"이 더 뒤로 밀려났다는 것을 확인할 수가 있다. 그 외에 $DATA 속성은 변화가 없다. 하지만 이제 새로 추가된 $DATA는 기존의 메인 스트림에 더해 추가적으로 생성된 것으로 새로운 속성 값을 갖는다. 정확히 첫 $DATA의 End Marker가 있던 곳부터 시작하는 것을 확인할 수가 있다.

 여기서 ADS는 반드시 속성 이름을 갖는다고 말하였다. 그렇기에 속성의 공통 헤더에서 속성의 이름 길이가 6으로 지정된 것을 볼 수가 있고, 실제 이 ADS의 이름은 'ads-km'과 같이 6글자로 지정되었다. 이름이 존재하기에 해당 이름이 나타나는 것을 확인할 수가 있고 이름이 끝난 뒤 해당 속성의 내용(ADS에 기록된 내용)인 'This is ADS'가 존재하는 것을 확인할 수가 있다. 이 뒤에 End Marker가 나오는 것 또한 확인할 수가 있다.



출처 및 참고

http://forensic-proof.com/archives/600



'Forensic > Theory' 카테고리의 다른 글

NTFS File System (7) INDEX  (0) 2016.01.02
Cluster Run 직접 확인해보기 - MFT엔트리찾기  (0) 2015.12.31
NTFS File System (6) MFT $SIA & $FN $DATA  (0) 2015.12.31
NTFS File System (5) MFT -Attribute  (0) 2015.12.30
NTFS File System (4) MFT  (0) 2015.12.29
NTFS File System (3) VBR  (0) 2015.12.29

Comment +0