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 | ||||
| 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 | ||||
| BUGS=${BUGS:-""}                        # -bugs option from openssl, needed for some BIG IP F5 | ||||
| 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 | ||||
|                                         # 3: slight hexdumps + other info,  | ||||
| @@ -535,7 +536,7 @@ runs_HTTP() { | ||||
|  | ||||
|      if ! $CLIENT_AUTH; then | ||||
|           # 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 | ||||
|           was_killed=$? | ||||
|           head $TMPFILE | grep -aq ^HTTP && SERVICE=HTTP | ||||
| @@ -588,12 +589,12 @@ run_http_header() { | ||||
|      outln | ||||
|  | ||||
|      [[ -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 | ||||
|      if [[ $? -eq 0 ]]; then | ||||
|           # 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! | ||||
|           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") | ||||
|           HTTP_TIME=$(awk -F': ' '/^date:/ { print $2 }  /^Date:/ { print $2 }' $HEADERFILE) | ||||
|           HAD_SLEPT=0 | ||||
| @@ -1141,7 +1142,7 @@ std_cipherlists() { | ||||
|  | ||||
|      pr_bold "$2    "         # indent in order to be in the same row as server preferences | ||||
|      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_success=$? | ||||
|           debugme cat $ERRFILE | ||||
| @@ -1280,7 +1281,7 @@ test_just_one(){ | ||||
|                     neat_list $HEXC $ciph $kx $enc | grep -qwai "$arg" | ||||
|                fi | ||||
|                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_success=$? | ||||
|                     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 | ||||
|      # 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_success=$? | ||||
|           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 | ||||
|           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 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_success=$? | ||||
|                if [[ $sclient_success -ne 0 ]] && [[ "$SHOW_EACH_C" -eq 0 ]]; then | ||||
| @@ -1415,7 +1416,7 @@ run_prototest_openssl() { | ||||
|      local sni="$SNI" | ||||
|      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 | ||||
|      ret=$? | ||||
|      [[ $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: | ||||
|           [[ "$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) | ||||
|           $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 | ||||
|           ret=$?  | ||||
|           [[ $DEBUG -eq 2 ]] && egrep "error|failure" $ERRFILE | egrep -av "unable to get local|verify error" | ||||
| @@ -1638,7 +1639,7 @@ run_server_preference() { | ||||
|      outln | ||||
|  | ||||
|      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 | ||||
|           pr_litemagenta "no matching cipher in this list found (pls report this): " | ||||
|           outln "$list_fwd  . " | ||||
| @@ -1649,7 +1650,7 @@ run_server_preference() { | ||||
|           # workaround is to connect with a protocol | ||||
|           debugme out "(workaround #188) " | ||||
|           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 | ||||
|                pr_litemagenta "no matching cipher in this list found (pls report this): " | ||||
|                outln "$list_fwd  . " | ||||
| @@ -1660,7 +1661,7 @@ run_server_preference() { | ||||
|  | ||||
|      if $has_cipher_order; then | ||||
|           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 | ||||
|           cipher2=$(grep -wa Cipher $TMPFILE | egrep -avw "New|is" | sed -e 's/^ \+Cipher \+://' -e 's/ //g') | ||||
|  | ||||
| @@ -1675,10 +1676,10 @@ run_server_preference() { | ||||
|           outln | ||||
|  | ||||
|           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 | ||||
|                # 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!" | ||||
|           fi | ||||
|           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 | ||||
|                #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 | ||||
|                          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') | ||||
| @@ -1729,7 +1730,7 @@ run_server_preference() { | ||||
|                [[ -n "$PROXY" ]] && arg="   SPDY/NPN is" | ||||
|                [[ -n "$STARTTLS" ]] && arg="    " | ||||
|                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 | ||||
|                          proto[i]=$(grep -aw "Next protocol" $TMPFILE | sed -e 's/^Next protocol://' -e 's/(.)//' -e 's/ //g') | ||||
|                          if [[ -z "${proto[i]}" ]]; then | ||||
| @@ -1778,7 +1779,7 @@ cipher_pref_check() { | ||||
|      pr_bold " Cipher order" | ||||
|  | ||||
|      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 | ||||
|                tested_cipher="" | ||||
|                proto=$(grep -aw "Protocol" $TMPFILE | sed -e 's/^.*Protocol.*://' -e 's/ //g') | ||||
| @@ -1788,7 +1789,7 @@ cipher_pref_check() { | ||||
|                printf "     %-10s %s " "$proto:" "$cipher" | ||||
|                tested_cipher="-"$cipher | ||||
|                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 | ||||
|                     cipher=$(grep -aw "Cipher" $TMPFILE | egrep -avw "New|is" | sed -e 's/^.*Cipher.*://' -e 's/ //g') | ||||
|                     out "$cipher " | ||||
| @@ -1801,14 +1802,14 @@ cipher_pref_check() { | ||||
|      if ! spdy_pre "     SPDY/NPN: "; then       # is NPN/SPDY supported and is this no STARTTLS? | ||||
|           outln | ||||
|      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 | ||||
|                $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') | ||||
|                printf "     %-10s %s " "$p:" "$cipher" | ||||
|                tested_cipher="-"$cipher | ||||
|                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 | ||||
|                     cipher=$(grep -aw "Cipher" $TMPFILE | egrep -avw "New|is" | sed -e 's/^.*Cipher.*://' -e 's/ //g') | ||||
|                     out "$cipher " | ||||
| @@ -1828,7 +1829,7 @@ cipher_pref_check() { | ||||
| get_host_cert() { | ||||
|      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 | ||||
|           awk '/-----BEGIN/,/-----END/ { print $0 }' $tmpvar >$HOSTCERT | ||||
|      else | ||||
| @@ -1841,7 +1842,7 @@ get_all_certs() { | ||||
|      local savedir | ||||
|      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 || \ | ||||
|           pr_litemagenta "problem getting all certs" | ||||
|      savedir=$(pwd); cd $TEMPDIR | ||||
| @@ -1898,7 +1899,7 @@ determine_trust() { | ||||
|                return 7 | ||||
|           fi | ||||
| 		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) | ||||
| 		if egrep -wq "ok|0" <<< ${verify_retcode[i]}; then | ||||
| 			trust[i]=true | ||||
| @@ -2000,12 +2001,12 @@ determine_tls_extensions() { | ||||
|      success=7 | ||||
|      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 | ||||
|           $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 | ||||
|      done                          # this loop is needed for IIS/6 | ||||
|      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: | ||||
|           $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 | ||||
|                pr_litemagentaln "Strange, no SSL/TLS protocol seems to be supported (error around line $((LINENO - 6)))" | ||||
|                tmpfile_handle $FUNCNAME.txt | ||||
| @@ -2127,7 +2128,7 @@ run_server_defaults() { | ||||
|           out "$cn" | ||||
|      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="" | ||||
|      if [[ -s $HOSTCERT.nosni ]]; then | ||||
|           if $OPENSSL x509 -in $HOSTCERT.nosni -noout -subject 2>>$ERRFILE | grep -wq CN; then | ||||
| @@ -2325,7 +2326,7 @@ run_pfs() { | ||||
|           return 1 | ||||
|      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_success=$? | ||||
|      outln | ||||
| @@ -2342,7 +2343,7 @@ run_pfs() { | ||||
|           fi | ||||
|           while read hexcode dash pfs_cipher sslvers kx auth enc mac; do | ||||
|                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_success=$? | ||||
|                if [[ $sclient_success -ne 0 ]] && [[ "$SHOW_EACH_C" -eq 0 ]]; then | ||||
| @@ -2418,7 +2419,7 @@ run_spdy() { | ||||
|           outln "\n" | ||||
|           return 0 | ||||
|      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.*: //') | ||||
|      if [[ -z "$tmpstr" ]] || [[ "$tmpstr" == " " ]]; then | ||||
|           outln "not offered" | ||||
| @@ -3048,7 +3049,7 @@ run_heartbleed(){ | ||||
|      fi | ||||
|  | ||||
|      # 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 | ||||
|           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)                       " | ||||
|  | ||||
|      # 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 | ||||
|           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 | ||||
|                                                                       # 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 | ||||
|           grep -iaq "$insecure_renogo_str" $TMPFILE | ||||
|           sec_renego=$?                                                    # 0= Secure Renegotiation IS NOT supported | ||||
| @@ -3317,14 +3318,14 @@ run_renego() { | ||||
|      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 | ||||
|           # 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 | ||||
|           if [[ $? -eq 3 ]]; then | ||||
|                pr_litegreen "likely not vulnerable (OK)"; outln " (timed out)"       # it hung | ||||
|                sec_client_renego=1 | ||||
|           else | ||||
|                # 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! | ||||
|                case $sec_client_renego in | ||||
|                     0) pr_litered "VULNERABLE (NOT ok)"; outln ", DoS threat" ;; | ||||
| @@ -3361,7 +3362,7 @@ run_crime() { | ||||
|      fi | ||||
|  | ||||
|      [[ "$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 | ||||
|           pr_litegreen "not vulnerable (OK)" | ||||
|           if [[ $SERVICE != "HTTP" ]] && ! $CLIENT_AUTH;  then  | ||||
| @@ -3444,7 +3445,7 @@ run_breach() { | ||||
|      useragent="$UA_STD" | ||||
|      $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 | ||||
|      was_killed=$?                           # !=0 was killed | ||||
|      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' ':') | ||||
|  | ||||
|      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_success=$? | ||||
|      [[ $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 | ||||
|  | ||||
|      # 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 | ||||
|           pr_litegreen "No fallback possible, TLS 1.2 is the only protocol (OK)" | ||||
|           ret=7 | ||||
|      else | ||||
|           # ...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 -qa "BEGIN CERTIFICATE" "$TMPFILE"; then | ||||
|                     pr_brown "Downgrade attack prevention NOT supported" | ||||
| @@ -3586,7 +3587,7 @@ run_freak() { | ||||
|           4|5|6|7) | ||||
|                addtl_warning=" (tested with $nr_supported_ciphers/9 ciphers)" ;; | ||||
|      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_success=$? | ||||
|      [[ $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)" ;; | ||||
|           4)   ;; | ||||
|      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_success=$? | ||||
|      [[ $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 | ||||
|      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 | ||||
|                higher_proto_supported="$higher_proto_supported ""$(grep -aw "Protocol" $TMPFILE | sed -e 's/^.*Protocol .*://' -e 's/ //g')" | ||||
|           fi | ||||
|      done | ||||
|  | ||||
|      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 $continued; then                          # second round: we hit TLS1: | ||||
|                     pr_litegreenln "no SSL3 or TLS1" | ||||
| @@ -3700,7 +3701,7 @@ run_beast(){ | ||||
|           fi # protocol succeeded | ||||
|  | ||||
|           # 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 | ||||
|  | ||||
|           if $WIDE; then | ||||
| @@ -3710,7 +3711,7 @@ run_beast(){ | ||||
|           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 | ||||
|                #                                                    ^^^^^ 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_success=$? | ||||
|                [[ $sclient_success -eq 0 ]] && vuln_beast=true | ||||
| @@ -3808,14 +3809,14 @@ run_rc4() { | ||||
|      fi | ||||
|      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 | ||||
|           pr_litered "VULNERABLE (NOT ok): " | ||||
|           $WIDE && outln "\n" | ||||
|           rc4_offered=1 | ||||
|           $WIDE && neat_header | ||||
|           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_success=$?            # here we may have a fp with openssl < 1.0, TBC | ||||
|                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 | ||||
|      --proxy <host>:<port>         connect via the specified HTTP proxy | ||||
|      -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 | ||||
|      --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 | ||||
|      --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 | ||||
|      --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 | ||||
| @@ -4606,7 +4608,7 @@ determine_optimal_proto() { | ||||
|           # starttls workaround needed see https://github.com/drwetter/testssl.sh/issues/188 | ||||
|           # kind of odd | ||||
|           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 | ||||
|                     all_failed=1 | ||||
|                     break | ||||
| @@ -4616,7 +4618,7 @@ determine_optimal_proto() { | ||||
|           debugme echo "STARTTLS_OPTIMAL_PROTO: $STARTTLS_OPTIMAL_PROTO" | ||||
|      else | ||||
|           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 | ||||
|                     all_failed=1 | ||||
|                     break | ||||
| @@ -4688,7 +4690,7 @@ determine_service() { | ||||
|                               # see http://xmpp.org/rfcs/rfc3920.html | ||||
|                          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 | ||||
|                          debugme cat $TMPFILE | ||||
|                          outln | ||||
| @@ -5103,6 +5105,9 @@ parse_cmd_line() { | ||||
|                --show[-_]each) | ||||
|                     SHOW_EACH_C=1            #FIXME: sense is vice versa | ||||
|                     ;;  | ||||
|                --bugs) | ||||
|                     BUGS="-bugs" | ||||
|                     ;;  | ||||
|                --debug|--debug=*) | ||||
|                     DEBUG=$(parse_opt_equal_sign "$1" "$2") | ||||
|                     [[ $? -eq 0 ]] && shift | ||||
| @@ -5309,4 +5314,4 @@ fi | ||||
| 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