Coup rapide: «creuser» dans les enregistrements DNS r-project.org avec processx – Serveur d’impression

le r-project.org domain a eu quelques difficultés techniques temporaires cette semaine (2019-29) qui ont rendu difficile l’atteinte des ressources liées à R pour un groupe de personnes pendant un certain temps. Des incidents de ce type soulignent la nécessité d'une diversité de régions et de réseaux pour garantir la disponibilité des services DNS. Autrement dit, cela ne sert à rien si vous avez deux serveurs DNS s’ils sont tous les deux connectés à la même source d’alimentation et / ou à une même connexion réseau. En cas de coupure de courant ou si le réseau devient défaillant, aucun client ne pourra traduire r-project.org à une adresse IP à laquelle il peut ensuite se connecter.

Je ne suis pas beaucoup au clavier cette semaine, donc j’ai eu le temps de faire une poke externe au (nouveau) r-project.org Configuration DNS tard hier et aujourd'hui avant que les vacanciers somnolents ne sortent de leur sommeil. À ma grande surprise, le r-project.org configuration DNS actuelle permet les transferts de zone complets, ce qui signifie que vous pouvez obtenir la «base de données» complète de r-project.org Enregistrements DNS si vous connaissez les bonnes incantations.

Donc, j'ai écrit un petit wrapper de fonction R pour le creuser commande en utilisant processx. Les utilisateurs du système d’exploitation Windows hérité sont seuls pour obtenir une copie de creuser installé, mais les utilisateurs des systèmes d’exploitation modernes et appropriés, tels que Linux ou macOS, doivent le faire installer par défaut (ou ce sera un moyen facile de s’emparer du gestionnaire de paquets).

Enveloppement

Le R-wrapper pour le creuser La commande est assez simple:

bibliothèque (chaîne de caractères) # chaîne processinglibrary (processx) # processus du système orchestrationlibrary (tidyverse) # bonne gestion des données idiomsdig <- function(..., cat = TRUE)   processx::run(    command = unname(Sys.which("dig")),     args = unlist(list(...)),  ) -> out si message (chat) (out $ stdout) invisible (out)

Nous développons les ellipses en arguments de commande, exécutons la commande, retournons la sortie et affichons éventuellement la sortie via message().

Voyons si cela fonctionne en obtenant le creuser Aidez-moi:

dig ("- h") ## Utilisation: dig[[[[@global-serveur] [domain] [q-type] [q-class]    q-opt ## global-d-opt hôte[[[[@local-serveur]local-d-opt ##[hôte[[hôte[[host[[host[@local-serveur]local-d-opt [...]]## Où: le domaine est dans le système de noms de domaine ## q-class est l'un des (in, hs, ch, ...) [default: in]## q-type est l'un des (a, tout, mx, ns, soa, hinfo, axfr, txt, ...) [default:a]## (Utilisez ixfr = version pour le type ixfr) ## q-opt est l'un des éléments suivants: ## -4 (utilisez uniquement le transport de requête IPv4) ## -6 (utilisez uniquement le transport de requête IPv6) ## -b adresse[#port]   (lien vers l'adresse / le port source) ## -c classe (spécifiez la classe de requête) ## -f nomfichier (mode de traitement par lots) ## -i (utilisez IP6.INT pour les recherches inversées IPv6) ## -k fichier-clé (spécifiez clé tsig fichier) ## -m (active le débogage de l'utilisation de la mémoire) ## -p port (spécifiez le numéro de port) ## -q nom (spécifiez le nom de la requête) ## -t type (spécifiez le type de requête) ## -u (temps d'affichage dans usec au lieu de msec) ## -x notation par points (raccourci pour les recherches inversées) ## -y [hmac:]nom: clé (spécifiez la clé nommée base64 tsig) ## d-opt est de la forme + mot-clé[=value], où mot clé est: ## +[no]aaonly (Définit un drapeau AA dans la requête (+[no]aaflag)) ## +[no]supplémentaire (affichage de la section supplémentaire) ## +[no]adflag (Définit l'indicateur AD dans la requête (par défaut)) ## +[no]all (Définir ou effacer tous les drapeaux d'affichage) ## +[no]answer (écran de contrôle de la section answer) ## +[no]autorité (affichage de la section autorité) ## +[no]besteffort (Essayez d'analyser même les messages illégaux) ## + bufsize = ### (Définissez la taille de paquet UDP EDNS0 Max) ## +[no]cdflag (Définir l'indicateur de vérification désactivée dans la requête) ## +[no]cl (affichage de la classe dans les enregistrements) ## +[no]cmd (affichage de contrôle de la ligne de commande) ## +[no]comments (Contrôle de l'affichage des lignes de commentaire) ## +[no]crypto (affichage de contrôle des champs cryptographiques dans les enregistrements) ## +[no]defname (Utiliser la liste de recherche (+[no]recherche)) ## +[no]dnssec (Demande d'enregistrements DNSSEC) ## + domain = ### (Définir le nom de domaine par défaut) ## +[no]edns[=###]     (Définir la version EDNS) [0]## + ednsflags = ### (Définir les bits de drapeau EDNS) ## +[no]ednsnegotiation (Définition de la négociation de version EDNS) ## + ednsopt = ###[:value] (Envoyer l'option EDNS spécifiée) ## + noednsopt (Effacer la liste des options de + ednsopt) ## +[no]expire (le délai de la requête expire) ## +[no]échec (n'essayez pas le serveur suivant sur SERVFAIL) ## +[no]identifie (identifie les répondants dans les réponses courtes) ## +[no]idnout (convertir la réponse IDN) ## +[no]ignore (ne pas revenir au protocole TCP pour les réponses du comité technique.) ## +[no]keepopen (Laissez le socket TCP ouvert entre les requêtes) ## +[no]multiligne (Imprimer les enregistrements dans un format développé) ## + ndots = ### (Définir la valeur de recherche NDOTS) ## +[no]nsid (ID du serveur du nom de la requête) ## +[no]nssearch (Recherche dans tous les serveurs de noms faisant autorité) ## +[no]onesoa (AXFR imprime un seul enregistrement soa) ## +[no]opcode = ### (définit l'opcode de la requête) ## +[no]qr (Imprimer la question avant d'envoyer) ## +[no]question (affichage de contrôle de la section de question) ## +[no]recurse (mode récursif) ## + retry = ### (Définir le nombre de tentatives UDP) [2]## +[no]commentaires (Contrôle de l'affichage des commentaires par enregistrement) ## +[no]search (définir si utiliser searchlist) ## +[no]short (N'affiche rien sauf la forme courte ## de la réponse) ## +[no]showsearch (Recherche avec des résultats intermédiaires) ## +[no]split = ## (Fractionner les champs hex / base64 en morceaux) ## +[no]stats (affichage des statistiques) ## + sous-réseau = addr (option Définir edns-client-sous-réseau) ## +[no]tcp (mode TCP (+[no]vc)) ## + time = ### (définir le délai d'attente de la requête) [5]## +[no]trace (délégation de trace depuis la racine [+dnssec]) ## + try = ### (Définir le nombre de tentatives UDP) [3]## +[no]ttlid (affichage de contrôle des ttls dans les enregistrements) ## +[no]vc (mode TCP (+[no]tcp)) ## les commandes globales et les serveurs (avant le nom d’hôte) affectent toutes les requêtes. ## les commandes locales et les serveurs (après le nom de la machine) affectent uniquement cette recherche. ## -h (aide à l’affichage et sortie) ## -v (version imprimée et sortie)

Pour obtenir les enregistrements DNS de r-project.org DNS nous devons trouver les serveurs de noms, ce que nous pouvons faire via:

ns <- dig ("+ short", "NS", "@ 9.9.9.9 "," r-project.org ") ## ns1.wu-wien.ac.at. ## ns2.urbanek.info. ## ns1.urbanek.info. ## ns3.urbanek.info. ## ns4.urbanek.info. ## ns2.wu-wien.ac.at.

Il y en a six (l’IIRC est un peu plus qu’au début de la semaine). Je voulais voir si des transferts de zone pris en charge. Voici un moyen de le faire:

stri_split_lines (ns $ stdout, omit_empty = TRUE)%>% # divise la réponse de stdout en lignes flatten_chr ()%> transforme la liste en vecteur de caractère map_df (~ # crée un cadre de données à partir du tibble suivant ( ns = .x, # le serveur de noms que nous sondons res = dig ("+ noall", "+ answer", "AXFR", glue :: glue ("@ . x"), "r-project.org" , cat = FALSE)%>% # demande de transfert de zone de plagage ("stdout") # nous ne voulons que l’élément `stdout` de la valeur de retour processx)) -> xdfxdf ## # Un tibble: 6 x 2 ## ns res ##                                                                                                                                                                                                              ## 1 ns1.wu-wien.ac… "; Le transfert a échoué.  N" ## 2 ns2.urbanek.in ... "R-project.org.  T  t7200  tIN  tSOA  tns0.wu-wien. ac.at.… ## 3 ns1.urbanek.in… "R-project.org.  t  t7200  tIN  tSOA  tns0.wu-wien.ac.at.… ## 4 ns3.urbanek.in… "R-project.org.  T  t7200  tIN  tSOA  tns0.wu-wien.ac.at.… ## 5 ns4.urbanek.in…" R-project.org.  T  t7200  tIN  tSOA  tns0.wu-wien.ac.at.… ## 6 ns2.wu-wien.ac… "; Le transfert a échoué.  n" 

(REMARQUE: vous risquez de ne pas obtenir les choses dans le même ordre si vous essayez cela à la maison en raison de la manière dont les requêtes et les réponses DNS fonctionnent.)

Donc, deux serveurs n’ont pas accepté notre demande mais quatre l’ont fait. Voyons à quoi ressemble un ensemble d’enregistrements de transfert de zone:

chat (xdf[["res"]][[[[[2]]) ## R-project.org. 7200 IN SOA ns0.wu-wien.ac.at. postmaster.wu-wien.ac.at. 2019040400 3600 1800 604800 3600 ## R-project.org. 7200 IN NS ns1.urbanek.info. ## R-project.org. 7200 IN NS ns1.wu-wien.ac.at. ## R-project.org. 7200 IN NS ns2.urbanek.info. ## R-project.org. 7200 IN NS ns2.wu-wien.ac.at. ## R-project.org. 7200 IN NS ns3.urbanek.info. ## R-project.org. 7200 IN NS ns4.urbanek.info. ## R-project.org. 7200 IN A 137.208.57.37 ## R-project.org. 7200 IN MX 5 mc1.ethz.ch. ## R-project.org. 7200 IN MX 5 mc2.ethz.ch. ## R-project.org. 7200 IN MX 5 mc3.ethz.ch. ## R-project.org. 7200 IN MX 5 mc4.ethz.ch. ## R-project.org. 7200 IN TXT "v = spf1 ip4: 129.132.119.208/32 ~ all" ## cran.at.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## beta.R-project.org. 7200 IN A 137.208.57.37 ## bugs.R-project.org. 7200 IN CNAME rbugs.urbanek.info. ## cran.ch.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## cloud.R-project.org. 7200 IN CNAME d3caqzu56oq2n9.cloudfront.net. ## cran.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## ftp.cran.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## www.cran.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## cran-archive.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## developer.R-project.org. 7200 IN CNAME rdevel.urbanek.info. ## cran.es.R-project.org. 7200 IN A 137.208.57.37 ## ess.R-project.org. 7200 IN CNAME ess.math.ethz.ch. ## journal.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## mac.R-project.org. 7200 IN CNAME r.research.att.com. ## portal.R-project.org. 7200 IN CNAME r-project.org. ## r-forge.R-project.org. 7200 IN CNAME r-forge.wu-wien.ac.at. ## * .r-forge.R-project.org. 7200 IN CNAME r-forge.wu-wien.ac.at. ## search.R-project.org. 7200 IN CNAME finzi.psych.upenn.edu. ## svn.R-project.org. 7200 IN CNAME svn-stat.math.ethz.ch. ## translation.R-project.org. 7200 IN CNAME translation.r-project.kr. ## cran.uk.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## cran.us.R-project.org. 7200 IN A 137.208.57.37 ## user2004.R-project.org. 7200 IN CNAME r-project.org. ## useR2006.R-project.org. 7200 IN CNAME r-project.org. ## user2007.R-project.org. 7200 IN CNAME r-project.org. ## useR2008.R-project.org. 7200 IN CNAME r-project.org. ## useR2009.R-project.org. 7200 IN CNAME r-project.org. ## user2010.R-project.org. 7200 IN CNAME r-project.org. ## useR2011.R-project.org. 7200 IN CNAME r-project.org. ## useR2012.R-project.org. 7200 IN CNAME r-project.org. ## useR2013.R-project.org. 7200 IN CNAME r-project.org. ## user2014.R-project.org. 7200 IN CNAME user2014.github.io. ## useR2015.R-project.org. 7200 IN CNAME r-project.org. ## useR2016.R-project.org. 7200 IN CNAME user2016.github.io. ## useR2017.R-project.org. 7200 IN CNAME r-project.org. ## useR2018.R-project.org. 7200 IN CNAME user-2018.netlify.com. ## useR2019.R-project.org. 7200 IN A 5.135.185.16 ## wiki.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## win-builder.R-project.org. 7200 IN A 129.217.207.166 ## win-builder.R-project.org. 7200 IN MX 0 rdevel.urbanek.info. ## www.R-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## R-project.org. 7200 IN SOA ns0.wu-wien.ac.at. postmaster.wu-wien.ac.at. 2019040400 3600 1800 604800 3600

Ce n’est pas beau, mais c’est difficile. Transformons-le en un bloc de données:

xdf[["res"]][[[[[2]]%>% # récupère le texte de la réponse stri_split_lines (omit_empty = TRUE)%>% # le scinde en lignes flatten_chr ()%>% # le transforme en vecteur de caractère stri_split_regex ("[[:space:]]+ ", n = 5, simplify = TRUE)%>% # divisé par des espaces, limite à cinq champs as_tibble (.name_repair =" unique ")%>% # en fait un ensemble de noms de tibbles (c (" hôte "," ttl "," class "," record_type "," value "))%>% # meilleurs colnames mutés (hôte = stri_trans_tolower (hôte))%>% # la casse n’est pas dans les noms DNS print (n = nrow (.)) # voir nos résultats ## # A tibble: 55 x 5 ## hôte ttl class record_type value ##                                                                                                                                                                                                                                                                                         ## 1 r-project.org. 7200 IN SOA ns0.wu-wien.ac.at. postmaster.wu-wien.ac.at. 2019040400 3600 1800… ## 2 r-project.org. 7200 IN NS ns1.urbanek.info. ## 3 r-project.org. 7200 IN NS ns1.wu-wien.ac.at. ## 4 r-project.org. 7200 IN NS ns2.urbanek.info. ## 5 r-project.org. 7200 IN NS ns2.wu-wien.ac.at. ## 6 r-project.org. 7200 IN NS ns3.urbanek.info. ## 7 r-project.org. 7200 IN NS ns4.urbanek.info. ## 8 r-project.org. 7200 IN A 137.208.57.37 ## 9 r-project.org. 7200 IN MX 5 mc1.ethz.ch. ## 10 r-project.org. 7200 IN MX 5 mc2.ethz.ch. ## 11 r-project.org. 7200 IN MX 5 mc3.ethz.ch. ## 12 r-project.org. 7200 IN MX 5 mc4.ethz.ch. ## 13 r-project.org. 7200 IN TXT "" v = spf1 ip4: 129.132.119.208/32 ~ all  "" ## 14 cran.at.r-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## 15 beta.r-project.org. 7200 IN A 137.208.57.37 ## 16 bugs.r-project.org. 7200 IN CNAME rbugs.urbanek.info. ## 17 cran.ch.r-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## 18 cloud.r-project.org. 7200 IN CNAME d3caqzu56oq2n9.cloudfront.net. ## 19 cran.r-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## 20 ftp.cran.r-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## 21 www.cran.r-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## 22 cran-archive.r-projet.… 7200 IN CNAME cran.wu-wien.ac.at. ## 23 developer.r-project.org. 7200 IN CNAME rdevel.urbanek.info. ## 24 cran.es.r-project.org. 7200 IN A 137.208.57.37 ## 25 ess.r-project.org. 7200 IN CNAME ess.math.ethz.ch. ## 26 journal.r-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## 27 mac.r-project.org. 7200 IN CNAME r.research.att.com. ## 28 portal.r-project.org. 7200 IN CNAME r-project.org. ## 29 r-forge.r-project.org. 7200 IN CNAME r-forge.wu-wien.ac.at. ## 30 * .r-forge.r-project.org. 7200 IN CNAME r-forge.wu-wien.ac.at. ## 31 search.r-project.org. 7200 IN CNAME finzi.psych.upenn.edu. ## 32 svn.r-project.org. 7200 IN CNAME svn-stat.math.ethz.ch. ## 33 translation.r-project.o… 7200 IN CNAME translation.r-project.kr. ## 34 cran.uk.r-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## 35 cran.us.r-project.org. 7200 IN A 137.208.57.37 ## 36 user2004.r-project.org. 7200 IN CNAME r-project.org. ## 37 user2006.r-project.org. 7200 IN CNAME r-project.org. ## 38 user2007.r-project.org. 7200 IN CNAME r-project.org. ## 39 user2008.r-project.org. 7200 IN CNAME r-project.org. ## 40 user2009.r-project.org. 7200 IN CNAME r-project.org. ## 41 user2010.r-project.org. 7200 IN CNAME r-project.org. ## 42 user2011.r-project.org. 7200 IN CNAME r-project.org. ## 43 user2012.r-project.org. 7200 IN CNAME r-project.org. ## 44 user2013.r-project.org. 7200 IN CNAME r-project.org. ## 45 user2014.r-project.org. 7200 IN CNAME user2014.github.io. ## 46 user2015.r-project.org. 7200 IN CNAME r-project.org. ## 47 user2016.r-project.org. 7200 IN CNAME user2016.github.io. ## 48 user2017.r-project.org. 7200 IN CNAME r-project.org. ## 49 user2018.r-project.org. 7200 IN CNAME user-2018.netlify.com. ## 50 user2019.r-project.org. 7200 IN A 5.135.185.16 ## 51 wiki.r-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## 52 win-builder.r-project.o… 7200 EN A 129.217.207.166 ## 53 win-builder.r-project.o… 7200 IN MX 0 rdevel.urbanek.info. ## 54 www.r-project.org. 7200 IN CNAME cran.wu-wien.ac.at. ## 55 r-project.org. 7200 IN SOA ns0.wu-wien.ac.at. postmaster.wu-wien.ac.at. 2019040400 3600 1800

AILETTE

Les transferts de zone sont un moyen rapide d'obtenir toutes les informations DNS d'un site. En tant que tel, il n’est généralement pas recommandé d’autoriser les transferts de zone de la part de n'importe qui (bien que tenter de garder quelque chose de secret dans le DNS public est un chemin semé d'embûches étant donné la facilité avec laquelle il est facile de rechercher des enregistrements brute). Toutefois, si r-project.org les transferts de zone restent généralement ouverts, vous pouvez utiliser cette méthode pour conserver une copie locale de r-project.org héberger des informations et rendre local / etc / hosts (ou l’équivalent Windows) lorsqu’un problème comme celui de la semaine dernière se pose.

*** Ceci est un blog syndiqué réseau Security Bloggers de rud.is rédigé par hrbrmstr. Lisez le message original à l'adresse: https://rud.is/b/2019/06/28/quick-hit-dig-ging-into-dns-records-with-processx/

Coup rapide: «creuser» dans les enregistrements DNS r-project.org avec processx – Serveur d’impression
4.9 (98%) 32 votes