用原生socket发送HTTP数据包

  • A+
所属分类:安全闲碎

分享一个写扫描器和POC时的小技巧。

有时候有的漏洞需要一些特殊的数据包,比如说畸形的HTTP头、畸形的Multipart、畸形的chunk包等,此时用编程语言自己的HTTP库可能构造不出这种数据包,此时通常我们需要用原生socket发包,比如:
import socket
p = b'''GET /get?a=1 HTTP/1.1Host: httpbin.orgUser-Agent: raw-socketx00x01aaa
'''.replace(b'n', b'rn')with socket.create_connection(('52.22.188.80', '80'), timeout=5) as conn: conn.send(p) print(conn.recv(10240).decode())

实际情况下你还需要解析HTTP包,但我这里只是一个demo,运行后成功获取结果:


用原生socket发送HTTP数据包


可见,httpbin.org忽略了User-Agent中后的内容。这样,我们用原生socket编写代码,发送了畸形数据包。

那么,如果对方使用了HTTPS,我们又如何发送原生数据包呢?

其实也很简单,HTTPS实际上就是原生socket外面套一层TLS,所以我们改改代码,访问badssl.com试试:

import sslimport socket
context = ssl.create_default_context()p = b'''GET / HTTP/1.1Host: sha512.badssl.comUser-Agent: raw-socket
'''.replace(b'n', b'rn')with socket.create_connection(('sha512.badssl.com', 443), timeout=5) as conn: with context.wrap_socket(conn, server_hostname='sha512.badssl.com') as sconn: sconn.send(p) print(sconn.recv(10240).decode())

没有任何问题:


用原生socket发送HTTP数据包


之前经常看到网上很多人使用socket,还在使用最原始的方式,实际上Python包装了很多有价值的高层API,多多探索,提升你的编程能力。

这篇文章来自于我平时在开发xray(https://github.com/chaitin/xray)的时候遇到的问题和解决方案。




所以,介绍一下我们团队。

我们是长亭科技产品中心的安全研究团队,我们的目标是研究一些具有实际商业价值的安全相关内容,为安全产品提供支持。比如,找到更准确地挖掘XSS、SQL注入等漏洞的方法、学习和发现前沿的一些攻击面,或者找到新的安全产品思路。

有兴趣的同学可以看看我们的JD,可以跟我聊聊,或者简历直接发邮箱:

用原生socket发送HTTP数据包

本文始发于微信公众号(代码审计):用原生socket发送HTTP数据包

发表评论

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