Cyber Security: เรียนรู้ Brute Force Attack
เรียนรู้เทคนิค Brute Force Attack และการป้องกันผ่านการฝึกปฏิบัติจริงกับ DVWA และ Burp Suite ใช้ SSH เพื่อการคัดลอกคำสั่งได้ง่ายจากบทความนี้
1. ขอนแนะนำ Brute Force Attack#
ยินดีต้อนรับสู่ ห้องปฏิบัติการ Brute Force Attack! ต่อยอดจากพื้นฐาน Linux Security Lab ตอนนี้จะได้เรียนรู้หนึ่งในเทคนิคการโจมตี web application ที่พื้นฐานที่สุด
ข้อกำหนดเบื้องต้น#
ก่อนเริ่มห้องปฏิบัติการนี้ ควรมี:
- ✅ ติดตั้ง Ubuntu VM - VirtualBox ที่ติดตั้ง Ubuntu แล้ว
- ✅ พื้นฐานคำสั่ง Linux - ความเข้าใจเกี่ยวกับคำสั่ง terminal
- ✅ ความรู้เรื่อง SSH - วิธีการเชื่อมต่อไปยัง VM จากระยะไกล
📚 ใหม่กับ Linux? หากยังไม่ได้ติดตั้ง Ubuntu VM หรือต้องการทบทวนคำสั่ง Linux ดู Linux Security Lab Tutorial ↗ สำหรับคำแนะนำการติดตั้ง Ubuntu และพื้นฐาน command-line อย่างครอบคลุม
Brute Force Attack คืออะไร?#
Brute Force Attack คือวิธีการลองผิดลองถูกที่ใช้เพื่อรับข้อมูล เช่น รหัสผ่านผู้ใช้ หรือ personal identification number (PIN) แฮกเกอร์ตรวจสอบรหัสผ่านและ passphrase ที่เป็นไปได้ทั้งหมดอย่างเป็นระบบจนกว่าจะพบรหัสที่ถูกต้อง
Password attempts in a brute force attack:
password1 → ผิด
password123 → ผิด
admin123 → ผิด
letmein → ผิด
password → ✓ สำเร็จbashBrute Force Attack ทำงานอย่างไร#

ตัวอย่างเวลาในการถอดรหัส#
| ความซับซ้อนของรหัสผ่าน | จำนวนตัวอักษร | เวลาในการถอดรหัส (1000 ครั้ง/วินาที) |
|---|---|---|
1234 | 4 ตัวเลข | ~10 วินาที |
password | 8 ตัวพิมพ์เล็ก | ~2 ชั่วโมง |
Password1 | 8 ผสม | ~3 วัน |
P@ssw0rd! | 8 พร้อมสัญลักษณ์ | ~5 เดือน |
MySecur3P@ss! | 14 พร้อมสัญลักษณ์ | ~400 ล้านปี |
ข้อควรรู้: ความยาวและความซับซ้อนของรหัสผ่านจะเพิ่มเวลาในการถอดรหัสอย่างมหาศาล!
2. ประเภทของ Brute Force Attack#
Simple Brute Force#
ผู้โจมตีลองการผสมที่เป็นไปได้ทั้งหมดอย่างเป็นระบบ
a, b, c, ..., z
aa, ab, ac, ..., zz
aaa, aab, aac, ...bashข้อดี: รับประกันว่าจะพบรหัสผ่านในท้ายที่สุด
ข้อเสีย: ใช้เวลานานมากสำหรับรหัสผ่านที่ซับซ้อน
Dictionary Attack#
ใช้รายการรหัสผ่านที่ใช้บ่อย (wordlist)
# ตัวอย่างรายการรหัสผ่านทั่วไป:
password
123456
admin
qwerty
letmein
welcomebashข้อดี: เร็วกว่า simple brute force
ข้อเสีย: มีประสิทธิภาพเฉพาะกับรหัสผ่านที่อ่อนแอ
Hybrid Attack#
ผสมคำใน dictionary กับรูปแบบ
password → password1, password123, password!
admin → admin1, Admin2024, admin@2024bashข้อดี: มีประสิทธิภาพกับรหัสผ่านที่มีรูปแบบ
ข้อเสีย: ยังคงต้องการเวลาและพลังการประมวลผล
Credential Stuffing#
ใช้คู่ username/password ที่รั่วไหลจาก data breach
ข้อดี: อัตราความสำเร็จสูงเนื่องจากการนำรหัสผ่านกลับมาใช้ใหม่
ข้อเสีย: ต้องมีการเข้าถึงฐานข้อมูล breach
3. การป้องกัน Brute Force Attack#
กลยุทธ์การป้องกัน#

เทคนิคการป้องกัน#
1. ใช้รหัสผ่านที่แข็งแกร่งและซับซ้อน#
สร้างรหัสผ่านที่:
- ยาว: อย่างน้อย 12-16 ตัวอักษร
- ผสม: ตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก ตัวเลข สัญลักษณ์
- ไม่ซ้ำ: ต่างกันสำหรับแต่ละบัญชี
- คาดเดาไม่ได้: ไม่มีคำใน dictionary หรือรูปแบบ
❌ ไม่ดี: password123
❌ ไม่ดี: admin2024
❌ ไม่ดี: qwerty123
✅ ดี: Tr0ub4dor&3Horse!
✅ ดีกว่า: correct-horse-battery-staple (passphrase)
✅ ดีที่สุด: ใช้ password manager!bash2. จำกัดการพยายาม Login#
จำกัดจำนวนการพยายาม login ที่อนุญาตในช่วงเวลาหนึ่ง
# ตัวอย่าง rate limiting logic
if failed_attempts > 5:
block_ip_address()
wait_time = 2^failed_attempts # Exponential backoffpythonวิธีการนำไปใช้:
- หน่วงเวลาระหว่างการพยายาม
- บล็อก IP ชั่วคราวหลังจากล้มเหลว
- CAPTCHA หลังจากล้มเหลวหลายครั้ง
- หน่วงเวลาแบบก้าวหน้า (1s, 2s, 4s, 8s…)
3. เปิดใช้งาน Two-Factor Authentication (2FA)#
ต้องการการตรวจสอบเพิ่มเติมนอกเหนือจากรหัสผ่าน
ปัจจัยที่ 1: สิ่งที่รู้ → รหัสผ่าน
ปัจจัยที่ 2: สิ่งที่มี → โทรศัพท์/Token
ปัจจัยที่ 3: สิ่งที่เป็น → Biometricbashวิธีการ 2FA:
- SMS OTP (One-Time Password)
- Authentication app (Google Authenticator, Authy)
- Hardware token (YubiKey)
- Biometric verification
4. นโยบายการล็อคบัญชี#
ล็อคบัญชีอัตโนมัติหลังจากพยายามล้มเหลวซ้ำๆ
| การพยายามล้มเหลว | การดำเนินการ |
|---|---|
| 3-5 | เตือน + หน่วงเวลา |
| 5-10 | ล็อคชั่วคราว (15-30 นาที) |
| 10+ | ล็อคนานขึ้น + แจ้งผู้ดูแล |
คำเตือน: การล็อคบัญชีอาจนำไปสู่ DoS หากผู้โจมตีล็อคผู้ใช้ทั้งหมด
5. ตรวจสอบและแจ้งเตือน#
บันทึกกิจกรรมที่น่าสงสัยและส่งการแจ้งเตือน
# เหตุการณ์ที่ต้องแจ้งเตือน
- การ login ล้มเหลวหลายครั้งจาก IP เดียวกัน
- การ login จากตำแหน่งภูมิศาสตร์ที่ผิดปกติ
- การ login ในเวลาที่ผิดปกติ
- การพยายาม login พร้อมกันจาก IP ต่างกันbash4. Lab Setup - DVWA Installation#
ตอนนี้มาตั้งค่าห้องปฏิบัติการจริงโดยใช้ DVWA (Damn Vulnerable Web Application) - เว็บแอปพลิเคชันที่ออกแบบมาให้มีความปลอดภัยต่ำโดยเจตนา เพื่อใช้สำหรับการฝึกอบรมด้านความปลอดภัย
ข้อกำหนดเบื้องต้น#
- Ubuntu Linux VM จากบทที่ 1
- Firefox browser ที่ติดตั้งบน Ubuntu
- การเชื่อมต่ออินเทอร์เน็ตบน VM
Exercise 4: เริ่มต้น Ubuntu VM#
ใน VirtualBox ดับเบิลคลิกที่ Ubuntu Linux VM เพื่อเริ่มต้น
SSH Access สำหรับการคัดลอกคำสั่งที่ง่ายขึ้น#
💡 Pro Tip: การใช้ SSH จาก host machine ทำให้คัดลอกคำสั่งจากบทความนี้ได้ง่ายขึ้นมาก!
ทำไมต้องใช้ SSH?
เมื่อทำงานกับบทความบนเว็บ การสลับระหว่าง browser (อ่าน) และ VM terminal (พิมพ์) เป็นเรื่องที่ยุ่งยาก SSH ช่วยให้อ่านบทความบน host machine และ execute คำสั่งใน Ubuntu VM ได้โดยตรง
Host Machine (Browser) SSH Connection Ubuntu VM
┌──────────────────┐ ┌──────────────┐ ┌──────────────┐
│ Reading tutorial │ ─────────► │ Port 2222 │ ──────► │ Execute cmd │
│ Copy command │ │ │ │ │
└──────────────────┘ └──────────────┘ └──────────────┘bashข้อดี:
- ✅ Copy-paste คำสั่งโดยตรงจาก browser
- ✅ อ่านบทความบนหน้าจอ host machine ที่ใหญ่กว่า
- ✅ เก็บ browser และ terminal ไว้ในหน้าต่างแยกกัน
- ✅ ไม่ต้องสลับระหว่าง VM windows
ตรวจสอบ SSH Access#
จากบทที่ 1 ควรได้ตั้งค่า SSH แล้ว มาตรวจสอบว่าทำงานอยู่
ตรวจสอบว่า SSH กำลังทำงาน:
sudo service ssh statusbashผลลัพธ์ที่คาดหวัง:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/systemd/system/ssh.service; enabled)
Active: active (running)bashหากไม่ทำงาน ให้เริ่มต้น:
sudo service ssh startbashเปิดใช้งาน SSH ให้เริ่มต้นอัตโนมัติหลังจาก reboot:
sudo systemctl enable sshbashผลลัพธ์ที่คาดหวัง:
Synchronizing state of ssh.service with SysV service script...
Executing /lib/systemd/systemd-sysv-install enable ssh
Created symlink /etc/systemd/system/multi-user.target.wants/ssh.service → /lib/systemd/system/ssh.service.bashเชื่อมต่อจาก Host Machine#
บน Windows (Command Prompt หรือ PowerShell):
ssh -p 2222 your_username@localhostcmdบน macOS หรือ Linux (Terminal):
ssh -p 2222 your_username@localhostbashแทนที่ your_username ด้วย Ubuntu username (เช่น u6090059)
ใส่ Ubuntu password เมื่อถูกถาม
ตัวบ่งชี้ความสำเร็จ: Prompt เปลี่ยนเป็น:
your_username@your_hostname:~$bash
Quick SSH Reference#
| Task | Command |
|---|---|
| Connect to VM | ssh -p 2222 user@localhost |
| Exit SSH session | exit หรือ Ctrl + D |
| Copy from browser | Highlight text, Ctrl + C |
| Paste in terminal | Ctrl + Shift + V (Linux) หรือ right-click paste |
ทดสอบ SSH Connection#
เมื่อเชื่อมต่อผ่าน SSH แล้ว ลองคำสั่งเหล่านี้เพื่อตรวจสอบ:
pwd
whoami
uname -abashผลลัพธ์ที่คาดหวัง:
/home/your_username
your_username
Linux your_hostname 6.5.0-... #ubuntu SMP ...bash
🎯 จากนี้ไป คำสั่งทั้งหมดในบทความนี้จะถือว่าเชื่อมต่อผ่าน SSH! ช่วยให้ copy-paste คำสั่งจาก browser ไปยัง terminal ได้ง่าย
Exercise 5: ติดตั้ง DVWA#
อัปเดตระบบก่อน:
sudo apt update
sudo apt upgrade -ybashติดตั้ง dependencies ที่จำเป็น:
sudo apt install -y apache2 mariadb-server php php-mysql php-gd libapache2-mod-phpbashตรวจสอบว่า Apache กำลังทำงาน:
sudo systemctl status apache2bashผลลัพธ์ที่คาดหวัง:
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled)
Active: active (running) since ...bashทดสอบ Apache บน Firefox ใน VM:
เปิด Firefox ใน Ubuntu VM และไปที่: http://localhost ↗
จะเห็น Apache2 Ubuntu Default Page ซึ่งบ่งชี้ว่า Apache ทำงานถูกต้อง

การเข้าใจ Apache Web Server#
Apache เป็น web server software ที่ให้บริการไฟล์ผ่าน HTTP เมื่อเข้าถึง http://localhost Apache จะมองหาไฟล์ใน /var/www/html/ และให้บริการไปยัง browser
วิธีการทำงานของ Apache:
Browser Request: http://localhost/test/
↓
Apache receives request
↓
Looks for: /var/www/html/test/index.html
↓
Sends file back to browserbashExercise: สร้าง Web Page แรก#
มาสร้าง HTML page แบบง่ายเพื่อเข้าใจวิธี Apache ให้บริการ content
สร้าง test directory:
sudo mkdir -p /var/www/html/testbashสร้าง HTML file โดยใช้ nano:
sudo nano /var/www/html/test/index.htmlbashเพิ่ม HTML content ดังนี้:
<!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 เพื่อบันทึกและออก
ตั้งค่า permissions ที่เหมาะสม:
sudo chown -R www-data:www-data /var/www/html/test
sudo chmod -R 755 /var/www/html/testbashทดสอบ page ใน Firefox:
ใน Firefox (ใน Ubuntu VM) ไปที่: http://localhost/test/ ↗
จะเห็น page แบบง่ายที่มี “Hello World” heading และ text ด้านล่าง

การเข้าใจสิ่งที่เกิดขึ้น:
- สร้าง
/var/www/html/test/index.html - Apache ให้บริการ
index.htmlอัตโนมัติเมื่อเข้าถึง directory - URL
http://localhost/test/map ไปยัง/var/www/html/test/ - Apache อ่าน HTML file และส่งไปยัง browser
💡 Key Concept: ใน web development URLs map ไปยัง file system เมื่อ deploy DVWA จะทำงานแบบเดียวกัน -
http://10.0.2.15/dvwa/map ไปยัง/var/www/html/dvwa/แทนที่10.0.2.15ด้วย IP address จริง
Download DVWA:
ติดตั้ง git ก่อน (หากยังไม่ได้ติดตั้ง):
sudo apt install git -ybashClone DVWA repository:
cd /var/www/html
sudo git clone https://github.com/digininja/DVWA.git dvwa
sudo chown -R www-data:www-data /var/www/html/dvwabashตั้งค่า DVWA:
cd /var/www/html/dvwa/config
sudo cp config.inc.php.dist config.inc.php
sudo nano config.inc.phpbashแก้ไขบรรทัดรหัสผ่าน database:
# หาบรรทัดนี้และแก้ไข:
$_DVWA[ 'db_password' ] = getenv('DB_PASSWORD') ?: 'p@ssw0rd';phpกด Ctrl + O, Enter จากนั้น Ctrl + X เพื่อบันทึกและออก
ตั้งค่า permissions:
sudo chmod 666 /var/www/html/dvwa/hackable/uploads/
sudo chmod 666 /var/www/html/dvwa/config/config.inc.phpbashเปิดใช้งาน PHP allow_url_include:
sudo nano /etc/php/8.3/apache2/php.inibashค้นหาการตั้งค่า:
กด Ctrl + W พิมพ์ allow_url_include และกด Enter เพื่อค้นหาบรรทัดนี้อย่างรวดเร็ว
เปลี่ยน:
allow_url_include = Offiniเป็น:
allow_url_include = Oniniกด Ctrl + O, Enter จากนั้น Ctrl + X
รีสตาร์ท Apache:
sudo systemctl restart apache2bashสร้าง database และ user:
sudo mysqlbashใน MariaDB prompt:
CREATE DATABASE dvwa;
CREATE USER 'dvwa'@'localhost' IDENTIFIED BY 'p@ssw0rd';
GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwa'@'localhost';
FLUSH PRIVILEGES;
EXIT;sqlNote: MariaDB เป็น drop-in replacement สำหรับ MySQL ดังนั้น MySQL commands ทั้งหมดจะทำงานแบบเดียวกัน
Exercise 6: เข้าถึง DVWA#
หา IP address ของ VM:
ติดตั้ง net-tools ก่อน (สำหรับ ifconfig):
sudo apt install net-tools -ybashตรวจสอบ IP address:
ifconfigbashจะเห็นบางอย่างเช่น 10.0.2.15 หรือ 192.168.56.x

เปิด Firefox ใน Ubuntu และไปที่: http://10.0.2.15/dvwa/setup.php ↗
Note: แทนที่
10.0.2.15ด้วย IP address จริง หากต่างออกไป สามารถใช้http://localhost/dvwa/setup.phpได้หากทำงานภายใน VM
คลิกปุ่ม “Create / Reset Database” เพื่อเริ่มต้น DVWA ระบบจะสร้าง database tables ทั้งหมดและเติมข้อมูล demo อัตโนมัติ

Note: หากเห็น error ใดๆ ให้แน่ใจว่า database credentials ใน
config.inc.phpตรงกับ MySQL user ที่สร้าง
Login เข้าสู่ DVWA:
URL: http://10.0.2.15/dvwa/login.php
Username: admin
Password: passwordplaintextNote: ใช้ IP address จริง สำหรับตัวอย่างนี้ใช้
10.0.2.15


5. การเข้าใจ Brute Force Vulnerability#
Exercise 7: สำรวจ DVWA Brute Force Module#
ไปที่: http://10.0.2.15/dvwa/security.php → ตั้ง security level เป็น “Low” → คลิก Submit

Note: DVWA มีหลาย security levels (Low, Medium, High, Impossible) ใช้ Low สำหรับการเรียนรู้เนื่องจากมี security controls น้อย ทำให้เข้าใจและฝึก brute force attacks ได้ง่ายขึ้น
จากนั้นไปที่: http://10.0.2.15/dvwa/vulnerabilities/brute/
Note: แทนที่
10.0.2.15ด้วย IP address จริง หากต่างออกไป
ลอง login ด้วย credentials ที่รู้จัก:
Username: admin
Password: passwordbashควรเห็นข้อความ login สำเร็จ
จากนั้น logout และลองใช้รหัสผ่านที่ผิด:
Username: admin
Password: wrongpassbashสังเกตสิ่งที่เกิดขึ้นใน URL:
http://10.0.2.15/dvwa/vulnerabilities/brute/?username=admin&password=wrongpass&Login=LoginbashNote: แทนที่
10.0.2.15ด้วย IP address จริง จะเห็น IP ใน URL แทน
ข้อสังเกตสำคัญ: Username และ password ถูกส่งผ่าน GET request ใน URL query parameters! ทำให้ intercept และ manipulate ได้ง่ายมาก
การเข้าใจ GET vs POST#
| Method | วิธีส่งข้อมูล | ความปลอดภัย | การมองเห็น |
|---|---|---|---|
| GET | In URL query params | ปลอดภัยน้อยกว่า | มองเห็นใน URL, history, logs |
| POST | In 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=wrongpasshttp6. การติดตั้ง Burp Suite Community Edition#
Burp Suite เป็น interception proxy มาตรฐานอุตสาหกรรมสำหรับ web application security testing
Exercise 8: ดาวน์โหลด Burp Suite#
ใน Ubuntu Firefox ไปที่: https://portswigger.net/burp/communitydownload ↗
ดาวน์โหลดเวอร์ชัน Linux (shell script)
Exercise 9: ติดตั้ง Burp Suite#
ไปที่ Downloads:
cd ~/Downloads
ls -l burp*bashทำให้ installer สามารถ execute ได้:
sudo chmod +x burpsuite_community_*.shbashรัน installer:
./burpsuite_community_*.shbashทำตาม prompts ผ่าน installation wizard
Exercise 10: เปิด Burp Suite#
เริ่ม Burp Suite:
วิธีที่ 1: ค้นหาใน Ubuntu Applications
- คลิกปุ่ม Show Applications (ไอคอน grid) ที่มุมซ้ายล่าง
- พิมพ์
Burp Suiteใน search bar - คลิก Burp Suite เพื่อเปิด

วิธีที่ 2: Command Line
cd /opt/BurpSuiteCommunity
./burpsuitebashInitial Setup Wizard:
- คลิก Next หรือ Start Burp
- เลือก “Use Burp defaults” หรือตั้งค่าตามต้องการ
- คลิก Start Burp เพื่อเปิด main interface
จะเห็น Burp Suite dashboard:

Exercise 11: ตั้งค่า Firefox Proxy#
เปิด Firefox ใน Ubuntu:
- คลิกปุ่ม menu (สามเส้น)
- ไปที่ Settings → Network Settings
- คลิก Settings
- เลือก Manual proxy configuration
- ตั้งค่า:
- HTTP Proxy:
127.0.0.1 - Port:
8080
- HTTP Proxy:
- ติ๊ก “Use this proxy for all protocols”
- คลิก OK

ตรวจสอบ Burp Suite Proxy:
ใน Burp Suite ไปที่ Proxy → Proxy settings → Proxy
ยืนยัน:
- Interface:
127.0.0.1 - Port:
8080 - Running: ✓ (ควรแสดงเครื่องหมายถูกสีเขียว)

Exercise 12: ติดตั้ง Burp Suite CA Certificate#
ทำไม? Burp Suite ต้องการ intercept HTTPS traffic ซึ่งต้องการ trusted certificate
ใน Firefox ไปที่: http://burp ↗
ดาวน์โหลด CA Certificate:
- คลิก “CA Certificate”
- บันทึกไฟล์เป็น
cacert.der

นำเข้า Certificate:
- ใน Firefox ไปที่ Settings → Privacy & Security
- เลื่อนลงไปที่ Certificates
- คลิก View Certificates
- ไปที่แท็บ Authorities
- คลิก Import
- เลือก
cacert.der - ติ๊ก “Trust this CA to identify websites”
- คลิก OK

7. การ Intercept Requests ด้วย Burp Suite#
⚠️ ก่อนดำเนินการต่อ: ตรวจสอบให้แน่ใจว่า DVWA security level ตั้งเป็น Low ไปที่
http://10.0.2.15/dvwa/security.phpและยืนยันว่า security level เป็น “Low” ก่อนดำเนินการ Burp Suite exercises
Exercise 13: เปิดใช้งาน Intercept Mode#
ใน Burp Suite:
- ไปที่แท็บ Proxy
- คลิกแท็บย่อย Intercept
- คลิกปุ่ม “Intercept is on” เพื่อเปิด
เมื่อ Intercept เปิดอยู่ Burp จะ capture requests ทั้งหมดจาก Firefox
Exercise 14: Intercept DVWA Login#
เมื่อเปิด Intercept ใน Burp:
- ใน Firefox ไปที่ DVWA Brute Force page
- ลอง login ด้วย:
- Username:
admin - Password:
test123
- Username:
- Firefox จะดูเหมือนหยุดทำงาน - นี่เป็นเรื่องปกติ!
สลับไป 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การเข้าใจ Burp Intercept Actions#
| Action | Keyboard Shortcut | Result |
|---|---|---|
| Forward | Ctrl + F | ส่ง request ไปยัง server |
| Drop | Ctrl + D | ยกเลิก request |
| Intercept | Ctrl + I | เปิด/ปิด intercept |
ลอง: คลิก Forward เพื่อส่ง request ไปยัง DVWA

Exercise 15: ตรวจสอบ HTTP History#
ใน Burp Suite:
- ไปที่ Proxy → HTTP History tab
- หา DVWA login request ที่เพิ่งทำ
- คลิกเพื่อดูรายละเอียด
สังเกต request structure:
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 = Loginbashตอนนี้สังเกต response:
คลิกแท็บ Response จะเห็น:
<pre><br />
Username and/or password incorrect.<br /><br /></pre>html
นี่คือ response ของ server ต่อรหัสผ่านที่ผิด!
8. Automated Brute Force ด้วย Burp Intruder#
Exercise 16: ส่ง Request ไปยัง Intruder#
จาก HTTP History:
- คลิกขวาที่ DVWA login request
- เลือก Send to Intruder
สลับไปที่แท็บ Intruder ใน Burp Suite
Exercise 17: ตั้งค่า Attack Position#
ใน Intruder → Positions tab:
จะเห็น request ที่มี password field ถูก highlight
ล้าง default positions โดยคลิก Clear § (ปุ่ม Clear Section)
ตอนนี้ highlight เฉพาะ password value:
- เลือก password text (เช่น
test123) - คลิก Add § (ปุ่ม Add Section)

💡 Note: สัญลักษณ์
§เรียกว่า “section sign” (ออกเสียงว่า “section symbol” หรือ “section mark”) ใน Burp Suite มัน标记 positions ที่ payload values จะถูกแทรกในระหว่าง attack
Request ควรมีลักษณะนี้:
...username=admin&password=§test123§&Login=Loginbashสัญลักษณ์ § บ่งบอกตำแหน่งที่จะแทรก payloads
Exercise 18: ตั้งค่า Payloads#
ไปที่ Intruder → Payloads tab:
Payload type: เลือก Simple list
ใน Payload Options เพิ่ม test passwords:
password
admin
123456
qwerty
letmein
welcome
admin123
password123bash这些 เป็น weak passwords ทั่วไปสำหรับ testing

Exercise 19: ตั้งค่า Attack Settings#
ไปที่ Intruder → Settings tab:
Attack type: Sniper (หนึ่ง payload position ทดสอบตามลำดับ)
Grep - Extract (optional filtering):
- คลิก Add ภายใต้ Grep - Extract
- ใน response highlight “incorrect”
- ช่วยให้ Burp ระบุ failed login attempts

Grep - Match (response filtering):
- คลิก Add ภายใต้ Grep - Match
- ใส่: “incorrect”
- จะ标记 responses ที่มี “incorrect”

Exercise 20: เริ่ม Attack#
คลิกปุ่ม “Start attack” ขนาดใหญ่ ที่มุมขวาบน
หน้าต่างใหม่จะเปิดขึ้นแสดง attack results:
| Payload # | Payload | Status | Length | Error |
|---|---|---|---|---|
| 1 | password | 200 | 4874 | None |
| 2 | admin | 200 | 5120 | None |
| 3 | 123456 | 200 | 4874 | None |

ข้อสังเกตสำคัญ:
- Status 200 = Request succeeded (server responded)
- Length differences = Different response content
- หา payload ที่มี different length - น่าจะเป็นรหัสผ่านที่ถูกต้อง!
Exercise 21: วิเคราะห์ Results#
ในหน้าต่าง attack results:
- คลิกส่วนหัวคอลัมน์ Length เพื่อเรียงลำดับ
- มองหารายการที่มี different response lengths
- Successful login มักมี page size ที่ต่างออกไป
หรือใช้ Grep results:
- คอลัมน์ทางขวาแสดง matched flags
- รายการที่ ไม่มี “incorrect” = successful login
ตรวจสอบรหัสผ่าน:
หาก “password” แสดง response length ที่ต่างออกไป ลอง login ด้วยตนเอง:
Username: admin
Password: passwordbash9. Dictionary Attack ด้วย Password Lists#
Exercise 22: ดาวน์โหลด Password Wordlist#
ใน Ubuntu terminal:
cd ~/Downloadsbashดาวน์โหลด John the Ripper’s password list:
wget https://raw.githubusercontent.com/openwall/john/bleeding-jumbo/run/password.lst -O passwords.txtbashหรือใช้ SecLists (ครอบคลุมกว่า):
git clone https://github.com/danielmiessler/SecLists.gitbashPassword lists ทั่วไปใน SecLists:
Passwords/Common-Credentials/10-million-password-list-top-1000.txtPasswords/Software/dragonfly41-top10k.txt
Exercise 23: โหลด Wordlist ลงใน Burp#
กลับไป Burp Suite Intruder:
- ไปที่แท็บ Payloads
- ภายใต้ Payload Options คลิก Load…
- ไปที่
~/Downloads/passwords.txt - คลิก Open
Preview payloads: จะเห็น passwords หลายร้อย/หลายพันรายการถูกโหลด
Exercise 24: รัน Dictionary Attack#
ก่อนเริ่ม ปรับ settings:
ใน Intruder → Settings:
- Request Engine: ตั้ง threads เป็น 1-5 (อย่า overload)
- Attack type: Sniper
เริ่ม attack และรอให้เสร็จสิ้น
Exercise 25: กรองและวิเคราะห์#
ใน attack results:
กรองตาม response length:
- คลิกคอลัมน์ Length เพื่อเรียงลำดับ
- ระบุ outliers
กรองตาม keyword:
- เพิ่ม Grep - Match rule สำหรับ: “Welcome”
- หรือค้นหา: “incorrect”
- Results ที่ ไม่มี “incorrect” คือสำเร็จ
ผลลัพธ์ที่คาดหวัง: รายการหนึ่งจะแสดง:
- Different response length
- ไม่มีข้อความ “incorrect”
- อาจแสดง welcome message หรือ redirect
10. เทคนิคการวิเคราะห์ขั้นสูง#
Response Length Analysis#
Response lengths ที่ต่างกันบ่งบอกผลลัพธ์ที่ต่างกัน:
| Response | Length | ความหมาย |
|---|---|---|
| ~4800 bytes | Base length | Failed login |
| ~5100 bytes | Different length | Successful login |
Grep - Extract สำหรับ Precise Filtering#
Extract ข้อความเฉพาะจาก responses:
- Settings → Grep - Extract → Add
- Highlight ข้อความที่ต้องการ extract (เช่น “incorrect”)
- กำหนด start และ end markers
- Results แสดง extracted values ในคอลัมน์ใหม่
ตัวอย่าง:
Extract: "incorrect"
Result: Flag ปรากฏในคอลัมน์ "incorrect"bashBurp Intruder Attack Types#
| Type | คำอธิบาย | Use Case |
|---|---|---|
| Sniper | One payload, multiple positions | Single field brute force |
| Battering Ram | Same payload everywhere | Testing one value everywhere |
| Pitchfork | Multiple payloads, paired positions | Username + password combos |
| Cluster Bomb | All payload combinations | Cartesian product testing |
11. DVWA Security Levels Comparison#
Low Security (ทดสอบแล้ว)#
// No protection
if( isset( $_GET[ 'Login' ] ) ) {
$user = $_GET[ 'username' ];
$pass = $_GET[ 'password' ];
// Check against database
// No rate limiting
// No lockout
}phpช่องโหว่:
- ❌ No rate limiting
- ❌ No account lockout
- ❌ GET requests visible in URL/history
- ❌ No CAPTCHA
- ❌ No delay between attempts
Medium Security#
// Some protection implemented
$user = stripslashes( $user );
$pass = stripslashes( $pass );
$user = mysql_real_escape_string( $user );
$pass = mysql_real_escape_string( $pass );
// Still vulnerable to brute forcephpHigh Security#
// Token-based protection
checkToken( $user_token, $_SESSION[ 'session_token' ], 'index.php' );
// Anti-CSRF token requiredphpImpossible Security#
// PDO with prepared statements
// Strong password hashing
// Comprehensive input validation
// Rate limiting
// Account lockout
// 2FA readyphp12. Defenses in Practice#
Implementing Rate Limiting#
ตัวอย่าง PHP implementation:
<?php
session_start();
// Check for failed attempts
if (isset($_SESSION['failed_attempts']) && $_SESSION['failed_attempts'] > 5) {
// Check if lockout period has passed
if (time() < $_SESSION['lockout_time']) {
die("Account locked. Try again later.");
} else {
// Reset attempts after lockout period
unset($_SESSION['failed_attempts']);
unset($_SESSION['lockout_time']);
}
}
// Check login credentials
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
}
}
?>phpWeb Application Firewall (WAF)#
WAF rules for brute force protection:
# 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
}nginxApache 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'"apache13. Detection and Monitoring#
Log Analysis#
Failed login attempt log entries:
[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.100bashMonitoring commands:
# Count failed logins by IP
grep "FAILED LOGIN" /var/log/auth.log | awk '{print $NF}' | sort | uniq -c
# Real-time monitoring
tail -f /var/log/apache2/access.log | grep "POST.*login"bashAlerting#
ตั้งค่า alerts สำหรับ:
# 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:00bash14. Quick Reference#
Burp Suite Key Shortcuts#
| Shortcut | Action |
|---|---|
Ctrl + I | Toggle intercept on/off |
Ctrl + F | Forward intercepted request |
Ctrl + D | Drop intercepted request |
Ctrl + Shift + I | Send to Intruder |
Ctrl + Shift + R | Send to Repeater |
Common Password Wordlists#
| Wordlist | Size | Source |
|---|---|---|
passwords.txt | ~3,000 | John the Ripper |
rockyou.txt | ~14 million | Breach data |
10k-most-common.txt | 10,000 | SecLists |
Defense Checklist#
- ✅ Strong password policy (12+ characters, complexity)
- ✅ Rate limiting (5 attempts per minute)
- ✅ Account lockout (15+ minutes)
- ✅ 2FA/MFA enabled
- ✅ CAPTCHA after failures
- ✅ Logging and monitoring
- ✅ WAF rules configured
- ✅ HTTPS enforced
- ✅ Secure password storage (bcrypt/argon2)
15. Next Steps#
Congratulations! ได้ทำ Brute Force Attack Lab เสร็จสิ้นแล้ว ตอนนี้มี:
- ✅ ความเข้าใจเกี่ยวกับ brute force attack methods
- ✅ ความรู้เกี่ยวกับ prevention techniques
- ✅ ประสบการณ์จริงกับ DVWA
- ✅ ทักษะทางปฏิบัติกับ Burp Suite
- ✅ ความสามารถในการทำและวิเคราะห์ brute force attacks
Recommended Learning Path#
- SQL Injection - เรียนรู้ database attacks
- Cross-Site Scripting (XSS) - Client-side attacks
- Session Hijacking - ขโมย user sessions
- Security Testing Methodologies - OWASP Testing Guide
- Secure Coding - เขียน code ที่ทนทานต่อการโจมตี
Practice Resources#
| Resource | URL |
|---|---|
| OWASP Top 10 | https://owasp.org/www-project-top-ten/ ↗ |
| Burp Suite Documentation | https://portswigger.net/burp/documentation ↗ |
| DVWA Documentation | https://github.com/digininja/DVWA ↗ |
| Web Security Academy | https://portswigger.net/web-security ↗ |
| SecLists | https://github.com/danielmiessler/SecLists ↗ |
Ethical Considerations#
⚠️ IMPORTANT:
- Test เฉพาะ systems ที่เป็นเจ้าของหรือได้รับอนุญาตอย่างชัดเจน
- Brute force attacks ผิดกฎหมายหากดำเนินการโดยไม่ได้รับอนุญาต
- ใช้ทักษะเหล่านี้สำหรับ defensive purposes และ authorized security testing
- รายงาน vulnerabilities อย่างมีความรับผิดชอบผ่าน proper disclosure channels
- ขออนุญาตเป็นลายลักษณ์อักษรก่อน conducting การทดสอบ penetration testing
Legal Notice#
การเข้าถึง computer systems โดยไม่ได้รับอนุญาตเป็นความผิดทางอาญาในเขตอำนาจศาลส่วนใหญ่ บทความนี้มีไว้ เพื่อการศึกษาเท่านั้น และควรฝึกในสภาพแวดล้อม lab ที่แยกจากส่วนอื่น (เช่น DVWA setup)
Happy learning and stay ethical! 🔐