hack-requests 使用指南

  • A+
所属分类:安全工具

前言:最近在写w12scan的时候,想到所有的网络访问应该由一个专门的模块进行管理,之前只是用的requests,但是连接池有很多限制,而且对底层数据包不好访问,需要hook,这又会带来更多的问题。
于是就有想法来写一款自己用的网络访问库,之前也有考虑过hackhttp,但是hackhttp参数传递用的不是很习惯,而且不兼容python3.

hack-requests 是基于Python3.x的一个给黑客们使用的http底层网络库。如果你需要一个不那么臃肿而且像requests一样优雅的设计,并且提供底层请求包/返回包原文来方便你进行下一步分析,如果你使用Burp Suite,可以将原始报文直接复制重放,对于大量的HTTP请求,hack-requests内置连接池和线程池也能帮你实现最快速的响应。

安装

将https://github.com/boy-hack/hack-requests中的hackRequests复制到你的项目中

import hackRequests

即可

特征

不需要关注参数类型

requests模块中,为了方便使用,header、cookie、post等信息都是以字典形式传参,但对于黑客来说,常常截获到的是一个文本,手动转换成字典费时费力。但在hackRequests中,这些参数你既可以传入一个字典,也可以传入一个文本,程序会自动识别并转换。

import hackRequests  hack = hackRequests.hackRequests() url = "http://www.hacking8.com"header = '''Connection: keep-aliveCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8'''hh = hack.http(url, headers=header)print(hh.text())  headers = {    "Connection": "keep-alive",    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"} uu = hack.http(url, headers=headers)print(uu.text())

提供底层包分析

hackRequests返回结果中带有log参数,记录了requestresponse,在写扫描器的时候这两个参数参考非常重要。

import hackRequests  hack = hackRequests.hackRequests() url = "http://www.hacking8.com"header = '''Connection: keep-aliveCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8'''hh = hack.http(url, headers=header)print(hh.log.get("request"))print()print(hh.log.get("response"))

返回

GET / HTTP/1.1 Host: www.hacking8.com Connection: Keep-Alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8  HTTP/1.1 200 OK Server: nginx Date: Sat, 01 Sep 2018 12:52:35 GMT Content-Type: text/html Content-Length: 580 Last-Modified: Thu, 16 Aug 2018 09:50:56 GMT Connection: keep-alive ETag: "5b754900-244"Accept-Ranges: bytes

BurpSuite 重放

支持直接将代理抓包软件中的请求

import hackRequests  hack = hackRequests.hackRequests() raw = '''GET / HTTP/1.1Host: www.hacking8.comConnection: Keep-AliveCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8'''hh = hack.httpraw(raw)print(hh.text())

内置线程池

在并发网络访问方面,hackRequests可以帮助您把网络并发优化到极致。

内部内置了连接池和线程池,连接池可以帮助你把原来访问每个url进行的三次TCP握手调整到一次,线程池可以帮助你在网络承受的范围内最大的并发操作。这一切,都是如此简单。

连接池是自带的,线程池写法有少许不同

import hackRequestsdef _callback(r:hackRequests.response):    # 从回调函数取出结果,参数r是response结果     print(r.text())   threadpool = hackRequests.threadpool(threadnum=10,callback=_callback) url = "http://www.baidu.com"for i in range(50):     threadpool.http(url) threadpool.run()

学习方面

代码开源,不到500行代码且中文注释可以帮助你更好的理解该项目思路。

说明文档

快速使用

import hackRequests hack = hackRequests.hackRequests() url = "http://www.baidu.com/index.php"u = hack.http(url,method="HEAD")

说明:HEAD模式可以帮助你更快的检测网页是否存在

使用hack.http()可以填写下列参数,当然,除了url参数外都不是必须的。

参数名 参数功能 参数类型
url(必须) 用于传递一个地址 Str
post post参数用于传递post提交,此参数被选择时,method自动变为POST,post参数的类型可以为Str或者Dict Str/Dict
method 访问模式,目前支持三种 HEAD、GET、POST,默认为GET Str
location 当状态码为301、302时会自动跳转,默认为True Bool
proxy 代理,需要传入一个tuple,类似 ('127.0.0.1','8080') Tuple
headers 自定义HTTP头,可传入字典或原始的请求头 Str/Dict
cookie 自定义Cookie,可传入字典或原始cookie字符串 Str/Dict
referer 模拟用户Referer Str
user_agent 用户请求头,若为空则会模拟一个正常的请求头 Str

发送原始响应头

使用hackRequests中的 httpraw方法

import hackRequests  hack = hackRequests.hackRequests() raw = '''GET / HTTP/1.1Host: www.hacking8.comConnection: Keep-AliveCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN,zh;q=0.9,en;q=0.8'''hh = hack.httpraw(raw)print(hh.text())
参数名 参数类型 参数功能
raw(必须) Str 原始报文
ssl Bool 网站是否是https,默认为False
proxy Tuple 代理地址
location Bool 自动跳转,默认为Ture

response

可使用如下接口获取hack.http()的返回值

接口参数 功能 返回值类型
status_code 获取返回状态码 Int
content() 获取返回字节 Bytes
text() 获取返回文本(会自动转码) Str
header 返回原始响应头 Str
headers 返回原始响应头的字典形式 Dict
charset 获取编码类型 Str
log 获取底层发送的请求包/返回包 Dict
url 返回url,若发生跳转则为跳转后的 Str
cookie 返回请求后的Cookie Str

线程池

import hackRequestsdef _callback(r:hackRequests.response):    # 从回调函数取出结果,参数r是response结果     print(r.text())   threadpool = hackRequests.threadpool(threadnum=10,callback=_callback) url = "http://www.baidu.com"for i in range(50):     threadpool.http(url) threadpool.run()

回调函数参数r是response类,见[说明文档]-[response]
在声明一个线程池为threadpool后,有以下三种方法可以调用

方法名 传入参数 功能
http() 见[说明文档]-[快速使用] 将HTTP请求后加入现成队列,准备执行
httpraw() 见[说明文档]-[快速使用] 将HTTP请求后加入现成队列,准备执行
stop()
停止线程池
run()
启动线程池

Thx

https://github.com/BugScanTeam/hackhttp

ps:用了近一个星期完成代码编写和相关说明文档,肯定会有很多遗漏,希望各位大佬使用后,有错误/建议要提出的哦


本文始发于微信公众号(Hacking就是好玩):hack-requests 使用指南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: