Commit Graph

248 Commits

Author SHA1 Message Date
lwthiker
6dad23b4b8 Add tests for libcurl-impersonate
Test that libcurl-impersonate produces the desired TLS signature when
the CURL_IMPERSONATE env var is set. A small C program called "minicurl"
is linked to libcurl, and libcurl-impersonate is loaded at runtime with
LD_PRELOAD.
2022-02-27 23:21:00 +02:00
lwthiker
f4474a87e8 Restore old ciphers in BoringSSL
BoringSSL removed some old and weak cipehrs from OpenSSL. It appears as
though Safari still uses some of them.

The included patch restores them, so that using them in the "--ciphers"
option to curl will add them to the client's list of supported ciphers.
These ciphers may not actually work if the server chooses to use them,
because the "real" code to handle them is missing. But since they are
considered weak it is unlikely to happen.
2022-02-27 14:07:38 +02:00
lwthiker
b918636a5b Merge pull request #14 from lwthiker/impersonate_edge
Impersonate Microsoft Edge
2022-02-27 13:48:01 +02:00
lwthiker
f0b2061a68 Impersonate Edge
Microsoft Edge is, since 2019, based on Chromium. It has a completely
identical TLS signature to Chrome's. The only difference is in the HTTP
headers. Adding support for impersonating Edge was therefore extremely
simple.
2022-02-26 22:50:11 +02:00
lwthiker
d4e4fbf99d Update README.md 2022-02-26 13:10:15 +02:00
lwthiker
8714c4631c Update README.md about libcurl-impersonate 2022-02-26 12:48:17 +02:00
lwthiker
48415a4b00 Add impersonation support to libcurl
Patch generated from e8cd43c8eb

Add curl_easy_impersonate() API function that sets the needed options
on the curl 'easy' handle. It sets the various TLS options needed for
impersonation and the HTTP headers that the browser sends by default.

In addition, libcurl will check for the environment variable
CURL_IMPERSONATE when curl_easy_init() is called, and if it exists it
will call curl_easy_impersonate() internally. This theoretically allows
replacing an existing libcurl by setting the LD_LIBRARY_PATH and
CURL_IMPERSONATE env vars, without having to recompile the app.
2022-02-26 12:23:09 +02:00
lwthiker
d22e09eb4a Compile libcurl.so in addition to curl-impersonate
In addition to the statically linked curl-impersonate binary, compile
libcurl.so for dynamic linking as well. The output file is saved at
/build/out/libcurl-impersonate.so.

Also strip the output binaries to reduce their size.

For now, support is for the Chrome build only.
2022-02-26 12:21:24 +02:00
lwthiker
df7df8e247 Merge pull request #12 from lwthiker/consolidate_patches
Consolidate curl's patch files
2022-02-26 11:21:26 +02:00
lwthiker
46d5d21941 Consolidate curl's patch files
Consolidate all of curl's patch files into a single file (one for each
browser). The modified curl source code is now maintained in Git (at
    https://github.com/lwthiker/curl) and it is easier to just
generate the needed patch with 'git --diff'.
2022-02-25 22:27:03 +02:00
lwthiker
0f7b39a367 Merge pull request #11 from lwthiker/readme_arch
Add link to AUR packages in README.md
2022-02-25 11:35:03 +02:00
lwthiker
1f740c5d51 Add link to AUR packages in README.md 2022-02-23 23:00:21 +02:00
lwthiker
767cf57215 Merge pull request #9 from lwthiker/automated_tests
Add automated tests to verify curl's TLS signature
v0.2.0
2022-02-23 13:35:31 +02:00
lwthiker
6e672bc719 Add automated tests to verify curl's TLS signature
Add automated testing infrastructure with tests verifying that
`curl-impersonate` has the same TLS signature as that of the
impersonated browser.

Each wrapper script (e.g. curl_chrome98) is launched to wikipedia.org
while a packet capture is running in the background. The Client Hello
is extracted from the capture, parsed and then compared to the known
browser signature.

The known signatures are stored in a YAML database.
2022-02-22 18:10:18 +02:00
lwthiker
b1081c5a11 Merge pull request #6 from lwthiker/firefox_http2_headers
Fix the order of HTTP2 headers in Firefox
2022-02-21 16:33:32 +02:00
lwthiker
cbeb9fb9c6 Update README.md with new blog post link
Add link to the new blog post about impersonating Chrome.
2022-02-20 15:08:37 +02:00
lwthiker
4f71a1650e Fix the order of HTTP2 headers in Firefox
After inspecting an encrypted TLS session, I noticed that Firefox
sends the HTTP2 pseudo headers in the order :method, :path, :authority,
:scheme while curl was sending them with :authority being the last one.

This patch fixes the order of HTTP2 headers in curl to match Firefox.
2022-02-19 20:34:43 +02:00
lwthiker
248e737d62 Update README.md 2022-02-19 15:52:07 +02:00
lwthiker
bd721758c7 Fix binary names 2022-02-19 15:34:19 +02:00
lwthiker
7d41696c84 Update README.md 2022-02-19 15:27:32 +02:00
lwthiker
6f7273fb88 Merge pull request #4 from lwthiker/impersonate_chrome
Impersonate Chrome by building curl with BoringSSL and modifying its TLS and HTTP/2 parameters.
2022-02-19 15:12:15 +02:00
lwthiker
f08db5c1cc Move build files to 'firefox' folder
In preparation for merging the support for Chrome impersonation, move
all build files to the 'firefox' folder. The two builds will live
separately as they are rather different (using two different SSL
libraries for instance).
2022-02-19 15:10:29 +02:00
lwthiker
1b41b6de84 Add --compressed flag by default
Similar to https://github.com/lwthiker/curl-impersonate/pull/5
2022-02-19 14:55:50 +02:00
lwthiker
367f91922d Move Chrome related files to their own directory
Building curl-impersonate with Chrome impersonation requires a different
compilation and a different set of patches which may conflict with the
Firefox impersonation. Therefore we will treat them a separate builds.
All chrome related files were moved to the chrome/ directory.
2022-02-19 11:05:20 +02:00
lwthiker
a9d285aee4 Merge pull request #5 from lwthiker/use_compressed
Use --compressed flag by default
2022-02-19 09:39:37 +02:00
lwthiker
43b74105e5 Use --compressed flag by default
Because we send the 'Accept-Encoding: gzip, deflate, br' header we
may receive compressed content (gzip or brotli). Previously this was
handled manually in the wrapper script, however curl has a '--compressed'
flag exactly for that purpose. Add it by default to the wrapper scripts.
2022-02-19 09:37:20 +02:00
lwthiker
72cb415d59 Update README.md 2022-02-19 09:31:48 +02:00
lwthiker
62cfde29fa Merge pull request #2 from WeebDataHoarder/main
Adds support for brotli content decoding
2022-02-19 09:28:43 +02:00
lwthiker
01b4a33c82 Fix Curl's HTTP/2 headers to match Chrome's headers
* Change the default HTTP/2 settings sent by Curl to match the ones that
Chrome sends. They appear in the SETTINGS message in the beginning of
the HTTP/2 handshake, which can be seen only after decrypting the TLS
traffic.
* Change the order of the HTTP/2 pseudo-headers ":authority", ":scheme"
and ":path" in the HEADERS message. Curl sent them in a different order
than Chrome.
2022-02-19 00:49:01 +02:00
lwthiker
647c4f428c Finalize TLS Client Hello to impersonate Chrome 2022-02-19 00:48:26 +02:00
lwthiker
b7d9388bf3 Improve curl-impersonate for Chrome
* Enable TLS extension 35 (session_ticket) which Curl turned off.
* Set the signature algorithms to match Chrome's.
* Fix the headers to exactly match Chrome.

It seems that the Client Hello message is now identical to Chrome.
However, it is still getting rejected.
2022-02-18 19:47:59 +02:00
lwthiker
be4da0e70a First attempt at impersonating Chrome
* Headers and ciphers are aligned to Chrome 98 (Windows, non-incognito)
* GREASE enabled because chrome uses it as well
* TLS extensions 27, 5, 18 enabled.
2022-02-18 18:07:28 +02:00
DataHoarder
5960b786d4 Adds support for brotli content decoding, fixes lwthiker/curl-impersonate#1 2022-02-18 12:28:08 +01:00
lwthiker
b00ad551b6 Add support for impersonating Firefox ESR 91
As suggested on the Hacker News thread
(https://news.ycombinator.com/item?id=30378562), add support for Firefox
Extended Support Release.

The required changes were adding one more cipher to the
ciphers list and changing the user agent. Apart from that the TLS
fingerprint is identical to Firefox 95 which was already supported.
2022-02-18 07:59:53 +02:00
lwthiker
4fe2fd36af Update README.md 2022-02-17 22:44:24 +02:00
lwthiker
b0a23197e6 Update comments in the Dockerfile 2022-02-17 22:31:00 +02:00
lwthiker
b9350c1510 Add link to the blog post in README.md 2022-02-17 22:23:39 +02:00
lwthiker
8862988c95 Update README.md 2022-02-17 21:39:51 +02:00
lwthiker
68963c811f Fix the headers in curl_ff95 wrapper script 2022-02-17 21:38:13 +02:00
lwthiker
a1b45a2eba Update README.md 2022-02-17 21:34:46 +02:00
lwthiker
5bc1b53b52 Change pipe name in the wrapper script 2022-02-17 21:18:47 +02:00
lwthiker
918d553ae8 Add missing Dockerfile dependencies
* Install 'xxd', needed for the wrapper curl_ff95 script.
* Add curl_ff95 and not curl_ff97 (typo).
* Change binary name to 'curl-impersonate'
2022-02-17 21:17:47 +02:00
lwthiker
9457aa17cf Update README.md 2022-02-17 18:57:09 +02:00
lwthiker
0cb95660e6 Update README.md 2022-02-17 18:44:34 +02:00
lwthiker
c6f189eb6a Add forgotten Dockerfile 2022-02-17 18:44:02 +02:00
lwthiker
fecd28a00c Commit the Dockerfile and all required patches 2022-02-17 18:38:58 +02:00
lwthiker
3439319c42 Update README.md 2022-02-17 18:37:15 +02:00
lwthiker
4b2f502491 Initial commit 2022-02-17 18:23:38 +02:00