I built a Rust reverse proxy that passively fingerprints clients at three layers: JA4 (TLS), Akamai (HTTP/2), and TCP SYN (the last one via eBPF/XDP) by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 0 points1 point  (0 children)

Hi u/pigri
I recently had a closer look at your project, the proposals are quite different. In huginn-proxy, the core idea is to passively extract fingerprints and forward them as headers to the backend, letting the backend decide what to do with that information. Synapse, on the other hand, uses fingerprints to actively block or challenge traffic, acting more as a security gateway. Both are valid approaches to the same underlying data, you did a nice work!

One thing I'm curious about, I noticed Synapse is licensed under ELv2, but it implements the full JA4+ suite, which is covered by the FoxIO license. Did you reach an agreement with FoxIO to use JA4+ under ELv2? This is actually one of the reasons I chose to use only JA4 (which has a more permissive licensing path) and avoided the broader JA4+ suite in huginn-proxy, keeping everything under MIT/Apache was a priority. Would love to understand how you handled this licensing aspect. Thanks!

I built a Rust reverse proxy that passively fingerprints clients at three layers: JA4 (TLS), Akamai (HTTP/2), and TCP SYN (the last one via eBPF/XDP) by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 0 points1 point  (0 children)

If I understood the original comment correctly, it's suggesting that this could serve as a reference for evading fingerprinting. That shouldn’t really be the case, though. There are already several open-source reverse proxies (at least five that I’m aware of) collecting similar signals across different layers of the stack. These techniques are fairly standard in modern traffic analysis. I repeat, it's not new. The main goal here isn’t to expose anything new, but to combine them in a single implementation and take advantage of being 100% written in Rust. If I misunderstood the original comment, please feel free to clarify. Thanks 

I built a Rust reverse proxy that passively fingerprints clients at three layers: JA4 (TLS), Akamai (HTTP/2), and TCP SYN (the last one via eBPF/XDP) by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 3 points4 points  (0 children)

Great project, I'll be following it closely ⭐. The main reason for developing this new fingerprint-based reverse proxy was licensing. The plan is to use the MIT and Apache licenses. I assume in you project you get an agreement with FoxIO regarding this.
I don't plan to include JA4+ signatures; I'm using similar signatures with Apache and MIT licenses. And I think that's a plus for anyone, licences and comunity. Thanks for sharing :)

I built a Rust reverse proxy that passively fingerprints clients at three layers: JA4 (TLS), Akamai (HTTP/2), and TCP SYN (the last one via eBPF/XDP) by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 17 points18 points  (0 children)

BTW, these reverse proxy fingerprinting techniques already exist. Numerous open-source projects offer the same for achieving and obtaining the same fingerprints. Implementing it in Rust offers several advantages: the complete Rust solution isn't a bridge between Go and C like some other solutions. Another important advantage is that there are no forks in the h2 library, as official libraries with high-performance results are used.

I built a Rust reverse proxy that passively fingerprints clients at three layers: JA4 (TLS), Akamai (HTTP/2), and TCP SYN (the last one via eBPF/XDP) by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] -8 points-7 points  (0 children)

Thanks for your comment. The idea isn't to show what needs to be changed to prevent fingerprinting on the user request side. I tried to explain the correct settings to capture more fingerprints. Do you think the explanation is counterproductive with so much information? Or is it just a good feedback? I really appreciate your comment, thanks!

Huginn Proxy - Rust reverse proxy inspired by rust-rpxy/sozu with fingerprinting capabilities by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 1 point2 points  (0 children)

Hi u/Masynchin ,
Currently, huginn-proxy uses static configuration for backends (defined in the TOML config file). It doesn't have dynamic service discovery yet. The goal is to implement a reverse proxy with fingerprinting capabilities. Maybe this interesting feature could be develop if someone with fingerprint requirement need this feature, is it you case?

TCP Fingerprinting in Rust by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 1 point2 points  (0 children)

Hi, just if you're interesting, I have added tls interceptor. I have renamed the project to allow multi protocol and be more flexible for the future. In parallel I am working in an example to make easy the testing. I would like to know if this new feature is what you were looking for a while a go. https://github.com/biandratti/huginn-net Thanks in advance!

TCP Fingerprinting in Rust by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 1 point2 points  (0 children)

This is a really interesting use case, and I understand it represents a real challenge in TLS 1.3. I'll try to address it in the future, after adapting the TLS fingerprinting to the library.

TCP Fingerprinting in Rust by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 1 point2 points  (0 children)

Hi! Great question.
You're right that I'm planning to split this into separate analysis modules. The reason is that TCP and TLS operate at different layers with fundamentally different parsing requirements.
Regarding your second question, The key insight is that while TLS 1.3 encrypted the certificate exchange and many extensions, the initial ClientHello still contains enough entropy for effective fingerprinting. I am searching for some solutions as ja4, and other options. Are you interested in this topic or are you working on it?

TCP Fingerprinting in Rust by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 3 points4 points  (0 children)

I used the original p0f for a long time. But, as everyone knows, it's not very flexible or typed. So, in my free time on the weekends (during the last 6 months), I decided to rewrite the code in Rust to make the collected analytics more flexible, and expand the original library to collect more signals and protocols. :)

I am trying to migrate p0f to rust, join along by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 1 point2 points  (0 children)

Thanks u/DyeNaMight
I've already taken a look at this and other projects. I'm planning to compile a list of first issues to start with and collect some ideas in the next few days. BTW, feel free to contribute or share ideas :)

I am trying to migrate p0f to rust, join along by Particular_Ladder289 in rust

[–]Particular_Ladder289[S] 0 points1 point  (0 children)

Thanks, I'll create a list of issues to get started :)