소스 검색

Update hudsucker & fix ca cert gen

zu1k 4 년 전
부모
커밋
e9b13df38a
9개의 변경된 파일119개의 추가작업 그리고 24개의 파일을 삭제
  1. 1 0
      .gitignore
  2. 92 2
      Cargo.lock
  3. 1 1
      Cargo.toml
  4. 4 0
      rustfmt.toml
  5. 7 3
      src/ca.rs
  6. 3 4
      src/handler/mitm.rs
  7. 3 4
      src/main.rs
  8. 1 3
      src/rule/file.rs
  9. 7 7
      src/rule/mod.rs

+ 1 - 0
.gitignore

@@ -1 +1,2 @@
 /target
+/ca

+ 92 - 2
Cargo.lock

@@ -2,6 +2,12 @@
 # It is not intended for manual editing.
 version = 3
 
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
 [[package]]
 name = "aho-corasick"
 version = "0.7.18"
@@ -11,6 +17,21 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "alloc-no-stdlib"
+version = "2.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3"
+
+[[package]]
+name = "alloc-stdlib"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2"
+dependencies = [
+ "alloc-no-stdlib",
+]
+
 [[package]]
 name = "ansi_term"
 version = "0.11.0"
@@ -26,6 +47,20 @@ version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
 
+[[package]]
+name = "async-compression"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443ccbb270374a2b1055fc72da40e1f237809cd6bb0e97e66d264cd138473a6"
+dependencies = [
+ "brotli",
+ "flate2",
+ "futures-core",
+ "memchr",
+ "pin-project-lite",
+ "tokio",
+]
+
 [[package]]
 name = "async-io"
 version = "1.6.0"
@@ -130,6 +165,27 @@ dependencies = [
  "generic-array",
 ]
 
+[[package]]
+name = "brotli"
+version = "3.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71cb90ade945043d3d53597b2fc359bb063db8ade2bcffe7997351d0756e9d50"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+ "brotli-decompressor",
+]
+
+[[package]]
+name = "brotli-decompressor"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+]
+
 [[package]]
 name = "bumpalo"
 version = "3.7.0"
@@ -265,6 +321,15 @@ dependencies = [
  "libc",
 ]
 
+[[package]]
+name = "crc32fast"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
 [[package]]
 name = "crossbeam-channel"
 version = "0.5.1"
@@ -413,6 +478,18 @@ dependencies = [
  "instant",
 ]
 
+[[package]]
+name = "flate2"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crc32fast",
+ "libc",
+ "miniz_oxide",
+]
+
 [[package]]
 name = "fnv"
 version = "1.0.7"
@@ -683,9 +760,11 @@ checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440"
 
 [[package]]
 name = "hudsucker"
-version = "0.4.0"
-source = "git+https://github.com/zu1k/hudsucker.git?branch=good-mitm#b3556568b69bdb79577ab79d41abc342bdd0d226"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d5d0c053fc81d9b9af9725adb50e778ac1e86f3ff8794870732ba1948ce920e"
 dependencies = [
+ "async-compression",
  "async-trait",
  "bytes",
  "chrono",
@@ -704,6 +783,7 @@ dependencies = [
  "tokio",
  "tokio-rustls",
  "tokio-tungstenite",
+ "tokio-util",
  "webpki-roots",
 ]
 
@@ -922,6 +1002,16 @@ version = "0.3.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
 
+[[package]]
+name = "miniz_oxide"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
+dependencies = [
+ "adler",
+ "autocfg",
+]
+
 [[package]]
 name = "mio"
 version = "0.7.13"

+ 1 - 1
Cargo.toml

@@ -21,7 +21,7 @@ bytes = { version = "1", features = ["serde"] }
 clap = "2.33.3"
 env_logger = "0.9"
 fancy-regex = "0.7"
-hudsucker = { git = "https://github.com/zu1k/hudsucker.git", branch = "good-mitm" }
+hudsucker = "0.4.1"
 lazy_static = "1.4"
 log = "0.4"
 rcgen = { version = "0.8", features = ["x509-parser"] }

+ 4 - 0
rustfmt.toml

@@ -0,0 +1,4 @@
+version = "Two"
+
+indent_style = "Block"
+imports_granularity = "Crate"

+ 7 - 3
src/ca.rs

@@ -7,19 +7,23 @@ pub fn gen_ca() {
     let subject_alt_names = vec!["*".to_string()];
     let mut param = CertificateParams::new(subject_alt_names);
     let mut distinguished_name = DistinguishedName::new();
-    distinguished_name.push(DnType::CommonName, "MITM");
+    distinguished_name.push(DnType::CommonName, "Good-MITM CA Cert");
     param.distinguished_name = distinguished_name;
+    param.extended_key_usages = vec![ExtendedKeyUsagePurpose::Any];
+    param.is_ca = IsCa::Ca(BasicConstraints::Unconstrained);
     let cert = Certificate::from_params(param).unwrap();
     let cert_crt = cert.serialize_pem().unwrap();
 
+    fs::create_dir("ca").unwrap();
+
     println!("{}", cert_crt);
-    if let Err(err) = fs::write("cert.crt", cert_crt) {
+    if let Err(err) = fs::write("ca/cert.crt", cert_crt) {
         error!("cert file write failed: {}", err);
     }
 
     let private_key = cert.serialize_private_key_pem();
     println!("{}", private_key);
-    if let Err(err) = fs::write("private.key", private_key) {
+    if let Err(err) = fs::write("ca/private.key", private_key) {
         error!("private key file write failed: {}", err);
     }
 }

+ 3 - 4
src/handler/mitm.rs

@@ -1,7 +1,7 @@
 use crate::rule::{self, Rule};
 use hudsucker::{
     async_trait::async_trait,
-    hyper::{header, Body, Request, Response},
+    hyper::{Body, Request, Response},
     HttpContext, HttpHandler, RequestOrResponse,
 };
 
@@ -18,10 +18,9 @@ impl HttpHandler for MitmHandler {
         _ctx: &HttpContext,
         req: Request<Body>,
     ) -> RequestOrResponse {
-        // println!("{:?}", req.uri().to_string());
         // remove accept-encoding to avoid encoded body
-        let mut req = req;
-        req.headers_mut().remove(header::ACCEPT_ENCODING);
+        // let mut req = req;
+        // req.headers_mut().remove(header::ACCEPT_ENCODING);
 
         if let Some(mut rule) = rule::match_rule(&req) {
             self.should_modify_response = true;

+ 3 - 4
src/main.rs

@@ -8,8 +8,7 @@ mod rule;
 use clap::{App, Arg, SubCommand};
 use hudsucker::{rustls::internal::pemfile, *};
 use log::*;
-use std::fs;
-use std::net::SocketAddr;
+use std::{fs, net::SocketAddr};
 
 async fn shutdown_signal() {
     tokio::signal::ctrl_c()
@@ -64,7 +63,7 @@ fn main() {
                         .alias("private")
                         .help("private key file path")
                         .long_help("private key file path")
-                        .default_value("private.key")
+                        .default_value("ca/private.key")
                         .takes_value(true)
                         .required(true),
                 )
@@ -74,7 +73,7 @@ fn main() {
                         .long("cert")
                         .help("cert file path")
                         .long_help("cert file path")
-                        .default_value("cert.crt")
+                        .default_value("ca/cert.crt")
                         .takes_value(true)
                         .required(true),
                 )

+ 1 - 3
src/rule/file.rs

@@ -1,8 +1,6 @@
 use super::action;
 use serde::{Deserialize, Serialize};
-use std::error::Error;
-use std::path::Path;
-use std::{fs::File, io::BufReader};
+use std::{error::Error, fs::File, io::BufReader, path::Path};
 
 #[derive(Debug, Clone, Deserialize, Serialize)]
 pub struct Rule {

+ 7 - 7
src/rule/mod.rs

@@ -4,14 +4,13 @@ mod filter;
 
 use action::Action;
 use filter::Filter;
-use hudsucker::hyper::Body;
-use hudsucker::hyper::Request;
-use hudsucker::hyper::{header, header::HeaderValue, Response, StatusCode};
-use hudsucker::RequestOrResponse;
+use hudsucker::{
+    decode_response,
+    hyper::{header, header::HeaderValue, Body, Request, Response, StatusCode},
+    RequestOrResponse,
+};
 use log::*;
-use std::path::Path;
-use std::sync::RwLock;
-use std::vec::Vec;
+use std::{path::Path, sync::RwLock, vec::Vec};
 
 lazy_static! {
     static ref RULES: RwLock<Vec<Rule>> = RwLock::from(Vec::new());
@@ -106,6 +105,7 @@ impl Rule {
         match self.action.clone() {
             Action::ModifyResponse(modify) => {
                 info!("[ModifyResponse] {}", url);
+                let res = decode_response(res).unwrap();
                 modify.modify_res(res).await
             }
             _ => res,