O2OAgetshell前传

上传

在<=6.4.4(20211121)版本后台中允许用户上传部署自定义jar/war服务,如果用户选customwar选项上传,ActionUploadFile类就会将文件以socket形式发送到服务端

1
src/main/java/com/x/program/center/jaxrs/command/CommandAction.java


execute->executeCommand

随后服务端接收文件

1
src/main/java/com/x/server/console/NodeAgent.java

run方法中通过判断模式来执行相应模块,此处为部署服务

跟进redeploy方法
前面说到了strCommand的值是customWar,所以直接看case “customWar“

转到customWar方法就可以看到文件已经被上传到指定位置

查找执行命令的接口

但是上传后还要重启才可以部署完war

那总不能干等目标重启吧,在上传的类中还有一个executeCommand方法

1
src/main/java/com/x/program/center/jaxrs/command/CommandAction.java


跟进execute
先看他的参数是什么


根据代码构造参数

1
{"ctl":"","nodeName":"*","nodePort":"*"}

回到execute方法
跟上传一样通过socket发送数据到服务端

服务端接收数据根据模式进入相应的实现

此处的strCommand就是前面ActionCommand.executeCommand存的值(前面文件上传思路一样)

服务端接收数据后根据正则匹配到的值跳到相应实现

回到服务端execute_command_pattern模式,命令存放到commandQueuecommandQueueLinkedBlockingQueue类定义的接口(文末介绍LinkedBlockingQueue类),在该类中有一个take方法取出存放的元素

所以下一步就找到调用这个方法的类

1
src/main/java/com/x/server/console/Main.java

中调用commandQueue.take取出元素来判断进入相应的实现

往下看可以看到,当取出的元素包含有restart_pattern的值时就会进入restart方法

查看restart_pattern的值

从正则可知值为restart,所以参数如下

1
{"ctl":"restart","nodeName":"*","nodePort":"*"}

restart方法就是停止所有服务然后调用相应脚本再在新线程里重新启动服务

至此就可以通过参数来通过请求重启服务而不用等目标管理员重启了
根据路由构造请求

1
POST xxx/xxx/command/execute

根据前面构造的参数拼接

1
2
3
4
5
POST xxx/xxx/command/execute



{"ctl":"restart","nodeName":"*","nodePort":"*"}

这样就可以重启所有服务了

重启一般是20秒左右

完整的验证详见
https://novysodope.github.io/2021/11/30/67/

改进
根据注释介绍*是所有节点,实际我们可以根据页面显示的选项来填对应主机部署重启,
也可以看CommandAction类,在该类中还有一个nodeInfoList方法是获取所有服务器信息的

直接请求看一下就可以得到信息定点打击了

LinkedBlockingQueue类

这个LinkedBlockingQueueArrayBlockingQueue类差不多,而ArrayListArrayBlockingQueue一样,所以可以理解为LinkedBlockingQueue也是用来存放东西的,即命令存到了LinkedBlockingQueue里,有关LinkedBlockingQueue 类的介绍可以看
https://blog.csdn.net/tonywu1992/article/details/83419448


声明:
本文章用于学习交流,严禁用于非法操作,出现后果一切自行承担,阅读此文章表示你已同意本声明。

Disclaimer:
This article is for study and communication. It is strictly forbidden to use it for illegal operations. All consequences shall be borne by yourself. Reading this article means that you have agreed to this statement.