실전 테스트!! 스니퍼 공격
스니퍼 프로그램들은 종류에 따라서 사용자 명과 패스워드를 추출해 내는 간단한 것에서부터 모든 네트워크 트래픽을 기록하는 복잡한 것에 이르기까지 다양한 것들이 있다. 이번 절에서는 몇 가지 스니퍼 프로그램을 테스트해 본다.
-
linsniffer
-
linuxsniffer
-
hunt
-
sniffit
hunt
hunt는 출력 결과를 해석하기 쉽고, 명령어를 추적하기 쉬우며, 세션 스누핑을 실행할 수 있는 도구이다.
작성자 : Pavel Krauz
필요조건 : C, IP 헤더, 리눅스 커널 2.2 이상, LinuxThreads가 지원되는 GlibC 2.1 (or not)
Download : http://www.gncz.cz/kra/index.html
설치
[root@linux mk]# tar xvfz hunt-1.5.tgz
[root@linux mk]# make
[root@linux mk]#./hunt
hunt는 Curse 기반의 프로그램이므로 쉽게 사용할 수 있을 것이다. 시작메뉴는 아래와 같다.
-- Main Menu -- rcvpkt 0, free/alloc 63/64 -----
l/w/r) list/watch/reset connections
u) host up tests
a) arp/simple hijack (avoids ack strom if arp used)
s) simple hijack
d) daemons rst/arp/sniff/mac
o) options
x) exit
*>
l : 현재 커넥션한 접속한 list를 보여준다. default로 telnet/rlogin 커넥션만 모니터링 하게 되어 있다.
w : 커넥션을 단순히 모니터링 하기 위한 옵션이다.
- s : 출발지에서 발생하는 데이터, -d : 목적지에서 발생하는 데이터, -b : 모든 데이터
r : reset, 커넥션을 끊습니다.
u : 현재 네트워크 상에서 동작중인 호스트들을 검색하기 위해서는 u키를 눌러 상태를 확인한다.
- ping을 사용해서 UP되어 있는 호스트들을 찾을 수 있다.
- 경우에 따라서 패킷 필터링에 의해서 ICMP echo 패킷을 막아 두었을 경우에 그 호스트는 핑(ping)에 으해서 검색되지 않는다. 네트워크 상의 네트워크 인터페이스 중 무작위 모드(promiscuous mode)로 세팅된 것을 찾아서 ARP를 사용하여 검색한다.
** 참고
ICMP echo 패킷 막기
ping 을 사용하는 프로토콜은 ICMP(Internet Control Message Protocol)을 사용한다.
/proc 파일시스템 (커널에서 사용하는 파일시스템)의 icmp 프로토콜의 에코를 막아주면 됩니다.
내 시스템이 다른 곳에서의 ping에 응답하지 않게 하려면
[root@linux mk]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
다시 응답하게 할 때는
[root@linux mk]# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
Sniffit
sniffit은 hunt에서 제공하는 정보보다 좀더 많은 정보를 제공한다.
작성자 : Brecht Claehout
필요조건 : C, IP 헤더, libpcap 라이버리( ftp://ftp.ee.lbl.gov/libpcap.tar.Z)
Download : http://reptile.rug.ac.be/~coder/sniffit/sniffit.html
sniffit은 상당한 설정 기능을 제공하는 비장의 카드이다. 그러나 사용할 때에 고려해야 할 점들이 많이 있으므로 주의한다.
설치
[root@linux mk]#./configure
[root@linux mk]#make
** 인터렉티브 모드로 작동시키기
[root@linux mk]# ./sniffit -i
Server : 211.234.52.20
Client : 211.234.52.10
Source Target
211.234.52.10 : 1704 - 211.234.52.20 : 23 /* ls, pwd 등 명령만 출력 */
211.234.52.20 : 23 - 211.234.52.10 : 1704 /* ls, pwd 등 명령와 결과도 출력 */
** 패킷 모니터링 (모티터 출력)
[root@linux mk]# ./sniffit -d -t 211.234.52.10
[root@linux mk]# ./sniffit -d -t 211.234.52.20 -p 23
** 패킷 모니터링 (파일출력)
[root@linux mk]# ./sniffit -t 211.234.52.20 -p 23
파일명 : 211.234.52.10.1704-211.234.52.20.23 /* ls, pwd 등 명령만 출력 */
[root@linux mk]# ./sniffit -t 211.234.52.10
파일명 : 211.234.52.20.23-211.234.52.10.1704 /* ls, pwd 등 명령와 결과도 출력 */
일반모드(Normal mode)
각 커넥션에 대한 데이터가 "출발지IP.출발지포트-도착지IP.도착지포트"와 같은 형식으로 저장된다.
Dump 모드
-d, -a 옵션 등을 주었을 경우 데이터가 stdout으로 바로 출력된다.
-c : 설정파일 명시
-p : 특별히 감시할 포트 설정
-s : 발신지 IP로부터 들어오는 패킷을 수집
-t : 목적지 IP로부터 들어오는 패킷을 수집
인터렉티브 모드(Interactive mode)
-i, -I 옵션 등을 주었을 경우 데이터가 curses를 사용하는 터미널로 출력됩니다. 각 커넥션 리스트가 나오고 브라우징이 가능합니다.
F1 : 출발지 호스트에 대한 필터링
F2 : 목적지 호스트에 대한 필터링
F3 : 출발지 포트에 대한 필터링
F4 : 도착지 포트에 대한 필터링
PHoss
http://www.phenoelit.de/ 이라는 그룹에서 만든 패킷 스니퍼로서 HTTP, FTP, LDAP, Telnet, IMAP4, POP3 프로토콜의 로그인 패킷을 잡는다. ID/Password를 효과적으로 잡아 낼 수 있는 스니퍼이다.
Download : http://www.phenoelit.de/phoss/PHoss_src.tar.gz
설치조건 : libpcap 라이버리 (ftp://ftp.ee.lbl.gov/libpcap.tar.Z)
컴파일 및 사용법 :
[root@linux mk]#make
[root@linux mk]#./PHoss
특징 : 로그인 세션만을 잡아내기 위해서는 가장 적합한 스니퍼이다.
** 헤더파일 몇개를 수정해야 합니다. (MK)
#include <pcap/pcap.h>
#include <pcap/net/bpf.h>
Websniffer
tcpdump를 사용하여 같은 세크먼트 내로 흐르는 패킷을 잡아내 월드와이드 웹 포트(www 포트, 80번)로 가는 모든 패킷을 디코딩하여 보여준다. 기본적인 인증을 사용할 경우 ID와 Password 쌍을 디코딩해서 보여줍니다.
Download : http://packetstorm.securify.com/sniffers/websniffer.zip
설치조건 : Perl 5.003 이상, tcpdump
사용법 : sniffer.pl에서 tcpdump의 경로를 확인하여야 한다. 수퍼 유저 권한이 필요하며, 기본적으로 5000개 까지의 패킷을 디코드하여 보여준다.
[root@linux mk]# perl sniffer
결 과 :
[root@infosys websniffer]# perl sniffer.pl
Kernel filter, protocol ALL, datagram packet socket
tcpdump: listening on all devices
211.234.52.18 -> 211.234.52.24 GET /title.gif HTTP/1.1
211.234.52.18 -> 211.234.52.24 GET /icon.gif HTTP/1.1
211.234.52.18 -> 211.234.52.24 GET /doc.gif HTTP/1.1
211.234.52.18 -> 211.234.52.24 GET /apache_pb.gif HTTP/1.1
211.234.52.18 -> 211.234.52.24 GET /banner_wowlinux.gif HTTP/1.1
스니핑의 탐지
스니핑을 탐지하는 방법에는 일반적인 네트워크 인터페이스 정보를 조사하여 간단하게 알아 볼 수 있는 방법과 특정 디텍션 툴을 사용하는 2가지 방법이 있다.
promiscuous mode 이용
promiscuous mode로 설정되어 있는 이더넷 인터페이스를 찾아 스니핑을 하고 있는 호스트를 찾는 방법인데, 브로드캐스트 부분에서 Destination Address가 자신의 어드레서와 같을 때 패킷을 받아들이고 그렇지 않을 경우 버린(drop)지만, 스니핑 공격은 목적 어드레서(Destination Address)가 자신의 어드레서와 같지 않을 경우에도 패킷을 버리지 않고 받아 들인다. 이런 모드를 소위 promiscuous mode라고 한다.
ifconfig -a 나 ifconfig interface 명령을 이용해서 이더넷 인터페이스의 상태를 확인할 수 있다. 명령어를 실행 시킨 후 PROMISC라는 표시가 나타나면 스니핑이 가능한 상태에 있는 것이다.
이런 경우 자체 호스트에서의 스니핑 공격 여부와 함께 시스템 내부에 루트 킷(불법적으로 루트 권한을 빼앗은 침입자가 시스템의 각종 파일들을 위조 및 변조하여 자신의 침입 여부를 숨기고 향후 재 침입의 과정을 용이하게 만드는 불법적인 조작)을 비롯한 Tripwire(각 파일들에 대한 Original 설정 값을 기초로 각각의 파일들에 대한 위/변조 여부를 검증할 수 있는 무결성 검정도구) 설정 등을 철저하게 정밀 조사할 필요성이 있다.
Faked MAC address의 이용
이더넷 상의 다른 호스트에서 Ethernet Interface(NIC)가 promiscuous mode로 설정되어 있는 호스트를 찾는 또 하나의 방법은 Faked MAC address를 사용하는 것이다. MAC(Media Access Control) 어드레스란 LAN상에서 각각의 호스트들을 구별하기 위해서 사용되는 주소 값(IP와 마찬가지로 MAC 어드레스 또한 Unique한 값을 의미한다)을 의미하며, Faked MAC address라는 것은 실제로는 LAN상에서 존재하지 않는 가상의 MAC 어드레스를 의미한다.
Faked MAC address를 가지고 ICMP Echo Request를 보내거난 ARP request를 보내면 일반적인 경우(정상적인 경우)에서는 LAN상에 해당하는 MAC 어드레스를 가진 호스트가 없으므로 Reply를 받는 것 자체가 불가능 하지만, 특정 호스트가 스니핑을 하고 있다면 해당 호스트로부터 위조된 MAC 어드레스에 대한 Reply를 받을 수 있는 근거가 되므로 내부 네트워크에 존재하는 스니핑 공격의 여부를 확인 할 수 있다는 것이 핵심 알고리즘이다.
범용 도구 중에 Sentinel이라는 툴은 이러한 과정을 자동적으로 수행하여 자체 네트워크 환경에서의 스니핑 공격 여부를 자동적으로 탐지할 수 있는 도구인데 주기적으로 사용 할 것을 권고한다. (참조 : http://wwww.subterrain.net/projects/sentinel)
스니핑에 대한 방어책
1. 암호화
암호화를 사용하면 스니핑의 피해를 최소화 할 수 있다. 텔넷대신 SSH(Secure Shell)를, FTP 대신에 SCP를, 메일대신 GNUPG를 이용하면 암호화를 할 수 있다.
2. 암호를 안전하게 전달하는 시스템
보안키(Security Key)와 같은 OTP(One Time Password)를 사용하면 패스워드가 스니핑 당해도 다시 사용하지 못하게 된다. 왜냐하면 이미 전송된 암호는 인증이 이루어지는 순간 효력을 상실하기 때문이다.
3. 특수한 네트워크 장비의 사용
스위칭 허브와 같은 스위칭 장비를 사용하면 스니핑이 불가능해지며, 단지 자신의 트래픽만을 모니터링할 수 있을 뿐이다. IBM Token Ring adapters (TROPIC chipset)과 같은 랜카드는 promiscuous mode를 구현하지 않지만, 구하기 어렵기 때문에 비용적인 측면에서 유용하지 않다. 따라서 스위칭 허브를 사용하는 것이 비용면에서 적절할 것이라 생각된다.
스니퍼는 보안도구이다?
스니퍼는 기본적으로 네트워크 감청 도구이다. 그렇기 때문에 악의적인 사용자에게 의해 네트워크의 호스트상에 스니퍼가 설치되면 많은 피해를 감수 할 수 밖에 없다. 하지만 아이러니하게도 관리자 입장에서는 스니퍼가 네트워크의 트래픽을 감시하는 대단히 유동한 도구일 수도 있다. 외부로 노출된 호스트에 스니퍼를 설치해놓고 이루어진 커넥션을 통해 어떤 데이터가 오고가는가를 감시한다면 해커의 침입을 미리 막을 수 있다는 것이다.
스니퍼는 이렇게 네트웍를 감시하는 목적으로 유용하기 때문에 일부업체에서는 잘 만들어진 사용자 인터페이스를 포함하는 스니퍼 패키지를 판매하고 있기도 하다. 사실 프로그램에 무슨 죄가 있겠는가? 스니퍼는 사용하기에 따라 대단히 위험한 프로그램일 수도 있겠지만 앞서의 스캐너와 마찬가지로 잘만 사용하면 시스템에 침입하려는 시도를 미리 알 수 있다는 점에서 매우 효용이 높다. 또한 스니퍼가 무적의 해킹프로그램이 아니라는 점도 분명히 알아둘 일이다. 일단 적절한 환경에서 작동하기 시작하면 무서운 위력을 발휘하지만 그러기 위해서 우선 해커는 서버를 뚫고 들어가서 스니퍼를 올려놓아야 하고 또 그것을 적합한 권한으로 실행시켜야 한다.
또한 ifconfig나 ifstatus등의 프로그램으로 잡아낼 수도 있으므로 항상 스니핑이 성공하는 것도 아니다. 실제로 스니퍼의 하나인 snort는 시스템 보안도구로서도 상당한 명성을 날리고 있다. snort가 시스템을 감시할 수 있는 이유는 자신이 스니퍼로서 작동하면서 호스트에 오가는 패킷을 조사하기 때문이다. snort는 주어진 규칙에 의해 이 패킷 중에 문제가 될만한 것을 감시하고 경고 메시지를 보낸다.
이렇듯 스니퍼는 중요한 호스트에 설치되어서 해커의 침입을 감시하는데 훌륭하게 사용될 수 있다. [Ref. 1]
[Reference]
1. 프로그램세계, 2001년 3월, p. 182
2. 리눅스 보안의 모든것, 전승협 역, 2000, 인포북
3. 오태호, 보안에 관련 글