O2OAgetshell前传
上传
在<=6.4.4(20211121)版本后台中允许用户上传部署自定义jar/war服务,如果用户选customwar选项上传,ActionUploadFile
类就会将文件以socket形式发送到服务端
1 |
|
execute->executeCommand
随后服务端接收文件
1 |
|
在run
方法中通过判断模式来执行相应模块,此处为部署服务
跟进redeploy
方法
前面说到了strCommand
的值是customWar
,所以直接看case “customWar“
转到customWar
方法就可以看到文件已经被上传到指定位置
查找执行命令的接口
但是上传后还要重启才可以部署完war
那总不能干等目标重启吧,在上传的类中还有一个executeCommand
方法
1 |
|
跟进execute
先看他的参数是什么
根据代码构造参数
1 |
|
回到execute
方法
跟上传一样通过socket发送数据到服务端
服务端接收数据根据模式进入相应的实现
此处的strCommand
就是前面ActionCommand.executeCommand
存的值(前面文件上传思路一样)
服务端接收数据后根据正则匹配到的值跳到相应实现
回到服务端execute_command_pattern
模式,命令存放到commandQueue
,commandQueue
为LinkedBlockingQueue
类定义的接口(文末介绍LinkedBlockingQueue类),在该类中有一个take
方法取出存放的元素
所以下一步就找到调用这个方法的类
在
1 |
|
中调用commandQueue.take
取出元素来判断进入相应的实现
往下看可以看到,当取出的元素包含有restart_pattern
的值时就会进入restart
方法
查看restart_pattern
的值
从正则可知值为restart
,所以参数如下
1 |
|
restart
方法就是停止所有服务然后调用相应脚本再在新线程里重新启动服务
至此就可以通过参数来通过请求重启服务而不用等目标管理员重启了
根据路由构造请求
1 |
|
根据前面构造的参数拼接
1 |
|
这样就可以重启所有服务了
重启一般是20秒左右
完整的验证详见
https://novysodope.github.io/2021/11/30/67/
改进
根据注释介绍*
是所有节点,实际我们可以根据页面显示的选项来填对应主机部署重启,
也可以看CommandAction
类,在该类中还有一个nodeInfoList
方法是获取所有服务器信息的
直接请求看一下就可以得到信息定点打击了
LinkedBlockingQueue类
这个LinkedBlockingQueue
跟ArrayBlockingQueue类
差不多,而ArrayList
跟ArrayBlockingQueue
一样,所以可以理解为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.