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 วินาที ไปเรื่อยๆ

Wednesday, December 5, 2007

SMTP LOGIN command

ที่เคย note เอาไว้นานแล้ว เรื่อง SMTP command หาดูได้ Labal เดียวกัน

ครั้งที่แล้วเขียนวิธี authen ไว้แค่แบบเดียวคือ แบบ PLAIN ซึ่งตอนที่เขียนโปรแกรม Bruter ก็พบว่า ถ้าเป็น SMTP server ของ Microsoft นั้นจะไม่มีแบบ PLAIN จะมีเฉพาะ LOGIN method

ก็มา note เพิ่มละกัน เกี่ยวกับ LOGIN method

ก่อนอื่นเราต้องทำ base64 encoding เหมือนกัน แต่คราวนี้ทำแยก username กับ password
ทำ username
base64.encodestring('user@domain.ext') เป็น dXNlckBkb21haW4uZXh0
base64.encodestring('password') เป็น cGFzc3dvcmQ=

เริ่ม authen
AUTH LOGIN
334 VXNlcm5hbWU6
dXNlckBkb21haW4uZXh0
334 UGFzc3dvcmQ6
cGFzc3dvcmQ=
235 2.0.0 OK Authenticated

ถ้าเอาที่อ่านไม่ออกทั้งหมดมาทำ decoding ด้วย base64 ก็จะเป็น
AUTH LOGIN
334 Username:
user@domain.ext
334 Password:
password
235 2.0.0 OK Authenticated

และก็จริงๆ แล้วสามารถส่ง username ได้ตั้งแต่บรรทัดแรกก็จะเป็นแบบนี้
AUTH LOGIN dXNlckBkb21haW4uZXh0
334 UGFzc3dvcmQ6
cGFzc3dvcmQ=
235 2.0.0 OK Authenticated

แต่ยังไงก็ต้องอย่าลืมดู response ถ้ามัน response กลับมาให้ใส่ username ก็ต้องส่ง username