Récupérer des fichiers pdf en masse sur Archive.org

Récupérer des fichiers pdf en masse sur Archive.org

Le site d’archivage du web bien connu Archive.org ne stocke pas seulement les versions des sites internet qu’il scrute. Il collecte et indexe également les fichiers déposés sur ces serveurs, et notamment les fichiers pdf. Dans le cadre d’une recherche OSINT, il peut être intéressant de les récupérer pour une exploitation ultérieure. Toutefois cette opération n’est pas triviale à réaliser. Certes, il existe quelques outils de scraping disponibles sur Github tels que wayback-machine-downloader, ou waybackpack, mais le rendu est très aléatoire et il vous faudra alors télécharger l’intégralité des archives et des fichiers dont au fond, vous n’avez pas besoin.

La liste des fichiers disponibles pour un site internet se récupère en ajoutant /* à la fin de l’URL d’archive.org. Ainsi, pour le site d’un célèbre industriel de l’optique français, on peut visualiser le résultat ainsi :

 https://web.archive.org/web/*/https://e***lor.fr/*

Au bout de quelques secondes, vous devriez voir apparaître cette liste dans un tableau filtrable, et en entrant pdf à droite, une liste de 68 documents référencés « pdf » devrait se matérialiser. (Merci Henk pour cette astuce!)

Capture d'écran d'une recherche sur Archive.org

A ce stade, il est possible de remarquer trois choses importantes :

  • Le filtrage est instantané, ce qui laisse supposer que la liste complète des URLs est déjà chargée dans le navigateur et le filtre se fait sans doute par un petit morceau de javacript qui agit uniquement sur l’affichage
  • Le filtre s’applique à la fois sur le titre et à la fois sur le type de fichiers, mais n’est pas très intelligent. Ainsi un fichier dfdfgfdgfgdPDFhjkjhkjh.exe sera sans doute considéré comme un pdf. Le nombre de fichiers final réel obtenu sera sans doute inférieur…
  • Les URLs présentées dans le tableau sont celles du site internet d’origine mais lorsqu’on passe la souris au-dessus du nom de fichier, on constate que le site archive.org ajoute son propre préfixe. Ainsi http[:]//www.nomdorigine.fr/blablabla.pdf devient https[:]//web.archive.org/web/*/http[:]//www.nomdorigine.fr/blablabla.pdf.

Pour un site internet référençant une cinquantaine de documents, il est sans doute humainement faisable de cliquer sur ces liens manuellement, mais récemment, Henk Van Ess a sollicité notre aide pour collecter beaucoup de documents ainsi archivés. Voici la méthodologie que nous avons employé pour résoudre rapidement ce problème sans trop abuser de code, avec les outils dont nous disposons, et en cherchant surtout à comprendre le mode d’archivage et d’accès à ces fichiers.

Idées en vrac, concept et première étape

Il est assez aisé à l’aide d’une simple ligne de commande sous Linux ou Mac (et sans doute sous windows), de télécharger une par une le contenu d’une liste d’URLs, à l’aide de la commande curl. La commande suivante, trouvée sur une simple recherche google, par exemple, fonctionnera très bien.

cat urls.txt | xargs curl -O

Encore faut-il confectionner cette liste d’URLs sur la base de ce que nous obtenons sur Archive.org…

Pour ce faire, nous allons utiliser les Outils de Développement de Firefox, et plus particulièrement l’outil réseau (CRTL+MAJ+E). Rechargeons la page qui nous intéresse une fois l’outil ouvert et regardons les appels et réponses réseau d’Archive.org.

Outil de capture réseau openfacto

Une requête GET, à gauche attire l’attention car elle, ou plutôt sa réponse, est assez volumineuse, et son résultat à droite se présente comme un fichier json, contenant les informations qui nous intéressent, dans un format façon tableau… Précisément ce que l’on cherche!

En cliquant bouton-droit sur cette requête, nous pouvons la copier « comme cURL« . Elle devrait ressembler à cela :

curl 'https://web.archive.org/web/timemap/?url=https%3A%2F%2XXXXXXXXXXXXX.fr%2F&matchType=prefix&collapse=urlkey&output=json&fl=original%2Cmimetype%2Ctimestamp%2Cendtimestamp%2Cgroupcount%2Cuniqcount&filter=!statuscode%3A%5B45%5D..&limit=100000&_=1587306861252' -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0' -H 'Accept: application/json, text/javascript, /; q=0.01' -H 'Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3' --compressed -H 'X-Requested-With: XMLHttpRequest' -H 'Referer: https://web.archive.org/web//https://XXXXXX.fr/' -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Cookie: AMCV_164E38XXXXXX490D4C%40AdobeOrg=283337926%7CMCIDTS%7C18102%7CMCMID%7C77968272189954300089117009554471977435%7CMCAID%7CNONE; TC_PRIVACY=0@004@ALL; TC_PRIVACY_CENTER=ALL; TCPID=120161141189615912963; _ga=GA1.2.513757518.1580664249; didomi_token=eyJ1c2VyX2lkIjoiMTcxNjM5ZDMtMDZmYS02YTMyLTk5NjktMTg5ZWIwY2U4YTIxIiwiY3JlYXRlZCI6IjIwMjAtMDQtMTBUMTA6MjI6NTguMzg3WiIsInVwZGF0ZWQiOiIyMDIwLTA0LTEwVDEwOjIyOjU4LjM5MFoiLCJ2ZW5kb3JzIjp7ImVuYWJsZWQiOltdLCJkaXNhYmxlZCI6W119LCJwdXJwb3NlcyI6eyJlbmFibGVkIjpbXSwiZGlzYWJsZWQiOltdfX0=; kameleoonVisitorCode=_js_ktp4lh5rbmhpipze; _ga=GA1.3.513757518.1580664249; __gads=ID=0aa53a95ef3fef38:T=1586714223:S=ALNI_MZsG0jStcyGTwcb55eVAk8XPvaVkw; amplitude_id_78b8350dea58b176a6bc95ccdb8db850archive.org=eyJkZXZpY2VJZCI6IjA1OWYxODY1LTJmNmYtNGIwMC1iNjUxLWU2NDQ4NDQ1MjkxYlIiLCJ1c2VySWQiOm51bGwsIm9wdE91dCI6ZmFsc2UsInNlc3Npb25JZCI6MTU4NjcxNDUzMTc0MiwibGFzdEV2ZW50VGltZSI6MTU4NjcxNDU1MDcwNCwiZXZlbnRJZCI6MCwiaWRlbnRpZnlJZCI6MSwic2VxdWVuY2VOdW1iZXIiOjF9; amplitude_unsent_78b8350dea58b176a6bc95ccdb8db850=%5B%5D; amplitude_unsent_identify_78b8350dea58b176a6bc95ccdb8db850=%5B%5D; algoliasearch-client-js=%7B%7D; at-rand=0.9707995413033423; __atuvc=3%7C16; at-lojson-cache-ra-5586a3457d766230=%7B%22pc%22%3A%22esb%22%2C%22subscription%22%3A%7B%22active%22%3Atrue%2C%22edition%22%3A%22BASIC%22%2C%22tier%22%3A%22basic%22%2C%22reducedBranding%22%3Afalse%2C%22insightsEnabled%22%3Afalse%7D%2C%22customMessageTemplates%22%3A%5B%5D%2C%22config%22%3A%7B%22_default%22%3A%7B%22widgets%22%3A%7B%22esb%22%3A%7B%22hideEmailSharingConfirmation%22%3Atrue%2C%22numPreferredServices%22%3A5%2C%22widgetId%22%3A%2271xk%22%2C%22creationTimestamp%22%3A1508587749775%2C%22hideDevice%22%3A%22none%22%2C%22position%22%3A%22bottom-right%22%2C%22services%22%3A%22facebook%2Ctwitter%2Cemail%2Cpinterest_share%2Caddthis%22%2C%22id%22%3A%22esb%22%2C%22__hideOnHomepage%22%3Afalse%2C%22toolName%22%3A%22Expanding%22%2C%22hideLabel%22%3Atrue%7D%7D%7D%7D%2C%22perConfig%22%3A%7B%7D%7D; google_pem_mod=788; google_experiment_mod30=724; google_experiment_mod13=321; google_experiment_mod26=662; google_experiment_mod29=688; google_experiment_mod31=899; google_experiment_mod7=758; google_experiment_mod12=128; google_experiment_mod21=103; google_experiment_mod6=780; google_experiment_mod5=482; __utma=268623735.1524382272.1586869540.1586869540.1586869540.1; __utmz=268623735.1586869540.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __unam=210261-17178cb9531-8f7567f-3' -H 'TE: Trailers'

Il est possible dans un terminal de rejouer cette requête et de rediriger le résultat vers un fichier json ou txt en collant cette commande et en ajoutant > listing.json à la suite, puis en tapant sur entrée.

A ce stade, nous avons utilisé les outils de développement web de Firefox pour :

  • analyser le mode de fonctionnement du site
  • repérer la bonne requête pour collecter notre donnée
  • rejouer cette requête et exporter ce résultat au format texte dans un terminal.

Nous disposons maintenant d’un fichier contenant nos URLs, la date de première indexation, la date de dernière indexation, et le type de fichiers. Nous allons nettoyer et enrichir ce fichier à l’aide d’OpenRefine.


Nous allons voir que le parcours n’est pas exempt d’embûches!!!

Openrefine à la rescousse….

OpenRefine permet d’ouvrir facilement un fichier json pour le convertir visuellement en un fichier tabulaire (excel, csv…). Mauvaise surprise, le fichier n’est pas correctement interprété : il n’est pas dans un format json correct!

Ce n’est pas important, car OpenRefine permet de l’interpréter comme un fichier CSV. En quelques clics et transformations, on obtient un joli tableau comme ceci :

Nota : l’objet de cet article n’est pas l’utilisation avancée OpenRefine, c’est pourquoi nous ne nous étendrons pas sur ces premières transformations. L’objectif est juste d’arriver à un fichier texte utilisable.

Nous avons ici un total de 5.766 URLS, mais en filtrant les pdf sur les deux premières colonnes, on obtient en réalité 68 résultats, ce qui est le résultat attendu :

Nous observons cependant ici une nouvelle fois que l’URL du document est toujours celle du site d’origine, nous allons donc ajouter le préfixe d’archive.org à celle-ci, par concaténation.

On pourrait croire que c’est gagné et que nous avons désormais un listing utilisable. Il n’en est rien…

En effet, pour ce type d’URLs, il existe trois possibilités :

  • Le fichier n’est indexé qu’une fois par Archive.org, et dans ce cas un clic sur ce lien aboutira effectivement au document.
  • Le fichier est indexé plusieurs fois et dans ce cas, le lien abouti à un calendrier de choix, ce qui empêche le téléchargement immédiat du document.
  • Dans ce deuxième cas, le document pdf peut être inclus dans une page et ne pas être téléchargeable au premier clic.

Pour parer aux deux premières problématiques, nous allons forcer notre URL à prendre la première version disponible (ou la dernière selon votre goût).
En effet, l’observation de l’URL correctement téléchargeable d’un document montre que le timestamp vient prendre la place de l’étoile dans l’URL.

https://web.archive.org/web/20150416062130/http://www.XXXXXX.fr/_pdf/Bilan_emissions_GES2011_XXXX_France.pdf

Il nous reste une dernière étape….

En analysant le code source d’une des pages, nous nous sommes rendus compte que, parfois, l’URL ne menait pas directement au document, mais à une page contenant ce document

Dans ce cas, l’URL contient une petite subtilité : le timestamp doit être suivi de « if_ » pour être pleinement effectif!!!

Nous y sommes! Nous disposons désormais d’une liste d’URLS parfaitement fonctionnelles menant directement à nos PDFs!!!

Quelques recommandations importantes!

Vous le voyez, en restant méthodique et en utilisant les outils que nous avons à disposition, il est possible de collecter assez rapidement des fichiers disponibles en sources ouvertes sur archive.org :

  • en analysant le contenu des échanges entre votre navigateur et le le serveur d’Archive.org pour récupérer une liste d’URLs
  • en analysant finement les URLs et le mode de fonctionnement du site Archive
  • en appliquant et en répliquant ces informations à notre fichier source

    Une fois votre fichier d’URLs constitué, vous pouvez vous lancer dans le téléchargement.

    Mais soyez raisonnables!
  • Inutile de surcharger Archive.org de requêtes massives. Prévoyez une temporisation aléatoire de deux à cinq secondes entre chaque requête
  • découpez éventuellement votre fichier en plusieurs morceaux et répartissez vos téléchargements de manière respectueuse
  • Utilisez éventuellement un logiciel comme JDownloader, qui vous permettra de régler plus finement vos limites de téléchargement.

Dernier conseil : Ne téléchargez JAMAIS ces fichiers directement sur le site original

PYTHON – Edition du 21 avril 2020

En suivant ce tutoriel, l’ami Yann Guégan a écrit un script python qui fait tout automatiquement.
Le script est téléchargeable ici.

Atelier – Exposing the Invisible / Exposer l’Invisible  – Rennes – 10/12 février 2020

Atelier – Exposing the Invisible / Exposer l’Invisible – Rennes – 10/12 février 2020

Exposing The Invisible

Les 10, 11 et 12 février 2020 s’est déroulé à Rennes (35), l’atelier « Exposer l’invisible » , organisé par Tactical Tech, et animé par Xavier Coadic. Cet atelier posait les bonnes questions : si l’investigation fait de plus en plus partie de notre quotidien, comment collecter et utiliser nos recherches afin de les diffuser et/ou stocker en laissant la moindre trace possible ? Qu’est ce qui constitue une bonne preuve ? Quels sont les éléments les plus importants pour mettre en place une bonne enquête ?
Cet atelier destiné à tous publics, se proposait donc de faire découvrir une collection de ressources collaboratives accessibles à toutes personnes intéressées par la collecte de preuves ou l’utilisation d’investigations comme forme d’engagement civique.

Sandy, adhérente à Open Facto, a pu participer à cet évènement et approfondir beaucoup de choses : les outils, la sécurité, la notion d’investigation…
Parmi ces outils, et outre les classiques GoogleDorks et HIBP, on signalera tout particulièrement :

  • ad.watch, qui propose de suivre l’activité de publicité des partis politiques sur les réseaux sociaux, y compris pour la France,
  • Nitter, une interface d’un nouveau genre pour Twitter, dont le code source est disponible sur Github, permettant de manipuler ce réseau social sans traqueurs publicitaire ni limitation d’API.
    Il est par exemple possible avec Nitter de consulter les médias d’un compte sans se connecter…

Au delà de ces outils de recherches, et pour élargir le panel bien au-delà des simples outils de recherche et de consultation en ligne, les participants ont pu découvrir Tails, la distribution linux bootable, qui est devenue sa meilleure amie durant cet atelier : découverte du concept de sécurité, et de la possibilité de se créer sa propre clé USB, permettant une mobilité et une flexibilité importante.

Pas forcément facile à apprivoiser tout de suite pour quelqu’un habitué à l’environnement Windows, l’accompagnement pédagogique de Xavier a permis une belle progression tout en douceur pour Sandy!

Les fondamentaux de l’utilisation des coffres fort à mots de passe, du chiffrements de disques  et de la bio-investigation ont bien évidemment été abordés!

On dit souvent qu’en matière d’OSINT, la collaboration est la clef, et pour le coup, la grande participation collective, tenant également au choix judicieux des lieux utilisés (cafés et différents lieux à l’extérieur, afin de sortir d’un cadre de type « réunion/formation »…)  a permis le bon déroulement de l’atelier.
Tous les participants ont pu échanger librement leurs idées, leurs compétences, leurs polyvalences et prendre le temps de s’aider. Un kit a été transmis à tous les acteurs de ce workshop.
Trois jours de bonnes surprises, avec une grande investigation sur le terrain afin de se rendre au plus près de l’invisible et d’en ressortir un nombre important d’éléments que l’on ne soupçonne pas à portée de notre main.

Débutants ou confirmés, n’hésitez jamais à participer à ce genre d’évènements et de formations très pratiques!!

Un grand merci à Xavier, un maître enquêteur! 😉

Atelier OSINT OpenFacto avec les étudiants de la formation Clinique du Droit International à Assas (Paris) les 25 et 26 janvier 2020

Atelier OSINT OpenFacto avec les étudiants de la formation Clinique du Droit International à Assas (Paris) les 25 et 26 janvier 2020

Maîtriser les outils de géolocalisation à partir de photos et de vidéos, découvrir les astuces cachées des réseaux sociaux et travailler de manière méthodique… Pendant deux jours, la quinzaine d’étudiants de la Clinique du Droit International (CDIA) de la Faculté de Droit D’Assas à Paris se sont familiarisés aux techniques de recherches en sources ouvertes. 

Cette association, fondée par des étudiants des Master II Justice Pénale Internationale et du Master II Droits de l’Homme et Droit Humanitaire, travaille sur des questions juridiques pour le compte d’ONG, de cabinets spécialisés sur le thème des Crimes contre l’Humanité et des génocides. Intégralement prise en charge par OpenFacto*, cette formation, qui s’est déroulé les 25 et 26 janvier, avait deux objectifs : donner méthodologie et outils aux étudiants pour mieux appréhender leur cursus et les préparer à leurs futurs métiers.

Géocodage à OpenFacto

Pendant leurs études, ces étudiants s’intéressent de très près aux violences dont a été victime la communauté peule, aussi bien au Mali qu’au Burkina Faso. Pour les besoins de cette enquête, OpenFacto a donc orienté cette session de formation sur la résolution de nombreux cas pratiques, notamment en terme de géolocalisation et d’identification. Les étudiants, presque tous novices en matière d’OSINT, ont appris à se servir de nombreux outils, tous gratuits et/ou en open-source. Parmi ces instruments, l’accent a été mis sur les dispositifs de géolocalisation à partir de photos et de vidéos, tel que search by image, l’utilisation de nombreux moteurs de recherche et ainsi que Google Earth.

OpenFacto a également fait intervenir venir plusieurs spécialistes (journaliste, enquêteur et juriste, tous membres bénévoles de l’association) pour familiariser les étudiants à la méthodologie d’enquête ; préparation, collecte du renseignement, archivage puis analyse. L’accent a aussi été mis sur l’importance du travail en équipe. Une formation très riche en données, qui accroît la panoplie de ces futurs juristes, la polyvalence étant de rigueur pour pouvoir intégrer des cabinets ou des ONG.
Nul doute qu’OpenFacto leur a fourni des outils indispensables pour la bonne poursuite de leur carrière!

*La formation s’est déroulée grâce à l’investissement bénévole de Poline, Sébastien, Cécile et Aurélie (OpenFacto), ansi que celle d’Alexandre et Margot (CDIA), merci à eux! <3
Les frais engagés sur ce type de projet proviennent exclusivement des cotisations et dons des membres et des quelques bénéfices engrangés lors des précédentes sessions de formation. Un immense remerciement à tous les membres d’OpenFacto!

Si vous souhaitez soutenir ce type de projet, comme celui de SIRAJ par exemple, soutenez l’association par un don ou votre adhésion!

Le mot du président… Pour un petit bilan 2019

Le mot du président… Pour un petit bilan 2019

Das Bild December 2019 calendar. New Year's eve von Marco Verch kann unter Creative Commons Lizenz genutzt werden. Es ist auf Flickr in voller Auflösung verfügbar.

Il était difficile de terminer 2019 sans se livrer à ce petit exercice traditionnel du bilan de l’année… notre première année!!!
OpenFacto est née en janvier 2019. Avec CapteursOuverts et Aliaume, nous pensions réunir la petite dizaine de membres que nous espérions péniblement enrôler autour de « l’OSINT à la french« , le premier nom du projet, dans un petit resto parisien, histoire de marquer le coup.
L’association compte aujourd’hui 95 membres à jour de leur cotisation, et pas seulement en France!
Grâce à leur engagement, notamment l’acte de soutien que représente cette adhésion, nous avons pu monter plusieurs projets très importants, tous auto-financés :

  • Des formations trimestrielles où, à ce jour, une cinquantaine de personnes de tous horizons ont pu se former aux techniques d’investigations en sources ouvertes
  • Une formation pour les journalistes d’investigation du réseau SIRAJ
  • Un module de formation pour les étudiants en journalisme de SciencePo
  • Un meetup, premier d’une longue série
  • Des articles sur notre site….

La participation active d’OpenFacto à différents évènements de journalisme ou d’activisme cette année (Dataharvest, DOCon, GIJN, …) a permis de faire connaître notre projet, nos valeurs, et de commencer à implanter durablement l’association dans le paysage OSINT.

Toutes ces activités, très concrètes, ne peuvent être montées que grâce à un gros travail de l’ensemble des bénévoles d’OpenFacto : Aliaume, CapteursO, Fabrice, Bart, Liselotte, Cécile, Laura, Sylvain, Poline, mais aussi Wolfie, Sébastien, Alfred et Artus, Sandrine, Jean-Philippe… Qu’ils en soient chaleureusement remerciés!!

2020 s’annonce déjà enthousiasmante!

Outre les projets de formations dont je vous ai parlé plus haut, que nous allons bien évidemment pérenniser (avec nous l’espérons, quelques subventions à la clef…), nous venons de signer un partenariat avec les étudiants de la Clinique du Droit International d’Assas pour les aider dans l’exercice de leur magistère! Nous sommes également en contact préalable avec d’autres entités pour démarrer d’autres projets avec eux…

Bref, 2020 va être très riche!

Rejoignez-nous! Adhérer ou renouveler votre adhésion à OpenFacto, participer au fonctionnement de l’association par un don, un article, un peu de temps personnel, est vraiment très important.


Au nom de toute l’équipe d’OpenFacto, je vous souhaite cher lecteur passionné d’OSINT, une excellente année 2020!

Hervé