사이트 내 전체검색
[linux] SNIFFING
로빈아빠
https://cmd.kr/server/412 URL이 복사되었습니다.

본문

SNIFFING

최근에는 해킹기술이 고도로 발달돼 예전에는 상 상할 수도 없었던 고난도의 해킹 기술들이 존재하게 됐다. 예전에는 기껏해봐야 관리자의 실수나 OS에서 실수를 한 프로그램들을 악용해 관리자의 권한을 얻는 것이 고작이었지만, 이제는 네트워크  상을 흘러 다니는 정보의 기본단위인 패킷(packet: 네트워크상에 정보를 송수신할 때 가장 기본이 되는 정보단위)을 하나하나 조작해  해킹을 하게 됐다.
이런 고난도 해킹의 예는 패킷 스니퍼링(packet sniffing)과,  IP 스푸핑(IP Spoofing: IP 사기 치기), NFS(Network File System) file handle  guessing, dns server cache poisoning(네임  서버(IP 에 일대일 매치되는 네임 어드레스를 관리하는 호스트)에 잠입해  가짜 호스트들을 만들고 나오는 것) 등이 있는데 이중에서 스니퍼링에 대해서만 다뤄 보기로 하자.

가장 심각한 해킹 기술, Sniffing
패킷들은 이더넷 케이블을 타고 전송이 된다. 이  패킷들은 어떤 유저가 어느 호스트에 로긴했다 는 정보 따위를 가지고 있는데,  이더넷 디바이스를 컨트롤해 흘러가는  패킷에서 원하는 정보인 유저들의 패스워드를 알아내는 것 으로서 요즘 가장 심각한 문제가 되는 해킹 기술이다. 최근 해커들의 공격들의 통계를 내본 자료를 보면 스니핑에 의한 공격이 가장 많은  것으로 나타나고 있다.

스니퍼(Sniffer)란 무엇인가?
스니퍼는 네크워크의 한 호스트에서 실행되어  그 주위를 지나다니는 패킷들을  엿보는 프로그램 으로서 계정과 패스워드를 알아 내기 위해서 침입자들에 의해 자주  사용되는데 아무리 네트워크 보안에 신경을 쓴 호스트라도 주 변의 호스트가 공격당해서 스니핑을  위해 사용된다면 무력해질 수밖에 없다. 이해를 돕기 위해 실제 스니핑 세션을 가지고 설명한다.
mordor# ./sniffit Log started at => Mon Apr 8 20:29:04 [pid 10937] -- TCP/IP LOG -- TM: Mon Apr 8 20:29:44 -- PATH: rohan.kaist.ac.kr(1270) => gondor.kaist.ac.kr(telnet) STAT: Mon Apr 8 20:29:48, 30 pkts, 77 bytes [TH_FIN] DATA: (255)(253)^C(255)(251)^X(255)(251)^_(255)(251)(255)(251)!(255)(251)"(255)(253)^E(255)(251)#(255)(251)$(255)(250)^X : IRIS-ANSI-NET(255)(240)(255)(253)^A(255)(252)^Aaragorn : evenstar : cls : du -s -k * : elm awen -- TCP/IP LOG -- TM: Mon Apr 8 20:31:57 -- PATH: mordor.kaist.ac.kr(2389) => gondor.kaist.ac.kr(telnet) STAT: Mon Apr 8 20:32:24, 106 pkts, 128 bytes [DATA LIMIT] DATA: (255)(253)&(255)(251)&(255)(253)^C(255)(251)^X(255)(251)^_(255)(251)(255)(251)!(255)(251)"(255)(251)$(255)(253)^E(255)(251)#(255)(250)^_ : P : ^X(255)(240)(255)(250) : 9600,9600(255)(240)(255)(250)^X : XTERM(255)(240)(255)(253)^A(255)(252)^Agaladriel : shwjdtjr=JD : : setenv DISPLAY rohan.kaist.ac.kr:0.0 : ne         
   
위는 스니퍼 프로그램을 돌린  결과이다. gondor, mordor,  rohan은 M학과의 전산실의 기계들인데 이미 침입자는 mordor에서 루트  권한을 따냈었고 스니퍼  프로그램을 실행시키고 있다(스니퍼가 동작하기 위해서는 네크워크 디 바이스의 조작이  필요한데 이는 루트(시스템 관리자)만이 할 수 있다). 그렇다면 물리적인 네크워크 구도에서 인접해있는 호스트 들은 모두 스니핑을 당하게 된다.
처음 블럭에서 rohan에서 gondor로 aragorn이라는  계정으로 telnet 로긴을 한  것이 잡혔는데 이때 패스워드가 evenstar임을 알 수 있다. 그리고 로긴 직후에 실행한 몇몇 명령까지 잡혔다. 일반적으로 스니퍼 프로그램은 비교 적 작은 크기의 제한된 버퍼를 사용하는데 필요에  따라 그것을 늘이기도 한다.

이더넷의 설계상 약점과 네트워크 스니퍼의 원리
가장 일반적인 LAN의 구성 방법은 이더넷을 사용하는 것으로 주변에서 가장 쉽게 접하는 경우이 다. 이더넷을 통한 통신 방법은  매우 간단하다. A라는 호스트가 B라는  호스트로 패킷을 보내고 싶다면 호스트 A는 B와의 배타적 인 연결을 통하는 것이 아니라 그 패킷을 이더넷에 뿌린다. 그리고 그 패킷은 일반적으로 수신 주소의 호스트만이  받도록 기대된 다. 즉 일반적으로 자신에게 오지 않는 패킷은 받지 않으므로 호스트 B만이 A가 보내는 패킷을 받게 된다.

그러나 그것은 기대 사항일 뿐  언제라도 깨어질 위험부담을 안고  있는 프로토콜이다. 네크워크 디바이스는 자신에게 오지 않고 다른 호스트를  향해 지나가는 패킷까지 받는 상태에  들어갈 수 있는데, 그때를 'Promiscuous mode'라고 부른다. 스니퍼는 바로  그 상태에서 동작한다. 이렇게 네트워크의 설계상의 커다란 약점이 있기 때문에 스니퍼에 의한  공격은 치명적이며 일부 OS를 제외하고는 찾아내기가 곤란한 경우가 많고 막기 위해서도 많은 부담이 따른다.

스니퍼의 설계
스니퍼는 너무나 쉽고, 비열하게 해킹을 할 수  있기 때문에 해커들 간에서는 스니퍼를 이용하는 해커를 3류 취급해 상대도 하지 않는다. 이처럼 스니퍼는  해커들 사이에서조차 금기(?)시되는 치사한 프로그램이지만 그 자체로 는 아주 훌륭한 네크워크 프로그램이다. 실제로 대부분의 네트워크 분석 프로그램들은 Promiscuous mode에서 동작하며 또 그럴 수밖에 없다.
그리고 스니퍼의 핵심을  이루는 코드는 대부분의  OS에서 독립된 프로토콜로서  지원을 하는데 SunOS의 NIT, IRIX의 SNOOP이 좋은 예이다. 잘만  이용하면 침입자들을 상대하는 관리자들에게 큰 무기가 될 수 있다. 네트워크를 감 시하는 데 사용할 수 있다는 말 이다.
netlog( ftp://ftp.cert-kr.or.kr/pub/tools/etc/netlog/netlog-1.2.tar.gz )라는 좋은 툴이 이미 있다. 이 툴의 성격을 잘 말해주듯이 telnet과 ftp의 모듈은 제외돼 있다. 패스워드 스니핑에 사용되는 것을  막기 위함일 것이다.

스니퍼는 일반적으로 다음과 같은 일련의 동작을 하는 코드로 구성된다.
1. 네트워크 디바이스를 열어서 Promiscuous mode로 만든다.
2. 지나가는 모든 패킷을 읽는다.
3. 패킷을 필터링해서 발신 및 수신 주소, 서비스(telnet, rlogin, ftp, smtp 등), 그리고  계정과 패스워드가 포함된 데이터를 구분해서 출력한다.

3번의 기능을 하는 코드가 생략된 스니퍼 소스를 참고로 소개한다. IRIX에서 SNOOP을 사용해 제 작되었다.
/* sgisniff.c by poison@baikdu.kaist.ac.kr uses SNOOP(7P) tested on IRIX 5.2, 5.3 */ #include <sys/types.h> #include <net/raw.h> #include <netinet/if_ether.h> #define ETHERHDRPAD RAW_HDRPAD(sizeof(struct ether_header)) struct etherpacket { struct snoopheader snoop; char pad[ETHERHDRPAD]; struct ether_header ether; char data[ETHERMTU]; }; main() { int s; struct sockaddr_raw sr; struct snoopfilter sf; struct etherpacket ep; int cc = 60000, on = 1; char buf[100]; s = socket(PF_RAW, SOCK_RAW, RAWPROTO_SNOOP); sr.sr_family = AF_RAW; sr.sr_port = 0; strncpy(sr.sr_ifname, "ec0", sizeof sr.sr_ifname); bind(s, &sr, sizeof sr); memset((char *)&sf, 0, sizeof sf); ioctl(s, SIOCADDSNOOP, &sf); setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *) &cc, sizeof cc); ioctl(s, SIOCSNOOPING, &on); for (;;) { cc = read(s, (char *) &ep, sizeof ep); write(1, (char *)&ep, sizeof ep); sleep(2); } }   
   

스니퍼 탐지
스니퍼는 Promiscuous mode에서 동작하기 때문에 네크워크 디바이스의 상태 플래그에 'PROMISC' 가 있다면 일단 스니퍼가 돌고  있다고 생각해도 좋다. SunOS  4.1.x 같은 BSD 계열의  유닉스나 IRIX에서는 'ifconfig'를 사용해서 스니퍼의 존재를 확인할  수 있으나 대부분의 다른 유닉스(특히 Solaris)에서는 그것이 불가능하 다.
[baikdu:/circ/kus/poison 2 ] uname -a SunOS baikdu 4.1.3-KL 3 sun4m [baikdu:/circ/kus/poison 3 ] ifconfig le0 le0: flags=163<UP,BROADCAST,NOTRAILERS,RUNNING,PROMISC> inet 143.248.1.8 netmask ffffff00 broadcast 143.248.1.0 [eru:/eldar/people/poison 16 ] uname -a IRIX eru 5.3 11091812 IP22 mips [eru:/eldar/people/poison 17 ] ifconfig ec0 ec0: flags=d63<UP,BROADCAST,NOTRAILERS,RUNNING,PROMISC,FILTMULTI,MULTICAST> inet 134.75.100.53 netmask 0xffff0000 broadcast 134.75.255.255         
   
SunOS 4.1.3, IRIX 5.3 에서 스니퍼 프로그램을 실행시키면서 ifconfig로 확인하면 다음과 같다.
두 기계에서 모두 flags를  나타내는 행에 'PROMISC'가 있는  것으로 스니퍼가 확인된다.  SunOS 4.1.x에서 사용 가능한 cpm이라는 프로그램이 있는데 ifconfig로 플래그를  조사하는 것과 같은 기능을 가진다. 일반적으로 스니퍼는 로그 파일을 만들어 데이터를 모은다. 따라서  그 로그 파일을 찾을 수 있으면 스니퍼를 찾기가 쉬어진다. 우선 다음과 같은 간 단한 방법이 있다.
다른 호스트로 연결을 하면 스니퍼 로그 파일에 로그가 새로 만들어지게 되므로  미리 만들어 두 었던 /tmp/sniff_trap이란 파일을 기준으로 해 찾을 수가 있다. 단 빠른 결과를 위해 루트에서 프로세스의 우선권을 최대로 한다. 보다 확실히 하기 위해서 현재 열려져 있는 모든 파일의 리스트를 알 수 있다면 그 속에 스니퍼 로그 파일도 포함돼 있을 것이 므로 스니퍼를 찾는데 도움이 된다. lsof( ftp://ftp.cert-kr.or.kr/pub/tools/lsof ) 이라는 툴 의 사용을 권한다.

스니퍼 로그 파일을 찾아 없앴다면 스니퍼  프로세스를 찾도록 노력해본다. 시스템을 리부팅하면 되겠지만 그보다 침입자를 추적 하고 싶다면 그  프로세스를 직접 찾아내는 것이 바람직하다. 루트로 실행되고 있는 프로세스 중 에서  수상한 것들을 찾는다. ./a.out, ./in.telnetd,  in.uucpd 등으로 숨겨지는 게 보통인데 알아내기 어렵잖다.
# touch /tmp/sniff_trap # telnet gondor.kaist.ac.kr SunOS UNIX (gondor) login: blah Password: Login incorrect login:^D Connection closed by foreign host. # nice -19 find / -newer /tmp/sniff_trap -print

BSD ps(/usr/ucb/ps)가 사용 가능하다면  e옵션을 추가해서 프로세스가  시작됐을 때의 환경변수를 알아내어 어떤 계정이 해킹에 사용됐는지를 알아낼 수 있다.

어떻게 예방해야 하나?
스니퍼에 대비하는 방법의 원칙은 패스워드가 네트워크를 통해 전달되지 않게 하는 것이다. 그것의 구현은 암호화를 이용하거나 (secure shell, kerberos) 패스워드를 대신하는 토큰을 이용(S/key)하는 것을 예로 들 수 있다. 그런 부류의 소프트웨어들은 상 당수가 제작돼있는데 그중 공개 소프트웨어인 ssh(Secure Shell: http://www.cs.hut.fi/ssh )이 사용하기에 가장 무난하다. 이것은 패킷을 암호화해 sshd(서버)에게 보내는 ssh,scp(클라이언트)가 telnet, rlogin, ftp를 대신하 는 패키지이다.

댓글목록

등록된 댓글이 없습니다.

1,139 (10/23P)

Search

Copyright © Cmd 명령어 18.188.96.17