mirror of
				https://github.com/drwetter/testssl.sh.git
				synced 2025-10-30 21:35:26 +01:00 
			
		
		
		
	add '-bugs' so that buggy F5s can be better tested
This commit is contained in:
		
							
								
								
									
										111
									
								
								testssl.sh
									
									
									
									
									
								
							
							
						
						
									
										111
									
								
								testssl.sh
									
									
									
									
									
								
							| @@ -116,6 +116,7 @@ SNEAKY=${SNEAKY:-false}                 # is the referer and useragent we leave | |||||||
| QUIET=${QUIET:-false}                   # don't output the banner. By doing this yiu acknowledge usage term appearing in the banner | QUIET=${QUIET:-false}                   # don't output the banner. By doing this yiu acknowledge usage term appearing in the banner | ||||||
| SSL_NATIVE=${SSL_NATIVE:-false}         # we do per default bash sockets where possible "true": switch back to "openssl native" | SSL_NATIVE=${SSL_NATIVE:-false}         # we do per default bash sockets where possible "true": switch back to "openssl native" | ||||||
| ASSUMING_HTTP=${ASSUMING_HTTP:-false}   # in seldom cases (WAF, old servers, grumpy SSL) service detection fails. "True" enforces HTTP checks | ASSUMING_HTTP=${ASSUMING_HTTP:-false}   # in seldom cases (WAF, old servers, grumpy SSL) service detection fails. "True" enforces HTTP checks | ||||||
|  | BUGS=${BUGS:-""}                        # -bugs option from openssl, needed for some BIG IP F5 | ||||||
| DEBUG=${DEBUG:-0}                       # 1.: the temp files won't be erased.  | DEBUG=${DEBUG:-0}                       # 1.: the temp files won't be erased.  | ||||||
|                                         # 2: list more what's going on (formerly: eq VERBOSE=1, VERBERR=true), lists some errors of connections |                                         # 2: list more what's going on (formerly: eq VERBOSE=1, VERBERR=true), lists some errors of connections | ||||||
|                                         # 3: slight hexdumps + other info,  |                                         # 3: slight hexdumps + other info,  | ||||||
| @@ -535,7 +536,7 @@ runs_HTTP() { | |||||||
|  |  | ||||||
|      if ! $CLIENT_AUTH; then |      if ! $CLIENT_AUTH; then | ||||||
|           # SNI is nonsense for !HTTPS but fortunately for other protocols s_client doesn't seem to care |           # SNI is nonsense for !HTTPS but fortunately for other protocols s_client doesn't seem to care | ||||||
|           printf "$GET_REQ11" | $OPENSSL s_client $1 -quiet -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE & |           printf "$GET_REQ11" | $OPENSSL s_client $1 -quiet $BUGS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE & | ||||||
|           wait_kill $! $HEADER_MAXSLEEP |           wait_kill $! $HEADER_MAXSLEEP | ||||||
|           was_killed=$? |           was_killed=$? | ||||||
|           head $TMPFILE | grep -aq ^HTTP && SERVICE=HTTP |           head $TMPFILE | grep -aq ^HTTP && SERVICE=HTTP | ||||||
| @@ -588,12 +589,12 @@ run_http_header() { | |||||||
|      outln |      outln | ||||||
|  |  | ||||||
|      [[ -z "$1" ]] && url="/" || url="$1" |      [[ -z "$1" ]] && url="/" || url="$1" | ||||||
|      printf "$GET_REQ11" | $OPENSSL s_client $OPTIMAL_PROTO -quiet -ign_eof -connect $NODEIP:$PORT $PROXY $SNI >$HEADERFILE 2>$ERRFILE & |      printf "$GET_REQ11" | $OPENSSL s_client $OPTIMAL_PROTO $BUGS -quiet -ign_eof -connect $NODEIP:$PORT $PROXY $SNI >$HEADERFILE 2>$ERRFILE & | ||||||
|      wait_kill $! $HEADER_MAXSLEEP |      wait_kill $! $HEADER_MAXSLEEP | ||||||
|      if [[ $? -eq 0 ]]; then |      if [[ $? -eq 0 ]]; then | ||||||
|           # we do the get command again as it terminated within $HEADER_MAXSLEEP. Thus it didn't hang, we do it |           # we do the get command again as it terminated within $HEADER_MAXSLEEP. Thus it didn't hang, we do it | ||||||
|           # again in the foreground ito get an ccurate header time! |           # again in the foreground ito get an ccurate header time! | ||||||
|           printf "$GET_REQ11" | $OPENSSL s_client $OPTIMAL_PROTO -quiet -ign_eof -connect $NODEIP:$PORT $PROXY $SNI >$HEADERFILE 2>$ERRFILE  |           printf "$GET_REQ11" | $OPENSSL s_client $OPTIMAL_PROTO $BUGS -quiet -ign_eof -connect $NODEIP:$PORT $PROXY $SNI >$HEADERFILE 2>$ERRFILE  | ||||||
|           NOW_TIME=$(date "+%s") |           NOW_TIME=$(date "+%s") | ||||||
|           HTTP_TIME=$(awk -F': ' '/^date:/ { print $2 }  /^Date:/ { print $2 }' $HEADERFILE) |           HTTP_TIME=$(awk -F': ' '/^date:/ { print $2 }  /^Date:/ { print $2 }' $HEADERFILE) | ||||||
|           HAD_SLEPT=0 |           HAD_SLEPT=0 | ||||||
| @@ -1141,7 +1142,7 @@ std_cipherlists() { | |||||||
|  |  | ||||||
|      pr_bold "$2    "         # indent in order to be in the same row as server preferences |      pr_bold "$2    "         # indent in order to be in the same row as server preferences | ||||||
|      if listciphers "$1"; then  # is that locally available?? |      if listciphers "$1"; then  # is that locally available?? | ||||||
|           $OPENSSL s_client -cipher "$1" $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI 2>$ERRFILE >$TMPFILE </dev/null |           $OPENSSL s_client -cipher "$1" $BUGS $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI 2>$ERRFILE >$TMPFILE </dev/null | ||||||
|           sclient_connect_successful $? $TMPFILE |           sclient_connect_successful $? $TMPFILE | ||||||
|           sclient_success=$? |           sclient_success=$? | ||||||
|           debugme cat $ERRFILE |           debugme cat $ERRFILE | ||||||
| @@ -1280,7 +1281,7 @@ test_just_one(){ | |||||||
|                     neat_list $HEXC $ciph $kx $enc | grep -qwai "$arg" |                     neat_list $HEXC $ciph $kx $enc | grep -qwai "$arg" | ||||||
|                fi |                fi | ||||||
|                if [[ $? -eq 0 ]]; then    # string matches, so we can ssl to it: |                if [[ $? -eq 0 ]]; then    # string matches, so we can ssl to it: | ||||||
|                     $OPENSSL s_client -cipher $ciph $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI 2>$ERRFILE >$TMPFILE </dev/null |                     $OPENSSL s_client -cipher $ciph $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI 2>$ERRFILE >$TMPFILE </dev/null | ||||||
|                     sclient_connect_successful $? $TMPFILE |                     sclient_connect_successful $? $TMPFILE | ||||||
|                     sclient_success=$? |                     sclient_success=$? | ||||||
|                     if [[ $kx == "Kx=ECDH" ]] || [[ $kx == "Kx=DH" ]] || [[ $kx == "Kx=EDH" ]]; then |                     if [[ $kx == "Kx=ECDH" ]] || [[ $kx == "Kx=DH" ]] || [[ $kx == "Kx=EDH" ]]; then | ||||||
| @@ -1325,7 +1326,7 @@ run_allciphers(){ | |||||||
|  |  | ||||||
|      $OPENSSL ciphers -V 'ALL:COMPLEMENTOFALL:@STRENGTH' 2>>$ERRFILE | while read hexcode n ciph sslvers kx auth enc mac export; do |      $OPENSSL ciphers -V 'ALL:COMPLEMENTOFALL:@STRENGTH' 2>>$ERRFILE | while read hexcode n ciph sslvers kx auth enc mac export; do | ||||||
|      # FIXME: e.g. OpenSSL < 1.0 doesn't understand "-V" --> we can't do anything about it! |      # FIXME: e.g. OpenSSL < 1.0 doesn't understand "-V" --> we can't do anything about it! | ||||||
|           $OPENSSL s_client -cipher $ciph $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null |           $OPENSSL s_client -cipher $ciph $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|           sclient_connect_successful $? $TMPFILE |           sclient_connect_successful $? $TMPFILE | ||||||
|           sclient_success=$? |           sclient_success=$? | ||||||
|           if [[ $sclient_success -ne 0 ]] && [[ "$SHOW_EACH_C" -eq 0 ]]; then |           if [[ $sclient_success -ne 0 ]] && [[ "$SHOW_EACH_C" -eq 0 ]]; then | ||||||
| @@ -1366,7 +1367,7 @@ run_cipher_per_proto(){ | |||||||
|           locally_supported "$proto" "$proto_text" || continue |           locally_supported "$proto" "$proto_text" || continue | ||||||
|           outln |           outln | ||||||
|           $OPENSSL ciphers $proto -V 'ALL:COMPLEMENTOFALL:@STRENGTH' 2>$ERRFILE | while read hexcode n ciph sslvers kx auth enc mac export; do   # -V doesn't work with openssl < 1.0 |           $OPENSSL ciphers $proto -V 'ALL:COMPLEMENTOFALL:@STRENGTH' 2>$ERRFILE | while read hexcode n ciph sslvers kx auth enc mac export; do   # -V doesn't work with openssl < 1.0 | ||||||
|                $OPENSSL s_client -cipher $ciph $proto $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE  </dev/null |                $OPENSSL s_client -cipher $ciph $proto $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE  </dev/null | ||||||
|                sclient_connect_successful $? $TMPFILE |                sclient_connect_successful $? $TMPFILE | ||||||
|                sclient_success=$? |                sclient_success=$? | ||||||
|                if [[ $sclient_success -ne 0 ]] && [[ "$SHOW_EACH_C" -eq 0 ]]; then |                if [[ $sclient_success -ne 0 ]] && [[ "$SHOW_EACH_C" -eq 0 ]]; then | ||||||
| @@ -1415,7 +1416,7 @@ run_prototest_openssl() { | |||||||
|      local sni="$SNI" |      local sni="$SNI" | ||||||
|      local -i ret=0 |      local -i ret=0 | ||||||
|  |  | ||||||
|      $OPENSSL s_client -state $1 $STARTTLS -connect $NODEIP:$PORT $PROXY $sni >$TMPFILE 2>$ERRFILE </dev/null |      $OPENSSL s_client -state $1 $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $sni >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|      sclient_connect_successful $? $TMPFILE |      sclient_connect_successful $? $TMPFILE | ||||||
|      ret=$? |      ret=$? | ||||||
|      [[ $DEBUG -eq 2 ]] && egrep "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" |      [[ $DEBUG -eq 2 ]] && egrep "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" | ||||||
| @@ -1424,7 +1425,7 @@ run_prototest_openssl() { | |||||||
|      else                                    # we remove SNI for SSLv2 and v3: |      else                                    # we remove SNI for SSLv2 and v3: | ||||||
|           [[ "$1" =~ ssl ]] && sni=""        # newer openssl throw an error if SNI is supplied with SSLv2, |           [[ "$1" =~ ssl ]] && sni=""        # newer openssl throw an error if SNI is supplied with SSLv2, | ||||||
|                                              # SSLv3 doesn't have SNI (openssl doesn't complain though -- yet) |                                              # SSLv3 doesn't have SNI (openssl doesn't complain though -- yet) | ||||||
|           $OPENSSL s_client -state $1 $STARTTLS -connect $NODEIP:$PORT $sni >$TMPFILE 2>$ERRFILE </dev/null |           $OPENSSL s_client -state $1 $STARTTLS $BUGS -connect $NODEIP:$PORT $sni >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|           sclient_connect_successful $? $TMPFILE |           sclient_connect_successful $? $TMPFILE | ||||||
|           ret=$?  |           ret=$?  | ||||||
|           [[ $DEBUG -eq 2 ]] && egrep "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" |           [[ $DEBUG -eq 2 ]] && egrep "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" | ||||||
| @@ -1638,7 +1639,7 @@ run_server_preference() { | |||||||
|      outln |      outln | ||||||
|  |  | ||||||
|      pr_bold " Has server cipher order?     " |      pr_bold " Has server cipher order?     " | ||||||
|      $OPENSSL s_client $STARTTLS -cipher $list_fwd -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>$ERRFILE >$TMPFILE |      $OPENSSL s_client $STARTTLS -cipher $list_fwd $BUGS -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>$ERRFILE >$TMPFILE | ||||||
|      if ! sclient_connect_successful $? $TMPFILE && [[ -z "$STARTTLS_PROTOCOL" ]]; then |      if ! sclient_connect_successful $? $TMPFILE && [[ -z "$STARTTLS_PROTOCOL" ]]; then | ||||||
|           pr_litemagenta "no matching cipher in this list found (pls report this): " |           pr_litemagenta "no matching cipher in this list found (pls report this): " | ||||||
|           outln "$list_fwd  . " |           outln "$list_fwd  . " | ||||||
| @@ -1649,7 +1650,7 @@ run_server_preference() { | |||||||
|           # workaround is to connect with a protocol |           # workaround is to connect with a protocol | ||||||
|           debugme out "(workaround #188) " |           debugme out "(workaround #188) " | ||||||
|           determine_optimal_proto $STARTTLS_PROTOCOL              |           determine_optimal_proto $STARTTLS_PROTOCOL              | ||||||
|           $OPENSSL s_client $STARTTLS $STARTTLS_OPTIMAL_PROTO -cipher $list_fwd -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>$ERRFILE >$TMPFILE |           $OPENSSL s_client $STARTTLS $STARTTLS_OPTIMAL_PROTO -cipher $list_fwd $BUGS -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>$ERRFILE >$TMPFILE | ||||||
|           if ! sclient_connect_successful $? $TMPFILE; then |           if ! sclient_connect_successful $? $TMPFILE; then | ||||||
|                pr_litemagenta "no matching cipher in this list found (pls report this): " |                pr_litemagenta "no matching cipher in this list found (pls report this): " | ||||||
|                outln "$list_fwd  . " |                outln "$list_fwd  . " | ||||||
| @@ -1660,7 +1661,7 @@ run_server_preference() { | |||||||
|  |  | ||||||
|      if $has_cipher_order; then |      if $has_cipher_order; then | ||||||
|           cipher1=$(grep -wa Cipher $TMPFILE | egrep -avw "New|is" | sed -e 's/^ \+Cipher \+://' -e 's/ //g') |           cipher1=$(grep -wa Cipher $TMPFILE | egrep -avw "New|is" | sed -e 's/^ \+Cipher \+://' -e 's/ //g') | ||||||
|           $OPENSSL s_client $STARTTLS $STARTTLS_OPTIMAL_PROTO -cipher $list_reverse -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>>$ERRFILE >$TMPFILE |           $OPENSSL s_client $STARTTLS $STARTTLS_OPTIMAL_PROTO -cipher $list_reverse $BUGS -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>>$ERRFILE >$TMPFILE | ||||||
|           # that worked above so no error handling here |           # that worked above so no error handling here | ||||||
|           cipher2=$(grep -wa Cipher $TMPFILE | egrep -avw "New|is" | sed -e 's/^ \+Cipher \+://' -e 's/ //g') |           cipher2=$(grep -wa Cipher $TMPFILE | egrep -avw "New|is" | sed -e 's/^ \+Cipher \+://' -e 's/ //g') | ||||||
|  |  | ||||||
| @@ -1675,10 +1676,10 @@ run_server_preference() { | |||||||
|           outln |           outln | ||||||
|  |  | ||||||
|           pr_bold " Negotiated protocol          " |           pr_bold " Negotiated protocol          " | ||||||
|           $OPENSSL s_client $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>>$ERRFILE >$TMPFILE |           $OPENSSL s_client $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>>$ERRFILE >$TMPFILE | ||||||
|           if ! sclient_connect_successful $? $TMPFILE; then |           if ! sclient_connect_successful $? $TMPFILE; then | ||||||
|                # 2 second try with $OPTIMAL_PROTO especially for intolerant IIS6 servers: |                # 2 second try with $OPTIMAL_PROTO especially for intolerant IIS6 servers: | ||||||
|                $OPENSSL s_client $STARTTLS $OPTIMAL_PROTO -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>>$ERRFILE >$TMPFILE |                $OPENSSL s_client $STARTTLS $OPTIMAL_PROTO $BUGS -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>>$ERRFILE >$TMPFILE | ||||||
|                sclient_connect_successful $? $TMPFILE || pr_litemagenta "Handshake error!" |                sclient_connect_successful $? $TMPFILE || pr_litemagenta "Handshake error!" | ||||||
|           fi |           fi | ||||||
|           default_proto=$(grep -aw "Protocol" $TMPFILE | sed -e 's/^.*Protocol.*://' -e 's/ //g') |           default_proto=$(grep -aw "Protocol" $TMPFILE | sed -e 's/^.*Protocol.*://' -e 's/ //g') | ||||||
| @@ -1713,7 +1714,7 @@ run_server_preference() { | |||||||
|                for p in ssl2 ssl3 tls1 tls1_1 tls1_2; do |                for p in ssl2 ssl3 tls1 tls1_1 tls1_2; do | ||||||
|                #locally_supported -"$p" "    " || continue |                #locally_supported -"$p" "    " || continue | ||||||
|                locally_supported -"$p" || continue |                locally_supported -"$p" || continue | ||||||
|                     $OPENSSL s_client $STARTTLS -"$p" -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>>$ERRFILE >$TMPFILE |                     $OPENSSL s_client $STARTTLS -"$p" $BUGS -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>>$ERRFILE >$TMPFILE | ||||||
|                     if sclient_connect_successful $? $TMPFILE; then |                     if sclient_connect_successful $? $TMPFILE; then | ||||||
|                          proto[i]=$(grep -aw "Protocol" $TMPFILE | sed -e 's/^.*Protocol.*://' -e 's/ //g') |                          proto[i]=$(grep -aw "Protocol" $TMPFILE | sed -e 's/^.*Protocol.*://' -e 's/ //g') | ||||||
|                          cipher[i]=$(grep -aw "Cipher" $TMPFILE | egrep -avw "New|is" | sed -e 's/^.*Cipher.*://' -e 's/ //g') |                          cipher[i]=$(grep -aw "Cipher" $TMPFILE | egrep -avw "New|is" | sed -e 's/^.*Cipher.*://' -e 's/ //g') | ||||||
| @@ -1729,7 +1730,7 @@ run_server_preference() { | |||||||
|                [[ -n "$PROXY" ]] && arg="   SPDY/NPN is" |                [[ -n "$PROXY" ]] && arg="   SPDY/NPN is" | ||||||
|                [[ -n "$STARTTLS" ]] && arg="    " |                [[ -n "$STARTTLS" ]] && arg="    " | ||||||
|                if spdy_pre " $arg"; then                                                  # is NPN/SPDY supported and is this no STARTTLS? / no PROXY |                if spdy_pre " $arg"; then                                                  # is NPN/SPDY supported and is this no STARTTLS? / no PROXY | ||||||
|                     $OPENSSL s_client -host $NODE -port $PORT -nextprotoneg "$NPN_PROTOs" </dev/null 2>>$ERRFILE >$TMPFILE |                     $OPENSSL s_client -host $NODE -port $PORT $BUGS -nextprotoneg "$NPN_PROTOs" </dev/null 2>>$ERRFILE >$TMPFILE | ||||||
|                     if sclient_connect_successful $? $TMPFILE; then |                     if sclient_connect_successful $? $TMPFILE; then | ||||||
|                          proto[i]=$(grep -aw "Next protocol" $TMPFILE | sed -e 's/^Next protocol://' -e 's/(.)//' -e 's/ //g') |                          proto[i]=$(grep -aw "Next protocol" $TMPFILE | sed -e 's/^Next protocol://' -e 's/(.)//' -e 's/ //g') | ||||||
|                          if [[ -z "${proto[i]}" ]]; then |                          if [[ -z "${proto[i]}" ]]; then | ||||||
| @@ -1778,7 +1779,7 @@ cipher_pref_check() { | |||||||
|      pr_bold " Cipher order" |      pr_bold " Cipher order" | ||||||
|  |  | ||||||
|      for p in ssl2 ssl3 tls1 tls1_1 tls1_2; do |      for p in ssl2 ssl3 tls1 tls1_1 tls1_2; do | ||||||
|           $OPENSSL s_client $STARTTLS -"$p" -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>$ERRFILE >$TMPFILE |           $OPENSSL s_client $STARTTLS -"$p" $BUGS -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>$ERRFILE >$TMPFILE | ||||||
|           if sclient_connect_successful $? $TMPFILE; then |           if sclient_connect_successful $? $TMPFILE; then | ||||||
|                tested_cipher="" |                tested_cipher="" | ||||||
|                proto=$(grep -aw "Protocol" $TMPFILE | sed -e 's/^.*Protocol.*://' -e 's/ //g') |                proto=$(grep -aw "Protocol" $TMPFILE | sed -e 's/^.*Protocol.*://' -e 's/ //g') | ||||||
| @@ -1788,7 +1789,7 @@ cipher_pref_check() { | |||||||
|                printf "     %-10s %s " "$proto:" "$cipher" |                printf "     %-10s %s " "$proto:" "$cipher" | ||||||
|                tested_cipher="-"$cipher |                tested_cipher="-"$cipher | ||||||
|                while true; do |                while true; do | ||||||
|                     $OPENSSL s_client $STARTTLS -"$p" -cipher "ALL:$tested_cipher" -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>>$ERRFILE >$TMPFILE |                     $OPENSSL s_client $STARTTLS -"$p" $BUGS -cipher "ALL:$tested_cipher" -connect $NODEIP:$PORT $PROXY $SNI </dev/null 2>>$ERRFILE >$TMPFILE | ||||||
|                     sclient_connect_successful $? $TMPFILE || break |                     sclient_connect_successful $? $TMPFILE || break | ||||||
|                     cipher=$(grep -aw "Cipher" $TMPFILE | egrep -avw "New|is" | sed -e 's/^.*Cipher.*://' -e 's/ //g') |                     cipher=$(grep -aw "Cipher" $TMPFILE | egrep -avw "New|is" | sed -e 's/^.*Cipher.*://' -e 's/ //g') | ||||||
|                     out "$cipher " |                     out "$cipher " | ||||||
| @@ -1801,14 +1802,14 @@ cipher_pref_check() { | |||||||
|      if ! spdy_pre "     SPDY/NPN: "; then       # is NPN/SPDY supported and is this no STARTTLS? |      if ! spdy_pre "     SPDY/NPN: "; then       # is NPN/SPDY supported and is this no STARTTLS? | ||||||
|           outln |           outln | ||||||
|      else |      else | ||||||
|           protos=$($OPENSSL s_client -host $NODE -port $PORT -nextprotoneg  \"\" </dev/null 2>>$ERRFILE | grep -a "^Protocols " | sed -e 's/^Protocols.*server: //' -e 's/,//g') |           protos=$($OPENSSL s_client -host $NODE -port $PORT $BUGS -nextprotoneg \"\" </dev/null 2>>$ERRFILE | grep -a "^Protocols " | sed -e 's/^Protocols.*server: //' -e 's/,//g') | ||||||
|           for p in $protos; do |           for p in $protos; do | ||||||
|                $OPENSSL s_client -host $NODE -port $PORT -nextprotoneg "$p" $PROXY </dev/null 2>>$ERRFILE >$TMPFILE |                $OPENSSL s_client -host $NODE -port $PORT $BUGS -nextprotoneg "$p" $PROXY </dev/null 2>>$ERRFILE >$TMPFILE | ||||||
|                cipher=$(grep -aw "Cipher" $TMPFILE | egrep -avw "New|is" | sed -e 's/^.*Cipher.*://' -e 's/ //g') |                cipher=$(grep -aw "Cipher" $TMPFILE | egrep -avw "New|is" | sed -e 's/^.*Cipher.*://' -e 's/ //g') | ||||||
|                printf "     %-10s %s " "$p:" "$cipher" |                printf "     %-10s %s " "$p:" "$cipher" | ||||||
|                tested_cipher="-"$cipher |                tested_cipher="-"$cipher | ||||||
|                while true; do |                while true; do | ||||||
|                     $OPENSSL s_client -cipher "ALL:$tested_cipher" -host $NODE -port $PORT -nextprotoneg "$p" $PROXY </dev/null 2>>$ERRFILE >$TMPFILE |                     $OPENSSL s_client -cipher "ALL:$tested_cipher" -host $NODE -port $PORT $BUGS -nextprotoneg "$p" $PROXY </dev/null 2>>$ERRFILE >$TMPFILE | ||||||
|                     sclient_connect_successful $? $TMPFILE || break |                     sclient_connect_successful $? $TMPFILE || break | ||||||
|                     cipher=$(grep -aw "Cipher" $TMPFILE | egrep -avw "New|is" | sed -e 's/^.*Cipher.*://' -e 's/ //g') |                     cipher=$(grep -aw "Cipher" $TMPFILE | egrep -avw "New|is" | sed -e 's/^.*Cipher.*://' -e 's/ //g') | ||||||
|                     out "$cipher " |                     out "$cipher " | ||||||
| @@ -1828,7 +1829,7 @@ cipher_pref_check() { | |||||||
| get_host_cert() { | get_host_cert() { | ||||||
|      local tmpvar=$TEMPDIR/$FUNCNAME.txt     # change later to $TMPFILE |      local tmpvar=$TEMPDIR/$FUNCNAME.txt     # change later to $TMPFILE | ||||||
|  |  | ||||||
|      $OPENSSL s_client $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI $1 2>/dev/null </dev/null >$TEMPDIR/$FUNCNAME.txt |      $OPENSSL s_client $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI $1 2>/dev/null </dev/null >$TEMPDIR/$FUNCNAME.txt | ||||||
|      if sclient_connect_successful $? $tmpvar; then |      if sclient_connect_successful $? $tmpvar; then | ||||||
|           awk '/-----BEGIN/,/-----END/ { print $0 }' $tmpvar >$HOSTCERT |           awk '/-----BEGIN/,/-----END/ { print $0 }' $tmpvar >$HOSTCERT | ||||||
|      else |      else | ||||||
| @@ -1841,7 +1842,7 @@ get_all_certs() { | |||||||
|      local savedir |      local savedir | ||||||
|      local nrsaved |      local nrsaved | ||||||
|  |  | ||||||
|      $OPENSSL s_client -showcerts $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI 2>$ERRFILE </dev/null >$TEMPDIR/allcerts.txt |      $OPENSSL s_client -showcerts $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI 2>$ERRFILE </dev/null >$TEMPDIR/allcerts.txt | ||||||
|      sclient_connect_successful $? $TMPFILE || \ |      sclient_connect_successful $? $TMPFILE || \ | ||||||
|           pr_litemagenta "problem getting all certs" |           pr_litemagenta "problem getting all certs" | ||||||
|      savedir=$(pwd); cd $TEMPDIR |      savedir=$(pwd); cd $TEMPDIR | ||||||
| @@ -1898,7 +1899,7 @@ determine_trust() { | |||||||
|                return 7 |                return 7 | ||||||
|           fi |           fi | ||||||
| 		debugme printf -- " %-12s" "${certificate_file[i]}" | 		debugme printf -- " %-12s" "${certificate_file[i]}" | ||||||
| 		$OPENSSL s_client -purpose sslserver -CAfile $bundle_fname $STARTTLS $PROXY -connect $NODEIP:$PORT $SNI </dev/null  >$TEMPDIR/${certificate_file[i]}.1 2>$TEMPDIR/${certificate_file[i]}.2 | 		$OPENSSL s_client -purpose sslserver -CAfile $bundle_fname $STARTTLS $BUGS $PROXY -connect $NODEIP:$PORT $SNI </dev/null  >$TEMPDIR/${certificate_file[i]}.1 2>$TEMPDIR/${certificate_file[i]}.2 | ||||||
| 		verify_retcode[i]=$(awk -F':' '/Verify return code: / { print $2 }' $TEMPDIR//${certificate_file[i]}.1) | 		verify_retcode[i]=$(awk -F':' '/Verify return code: / { print $2 }' $TEMPDIR//${certificate_file[i]}.1) | ||||||
| 		if egrep -wq "ok|0" <<< ${verify_retcode[i]}; then | 		if egrep -wq "ok|0" <<< ${verify_retcode[i]}; then | ||||||
| 			trust[i]=true | 			trust[i]=true | ||||||
| @@ -2000,12 +2001,12 @@ determine_tls_extensions() { | |||||||
|      success=7 |      success=7 | ||||||
|      for proto in tls1_2 tls1_1 tls1 ssl3; do |      for proto in tls1_2 tls1_1 tls1 ssl3; do | ||||||
| # alpn: echo | openssl s_client -connect google.com:443 -tlsextdebug -alpn h2-14 -servername google.com  <-- suport needs to be checked b4 -- see also: ssl/t1_trce.c | # alpn: echo | openssl s_client -connect google.com:443 -tlsextdebug -alpn h2-14 -servername google.com  <-- suport needs to be checked b4 -- see also: ssl/t1_trce.c | ||||||
|           $OPENSSL s_client $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI -$proto -tlsextdebug -nextprotoneg $alpn -status </dev/null 2>$ERRFILE >$TMPFILE |           $OPENSSL s_client $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI -$proto -tlsextdebug -nextprotoneg $alpn -status </dev/null 2>$ERRFILE >$TMPFILE | ||||||
|           sclient_connect_successful $? $TMPFILE && success=0 && break |           sclient_connect_successful $? $TMPFILE && success=0 && break | ||||||
|      done                          # this loop is needed for IIS/6 |      done                          # this loop is needed for IIS/6 | ||||||
|      if [[ $success -eq 7 ]]; then |      if [[ $success -eq 7 ]]; then | ||||||
|           # "-status" above doesn't work for GOST only servers, so we do another test without it and see whether that works then: |           # "-status" above doesn't work for GOST only servers, so we do another test without it and see whether that works then: | ||||||
|           $OPENSSL s_client $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI -$proto -tlsextdebug </dev/null 2>>$ERRFILE >$TMPFILE |           $OPENSSL s_client $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI -$proto -tlsextdebug </dev/null 2>>$ERRFILE >$TMPFILE | ||||||
|           if ! sclient_connect_successful $? $TMPFILE; then |           if ! sclient_connect_successful $? $TMPFILE; then | ||||||
|                pr_litemagentaln "Strange, no SSL/TLS protocol seems to be supported (error around line $((LINENO - 6)))" |                pr_litemagentaln "Strange, no SSL/TLS protocol seems to be supported (error around line $((LINENO - 6)))" | ||||||
|                tmpfile_handle $FUNCNAME.txt |                tmpfile_handle $FUNCNAME.txt | ||||||
| @@ -2127,7 +2128,7 @@ run_server_defaults() { | |||||||
|           out "$cn" |           out "$cn" | ||||||
|      fi |      fi | ||||||
|  |  | ||||||
|      $OPENSSL s_client $STARTTLS -connect $NODEIP:$PORT $PROXY $OPTIMAL_PROTO 2>>$ERRFILE </dev/null | awk '/-----BEGIN/,/-----END/ { print $0 }'  >$HOSTCERT.nosni |      $OPENSSL s_client $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $OPTIMAL_PROTO 2>>$ERRFILE </dev/null | awk '/-----BEGIN/,/-----END/ { print $0 }'  >$HOSTCERT.nosni | ||||||
|      cn_nosni="" |      cn_nosni="" | ||||||
|      if [[ -s $HOSTCERT.nosni ]]; then |      if [[ -s $HOSTCERT.nosni ]]; then | ||||||
|           if $OPENSSL x509 -in $HOSTCERT.nosni -noout -subject 2>>$ERRFILE | grep -wq CN; then |           if $OPENSSL x509 -in $HOSTCERT.nosni -noout -subject 2>>$ERRFILE | grep -wq CN; then | ||||||
| @@ -2325,7 +2326,7 @@ run_pfs() { | |||||||
|           return 1 |           return 1 | ||||||
|      fi |      fi | ||||||
|  |  | ||||||
|      $OPENSSL s_client -cipher 'ECDH:DH' $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null |      $OPENSSL s_client -cipher 'ECDH:DH' $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|      sclient_connect_successful $? $TMPFILE |      sclient_connect_successful $? $TMPFILE | ||||||
|      sclient_success=$? |      sclient_success=$? | ||||||
|      outln |      outln | ||||||
| @@ -2342,7 +2343,7 @@ run_pfs() { | |||||||
|           fi |           fi | ||||||
|           while read hexcode dash pfs_cipher sslvers kx auth enc mac; do |           while read hexcode dash pfs_cipher sslvers kx auth enc mac; do | ||||||
|                tmpfile=$TMPFILE.$hexcode |                tmpfile=$TMPFILE.$hexcode | ||||||
|                $OPENSSL s_client -cipher $pfs_cipher $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI &>$tmpfile </dev/null |                $OPENSSL s_client -cipher $pfs_cipher $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI &>$tmpfile </dev/null | ||||||
|                sclient_connect_successful $? $tmpfile |                sclient_connect_successful $? $tmpfile | ||||||
|                sclient_success=$? |                sclient_success=$? | ||||||
|                if [[ $sclient_success -ne 0 ]] && [[ "$SHOW_EACH_C" -eq 0 ]]; then |                if [[ $sclient_success -ne 0 ]] && [[ "$SHOW_EACH_C" -eq 0 ]]; then | ||||||
| @@ -2418,7 +2419,7 @@ run_spdy() { | |||||||
|           outln "\n" |           outln "\n" | ||||||
|           return 0 |           return 0 | ||||||
|      fi |      fi | ||||||
|      $OPENSSL s_client -host $NODE -port $PORT -nextprotoneg $NPN_PROTOs </dev/null 2>$ERRFILE >$TMPFILE |      $OPENSSL s_client -host $NODE -port $PORT $BUGS -nextprotoneg $NPN_PROTOs </dev/null 2>$ERRFILE >$TMPFILE | ||||||
|      tmpstr=$(grep -a '^Protocols' $TMPFILE | sed 's/Protocols.*: //') |      tmpstr=$(grep -a '^Protocols' $TMPFILE | sed 's/Protocols.*: //') | ||||||
|      if [[ -z "$tmpstr" ]] || [[ "$tmpstr" == " " ]]; then |      if [[ -z "$tmpstr" ]] || [[ "$tmpstr" == " " ]]; then | ||||||
|           outln "not offered" |           outln "not offered" | ||||||
| @@ -3048,7 +3049,7 @@ run_heartbleed(){ | |||||||
|      fi |      fi | ||||||
|  |  | ||||||
|      # determine TLS versions offered <-- needs to come from another place |      # determine TLS versions offered <-- needs to come from another place | ||||||
|      $OPENSSL s_client $STARTTLS -connect $NODEIP:$PORT $PROXY -tlsextdebug >$TMPFILE 2>$ERRFILE </dev/null |      $OPENSSL s_client $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY -tlsextdebug >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|  |  | ||||||
|      if $HAS_SED_E; then |      if $HAS_SED_E; then | ||||||
|           tls_proto_offered=$(grep -aw Protocol $TMPFILE | sed -E 's/[^[:digit:]]//g') |           tls_proto_offered=$(grep -aw Protocol $TMPFILE | sed -E 's/[^[:digit:]]//g') | ||||||
| @@ -3164,7 +3165,7 @@ run_ccs_injection(){ | |||||||
|      pr_bold " CCS"; out " (CVE-2014-0224)                       " |      pr_bold " CCS"; out " (CVE-2014-0224)                       " | ||||||
|  |  | ||||||
|      # determine TLS versions offered <-- needs to come from another place |      # determine TLS versions offered <-- needs to come from another place | ||||||
|      $OPENSSL s_client $STARTTLS -connect $NODEIP:$PORT $PROXY >$TMPFILE 2>$ERRFILE </dev/null |      $OPENSSL s_client $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|  |  | ||||||
|      if $HAS_SED_E; then |      if $HAS_SED_E; then | ||||||
|           tls_proto_offered=$(grep -aw Protocol $TMPFILE | sed -E 's/[^[:digit:]]//g') |           tls_proto_offered=$(grep -aw Protocol $TMPFILE | sed -E 's/[^[:digit:]]//g') | ||||||
| @@ -3283,7 +3284,7 @@ run_renego() { | |||||||
|  |  | ||||||
|      pr_bold " Secure Renegotiation "; out "(CVE-2009-3555)      "    # and RFC5746, OSVDB 59968-59974 |      pr_bold " Secure Renegotiation "; out "(CVE-2009-3555)      "    # and RFC5746, OSVDB 59968-59974 | ||||||
|                                                                       # community.qualys.com/blogs/securitylabs/2009/11/05/ssl-and-tls-authentication-gap-vulnerability-discovered |                                                                       # community.qualys.com/blogs/securitylabs/2009/11/05/ssl-and-tls-authentication-gap-vulnerability-discovered | ||||||
|      $OPENSSL s_client $OPTIMAL_PROTO $STARTTLS -connect $NODEIP:$PORT $SNI $PROXY 2>&1 </dev/null >$TMPFILE 2>$ERRFILE |      $OPENSSL s_client $OPTIMAL_PROTO $STARTTLS $BUGS -connect $NODEIP:$PORT $SNI $PROXY 2>&1 </dev/null >$TMPFILE 2>$ERRFILE | ||||||
|      if sclient_connect_successful $? $TMPFILE; then |      if sclient_connect_successful $? $TMPFILE; then | ||||||
|           grep -iaq "$insecure_renogo_str" $TMPFILE |           grep -iaq "$insecure_renogo_str" $TMPFILE | ||||||
|           sec_renego=$?                                                    # 0= Secure Renegotiation IS NOT supported |           sec_renego=$?                                                    # 0= Secure Renegotiation IS NOT supported | ||||||
| @@ -3317,14 +3318,14 @@ run_renego() { | |||||||
|      else |      else | ||||||
|           # We need up to two tries here, as some LiteSpeed servers don't answer on "R" and block. Thus first try in the background |           # We need up to two tries here, as some LiteSpeed servers don't answer on "R" and block. Thus first try in the background | ||||||
|           # msg enables us to look deeper into it while debugging |           # msg enables us to look deeper into it while debugging | ||||||
|           echo R | $OPENSSL s_client $OPTIMAL_PROTO $legacycmd $STARTTLS -msg -connect $NODEIP:$PORT $SNI $PROXY >$TMPFILE 2>>$ERRFILE &      |           echo R | $OPENSSL s_client $OPTIMAL_PROTO $BUGS $legacycmd $STARTTLS -msg -connect $NODEIP:$PORT $SNI $PROXY >$TMPFILE 2>>$ERRFILE &      | ||||||
|           wait_kill $! $HEADER_MAXSLEEP |           wait_kill $! $HEADER_MAXSLEEP | ||||||
|           if [[ $? -eq 3 ]]; then |           if [[ $? -eq 3 ]]; then | ||||||
|                pr_litegreen "likely not vulnerable (OK)"; outln " (timed out)"       # it hung |                pr_litegreen "likely not vulnerable (OK)"; outln " (timed out)"       # it hung | ||||||
|                sec_client_renego=1 |                sec_client_renego=1 | ||||||
|           else |           else | ||||||
|                # second try in the foreground as we are sure now it won't hang |                # second try in the foreground as we are sure now it won't hang | ||||||
|                echo R | $OPENSSL s_client $legacycmd $STARTTLS -msg -connect $NODEIP:$PORT $SNI $PROXY >$TMPFILE 2>>$ERRFILE |                echo R | $OPENSSL s_client $legacycmd $STARTTLS $BUGS -msg -connect $NODEIP:$PORT $SNI $PROXY >$TMPFILE 2>>$ERRFILE | ||||||
|                sec_client_renego=$?                                                  # 0=client is renegotiating & doesn't return an error --> vuln! |                sec_client_renego=$?                                                  # 0=client is renegotiating & doesn't return an error --> vuln! | ||||||
|                case $sec_client_renego in |                case $sec_client_renego in | ||||||
|                     0) pr_litered "VULNERABLE (NOT ok)"; outln ", DoS threat" ;; |                     0) pr_litered "VULNERABLE (NOT ok)"; outln ", DoS threat" ;; | ||||||
| @@ -3361,7 +3362,7 @@ run_crime() { | |||||||
|      fi |      fi | ||||||
|  |  | ||||||
|      [[ "$OSSL_VER" == "*0.9.8*" ]] && addcmd="-no_ssl2"  |      [[ "$OSSL_VER" == "*0.9.8*" ]] && addcmd="-no_ssl2"  | ||||||
|      $OPENSSL s_client $OPTIMAL_PROTO $addcmd $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI </dev/null &>$TMPFILE |      $OPENSSL s_client $OPTIMAL_PROTO $BUGS $addcmd $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI </dev/null &>$TMPFILE | ||||||
|      if grep -a Compression $TMPFILE | grep -aq NONE >/dev/null; then |      if grep -a Compression $TMPFILE | grep -aq NONE >/dev/null; then | ||||||
|           pr_litegreen "not vulnerable (OK)" |           pr_litegreen "not vulnerable (OK)" | ||||||
|           if [[ $SERVICE != "HTTP" ]] && ! $CLIENT_AUTH;  then  |           if [[ $SERVICE != "HTTP" ]] && ! $CLIENT_AUTH;  then  | ||||||
| @@ -3444,7 +3445,7 @@ run_breach() { | |||||||
|      useragent="$UA_STD" |      useragent="$UA_STD" | ||||||
|      $SNEAKY && useragent="$UA_SNEAKY" |      $SNEAKY && useragent="$UA_SNEAKY" | ||||||
|  |  | ||||||
|      printf "GET $url HTTP/1.1\r\nHost: $NODE\r\nUser-Agent: $useragent\r\nReferer: $referer\r\nConnection: Close\r\nAccept-encoding: gzip,deflate,compress\r\nAccept: text/*\r\n\r\n" | $OPENSSL s_client $OPTIMAL_PROTO -quiet -ign_eof -connect $NODEIP:$PORT $PROXY $SNI 1>$TMPFILE 2>$ERRFILE & |      printf "GET $url HTTP/1.1\r\nHost: $NODE\r\nUser-Agent: $useragent\r\nReferer: $referer\r\nConnection: Close\r\nAccept-encoding: gzip,deflate,compress\r\nAccept: text/*\r\n\r\n" | $OPENSSL s_client $OPTIMAL_PROTO $BUGS -quiet -ign_eof -connect $NODEIP:$PORT $PROXY $SNI 1>$TMPFILE 2>$ERRFILE & | ||||||
|      wait_kill $! $HEADER_MAXSLEEP |      wait_kill $! $HEADER_MAXSLEEP | ||||||
|      was_killed=$?                           # !=0 was killed |      was_killed=$?                           # !=0 was killed | ||||||
|      result=$(awk '/^Content-Encoding/ { print $2 }' $TMPFILE) |      result=$(awk '/^Content-Encoding/ { print $2 }' $TMPFILE) | ||||||
| @@ -3484,7 +3485,7 @@ run_ssl_poodle() { | |||||||
|      cbc_ciphers=$($OPENSSL ciphers -v 'ALL:eNULL' 2>$ERRFILE | awk '/CBC/ { print $1 }' | tr '\n' ':') |      cbc_ciphers=$($OPENSSL ciphers -v 'ALL:eNULL' 2>$ERRFILE | awk '/CBC/ { print $1 }' | tr '\n' ':') | ||||||
|  |  | ||||||
|      debugme echo $cbc_ciphers |      debugme echo $cbc_ciphers | ||||||
|      $OPENSSL s_client -ssl3 $STARTTLS -cipher $cbc_ciphers -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null |      $OPENSSL s_client -ssl3 $STARTTLS $BUGS -cipher $cbc_ciphers -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|      sclient_connect_successful $? $TMPFILE |      sclient_connect_successful $? $TMPFILE | ||||||
|      sclient_success=$? |      sclient_success=$? | ||||||
|      [[ $DEBUG -eq 2 ]] && egrep -q "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" |      [[ $DEBUG -eq 2 ]] && egrep -q "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" | ||||||
| @@ -3525,13 +3526,13 @@ run_tls_fallback_scsv() { | |||||||
|      # d) minor: we should do "-state" here |      # d) minor: we should do "-state" here | ||||||
|  |  | ||||||
|      # first: make sure we have tls1_2: |      # first: make sure we have tls1_2: | ||||||
|      $OPENSSL s_client $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI -no_tls1_2 >$TMPFILE 2>$ERRFILE </dev/null |      $OPENSSL s_client $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI -no_tls1_2 >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|      if ! sclient_connect_successful $? $TMPFILE; then |      if ! sclient_connect_successful $? $TMPFILE; then | ||||||
|           pr_litegreen "No fallback possible, TLS 1.2 is the only protocol (OK)" |           pr_litegreen "No fallback possible, TLS 1.2 is the only protocol (OK)" | ||||||
|           ret=7 |           ret=7 | ||||||
|      else |      else | ||||||
|           # ...and do the test (we need to parse the error here!) |           # ...and do the test (we need to parse the error here!) | ||||||
|           $OPENSSL s_client $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI -no_tls1_2 -fallback_scsv &>$TMPFILE </dev/null |           $OPENSSL s_client $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI -no_tls1_2 -fallback_scsv &>$TMPFILE </dev/null | ||||||
|           if grep -q "CONNECTED(00" "$TMPFILE"; then |           if grep -q "CONNECTED(00" "$TMPFILE"; then | ||||||
|                if grep -qa "BEGIN CERTIFICATE" "$TMPFILE"; then |                if grep -qa "BEGIN CERTIFICATE" "$TMPFILE"; then | ||||||
|                     pr_brown "Downgrade attack prevention NOT supported" |                     pr_brown "Downgrade attack prevention NOT supported" | ||||||
| @@ -3586,7 +3587,7 @@ run_freak() { | |||||||
|           4|5|6|7) |           4|5|6|7) | ||||||
|                addtl_warning=" (tested with $nr_supported_ciphers/9 ciphers)" ;; |                addtl_warning=" (tested with $nr_supported_ciphers/9 ciphers)" ;; | ||||||
|      esac |      esac | ||||||
|      $OPENSSL s_client $STARTTLS -cipher $exportrsa_cipher_list -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null |      $OPENSSL s_client $STARTTLS $BUGS -cipher $exportrsa_cipher_list -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|      sclient_connect_successful $? $TMPFILE |      sclient_connect_successful $? $TMPFILE | ||||||
|      sclient_success=$? |      sclient_success=$? | ||||||
|      [[ $DEBUG -eq 2 ]] && egrep -a "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" |      [[ $DEBUG -eq 2 ]] && egrep -a "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" | ||||||
| @@ -3624,7 +3625,7 @@ run_logjam() { | |||||||
|           3) addtl_warning=" (tested w/ $nr_supported_ciphers/4 ciphers)" ;; |           3) addtl_warning=" (tested w/ $nr_supported_ciphers/4 ciphers)" ;; | ||||||
|           4)   ;; |           4)   ;; | ||||||
|      esac |      esac | ||||||
|      $OPENSSL s_client $STARTTLS -cipher $exportdhe_cipher_list -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null |      $OPENSSL s_client $STARTTLS $BUGS -cipher $exportdhe_cipher_list -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|      sclient_connect_successful $? $TMPFILE |      sclient_connect_successful $? $TMPFILE | ||||||
|      sclient_success=$? |      sclient_success=$? | ||||||
|      [[ $DEBUG -eq 2 ]] && egrep -a "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" |      [[ $DEBUG -eq 2 ]] && egrep -a "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" | ||||||
| @@ -3681,14 +3682,14 @@ run_beast(){ | |||||||
|  |  | ||||||
|      # first determine whether it's mitogated by higher protocols |      # first determine whether it's mitogated by higher protocols | ||||||
|      for proto in tls1_1 tls1_2; do |      for proto in tls1_1 tls1_2; do | ||||||
|           $OPENSSL s_client -state -"$proto" $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI 2>>$ERRFILE >$TMPFILE </dev/null |           $OPENSSL s_client -state -"$proto" $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI 2>>$ERRFILE >$TMPFILE </dev/null | ||||||
|           if sclient_connect_successful $? $TMPFILE; then |           if sclient_connect_successful $? $TMPFILE; then | ||||||
|                higher_proto_supported="$higher_proto_supported ""$(grep -aw "Protocol" $TMPFILE | sed -e 's/^.*Protocol .*://' -e 's/ //g')" |                higher_proto_supported="$higher_proto_supported ""$(grep -aw "Protocol" $TMPFILE | sed -e 's/^.*Protocol .*://' -e 's/ //g')" | ||||||
|           fi |           fi | ||||||
|      done |      done | ||||||
|  |  | ||||||
|      for proto in ssl3 tls1; do |      for proto in ssl3 tls1; do | ||||||
|           $OPENSSL s_client -"$proto" $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>>$ERRFILE </dev/null |           $OPENSSL s_client -"$proto" $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>>$ERRFILE </dev/null | ||||||
|           if ! sclient_connect_successful $? $TMPFILE; then # protocol supported? |           if ! sclient_connect_successful $? $TMPFILE; then # protocol supported? | ||||||
|                if $continued; then                          # second round: we hit TLS1: |                if $continued; then                          # second round: we hit TLS1: | ||||||
|                     pr_litegreenln "no SSL3 or TLS1" |                     pr_litegreenln "no SSL3 or TLS1" | ||||||
| @@ -3700,7 +3701,7 @@ run_beast(){ | |||||||
|           fi # protocol succeeded |           fi # protocol succeeded | ||||||
|  |  | ||||||
|           # now we test in one shot with the precompiled ciphers |           # now we test in one shot with the precompiled ciphers | ||||||
|           $OPENSSL s_client -"$proto" -cipher "$cbc_cipher_list" $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>>$ERRFILE </dev/null |           $OPENSSL s_client -"$proto" -cipher "$cbc_cipher_list" $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>>$ERRFILE </dev/null | ||||||
|           sclient_connect_successful $? $TMPFILE || continue |           sclient_connect_successful $? $TMPFILE || continue | ||||||
|  |  | ||||||
|           if $WIDE; then |           if $WIDE; then | ||||||
| @@ -3710,7 +3711,7 @@ run_beast(){ | |||||||
|           for ciph in $(colon_to_spaces "$cbc_cipher_list"); do |           for ciph in $(colon_to_spaces "$cbc_cipher_list"); do | ||||||
|                read hexcode dash cbc_cipher sslvers kx auth enc mac < <($OPENSSL ciphers -V "$ciph" 2>>$ERRFILE)        # -V doesn't work with openssl < 1.0 |                read hexcode dash cbc_cipher sslvers kx auth enc mac < <($OPENSSL ciphers -V "$ciph" 2>>$ERRFILE)        # -V doesn't work with openssl < 1.0 | ||||||
|                #                                                    ^^^^^ process substitution as shopt will either segfault or doesn't work with old bash versions |                #                                                    ^^^^^ process substitution as shopt will either segfault or doesn't work with old bash versions | ||||||
|                $OPENSSL s_client -cipher "$cbc_cipher" -"$proto" $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>>$ERRFILE </dev/null |                $OPENSSL s_client -cipher "$cbc_cipher" -"$proto" $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>>$ERRFILE </dev/null | ||||||
|                sclient_connect_successful $? $TMPFILE |                sclient_connect_successful $? $TMPFILE | ||||||
|                sclient_success=$? |                sclient_success=$? | ||||||
|                [[ $sclient_success -eq 0 ]] && vuln_beast=true |                [[ $sclient_success -eq 0 ]] && vuln_beast=true | ||||||
| @@ -3808,14 +3809,14 @@ run_rc4() { | |||||||
|      fi |      fi | ||||||
|      pr_bold " RC4"; out " (CVE-2013-2566, CVE-2015-2808)        " |      pr_bold " RC4"; out " (CVE-2013-2566, CVE-2015-2808)        " | ||||||
|  |  | ||||||
|      $OPENSSL s_client -cipher $rc4_ciphers_list $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null |      $OPENSSL s_client -cipher $rc4_ciphers_list $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI >$TMPFILE 2>$ERRFILE </dev/null | ||||||
|      if sclient_connect_successful $? $TMPFILE; then |      if sclient_connect_successful $? $TMPFILE; then | ||||||
|           pr_litered "VULNERABLE (NOT ok): " |           pr_litered "VULNERABLE (NOT ok): " | ||||||
|           $WIDE && outln "\n" |           $WIDE && outln "\n" | ||||||
|           rc4_offered=1 |           rc4_offered=1 | ||||||
|           $WIDE && neat_header |           $WIDE && neat_header | ||||||
|           while read hexcode dash rc4_cipher sslvers kx auth enc mac; do |           while read hexcode dash rc4_cipher sslvers kx auth enc mac; do | ||||||
|                $OPENSSL s_client -cipher $rc4_cipher $STARTTLS -connect $NODEIP:$PORT $PROXY $SNI </dev/null >$TMPFILE 2>$ERRFILE |                $OPENSSL s_client -cipher $rc4_cipher $STARTTLS $BUGS -connect $NODEIP:$PORT $PROXY $SNI </dev/null >$TMPFILE 2>$ERRFILE | ||||||
|                sclient_connect_successful $? $TMPFILE |                sclient_connect_successful $? $TMPFILE | ||||||
|                sclient_success=$?            # here we may have a fp with openssl < 1.0, TBC |                sclient_success=$?            # here we may have a fp with openssl < 1.0, TBC | ||||||
|                if [[ $sclient_success -ne 0 ]] && [[ "$SHOW_EACH_C" -eq 0 ]]; then |                if [[ $sclient_success -ne 0 ]] && [[ "$SHOW_EACH_C" -eq 0 ]]; then | ||||||
| @@ -4078,10 +4079,11 @@ tuning options: | |||||||
|      --openssl <PATH>              use this openssl binary (default: look in \$PATH, \$RUN_DIR of $PROG_NAME |      --openssl <PATH>              use this openssl binary (default: look in \$PATH, \$RUN_DIR of $PROG_NAME | ||||||
|      --proxy <host>:<port>         connect via the specified HTTP proxy |      --proxy <host>:<port>         connect via the specified HTTP proxy | ||||||
|      -6                            use also IPv6 checks, works only with supporting OpenSSL version and IPv6 connectivity |      -6                            use also IPv6 checks, works only with supporting OpenSSL version and IPv6 connectivity | ||||||
|      --sneaky                      be less verbose wrt referer headers |      --sneaky                      leave less traces in target logs: user agent, referer | ||||||
|      --quiet                       don't output the banner. By doing this you acknowledge usage terms normally appearing in the banner |      --quiet                       don't output the banner. By doing this you acknowledge usage terms normally appearing in the banner | ||||||
|      --wide                        wide output for tests like RC4, BEAST. PFS also with hexcode, kx, strength, RFC name |      --wide                        wide output for tests like RC4, BEAST. PFS also with hexcode, kx, strength, RFC name | ||||||
|      --show-each                   for wide outputs: display all ciphers tested -- not only succeeded ones |      --show-each                   for wide outputs: display all ciphers tested -- not only succeeded ones | ||||||
|  |      --bugs                        enables the "-bugs" option of s_client, needed e.g. for some buggy F5s | ||||||
|      --warnings <batch|off|false>  "batch" doesn't wait for keypress, "off" or "false" skips connection warning |      --warnings <batch|off|false>  "batch" doesn't wait for keypress, "off" or "false" skips connection warning | ||||||
|      --color <0|1|2>               0: no escape or other codes,  1: b/w escape codes,  2: color (default) |      --color <0|1|2>               0: no escape or other codes,  1: b/w escape codes,  2: color (default) | ||||||
|      --debug <0-6>                 1: screen output normal but debug output in temp files.  2-6: see line ~105 |      --debug <0-6>                 1: screen output normal but debug output in temp files.  2-6: see line ~105 | ||||||
| @@ -4606,7 +4608,7 @@ determine_optimal_proto() { | |||||||
|           # starttls workaround needed see https://github.com/drwetter/testssl.sh/issues/188 |           # starttls workaround needed see https://github.com/drwetter/testssl.sh/issues/188 | ||||||
|           # kind of odd |           # kind of odd | ||||||
|           for STARTTLS_OPTIMAL_PROTO in -tls1_2 -tls1 -ssl3 -tls1_1 -ssl2; do |           for STARTTLS_OPTIMAL_PROTO in -tls1_2 -tls1 -ssl3 -tls1_1 -ssl2; do | ||||||
|                $OPENSSL s_client $STARTTLS_OPTIMAL_PROTO -connect "$NODEIP:$PORT" $PROXY -msg -starttls $1 </dev/null >$TMPFILE 2>>$ERRFILE |                $OPENSSL s_client $STARTTLS_OPTIMAL_PROTO $BUGS -connect "$NODEIP:$PORT" $PROXY -msg -starttls $1 </dev/null >$TMPFILE 2>>$ERRFILE | ||||||
|                if sclient_auth $? $TMPFILE; then |                if sclient_auth $? $TMPFILE; then | ||||||
|                     all_failed=1 |                     all_failed=1 | ||||||
|                     break |                     break | ||||||
| @@ -4616,7 +4618,7 @@ determine_optimal_proto() { | |||||||
|           debugme echo "STARTTLS_OPTIMAL_PROTO: $STARTTLS_OPTIMAL_PROTO" |           debugme echo "STARTTLS_OPTIMAL_PROTO: $STARTTLS_OPTIMAL_PROTO" | ||||||
|      else |      else | ||||||
|           for OPTIMAL_PROTO in '' -tls1_2 -tls1 -ssl3 -tls1_1 -ssl2 ''; do |           for OPTIMAL_PROTO in '' -tls1_2 -tls1 -ssl3 -tls1_1 -ssl2 ''; do | ||||||
|                $OPENSSL s_client $OPTIMAL_PROTO -connect "$NODEIP:$PORT" -msg $PROXY $SNI </dev/null >$TMPFILE 2>>$ERRFILE |                $OPENSSL s_client $OPTIMAL_PROTO $BUGS -connect "$NODEIP:$PORT" -msg $PROXY $SNI </dev/null >$TMPFILE 2>>$ERRFILE | ||||||
|                if sclient_auth $? $TMPFILE; then |                if sclient_auth $? $TMPFILE; then | ||||||
|                     all_failed=1 |                     all_failed=1 | ||||||
|                     break |                     break | ||||||
| @@ -4688,7 +4690,7 @@ determine_service() { | |||||||
|                               # see http://xmpp.org/rfcs/rfc3920.html |                               # see http://xmpp.org/rfcs/rfc3920.html | ||||||
|                          fi |                          fi | ||||||
|                     fi |                     fi | ||||||
|                     $OPENSSL s_client -connect $NODEIP:$PORT $PROXY $STARTTLS 2>$ERRFILE >$TMPFILE </dev/null |                     $OPENSSL s_client -connect $NODEIP:$PORT $PROXY $BUGS $STARTTLS 2>$ERRFILE >$TMPFILE </dev/null | ||||||
|                     if [[ $? -ne 0 ]]; then |                     if [[ $? -ne 0 ]]; then | ||||||
|                          debugme cat $TMPFILE |                          debugme cat $TMPFILE | ||||||
|                          outln |                          outln | ||||||
| @@ -5103,6 +5105,9 @@ parse_cmd_line() { | |||||||
|                --show[-_]each) |                --show[-_]each) | ||||||
|                     SHOW_EACH_C=1            #FIXME: sense is vice versa |                     SHOW_EACH_C=1            #FIXME: sense is vice versa | ||||||
|                     ;;  |                     ;;  | ||||||
|  |                --bugs) | ||||||
|  |                     BUGS="-bugs" | ||||||
|  |                     ;;  | ||||||
|                --debug|--debug=*) |                --debug|--debug=*) | ||||||
|                     DEBUG=$(parse_opt_equal_sign "$1" "$2") |                     DEBUG=$(parse_opt_equal_sign "$1" "$2") | ||||||
|                     [[ $? -eq 0 ]] && shift |                     [[ $? -eq 0 ]] && shift | ||||||
| @@ -5309,4 +5314,4 @@ fi | |||||||
| exit $? | exit $? | ||||||
|  |  | ||||||
|  |  | ||||||
| #  $Id: testssl.sh,v 1.417 2015/11/03 18:51:44 dirkw Exp $ | #  $Id: testssl.sh,v 1.418 2015/11/03 22:29:52 dirkw Exp $ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Dirk Wetter
					Dirk Wetter