GitHack — 一个git泄露利用脚本

当前大量开发人员使用git进行版本控制,对站点自动部署。  如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。

GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,还原重建工程源代码。

渗透测试人员、攻击者,可以进一步审计代码,挖掘:文件上传,SQL注射等安全漏洞。

脚本的工作原理

  1. 解析.git/index文件,找到工程中所有的: ( 文件名,文件sha1 )
  2. 去.git/objects/ 文件夹下下载对应的文件
  3. zlib解压文件,按原始的目录结构写入源代码

它的优点

  1. 速度快,默认20个工作线程
  2. 尽量还原所有的源代码,缺失一部分文件不影响脚本工作
  3. 脚本不需要执行额外的git命令,All you need is python
  4. 脚本无需浏览目录

可能的改进

存在文件被gc打包到git\objects\pack的情况,稍后可测试下看能否直接获取并解压这个文件,还原源代码

用法示例

GitHack.py http://www.hoolai.com/.git/

执行中截图:

GitHack

执行结果:

GitHack_result

获取代码:https://github.com/lijiejie/GitHack

参考资料:

Git Index Formart

非常感谢 sbp 的 gin – a Git index file parser,脚本中使用了他的解析源代码,为适用python 2.x和Windows作了细微的改动

subDomainsBrute — 改进渗透测试时暴力枚举子域名的python脚本

更新日志:

  • 2015-4-2  修复了在Linux系统下进度条输出混乱的bug,填充空格以清空原始输出

渗透测试时,前期的信息收集包括主机(服务)发现。 子域名暴力枚举是十分常用的主机查找手段。

我写了一个改进的小脚本,用于暴力枚举子域名,它的改进在于:

  1. 用小字典递归地发现三级域名,四级域名、五级域名等不容易被探测到的域名
  2. 字典较为全面,小字典就包括3万多条,大字典多达8万条
  3. 默认使用114DNS、百度DNS、阿里DNS这几个快速又可靠的公共DNS进行查询,可随时修改配置文件添加你认为可靠的DNS服务器
  4. 自动筛选泛解析的域名,当前规则是: 超过10个域名指向同一IP,则此后发现的其他指向该IP的域名将被丢弃
  5. 整体速度还过得去,在我的PC上,每秒稳定扫描100到200个域名(10个线程)

以下是我扫描baidu.com得到的结果,共发现1521个域名,能找到不少内网域名和IP,效果还是非常不错的。

它甚至可以发现这样的域名: data.test.noah.baidu.com [10.36.166.17]  未经改进的工具通常是探测不到这个域名的。

扫描其他几家公司,情况一样,可以发现不少内网域名、IP(段)、甚至是十分隐蔽的后台。

这就是不做private DNS 和 public DNS隔离的坏处啊,内网的相关拓扑和服务轻易暴露给黑客了。

http://www.lijiejie.com/wp-content/uploads/2015/04/baidu.com_.txt

youku.com    tudou.com   letv.com    renren.com     tencent.com

下载脚本: https://github.com/lijiejie/subDomainsBrute

请先安装依赖的dnspython,在install目录下。

如果你有什么意见、改进,请反馈,谢谢

附运行时截图一张:

subDomainsBrute

讨论一种基于tcp代理的SMTP防火墙和双因子认证及安全审计系统

邮箱和VPN安全,是企业安全运营的一大重点。而邮箱安全,却又常常成为企业安全的薄弱环节,攻击者经常借邮箱作为突破口,渗透企业内网。

简单地说,若没有有效的二次认证手段,VPN安全和邮箱安全是无法从根本上得到保证的。

今天讨论一种简单SMTP二次认证的实现方法。

概述

首先,SMTP服务不再直接暴露于外部不受信任的网络中,搬到内网。对内通过修改private DNS,内网主机可直接访问smtp服务器,因此,内网中所有服务均不受影响。

外部网络 <—> [SMTP防火墙] <—> 内网SMTP服务器 <–> 内网主机

外网必须通过防火墙(or 代理)来访问SMTP服务器。

代理的作用

1. 实现双因子认证

2. 主动拦截异常访问,主动报警

3. 安全审计

双因子认证功能的实现

SMTP是一个很简单的协议,考虑可以加入双因子认证的元素,只能是“用户名”、“密码”、“域名”、“端口”中的某一个。

我们考虑将这个因子附加到用户名中。

于是,用户在PC或手机上配置SMTP时,必须将用户名修改成系统提供的转换后的值,方可认证成功。而直接使用用户名,则是无法完成认证的。

举个例子,我的邮箱是lijiejie@security.com,配置必须是:

Server:  smtpProxy.security.com      (代理服务器)

Port:      25                                    (TCP代理的端口号)

Username: lijiejie.188.test.py    (这里的用户名必须填入系统转换后的值)

Password: 原来的密码

这个lijiejie.188.test.py如何得来呢? 可以下发手机短信,当代理检查到用户名直接登录的情况,向用户手机上发送一个新的用户名,用户使用短信中的用户名进行认证。

如果有动态口令APP或者rsa securid,可以把动态密码附加到用户名后面。而一旦认证成功,完成一次绑定。今后的一个月中,用户都可以使用绑定的动态口令在任何外网的设备上登陆SMTP服务器。一个月之后,绑定过期,必须重新绑定新的口令。

代理检测到用户名和绑定的值不匹配,主动断开连接。

代理检查到用户名和绑定匹配,主动把用户名后面的字符串删除,再转发给内网的SMTP服务器。

双因子认证有什么好处?

1. 内网主机不需要绑定,因此,如果攻击者通过web漏洞获取到了某个邮箱的账号密码,在外网无法登入我们的SMTP服务器

2. 不改变原有SMTP协议,实施双因子认证。但缺点是这个因子实际是一个月才变化一次(One-Month-Password),而不是真正的One-Time-Password。

3. 这个绑定位于用户的PC和手机上,可以随时解绑。

一个简单的例子

这个demo是一个代理程序,它代理到applesmtp.163.com,只有在用户名后面加上.iqiyi.com,才可以完成认证。

https://gist.github.com/lijiejie/012e564ee0aae5283029

当然,这只是最基本的思路,非常不完善。

各种缺点也非常明显,本篇仅作原始的记录。

nmap小技巧[1] 探测大网络空间中的存活主机

nmap是所有安全爱好者应该熟练掌握的扫描工具,本篇介绍其在扫描大网络空间时的用法。

为什么要扫描大网络空间呢? 有这样的情形:

  1. 内网渗透   攻击者单点突破,进入内网后,需进一步扩大成果,可以先扫描整个私有网络空间,发现哪些主机是有利用价值的,例如10.1.1.1/8, 172.16.1.1/12, 192.168.1.1/16
  2. 全网扫描

扫描一个巨大的网络空间,我们最关心的是效率问题,即时间成本。 在足够迅速的前提下,宁可牺牲掉一些准确性。

扫描的基本思路是高并发地ping:

nmap -v -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 -oX nmap_output.xml www.lijiejie.com/16

-sn    不扫描端口,只ping主机

-PE   通过ICMP echo判定主机是否存活

-n     不反向解析IP地址到域名

–min-hostgroup 1024    最小分组设置为1024个IP地址,当IP太多时,nmap需要分组,然后串行扫描

–min-parallelism 1024  这个参数非常关键,为了充分利用系统和网络资源,我们将探针的数目限定最小为1024

-oX nmap_output.xml    将结果以XML格式输出,文件名为nmap_output.xml

一旦扫描结束,解析XML文档即可得到哪些IP地址是存活的。

我测试扫描www.lijiejie.com/16这B段,65535个IP地址(存活10156),耗时112.03秒,如下图所示:

nmap_scan_large_networks

提示: 并发探针的数目可以根据自己的网络状况调整。

python和django的目录遍历漏洞(任意文件读取)

近来我和同事观察到wooyun平台上较多地出现了“任意文件读取漏洞”,类似:

Wooyun:优酷系列服务器文件读取

攻击者通过请求

http://220.181.185.228/../../../../../../../../../etc/sysconfig/network-scripts/ifcfg-eth1

或类似URL,可跨目录读取系统敏感文件。 显然,这个漏洞是因为WebServer处理URL不当引入的。

我们感兴趣的是,这到底是不是一个通用WebServer的漏洞。

经分析验证,我们初步得出,这主要是由于开发人员在python代码中不安全地使用open函数引起,而且低版本的django自身也存在漏洞。

1. 什么是目录遍历漏洞

“目录遍历漏洞”的英文名称是Directory Traversal 或 Path Traversal。指攻击者通过在URL或参数中构造

  • ../
  • ..%2F
  •  /%c0%ae%c0%ae/
  • %2e%2e%2f

或类似的跨父目录字符串,完成目录跳转,读取操作系统各个目录下的敏感文件。很多时候,我们也把它称作“任意文件读取漏洞”。

2. Python和Django的目录遍历漏洞

历史上python和django曾爆出多个目录遍历漏洞,例如:

  1. CVE-2009-2659  Django directory traversal flaw
  2. CVE-2013-4315   python-django: directory traversal with “ssi” template tag
  3. Python CGIHTTPServer File Disclosure and Potential Code Execution

内置的模块和Django模板标签,均受过影响。程序员稍不谨慎,就可能写下有漏洞的代码。

3. 漏洞代码示例

为了演示漏洞的原理,我们写了一段存在明显漏洞的代码:

# -*- coding: utf-8 -*-
import sys
import SocketServer
import BaseHTTPServer
import threading
import time
import exceptions
import os


class MyHttpRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type','text/plain')
        self.end_headers()
        if os.path.isfile(self.path):
            file = open(self.path)
            self.wfile.write(file.read())
            file.close()
        else:
            self.wfile.write('hello world')

        
class ThreadedHttpServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    __httpd = None

    @staticmethod
    def get():
        if not ThreadedHttpServer.__httpd:
            ThreadedHttpServer.__httpd = ThreadedHttpServer(('0.0.0.0', 80), MyHttpRequestHandler)
        return ThreadedHttpServer.__httpd


def main():
    try:
        httpd = ThreadedHttpServer.get()
        httpd.serve_forever()
    except exceptions.KeyboardInterrupt:
        httpd.shutdown()
    except Exception as e:
        print e


if __name__ == '__main__':
    main()

在处理GET请求时,我直接取path,然后使用open函数打开path对应的静态文件,并HTTP响应文件的内容。这里出现了一个明显的目录遍历漏洞,对path未做任何判断和过滤。

当我请求http://localhost/etc/passwd时,self.path对应的值是/etc/passwd,而open(‘/etc/passwd’),自然可以读取到passwd文件。

python_directory_traversal

那攻击者为什么要构造/../../../../../../etc/passwd呢? 这是为了防止程序过滤或丢失最左侧的/符号,让起始目录变成脚本当前所在的目录。攻击者使用多个..符号,不断向上跳转,最终到达根/,而根/的父目录就是自己,因此使用再多的..都无差别,最终停留在根/的位置,如此,便可通过绝对路径去读取任意文件。

python_directory_traversal_2

 

4. 漏洞扫描

该漏洞扫描有多种扫描方法,可使用nmap的http-passwd脚本扫描(http://nmap.org/nsedoc/scripts/http-passwd.html),用法:

nmap –script http-passwd –script-args http-passwd.root=/test/ IP地址

nmap-scan-python-directory-traversal

还可以写几行python脚本,检查HTTP响应中是否存在关键字,只需几行代码,主要是:

import httplib
conn = httplib.HTTPConnection(host, timeout=20)
conn.request('GET', '/../../../../../../../../../etc/passwd')
html_doc = conn.getresponse().read()

还发现一些小伙伴通过curl来检查主机是否存在漏洞,确实也很方便:

curl http://localhost/../../../../../../../etc/passwd

5. 漏洞修复

针对低版本的django和python引入的目录遍历,可选择升级python和django。

若是开发自行处理URL不当引入,则可过滤self.path,递归地过滤掉”..“,并限定号base_dir。 当发现URL中存在..,可直接响应403。

IIS短文件名暴力猜解漏洞分析

昨天写了个“IIS短文件名暴力猜解漏洞”的利用脚本(比网上传播的那个Java POC能猜解出更多文件和文件夹)。 在此,把漏洞做个简单的分析和总计。

1. 漏洞的成因

为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成了对应的windows 8.3 短文件名。

在Windows下查看对应的短文件名,可以使用命令dir /x。

比如,我在D盘下创建了一个名为aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.html文件:

D:\>dir /x
 驱动器 D 中的卷是 Data
 卷的序列号是 3EDF-2E00

 D:\ 的目录

2014/10/11  13:08       256,515,706              2014101.sql
2014/10/13  17:01                 0 AAAAAA~1.HTM aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
.html
               2 个文件    256,515,706 字节
               0 个目录 107,017,154,560 可用字节

观察命令结果,可以看到,其对应的短文件名 AAAAAA~1.HTM。该短文件名有以下特征:

  1. 只有前六位字符直接显示,后续字符用~1指代。其中数字1还可以递增,如果存在多个文件名类似的文件(名称前6位必须相同,且后缀名前3位必须相同)。
  2. 后缀名最长只有3位,多余的被截断。

我们可以在启用.net的IIS下暴力列举短文件名,原因是:

  1. 访问构造的某个存在的短文件名,会返回404
  2. 访问构造的某个不存在的短文件名,会返回400

2. 漏洞的利用

漏洞的利用,需要使用到通配符*。在windows中,*可以匹配n个字符,n可以为0. 判断某站点是否存在IIS短文件名暴力破解,构造payload,分别访问如下两个URL:

1. http://www.target.com/*~1****/a.aspx

2. http://www.target.com/l1j1e*~1****/a.aspx

iis_shortname_enum_404   404

iis_shortname_enum_400    400

这里我使用了4个星号,主要是为了程序自动化猜解,逐个猜解后缀名中的3个字符,实际上,一个星号与4个星号没有任何区别(上面已经提到,*号可以匹配空)。

如果访问第一个URL,返回404。

而访问第二个URL,返回400。 则目标站点存在漏洞。

判断漏洞存在后,继续猜解目录下是否存在一个a开头的文件或文件夹,访问:

http://www.target.com/a*~1****/a.aspx

如果存在,将返回404。 如此反复,不断向下猜解完所有的6个字符。

猜解完之后,得到的序列应该类似:

http://www.target.com/abcdef*~1****/a.aspx

到了这一步,需要考虑两种情况,如果以abcdef开头的是一个文件夹,则

http://www.target.com/abcdef*~1/a.aspx

将返回404.

如果abcdef开头的是一个文件,则自动提交

http://www.target.com/abcdef*~1*g**/a.aspx

用a-z的26个字母替换上述g的位置,应该能得到多个404页面。(记住一点,404代表的是存在。)如果下面的地址返回404,

http://www.target.com/abcde*~1*g**/a.aspx

则代表扩展名中肯定存在g。

按照上面的思路,继续猜解g后面的字符,直到后缀名中的3个字符都猜解完,就可以了。

以上介绍了怎么手工猜解,这个漏洞的意义何在:

  1. 猜解后台地址
  2. 猜解敏感文件,例如备份的rar、zip、.bak、.SQL文件等。
  3. 在某些情形下,甚至可以通过短文件名web直接下载对应的文件。比如下载备份SQL文件。

3.漏洞的局限性

这个漏洞的局限有几点:

1) 只能猜解前六位,以及扩展名的前3位。

2) 名称较短的文件是没有相应的短文件名的。

3)需要IIS和.net两个条件都满足。

4. 漏洞的修复

1) 升级.net framework

2) 修改注册表键值:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem

修改NtfsDisable8dot3NameCreation为1。

3) 将web文件夹的内容拷贝到另一个位置,比如D:\www到D:\www.back,然后删除原文件夹D:\www,再重命名D:\www.back到D:\www

如果不重新复制,已经存在的短文件名则是不会消失的。

本文参考链接:

http://www.acunetix.com/blog/articles/windows-short-8-3-filenames-web-security-problem/

http://www.freebuf.com/articles/4908.html

http://support2.microsoft.com/kb/121007