作者:grt1stnull
0×01.前言
Github作为一个代码托管平台,有着海量的开源代码和许多开发者。在代码上传时,有些开发者缺乏安全意识,会在不经意间泄露自己的密码或者密钥。本文以这里为切入点,介绍一个检索代码信息的小爬虫以及在写爬虫时的一些奇技淫巧。
0×02.github信息泄露
正如前言所述,缺乏安全意识的开发者会造成这个问题。不止web路径下的.git目录会泄露信息,在托管的开源代码中也会产生信息泄露。例子很多,比如php连接数据库的配置文件泄露,那么可能数据库帐号密码都泄露了,任何人都可以访问这个数据库。再比如通向内网的帐号密码,管理员帐号密码乃至ssh密钥。
api,即应用程序编程接口。众所周知,http是无状态协议,为了将用户区分开引进了cookie机制。有许多厂商,提供了api这个接口供用户调取业务,为了区分用户引进了token,比如’https://example.com/get?info=xxx&token=xxx‘
而我比较喜欢做的事就是,在github上找api的密钥。因为相比与帐号密码,这个不但泄露的更多,而且也更难以注意察觉,并且我们调用方便。比如查询whois信息,子域名检测等等,很多安全厂商提供了api接口,所以如果你没有密钥,不妨试试这个github信息泄露的方法。
shodan可能很多安全从业者都知道,这是一个很强大的搜索引擎。下文我会以爬取github上的shodan api密钥为例子,写一个简单的小爬虫。
0×03.github搜索结果爬取
1.shodan api格式
首先访问https://developer.shodan.io/api,这是shodan的api文档,我们可以看到api请求格式为https://api.shodan.io/shodan/host/{ip}?key={YOUR_API_KEY}。之后我们就可以在github上搜索” https://api.shodan.io/shodan/host/ key=”来看看。
结果如图:
可以看到已经有人不小心泄露自己的密钥了,虽然还有很多人没有。
2.github信息收集
虽然github有提供api,但是对代码检索功能有限制,所以我们这里不使用api。
首先进行搜索我们需要有一个登录状态,大家可以注册一个小号,或者是使用大号,这个没关系的。
登录状态我们可以使用cookies,也可以直接登录,我们这里说直接登录。
首先F12抓包可以看到整个登录流程,即访问github.com/login,之后将表单的值传递给github.com/session。整个流程非常清晰。
代码如下:
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0', 'Referer': 'https://github.com/', 'Host': 'github.com', 'Upgrade-Insecure-Requests': '1', } payload = {'commit': 'Sign in', 'login': '[email protected]', 'password': 'xxxxxx'} r = requests.get("https://github.com/login", headers=headers) _cookies = r.cookies r = requests.post("https://github.com/session", headers=headers, data=payload, cookies=_cookies)
如上可不可以呢?仔细分析整个流程,实际上,表单值中还有一个authenticity_token,我们要先抓取到这个值,然后传递给表单。
抓取函数如下:
from lxml import etree def get_token(text): #<input name="authenticity_token" value="Wwc+VXo2iplcjaTzDJwyigClTyZ9FF6felko/X3330UefrKyBT1f/eny1q1qSmEgFfTm0jKv+HW7rQ5hYu84Qw==" type="hidden"> html = etree.HTML(text) t = html.xpath("//input[@name='authenticity_token']") try: token = t[0].get('value') except IndexError: