Même si le but n’a pas été atteint pour l’instant, de premiers résultats intéressants sont présentés :)
Pré-requis
- Avoir activer l’interface XML-RPC sur le blog à exporter
- Avoir configuré Blurb – ou plutôt le Java Runtime Engine qui fait tourner Blurb – pour le faire écouter sur le port proxy localhost:8080 (plus de détails pourquoi ci-après)
1. Configuration de DotClear
Afin de respecter les bonnes pratiques de sécurité, nous allons créer un compte utilisateur dans DotClear ayant juste les permissions requises pour l’export des billets. Après avoir crée le compte blurp, on lui attribue la permission “gérer tous les billets et commentaires” pour le blog à exporter.
Dans les paramètres du blog, assurez-vous tout en bas de la page que l’interface XML-RPC est bien activée. Notez également l’URL du serveur.
2. Mise en place sur le poste de travail
Je pars de l’idée que Blurp est installé sur l’ordinateur et que les paramètres de proxy de la JRE utilisée par Blurp ont été édités comme suit:
- http.proxyHost=localhost
- http.proxyPort=8080
- http.proxyHost=localhost
- http.proxyPort=8080
Afin d’auditer voire éditer les requêtes que Blurp va faire, nous allons installer Burp – un outil fréquemment utilisé pour l’audit de sécurité d’application web. La version gratuite est de loin suffisante pour les besoins que nous allons avoir.
Finalement, il est également nécessaire de noter l’adresse IP du site Internet hébergeant notre blog – dans cet exemple ce sera 93.88.254.17.
3. Début de l’analyse des flux HTTP de Blurb
Comme mentionné dans un précédent billet, il semble que DotClear ait maintenant une interface XML-RPC préférant l’API WordPress à Movable Type.
Dans la fenêtre d’import de blog, donnons les coordonnées de notre utilisateur blurb et sélectionnons comme service WordPress:
La requête interceptée par burp est la suivante:
POST /xmlrpc.php HTTP/1.1
Content-Type: text/xml
User-Agent: Blurb BookSmart 3.0.3
Cache-Control: no-cache
Pragma: no-cache
Host: wordpress.com
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Proxy-Connection: keep-alive
Content-Length: 199
<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params><param><value>blurp</value></param>
<param><value>[ceci fut mon mot de passe…]</value>
</param></params></methodCall>
4. Re-routage des requêtes vers notre blog
Burp va nous permettre de mettre un certain nombre de règles afin d’envoyer cette requête non pas chez WordPress.com mais directement sur notre blog. Pour ce faire, nous devons:
- faire en sorte que la requête parte sur notre blog au lieu de wordpress.com
- réécrire les URLs afin qu’elles soient adaptées pour DotClear
4.1 Correction de la résolution hostname - IP
Comme toutes les requêtes sont passées via notre proxy Burp, nous pouvons y changer l’assignation hostname – adresse IP. Cela se fait facilement dans l’onglet Options de Burp:
4.2 Redirection appropriée des URLs
Il est également nécessaire de corriger les URLs ainsi que le champ Host: de l’entête HTTP. Les options nécessaires à cela sont disponibles dans l’onglet Proxy – sous-onglet options – section match and replace.
Il est nécessaire d’ajouter les règles suivantes:
Type | Match | Replace |
request header | POST /xmlrpc.php | POST /[Votre URL]/index.php?xmlrpc/default |
request header | Host: wordpress.com | Host:www.ness.ch |
4.3 Test de connexion
Le grand moment est là – vérifions si nous arrivons à récupérer la liste des blogs:
Bingo, la liste nous est retournée!
5. Ce qui ne marche pas… encore
Malheureusement, la suite de l’import ne marche pas.
Au lieu d’utiliser des APIs standards XML/RPC, Blurb fait des requêtes spécifiques à WordPress et pour lesquels il n’existe pas d’équivalent DotClear – du moins d’après mes premières investigations. Telle était ma liste de règles Burp avant que j’abandonne provisoirement cette voie.
Type | Match | Replace |
request header | POST /xmlrpc.php | POST /[Votre URL]/index.php?xmlrpc/default |
request header | POST /wp-login.php | POST /[Votre URL]/admin/auth.php |
request header | POST /wp-admin/export.php\?download=true&author=all | POST /[Votre URL]/admin/plugin.php?p=importExport&t=e&f=dcExportFlat |
request header | Host: wordpress.com | Host:www.ness.ch |