서버에 보초를 세우다 – 파일 감시

해킹에 성공하여 시스템 침입에 성공하였다면, 시스템 제어를 위해 백도어 프로세스를 실행하고자 할 것이다. 따라서 이를 위해 파일을 수정하거나 새로 생성해야 할 것이므로, 파일의 변조유무를 확인하는 것은 해킹 파악에 있어서 매우 중요하다 할 수 있다. 유닉스의 트랩와이어(Trapwire)가 파일의 변조 유무를 통해 시스템의 무결성을 유지하듯이 파일이 변경 되면 알려주는 프로그램으로써 시스템의 무결성을 유지할 수 있는 효과적인 수단이다.

그럼 그 파일 모니터링 하는 방법에 대해 알아보도록 하자.

 

watcher.cs

using System;

using System.IO;

using System.Security.Permissions;

using System.Net;

using System.Net.Sockets;

using System.Text;

 

public
class
Watcher

{

// Syslog 사용 포트 지정

private
const
int ServerPortNumber = 514;

public
static
void Main()

{

Run();

}

 

[PermissionSet(SecurityAction.Demand, Name = “FullTrust”)]

public
static
void Run()

{

 

string[] args = System.Environment.GetCommandLineArgs();

 

// 만약 인자값을 넣지 않거나 잘못 넣었을 경우 사용법 표시후 종료

if (args.Length != 2)

{

Console.WriteLine(“Usage: Watcher.exe (directory)”);

return;

}

 

// FileSystemWatcher의 속성을 새로 설정

FileSystemWatcher watcher = new
FileSystemWatcher();

watcher.Path = args[1];

/* 파일에 대한 엑세스, 접근, 변경 대해 모니터링*/

watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite

| NotifyFilters.FileName | NotifyFilters.DirectoryName;

// 감시 파일 유형을 등록하고자 한다면, 아래 내용을 변경한다. 예제에서는 exe로 한정

watcher.Filter = “*.exe”;

 

// 이벤트 핸들러 등록

watcher.Changed += new
FileSystemEventHandler(OnChanged);

watcher.Created += new
FileSystemEventHandler(OnChanged);

watcher.Deleted += new
FileSystemEventHandler(OnChanged);

watcher.Renamed += new
RenamedEventHandler(OnRenamed);

// 하위 디렉토리 포함

watcher.IncludeSubdirectories = true;

// 감시 시작

watcher.EnableRaisingEvents = true;

 

// 특정키 입력시 프로그램 종료

Console.WriteLine(“Press \’q\’ to quit.”);

while (Console.Read() != ‘q’) ;

}

 

 

// 이벤트가 발생했을 경우 처리

private
static
void OnChanged(object source, FileSystemEventArgs e)

{

try

{

UdpClient udpClient = new
UdpClient();

 

// 파일 데이터가 어떻게 변경되었는지, 로컬과 Syslog에 전송

Console.WriteLine(“TEST File: “ + e.FullPath + ” “ + e.ChangeType);

string message = (“TEST File: “ + e.FullPath + ” “ + e.ChangeType);

byte[] sendBytes = Encoding.UTF8.GetBytes(message);

udpClient.Send(sendBytes, sendBytes.Length, “10.10.10.1”, 514);

 

}

catch (SocketException se)

{

Console.WriteLine(se.Message);

}

}

 

private
static
void OnRenamed(object source, RenamedEventArgs e)

{

try

{

UdpClient udpClient = new
UdpClient();

 

// 파일 이름이 어떻게 변경되었는지를 로컬과 원격 syslog에 전송

Console.WriteLine(“TEST File: {0} renamed to {1}”, e.OldFullPath, e.FullPath);

string message = (“TEST File: “ + e.OldFullPath + ” renamed to “ + e.FullPath);

byte[] sendBytes = Encoding.UTF8.GetBytes(message);

udpClient.Send(sendBytes, sendBytes.Length, “10.10.10.1”, 514);

 

}

catch (SocketException se)

{

Console.WriteLine(se.Message);

}

}

}

[예제] 파일 모니터링 C# 프로그램

 

위 프로그램을 컴파일 한 후 정상 동작 유무 확인을 위해 다음과 같이 테스트를 진행하였다. 테스트를 위해 사용된 Syslog 서버 프로그램은 Philippe & Guillaume Huysmans가 무료로 개발한 Syslog Server 1.2 버전을 사용하였다. 해당 도구는 http://sourceforge.net/projects/syslog-server/ 에서 다운로드 하였다. Philippe & Guillaume Huysmans는 이외에도 윈도우 이벤트로그를 Syslog 서버로 전송하는 도구도 구글 프로젝트를 통해 개발하였는데, 좋은 참고 자료가 될 것 같다. 해당 자료는 http://code.google.com/p/eventlog-to-syslog/에서 확인할 수 있다.

그럼 Syslog 설치 후 실행하고 테스트를 진행해보도록 하자. 테스트를 위해 특정 디렉토리 모니터링을 시작하자. 다음은 C:\temp 디렉토리를 모니터링하는 명령어다.

 

Watcher c:\temp 

 

그리고 해당 디렉토리에 .Exe 파일을 생성하고, 이름을 변경하는 등, 작업을 진행하도록 하자.

 

↓그 후 Syslog를 설치한 머신으로 이동하여, 이벤트 기록 여부를 확인하자.

원격지에 있는 Syslog에 파일 변경에 대한 로그가 기록된다

 

정상적으로 잘 기록되고 있음을 확인하였다. 이를 통해 원격지에 있는 관리 서버에서 모니터링 대상 서버의 파일 변경에 대한 모니터링 방법에 대해 알아보았다.

당부하지만 이는 기초적인 방법이니 이를 응용하여 여러 기능을 붙을 수 있을 것이다(필자 블로그 http://itka.kr에 Asecurity라는 모니터링 도구도 이를 응용하여 개발한 것이다).

그리고 모니터링은 서버의 리소스를 추가로 사용하는 만큼 성능에 대한 고민을 함께 진행해야 할 것이다.

 

Facebook Comments

Leave A Reply

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.