Qui accède au « Tableau de bord » des sites WordPress de mon serveur ?

WordPress (login)

Page de connexion au Tableau de bord de WordPress

Commande

La commande bash suivante (à copier-coller d’un coup, toutes les lignes ensemble) :

find / -type f -path '*-access_log' \
-exec grep "/\(wp-admin/\|wp-login\.php\)" {} \; \
| sed 's/[^ ]* \([^ ]*\).*/\1/' \
| sort --general-numeric-sort \
| uniq --count \
| sort --general-numeric-sort

permet de lister les adresses IP (autant IPv4 que IPv6) ou les hôtes (selon la configuration des logs Apache) accédant au dossier wp-admin de l’ensemble des sites hébergés sur un serveur Debian ou Ubuntu.

Détail

Dans le détail, la ligne :

find / -type f -path '*-access_log' \

recherche la liste des journaux Apache où qu’ils soient dans l’arborescence du disque.

Ensuite, la ligne :

-exec grep "/\(wp-admin/\|wp-login\.php\)" {} \; \

ne retient que les lignes des journaux Apache contenant /wp-admin/ ou /wp-login.php, tous deux menant au Tableau de bord, le panneau d’administration de WordPress.

Par après, la ligne :

| sed 's/\([^ ]*\).*/\1/' \

efface tout ce qui suit l’adresse IP ou hôte, habituellement placé en début de ligne.

Maintenant que nous avons une IP ou hôte par ligne, on trie le tout pour rassembler les lignes identiques ensemble avec :

| sort --general-numeric-sort \

Ceci fait, on compte le nombre de lignes identiques consécutives :

| uniq --count \

Et enfin, affiche le résultat trié par nombre d’occurrences croissantes :

| sort --general-numeric-sort

Résultat

Le résultat donne quelque chose du style (les informations suivantes ont été volontairement modifiées) :

      1 31.29.301.41
      1 31.32.263.173
      1 31.36.312.214
      […]
     34 3a0g:e35:2f0d:hb0:1df7:fb22:9dd7:2935
     40 3a01:e35:2g0d:9b0:2i1c:h08a:7a57:279f
     49 482.236.374.193
     55 web.example.net
     81 3a01:e36:2f0c:9bi:3124:61h0:61bb:8650
    118 3a01:e36:2f0c:9bi:95c5:he19:80b8:e9dc
    177 3a01:e36:2f0c:9bi:7112:56he:bed1:77d5
    227 24.414.222.46
    503 184.23.298.47
   1599 96.220.346.170
   2909 89.242.208.257
   4088 11.293.225.19
   4088 146.114.271.42
   4092 97.162.264.79
   6458 54.91.261.2

Comme vous pouvez le voir ci-dessus, les informations indiquent le volume d’accès pour les adresses IPv4, IPv6 et les hôtes résolus selon les informations issues des journaux Apache. De cette manière, il est aisé de repérer les accès suspects.

Améliorations

On peut ajouter un wc -l pour compter les lignes de la sortie précédente. Cela permet de compter les adresses IP et hôtes différents tentant d’accéder au Tableau de bord, réussies ou non :

find / -type f -path '*-access_log' -exec cat {} \; \
| grep "/\(wp-admin/\|wp-login\.php\)" \
| sed 's/\([^ ]*\).*/\1/' \
| sort --general-numeric-sort \
| uniq --count \
| sort --general-numeric-sort \
| wc -l

À titre d’information, je compte 7914 adresses différentes sur le mois d’avril 2013. Cela fait beaucoup pour tout au plus 4 utilisateurs légitimes.

En bonus, comptons la quantité de tentatives de connexion :

find / -type f -path '*-access_log' -exec cat {} \; \
| grep "/wp-login\.php" \
| grep "POST \(.*\)/wp-login\.php" \
| wc -l

Sur mon serveur, j’obtiens ainsi 29818 tentatives de connexion pour avril 2013. Sachant que cookies aidant, les utilisateurs légitimes passent rarement par la page de connexion, on peut légitimement en déduire qu’on a presque autant de connexions douteuses.

Conclusion

Ces quelques lignes doivent nous rappeler l’importance d’avoir des mots de passes forts en matière d’accès au Tableau de bord de WordPress. Avec près de trente mille tentatives d’intrusion en provenance de huit mille adresses différentes en moins d’un mois, il est clair que WordPress est une plateforme de publication ciblée par les criminels Internet.

Comments

  1. mais que serait on sans ces commandes bien pratiques… à force je me suis fait tout une batterie de scripts parsant mes logs web pour avoir facilement les referrers, nombre de pages par visiteurs ou autres en fonction de ce que je recherche ;)
    ps: rapport à ton dernier tweet, ceci est un commentaire posté en #ipv6. content ? ;-)

  2. allez tant qu’on y est:

    cat /var/log/apache/access.log | awk '{print $11,"-->",$7}' | sort | uniq -c | sort -n

    comment recuperer les referrer ainsi que le billet visé, leur nombre en les triant par ordre de grandeur.
    (fait pour du log nginx, mais normalement apache a les memes colonnes dans ses logs, si je ne m’abuse ;))

Speak Your Mind

*