Jessaie de trouver un moyen efficace de faire le niveau 5 du OverTheWire bandit challenge .
Quoi quil en soit, jai un tas de fichiers, et il ny en a quun qui respecte les critères suivants:
- Lisible par lhomme
- Taille de 1 033 octets
- Non exécutable
En ce moment, jutilise la commande find
, et je suis capable de trouver les fichiers correspondant aux 2 derniers critères:
find . -size 1033c ! -executable
Cependant, je ne sais pas comment exclure les fichiers non lisibles par lhomme . Les solutions que jai trouvées pour ce défi utilisent le paramètre de test -readable
, mais je ne pense pas que cela fonctionne. -readable
ne regarde que les permissions des fichiers, et non son contenu, tandis que la description du défi demande un fichier ASCII ou quelque chose comme ça.
Commentaires
- Comment définissez-vous la lisibilité humaine? Non binaire?
- La commande de fichier est votre ami 🙂
- Peut-être un double de: stackoverflow.com/questions/14505218/…
- Les humains sont lune des espèces connues les plus intelligentes sur terre. Ils ‘ sont également les seuls connus à être familiarisés avec les ordinateurs. Ils peuvent lire la plupart des fichiers à condition de connaître le type et d’obtenir les clés de chiffrement pour un chiffré.
- SPOILER ALERT !!
Answer
Oui, vous pouvez utiliser find
pour rechercher des fichiers non exécutables de la bonne taille, puis utilisez file
pour vérifier lASCII. Quelque chose comme:
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
La quête sur, cependant, nest pas aussi simple que cela puisse paraître. «Humain lisible» est un terme horriblement vague. Vraisemblablement, vous voulez dire du texte. OK, mais quel genre de texte? Caractère latin ASCII uniquement? Unicode complet? Par exemple, considérez ces trois fichiers:
$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo
Ce sont tous du texte et lisibles par lhomme. Voyons maintenant ce que file
en fait:
$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable
Donc, le ci-dessus ne trouvera que file1
(pour les besoins de cet exemple, imaginons que ces fichiers ont 1033 caractères). Vous pouvez développer find
pour rechercher la chaîne text
:
find . -type f -size 1033c ! -executable -exec file {} + | grep -w text
Avec -w
, grep
nimprimera que les lignes où text
se trouve comme un mot autonome. Cela devrait être assez proche de ce que vous voulez, mais je ne peux pas garantir quil ny a pas dautre type de fichier dont la description pourrait également inclure la chaîne text
.
Réponse
Alors que -exec
est principalement utilisé pour faire quelque chose avec les fichiers qui là où il est trouvé, il peut également servir de test. Par conséquent, nous pouvons lajouter à vos autres critères:
find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \;
Noubliez pas, grep
renvoie une valeur non nulle lorsque le modèle na pas été trouvé, et sh -c "COMMAND"
retournera le résultat de lévaluation (tant quil est valide). imprimer uniquement les fichiers où file <filename>
crache quelque chose qui se termine par text
, par exemple « UTF-8 Unicode text` ou » ASCII text « , mais pas « Texte ASCII étendu non-ISO, avec séquences déchappement ».
En une seule ligne, il finit même par être plus court que daller sur xargs
:
find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \;
Garder i Noubliez pas que vous pouvez remplacer sh -c "file {} | grep "text$""
par nimporte quelle commande personnalisée. Si vous voulez vérifier quelque chose de très complexe, il peut être préférable de fournir un script shell et de lutiliser à la place:
find . -size 1033c -not -executable -exec is_human_readable.sh {} \;
qui, dans le long run, est plus facile à maintenir que lhistorique de votre shell:
#!/bin/sh file "$@" | grep "text$" > /dev/null
Commentaires
- Sympa! Notez, cependant, que la correspondance avec
text$
exclura les éléments reconnus comme des scripts shell. Tout ce qui comporte un shebang est identifié comme un script, et ceux-ci sont parfaitement lisibles par lhomme. - @terdon est vrai, mais les scripts ont tendance à être exécutables: D. Cela étant dit, un script approprié devrait également reconnaître les fichiers PDF. Mais dun autre côté, un PDF contenant une image est-il lisible par lhomme ? Un PNG dun texte lisible ? Probablement. Je suppose quun test complet sera… difficile.
Réponse
Il vous suffit dutiliser:
find inhere -size 1033c
Cela vous donnera le seul fichier contenant le mot de passe.
Commentaires
- pourquoi + 1033c renvoie-t-il plus de fichiers? est-ce que cest comme un signe plus grand ou égal?
Réponse
find . -size 1033c ! -executable -exec file {} +
Réponse
Exécutez simplement ce qui suit par rapport au contenu du répertoire:
$ file -- * -file00: data -file01: data -file02: data -file03: data -file04: data -file05: data -file06: data -file07: ASCII text -file08: data -file09: data $ cat -- \-file07 <output>
Answer
Il ny a quun seul fichier avec 1033
octets de taille.
bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$
Pourquoi 1033c
et non 1033
? Consultez la page man
-size n[cwbkMG] File uses n units of space, rounding up. The following suffixes can be used: `b" for 512-byte blocks (this is the default if no suffix is used) `c" for bytes `w" for two-byte words `k" for Kilobytes (units of 1024 bytes) `M" for Megabytes (units of 1048576 bytes) `G" for Gigabytes (units of 1073741824 bytes)
Vérifiez-le avec la commande ls -l
et file
, et vous obtenez toute la réponse.
bandit5@bandit:~$ ls -l ./inhere/maybehere07/.file2 -rw-r----- 1 root bandit5 1033 May 7 20:15 ./inhere/maybehere07/.file2 bandit5@bandit:~$ bandit5@bandit:~$ file ./inhere/maybehere07/.file2 ./inhere/maybehere07/.file2: ASCII text, with very long lines bandit5@bandit:~$
- lisible par lhomme (
ASCII text
) - 1033 octets de taille (également en
ls -l
sortie) - non exécutable (
-rw-r-----
)
Réponse
find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}"
Veuillez essayer ces commandes combinées. cela fonctionne sur ma station.
Réponse
Vous pouvez essayer ceci
find . -size 1033c ! -executable -exec file {} +
Votre défi nautorise pas grep
. Le fichier de mot de passe sera signalé comme « texte ASCII, avec de très longues lignes »
Réponse
Pour filtrer les noms de fichier lisibles par lhomme, vous pouvez utiliser la classe de caractères [:print:]
( imprimable ) nom. Vous trouverez plus dinformations sur ces classes dans le manuel de grep
.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
Une seconde réflexion , lexigence « lisible par lhomme » peut faire référence au contenu du fichier, au lieu de son nom. En dautres termes, vous recherchez des fichiers texte . Cest un peu plus délicat. Comme @ D_Bye suggéré dans un commentaire, vous devez ensuite utiliser la commande file
pour déterminer le type de contenu du fichier. Mais ce ne serait pas une bonne idée dexécuter file
après un tube, car cela compliquerait la tâche d afficher le nom du fichier. Voici ce que je suggère:
find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print
Voici brièvement comment fonctionne la file
-part:
- Le prédicat
-exec
sexécutesh -c "file -b $0 | grep -q text" FILENAME
pour chaqueFILENAME
qui satisfait toutes les conditions précédentes (type, taille, non exécutable). - Pour chacun de ces fichiers , un shell (
sh
) exécute ce court script :file -b $0 | grep -q text
, en remplaçant$0
par le nom du fichier. - Le
file
détermine le type de contenu de chaque fichier et génère ces informations. Loption-b
empêche limpression nom de chaque fichier testé. -
grep
filtres la sortie provenant de
programme, recherche de lignes contenant « text » . (Voyez par vous-même à quoi ressemble une sortie typique de la commandefile
.)
grep
ne le fait pas afficher le texte filtré, car loption -q
(calme) donnée . Ce quil fait, cest simplement changer son statut de sortie en 0
(qui représente « true » – le texte filtré a été trouvé) ou 1 (signifiant « erreur « – le texte » text « napparaissait pas dans la sortie de file
). grep
est ensuite passé de sh
à find
et agit comme le résultat final de lensemble Test « -exec sh -c "file $0 | grep -q text" {} \;
« . -print
la commande est exécutée (cest-à-dire que le nom du fichier testé est imprimé). Réponse
bandit4@bandit:~$ ls inhere bandit4@bandit:~$ file inhere/* inhere/-file00: data inhere/-file01: data inhere/-file02: data inhere/-file03: data inhere/-file04: data inhere/-file05: data inhere/-file06: data inhere/-file07: ASCII text inhere/-file08: data inhere/-file09: data bandit4@bandit:~$ pwd /home/bandit4 bandit4@bandit:~$ cat /home/bandit4/inhere/-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh bandit4@bandit:~$
Commentaires
- Utilisez simplement le fichier inhere / * et cat / home / bandit4 / inhere / -file07
Réponse
find -type f ! -executable -size 1033c
vous obtiendra le fichier de lexercice
Réponse
find . -type f -size 1033c ! -executable | xargs file | grep text
Fan dune doublure
Réponse
Je pense que le moyen le plus long de trouver le mot de passe pour ce niveau de bandit mentionné par la plupart des utilisateurs ci-dessus en utilisant find et grep est la commande la plus descriptive.
find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII
Mais, après avoir utilisé la commande « file » plus, jai réalisé quil était assez facile de localiser des fichiers lisibles par lhomme (aka ASCII à ce niveau) de cette façon en vérifiant les types de fichiers dun répertoire entier.Le répertoire inhere contient les fichiers portant le nom « -filexx » ou vérifiez rapidement tout le répertoire inhere avec file ./*
Voici mon approche.
bandit4@bandit:~/inhere$ file ./* ./-file00: data ./-file01: data ./-file02: data ./-file03: data ./-file04: data ./-file05: data ./-file06: data ./-file07: ASCII text ./-file08: data ./-file09: data bandit4@bandit:~/inhere$ cat ./-file07 koReBOKuIDDepwhWk7jZC0RTdopnAYKh