2014-11-24 22:52:53 +01:00
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html lang="en">
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="utf-8">
|
|
|
|
|
<title>Comment Saurik a rooté les Google Glass</title>
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
|
|
|
<meta name="author" content="wxcafé">
|
|
|
|
|
<link rel="icon" type="image/png" href="//wxcafe.net/theme/img/favicon.ico">
|
|
|
|
|
<!-- Le styles -->
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<link rel="stylesheet" href="//wxcafe.net/theme/css/extra.css" type="text/css" />
|
2014-11-24 22:52:53 +01:00
|
|
|
|
<link rel="stylesheet" href="//wxcafe.net/theme/css/bootstrap.css" type="text/css" />
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<link href='http://fonts.googleapis.com/css?family=Oswald&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
|
2014-11-24 22:52:53 +01:00
|
|
|
|
<script type="text/javascript">
|
|
|
|
|
/* <![CDATA[ */
|
|
|
|
|
(function() {
|
|
|
|
|
var s = document.createElement('script');
|
|
|
|
|
var t = document.getElementsByTagName('script')[0];
|
|
|
|
|
|
|
|
|
|
s.type = 'text/javascript';
|
|
|
|
|
s.async = true;
|
|
|
|
|
s.src = '//api.flattr.com/js/0.6/load.js?'+
|
|
|
|
|
'mode=auto&uid=wxcafe&button=compact&popout=0';
|
|
|
|
|
t.parentNode.insertBefore(s, t);
|
|
|
|
|
})();
|
|
|
|
|
/* ]]> */
|
|
|
|
|
</script> <!-- flattr button loader -->
|
|
|
|
|
<style type="text/css">
|
|
|
|
|
body {
|
|
|
|
|
padding-top: 60px;
|
|
|
|
|
padding-bottom: 40px;
|
|
|
|
|
}
|
|
|
|
|
.sidebar-nav {
|
|
|
|
|
padding: 9px 0;
|
|
|
|
|
}
|
|
|
|
|
.tag-1 {
|
|
|
|
|
font-size: 13pt;
|
|
|
|
|
}
|
|
|
|
|
.tag-2 {
|
|
|
|
|
font-size: 10pt;
|
|
|
|
|
}
|
|
|
|
|
.tag-2 {
|
|
|
|
|
font-size: 8pt;
|
|
|
|
|
}
|
|
|
|
|
.tag-4 {
|
|
|
|
|
font-size: 6pt;
|
|
|
|
|
}
|
|
|
|
|
</style>
|
|
|
|
|
<link href="//wxcafe.net/theme/css/bootstrap-responsive.css" rel="stylesheet">
|
|
|
|
|
<link href="//wxcafe.net/theme/css/font-awesome.css" rel="stylesheet">
|
|
|
|
|
<link href="//wxcafe.net/theme/css/pygments.css" rel="stylesheet">
|
|
|
|
|
<!-- Le fav and touch icons -->
|
|
|
|
|
<link rel="shortcut icon" href="//wxcafe.net/theme/images/favicon.ico">
|
|
|
|
|
|
|
|
|
|
<link href="//wxcafe.net/feeds/feed.rss.xml" type="application/atom+xml" rel="alternate" title="Wxcafé RSS Feed" />
|
|
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
<div class="navbar navbar-fixed-top">
|
|
|
|
|
<div class="navbar-inner">
|
|
|
|
|
<div class="container-fluid">
|
|
|
|
|
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
|
|
|
|
|
<span class="icon-bar"></span>
|
|
|
|
|
<span class="icon-bar"></span>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<span class="icon-bar"></span>
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</a>
|
|
|
|
|
<a class="brand" href="//wxcafe.net/index.html">Wxcafé </a>
|
|
|
|
|
<div class="nav-collapse">
|
|
|
|
|
<ul class="nav">
|
|
|
|
|
<li><a href="//wxcafe.net/archives.html"><i class="icon-th-list"></i> Archives</a></li>
|
|
|
|
|
<li><a href="//wxcafe.net/pages/about/">A propos</a></li>
|
|
|
|
|
<li class="divider-vertical"></li>
|
|
|
|
|
<ul class="nav pull-right">
|
|
|
|
|
</ul>
|
|
|
|
|
</ul>
|
|
|
|
|
</div><!--/.nav-collapse -->
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="container-fluid">
|
|
|
|
|
<div class="row">
|
|
|
|
|
<div class="span9" id="content">
|
|
|
|
|
<section id="content">
|
|
|
|
|
<article>
|
|
|
|
|
<header>
|
|
|
|
|
<h1>
|
|
|
|
|
<a href=""
|
|
|
|
|
rel="bookmark"
|
|
|
|
|
title="Permalink to Comment Saurik a rooté les Google Glass">Comment Saurik a rooté les Google Glass</a>
|
|
|
|
|
</h1>
|
|
|
|
|
</header>
|
|
|
|
|
<div class="entry-content">
|
|
|
|
|
<div class="well">
|
|
|
|
|
<footer class="post-info">
|
|
|
|
|
<span class="label">Date</span>
|
|
|
|
|
<span class="published" title="2013-05-06T06:24:00+02:00">
|
|
|
|
|
<i class="icon-calendar"></i> Mon 06 May 2013
|
|
|
|
|
</span>
|
|
|
|
|
<br />
|
|
|
|
|
<span class="label">By</span>
|
|
|
|
|
<a href="//wxcafe.net/author/wxcafe.html"><i class="icon-user"></i>Wxcafe</a>
|
|
|
|
|
<br />
|
|
|
|
|
<span class="label">Category</span>
|
|
|
|
|
<a href="//wxcafe.net/category/hacking/"><i class="icon-folder-open"></i>Hacking</a>
|
|
|
|
|
<br />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</footer><!-- /.post-info --> </div>
|
|
|
|
|
<p>Comme vous avez pu le lire dans les médias, Saurik (Jay Freeman, connu
|
2015-09-03 19:58:32 +02:00
|
|
|
|
pour avoir développé Cydia, un “app store” alternatif pour les iTrucs),
|
2014-11-24 22:52:53 +01:00
|
|
|
|
après avoir reçu une paire de Google glass de la part de Google (de
|
2015-09-03 19:58:32 +02:00
|
|
|
|
façon assez évidente…), a trouvé intéressant d’obtenir un accès root
|
|
|
|
|
sur celles-ci, ce qu’il a accompli très rapidement. Des démentis de la
|
2014-11-24 22:52:53 +01:00
|
|
|
|
part de Google et de certains autres sites sont vite arrivés, disant que
|
|
|
|
|
les lunettes possédaient un bootloader débloqué et que de fait, le root
|
|
|
|
|
était facile a obtenir : il suffisait de débloquer le bootloader,
|
2015-09-03 19:58:32 +02:00
|
|
|
|
d’extraire l’OS, de le rooter hors-fonctionnement, puis de le
|
2014-11-24 22:52:53 +01:00
|
|
|
|
réinstaller, rooté, sur les lunettes.</p>
|
|
|
|
|
<p>Le fait est que de débloquer le bootloader laisse une trace permanente
|
2015-09-03 19:58:32 +02:00
|
|
|
|
sur les lunettes, et que Saurik n’a pas utilisé cette technique pour
|
2014-11-24 22:52:53 +01:00
|
|
|
|
rooter sa paire. Voyons comment il a fait :</p>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<p><em>Je tiens tout d’abord a préciser que toutes les informations qui vont
|
2014-11-24 22:52:53 +01:00
|
|
|
|
suivre sont extraites de <a href="http://www.saurik.com/id/16">cet article</a>, et plus précisément de la
|
2015-09-03 19:58:32 +02:00
|
|
|
|
partie “How does this exploit work”. Je tente d’apporter ma maigre
|
2014-11-24 22:52:53 +01:00
|
|
|
|
contribution a cette explication.</em></p>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<p>Donc, d’après les témoignages des quelques utilisateurs de Glass dans le
|
2014-11-24 22:52:53 +01:00
|
|
|
|
monde, il semblerait que ces dernières fonctionnent avec un système
|
2015-09-03 19:58:32 +02:00
|
|
|
|
d’exploitation Android, avec une nouvelle interface, mais avec les mêmes
|
2014-11-24 22:52:53 +01:00
|
|
|
|
outils internes: un kernel Linux, des outils userland GNU et une machine
|
|
|
|
|
virtuelle Java Dalvik pour les applications.</p>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<p>Saurik a donc cherché un exploit connu pour cette version d’android, et
|
|
|
|
|
l’a appliqué a son problème. L’exploit en question est relativement
|
|
|
|
|
simple. Depuis la version 4.0 d’android, le système permet la sauvegarde
|
2014-11-24 22:52:53 +01:00
|
|
|
|
des données des différentes applications, une a une, via ADB (Android
|
2015-09-03 19:58:32 +02:00
|
|
|
|
Debug Bridge, un protocole USB permettant l’accès a de nombreuses
|
2014-11-24 22:52:53 +01:00
|
|
|
|
fonctions avancées des machines fonctionnant sous android, dont, entre
|
2015-09-03 19:58:32 +02:00
|
|
|
|
autre, un shell, un accès au logs de debugging, etc… Cette
|
2014-11-24 22:52:53 +01:00
|
|
|
|
fonctionnalité est bien entendu désactivable.) Ce backup est très simple :
|
|
|
|
|
il crée un fichier .tgz contenant le dossier de configuration de
|
2015-09-03 19:58:32 +02:00
|
|
|
|
l’application. Lors de la restauration, le système supprime la
|
|
|
|
|
configuration existante, puis la remplace par celle dans l’archive gzip.</p>
|
2014-11-24 22:52:53 +01:00
|
|
|
|
<p>Le problème de sécurité vient du fait que les applications android
|
|
|
|
|
voient leurs données stockées dans /data/data/identifiant/, et que
|
2015-09-03 19:58:32 +02:00
|
|
|
|
/data/ a pour permissions drwxrwx–x 27 system system, ce qui
|
2014-11-24 22:52:53 +01:00
|
|
|
|
signifie que seul system et les membres du groupe system peuvent lire
|
|
|
|
|
dessus. Or, le fichier /data/local.prop définit de nombreux paramètres
|
2015-09-03 19:58:32 +02:00
|
|
|
|
au démarrage, et notamment un qui permet au système de déterminer s’il
|
|
|
|
|
fonctionne dans une VM ou sur un véritable appareil. S’il fonctionne sur
|
2014-11-24 22:52:53 +01:00
|
|
|
|
une machine virtuelle, il donne les droits root a tout utilisateur se
|
2015-09-03 19:58:32 +02:00
|
|
|
|
connectant via ADB, ce qui est ce que l’on cherche pour l’instant. Le
|
2014-11-24 22:52:53 +01:00
|
|
|
|
fait que /data/ appartienne a system veut dire que le programme de
|
|
|
|
|
restauration doit être setuid pour accéder aux données a l’intérieur qui
|
2015-09-03 19:58:32 +02:00
|
|
|
|
appartiennent a root (soit toutes les applications système d’android,
|
|
|
|
|
dont l’application paramètres, et, dans ce cas précis, l’application de
|
2014-11-24 22:52:53 +01:00
|
|
|
|
log système présente sur les google glass de test. Ainsi, nous avons un
|
|
|
|
|
processus tournant en tant que root, qui va écrire sur une partition qui
|
|
|
|
|
nous intéresse des données que nous possédons.</p>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<p>Cependant, un problème reste : le système de restauration d’Android
|
2014-11-24 22:52:53 +01:00
|
|
|
|
vérifie les données avant de restaurer, et ne restaure pas les symlinks,
|
2015-09-03 19:58:32 +02:00
|
|
|
|
ce qui nous empêche d’avoir accès directement a /data/local.prop, le
|
|
|
|
|
fichier qu’on cherche a modifier. Cela dit, il nous reste une
|
2014-11-24 22:52:53 +01:00
|
|
|
|
possiblité. Plaçons un dossier world-writable dans le fichier de backup,
|
|
|
|
|
et nous pourrons écrire dedans pendant quelques secondes, le temps que
|
|
|
|
|
la restauration se termine et que le système remette les permissions en
|
|
|
|
|
place. Ainsi, nous pouvons créer le fichier
|
|
|
|
|
/data/local/com.google.glass.logging/whatev/x, lien vers
|
|
|
|
|
/data/local.prop, et nous avons un toujours un processus tournant en
|
2015-09-03 19:58:32 +02:00
|
|
|
|
tant que root qui est en train d’écrire dans ce dossier.</p>
|
2014-11-24 22:52:53 +01:00
|
|
|
|
<p>Donc, nous allons lancer deux processus en même temps : </p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>Le premier tentera en boucle de créer le symlink. Il sera consitué de
|
|
|
|
|
la commande suivante, depuis un shell sur les lunettes :</p>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">while ! ln -s /data/local.prop /data/data/com.google.glass.logging/whatev/x 2>/dev/null
|
|
|
|
|
do :
|
|
|
|
|
done
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>Le deuxième sera le processus de restauration de notre exploit. Celui
|
|
|
|
|
ci, pour une plus grande chance de réussite, devra être suffisamment
|
|
|
|
|
lourd : au moins \~50Mo. Il devra contenir whatev/bigfile et whatev/x,
|
2015-09-03 19:58:32 +02:00
|
|
|
|
pour qu’il crée whatev, prenne du temps a copier bigfile, puis écrive
|
2014-11-24 22:52:53 +01:00
|
|
|
|
dans x après que le symlink soit effectif. La commande sera, depuis
|
2015-09-03 19:58:32 +02:00
|
|
|
|
l’ordinateur host :</p>
|
|
|
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb restore exploit.ab
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>Ces commandes vont fonctionner de concert pour nous donner un accès root :<br />
|
|
|
|
|
- Le processus de restauration va créer le dossier whatev, qui sera
|
|
|
|
|
world-readable. Il va commencer a copier le fichier bigfile.<br />
|
|
|
|
|
- Le processus de symlink va créer le lien
|
|
|
|
|
/data/data/com.google.glass.logging/whatev/x, pointant vers
|
2015-09-03 19:58:32 +02:00
|
|
|
|
/data/local.prop, puis rendre l’âme proprement.<br />
|
2014-11-24 22:52:53 +01:00
|
|
|
|
- Le processus de restauration, ayant enfin fini de copier
|
|
|
|
|
whatev/bigfile, copiera les contenus que nous voulons dans whatev/x, qui
|
|
|
|
|
est lié a /data/local.prop. Comme le processus est setuid root, il ne se
|
|
|
|
|
rendra compte de rien, et écrira tout dans /data/local.prop.</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<p>And voilà! On a écrit ce que l’on veut dans /data/local.prop, ce qui
|
|
|
|
|
nous permet de faire croire a android qu’il tourne dans une machine
|
|
|
|
|
virtuelle (ce que l’on veut, c’est en fait “ro.kernel.qemu=1”, qui
|
|
|
|
|
indique au noyau qu’il tourne dans qemu, un système de VM).</p>
|
|
|
|
|
<p>Il nous reste a rebooter, depuis l’ordinateur host :</p>
|
|
|
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>Puis nous remontons la partitions système en lecture/écriture (r/w),
|
|
|
|
|
depuis le host :</p>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell "mount -o remount,rw /system"
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</pre></div>
|
|
|
|
|
|
|
|
|
|
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<p>Nous copions le binaire <a href="https://data.wxcafe.net/uploads/android/glass/su">su</a> vers l’appareil :</p>
|
|
|
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb push su /system/xbin
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>Nous donnons les bonnes permissions a ce binaire, afin de pouvoir
|
|
|
|
|
l’exécuter plus tard :</p>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell "chmod 6755 /system/xbin/su"
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>Ensuite, nous supprimons le fichier /data/local.prop, pour pouvoir
|
|
|
|
|
redémarrer normalement :</p>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb shell "rm /data/local.prop"
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>Enfin, nous redemarrons a nouveau :</p>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<div class="codehilite" style="background: #272822"><pre style="line-height: 125%">adb reboot
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p>Et voila, une paire de google glass rootée!</p>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<p>Il est bon de préciser que cette manipulation n’est possible que parce
|
|
|
|
|
que les lunettes tournent sous une ancienne version d’android, et que ce
|
2014-11-24 22:52:53 +01:00
|
|
|
|
bug a été fixé depuis.</p>
|
|
|
|
|
<p>Il serait aussi interessant de couvrir les problèmes de vie privée
|
2015-09-03 19:58:32 +02:00
|
|
|
|
qu’engendrent les Google Glass, et ce sera fait dans un autre billet.</p>
|
2014-11-24 22:52:53 +01:00
|
|
|
|
<p>A bientôt!</p>
|
|
|
|
|
</div><!-- /.entry-content -->
|
|
|
|
|
</article>
|
|
|
|
|
</section>
|
|
|
|
|
</div><!--/span-->
|
|
|
|
|
<div class="span3 well sidebar-nav" id="sidebar">
|
|
|
|
|
<ul class="nav nav-list">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Categories links -->
|
|
|
|
|
<li class="nav-header"><h4><i class="icon-folder-close icon-large"></i> Categories</h4></li>
|
|
|
|
|
<li>
|
|
|
|
|
<a href="//wxcafe.net/category/hacking/">
|
|
|
|
|
<i class="icon-folder-open icon-large"></i>Hacking
|
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<a href="//wxcafe.net/category/note/">
|
|
|
|
|
<i class="icon-folder-open icon-large"></i>Note
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<a href="//wxcafe.net/category/oses/">
|
|
|
|
|
<i class="icon-folder-open icon-large"></i>OSes
|
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<a href="//wxcafe.net/category/ranting/">
|
|
|
|
|
<i class="icon-folder-open icon-large"></i>Ranting
|
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<a href="//wxcafe.net/category/tutoriel/">
|
|
|
|
|
<i class="icon-folder-open icon-large"></i>Tutoriel
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<a href="//wxcafe.net/category/vidya-games/">
|
|
|
|
|
<i class="icon-folder-open icon-large"></i>Vidya Games
|
2014-11-24 22:52:53 +01:00
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<hr>
|
|
|
|
|
|
|
|
|
|
<!-- Social links -->
|
|
|
|
|
<li class="nav-header"><h4><i class="icon-exchange"></i> social</h4></li>
|
|
|
|
|
<a class="FlattrButton" style="display:none;"
|
|
|
|
|
title="//wxcafe.net"
|
|
|
|
|
style="padding-top: 10px;"
|
|
|
|
|
rel="flattr;
|
|
|
|
|
url://wxcafe.net;
|
|
|
|
|
title://wxcafe.net;
|
|
|
|
|
button:compact;
|
|
|
|
|
popout:0;
|
|
|
|
|
uid:wxcafe;
|
|
|
|
|
category:blog;"
|
|
|
|
|
href="//wxcafe.net">flattr</a>
|
|
|
|
|
<li><a href="https://twitter.com/wxcafe"><i class="icon-twitter icon-large"></i> Twitter</a></li>
|
|
|
|
|
<li><a href="https://github.com/wxcafe"><i class="icon-github icon-large"></i> Github</a></li>
|
|
|
|
|
<li><a href="mailto://wxcafe@wxcafe.net"><i class="icon-envelope icon-large"></i> Email</a></li>
|
2015-09-03 19:58:32 +02:00
|
|
|
|
<li><a href="https://pub.wxcafe.net/wxcafe.asc"><i class="icon-key icon-large"></i> Gpg</a></li>
|
|
|
|
|
<li><a href="https://www.openstreetmap.org/relation/105146"><i class="icon-map-marker icon-large"></i> IRL</a></li>
|
2014-11-24 22:52:53 +01:00
|
|
|
|
|
|
|
|
|
<hr>
|
|
|
|
|
|
|
|
|
|
<!-- Links -->
|
|
|
|
|
<li class="nav-header"><h4><i class="icon-external-link"></i> Links</h4></li>
|
|
|
|
|
<li><a href="https://github.com/wxcafe/blog-source"><i class="icon-code icon-large "></i> Source!</a></li>
|
|
|
|
|
<li><a href="http://git.wxcafe.net"><i class="icon-github-sign icon-large "></i> Public Git</a></li>
|
|
|
|
|
<hr>
|
|
|
|
|
|
|
|
|
|
<!--- RSS feed -->
|
|
|
|
|
<li class="nav-header"><h4><i class="icon-rss"></i> feeds</h4></li>
|
|
|
|
|
<li><a href="//wxcafe.net/feeds/feed.rss.xml" rel="alternate"><i class="icon-bookmark-empty icon-large"></i> RSS</a></li>
|
|
|
|
|
<li><a href="//wxcafe.net/feeds/feed.atom.xml" rel="alternate"><i class="icon-bookmark-empty icon-large"></i> Atom</a></li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</ul> </div><!--/.well -->
|
|
|
|
|
</div><!--/row-->
|
|
|
|
|
<hr>
|
|
|
|
|
<footer>
|
|
|
|
|
<address id="about">
|
|
|
|
|
Proudly powered by <a href="http://pelican.notmyidea.org/">Pelican</a>,
|
|
|
|
|
which takes great advantage of <a href="http://python.org">Python</a>.<br />
|
|
|
|
|
Powered by <a href="https://github.com/getpelican/pelican-themes/tree/master/bootstrap2">bootstrap2</a> theme, thanks!
|
|
|
|
|
</address>
|
|
|
|
|
</footer>
|
|
|
|
|
</div><!--/.fluid-container-->
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|