lundi 3 janvier 2011

Demenagement

Bon, ca fait un moment que j'ai eut marre de Blogger et les galères pour mettre du code ou travailler avec. du coup j'ai monter un wordpress chez Byethosts et je bascule petit a petit les articles que j'ai besoin de garder et je ferai la mise en forme / re-encodage des que j'ai 5 minutes :

voici ou vous pourrez suivre les derniers actus :

pint2stone.byethost12.com

jeudi 30 décembre 2010

Mon premier Module Joomla #4

Mod_server_health.php et helper.php

Les fichiers mod_server_health.php et helper.php sont les fichiers ou tout la magie se passe.

Voici le fichier mod_server_health.php

<?php
//empeche les autres scripts d'executer notre fichier !! tres important pour la securité
defined('_JEXEC') or die('Direct Access to this location is not allowed.');

// inclure le fichier helper qui contient nos fonctions
require_once(dirname(__FILE__).DS.'helper.php');

//on recupere nos paramettres saisi dans le paneau d'administration de Joomla par l'admin du site. on notera les noms identiques ici et dans le fichier XML
$domainbase = $params->get('domainbase');
$domainbase = str_replace("http://","",strtolower($domainbase));
$domainport = $params->get('domainport');

//on execute notre fonction pour verifier si notre serveur repond. on notera ModServerHealthHelper:: corepond a class ModServerHealthHelper du fichier helper.php
$status = ModServerHealthHelper::pingDomain($domainbase, $domainport);

//verifie l'etat de notre serveur maintenant que la fonction c'est executé. on notera JText::_('IS_ALIVE') va recuperer les chaines de texte traduits de notre fichier de langue ini
if ($status != -1)
{
 $text = $domainbase." ".JText::_('IS_ALIVE')." (".$status." ms)";
}
else
{
 $text = "<span style='color:red'>".$domainbase." ".JText::_('IS_DOWN')."</span>";
}

//on inclus le fichier tmpl/default.php pour l'affichage
require(JModuleHelper::getLayoutPath('mod_server_health'));

?>

Le fichier helper.php

<?php
//empeche les autres scripts d'executer notre fichier !! tres important pour la securité
defined('_JEXEC') or die('Direct Access to this location is not allowed.');
//on créer notre class
class ModServerHealthHelper
{
 // et notre fonction pingDomain
 public function pingDomain($domain, $port)
 {
  $starttime = microtime(true);
  $file      = fsockopen ($domain, $port, $errno, $errstr, 10);
  $stoptime  = microtime(true);
  $status    = 0;

  if (!$file) $status = -1;  // Site est coupé
  else {
   fclose($file);
   $status = ($stoptime - $starttime) * 1000;
   $status = floor($status);
  }
  return $status;
 }
}
?>

Et enfin pour l’affichage, notre fichier default.php …

<?php
//on affiche le texte
echo $text;
?>

Ce fichier mériterait de recevoir plus d’informations et d’en enlever au fichier mod_server_health.php. Mais ca n’empêche pas le bon fonctionnement du module.

Enfin il ne reste plus qu’a zipper le dossier mod_server_health et de l’envoyer sur notre serveur web Joomla pour l’installer comme n’importe quel module.

Et le voici sur mon site http://teamstarbug.byethost12.com qui surveille mon serveur mumble.
 Ceci est un exemple assez simple mais deja plus poussé que le "Hello World" habituel. si vous avez compris ceci sans problemes particuliers, vous pouvez attaquer des modules plus complexe.

Bon courage et bon code.

Stone

liens vers la serie complet :
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-1.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-2.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-3.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-4.html

Mon premier Module Joomla #3

Les fichiers xml et ini

Vous pouvez télécharger tout ces fichiers à :
http://sites.google.com/site/pint2stone/mod_server_health.zip

Ici je vais presenterr le fichier mod_server_health.xml avec les commentaires en français :

<?xml version="1.0" encoding="utf-8"?>
<install type="module" version="1.5.0">
    <!-- Le nom du module -->
        <name>Server Health</name> 
 
    <!-- Nom de l'auteur -->
        <author>Stone</author> 
 
    <!-- date de notre version actuel -->
        <creationDate>2010-12-23</creationDate> 
 
    <!-- Copyright -->
        <copyright>Aucun copyright, que ceci sert d'exemple</copyright> 
 
    <!-- Information sur la license -->
        <license>utilise ceic et ameillore le, au pire GPL 2.0 !</license> 
 
    <!-- Adresse mail de l'auteur -->
        <authorEmail>Aucun@rien.fr</authorEmail> 
 
    <!-- site web de l'auteur -->
        <authorUrl>pint2stone.blogspot.com</authorUrl> 
 
    <!-- Numero de version actuel -->
        <version>1.1.0</version> 
 
    <!-- decrit le fonctionnement du module -->
        <description>Verifie si un serveur repond sur un certain port, exemple : www.google.com sur le port 80</description>
 
    <!-- Liste de tout les fichiers qui doivent etre installés -->
        <files>
        <!-- l'attribue "module" signifie que ceci est le fichier de controle principal -->
                <filename module="mod_server_health">mod_server_health.php</filename>
                <filename>index.html</filename>
    <filename>helper.php</filename>
    <filename>tmpl/default.php</filename>
    <filename>tmpl/index.html</filename>
        </files>
  <languages>
   <!-- Tout les fichiers de langue a inclure -->
   <language tag="en-GB">en-GB.mod_server_health.ini</language>
   <language tag="fr-FR">fr-FR.mod_server_health.ini</language>
  </languages>

    <!-- Les options configurables du module -->
        <params>
 
        <!-- Les paramettres qui permettenet à l'admin du site de modifier le serveur et le port a tester -->
  <!-- le defaut est ceux qui est present par defaut dans les cases, ca sert d'aide -->
  <!-- label et description sont les titres et les descriptions, ces valeurs sont recuperer depuis les fichiers langues -->
        <param name="domainbase" type="text" default="www.google.com" label="DOMAIN TEST" description="DESC DOMAIN TEST" />
  <param name="domainport" type="text" default="80" label="DOMAIN PORT" description="DESC DOMAIN PORT" />
    </params>

</install>

Ceux qui nous donne ceci dans Joomla :


Tout les autres paramètres du fichier sont utilisé lors de l'install du module dans Joomla. les plus importants sont les fichiers a installer (ne pas se tromper de nom ni les oublier). Tout les autres peuvent être gérer dans le code mais votre module sera moins flexible sans les paramètres proposé à l'administrateur du site et moins atreyant si on est obligé de démonter tout votre code pour le traduire.

Et voici le contenu du fichier fr-FR.mod_server_health.ini

DOMAIN TEST=Domaine a tester
DESC DOMAIN TEST=Le domaine que vous souhaitez verifier
DOMAIN PORT=Port du domaine
DESC DOMAIN PORT=Le port sur laquel vous souhaitez tester
IS_ALIVE=est ACTIVE
IS_DOWN=ne repond pas


Les 4 premiers lignes corespondent aux traductions de nos paramettres dans le fichier xml. Les deux derniers sont pour l’affichage sur le site.

liens vers la serie complet :
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-1.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-2.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-3.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-4.html

Mon premier Module Joomla #2

L’arborescence


Joomla est un CMS très puissant et surtout flexible grâce à son gestion de modules. Vous pouvez vous informer des possibilités de Joomla sur le site :
www.joomla.fr

Je me suis largement basé sur cet exemple pour le module Joomla :
http://docs.joomla.org/How_to_create_a_module

et voici le module finalisé
http://sites.google.com/site/pint2stone/mod_server_health.zip

Un module Joomla demande une arborescence assez rigoureuse. Je n’ai pas su si c’était obligatoire mais en tout cas, c’est des bonnes méthodes a prendre pour vous faciliter la vie plus tard.

On créé en premier un dossier modules (il ne nous servira pas mais c'est pour l'organisation)
la dedans on aura un dossier pour chaque module avec le nom final de notre module sans espace. il faut également qu'il commence par "mod_" pour respecter les appellations dans Joomla!. enfin dans ce dossier mod_... on place un dossier tmpl pour stocker nos fichiers de mise en page (template)


Les fichiers dans mod_server_health



Et les fichiers dans tmpl



Les index.html sont des fichiers vides, ils ont pour but de sécuriser le dossier. Si malencontreusement, quelqu’un arrive à faire pointer son navigateur sur votre dossier, par défaut il voit la liste de tous les fichiers. Le fait de mettre un index.html empêche ce fonctionnement et affichera cette page par défaut.


Les deux fichiers ini sont en fait des fichiers de langues. Tout le texte à afficher sera placé dans ces fichiers. Ensuite, en fonction de la langue, Joomla va chercher le texte correspondant. Ici j’ai créé le module en anglais (en-GB) et français (fr-FR).

Le fichier helper.php sert a stocker les fonctions php qu’on a créer (pour nous ca sera notre « PingDomaine ») et le fichier mod_server_health.php fera tout le traitement.

Mod_server_health.xml est le fichier de configuration nécessaire pour l’installation du module dans Joomla. C’est lui qui va dire a joomla les fichiers présents et les paramètres a créer.

Les fichiers dans tmpl (ici default.php) sont les fichiers de mise en page (Template) qui feront l’affichage final.

Chose important : on remarquera que les fichiers et le dossier parent ont tos le même nom, mod_server_health. Il faut respecter cette méthode et garder le nom identique tout au long du paramétrage.

liens vers la serie complet :
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-1.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-2.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-3.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-4.html

Mon premier Module Joomla #1

La création du script pingdomaine en PHP

Voici un petit descriptif sur la création d’un module très simple pour Joomla. J’espère qu’il vous permettra de comprendre comment fonctionnes les modules dans cette excellent CMS.

C’est mon premier tentative donc il y’ a surement des choses à améliorer.

Le but de ce module est de savoir en un coup d’œil si un serveur est actif ou non. J’avais besoin de ce genre d’outil pour vérifier le bon fonctionnement de plusieurs serveurs sur le net ou en interne.

Pour commencer, un petit script PHP qui va faire notre vérification. Le script d’origine vient de ce site :
http://www.phptoys.com/e107_plugins/content/content.php?content.41

Il n’y avait aucun mention de licence sur le site donc je me suis inspiré des commandes trouvés.

Voici la fonction PHP que nous allons utiliser :

<?php 

// Function to check response time
function pingDomain($domain, $port){
    $starttime = microtime(true);
    $file      = fsockopen ($domain, $port, $errno, $errstr, 10);
    $stoptime  = microtime(true);
    $status    = 0;

    if (!$file) $status = -1;  // Site ne reponds pas
    else {
        fclose($file);
        $status = ($stoptime - $starttime) * 1000;
        $status = floor($status);
    }
    return $status;
}
?>

Vous pouvez vérifier le bon fonctionnement en collant ce code dans un “index.php” et le lancer en local. Attention, il faut que la fonction PHP fsockopen() soit activé chez votre hebergeur.
<html>
<head>
<title>Test Ping en PHP</title>
</head>
<body>
<?php    

// Function to check response time
function pingDomain($domain, $port){
    $starttime = microtime(true);
    $file      = fsockopen ($domain, $port, $errno, $errstr, 10);
    $stoptime  = microtime(true);
    $status    = 0;

    if (!$file) $status = -1;  // Site ne reponds pas
    else {
        fclose($file);
        $status = ($stoptime - $starttime) * 1000;
        $status = floor($status);
    }
    return $status;
}

    
        $domainbase = ‘www.google.fr’;
        $domainbase = str_replace("http://","",strtolower($domainbase));
        $port = ‘80’;

        echo '<table>';

        $status = pingDomain($domainbase, $port);
        if ($status != -1) echo "<tr><td>http://$domainbase est active ($status ms)</td><tr>";
        else  echo "<tr><td>http://$domainbase ne repond pas</td><tr>";

         echo '</table>';

?>
</body>
</html>

ceux qui nous donne ceci :

Prochain article, comment intégrer ceci dans Joomla

liens vers la serie complet :
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-1.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-2.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-3.html
http://pint2stone.blogspot.com/2010/12/mon-premier-module-joomla-4.html

mercredi 21 octobre 2009

Exemple de Phishing recent

Petit article rapide pour vous avertir d'un nouveau Mail destiné a vous escroquer.
Cette fois ci c'est en essayant de se faire passer pour les impôts que les escrocs veulent obtenir vos données bancaires. Voici un mail reçu aujourd'hui :


DIRECTION GENERALE DES FINANCES PUBLIQUES 20/10/2009           Notification d'impôt - Remboursement


Après les derniers calculs annuels de l'exercice de votre activité, nous avons déterminé que vous êtes admissible à recevoir un remboursement d'impôt de € 178,80.


S'il vous plaît soumettre la demande de remboursement d'impôt et nous permettre de 10 jours ouvrables pour le traitement.


Pour accéder au formulaire pour votre remboursement d'impôt, cliquez ici
Un remboursement peut être retardé pour diverses raisons. Par exemple la soumission des dossiers non valides ou inscrivez après la date limite.
Le Conciliateur fiscal adjoint


Signature graphique (en image donc illegale)




Philippe B***** (caché volentairement vu que c'est surement un faux nom)
 

Bien sur quand on clique sur le lien en question (désactive ici pour cause de sécurité), on tombe sur ce page :







On noter de suite la demande de code de carte bleu pour le remboursement (perso on m'a toujours dit qu'un carte bleu était pour payer, pas pour recevoir de l'argent !!). Puis, en regardent de plus prés, l'adresse du site (semi masqué ici pour éviter la tentation) :
-en Http et pas https. Ce site n'est pas du tout sécurisé.
-pas de cadenas pour confirmer que ce site est sécurisé pour les données confidentielles (idem que au dessus)
-adresse bizarre avec des chiffres (l'adresse IP)


Ce message sent le faux à plein nez mais il faut avouer que c'est bien penser au moment des impôts!


Bien sur, au cas ou vous n'aurez pas compris; IL NE FAUT PAS SAISIR LES CODES DE SA CARTE BLEU SUR CE SITE. Des qu'on clique sur valider, c'est des retraits qui vont être fait et non des remboursements; des que les pirates ont votre code carte bleu et le code pin, ils peuvent partir en vacance a vos frais ! Ceci dit, les impôts c'est fait pour ça (dit le président !!!)


Je ne peut pas vous en dire plus vu qu'à l'heure que j'écris ces lignes, le site en question est inaccessible. Mais pour la petite histoire, j'ai essayé de rentrer des faux numéros de carte de crédit et il y avait quand même une vérification. Ceci implique une vrai réflection de la part des escrocs et assez rare pour ce genre de phishing.


Sur ceux, un internaute avertis en vaut deux !

Cordialement

Stone

PS : je précise qu'un signature scaner est illégale. il m'a toujours sembler que c'était le cas mais si quelqu'un peut m'indiquer un lien vers un article confirmant ou réfutant car je n'ai rien trouver de concret sur mon ami google.

jeudi 3 septembre 2009

Le Social Engineering


Es que vous avez déjà entendu le terme de Social Engineering ? Si la réponse est non, alors ouvrez grand les yeux et lisez la suite …

issu de notre ami Wikipédia

L'ingénierie sociale (social engineering en anglais) est une forme d'escroquerie utilisée en informatique pour obtenir un bien ou une information. Cette pratique exploite l'aspect humain et social de la structure à laquelle est lié le système informatique visé. Utilisant ses connaissances, son charisme, l'imposture ou le culot, le hacker abuse de la confiance, l'ignorance ou la crédulité, de personnes possédant ce qu'il tente d'obtenir. Dans son ouvrage L'art de la supercherie, Kevin Mitnick a théorisé et popularisé cette pratique qui vise le facteur humain d'un système informatique pour briser sa sécurité.

Tout simplement, on va utiliser votre bonne volonté ou vous mettre en situation de panique pour vous estoquer des informations. Ces infos peuvent paraître anodin a vos yeux mais il est assez simple de réunir plusieurs petits bouts d'information pour arriver a nos fins.

Pour commencer à vous faire peur, je vais donner quelques exemples allant du plus simple a plus complexe et tordus.

1 ) La récupération des infos sans intervention humaine

Grâce au web 2.0 et les réseaux sociaux, on à accès à ÉNORMÉMENT DE DONNÉES PERSONELLES. Facebook et copains d'avant sont mes sites préférés pour trouver des infos juteux. D'autres sites peuvent également vous fournir des informations sur la personne souhaité. Google est LE maitre à ce jeux. Si si, tapez le nom et le prénom de quelques amis présents sur le net (de préférence entre « » pour que google cherche le nom entier et non les deux sépares). Vous serai surpris des infos qu'on retrouve. On trouve également des sites comme des forums ou des sites de rencontres qui contiennent des données perso.
Mais, vous allez me dire que les infos qu'on met sur ces sites ne servent a rien … ben voyons !!
exemple : levez la main, combien de personnes ont comme mot de passe :
- leur date de naissance
- leur nom / prénom
- nom / prénom des enfants
- quelque chose en rapport avec leur passion
- nom des animaux
- lieu de naissance
- nom / prénom avec date de naissance / département
en gros quelque chose en rapport direct avec vous même !!!

maintenant, regardez sur les sites ou vous êtes inscrits, on peut facilement retrouver votre nom de connexion (souvent affiché comme pseudo) et / ou votre adresse email (utilisé par beaucoup de sites pour se connecter). Le pirate informatique a maintenant tout les infos dont il a besoin pour accéder a votre compte. Et bien sur, vous utilisez le même mot de passe partout, donc des que le pirate retrouve votre adresse mail ou pseudo sur un autre site, il y a également accès.

Edit : Numerama viens de confirmer ce dernier par un chiffre ... plus d'un français sur deux n'ont qu'un seul mot de passe pour tout !!! Bravo la securité
http://www.numerama.com/magazine/13823-Un-seul-mot-de-passe-pour-plus-de-la-moitie-des-Francais.html


En poussant un peu plus loin que l'informatique, un petit article que j'ai lu cette semaine montre bien le danger des réseaux sociaux. Comme information, on a souvent votre adresse ou même une carte ou vous avez définis votre lieu d'habitation. Puis vous allez partir en vacance et vous souhaitez que tous vos amis virtuels sachent que vous n'allez pas être dispos pendant une semaine … donc on le précise sur notre site préféré. Dommage, justement un bande de voleurs passait dans votre cartier pendant cette semaine la, ils ont était soulagé de savoir que vous étés en vacance et que personne ne viendra les déranger pendant qu'ils vident votre maison.

Maintenant, faites un essai, ouvrez un compte bidon sur votre site d'amis préféré, calculez combien de temps il faut pour la créer, regardez la quantité d'information déjà disponible. Maintenant envoyez une invitation a votre vrai compte, acceptez le et ré-regardez tout les infos disponibles. Maintenant, de combien de personnes vous avez acceptez les invitations sans savoir qui ils étaient vraiment ??

En décalé avec la récupération des infos, les premiers mots de passe qu'on test lorsqu'on essaye de rentrer sur le compte de quelqu'un sont :
- azerty (regardez votre clavier)
- 123, 456, 1973, ou une autre combinaison de chiffres en croix ou en ligne
- même chose que l'identifiant du site
- nom du site en question (pour Facebook on essayera comme mot de passe « Facebook »)

Moralité : ne jamais laisser des informations trop confidentielles sur le net et TOUJOURS utiliser des mots de passe sécurisés


2 ) le coup de fil

Ici je vais parler d'un histoire (que j'ai inventé) basé sur une connexion internet, mais on peut imaginer énormément de situations avec le même principe.

Vos codes d'accès à internet et au site de gestion de votre fournisseur d'accès sont très précieux, c'est grâce à eux que vous pouvez consulter vos mails et naviguer sur le net.

Un jour, vous recevez un coup de fil :

Opérateur : oui, bonjour, je fait parti du service juridique de « placez votre opérateur ici »,

Vous : oui, bonjour (voix tremblant et hésitant, il n'est jamais bon d'avoir le service juridique de votre fournisseur en ligne)

Opérateur : on a détecter que votre compte internet à était utilisé pour plusieurs attaques informatiques qui ont détourné plusieurs millions d'euros au cours du derniers mois. Es que vous niées les faits ??

Vous : mais, mais, je n'y connait pas grand chose en informatique, comment voulez vous que je pirate quelque chose …

Opérateur : OK calmez vous, aucune procédure n'a était lancé pour le moment. Il est possible que votre ordinateur soit infecté d'un virus informatique et qu'un pirate ait utilisé votre machine a votre insu a distance. Mais pour le prouver, il me faudrait vos identifiants de connexion et votre adresse mail pour vérifier vos heures de connexion à internet.

Vous, complètement paniqué : oui, oui, bien sur, je vais les chercher de suite … voilà, alors mon adresse mail est « votre adresse ici » et mes identifiants sont « vos identifiants ici ».

Opérateur : OK merci beaucoup, je vous ré-contacterai des qu'on a analysé les données. Beep, Beep, Beep

Bien sur cette histoire est un peu courte mais vous comprenez le principe. Un pirate informatique (un vrai) vous appelle et vous met en situation de stresse, puis vous indique que rien ne va se passer si vous donnez des infos confidentielles. Bien sur vu qu'il se fait passer pour quelqu'un qui est en rapport avec ces données, ça ne paraît pas complètement anormal. Et puis vous donnez par téléphone, a un parfait inconnu, les informations dont il demande.

Il faut savoir qu'on ne vous demandera jamais des informations confidentiels comme celles-ci par téléphone, ni par mail. Ceux qui vient a mon 3eme exemple

3 ) le Phishing ou hameçonnage en français.

Voici un exemple trouvé sur le net (chez http://www.francoisrodrigue.com/blogstory/2007/03/01/318-astuce-anti-phishing)


Vous recevez un mail de votre banque indiquant que des transactions frauduleux ont était commis avec votre compte, et qu'il faut cliquer sur un lien ou votre compte sera bloqué.

On prend peur et on clique sur le lien proposé. Ici l'image montre que notre navigateur libre et sécurisé (Firefox) nous avertis mais ce n'est pas toujours le cas si l'attaque est récent.

Le site est quasiment identique au site de notre banque et on nous demande simplement nos coordonnées bancaires.

Bien sur, vous l'avez deviné, c'est un faux site qui n'a rien a voir avec votre banque. mais si vous saisissez vos coordonnées, ils seront immédiatement envoyés à un pirate informatique qui n'a plus qu'a se servir...

Bien sur, ces exemples sont assez simples et on vois de suite les failles, mais on peut imaginer à une plus grande échelle. Par exemple, on peut passer des coups de fil au hasard dans une entreprise en disant qu'on fait parti du hotline et qu'on vous rappelle comme demandé. A force, on tombera bien sur quelqu'un qui a un souci informatique et qui fera tout ceux que vous demandez par téléphone dans l'espoir de retrouver son poste de travail en état.

Ou sinon, le coup classique mais moins accès informatique. Arriver devant une GRANDE entreprise (celle ou on ne peut connaitre tout le monde) et faire comme si on avait oublié son badge d'accès, quelqu'un vous ouvrira par gentillesse.

On pourra pousser encore plus loin, mais pour réussir, la plus part des attaques par social engineering demandent quelques connaissances a propos de la personne ou de l'entreprise. Faites attention a ceux que vous mettez dans vos poubelles ...

Je ne peut que finir par une petite traduction d'un citation de Kevin Mitnick :

On peut dépenser une fortune sur des logiciels de sécurité, mais votre réseau sera toujours vulnérable face à une bonne veille manipulation des utilisateurs (Kevin Mitnick)

Tout les images sauf les deux captures de mail sont issus de http://openclipart.org. les deux captures pour l'exemple du phishing sont issus de http://www.francoisrodrigue.com
(merci à lui pour son accord d'utilisation) et ne sont pas soumis au licence suivant. contactez les auteurs respectifs pour ces images.

Creative Commons License
Cette création est mise à disposition sous un contrat Creative Commons.