Sunday, December 30, 2007

VNC anti brute force algorithm

ในที่สุดก็ได้ update blog ฉลองปีใหม่ ก่อนอื่นก็ต้อง Happy New Year :D

ตอนนี้กำลังเขียน module ทำ brute force ตัว VNC ของ Bruter อยู่ ตอนที่กำลังหาทดสอบอยู่ ก็พบกับความประหลาดใจ เนื่องจากเป็น protocol แรก ที่เจอระบบ anti brute force ที่ไม่ใช่การ lock out user

ก่อนเริ่มอธิบาย ต้องบอกก่อนว่าตัว VNC server ที่ทดสอบก็มี RealVNC, UltraVNC และ TightVNC โดย RealVNC จะแบ่ง version เป็น 3.x กับ 4.x ซึ่ง 2 version นี้จะมีระบบ anti brute force ต่างกันนิดหน่อย และตัว UltraVNC กับ TightVNC จะใช้ระบบเดียวกันกับ RealVNC 3.x

RealVNC 3.x anti brute force algorithm
if (strcmp(current->_machineName, machine) == 0) {
// If the host is already blocked then ignore
if (current->_blocked)
return;

// Set the RefTime & failureCount
current->_lastRefTime.QuadPart = now.QuadPart + 10;
current->_failureCount++;

if (current->_failureCount > 5)
current->_blocked = TRUE;
return;
}
source code จากไฟล์ winvnc/vncserver.cpp, function: AddAuthHostsBlacklist()

ตัว VNC server จะยอมให้มีการ login ผิดได้ 5 ครั้งจาก IP เดียวกัน หลังจากนั้นผิดครั้งหนึ่งจะ block 10 วินาที ตัว VNC server จะเริ่มนับ 0 ใหม่เมื่อมีการ login ถูกจาก IP ที่เป็น blacklist เท่านั้น

RealVNC 4.x anti brute force algorithm
if ((*i).second.marks >= threshold) {
// Yes - entry is blocked - has the timeout expired?
time_t now = time(0);
if (now >= (*i).second.blockUntil) {
// Timeout has expired. Reset timeout and allow
// a re-try.
(*i).second.blockUntil = now + (*i).second.blockTimeout;
(*i).second.blockTimeout = (*i).second.blockTimeout * 2;
return false;
}
// Blocked and timeout still in effect - reject!
return true;
}

// We haven't reached the threshold yet.
// Increment the black-mark counter but allow
// the entry to pass.
(*i).second.marks++;
return false;
โดยมีตัวแปร threshold เป็น 5 และ initialTimeout เป็น 10
source code จากไฟล์ rfb/BlackList.cxx

อธิบายง่ายๆ ก็คือเหมือนกับ RealVNC 3.x แต่จะ block นานขึ้นสองเท่าจากของเดิมเรื่อยๆ คือครั้งแรก 10 วินาที ครั้งที่สอง 20 วินาที ครั้งที่สาม 40 วินาที ไปเรื่อยๆ

1 comment: