This article is more than five years old and potentially contains out-dated information.
작성한지 5년 이상 지난 게시물입니다. 최신의 정보와 맞지 않는 내용을 포함할 수도 있습니다.

내가 대학 학부생이었던 시절의 이야기이다. 일 때문에 잠시 다른 도시에 갔다가 집에 돌아오는 길이었다. 이메일을 확인하려고 내 노트북을 공항에서 제공하는 와이파이 핫스팟에 연결했는데 사용료를 내라는 것이 아닌가. 정확한 금액은 잘 기억이 안 나는데, 대략 $12-15 정도였던 것으로 기억한다. 가난한 학부생이었던 나는 “이 돈이면 빅맥 세트가 두 개인데” 하는 생각과 함께 큰 고민에 빠졌다.

그러다가 문득 이런 생각이 들었다. “사람이 이렇게 많은데 돈을 내고 와이파이를 쓰는 사람이 한명이라도 있지 않을까?” 대부분의 유료 와이파이 핫스팟은 MAC 주소를 기반으로 사용자를 인증하는 방식이라, 실제로 비용을 지불하고 사용하는 사람이 한 사람이라도 있다면 그 사람인 척 하고 핫스팟을 사용할 수 있다는 얘기다. 일단 주위를 둘러보니 노트북 화면을 열심히 들여다보고 있는 사람들이 몇 있었다. 스크린이 나와는 반대쪽을 향하고 있어서 그 사람들이 무얼 하는지는 알 수 없었지만, 인터넷에 연결되어있을 확률이 높다고 생각했었다.

일단 패킷 분석 프로그램을 켜고 공중에 날아다니고 있는 패킷을 전부 캡쳐 하기 시작했다. 암호화 되지 않은 패킷 위주로 보기 시작했는데, 서로 다른 MAC 주소의 개수가 언뜻 보기에도 수십개가 넘었었다. 게다가 ARP, DHCP 등 로컬 네트워크를 벗어나지 못하는 프로토콜의 패킷들도 굉장히 많이 보였었다. 다른것들은 별 도움이 안 될 것 같아서 HTTP 패킷만 출력하도록 설정해놓고 기다리기로 했다. 오래 지나지 않아 HTTP 패킷들이 드문드문 잡히기 시작했다. 실제로 돈을 내고 핫스팟을 사용하는 사람들이 있었던 것이었다.

잡아놓은 HTTP 패킷 중 하나를 골라 MAC 주소만 복사해서 내 와이파이 카드의 주소를 그 MAC 주소로 덮어씌웠다. 결과는 성공적이었다. 이메일 몇개 확인하다가 비행기 탑승 시간에 맞춰서 탑승구쪽으로 향해 걸어갔다.

어떻게 이러한 일이 가능한 것일까? 내가 사용했던 방법은 MAC 스푸핑(spoofing)이라는 일종의 위장 기법인데, 컴퓨터 네트워크에 대한 기본적인 내용만 숙지하고 있다면 누구나 생각해낼 수 있고, 실행할 수 있는 아주 초보적인 기법이다. 본론으로 들어가기 전에 몇가지 알아야 할 것들이 있는데, 간단하게 짚고 넘어가도록 하자.

OSI 7 Layers

컴퓨터 네트워크를 공부해본 사람이라면 한번쯤 들어봤을 것이다. OSI 모형이라고도 하는데, 컴퓨터 네트워크 프로토콜을 일곱개의 계층으로 나누어 놓은 것이다. 여러개의 계층으로 나누는 궁극적인 이유는 계층간 추상화(abstraction)를 하기 위함이다.

추상화가 제대로 이루어지지 않았을 때에는 끔찍한(?) 일들이 일어날 수도 있다. 웹 애플리케이션 개발자 입장에서 사용자들이 와이파이를 통해서 접속했는지, 이더넷(Ethernet)케이블을 통해서 접속했는지, AT&T의 해저 광케이블을 통하는지, DirectTV의 인공 위성을 통하는지, 네트워크 인터페이스 카드를 만든 제조사가 어딘지, 원격 컴퓨터의 IP주소가 무엇인지, 데이터 패킷들이 순서대로 도착했는지 따위의 사항들을 일일히 신경써야 한다고 상상해보자. 화면에 “Hello World” 문구를 띄우는 데에만 몇년씩 걸릴지도 모르는 일이다.

하지만 추상화가 잘 되어 있기 때문에 웹 애플리케이션 개발자는 응용 계층 프로토콜인 HTTP에만 신경쓰면 된다. 마찬가지로 3계층인 네트워크 계층에서는 한 단계 하위 계층인 데이터 링크 계층에서 일어나는 일에 대해서 신경쓸 필요가 없다. 3계층 프로토콜이 책임질 일과 2계층 프로토콜이 책임져야 할 일이 서로 다르고, 다른 계층에서 일어나는 일은 그 계층의 프로토콜이 잘 처리해줄 것이라고 믿을 수 있기 때문이다.

일곱개의 계층들 중에서 우리가 주목해서 봐야 할 것은 2계층, 즉, 데이터 링크 계층이다.

Network Interface Card (NIC)

네트워크 인터페이스 카드는 데이터 링크 계층에서 노드(node)간 데이터 전송을 담당하는 중요한 요소중 하나이다. 한국에서는 랜(LAN) 카드라고 불리기도 하며, 가장 흔하게 볼 수 있는 2계층 프로토콜이 이더넷인 만큼 이더넷 카드라고 부르기도 한다1. 각 네트워크 카드에는 제조사로부터 할당된 고유의 주소가 있는데, 이를 MAC(Media Access Control) 주소라고 한다. MAC 주소는 48비트로 구성되어있는데, 앞 24비트는 제조사의 고유 번호이고, 뒤 24비트는 제품마다 할당된 고유 번호이다.

보통 이렇게 생겼다. 최근에 나오는 카드들은 메인 보드와 일체형인 경우가 많다.

예를 들어서 인텔에서 만든 네트워크 카드는 다음과 같은 주소를 갖는다.

00:90:27:00:00:01

뒤 24비트 00:00:01 부분은 앞서 말했듯이 제조사에서 당사의 제품에 할당하는 고유 번호이다. 각 제조사별 고유 번호는 이 페이지에서 구할 수 있다.

2계층 프로토콜에서 데이터를 전달하기 위해 전기적 신호를 어디로 보내야 할지, 혹은 지금 들어오는 신호의 수신자가 나인지 판단하는 기준이 되는 것이 바로 MAC 주소이다. 브로드캐스팅(broadcasting) 신호를 제외하고는 하나의 네트워크 카드에서 다른 네트워크 카드로 (하나의 MAC 주소에서 다른 MAC 주소로) 신호를 보내는 경우가 일반적이다.

MAC Spoofing

아! 드디어 본론이다. MAC 스푸핑 기법은 MAC 주소를 기반으로 하는 ACL 등 특정 보안 장치들을 우회할 수 있다는 점에 착안하여 고안된 기법이다. 쉽게 말해서 내 시스템의 MAC 주소를 목표 시스템에 접근이 허용된 MAC 주소로 덮어씌움으로써 인증된 사용자인 척 하는 것이다. 공항에서 내가 실제로 돈을 지불하지 않았음에도 불구하고 핫스팟을 사용할 수 있었던 것은 돈을 지불한 정상적인 사용자의 MAC 주소를 내가 썼기 때문이다. 핫스팟 입장에서는 내가 보낸 MAC 주소가 진짜인지 가짜인지 구분할 방법이 없다.

MAC 주소를 덮어씌우는(override) 방법은 각 운영체제마다 조금씩 다른데, 먼저 가장 간단하게 MAC 주소를 바꿀 수 있는 리눅스 운영체제의 경우를 살펴보자. 다음의 명령어 한줄로 임의의 MAC 주소를 사용하는 것이 가능하다.

sudo ifconfig wlan0 hw ether xx:xx:xx:xx:xx:xx

OSX2의 경우에도 마찬가지다3. 다만, 이 명령어를 실행하면 네트워크 연결이 끊어지기 때문에 다시 라우터에 접속해줄 필요가 있다. 내가 소유하고 있는 맥북에는 이더넷 포트가 있기 때문에 en0이 아닌 en1이 와이파이 카드를 나타내지만, 이는 시스템마다 다를 수도 있을거라 예상된다.

sudo ifconfig en1 ether xx:xx:xx:xx:xx:xx

내가 지금 당장 부팅할 수 있는 윈도우 시스템을 가지고 있지 않은 관계로 윈도우 운영체제에서의 MAC 스푸핑은 다루지 않기로 하겠다. 구글 검색을 조금만 해보면 수많은 검색 결과가 나오니까 궁금한 사람들은 직접 찾아보는 것을 권장하고 싶다.

마무리

MAC 스푸핑 기법에 대해서 아주 간략하게 알아봤는데, 명령어 한 줄, 마우스 클릭 몇번만으로 할 수 있을 만큼 간단한 기법이었다. 간단하면서도 실전(?)에서 바로 효과를 볼 수 있는 기법인만큼 주말에 잠깐 시간을 내어서 연습해 보는 것도 나쁘지 않을것 같다.

연습할 때 한가지 주의할 것이 있는데, 차단된 환경에서의 MAC 스푸핑 시연만으로는 범죄가 성립되기 어렵지만, 일반 대중을 대상으로 하는 경우에는 이야기가 달라질 수 있다는 것이다. 자신이 거주하고 있는 지역이나 스푸핑을 하는 목적, 당하는 대상 등 여러가지 요인에 따라서 범죄 행위로 해석됨에 따라 민사, 형사상의 책임을 져야 할 가능성이 있을 수도 있다. 자세한 내용은 여러분이 거주하고 있는 지역의 법률 전문가와 상담하기를 권장한다.

내가 개인용 컴퓨터에서 사용하는 OSX의 경우에는 약간의 트릭이 필요하다. 와이파이 카드가 네트워크에 연결된 상태와 꺼진 상태에서는 MAC 주소를 덮어씌울 수 없기 때문에, 연결되지도 꺼지지도 않은 상태(?)로 만드는 것이 필요하다. 그런 상태로 만드는 방법은 여러가지가 있는데, 가장 쉬운 방법은 연결 암호가 설정된 라우터에 고의로 잘못된 암호를 가지고 와이파이 연결을 시도하는 것이다. 일정 시간이 지나면 사용자 인증에 실패하면서 연결되지도 꺼지지도 않은 상태가 된다.

[caption id=”attachment_1759” align=”aligncenter” width=”326”]왼쪽에서 두번째에 있는 와이파이 아이콘이 회색인 것이 보이는가. 이것이 바로 연결되지도 꺼지지도 않은 상태다. 왼쪽에서 두번째에 있는 회색 와이파이 아이콘이 보이는가. 이것이 바로 연결되지도 꺼지지도 않은 상태다.[/caption]

이 상태에서 다음의 명령어로 MAC 주소를 변경할 수 있다. 내가 소유하고 있는 맥북에는 이더넷 포트가 있기 때문에 en0이 아닌 en1이 와이파이 카드를 나타내지만, 이는 시스템마다 다를 수도 있을거라 예상된다.

  1. Multiple Authors. “네트워크 카드.” Wikipedia. Wikimedia Foundation, 02 Mar. 2013. Web. 08 Mar. 2013. 

  2. Mac OS X을 MAC 주소와 혼동하는 사람이 있을지도 모르니, 이 글에서는 OSX이라고 부르기도 한다. 

  3. 본문 내용중에 현재 OSX와 맞지 않는 내용이 있었는데, 한륜희군이 정정해주었다. 다음은 원문의 내용이다.