<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Explore Security &#187; OpenSSL</title>
	<atom:link href="https://www.exploresecurity.com/tag/openssl/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.exploresecurity.com</link>
	<description>IT security tools, techniques and commentary</description>
	<lastBuildDate>Wed, 15 Jun 2022 09:21:02 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6.1</generator>
		<item>
		<title>JWT Attack Walk-Through</title>
		<link>https://www.exploresecurity.com/jwt-attack-walk-through/</link>
		<comments>https://www.exploresecurity.com/jwt-attack-walk-through/#comments</comments>
		<pubDate>Fri, 25 Jan 2019 10:13:31 +0000</pubDate>
		<dc:creator>Jerome</dc:creator>
				<category><![CDATA[Penetration Testing]]></category>
		<category><![CDATA[Web Applications]]></category>
		<category><![CDATA[JWT]]></category>
		<category><![CDATA[OpenSSL]]></category>
		<category><![CDATA[web apps]]></category>

		<guid isPermaLink="false">http://www.exploresecurity.com/?p=455</guid>
		<description><![CDATA[Over on the NCC Group website I published a solution to an open demonstration of the well-known JSON Web Token (JWT) algorithm confusion vulnerability (the one where you swap the token algorithm from &#8216;RS&#8217; to &#8216;HS&#8217; and sign your payload with the public key). I use OpenSSL to gain full visibility of what&#8217;s happening and, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Over on the NCC Group website I <a href="https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/january/jwt-attack-walk-through/">published</a> a solution to an open demonstration of the well-known JSON Web Token (JWT) algorithm confusion vulnerability (the one where you swap the token algorithm from &#8216;RS&#8217; to &#8216;HS&#8217; and sign your payload with the <em>public</em> key). I use OpenSSL to gain full visibility of what&#8217;s happening and, by walking through the method, if you ever need to test this vulnerability yourself, it will hopefully help to avoid false negatives.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.exploresecurity.com/jwt-attack-walk-through/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Thick Spread of Logjam</title>
		<link>https://www.exploresecurity.com/a-thick-spread-of-logjam/</link>
		<comments>https://www.exploresecurity.com/a-thick-spread-of-logjam/#comments</comments>
		<pubDate>Mon, 20 Jul 2015 22:26:59 +0000</pubDate>
		<dc:creator>Jerome</dc:creator>
				<category><![CDATA[Penetration Testing]]></category>
		<category><![CDATA[SSL/TLS]]></category>
		<category><![CDATA[Logjam]]></category>
		<category><![CDATA[OpenSSL]]></category>
		<category><![CDATA[pentesting]]></category>
		<category><![CDATA[TLS]]></category>

		<guid isPermaLink="false">http://www.exploresecurity.com/?p=404</guid>
		<description><![CDATA[This article dissects the recent Logjam paper from a pentesting viewpoint to reveal a number of different factors that affect the impact of the vulnerability. One of those factors includes the use of common primes and I&#8217;ve included a small change to OpenSSL that you can use to look out for this. Two for the [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>This article dissects the recent Logjam paper from a pentesting viewpoint to reveal a number of different factors that affect the impact of the vulnerability. One of those factors includes the use of common primes and I&#8217;ve included a small change to OpenSSL that you can use to look out for this.<span id="more-404"></span></p>
<h3>Two for the price of one</h3>
<p>For me, the penny dropped when I realised that the <a href="https://weakdh.org/imperfect-forward-secrecy.pdf">Logjam paper</a> sets out <em>two</em> strategies. The first is a <em>cryptanalytic</em> attack that uses pre-computation to speed up the process of cracking a Diffie-Hellman (DH) key exchange. The second is a <em>protocol</em> attack that allows weaker export-grade versions of DH-based cipher suites to be selected, so long as they are supported by the server. A man-in-the-middle attacker who can make use of the second technique can downgrade vulnerable connections, which helps the first attack by forcing the use of weaker cryptography. But an attacker doesn&#8217;t <em>have</em> to rely on the downgrade trick for an attack on the security of the connection to succeed. It all depends on what the attacker wants to achieve and what position they are in.</p>
<h3>Attack scenarios</h3>
<p>If the attacker wants to modify the data in transit then the attack must be performed in real time. The attacker must be a man-in-the-middle and have access to sufficient computing resources to perform the necessary cryptanalysis in a short space of time. To ease the cryptanalysis, if the attacker can downgrade the connection to using a 512-bit prime, then so much the better. That&#8217;s only possible if the server supports export-grade DH cipher suites. In the opinion of the Logjam authors, any 512-bit prime should be considered vulnerable but a 768-bit, and certainly a 1024-bit, DH prime would require a serious amount of effort to attack.</p>
<p>In contrast, decrypting (but not modifying) the secure traffic from a connection that begins with a DH key exchange can be done <em>passively</em> in slower time: the attacker can capture the traffic and run the cryptanalysis offline. In this case, the attacker must contend with whatever strength of DH prime was selected during the TLS negotiation, which is unlikely to be 512-bit. For passive attacks, cipher suite preference is therefore more important: if the server prefers a common cipher suite that <em>isn&#8217;t</em> based on the standard DH key exchange (e.g. AES256-SHA) then a passive attack is very unlikely to succeed.</p>
<h3>Client-side fixes</h3>
<p>As with a number of previous TLS bugs, browsers have applied plasters to the sores to try to mitigate the impact. Although the downgrade attack exploited a weakness in the TLS <em>protocol</em> rather than an implementation flaw, refusing to accept 512-bit DH primes is a quick and effective solution. But taking that strategy all the way up to 1024-bit primes is dangerous in terms of user experience &#8211; users could start complaining that sites are suddenly inaccessible. So the success of client-side &#8220;patching&#8221; will depend on the vendors, the minimum size of DH prime their browser accepts and the user’s update regime.</p>
<h3>Common primes</h3>
<p>Another factor to consider is the prime itself. The Logjam paper noted that servers tend to re-use it &#8211; and, not only that, but the same primes are in circulation across different implementations. The pre-computation work for the cryptanalysis is based on a single DH prime so it&#8217;s in the attacker&#8217;s interest to do the number crunching for primes that are most widely used. A server that uses a common prime is thus more of a target. But what are these common primes? The Logjam paper itself makes explicit reference to two 512-bit primes. A number of larger primes can be found by inspecting the JavaScript behind the <a href="https://weakdh.org/sysadmin.html">server test page</a> on the Logjam site. You can test for a dozen common primes by adding a bit of code to the file <code>apps/s_cb.c</code> before compiling OpenSSL. Since version 1.0.2 the default output includes a line, when appropriate, beginning “Server Temp Key”, e.g.<br />
<a href="http://www.exploresecurity.com/wp-content/uploads/2015/07/server_temp_key.png"><img class="aligncenter size-full wp-image-405" alt="server_temp_key" src="http://www.exploresecurity.com/wp-content/uploads/2015/07/server_temp_key.png" width="387" height="97" /></a><br />
Insert the following lines after the line that outputs the bit length, which is <code>BIO_printf(out, "DH, %d bits\n", EVP_PKEY_bits(key));</code> (line 519 for the current version 1.0.2d):<br />
<code></code></p>
<pre>if (EVP_PKEY_bits(key) &gt; 1024)
   break;
const char *common[12]; // common primes from https://weakdh.org/imperfect-forward-secrecy.pdf, https://weakdh.org/docheck.js
common[0] = "9FDB8B8A004544F0045F1737D0BA2E0B274CDF1A9F588218FB435316A16E374171FD19D8D8F37C39BF863FD60E3E300680A3030C6E4C3757D08F70E6AA871033";
common[1] = "D4BCD52406F69B35994B88DE5DB89682C8157F62D8F33633EE5772F11F05AB22D6B5145B9F241E5ACC31FF090A4BC71148976F76795094E71E7903529F5A824B";
common[2] = "E9E642599D355F37C97FFD3567120B8E25C9CD43E927B3A9670FBEC5D890141922D2C3B3AD2480093799869D1E846AAB49FAB0AD26D2CE6A22219D470BCE7D777D4A21FBE9C270B57F607002F3CEF8393694CF45EE3688C11A8C56AB127A3DAF";
common[3] = "D67DE440CBBBDC1936D693D34AFD0AD50C84D239A45F520BB88174CB98BCE951849F912E639C72FB13B4B4D7177E16D55AC179BA420B2A29FE324A467A635E81FF5901377BEDDCFD33168A461AAD3B72DAE8860078045B07A7DBCA7874087D1510EA9FCC9DDD330507DD62DB88AEAA747DE0F4D6E2BD68B0E7393E0F24218EB3";
common[4] = "BBBC2DCAD84674907C43FCF580E9CFDBD958A3F568B42D4B08EED4EB0FB3504C6C030276E710800C5CCBBAA8922614C5BEECA565A5FDF1D287A2BC049BE6778060E91A92A757E3048F68B076F7D36CC8F29BA5DF81DC2CA725ECE66270CC9A5035D8CECEEF9EA0274A63AB1E58FAFD4988D0F65D146757DA071DF045CFE16B9B";
common[5] = "E6969D3D495BE32C7CF180C3BDD4798E91B7818251BB055E2A2064904A79A770FA15A259CBD523A6A6EF09C43048D5A22F971F3C20129B48000E6EDD061CBC053E371D794E5327DF611EBBBE1BAC9B5C6044CF023D76E05EEA9BAD991B13A63C974E9EF1839EB5DB125136F7262E56A8871538DFD823C6505085E21F0DD5C86B";
common[6] = "C9BBF5F774A8297B0F97CDDA3A3468C7117B6BF799A13D9F1F5DAC487B2241FE95EFB13C2855DFD2F898B3F99188E24EDF326DD68C76CC85537283512D46F1953129C693364D8C71202EABB3EBC85C1DF53907FBD0B7EB490AD0BC99289686800C46AB04BF7CDD9AD425E6FB25592EB6258A0655D75E93B2671746AE349E721B";
common[7] = "CD5C22FAEA0C53C39E602242C088FA0EA31586F472E9B04606AEDFB35F56C4948095F687B388575FA1700DB3D02253025A523AC76E9646F755A12338653AE071CB64F185591C34C6673FAC9B78DC4D71E53F3A5CCA6326F89C5400FBF8272A76367C630E234A905E4E558CDA968A46A136AD3088DD295F934EC36ADB5F69C3F3";
common[8] = "92402435C3A12E44D3730D8E78CADFA78E2F5B51A956BFF4DB8E56523E9695E63E32506CFEB912F2A77D22E71BB54C8680893B82AD1BCF337F7F7796D3FB968181D9BA1F7034ABFB1F97B3104CF3203F663E81990B7E090F6C4C5EE1A0E57EC174D3E84AD9E72E6AC7DA6AEA12DF297C131854FBF21AC4E879C23BBC60B4F753";
common[9] = "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF";
common[10] = "D6C094AD57F5374F68D58C7B096872D945CEE1F82664E0594421E1D5E3C8E98BC3F0A6AF8F92F19E3FEF9337B99B9C93A055D55A96E425734005A68ED47040FDF00A55936EBA4B93F64CBA1A004E4513611C9B217438A703A2060C2038D0CFAAFFBBA48FB9DAC4B2450DC58CB0320A0317E2A31B44A02787C657FB0C0CBEC11D";
common[11] = "B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C69A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C013ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD7098488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708DF1FB2BC2E4A4371";

char *prime;
prime = BN_bn2hex(key-&gt;pkey.dh-&gt;p);
BIO_printf(out, "---&gt; DH prime: %s\n", prime);
int i;
for (i = 0; i &lt; 12; i++) {    if (!strcmp(prime, common[i])) {        BIO_puts(out, "---&gt; Warning - common prime!\n");
       break;
   }
}</pre>
<p>So you should have something like:<br />
<a href="http://www.exploresecurity.com/wp-content/uploads/2015/07/openssl_code.png"><img class="aligncenter size-full wp-image-406" alt="openssl_code" src="http://www.exploresecurity.com/wp-content/uploads/2015/07/openssl_code.png" width="404" height="410" /></a><br />
Now you’ll get output such as:<br />
<a href="http://www.exploresecurity.com/wp-content/uploads/2015/07/common_prime.png"><img class="aligncenter size-full wp-image-407" alt="common_prime" src="http://www.exploresecurity.com/wp-content/uploads/2015/07/common_prime.png" width="375" height="101" /></a><br />
Remember that you may need to employ the <code>-cipher DH</code> parameter to force OpenSSL to use a DH-based cipher suite. If export-grade as well as stronger DH suites are supported then you&#8217;ll also have to use something like <code>-cipher EXP</code> on a second connection to ensure you test the commonality of both primes.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.exploresecurity.com/a-thick-spread-of-logjam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thoughts on Testing for POODLE</title>
		<link>https://www.exploresecurity.com/thoughts-on-testing-for-poodle/</link>
		<comments>https://www.exploresecurity.com/thoughts-on-testing-for-poodle/#comments</comments>
		<pubDate>Sat, 01 Nov 2014 00:09:21 +0000</pubDate>
		<dc:creator>Jerome</dc:creator>
				<category><![CDATA[Penetration Testing]]></category>
		<category><![CDATA[SSL/TLS]]></category>
		<category><![CDATA[OpenSSL]]></category>
		<category><![CDATA[penetration testing]]></category>
		<category><![CDATA[pentesting]]></category>
		<category><![CDATA[POODLE]]></category>
		<category><![CDATA[SSLv3]]></category>

		<guid isPermaLink="false">http://www.exploresecurity.com/?p=311</guid>
		<description><![CDATA[I recently did an internal presentation on POODLE &#8211; what the flaw is and how to test for it &#8211; and a version of the slides can be found here. Obviously much has been written about the vulnerability, its mitigations and what the future holds. What follows expands on the testing aspect of the presentation, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I recently did an internal presentation on POODLE &#8211; what the flaw is and how to test for it &#8211; and a version of the slides can be found <a href='http://www.slideshare.net/exploresecurity/ss-lv3-and-poodle'>here</a>. Obviously much <a href='https://www.imperialviolet.org/2014/10/14/poodle.html'>has<a> <a href='http://blog.cryptographyengineering.com/2014/10/attack-of-week-poodle.html'>been</a> <a href='http://blogs.opera.com/security/2014/10/security-changes-opera-25-poodle-attacks/'>written</a> about the vulnerability, its mitigations and what the future holds. What follows expands on the testing aspect of the presentation, with a few pointers on manual checks if you feel you need to verify or clarify &#8211; and possibly even add to &#8211; what the tools are telling you.<span id="more-311"></span></p>
<h3>SSLv3 support with block ciphers (in CBC mode) supported</h3>
<p>All SSL/TLS tools check for SSLv3 support. You can do this manually with:</p>
<p><code>openssl s_client -ssl3 –connect &lt;host&gt;:443</code></p>
<p>This confirms SSLv3 support but obviously it only reports 1 cipher suite. This is where the tools come in. However, remember that POODLE only affects block ciphers in cipher block chaining (CBC) mode (which I&#8217;ll just abbreviate to &#8220;block ciphers&#8221; now, as I believe all the block ciphers that can run under SSLv3 operate in CBC mode). So review the list of supported cipher suites: if the server only supports RC4 ciphers then don&#8217;t report POODLE as an issue (instead report SSLv3, which is still old and creaky, and RC4!).</p>
<h3>Server preference</h3>
<p>Even if the server supports block ciphers, it may <em>prefer</em> RC4-based ciphers so the likelihood of exploitation is going to be negligible. I recently wrote up <a href='http://www.exploresecurity.com/testing-for-cipher-suite-preference/'>what to do</a> if you find that your tools disagree over which cipher suite is preferered.</p>
<h3>TLS_FALLBACK_SCSV</h3>
<p>I also recently <a href='http://www.exploresecurity.com/poodle-and-the-tls_fallback_scsv-remedy/'>posted</a> in detail about how the TLS_FALLBACK_SCSV remediation worked. In short it&#8217;s a signal to the server from the client that it is connecting with a lower protocol version than it supports. If the server supports something better, then that should have been negotiated during the earlier connection attempts, so the server can abort the connection as being suspicious.</p>
<p>With the release of OpenSSL v1.0.1j it&#8217;s easy to test for TLS_FALLBACK_SCSV support:</p>
<p><code>openssl s_client -ssl3 -fallback_scsv -connect &lt;host&gt;:443</code></p>
<p>This is telling the server than I&#8217;d like to connect using SSLv3 &#8211; but grudgingly. I&#8217;m using <code>-ssl3</code> in the context of POODLE but TLS_FALLBACK_SCSV offers wider protection than this (checking support for it will continue to be worthwhile long after we&#8217;ve forgotten about POODLE.) Below you can see the fake cipher suite value advertising the fallback (which Wireshark couldn&#8217;t decode into something meaningful as it didn&#8217;t recognise the new cipher suite value 0&#215;5600 at the time):</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/tls_fallback_scsv.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/tls_fallback_scsv.png" alt="tls_fallback_scsv" width="712" height="98" class="aligncenter size-full wp-image-313" /></a></p>
<p>If the OpenSSL connection succeeds as usual (as shown below &#8211; a cipher suite has been chosen) then the server doesn&#8217;t support TLS_FALLBACK_SCSV.</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/openssl_connects.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/openssl_connects.png" alt="openssl_connects" width="590" height="99" class="aligncenter size-full wp-image-314" /></a></p>
<p>If the connection fails with the new <code>inappropriate_fallback</code> alert then the server does support TLS_FALLBACK_SCSV:</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/tls_fallback_alert.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/tls_fallback_alert.png" alt="tls_fallback_alert" width="1182" height="78" class="aligncenter size-full wp-image-315" /></a></p>
<p>Enabling TLS_FALLBACK_SCSV is all very well but it does depend on client support too &#8211; so if the server has SSLv3 enabled with block ciphers supported (and preferred) then it&#8217;s not out of the woods. A few browsers do already support it &#8211; Chrome 33 (Feb 2014), Firefox 35 (Jan 2015), Opera 25 (Oct 2014) &#8211; so it&#8217;s better than nothing, and of course support for it among browsers will only improve. Acknowledging TLS_FALLBACK_SCSV support is therefore worthwhile &#8211; both today and in the future. A client may even feel aggrieved if they&#8217;ve gone to the trouble of enabling TLS_FALLBACK_SCSV but get no credit for it in their pentest report!</p>
]]></content:encoded>
			<wfw:commentRss>https://www.exploresecurity.com/thoughts-on-testing-for-poodle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing for Cipher Suite Preference</title>
		<link>https://www.exploresecurity.com/testing-for-cipher-suite-preference/</link>
		<comments>https://www.exploresecurity.com/testing-for-cipher-suite-preference/#comments</comments>
		<pubDate>Fri, 31 Oct 2014 22:00:01 +0000</pubDate>
		<dc:creator>Jerome</dc:creator>
				<category><![CDATA[Penetration Testing]]></category>
		<category><![CDATA[SSL/TLS]]></category>
		<category><![CDATA[OpenSSL]]></category>
		<category><![CDATA[penetration testing]]></category>
		<category><![CDATA[pentesting]]></category>
		<category><![CDATA[POODLE]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[TLS]]></category>

		<guid isPermaLink="false">http://www.exploresecurity.com/?p=296</guid>
		<description><![CDATA[It&#8217;s often important to know which SSL/TLS cipher suite is preferred by a server to alter the risk rating of a particular issue. For POODLE, if the server prefers RC4 ciphers over SSLv3 connections then it&#8217;s very unlikely that a connection will be vulnerable to POODLE. Similarly, if a server prefers block ciphers then reporting [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>It&#8217;s often important to know which SSL/TLS cipher suite is preferred by a server to alter the risk rating of a particular issue. For <a href='http://www.exploresecurity.com/thoughts-on-testing-for-poodle/'>POODLE</a>, if the server prefers RC4 ciphers over SSLv3 connections then it&#8217;s very unlikely that a connection will be vulnerable to POODLE. Similarly, if a server prefers block ciphers then reporting RC4 support should be appropriately adjusted. Occasionally tools conflict over which cipher suite is preferred so I thought I&#8217;d write up how to resolve this manaully in the spirit of the <a href='http://www.exploresecurity.com/ssltls-checklist-for-pentesters/'>SSL/TLS manual cheatsheet</a>.<span id="more-296"></span></p>
<h3>How is a cipher suite chosen?</h3>
<p>Quick overview: the connection starts with a Client Hello in which the client advertises which cipher suites it supports in order of preference (most preferred first). This list will be tailored according to any local configuration, as well as to the SSL/TLS protocol version the client is hoping to use, which is also advertised in the Client Hello:</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/client_hello.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/client_hello.png" alt="client_hello" width="527" height="289" class="aligncenter size-full wp-image-300" /></a></p>
<p>The protocol version is the highest the client supports &#8211; unless the browser has gone down the fallback route, which is the mechanism <a href='http://www.exploresecurity.com/poodle-and-the-tls_fallback_scsv-remedy/'>abused by POODLE</a> to make the SSLv3 attack more practical. Cipher suites can vary with protocol version simply because older protocols can&#8217;t always meet the needs of newer cipher suites. For example, only TLSv1.2 supports cipher suites that use SHA-256 for message integrity.</p>
<p>In receipt of the Client Hello, the server now has two options: it can either (a) opt for the client&#8217;s most preferred cipher suite that it too supports, or (b) ignore the client&#8217;s preference and opt for the cipher suite nearest the top of its <em>own</em> list that the client supports. For example, say the client has sent up a list of cipher suites which we&#8217;ll just call 1,2,3,4,5,6,7 and the server supports 8,3,4,2,6. In the case of (a) the server&#8217;s order is unimportant and it chooses 2; in the case of (b) the server chooses 3. The choice the server makes is returned in the Server Hello message:</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/server_hello.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/server_hello.png" alt="server_hello" width="490" height="147" class="aligncenter size-full wp-image-302" /></a></p>
<p>Something to note in the above example is that, in the case of the server having a preference, you would never find out that cipher suite 8 is in fact the preferred choice because it isn&#8217;t supported by the client and thus it&#8217;s never offered in the Client Hello. Server preference is thus not only dictated by the server: it depends on what the client knows too.</p>
<h3>Conflicting results</h3>
<p>On my last test I had a conflict between SSLyze and SSLscan over which cipher suite was preferred over SSLv3. SSLyze thought it was RC4-SHA (I&#8217;m using the OpenSSL notation here)&#8230;</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/sslyze.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/sslyze.png" alt="sslyze" width="1252" height="145" class="aligncenter size-full wp-image-297" /></a></p>
<p>&#8230;whereas SSLscan went for DES-CBC3-SHA:</p>
<p><a href="http://www.exploresecurity.com/wp-content/uploads/2014/10/sslscan.png"><img src="http://www.exploresecurity.com/wp-content/uploads/2014/10/sslscan-300x45.png" alt="sslscan" width="300" height="45" class="aligncenter size-medium wp-image-298" /></a></p>
<h3>Manually testing for preference</h3>
<p>To resolve this was simple. I ran:</p>
<p><code>openssl s_client -ssl3 -connect &lt;host&gt;:443</code></p>
<p>OpenSSL reported that DES-CBC3-SHA had been chosen. Just to be sure &#8211; which I explain below &#8211; I let the two cipher suites in question compete with one another using the <code>-cipher</code> switch, which allows you to put specific cipher suites in the Client Hello. OpenSSL orders them exactly how you list them according to the scheme set out in <code>man ciphers</code>. So I ran:</p>
<p><code>openssl s_client -ssl3 -cipher DES-CBC3-SHA:RC4-SHA -connect &lt;host&gt;:443</code></p>
<p>and then switched the order of the cipher suites:</p>
<p><code>openssl s_client -ssl3 -cipher RC4-SHA:DES-CBC3-SHA -connect &lt;host&gt;:443</code>.</p>
<p>In both cases DES-CBC3-SHA was chosen so I was confident that SSLscan was right.</p>
<h3>Why did SSLyze get it wrong this time?</h3>
<p>Up to now I had tried SSLyze versions 0.9 and 1.0dev and both had reported RC4-SHA as the preferred cipher suite. I then tried an earlier 0.6beta version and found it correctly reported DES-CBC3-SHA. Rather than delve into the code I first took the easy option and fired up Wireshark while running one of the later versions of SSLyze. When enumerating the supported cipher suites, I could see that DES-CBC3-SHA was tested individually; however, when it came to checking for preference, DES-CBC3-SHA was left out of the list in the Client Hello. Obviously the server couldn&#8217;t choose it in this case, hence the preference was misreported. I <a href='https://github.com/nabla-c0d3/sslyze/issues/10'>reported</a> this as a bug and Alban Diquet explained that:</p>
<blockquote><p>The reason why DES-CBC3-SHA isn&#8217;t sent within the preference test is that specific servers will not reply at all if the client hello is larger than 255 bytes (due to a bug in a specific brand of load balancers). To reduce the size of the hello, I had to disable some stuff including specific cipher suites.</p></blockquote>
<p>In this case the server only supported 3 cipher suites over SSLv3 so this misidentification could have been avoided. And this got me thinking&#8230;</p>
<h3>Algorithm for testing preference</h3>
<p>For each supported SSL/TLS protocol version, this is my version 0.1 of a method a tool could use to work out cipher suite preference:</p>
<ol>
<li>Determine which cipher suites are supported individually (i.e. repeatedly send a Client Hello with just one cipher suite and see if it&#8217;s accepted).</li>
<li>Once you know which suites are supported, send them all up in one Client Hello and see which one is picked. If you&#8217;re worried about the buggy load balancers mentioned above then use a subset for now.</li>
<li>If the chosen cipher suite is the one that was at the top of the list then there are two alternative explanations: either (a) the server picked the client&#8217;s preferred suite as it has no preference of its own, or (b) the server really does prefer that cipher suite and it just happened to be at the top. (This is why I ran more than one test above.) So repeat the test in step 2, this time changing the most preferred cipher suite at the top of the order. If the same cipher suite is chosen then it&#8217;s a case of (b) and the server definitely has a preference; otherwise, the first cipher suite should be chosen and it&#8217;s case of (a) where the server is happy to be guided by the client&#8217;s preference<sup>1</sup>.</li>
<li>If the cipher suite list has been cut short to appease buggy load balancers, repeat step 2 with the next set of cipher suites. If a preference has been expressed so far, that cipher suite should be included with the next set to allow it to compete.</li>
<li>If a preference has been found and you really wanted to go the whole hog, you could determine the order in full by starting again at step 2, missing out the cipher suite previously identified as preferred.
</ol>
<p>I put some of this to Alban Diquet (as part of the bug report) and he replied &#8220;yes I thought of adding the exact check you described but that&#8217;s pretty much at the bottom of my TODO list&#8221;. I think he was referring to step 3 but, anyway, if you ever have conflicting output from your tools over cipher suite preference, hopefully this posting will help you to resolve the issue.</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p><sup>1</sup> Actually, there is a possibility of &#8220;no preference&#8221; being misreported if you consider a server that supports cipher suite &#8220;wildcards&#8221; in such as way that there is no preference within a set of cipher suites that match a wildcard. I don&#8217;t think any popular implementation features this (hence the footnote) but for the sake of completeness imagine a server that prefers AES-* then RC4-*. The test tool sends up AES-SHA, AES-MD5, RC4-SHA, RC4-MD5 and AES-SHA is chosen. As per step 3, the tool then sends up AES-MD5, RC4-SHA, RC4-MD5, AES-SHA. This time AES-MD5 is chosen, giving the illusion of no server preference but in fact the server does have a preference, it&#8217;s just by groups. To cover this, if no server preference has been detected after step 3, repeat step 2 rotating the cipher suite at the top of the list each time; if at any point the cipher suite selected is <em>not</em> the first on the list then the server <em>does</em> have a preference. Admittedly this could add a fair bit of overhead!</p>
]]></content:encoded>
			<wfw:commentRss>https://www.exploresecurity.com/testing-for-cipher-suite-preference/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Small Print for OpenSSL legacy_renegotiation</title>
		<link>https://www.exploresecurity.com/the-small-print-for-openssl-legacy_renegotiation/</link>
		<comments>https://www.exploresecurity.com/the-small-print-for-openssl-legacy_renegotiation/#comments</comments>
		<pubDate>Mon, 29 Sep 2014 23:26:37 +0000</pubDate>
		<dc:creator>Jerome</dc:creator>
				<category><![CDATA[Penetration Testing]]></category>
		<category><![CDATA[SSL/TLS]]></category>
		<category><![CDATA[OpenSSL]]></category>
		<category><![CDATA[penetration testing]]></category>
		<category><![CDATA[pentesting]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[TLS]]></category>

		<guid isPermaLink="false">http://www.exploresecurity.com/?p=245</guid>
		<description><![CDATA[The other day my attention was drawn to a switch in OpenSSL called -legacy_rengotation. I pulled up the built-in help for s_client and, sure enough, there it was. So I trawled back through the release notes and it looked to have been there since version 0.9.8m. I couldn&#8217;t believe that I hadn&#8217;t spotted this before: [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>The other day my attention was drawn to a switch in OpenSSL called <code>-legacy_rengotation</code>. I pulled up the built-in help for <code>s_client</code> and, sure enough, there it was. So I trawled back through the release notes and it looked to have been there since version 0.9.8m. I couldn&#8217;t believe that I hadn&#8217;t spotted this before: it looked like the perfect way to test for insecure renegotiation without the faff of having to recompile OpenSSL or use an older version. But after a bit of testing this proved to be a red herring&#8230;<span id="more-245"></span></p>
<p>The first thing I wanted to do was prove the negative &#8211; that is, if the <code>-legacy_rengotation</code> switch did what it seemed to promise, then without it renegotiation should fail. Using OpenSSL 1.0.1i I connected to a server that was missing the secure renegotiation patch and ran the test (more information <a href="http://www.exploresecurity.com/ssltls-checklist-for-pentesters/">here</a>):</p>
<p><code># openssl s_client -connect insecure.example.com:443<br />
...<br />
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA<br />
Server public key is 2048 bit<br />
<span style="color: #ff0000;">Secure Renegotiation IS NOT supported</span><br />
Compression: NONE<br />
...<br />
HEAD / HTTP/1.0<br />
R<br />
RENEGOTIATING<br />
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Primary Certification Authority<br />
verify error:num=20:unable to get local issuer certificate<br />
<span style="color: #ff0000;">verify return:0</span></code></p>
<p>It worked. Wait a minute, that shouldn&#8217;t have happened! So I tried OpenSSL 1.0.1e and then another vulnerable server &#8211; and it always connected. After some digging around I found an <a href="https://www.openssl.org/docs/ssl/SSL_CTX_set_options.html#Patched_OpenSSL_client_and_unpat">article</a> on the OpenSSL site. It stated that:</p>
<blockquote><p>If the option SSL_OP_LEGACY_SERVER_CONNECT or SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION is set then initial connections and renegotiation between patched OpenSSL clients and unpatched servers succeeds. If neither option is set then initial connections to unpatched servers will fail.</p>
<p>The option SSL_OP_LEGACY_SERVER_CONNECT is currently set by default even though it has security implications: otherwise it would be impossible to connect to unpatched servers (i.e. all of them initially) and this is clearly not acceptable. Renegotiation is permitted because this does not add any additional security issues: during an attack clients do not see any renegotiations anyway.</p></blockquote>
<p>There was the small print. So as far as <code>s_client</code> is concerned <code>-legacy_renegotiation</code> makes no difference by default because it will renegotiate with insecure servers anyway. To double-check that <code>-legacy_renegotiation</code> and <code>SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION</code> were in fact related, I took a quick look at the source code for <code>s_client.c</code> and the following lines shone out:</p>
<p><code>else if (strcmp(*argv,"-legacy_renegotiation") == 0)<br />
&nbsp;&nbsp;off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;<br />
else if (strcmp(*argv,"-legacy_server_connect") == 0)<br />
&nbsp;&nbsp;{ off|=SSL_OP_LEGACY_SERVER_CONNECT; }<br />
else if (strcmp(*argv,"-no_legacy_server_connect") == 0)<br />
&nbsp;&nbsp;{ clr|=SSL_OP_LEGACY_SERVER_CONNECT; }</code></p>
<p>As expected, the first line sees <code>-legacy_renegotiation</code> controlling <code>SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION</code>, which we now know has no effect if <code>SSL_OP_LEGACY_SERVER_CONNECT</code> is set. The code also suggests that <code>SSL_OP_LEGACY_SERVER_CONNECT</code> can be controlled with switches, which aren&#8217;t listed in the built-in help. Using the switch <code>-no_legacy_server_connect</code>, as the OpenSSL doc states, stops you from connecting to the server at all:</p>
<p><code># openssl s_client -no_legacy_server_connect -connect insecure.example.com:443<br />
CONNECTED(00000003)<br />
<span style="color: #ff0000;">140264951338664:error:1412F152:SSL routines:SSL_PARSE_SERVERHELLO_TLSEXT:unsafe legacy renegotiation disabled:t1_lib.c:1732:</span><br />
140264951338664:error:140920E3:SSL routines:SSL3_GET_SERVER_HELLO:parse tlsext:s3_clnt.c:1053:<br />
---<br />
no peer certificate available<br />
---<br />
No client certificate CA names sent<br />
---<br />
SSL handshake has read 63 bytes and written 7 bytes<br />
---<br />
<span style="color: #ff0000;">New, (NONE), Cipher is (NONE)</span></code></p>
<p>If you skimmed over the OpenSSL quote above, you may now be thinking <i>&#8220;why is it so black and white; why can&#8217;t I connect to an unpatched server but s_client refuse renegotiation?&#8221;</i> As the OpenSSL doc notes &#8211; and if you think back to the attack <a href="http://www.g-sec.lu/practicaltls.pdf">details</a> &#8211; the victim client doesn&#8217;t actually initiate a renegotiation, it&#8217;s all the attacker&#8217;s doing. OpenSSL isn&#8217;t leaving you vulnerable by letting you renegotiate to unpatched servers, it&#8217;s the very act of connecting to them that leaves you exposed. That&#8217;s where the <code>-no_legacy_server_connect</code> switch comes in: it gives you the option of terminating connections to unpatched servers if you don&#8217;t want to take any risks (and you can understand why they&#8217;ve not made that the default). From a pentest viewpoint, <code>&#8209;legacy_renegotiation</code> should be avoided when testing for insecure renegotiation.</p>
<p>I pinged Ivan Ristic (of <a href="https://www.ssllabs.com/">SSL Labs</a> fame) about this for a sanity check, since he was nice enough to get in touch following the release of my <a href="http://www.exploresecurity.com/ssltls-checklist-for-pentesters/">cheatsheet</a>. (Quick trailer: it turns out that Ivan is planning to release some of the manual testing aspects from his book <a href="https://www.feistyduck.com/books/bulletproof-ssl-and-tls/">Bulletproof SSL and TLS</a> as freeware in the near future.) He agreed that <code>-legacy_renegotiation</code> was something of a red herring as far as manual testing using OpenSSL <code>s_client</code> was concerned &#8211; and I think that&#8217;s now going to make it into the next version of his book!</p>
]]></content:encoded>
			<wfw:commentRss>https://www.exploresecurity.com/the-small-print-for-openssl-legacy_renegotiation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
