OSI Layer에서 2계층 장비인 스위치(Switch) 환경에서는 MAC주소를 이용하여 각 장비에 패킷을 송수신한다. 자신과 관련없는 패킷은 수신하지 않음으로써 네트워크 효율을 증대한다.

하지만, 스위치를 바보로 만드는 방법은 많다. 여러가지 Spoofing 공격을 통해 공격자는 자신의 것이 아닌 패킷을 훔쳐(스니핑)볼 수 있게 된다. 대표적으로 ARP Spoof, ARP Redirect, ICMP Redirect 등이 있으며 여기에서는 ARP Redirect 공격에 대해 살펴본다. ARP Redirect 공격은 공격자가 자신이 라우터(공유기)라고 속이는 것이다. 스푸핑(속이다)에 해당되므로 분류가 난해하나, 정확히는 스니핑을 위한 스푸핑이다.

다음은 정상적인 상태의 통신을 보여준다. 

정상적인 상태의 통신
정상적인 상태의 통신

위와 같이 구성된 네트워크가 있다고 하자. 여기에서 사용할 공유기는 일반적으로 가정이나 카페 등에서 많이 쓰이는 ipTIME 모델로 가정한다. ipTIME공유기는 내부 네트워크(LAN)을 설정할 때 공유기 자신의 IP를 192.168.0.1로 설정하고, 이후 192.168.0.2 ~ 192.168.0.254 범위의 IP를 할당하도록 기본 세팅되어 있다.

1. ARP 프로토콜의 이해 : 

보다 자세한 이해를 위해, ARP 프로토콜에 대해 간단히 설명하고자 한다. 위에서 PC와 공유기는 IP 주소를 가지고서 상대방을 식별하는 것처럼 보인다. 하지만, 실제로 해당 장비들이 네트워크 계층에서 적절히 통신하기 위해서는 하위 계층인 데이터 링크 계층 간의 통신 경로를 먼저 확보해야 한다. 즉, IP 간 통신을 위해서는 물리적 주소(MAC Address)를 알고 있어야 한다. 이를 확인하는 방법이 바로 ARP(Address Resolution Protocol)이다. 다시 정리하면, ARP는 특정 IP를 가지고서 브로드캐스트(Broadcast)메세지를 발송하여, 해당 IP를 갖는 장비가 응답하도록 하는 것이며 해당 장비는 자신의 하드웨어 고유 주소인 MAC Address을 응답해준다. ARP 패킷에 대해 목적지 호스트가 응답하면 송신지 호스트는 ARP Cache Table을 설정하고, 호스트는 통신 시 ARP 테이블의 정보를 이용해 데이터 링크 계층 통신을 수행할 수 있게된다.

이 ARP를 이용하면 자신의 네트워크에 소속된 멤버들을 조사하여 MAC 어드레스를 확인할 수 있다. arp -a를 통해 표출된 정보는 OS에 따라 다르지만  보통 1~2분을 유지한다. 

이를 통해 알 수 있는 사실은, ARP 프로토콜의 특징을 이용하면 상대방을 충분히 속일 수 있다는 것이다. 이를 악용하여 스니핑을 시도하려 한다.

2. 중간자 공격(Man-in-the-middle-attack)의 이해

정상적인 통신 상태
정상적인 통신 상태

중간자 공격은 기밀성에 대한 매우 유효한 공격 기법이다. 공격자는 송신자와 수신자 사이에 끼어들어가서, 송신자에 대해서는 수신자처럼, 수신자에 대해서는 송신자처럼 행세하는 공격이다.

PC 1과 공유기 사이에 끼어들어서, 자신이 상대방이라고 속인다.
PC 1과 공유기 사이에 끼어들어서, 자신이 상대방이라고 속인다.
공격자가 중간에 끼어들었다.
공격자가 중간에 끼어들었다.

즉, '사이에 있는 사람'이 된다. 이 공격은 암호학적으로 매우 유효한 기법이다. 공개키 암호 방식에서 암호키 자체를 해독하지는 못하더라도, 기밀성을 침해할 수 있게된다. 이는 암호화만으로는 막을 수 없는 취약점이다. (이를 해결하기 위해서는 상대방의 신원을 정확히 확인할 수 있는 '인증'이라는 기법이 필요하게 된다.)

ARP 스푸핑 공격은 호스트 대 호스트 공격(내가 PC 3이야!)이며, ARP 리다이렉트 공격은 호스트와 라우터 사이에 끼어드는 공격(내가 라우터야!)인 차이이고, 원리 자체는 동일하다. 공격자는 원래 라우터의 MAC주소를 알아낸 후, 해당 MAC 대신 자신의 MAC을 PC에게 알려준다.

3. ARP Redirect 실습환경 구축

실습환경의 구성도는 대략 다음과 같다. 공격수행은 라즈베리파이의 라즈베리안 OS 리눅스에서 수행하며, 수행되는 파이썬 소스코드는 Python 2.7 기준으로 작동된다.

공격을 수행하기 전 정상적인 상태
공격을 수행하기 전 정상적인 상태

희생자 PC역할은 Window 7 노트북으로 수행한다. 해당 희생자 PC가 공격을 당하기 전 ARP 테이블 상태는 다음과 같다.

정상적인 상태의 희생자 PC ARP 캐쉬.
정상적인 상태의 희생자 PC ARP 캐쉬.

이 실습에서 라우터 역할을 할 공유기는 ipTIME의 N104T모델이며, 공격을 당하기 전 공유기에서 표시되는 내부 네트워크 정보는 다음과 같다.

정상적인 상태의 공유기
정상적인 상태의 공유기

위와 같이, 정상적인 상태에서는 서로 상대방을 정확한 MAC Address 로 인식하고 있다. 희생자 PC는 AC-FD-CE-47-83-F8이다. 공유기는 00-08-9F-49-5D-45이다.

4. 패킷 릴레이

중간자 공격 수행시에 중요한 점은, IP Forwarding이다. 만약 어렵사리 희생자 PC와 라우터 사이에 끼어들었다고 해도, 희생자 입장에서 통신이 원활하게 진행되지 않는다면 금새 뭔가 잘못되었다는 것을 깨닫게 될 것이다.

정상적인 통신은 위와 같다.

중간자가 끼어든 경우
중간자가 끼어든 경우

그러므로 공격자는 중간에서 아무렇지 않게 쌍방의 내용들을 상대방에게 흘려보내 준다.

응답의 경우도 마찬가지로 그대로 전달해준다.
응답의 경우도 마찬가지로 그대로 전달해준다.

즉, 데이터를 원래 목적지로 보내줌으로써 의심을 사지 않도록 하는 것이다. (그럼에도 불구하고 실제로는 패킷 전송 속도가 느려지는 등의 징후가 나타나므로 의심을 살 수 있다.) IP Forwaring 기능은 일반적으로 라우터에서 제공하는데, 운영체제에도 이러한 기능이 내장되어 있다. 또는 이렇게 하기 위한 방법으로 fragrouter라는 툴을 사용한다. 이를 통해 자신의 MAC 주소로 와서 받은 데이터가 실제 Destination IP와 다르다면 원래의 목적지로 포워딩해준다. 리눅스의 경우 /proc/sys/net/ipv4/ip_forward 파일에 설정되어 있으며, 기본 0(포워딩 하지 않음)과 1(포워딩 하기)로 설정하면 작동된다. 이 부분은 파이썬 소스코드에서 처리하도록 할 것이다.

5. 파이썬 소스코드 작성

ARP Redirect 공격을 위해서는 다양한 툴(DSniff, arpspoof 등)이 존재한다. 여기에서는 파이썬으로 제작한 프로그램을 소개하겠다. 소스코드는 구글링을 통해 구할 수 있었는데, 아쉽게도 특정 함수(originalMAC)에서 오류가 발생하였다. ( http://danmcinerney.org/arp-poisoning-with-python-2 ) 그리하여, 해당 함수부분을 수정하여 새롭게 작성하였다. 이 파이썬 코드를 수행하기 위해서는 Scapy 패키지 설치가 선행되어야 한다.

arp_spoof.py 소스코드 다운로드 : 


6. 공격 수행 결과

공격자의 PC(여기에서는 라즈베리 파이) 터미널에서 다음과 같이 파이썬 소스코드를 실행한다.

공격이 수행된 상태에서 정보를 확인해보자.

공격당한 희생자 PC의 ARP 캐쉬 테이블
공격당한 희생자 PC의 ARP 캐쉬 테이블

확인해보면 신기하게도, 공유기인 192.168.0.1 에 대한 MAC Address가 B8-27-EB-53-04-9B로 설정되어 있다. (정상적인 상태는 00-08-9F-49-5D-45 였음을 기억하라.) 이상한 점은 192.168.0.2 역시 같은 MAC Address를 가지고 있다. 당신이 만약 보안 담당자라면 스니핑을 의심해야 한다. MAC 주소는 고유번호이기 때문에 이렇게 겹칠리가 없다.

공격당한 공유기의 ARP 캐쉬 테이블
공격당한 공유기의 ARP 캐쉬 테이블

당연히, 공유기 측도 희생자 PC를 잘못 인식하고 있다. 공유기는 희생자(192.168.0.11)에 대한 MAC Address를 B8-27-EB-53-04-9B로 설정하고 있는데, 원래는 AC-FD-CE-47-83-F8여야 하지만 라즈베리 파이(192.168.0.2)로 인식하고 있는 것이다.

이제 이 상태에서 라즈베리파이를 통해 희생자 PC와 라우터 사이의 정보를 훔쳐볼(스니핑) 수 있게 된다. 대표적으로 tcpdump와 wireshark같은 유틸리티가 있다.

TCPDUMP를 통해 보니 다수의 ARP 요청과 응답이 지나다닌다.
TCPDUMP를 통해 보니 다수의 ARP 요청과 응답이 지나다닌다.

tcpdump를 사용하면 패킷을 확인할 수 있다. 다만, 커맨드라인 형태여서 전문가가 아니라면 파싱하여 분석하기가 쉽지 않을 것이다. 위의 예시는 -i 옵션을 사용하여 eth0에 대한 검색만 한 뒤에, "ARP"만 grep한 화면이다. 좀더 화려한(?) 분석을 위해 와이어샤크를 사용해보자.

와이어샤크를 통해 HTTP패킷 잡기
와이어샤크를 통해 HTTP패킷 잡기

희생자 PC에서 의도적으로 웹브라우져를 켜고 웹서핑을 수행한 뒤에, 해당 내용을 와이어샤크로 HTTP Filter한 화면이다. 조금 자세히 살펴본다면 희생자가 어떤 페이지를 접속하는지, 어떤 요청을 날리는지 알 수 있을 것이다.

7. 결론

여기에서는 중간자 공격을 통해 단순히 도청(스니핑)하는 역할만 다루었다. 눈치챘겠지만 중간자가 훔쳐보는 역할만 하리라는 보장은 없다. 얼마든지 더 악의적인 공격을 수행할 수 있다. 예를들어 희생자가 PC에서 은행에 접속하여 10만원을 이체하는 요청을 보냈다고 하자. 공격자는 이를 훔쳐 본 후, 해당 요청을 은행에 전송할 때 내용을 조작한다. 계좌번호를 공격자 본인의 것으로 바꾸고, 금액을 10억으로 수정한다. 그리고 마치 희생자가 보낸 것처럼 패킷을 Relay할 수 있다는 것이다. 은행은 거래가 성공적으로 완료되었다는 메세지를 보내올 것이고, 공격자는 다시 그 메세지를 수정하여 '원래의 요청대로 10만원이 잘 전송되었음'이라고 희생자에게 보낼 수 있다는 것. 굉장히 위험한 공격이 아닐까?

이러한 ARP 스푸핑 공격은 내부 인터넷 환경에서 치명적이다. ARP 스푸핑을 막기 위해서는 arp -s 옵션을 사용하여 IP 주소와 MAC 주소를 static으로 설정하는 것이 좋다. 이렇게 설정된 값은 스푸핑 공격이 들어와도 값을 변경하지 않는다. 그러므로 static옵션의 지정은 보안상 중요하다. 하지만 시스템이 리부팅되면 지속효과가 사라지므로, 모든 시스템에 매번 이러한 작업을 하기란 쉽지 않다. 이러한 설정을 일종의 쉘 스크립트로 작성하여 시스템이 재부팅 될 시 크론탭이나 프로파일에 의해 자동으로 실행되도록 하는 것이 좋다.

마지막으로, 이러한 공격은 명백히 불법의 범주에 있음을 명심하여야 한다. 개인 학습을 위한 실습이 어느선까지 용인되는지는 개인의 판단이다. 이러한 공격을 실제로 공공와이파이 환경이나 카페 등에서 타인의 중요 정보를 도청/감청하게 될 경우 발생하는 책임을 감당하여야 한다. 때문에 학습을 위해서는 VMware등의 가상환경을 이용하여 스스로가 통제할 수 있는 환경에서만 수행할 것을 권장한다.

참고문헌 )

  • 정보 보안 개론과 실습 - 네트워크 해킹과 보안(개정판), 한빛아카데미, 양대일 저
  • 알기쉬운 정보보호개론, 인피니티북스, 히로시 유키

#ARP스푸핑 #ARPSpoofing #ARPRedirect #ARP리다이렉트 #스니핑 #스푸핑 #중간자공격 #MITM #Maninthemiddleattack #정보보안기사 #정보보안산업기사


CPUU님의 창작활동을 응원하고 싶으세요?