Windows 파일 무결성 – 파일 해쉬 알고리즘 사용하기(FCIV,FileVerifier)

Windows 파일 무결성

포렌식에 관심 있는 분들을 일부 알고 있듯이 컴퓨터 증거 자료는 법적으로 증거로 인정받기가 어렵다. 전자식으로 되어 있는 데이터는 원본이라는 보장을 하기가 어렵기 때문이다. A라는 파일이 이동되면서 처음 수집한 A라는 것을 증명하기가 쉽지 않다.

우리가 사용하는 무수히 많은 컴퓨터 내의 데이터들은 수시로 변경되고, 그 변경된 내용을 외부에 노출되지 않을 수 있다. 이는 전자 데이터의 특성으로 데이터가 변경되지 않았다는 것을 증명하는 것은 매우 어려울 것이다. 아래 그림과 같이 IAMYOURFATHER를 IAMYOURMOTHER로 디스크에 직접 수정할 경우 파일 드라이버를 거치지 않기 때문에 업데이트 날짜 정보가 반영되지 않게 된다.

이 같은 경우, 파일의 변경 유무를 파일 접근 날짜로 판단하게 되면, 해당 파일의 변경 유무는 여전히 알 수 없게 된다.

↓파일의 마지막 접근과 수정한 시간을 정상적인 경로로 수정하지 않은 경우, 변경되지 않는다.

[그림] 디스크에 직접 쓰기를 할 경우 파일의 변경 유무를 속성으로 알 수 없다

이러한 파일 직접 접근은 앞서 나왔던 유명 악성코드 TDL처럼 MBR을 감염시키는 악성코드의 방식과 같다.

그렇다면 이를 해결하기 위해서 우리는 어떻게 진행해야 할까? 이에 대한 해법은 바로 무결성 검사, 해쉬 알고리즘을 이용한 비교라 할 수 있다. 즉 원본에 대한 고유한 해쉬값을 만들고, 차후 원본의 해쉬값과 비교하여 값이 동일하다면 원본과 같다고 증명할 수 있다. 이를 전자 지문이라고도 한다.

무결성이란 입력 데이터의 고유한 값을 그대로 유지하고 있음을 증명할 수 있는 자료를 남겨두는 것으로써, MD5(Message Digest)와 같은 해시 알고리즘이 많이 사용된다(요즘은 SHA 알고리즘으로 전향하는 추세). 그래도 과거 날렸던 암호화 알고리즘인 만큼 이에 대해 알아보도록 하자. MD5는 입력 데이터(문자열이거나, 데이터이거나)로부터 128비트의 메시지로 결과값을 반환하게 된다. 이 해쉬 결과값이 이후 기존 내용과 동일한 내용인지를 확인할 수 있는, 즉 무결성을 검증하는 데 사용되게 된다. 이외에도 SHA(Secure Hash Algorithm)도 널리 사용되는 알고리즘이다. 미국의 국가 안전 보장국(NSA)에서 설계한 만큼, TLS, SSL, PGP, SSH, IPSec 등지에서 널리 사용되고 있으며, 제공하는 종류도 다양하다(SHA-0, SHA-1, SHA-2(SHA-224, SHA-256, SHA-384, SHA-512 등이 있다).

여기서 암호화 방식을 설명하기는 어려울 것 같다. 수학 공식과 암호화 알고리즘을 설명하여도, 좀처럼 이해가 어려울것이다. 여기서는 MD5와 SHA-1 알고리즘을 수행하는 프로그램 코드를 작성해 보고, 이를 통해 무결성을 유지할 수 있는 방법에 대해 확인해 보자.

md5hash.cs
using System;
using System.Collections.Generic;

using System.Linq;

using System.Security.Cryptography;

using System.Text;

namespace MD5hash

{


class
Program

{


static
string getMd5Hash(string input)

{


// MD5CryptoServiceProvider 개체 중 MD5를 초기화한다.


MD5 md5Hasher = MD5.Create();


// 입력값 md5로 변환할 수 있도록 배열을 생성한다.


byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));


// Stringbuilder를 초기화 한다.


StringBuilder sBuilder = new
StringBuilder();

// 입력 문자를 하나씩 변환한다.


for (int i = 0; i < data.Length; i++)

{

sBuilder.Append(data[i].ToString(“x2”));

}


// 처리 결과를 보낸다.


return sBuilder.ToString();

}


static
string getSHAHash(string input)

{


// MD5CryptoServiceProvider 개체중 SHA1를 초기화한다.


SHA1 sha1Hasher = SHA1.Create();


// 입력값 md5로 변환할 수 있도록 배열을 생성한다.


byte[] data = sha1Hasher.ComputeHash(Encoding.Default.GetBytes(input));

// Stringbuilder를 초기화 한다.


StringBuilder sBuilder = new
StringBuilder();

// 입력 문자를 하나씩 변환한다.


for (int i = 0; i < data.Length; i++)

{

sBuilder.Append(data[i].ToString(“x2”));

}


// 처리 결과를 보낸다.


return sBuilder.ToString();

}


static
void Main(string[] args)

{


string hash1 = getMd5Hash(args[0]);


string hash2 = getSHAHash(args[0]);


Console.WriteLine(“입력데이터 “ + args[0] + “의 MD5 해쉬값: “ + hash1 + “”);


Console.WriteLine(“입력데이터 “ + args[0] + “의 SHA-1 해쉬값: “ + hash2 + “”);

}

}

}

[예제] 해쉬 알고리즘을 이용하여 결과값을 출력해 주는 C# 코드

위 코드를 컴파일한 후 실행해 보도록 하자. SHA-1은 160비트 해쉬 알고리즘으로, MD5보다 길이가 길다.

[그림] 입력값의 작은 변화에도 결과값은 큰 차이를 가져온다

이러한 해시 알고리즘은 문자열뿐만이 아니라 컴퓨터에서 사용되는 파일에도 적용할 수 있는데, 마이크로소프트에서 공개한 파일 무결성 체크 도구인 Fciv(File Checksum Integrity Verifier)에 대해 설명하고자 한다.

Fciv

이 툴의 다운로드 경로는 다음과 같다.

http://www.microsoft.com/download/en/details.aspx?id=11533

그럼 각 옵션에 대해 알아보도록 하자(유용한 명령은 굵게 표시하였다).

-add: 옵션을 명기하지 않으면 자동으로 실행되는 기본 옵션으로 파일 혹은 해당 디렉토리를 MD5로 표시한다. –add의 하위 옵션으로 아래와 같이 5가지를 이용할 수 있다.

-r: 재귀 처리를 진행한다(하위 디렉토리 처리)

-type: 특정 확장자 타입을 지정할 수 있다. *.dll 등 공백을 통해 여러 확장자를 등록할 수 있다.

-exc: 해당 파일에 지정한 디렉토리는 해쉬 계산을 하지 않는다.

-wp: 저장시 파일의 전체 경로를 입력하지 않음

-bp: 디렉토리 이름을 기본적으로 따로 표시하는데 해당 표시를 제거함

-v: 기존 결과 파일을 토대로 지정한 디렉토리를 비교한다.

// 결과값 출력과 관련되어 사용할 수 있는 옵션은 다음과 같다.

-md5: MD5 해쉬 알고리즘을 이용하여 결과를 출력한다.

-sha1: SHA-1 해쉬 알고리즘을 이용하여, 결과를 출력한다.

-xml: 결과를 XML 형식으로 저장한다.

이 Fciv를 이용해서, 파일 해쉬 알고리즘을 만들어, 이 데이터를 비교해 보도록 하자. 그럼 먼저 비교를 위한 해쉬 데이터를 생성하여야 한다. 다음 명령과 같이 생성해 보자.

C:\>fciv c:\windows\ -type *.exe -xml windows.xml

//

// File Checksum Integrity Verifier version 2.05.

//

Error loading XML document.

Create New XML database

[실습] Exe형식의 파일만 XML로 생성

생성한 해쉬 데이터를 이용해 차후 해당 디렉토리의 .Exe 파일이 변경되었는지 확인할 수 있다.

C:\>fciv –v c:\windows –xml windows.xml

//

// File Checksum Integrity Verifier version 2.05.

//

Could not set the event message file.

Starting checksums verification : 04/20/2012 at 11h52’20

// 확인 결과 무결성이 유지되고 있음을 알 수 있다.

All files verified successfully

End Verification : 04/20/2012 at 11h52’20

// 실행 파일을 백업한 후 해당 파일의 헥사값을 Hxd를 이용해 변경한 후 다시 실행해보자(비스타 이상이라면 쓰기 보호로 인해 시스템 실행 파일은 변경이 안 될 수 있다. 1부에서 SFC를 설명하면서 진행했었다. 따라서 다른 Exe 파일을 Windows 디렉토리에 복사해서 진행하기 바란다. 필자는 조금 전 작성한 Md5hash를 이용하였다).

파일 마지막의 4바이트를 아래와 같이 “ABCD” 를 입력한 후 저장해 보자.

[그림 20-3] 임의로 파일을 수정한다

// 그리고 다시 한번 Fciv를 이용해 확인해 보자.

F:\>fciv -v c:\windows -xml windows.xml

//

// File Checksum Integrity Verifier version 2.05.

//

Could not set the event message file.

Starting checksums verification : 04/20/2012 at 13h19’04

// 기존 해쉬 데이터와 다른 파일을 알려준다.

// 이를 통해 MD5hash.exe 파일이 변경되었다는 것을 알 수 있고, 원본과 같지 않다는 것을 증명할 수 있다.

List of modified files:

———————–

c:\windows\MD5hash.exe

Hash is : 0e02a755d017647248729853c826d7f3

It should be : 33b7a08eb71dec3cccda602b1c45134c

End Verification : 04/20/2012 at 13h19’04

[실습] 생성된 해쉬 데이터를 통해 현재 파일들의 무결성을 검사한다

단 여기서 놓치지 말아야 할 부분은, 해쉬 데이터를 생성한 이후 추가된 파일에 대해서는 확인이 되지 않는다. 해쉬 데이터에 대한 무결성 검사를 진행하는 것이라는 점을 명심하자. 따라서 중요한 파일들을 사전에 해쉬를 한 이후 사고 발생시 해당 파일이 변경되었는지 확인하는 용도로 사용하자.

-박스시작-

Md5sum

Md5sum 역시 Fciv와 동일한 기능을 제공하므로 사용해 보기 바란다.

C:\>md5sum –help

Usage: md5sum [OPTION] [FILE]…

or: md5sum [OPTION] –check [FILE]

Print or check MD5 checksums.

With no FILE, or when FILE is -, read standard input.

-b, –binary read files in binary mode (default on DOS/Windows)

-c, –check check MD5 sums against given list

-t, –text read files in text mode (default)

The following two options are useful only when verifying checksums:

–status don’t output anything, status code shows success

-w, –warn warn about improperly formated MD5 checksum lines

–help display this help and exit

–version output version information and exit

The sums are computed as described in RFC 1321. When checking, the input

should be a former output of this program. The default mode is to print

a line with checksum, a character indicating type (*' for binary, ‘ for

text), and name for each FILE.

Report bugs to <bug-textutils@gnu.org>.

[실습] Md5sum 도움말

-박스종료-

FileVerifier++

FileVerifier++은 윈도우에서 파일의 무결성을 검사할 수 있는 Fciv와 기능이 비슷한 기능을 하는 도구 하나를 더 소개하도록 하겠다.

FileVerifier++은 Fciv보다 많은 알고리즘과 GUI를 제공한다는 점이 강점이다. 제공하는 무결성 알고리즘은 다음과 같다.

CRC16, CRC32, BZIP2 CRC, MPEG2 CRC, JamCRC, Posix CRC, ADLER32, MD4, MD5, EDONKEY2K, RIPEMD-128, RIPEMD-160, RIPEMD-256, RIPEMD-320, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, WHIRLPOOL, WHIRLPOOL-T

특정 파일에 대해 무결성 검사를 진행하고자 한다면, 해당 파일을 마우스 우측버튼을 클릭하여 추가하거나, FileVerifier++을 실행하여 Files 아이콘을 클릭하여서 추가할 수도 있다.

↓이후 Verify All을 선택해 검사를 진행한다.

[그림] FileVerifier++은 GUI를 이용하여 파일의 무결성을 확인할 수 있다.

그 외에도 명령 프롬프트에서 사용할 수 있는 CLI기반의 툴도 함께 제공한다. Fvc.exe를 통해 명령어 기반으로 검사를 진행할 수 있다.

-a, –algorithm <arg>: 해쉬 알고리즘을 선택한다.

-b, –benchmark: 이용가능한 모든 해쉬 알고리즘을 테스트한다.

-c, –calc: 해쉬를 생성한다.

-d, –comment <arg>: 문구를 해쉬 파일에 추가한다(-c옵션과 함께 이용).

-f, –format <arg>: 출력 포맷을 지정한다.

-h, –help: 도움말을 표시한다.

-i, –info: 해쉬 모듈을 표시한다.

-o, –output <arg>: 화면에 해쉬 상황을 표시한다.

-r, –recursive: 해당 디렉토리에 대해 기존 해쉬 파일과 비교한다.

-s, –string: 입력 스트링에 대해 해쉬 한다.

-v, –verbose: 가능한 모든 내용을 출력한다.

-x, –verify: 해쉬 파일을 검사한다.

-V, –version: 프로그램 버전을 표시한다.

그럼 CLI 기반 툴인 Fvc를 이용하여 몇가지 예를 진행해 보자(-o 옵션에 대한 정보가 없어, 해당 파일을 언패킹한 후 직접 분석하여 확인해 본 결과, 옵션 이용에 대소문자가 구분됨을 확인하였다. 언패킹에 대한 정보는 4부에서 확인하기 바라며, 독자 분들도 궁금증이 있다면 직접 파일은 분석해보는 습관을 기르기 바란다).

[그림] Fvc 프로그램을 언패킹후 확인한 –o 파일 타입 분기점

C\Checker 디렉토리 하위 모든 파일을 SHA1으로 해쉬하여 해당 정보를 FVA 방식으로 F:\result.fva로 저장하는 경우 아래와 같이 진행할 수 있다.

// C:\Checker 디렉토리안의 파일들에 대한 해쉬 파일 생성
C:\>fvc -c -a SHA1 -r c:\Checker -f FVA -o f:\result.fva

// 저장된 결과 와 현재 파일의 무결성 검사 결과 변경된 내용이 없음을 확인할 수 있다.

C:\>fvc -x f:\result.fva

Checking entries in f:\result.fva

Results: 46 files processed, 46 good files, 0 bad files.

[실습] 기존 결과 값을 통해 현재 파일들의 무결성을 검사

우리는 이번 장을 통해 변경된 파일을 확인할 수 있는 방법과 이를 검사할 수 있는 방법을 배웠다. 컴퓨터 데이터에서 무결성이 중요한 이유는 눈에 보이지 않는 데이터 변경 유무를 확인한다는 것은 어렵기 때문에, 중요한 파일이 있다면, 해쉬값을 남겨 꼭 변조유무를 확인하는 습관을 기르기 바란다. 다음 장에는 사용자를 중심으로 윈도우를 사용흔적을 추적하여, 사용자가 어떠한 행위를 진행하였는지를 알아보는 사용자 추적 방법에 대해서 알아보고자 한다. 사용자 추적을 통해 누가 내 컴퓨터에서 어떤 행위를 했는지 알아낼 수 있는 만큼 흥미진진한 내용이 될 것이다. J

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.