Back

Cyber Security: เรียนรู้ Brute Force AttackBlur image

ยินดีต้อนรับสู่ ห้องปฏิบัติการ Brute Force Attack! บทความนี้จะพาไปเรียนรู้เทคนิคการโจมตี web application ที่พบบ่อยและถือเป็นพื้นฐานสำคัญของงานด้าน cybersecurity พร้อมแนวทางป้องกัน

เนื้อหาแบ่งเป็น 3 ส่วนที่ต่อยอดกัน:

  1. แนวคิด — Brute Force Attack คืออะไร มีกี่ประเภท และป้องกันได้อย่างไร
  2. การติดตั้ง Lab — ติดตั้ง DVWA (web application ที่จงใจเปิดช่องโหว่ไว้) และ Burp Suite บน Ubuntu VM
  3. ลงมือโจมตีและป้องกัน — intercept request, ทำ brute force อัตโนมัติด้วย Burp Intruder แล้วศึกษาแนวทางป้องกันที่หยุดการโจมตีนี้ได้

1. แนะนำ Brute Force Attack#

1.1 ข้อกำหนดเบื้องต้น#

ก่อนเริ่มห้องปฏิบัติการนี้ ควรเตรียมสิ่งต่อไปนี้:

  • ✅ ติดตั้ง Ubuntu VM — ติดตั้ง Ubuntu บน VirtualBox เรียบร้อยแล้ว
  • ✅ พื้นฐานคำสั่ง Linux — ใช้งาน terminal เบื้องต้นได้
  • ✅ ความรู้เรื่อง SSH — เข้าใจการเชื่อมต่อเข้าสู่ VM จากระยะไกล

📚 หากยังใหม่กับ Linux: ศึกษาการติดตั้ง Ubuntu VM และพื้นฐาน command-line ได้จาก Linux Security Lab Tutorial ↗

1.2 Brute Force Attack คืออะไร?#

Brute Force Attack คือการโจมตีด้วยการลองค่าซ้ำไปมาเพื่อค้นหาข้อมูลสำคัญ เช่น รหัสผ่านหรือ PIN โดยไล่ทดลองค่าที่เป็นไปได้ทั้งหมดอย่างต่อเนื่องจนกว่าจะพบค่าที่ถูกต้อง

# Password attempts in a brute force attack
password1   -> Incorrect
password123 -> Incorrect
admin123    -> Incorrect
letmein     -> Incorrect
password    -> SUCCESS
bash

1.3 Brute Force Attack ทำงานอย่างไร#

Brute Force Attack Flow

ขั้นตอนหลักมี 4 ระยะตามภาพ: เตรียมรายการรหัสผ่าน (Password List) → ส่งเข้าสู่หน้า login (Submit to Login) → ตรวจสอบ response ที่ได้กลับมา (Check Response) → พบรหัสผ่านที่ถูกต้อง (Password Found)

ผู้โจมตีจะป้อนรายการรหัสผ่านที่เป็นไปได้ให้เครื่องมือส่งเข้าไปยัง login form ทีละค่า แล้วสังเกต response ที่ได้กลับมา โดยทั่วไป response ของการลองที่ผิดกับที่ถูกต้องจะต่างกัน ไม่ว่าจะเป็นข้อความที่แสดง ขนาดของหน้า หรือการ redirect ความแตกต่างนี้เองคือสัญญาณที่บอกว่ารหัสผ่านใดถูกต้อง

1.4 ตัวอย่างเวลาในการถอดรหัส#

รหัสผ่านจำนวนตัวอักษรเวลาในการถอดรหัส (1000 ครั้ง/วินาที)
12344 ตัวเลข~10 วินาที
password8 ตัวพิมพ์เล็ก~2 ชั่วโมง
Password18 ผสม~3 วัน
P@ssw0rd!8 พร้อมสัญลักษณ์~5 เดือน
MySecur3P@ss!14 พร้อมสัญลักษณ์~400 ล้านปี

Time to Crack a Password

ข้อควรรู้: ความยาวและความซับซ้อนของรหัสผ่านส่งผลอย่างมากต่อระยะเวลาในการถอดรหัส


2. ประเภทของ Brute Force Attack#

Types of Brute Force Attacks

2.1 Simple Brute Force (แบบพื้นฐาน)#

ไล่ทดลองทุกความเป็นไปได้ของรหัสผ่านอย่างเป็นระบบ

a, b, c, ..., z
aa, ab, ac, ..., zz
aaa, aab, aac, ...
bash

ข้อดี: พบรหัสผ่านได้แน่นอนหากให้เวลามากพอ ข้อเสีย: ใช้เวลานานมากเมื่อรหัสผ่านมีความซับซ้อนสูง

2.2 Dictionary Attack (โจมตีด้วยรายการรหัสผ่าน)#

ใช้รายการรหัสผ่านยอดนิยมหรือ wordlist สำเร็จรูปในการโจมตี

# Common password list examples
password
123456
admin
qwerty
letmein
welcome
bash

ข้อดี: เร็วกว่า simple brute force ข้อเสีย: มีประสิทธิภาพเฉพาะกับรหัสผ่านที่คาดเดาได้ง่าย

2.3 Hybrid Attack (โจมตีแบบผสม)#

นำคำจาก dictionary มาผสมกับรูปแบบที่หลากหลาย เช่น เติมตัวเลขหรือสัญลักษณ์

password -> password1, password123, password!
admin    -> admin1, Admin2024, admin@2024
bash

ข้อดี: ได้ผลดีกับรหัสผ่านที่นิยมนำคำทั่วไปมาดัดแปลง ข้อเสีย: ยังต้องใช้เวลาและทรัพยากรในการประมวลผล

2.4 Credential Stuffing (นำข้อมูลที่รั่วไหลมาลองซ้ำ)#

ใช้ username/password ที่รั่วไหลจาก data breach มาทดลองเข้าสู่ระบบอื่น โดยอาศัยพฤติกรรมการตั้งรหัสผ่านซ้ำกันในหลายเว็บ

ข้อดี: มีโอกาสสำเร็จสูงหากผู้ใช้ตั้งรหัสผ่านซ้ำ ข้อเสีย: ต้องอาศัยข้อมูลจากฐานข้อมูลที่รั่วไหล


3. การป้องกัน Brute Force Attack#

Brute Force Defense Flow

ไม่มีมาตรการใดเพียงอย่างเดียวที่หยุด brute force attack ได้ การป้องกันที่ดีเกิดจากการใช้หลายเทคนิคด้านล่างร่วมกัน เพื่อหน่วง ตรวจจับ และล็อคผู้โจมตีในที่สุด

3.1 ใช้รหัสผ่านที่แข็งแกร่งและซับซ้อน (Strong Passwords)#

รหัสผ่านที่ดีควรมีลักษณะดังนี้:

  • ยาว: อย่างน้อย 12–16 ตัวอักษร
  • หลากหลาย: ผสมทั้งตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก ตัวเลข และสัญลักษณ์
  • ไม่ซ้ำกัน: ใช้รหัสผ่านต่างกันในแต่ละบัญชี
  • คาดเดายาก: เลี่ยงคำทั่วไปหรือรูปแบบที่เดาได้ง่าย
# Bad
password123
admin2024
qwerty123

# Good
Tr0ub4dor&3Horse!

# Better (passphrase)
correct-horse-battery-staple

# Best
Use a password manager!
bash

3.2 จำกัดจำนวนครั้งในการ Login (Rate Limiting)#

จำกัดจำนวนครั้งที่ login ผิดได้ภายในช่วงเวลาหนึ่ง

# Example rate limiting logic
if failed_attempts > 5:
    block_ip_address()
    wait_time = 2 ** failed_attempts  # exponential backoff
python

แนวทางที่นิยมใช้:

  • เพิ่มเวลาหน่วงระหว่างการ login แต่ละครั้ง
  • บล็อก IP ชั่วคราวหลัง login ผิดหลายครั้ง
  • แสดง CAPTCHA หลังลองผิดหลายครั้ง
  • ใช้ exponential backoff เช่น 1s, 2s, 4s, 8s

3.3 เปิดใช้งาน Two-Factor Authentication (2FA)#

เพิ่มขั้นตอนยืนยันตัวตนอีกชั้นนอกเหนือจากรหัสผ่าน

Factor 1: Something you KNOW -> Password
Factor 2: Something you HAVE -> Phone / Token
Factor 3: Something you ARE  -> Biometric
bash

ตัวอย่างวิธีการ 2FA:

  • SMS OTP (One-Time Password)
  • Authentication App (Google Authenticator, Authy)
  • Hardware Token (YubiKey)
  • Biometric Verification

3.4 นโยบายการล็อคบัญชี (Account Lockout)#

ล็อคบัญชีชั่วคราวเมื่อ login ผิดซ้ำหลายครั้ง

การพยายามล้มเหลวการดำเนินการ
3–5แจ้งเตือน + หน่วงเวลา
5–10ล็อคชั่วคราว (15–30 นาที)
10+ล็อคนานขึ้น + แจ้งผู้ดูแลระบบ

คำเตือน: หากตั้งค่าระบบล็อคบัญชีไม่เหมาะสม อาจถูกใช้เป็นช่องทางทำ DoS ได้ จึงควรใช้ร่วมกับ rate limiting ตาม IP แทนการพึ่งการล็อคบัญชีเพียงอย่างเดียว

3.5 ตรวจสอบและแจ้งเตือน (Monitoring & Alerts)#

บันทึกกิจกรรมผิดปกติและแจ้งเตือนผู้ดูแลระบบ ตัวอย่างเหตุการณ์ที่ควรแจ้งเตือน:

- Login ล้มเหลวหลายครั้งจาก IP เดียวกัน
- Login จากตำแหน่งที่ผิดปกติ
- Login ในช่วงเวลาที่ไม่ปกติ
- Login พร้อมกันจากหลาย IP
bash

4. Lab Setup — DVWA Installation (ติดตั้งห้องปฏิบัติการ DVWA)#

ส่วนนี้จะตั้งค่าห้องปฏิบัติการด้วย DVWA (Damn Vulnerable Web Application) ซึ่งเป็น web application ที่ออกแบบมาสำหรับการฝึกด้าน cybersecurity โดยเฉพาะ

4.1 ข้อกำหนดเบื้องต้น#

  • Ubuntu Linux VM จากบทก่อนหน้า
  • Firefox browser บน Ubuntu
  • การเชื่อมต่ออินเทอร์เน็ตภายใน VM

4.2 เริ่มต้น Ubuntu VM#

ใน VirtualBox ให้ดับเบิลคลิกที่ Ubuntu Linux VM เพื่อเริ่มต้นระบบ

4.3 ใช้ SSH เพื่อคัดลอกคำสั่งได้สะดวกขึ้น#

💡 Pro Tip: การเชื่อมต่อผ่าน SSH ช่วยให้ copy-paste คำสั่งจากบทความเข้าสู่ VM ได้สะดวกกว่าการพิมพ์เองทั้งหมด

ระหว่างอ่านบทความและใช้งาน terminal บน VM อาจต้องสลับหน้าต่างไปมาตลอดเวลา การใช้ SSH ช่วยให้เปิดบทความบน host machine และรันคำสั่งใน Ubuntu VM ได้โดยตรง

SSH Tutorial Diagram

ข้อดีของ SSH

  • ✅ คัดลอกคำสั่งจาก browser ได้โดยตรง
  • ✅ อ่านบทความบนหน้าจอหลักได้สะดวกกว่า
  • ✅ แยก browser และ terminal ออกจากกันชัดเจน
  • ✅ ลดการสลับหน้าต่าง VM ไปมา

ตรวจสอบว่า SSH service ทำงานอยู่ (ได้ตั้งค่า SSH ไว้แล้วในบทก่อนหน้า):

sudo service ssh status
bash

ผลลัพธ์ที่คาดหวัง:

● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/usr/systemd/system/ssh.service; enabled)
     Active: active (running)
bash

หากยังไม่ทำงาน ให้สั่งเริ่มการทำงานและตั้งให้เริ่มอัตโนมัติหลัง reboot:

sudo service ssh start
sudo systemctl enable ssh
bash

เชื่อมต่อจาก host machine ทั้งบน Windows (Command Prompt หรือ PowerShell), macOS และ Linux (Terminal) ใช้คำสั่งเดียวกัน:

ssh -p 2222 your_username@localhost
bash

แทนที่ your_username ด้วย username ของ Ubuntu (เช่น u6090059) แล้วใส่รหัสผ่านเมื่อระบบถาม เมื่อเชื่อมต่อสำเร็จ prompt จะเปลี่ยนไปเป็น:

your_username@your_hostname:~$
bash

SSH Connection

คำสั่ง SSH ที่ใช้บ่อย:

TaskCommand
Connect to VMssh -p 2222 user@localhost
Exit SSH sessionexit หรือ Ctrl + D
Copy from browserHighlight text + Ctrl + C
Paste in terminalCtrl + Shift + V หรือ right-click paste

ทดสอบการเชื่อมต่อ เมื่อเชื่อมต่อผ่าน SSH แล้ว ให้ลองรันคำสั่งต่อไปนี้:

pwd
whoami
uname -a
bash

ผลลัพธ์ที่คาดหวัง:

/home/your_username
your_username
Linux your_hostname 6.5.0-... #ubuntu SMP ...
bash

SSH Test Commands

🎯 หลังจากนี้ คำสั่งทั้งหมดในบทความจะถือว่าเชื่อมต่อผ่าน SSH แล้ว จึงคัดลอกจาก browser ไปวางใน terminal ได้โดยตรง

4.4 ติดตั้ง Apache, MariaDB และ PHP#

อัปเดตระบบก่อน:

sudo apt update
sudo apt upgrade -y
bash

ติดตั้ง dependencies ที่จำเป็น:

sudo apt install -y apache2 mariadb-server php php-mysql php-gd libapache2-mod-php
bash

ตรวจสอบว่า Apache ทำงานอยู่:

sudo systemctl status apache2
bash

ผลลัพธ์ที่คาดหวัง:

● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled)
     Active: active (running) since ...
bash

เปิด Firefox ใน Ubuntu VM แล้วไปที่ http://localhost ↗ จะเห็น Apache2 Ubuntu Default Page ซึ่งยืนยันว่า Apache ทำงานได้ถูกต้อง

Apache Default Page

4.5 ทำความเข้าใจ Apache ด้วยหน้าเว็บแรก#

Apache เป็น web server software ที่ให้บริการไฟล์ผ่าน HTTP เมื่อมีการเข้าถึง http://localhost Apache จะมองหาไฟล์ใน /var/www/html/ แล้วส่งกลับไปยัง browser

Browser Request: http://localhost/test/
         |
Apache receives request
         |
Looks for: /var/www/html/test/index.html
         |
Sends file back to browser
bash

ลองสร้างหน้าเว็บอย่างง่ายเพื่อดูการทำงานนี้ โดยสร้าง test directory และไฟล์ HTML:

sudo mkdir -p /var/www/html/test
sudo nano /var/www/html/test/index.html
bash

ใส่เนื้อหาต่อไปนี้:

<!DOCTYPE html>
<html>
<head>
    <title>My Test Page</title>
</head>
<body>
    <h1>Hello World</h1>
    <p>This is my first web page on Apache!</p>
</body>
</html>
html

กด Ctrl + O, Enter, แล้ว Ctrl + X เพื่อบันทึกและออก จากนั้นตั้งค่า ownership และ permissions ของไฟล์:

sudo chown -R www-data:www-data /var/www/html/test
sudo chmod -R 755 /var/www/html/test
bash

เปิด Firefox (ภายใน Ubuntu VM) แล้วไปที่ http://localhost/test/ ↗ จะเห็นหัวข้อ “Hello World” พร้อมข้อความด้านล่าง ยืนยันว่า Apache ให้บริการไฟล์ที่สร้างไว้

Hello World Page

💡 แนวคิดสำคัญ: URL จะ map ไปยังไฟล์ในระบบ โดย http://localhost/test/ map ไปที่ /var/www/html/test/ และ Apache จะให้บริการ index.html โดยอัตโนมัติ DVWA ก็ทำงานแบบเดียวกัน — http://10.0.2.15/dvwa/ map ไปที่ /var/www/html/dvwa/ (แทนที่ 10.0.2.15 ด้วย IP address จริง)

4.6 ดาวน์โหลดและตั้งค่า DVWA#

ติดตั้ง git แล้ว clone DVWA ลงใน web root ของ Apache:

sudo apt install git -y
cd /var/www/html
sudo git clone https://github.com/digininja/DVWA.git dvwa
sudo chown -R www-data:www-data /var/www/html/dvwa
bash

สร้างไฟล์ config ของ DVWA จาก template แล้วแก้ไข:

cd /var/www/html/dvwa/config
sudo cp config.inc.php.dist config.inc.php
sudo nano config.inc.php
bash

หาบรรทัดรหัสผ่านฐานข้อมูล แล้วตรวจสอบให้ตรงกับรหัสผ่านที่จะตั้งในขั้นตอนถัดไป:

$_DVWA[ 'db_password' ] = getenv('DB_PASSWORD') ?: 'p@ssw0rd';
php

กด Ctrl + O, Enter, แล้ว Ctrl + X เพื่อบันทึก จากนั้นตั้งค่า permissions ให้กับ path ที่ต้องเขียนไฟล์ได้:

sudo chmod 666 /var/www/html/dvwa/hackable/uploads/
sudo chmod 666 /var/www/html/dvwa/config/config.inc.php
bash

เปิดใช้งาน allow_url_include ใน PHP:

sudo nano /etc/php/8.1/apache2/php.ini
bash

กด Ctrl + W พิมพ์ allow_url_include แล้ว Enter เพื่อกระโดดไปยังบรรทัดนั้น จากนั้นเปลี่ยนจาก:

allow_url_include = Off
ini

เป็น:

allow_url_include = On
ini

บันทึกด้วย Ctrl + O, Enter, Ctrl + X แล้ว restart Apache:

sudo systemctl restart apache2
bash

4.7 สร้าง Database และ User#

เปิด MariaDB shell:

sudo mysql
bash

ที่ prompt ให้สร้าง database และ user โดยรหัสผ่านต้องตรงกับที่ตั้งไว้ใน config.inc.php:

CREATE DATABASE dvwa;
CREATE USER 'dvwa'@'localhost' IDENTIFIED BY 'p@ssw0rd';
GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwa'@'localhost';
FLUSH PRIVILEGES;
EXIT;
sql

Note: MariaDB เป็น drop-in replacement ของ MySQL คำสั่งเหล่านี้จึงใช้ได้เหมือนกัน

4.8 เข้าถึง DVWA#

หา IP address ของ VM โดยติดตั้ง net-tools ก่อน (เพื่อใช้คำสั่ง ifconfig):

sudo apt install net-tools -y
ifconfig
bash

จะพบ IP address ในลักษณะเช่น 10.0.2.15 หรือ 192.168.56.x

ifconfig output

เปิด Firefox บน Ubuntu แล้วไปที่ http://10.0.2.15/dvwa/setup.php ↗

Note: แทนที่ 10.0.2.15 ด้วย IP จริงของ VM หรือใช้ http://localhost/dvwa/setup.php ↗ เมื่อทำงานภายใน VM

คลิกปุ่ม Create / Reset Database เพื่อให้ DVWA สร้าง database tables และเพิ่มข้อมูลตัวอย่างให้โดยอัตโนมัติ

DVWA Setup Page

Note: หากเกิด error ให้ตรวจสอบว่า database credentials ใน config.inc.php ตรงกับ user ที่สร้างไว้ในขั้นตอน 4.7

จากนั้น login เข้าสู่ DVWA:

URL:      http://10.0.2.15/dvwa/login.php
Username: admin
Password: password
bash

DVWA Dashboard

DVWA After Login


5. การเข้าใจ Brute Force Vulnerability#

5.1 สำรวจ DVWA Brute Force Module#

ไปที่ http://10.0.2.15/dvwa/security.php ↗ ตั้งค่า security level เป็น Low แล้วคลิก Submit

DVWA Security Level Low

Note: DVWA มี security level ทั้งหมด 4 ระดับ (Low, Medium, High, Impossible) บทความนี้ใช้ระดับ Low ในการเรียนรู้ เพราะมี security controls น้อย ทำให้เข้าใจขั้นตอนของ brute force attack ได้ง่ายขึ้น

จากนั้นไปที่ http://10.0.2.15/dvwa/vulnerabilities/brute/ ↗ แล้วลองเข้าสู่ระบบด้วยข้อมูลที่ถูกต้อง:

Username: admin
Password: password
bash

ระบบควรแสดงข้อความ login สำเร็จ จากนั้นให้ logout แล้วทดลองใช้รหัสผ่านที่ไม่ถูกต้อง:

Username: admin
Password: wrongpass
bash

สังเกต URL ที่เกิดขึ้น:

http://10.0.2.15/dvwa/vulnerabilities/brute/?username=admin&password=wrongpass&Login=Login
bash

Note: แทนที่ 10.0.2.15 ด้วย IP จริงของ VM — IP ที่ปรากฏใน URL จะเป็นของ VM ที่ใช้งาน

จุดสังเกตสำคัญ: username และ password ถูกส่งผ่าน GET request ทาง URL query parameters จึง intercept และแก้ไข request ได้ง่ายมาก

5.2 การเข้าใจ GET และ POST#

GET vs POST

Methodวิธีส่งข้อมูลความปลอดภัยการมองเห็น
GETส่งผ่าน URL query parametersปลอดภัยน้อยกว่ามองเห็นได้ใน URL, browser history และ logs
POSTส่งผ่าน request bodyปลอดภัยกว่าไม่แสดงใน URL
# GET request (DVWA Low ใช้วิธีนี้)
GET /dvwa/vulnerabilities/brute/?username=admin&password=wrongpass HTTP/1.1

# POST request (ปลอดภัยกว่า)
POST /dvwa/vulnerabilities/brute/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded

username=admin&password=wrongpass
http

6. การติดตั้ง Burp Suite Community Edition#

Burp Suite เป็น interception proxy มาตรฐานอุตสาหกรรมที่นิยมใช้ทดสอบความปลอดภัยของ web application

6.1 ดาวน์โหลด Burp Suite#

เปิด Firefox บน Ubuntu แล้วไปที่ https://portswigger.net/burp/communitydownload ↗ และดาวน์โหลดเวอร์ชัน Linux (shell script)

6.2 ติดตั้ง Burp Suite#

เข้าไปยังโฟลเดอร์ Downloads กำหนดสิทธิ์ให้ installer execute ได้ แล้วรัน:

cd ~/Downloads
ls -l burp*
sudo chmod +x burpsuite_community_*.sh
./burpsuite_community_*.sh
bash

ทำตามขั้นตอนใน installation wizard จนเสร็จ

6.3 เปิด Burp Suite#

เปิด Burp Suite ได้ 2 วิธี

วิธีที่ 1 — เปิดผ่าน Ubuntu Applications:

  1. คลิก Show Applications (ไอคอน grid) ที่มุมล่างซ้าย
  2. พิมพ์ Burp Suite ในช่องค้นหา
  3. คลิกเพื่อเปิดโปรแกรม

Burp Suite Application

วิธีที่ 2 — เปิดผ่าน command line:

cd /opt/BurpSuiteCommunity
./burpsuite
bash

ใน setup wizard คลิก Next เลือก Use Burp defaults แล้วคลิก Start Burp เพื่อเข้าสู่หน้าจอหลักของโปรแกรม

Burp Suite Interface

6.4 ตั้งค่า Firefox Proxy#

เปิด Firefox บน Ubuntu แล้วตั้งค่าให้ traffic ทั้งหมดวิ่งผ่าน Burp:

  1. คลิกปุ่มเมนู (สามขีด)
  2. ไปที่ Settings → Network Settings แล้วคลิก Settings
  3. เลือก Manual proxy configuration
  4. ตั้ง HTTP Proxy เป็น 127.0.0.1 และ Port เป็น 8080
  5. ติ๊ก Use this proxy for all protocols
  6. คลิก OK

Firefox Proxy Settings

ตรวจสอบ listener ใน Burp Suite ที่ Proxy → Proxy settings → Proxy:

  • Interface: 127.0.0.1
  • Port: 8080
  • Running: ✓ (เครื่องหมายถูกสีเขียว)

Burp Suite Proxy Settings

6.5 ติดตั้ง Burp Suite CA Certificate#

การให้ Burp intercept HTTPS traffic ได้ ต้องให้ Firefox เชื่อถือ certificate ของ Burp ก่อน

browser จะเชื่อถือเว็บ HTTPS ก็ต่อเมื่อ certificate ของเว็บถูกเซ็นโดย Certificate Authority (CA) ที่รู้จัก แต่ Burp ทำงานแบบ man-in-the-middle คือปลอม certificate ใหม่สำหรับแต่ละเว็บ โดยเซ็นด้วย CA ของ Burp เอง ซึ่ง Firefox ไม่รู้จัก จึงขึ้นคำเตือนและบล็อกหน้าเว็บไว้ การติดตั้ง CA ของ Burp ทำให้ Firefox เชื่อถือทุกอย่างที่ Burp เซ็น หน้า HTTPS จึงโหลดได้ตามปกติ ขณะที่ Burp ยังอ่านและแก้ไข traffic ได้

Why Burp Needs a CA Certificate

เปิด Firefox แล้วไปที่ http://burp ↗ คลิก CA Certificate จากนั้นบันทึกไฟล์ชื่อ cacert.der

Burp CA Certificate Download

จากนั้นนำเข้า certificate:

  1. ใน Firefox ไปที่ Settings → Privacy & Security
  2. เลื่อนไปที่ Certificates แล้วคลิก View Certificates
  3. ไปที่แท็บ Authorities แล้วคลิก Import
  4. เลือกไฟล์ cacert.der
  5. ติ๊ก Trust this CA to identify websites
  6. คลิก OK

Firefox Certificate Import


7. การ Intercept Requests ด้วย Burp Suite#

⚠️ ก่อนเริ่ม: ตรวจสอบว่า DVWA security level ถูกตั้งเป็น Low แล้ว โดยไปที่ http://10.0.2.15/dvwa/security.php ↗

How the Intercepting Proxy Works

Burp วางตัวอยู่ระหว่าง Firefox กับ DVWA ทุก request ที่ Firefox ส่งจะวิ่งผ่าน proxy ของ Burp ซึ่งสามารถหยุดค้าง ตรวจสอบ และแก้ไขได้ก่อนส่งต่อไปยัง server

7.1 เปิดใช้งาน Intercept Mode#

ใน Burp Suite:

  1. ไปที่แท็บ Proxy
  2. เปิดแท็บย่อย Intercept
  3. คลิกปุ่ม Intercept is on เพื่อเปิดใช้งาน

เมื่อเปิดใช้งานแล้ว Burp จะ intercept requests ทั้งหมดที่ส่งจาก Firefox

7.2 Intercept DVWA Login (ดักจับการ Login ของ DVWA)#

เมื่อเปิด Intercept แล้ว:

  1. เปิด DVWA Brute Force page ใน Firefox
  2. ทดลอง login ด้วย username admin และ password test123
  3. Firefox จะดูเหมือนค้าง ซึ่งเป็นพฤติกรรมปกติ เพราะ request ถูกหยุดค้างไว้ที่ Burp

สลับไปที่ Burp Suite จะเห็น intercepted request ดังนี้:

GET /dvwa/vulnerabilities/brute/?username=admin&password=test123&Login=Login HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 ...
Accept: text/html,application/xhtml+xml...
http

request ที่ถูกหยุดไว้จัดการได้ดังนี้:

ActionShortcutResult
ForwardCtrl + Fส่ง request ไปยัง server
DropCtrl + Dยกเลิก request
InterceptCtrl + Iเปิด/ปิด intercept

คลิก Forward เพื่อส่ง request ไปยัง DVWA

Burp Forward Action

7.3 ตรวจสอบ HTTP History#

ใน Burp Suite:

  1. ไปที่ Proxy → HTTP History
  2. คลิกเลือก DVWA login request ที่เพิ่งทำ เพื่อดูรายละเอียด

สังเกตโครงสร้างของ request:

Request line:
GET /dvwa/vulnerabilities/brute/?username=admin&password=test123&Login=Login

Headers:
Host: localhost
User-Agent: Mozilla/5.0...
Accept: text/html...

GET parameters:
username = admin
password = test123
Login    = Login
bash

จากนั้นคลิกแท็บ Response กรณีที่รหัสผ่านผิดจะพบข้อความ:

<pre><br />
Username and/or password incorrect.<br /><br /></pre>
html

Burp Response View

ข้อความ “incorrect” นี้คือเครื่องหมายที่ใช้แยกการลองที่ล้มเหลวออกจากการลองที่สำเร็จ


8. Automated Brute Force ด้วย Burp Intruder (ทำ Brute Force อัตโนมัติ)#

8.1 ส่ง Request ไปยัง Intruder#

จาก HTTP History ให้คลิกขวาที่ DVWA login request แล้วเลือก Send to Intruder จากนั้นสลับไปที่แท็บ Intruder

8.2 ตั้งค่า Attack Position#

ในแท็บ Intruder → Positions จะเห็น request ทั้งหมด ให้ระบุตำแหน่งค่าที่ต้องการโจมตี:

  1. คลิก Clear § เพื่อลบตำแหน่งเริ่มต้น
  2. Highlight เฉพาะค่า password (เช่น test123)
  3. คลิก Add §

Burp Highlight Payload

💡 Note: สัญลักษณ์ § เรียกว่า section sign ใน Burp Suite ใช้กำหนดตำแหน่งที่จะแทรก payload ระหว่าง attack

Request จะมีลักษณะดังนี้:

...username=admin&password=§test123§&Login=Login
bash

How Payload Positions Work

เครื่องหมาย §...§ ใช้กำหนด payload position คือตำแหน่งที่ Burp จะแทนค่าใหม่ในแต่ละ request ระหว่างการโจมตี Burp จะดึงค่าจาก payload list มาทีละค่า ใส่ลงในตำแหน่งนั้น แล้วส่ง request ออกไป ทำให้การรันครั้งเดียวครอบคลุมทั้ง list โดยอัตโนมัติ

8.3 ตั้งค่า Payloads#

ไปที่แท็บ Intruder → Payloads ตั้ง Payload type เป็น Simple list แล้วเพิ่มรหัสผ่านที่พบบ่อยลงใน Payload Options:

password
admin
123456
qwerty
letmein
welcome
admin123
password123
bash

Burp Payload List

8.4 ตั้งค่า Attack Settings#

ไปที่แท็บ Intruder → Settings ตั้ง Attack type เป็น Sniper (payload หนึ่งตำแหน่ง ทดสอบทีละค่าตามลำดับ)

จากนั้นเพิ่ม response filter เพื่อให้เห็นผลสำเร็จได้ชัดเจน:

  • Grep - Match: คลิก Add แล้วใส่คำว่า incorrect — Burp จะ flag ทุก response ที่มีคำว่า “incorrect” ดังนั้นรายการที่ ไม่มี flag คือการ login สำเร็จ
  • Grep - Extract (ทางเลือก): คลิก Add แล้ว highlight คำว่า “incorrect” ใน response เพื่อดึงมาแสดงในคอลัมน์แยกต่างหาก

Burp Grep Match

Burp Grep Extract

8.5 เริ่ม Attack#

คลิกปุ่ม Start attack ที่มุมขวาบน จะมีหน้าต่างผลลัพธ์เปิดขึ้น:

Payload #PayloadStatusLengthincorrect
1password2005120(ไม่มี flag)
2admin2004874✓
31234562004874✓

Burp Attack Results

จุดสังเกตสำคัญ:

  1. Status 200 หมายถึง server ตอบกลับเท่านั้น ไม่ได้แปลว่า login สำเร็จ
  2. Length ที่แตกต่างกัน บ่งบอกว่าเนื้อหา response ต่างออกไป
  3. Payload ที่มี length แตกต่าง และ ไม่มี flag “incorrect” คือรหัสผ่านที่ถูกต้อง

8.6 วิเคราะห์ Results#

Spotting the Successful Login

การลองที่ล้มเหลวจะมีลักษณะเหมือนกันหมด — response length เท่ากันและมี flag “incorrect” ส่วนการ login ที่สำเร็จคือรายการที่ผิดจากพวก: length ต่างออกไป และ ไม่มี flag “incorrect” ความแตกต่างเพียงจุดเดียวนี้คือสิ่งที่เปิดเผยว่ารหัสผ่านใดถูกต้อง

ในหน้าต่าง attack results:

  1. คลิกหัวคอลัมน์ Length เพื่อ sort แล้วมองหารายการที่เป็น outlier
  2. ตรวจสอบคอลัมน์ Grep — รายการที่ ไม่มี flag “incorrect” คือการ login สำเร็จ

ยืนยันผลด้วยการ login เองด้วยรหัสผ่านที่พบ:

Username: admin
Password: password
bash

9. Dictionary Attack ด้วย Password Lists (โจมตีด้วยรายการรหัสผ่าน)#

Dictionary Attack

9.1 ดาวน์โหลด Password Wordlist#

ใน Ubuntu terminal ให้ดาวน์โหลด wordlist สำเร็จรูปมาใช้งาน:

cd ~/Downloads
wget https://raw.githubusercontent.com/openwall/john/bleeding-jumbo/run/password.lst -O passwords.txt
bash

หากต้องการรายการที่ครอบคลุมกว่า ใช้ SecLists:

git clone https://github.com/danielmiessler/SecLists.git
bash

ตัวอย่างไฟล์ที่ใช้งานได้ดีใน SecLists:

  • Passwords/Common-Credentials/10-million-password-list-top-1000.txt
  • Passwords/Software/dragonfly41-top10k.txt

9.2 โหลด Wordlist ลงใน Burp#

กลับไปที่ Burp Suite Intruder:

  1. ไปที่แท็บ Payloads
  2. ใน Payload Options คลิก Load…
  3. เลือกไฟล์ ~/Downloads/passwords.txt แล้วคลิก Open

จะเห็นรายการรหัสผ่านจำนวนมากถูกโหลดเข้ามาแสดงในส่วน preview

9.3 รัน Dictionary Attack#

ปรับ settings ก่อนเริ่ม:

  1. ที่ Intruder → Settings → Request Engine ตั้ง threads เป็น 1–5 เพื่อไม่ให้ระบบ lab ทำงานหนักเกินไป
  2. ยืนยันว่า Attack type เป็น Sniper

คลิก Start attack แล้วรอจนกว่าจะเสร็จ

9.4 กรองและวิเคราะห์ผลลัพธ์#

ในหน้าต่างผลลัพธ์:

  1. คลิกคอลัมน์ Length เพื่อ sort และหา outlier
  2. ใช้ Grep - Match rule สำหรับคำว่า incorrect — รายการที่ ไม่มี flag คือการ login สำเร็จ

รายการที่สำเร็จจะมี response length แตกต่างจากรายการอื่น ไม่มีข้อความ “incorrect” และมักมีข้อความ welcome หรือมีการ redirect ไปหน้าอื่น


10. เทคนิคการวิเคราะห์ขั้นสูง#

10.1 การวิเคราะห์ Response Length#

Response length ที่ต่างกันบ่งบอกถึงผลลัพธ์ที่ต่างกัน:

ResponseLengthความหมาย
~4800 bytesBase lengthLogin ไม่สำเร็จ
~5100 bytesDifferent lengthLogin สำเร็จ

10.2 การใช้ Grep - Extract เพื่อกรองข้อมูลอย่างแม่นยำ#

แทนที่จะเปรียบเทียบ length ด้วยสายตา สามารถ extract ข้อความเฉพาะออกมาจากแต่ละ response ได้:

  1. ไปที่ Settings → Grep - Extract → Add
  2. Highlight ข้อความที่ต้องการ extract (เช่น “incorrect”)
  3. ยืนยัน start และ end markers
  4. ผลลัพธ์จะแสดงในคอลัมน์ใหม่ หนึ่งค่าต่อหนึ่ง request

10.3 ประเภทของ Burp Intruder Attacks#

Burp Intruder Attack Types

TypeคำอธิบายUse Case
Sniperpayload หนึ่งชุด ทดสอบทีละตำแหน่งSingle-field brute force
Battering Rampayload เดียวกันทุกตำแหน่งทดสอบค่าเดียวหลาย field
Pitchforkpayload หลายชุด จับคู่ตามลำดับUsername + password combinations
Cluster Bombทดสอบทุก combination ที่เป็นไปได้Cartesian product testing

11. เปรียบเทียบ DVWA Security Levels#

DVWA Security Levels

DVWA มีหน้า brute force เดียวกันที่เขียนไว้ 4 แบบ แบบละ security level เพื่อให้เห็นว่าการเพิ่มการป้องกันแต่ละชั้นทำให้โจมตียากขึ้นอย่างไร ตั้งแต่ระดับ Low ที่โจมตีได้ง่าย ไปจนถึง Impossible ที่แทบเจาะไม่ได้

11.1 Low Security (ระดับที่ทดสอบ)#

// No protection
if( isset( $_GET[ 'Login' ] ) ) {
    $user = $_GET[ 'username' ];
    $pass = $_GET[ 'password' ];
    // Check against database
    // No rate limiting
    // No lockout
}
php

credentials ถูกส่งจาก URL เข้าสู่ database โดยตรงโดยไม่มีการตรวจสอบอะไรคั่นกลาง ทั้งไม่มี delay ไม่มีการนับจำนวนครั้ง และไม่มี token จึงเป็นเหตุผลที่การโจมตีด้วย Burp Intruder ก่อนหน้านี้ทำได้รวดเร็ว เพราะ replay การเดารหัสผ่านนับพันครั้งได้ต่อเนื่องโดยไม่มีสิ่งใดขัดขวาง

จุดอ่อน:

  • ❌ ไม่มี rate limiting
  • ❌ ไม่มี account lockout
  • ❌ ใช้ GET request ทำให้ข้อมูลปรากฏใน URL และ history
  • ❌ ไม่มี CAPTCHA
  • ❌ ไม่มี delay ระหว่าง attempts

11.2 Medium Security (ระดับปานกลาง)#

// Some input sanitization added
$user = stripslashes( $user );
$pass = stripslashes( $pass );
$user = mysql_real_escape_string( $user );
$pass = mysql_real_escape_string( $pass );
// Still vulnerable to brute force
php

การ sanitize input ที่เพิ่มเข้ามาช่วยป้องกัน SQL injection ไม่ใช่ brute force เพราะยังไม่มี rate limiting หรือ account lockout การโจมตีด้วย Intruder แบบเดิมจึงยังใช้ได้ การแก้ช่องโหว่ประเภทหนึ่งไม่ได้ช่วยป้องกันช่องโหว่อีกประเภท

11.3 High Security (ระดับสูง)#

// Anti-CSRF token required on every request
checkToken( $user_token, $_SESSION[ 'session_token' ], 'index.php' );
php

anti-CSRF token คือค่าสุ่มลับที่ server ใส่ไว้ในหน้า login และผูกกับ session ทุก request ต้องส่ง token ที่ตรงกันกลับมา มิฉะนั้นจะถูกปฏิเสธ หน้าที่หลักคือป้องกัน Cross-Site Request Forgery แต่ยังช่วยขัดขวาง brute force ด้วย เพราะการเดาแต่ละครั้งต้องดึง token ใหม่จากหน้าเว็บก่อน ทำให้เครื่องมือที่เพียง replay request เดิมใช้ไม่ได้

11.4 Impossible Security (ระดับสูงสุด)#

// PDO with prepared statements
// Strong password hashing
// Comprehensive input validation
// Rate limiting
// Account lockout
// 2FA ready
php

ระดับนี้รวมการป้องกันทุกอย่างจากบทที่ 3 ไว้พร้อมกัน ทั้ง PDO prepared statements ที่ปิดช่องทาง SQL injection, password hashing (bcrypt/argon2) ที่ปกป้องข้อมูลแม้ database รั่วไหล และ rate limiting กับ account lockout ที่จำกัดความเร็วและจำนวนครั้งในการเดา การโจมตีจะถูกหน่วงจนหยุดก่อนที่ wordlist จะถูกทดสอบหมด ถือเป็น defense-in-depth ที่นำมาใช้อย่างถูกต้อง


12. การป้องกันในทางปฏิบัติ#

How Rate Limiting Stops Brute Force

12.1 ตัวอย่างการทำ Rate Limiting ด้วย PHP#

ตัวอย่าง rate limiter อย่างง่ายที่อาศัย session:

<?php
session_start();

// Check for an active lockout
if (isset($_SESSION['failed_attempts']) && $_SESSION['failed_attempts'] > 5) {
    if (time() < $_SESSION['lockout_time']) {
        die("Account locked. Try again later.");
    } else {
        // Lockout expired, reset the counters
        unset($_SESSION['failed_attempts']);
        unset($_SESSION['lockout_time']);
    }
}

// On a failed login, increment and lock if needed
if (login_failed) {
    $_SESSION['failed_attempts'] = isset($_SESSION['failed_attempts'])
        ? $_SESSION['failed_attempts'] + 1
        : 1;

    if ($_SESSION['failed_attempts'] > 5) {
        $_SESSION['lockout_time'] = time() + 900; // 15 minutes
    }
}
?>
php

12.2 Web Application Firewall (WAF) — ไฟร์วอลล์สำหรับเว็บแอปพลิเคชัน#

บังคับ rate limit ที่ระดับ web server หรือ WAF

# Nginx example
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;

location /login {
    limit_req zone=login burst=3 nodelay;
    # ... rest of config
}
nginx
# Apache mod_security example
SecAction "id:1001,phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR}"
SecRule IP:FAILED_LOGINS "@gt 5" "phase:1,deny,status:429,msg:'Rate limit exceeded'"
apache

13. Detection and Monitoring (การตรวจจับและเฝ้าระวัง)#

Detection &#x26; Monitoring

13.1 การวิเคราะห์ Logs#

การ login ล้มเหลวซ้ำหลายครั้งจาก IP เดียวกันคือลายเซ็นคลาสสิกของ brute force attack:

[2024-04-23 10:15:23] FAILED LOGIN - user: admin, IP: 192.168.1.100
[2024-04-23 10:15:24] FAILED LOGIN - user: admin, IP: 192.168.1.100
[2024-04-23 10:15:25] FAILED LOGIN - user: admin, IP: 192.168.1.100
bash

ตัวอย่างคำสั่งที่มีประโยชน์สำหรับ monitoring:

# Count failed logins by IP
grep "FAILED LOGIN" /var/log/auth.log | awk '{print $NF}' | sort | uniq -c

# Real-time monitoring of login POSTs
tail -f /var/log/apache2/access.log | grep "POST.*login"
bash

13.2 Alerting (การแจ้งเตือน)#

ควรตั้งค่า alert สำหรับเหตุการณ์ต่อไปนี้:

# Multiple failed logins from same IP (5+ in 1 minute)
alert: auth_failures > 5 within 60 seconds

# Login attempts from unusual locations
alert: country NOT in ["US", "CA", "UK", "TH"]

# Login attempts outside business hours
alert: time NOT BETWEEN 09:00 AND 17:00
bash

14. Quick Reference (สรุปอ้างอิงฉบับย่อ)#

14.1 Burp Suite Keyboard Shortcuts (คีย์ลัดของ Burp Suite)#

ShortcutAction
Ctrl + Iเปิด/ปิด intercept
Ctrl + FForward request
Ctrl + DDrop request
Ctrl + Shift + ISend to Intruder
Ctrl + Shift + RSend to Repeater

14.2 Password Wordlists ที่นิยมใช้งาน#

WordlistSizeSource
passwords.txt~3,000John the Ripper
rockyou.txt~14 millionBreach data
10k-most-common.txt10,000SecLists

14.3 Defense Checklist (เช็กลิสต์การป้องกัน)#

  • ✅ ใช้ strong password policy (12+ ตัวอักษร มีความซับซ้อน)
  • ✅ ตั้งค่า rate limiting (5 ครั้งต่อนาที)
  • ✅ ใช้ account lockout (15+ นาที)
  • ✅ เปิดใช้งาน 2FA / MFA
  • ✅ ใช้ CAPTCHA หลัง login ผิดหลายครั้ง
  • ✅ เปิด logging และ monitoring
  • ✅ ตั้งค่า WAF rules
  • ✅ บังคับใช้งาน HTTPS
  • ✅ เก็บรหัสผ่านด้วย bcrypt หรือ argon2

15. Next Steps (ขั้นตอนถัดไป)#

ขอแสดงความยินดี! เมื่อเรียนรู้และทดลองทำ Brute Force Attack Lab จบแล้ว จะได้สิ่งต่อไปนี้:

  • ✅ เข้าใจหลักการของ brute force attacks
  • ✅ เรียนรู้แนวทางป้องกัน
  • ✅ ฝึกใช้งาน DVWA
  • ✅ ใช้งาน Burp Suite ในการวิเคราะห์ requests
  • ✅ วิเคราะห์ผลลัพธ์จาก brute force attacks ได้

Recommended Learning Path

  1. SQL Injection — การโจมตีฐานข้อมูล
  2. Cross-Site Scripting (XSS) — Client-side attacks
  3. Session Hijacking — การขโมย session
  4. Security Testing Methodologies — OWASP Testing Guide
  5. Secure Coding — การพัฒนา software อย่างปลอดภัย

15.2 Practice Resources (แหล่งฝึกฝน)#

ResourceURL
OWASP Top 10https://owasp.org/www-project-top-ten/ ↗
Burp Suite Documentationhttps://portswigger.net/burp/documentation ↗
DVWA Documentationhttps://github.com/digininja/DVWA ↗
Web Security Academyhttps://portswigger.net/web-security ↗
SecListshttps://github.com/danielmiessler/SecLists ↗

⚠️ IMPORTANT

  • ทดสอบเฉพาะ systems ที่เป็นเจ้าของหรือได้รับอนุญาตเป็นลายลักษณ์อักษรเท่านั้น
  • การ brute force โดยไม่ได้รับอนุญาตถือว่าผิดกฎหมาย
  • ใช้ความรู้เพื่อ defensive purposes และ authorized testing
  • รายงาน vulnerabilities อย่างมีความรับผิดชอบผ่านช่องทางที่เหมาะสม

การเข้าถึง computer systems โดยไม่ได้รับอนุญาตถือเป็นความผิดทางกฎหมายในหลายประเทศ เนื้อหานี้จัดทำขึ้นเพื่อ การศึกษาเท่านั้น และควรฝึกภายใน lab environment ที่แยกจากระบบจริง เช่น DVWA เท่านั้น


Happy learning and stay ethical! 🔐

Cyber Security: เรียนรู้ Brute Force Attack
ผู้เขียน กานต์ ยงศิริวิทย์ / Karn Yongsiriwit
เผยแพร่เมื่อ April 23, 2026
ลิขสิทธิ์ CC BY-NC-SA 4.0

กำลังโหลดความคิดเห็น...

ความคิดเห็น 0