꽃미남 프로그래머 김포프가 창립한 탑 프로그래머 양성 교육 기관 POCU 아카데미 오픈!
절찬리에 수강생 모집 중!
프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 알 수 없는 사용자
* 본문에는 경어가 사용되지 않습니다. 그러니, 문어체에 알레르기가 있는 분은 일단 돌을 던지고 나서 읽기 시작 하소서 *

서비스를 수행하지 못하도록 하는 목적(DDoS)이 아니라 데이터 수정, 사용권한 획득 등의 어떠한 형태의 이득을 얻으려 하는 공격자들에 대해 이야기 해보겠다.

C/S 환경에서 해킹 공격의 대상이 되는 부분은 당연하지만 세군데 이다. 클라이언트, 서버, 그리고 네트워크 이다. 서버의 경우에는 기계도 회사에 있고, 관리도 회사에서 하기 때문에 C/S환경에서는 앞서 말한 방식의 공격을 당하기가 쉽지 않다. 서버가 공격 당해서 서버에 있는 게임의 데이터가 조작되고, 권한이 변경되어 특정인에게 이득이 갈 수 있는 작업을 할 수 있을만한 환경이라면, 그 회사는 언제 무너져도 이상하지 않은 상태라 말할 수 있겠다. 우좌지당간에, 그래서, 서버가 공격 당하는 경우는 일단 배제하고 이야기 해보겠다.

** 클라이언트
클라이언트는 공격자가 소유한 컴퓨터에 설치되기 마련 이므로 가장 쉽게 공격 당할 수 있는 부분 이기도 하다. 클라이언트에서 저질러 질 수 있는 공격의 방법은 수백~수천가지가 되겠지만 그걸 분류 하면 대충 다음과 같은 세 가지 타입 정도로 나눌 수 있을 것 이다.

1. 바이너리 코드 혹은 저장된 데이터 파일의 확인 / 수정
공격자의 컴퓨터에 설치되어 있기에 바이너리 코드를 까서 리버스 엔지니어링 툴로 돌리면 기본적인 데이터들은 줄줄줄 흘러나오기 마련이다. 아무리 데이터를 암호화 해서 저장하고, 보안 툴로 도배를 해도 결국에는 까발려진다. 정교하고 복잡한 방법을 사용하면 까발려지기 까지의 시간을 벌 수 있을지는 모르겠지만, 모든 필요한 정보는 공격자가 가지고 있기 때문에 언젠가는 까발려진다. 믿어라.

2. 후킹 & 메모리 내용 확인 / 수정
공격자는 컴퓨터에서 실행되는 모든 프로그램의 정보를 읽을 수 있다. 모두들 잘 알고 있듯이 메모리에 올려져서 실행중인 모든 프로그램은 머리 가슴 배로 이루어져 있고, 머리에는 실행 코드와 스태틱 데이터가, 가슴에는 힙이 그리고 배에는 스택이 있다. 그리고 이 모든 것은 메모리에 들어 있으니 언제든지 확인 할 수 있다. 할당 했던 메모리를 반납 한다고 데이터가 사라지는 게 아니다. 메모리를 반납하고 가베지 컬렉션이 끝났다고 해서 조금전에 아이디와 패스워드를 암호화하기 위해 사용했던 키가 사라지는 건 아니다. 반납되어 메모리 풀에 포함된, 현재 사용하지 않는 메모리에 있던 정보들도 여전히 남아있고, 공격자는 볼 수 있다. 보안 프로그램을 덕지덕지 발라도 시간을 투자하면 결국에는 볼 수 있게 된다. 게다가 보안 프로그램과 해킹 프로그램은 종이 한장 차이다. 그러므로, 내 프로그램이 알고 있는 모든 것은 공격자도 안다. 믿어라.

참고자료: 후킹중인 후커들, 그녀들은 마누라에게 가야할 남자들을 후킹해서 마누라에게 가지 못하게 한다.
API에게 가야할 내 클라이언트를 가로채서 딴짓을 하게 만드는 컴퓨터의 후커와 다를 바 없다.


3. 사기, 공갈, 협박 (응?)
이건 또 뭔 쉰소리냐 라는 생각이 절로 들만한 타이틀 이긴 하지만, 가장 오래되고 가장 확실하고 가장 쉬운 해킹 방법이기도 하다. 요즘 유행(?)하고 있는 피싱도 이 분야에 해당된다. 가장 쉽게 써먹을 수 있는 기술은 '"레벨 99 보안구역에서 근무하는 근무자 인데, 급하게 나오느라 출입증을 자리에 놓고 나왔는데 잠시 문좀 열어주면 안될까요?"라고 구라를 떨어서 보안 근무자를 속인다', '머리에 총을 대고 "당장 문을 열지 않으면 머리에 바람 구멍을 내주겠다"라고 외친다', 그리고 '출입 가능자의 눈깔을 뽑고 손목아지를 잘라서 보안장치에 올려 놓는다' 등이 있다.

이건 막을 방법이 없다. 끊임없이 근무자들을 '첨보는 놈이 말걸면 그냥 쏴죽여라'고 세뇌하고 CCTV에 연동된 발칸포와 CCTV 한 대당 세 사람의 근무자를 배치한 완전 무결한 보안 시스템을 갖춰... 도 못 막는다. 그냥 노력 했다는 것과 미션 임파서블의 탐크루즈 레벨의 잘난 놈이 아니면 쉽게 뚫지는 못한다 정도에 만족해야 한다. 이런 시스템도 두 달정도 배달 아르바이트로 신분을 위장한 멍청한 스파이에게 어이없이 뚫리기도 한다.

이렇게 잘난놈을 어찌 막는단 말이냐!

** 네트워크
1. 스니핑, 스푸핑
스니핑과 스푸핑은 각각 '훔쳐 보다'와 '통신내용 위조'에 해당된다. 스니핑과 스푸핑 자체는 공격 방식으로서의 파괴력을 갖는다기 보다는 2번과 3번의 공격을 성립하게 만드는 도구라고 봐도 된다. 물론, 이 두 공격은 권투로 보면 잽에 해당되는 것으로 다른 공격의 기본일 뿐 아니라 자체로도 상당한 파괴력을 갖는다. 두 공격 방법은 네트워크 장비에 따라 다른 방식을 사용하게 되는데, 일반적인 허브(HUB)를 사용하는 경우에는 별다른 조작 없이도 동일한 네트워크에 돌아다니는 정보를 모두 처리할 수 있으며, 스위칭 장비를 사용하는 경우에는 ARP 스푸핑 이라는 방법을 사용한다.

ㄱ. 스니핑
스니핑은 한마디로 이야기 하자면 도청에 해당된다. 보통 자신이 포함된 네트워크에 흘러다니는 데이터를 도청하게 된다. 웹 통신에 사용되는 HTTP 는 입력된 정보가 텍스트 상태로 돌아 다니게 되므로, 스니핑을 이용하면 사용자가 입력한 정보를 하나도 빠짐없이 깔끔하게 빼낼 수 가 있다. 그러므로 최소한 HTTPS 를 사용하는 사이트의 패스워드와 HTTP 를 사용하는 사이트의 패스워드는 다른 걸 사용 하는걸 권한다. HTTP 를 사용하는 사이트의 패스워드는 내 것이 아니다. 인터넷 회선 회사에서 제공하는 보호책이 전혀 없다면 옆집이랑 우리집이 같은 인터넷 회사 서비스를 사용하는 경우, 옆집에 사는 해커놈이 자기집 컴퓨터로 내 컴퓨터에서 입력되는 정보를 빼내는 것도 가능하다. 그것도, 숨쉬는 것 만큼 편안하게 빼갈 수 있다. (인터넷 회선 회사에서 나를 위해 돈쳐들여 보호책을 마련해 줄리는 없잖아? 그러니까 아마 우린 안될거야)

열심히 스니핑 중이신 바리스타 아자씨


ㄴ. 스푸핑
스푸핑은 한마디로 이야기 하자면 가짜정보 혹은 문서 위조에 해당된다. 가짜 정보는 일반적인 데이터에 대한 정보의 조작 일 수 도 있고, 네트워크를 관리하는 장비를 혼란시키기 위한 정보의 조작 일 수 도 있다. 해커들이 가장 많이 사용하는 공격 방식은 ARP 스푸핑과 DNS 스푸핑이 있는데, 둘 다 희생자로 하여금 공격자가 정상적인 통신 대상인 것으로 착각 하게 만드는게 주 목적이다.

ㄷ. 스니핑 / 스푸핑 공격의 원리
스니핑/스푸핑 공격이 가능한 이유는, TCP/IP 프로토콜 자체가 보안에 대한 고려가 전혀 없기 때문이다. TCP/IP를 통해 전달되는 모든 정보는 그냥 눈에 보이는 그대로 주고받는다. 그렇기 때문에 상황에 따라서는 아주 단순한 방법으로 통신내용을 엿보고 조작 할 수 있다.

요즘은 대부분의 네트워크에서 스위칭 장비를 사용하기 때문에 허브를 사용하던 시절만큼 간단하게 내 정보를 뽑아 가는 짓은 할 수 가 없다. 그러나 여전히 그다지 많이 어렵지는 않다.

a. 허브를 사용하는 네트워크의 경우엔
그 어떤 공격 기술 없이 단순히 네트워크 트래픽을 확인하는 정상적인 툴 만으로도 스니핑이 가능하다. 이러한 공격이 가능한 이유는
 
. TCP/IP가 통신을 수행할 때 텍스트를 그대로 전송하는 방식을 사용하고
. TCP/IP의 하단에서 사용되는 이더넷(Ethernet) 프로토콜이 CSMA/CD 라는 방식을 사용하기 때문이다.
 
CSMA/CD 방식을 간단하게 설명하자면 '일단 동네사람 다 듣게 소리질러 놓고 못 알아 들었는지 확인하는' 방식이다. CSMA/CD 방식에서는 컴퓨터 A에서 B로 데이터를 전송하고자 하는 경우, 컴퓨터 A는 네트워크를 다른 컴퓨터가 사용하는지를 확인 한 다음에 네트워크에 정보를 그냥 뿌린다. 네트워크에 연결되어 있는 컴퓨터들이 네트워크에 뿌려진  정보를 받아서 정보에 기록된 받는 측 IP주소 가 자신의 것 이면 받아서 처리하고, 아니면 그냥 버리는 방식이다.

텍스트로 데이터가 전송되고, 모든 컴퓨터가 데이터를 일단 받은 다음에 자기 것이면 쓰고 아니면 버리는 방식이기 때문에 IP 단의 프로그램을 작성해서 자신의 IP든 아니든 상관없이 그냥 다 모으도록 해주면 된다. (프로그램을 짜는게 귀찮다면, 네트워크 관리자라면 한번쯤은 써 봤을 만한, 아주 대중적인 툴 중에 같은 네트워크에 돌아다니는 모든 정보를 모아서 필터링해 보여주는 tcpdump 라는 놈도 있다.) 그러면 그냥 스니핑 성공~. 만약 공격대상이 통신하는 내용을 조작하는 공격인 스푸핑을 하려고 하는 경우에는 ARP 스푸핑 혹은 ARP Redirect라는 방식을 사용해 주어야 한다. 그건 b. 에서 설명 하겠다.

b. 스위칭 장비를 사용하는 경우
약간, 아주 약간 복잡해 지는데, 스위칭 장비는 받는 측 네트워크 카드의 주소(MAC)를 확인해서 해당 MAC에 해당하는 컴퓨터가 연결된 회선으로만 데이터를 쏴주기 때문에 위에서 언급한 허브를 사용하는 네트워크에서 하듯이 숨쉬듯 스니핑이나 스푸핑이 가능하지는 않는다. 그러나 손가락 끝을 조금 움직여 주는 정도의 노력만 기울이면 문제가 해결된다.

먼저, 어떻게 사용자가 IP 를 이용해 통신을 시도해도 통신이 되는지를 알아보자. IP 레이어에서 사용되는 자료 구조중 ARP 테이블 이라는 것이 있다. 이놈이 논리적 주소인 IP와 물리 주소인 MAC을 연결해주는 테이블 되시겠다. 이 테이블의 역할은 특정 IP 주소로 전달을 요구 받았을 때 그 데이터가 어느 기계로 전달 되어야 하는지를 알려주는 역할을 한다. 도메인 네임 -(DNS)-> IP 주소 -(ARP)-> MAC 이라고 생각 하면 오케이!


ARP의 동작방식

(1) 통신 상대의 IP 주소에 해당되는 MAC이 자신의 ARP 테이블에 있는지 확인한다.
(2) ARP 테이블에 해당 IP가 없다면, 네트워크에 있는 단말 들에게 ARP Request를 전송하여 지정한 IP를 사용하는 단말기의 IP를 요구 한다.
(3) 지정 IP를 쓰는 단말기는 자신의 MAC 주소를 ARP Reply 에 담아서 보내준다.
(4) 둘은 쎄쎄쎄(Three-way handshaking) 하고 통신한다
 
공격이 가능한 기본적인 이유는, 이 ARP가 네트워크를 통해 전달되는 정보를 기본으로 만들어지기 때문 이다. 다시 말해서 공격자가 공격 대상 에게, ARP Reply 패킷에 가짜 정보로를 담아서 '내가 게이트웨이야'라고 주기적으로 주장해 대면 공격 대상은 공격자의 장비를 게이트웨이로 인식하고, 모든 패킷을 공격자에게 보내게 된다. 마찬가지로 게이트웨이 장비를 속여주면 공격자는 피 공격자가 보내고 받는 모든 데이터를 제 마음데로 변조할 수 있게 된다.

추가적으로 스위칭 장비를 무력화 하기 위해서 사용되는 기법중에 'Switch Jamming'이라는 기법이 있는데, 대부분의 스위칭 장비가 안전 보다는 효율을 우선으로 하고 있어, ARP 해석에 문제가 발생하면 트래픽을 전달하기 위해 a. 에서 언급한 더미 허브처럼 동작하게 된다는 점을 이용하는 공격 기법 이라고 할 수 있다.

Note. 이런류의 찝적거림을 막기 위해 공유기가 꼭 필요하지 않은 경우라 해도 공유기를 쓰고, 공유기의 공인 IP에 해당되는 게이트웨이의 MAC을 고정시켜 사용한다. 실제로, 옆집이 우리집이랑 같은 인터넷 회사의 회선을 쓰면, 옆집에선 별 노력 없이 내가 인터넷을 통해 보내고 받는 모든 정보를 제 마음대로 조작할 가능성이 있는데, 일반적으로 옆집과 우리집이 같은 IP 대를 쓰고, 공통의 게이트웨이를 쓸 확률이 아주 높고, 인터넷 회선을 제공하는 회사에서 일반 가정집에 들어가는 회선에 보안 장비를 넣을 이유는 별로 없기 때문이다.

2. Replay
Replay 공격은 말 그대로 '재전송' 공격이다. 예를 들어 아이디와 패스워드를 암호화 해서 보내는 C/S 환경이 있다고 하자. 현실에 존재하지 않는, 절대로 깰 수 없는 암호화 방식을 사용해서 아이디와 패스워드를 암호화 해서 보낸다 해도. 전달되는 암호화된 ID와 패스워드를 스니핑을 이용해 저장해 두었다가, 공격 하고 싶을때 단순히 보관되어 있는 암호화된 ID와 패스워드를 전송만 해줘도 로그인이 된다. 실제 ID가 뭔지, 패스워드가 뭔지 알 필요도 없다.

3. Man In The Middle Attack (MITM)
통신하는 두 당사자 사이에 끼어서 데이터를 중계 함으로서 수행하는 공격을 말하며, SSL 같은 공개키 방식의 암호화 통신을 공격하기 위해 사용된다. A와 B가 통신하는 경우, 공격자 M이 MITM 공격을 하는 방법은 기본적으로 다음과 같다:
 
0. ARP 스푸핑을 이용해 통신하는 두 당사자 A와 B를 속인 후 A가 보내는 데이터를 M이 받아서 B에게 전달하면 끝! (응? 그냥 스푸핑 이잖아?)
 
자자, 흥분을 가라 앉히고, 좀 더 들어 보라. MITM의 기본 전제인 공개키 방식의 통신을 위의 설명에 끼워 넣어 풀면 된다.
 
ㄱ. A가 B에게 자신의 공개키를 전송한다.
ㄴ. M은 ㄱ에서 전달된 A의 공개키를 가로채 저장하고, 자신의 공개키를 B에게 넘겨준다.
ㄷ. B는 A의 것 이라 믿어지는 공개키를 받고, 자신의 공개키를 A에게 보낸다.
ㄹ. M은 ㄷ에서 전달된 B의 공개키를 개로채 저장하고, 자신의 공개키를 A에게 넘겨준다.
ㅁ. 공개키 방식의 강력하고 안전한 보안 통신이라고 믿는 A와 B의 통신을 유유히 가지고 논다.
 
실제로 MITM은 SSL 통신에도 통하는 경우가 있다. ' 미리 브라우저 등의 클라이언트에 임베드 되어있는 잘 알려져 있는 기관의 인증서를 사용하는 것이 아닌' SSL 통신은 MITM 공격에 의해 뚫린다.


MITM 공격 결과, 뭐 글자를 지우고 스푸핑 공격 결과라 우겨도 된다

다음 번 부터는 이러한 공격들에 대해 그나마 저항력을 가질 수 있는 방법들에 대해 설명해 보도록 하겠다. 이 팀 블로그에 오는 대부분의 사람들은 '보안' 자체에 관심이 있다기 보다는 '어떻게 하면 해킹하는 찌질이들에게 좀 덜 시달려 볼까' 혹은 '혹시 잘하면 봇을 막을 수 있지 않을까' 쪽에 관심을 가지고 있을 터이니, 공격 방법이나 회피 방법에 대한 설명 보다는 해킹 공격에 저항력 있는 코드를 만드는 방법들에 중점을 두고 쓰도록 노력해 보겠다.
 
*   *   *

사실, 보안과 게임은 뗄래야 뗄 수 없는 관계에 있긴 하지만, 그렇다고 게임업계에서 보안 자체에 관심을 가지고 있는 경우가 그닥 많지는 않지요. 그래서 치명적인 실수가 될 수 도 있는 부분에 한해서 두세번 정도 특별기고(?) 형태로 매번 얻어 먹는 귀중한 지식에 대한 앙갚음(!)이라도 할 까 해서 포프님에게 제안을 했습니다. 그런데 덜컥 날자를 할당해 주시는 바람에 게임 프로그래머들에게는 재미 없을 확률이 아주 높은 보안과 관련된 글을 주기적으로 쓰게 되었습니다.

글은 가능한 한 공격 방법 - 해결책 쌍을 제시해 보도록 하겠습니다. 뭐, 나의 주 관심사는 '안전한 통신 프로토콜'에 쏠려 있기 때문에 그 외의 영역은 쬐끔 분량이 적을지도 모르겠습니다. 그래도 주 연구 분야가 '연산 능력이 부족한 가벼운 장비들 간의 보안통신' 이기 때문에 많은 패킷을 빠르게 주고 받아야 하는 게임 서버/클라이언트 간에 보안 통신을 하는 방법에 대해 조금은 도움이 되지 않을까 하고 자위해 봅니다. ㅡ,..ㅡa
반응형
,