Estoy tratando de encontrar una forma eficaz de realizar el nivel 5 de OverTheWire bandit challenge .

De todos modos, tengo un montón de archivos, y solo hay uno que respeta los siguientes criterios:

  • Legible por humanos
  • 1033 bytes de tamaño
  • No ejecutable

En este momento, estoy usando el comando find , y puedo encontrar los archivos que coinciden con los 2 últimos criterios:

find . -size 1033c ! -executable 

Sin embargo, no sé cómo excluir los archivos no legibles por humanos Las soluciones que encontré para ese desafío usan el parámetro de prueba -readable, pero no creo que esto funcione. -readable solo mira los permisos de los archivos, y no su contenido, mientras que la descripción del desafío solicita un archivo ASCII o algo así.

Comentarios

  • ¿Cómo se define legible por humanos? ¿No binario?
  • El comando de archivo es su amigo 🙂
  • Tal vez un duplicado de: stackoverflow.com/questions/14505218/…
  • Los seres humanos son una de las especies más inteligentes conocidas en la tierra. Ellos ‘ también son los únicos conocidos por ser versados en computadoras. Pueden leer la mayoría de los archivos siempre que puedan averiguar el tipo y obtener las claves de cifrado para uno cifrado.
  • ¡ALERTA DE SPOILER!

Responder

Sí, puede usar find para buscar archivos no ejecutables del tamaño correcto y luego use file para buscar ASCII. Algo como:

find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII 

La búsqueda Sin embargo, no es tan simple como parece. «Legible por humanos» es un término horriblemente vago. Presumiblemente, te refieres al texto. Vale, pero ¿qué tipo de texto? ¿Carácter latino ASCII solamente? ¿Unicode completo? Por ejemplo, considere estos tres archivos:

$ cat file1 abcde $ cat file2 αβγδε $ cat file3 abcde αβγδε $ cat file4 #!/bin/sh echo foo 

Estos son todos de texto y legibles por humanos. Ahora, veamos qué hace file con ellos:

$ file * file1: ASCII text file2: UTF-8 Unicode text file3: UTF-8 Unicode text file4: POSIX shell script, ASCII text executable 

Entonces, el find comando anterior solo encontrará file1 (por el bien de este ejemplo, imaginemos que esos archivos tienen 1033 caracteres). Puede expandir find para buscar la cadena text:

find . -type f -size 1033c ! -executable -exec file {} + | grep -w text 

Con -w, grep solo imprimirá líneas donde text se encuentre como una palabra independiente. Eso debería estar bastante cerca de lo que desea, pero no puedo garantizar que no haya otro tipo de archivo cuya descripción también pueda incluir la cadena text.

Respuesta

Mientras que -exec se usa principalmente para hacer algo con los archivos que donde se encuentre, también puede actuar como una prueba. Por lo tanto, podemos agregarlo a sus otros criterios:

find . \ -size 1033c \ -not -executable \ -exec sh -c "file {} | grep "text$"" \; 

Recuerde, grep devuelve un valor distinto de cero cuando no se encontró el patrón, y sh -c "COMMAND" devolverá el resultado de la evaluación (siempre que sea válido). solo imprime archivos donde file <filename> escupe algo que termina con text, por ejemplo, «UTF-8 Unicode text` o» ASCII text «, pero no «Texto ASCII extendido no ISO, con secuencias de escape».

En una sola línea, incluso termina siendo más corto que si se pasa por encima de xargs:

find . -size 1033c -not -executable -exec sh -c "file {} | grep "text$"" \; 

Mantenga i n tenga en cuenta que puede reemplazar sh -c "file {} | grep "text$"" con cualquier comando personalizado. Si desea buscar algo muy complejo, podría ser una mejor idea proporcionar un script de shell y usarlo en su lugar:

find . -size 1033c -not -executable -exec is_human_readable.sh {} \; 

que, en el largo ejecutar, es más fácil de mantener que el historial de su shell:

#!/bin/sh file "$@" | grep "text$" > /dev/null 

Comentarios

  • ¡Bien! Sin embargo, tenga en cuenta que la coincidencia de text$ excluirá los elementos reconocidos como scripts de shell. Todo lo que tenga un shebang se identifica como un script y son perfectamente legibles por humanos.
  • @terdon es cierto, pero las secuencias de comandos tienden a ser ejecutables: D. Dicho esto, una secuencia de comandos adecuada también debe reconocer los archivos PDF. Pero, por otro lado, ¿un PDF que contiene una imagen legible por humanos? ¿Es un PNG de algún texto legible ? Probablemente. Supongo que una prueba completa será… desafiante.

Responder

Solo necesitas usar:

find inhere -size 1033c 

Te dará el único archivo que contiene la contraseña.

Comentarios

  • ¿por qué + 1033c devuelve más archivos? ¿Es eso como un signo mayor o igual?

Responder

find . -size 1033c ! -executable -exec file {} + 

Responder

Simplemente ejecute lo siguiente contra el contenido del directorio:

$ 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> 

Respuesta

Solo hay 1 archivo con 1033 bytes de tamaño.

bandit5@bandit:~$ find -size 1033c ./inhere/maybehere07/.file2 bandit5@bandit:~$ 

¿Por qué 1033c y no 1033? Consulte la man página

 -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) 

Verifíquelo con los comandos ls -l y file y obtendrá toda la respuesta.

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:~$ 
  1. legible por humanos (ASCII text)
  2. 1033 bytes de tamaño (también en ls -l salida)
  3. no ejecutable (-rw-r-----)

Respuesta

find . -size 1033c ! -executable|xargs file|grep "ASCII text" |awk -F: "{print $1}" 

Por favor, pruebe estos comandos combinados. funciona en mi estación.

Respuesta

Puedes probar esto

find . -size 1033c ! -executable -exec file {} + 

Tu desafío no permite grep. El archivo de contraseña se informará como «texto ASCII, con líneas muy largas»

Respuesta

Para filtrar el nombres de archivos legibles por humanos, puede hacer uso de la [:print:] ( imprimible ) clase de caracteres nombre. Encontrará más sobre estas clases en el manual de grep.

find . -type f -size 1033c -name "[[:print:]]*" ! -executable 

Pensándolo bien , el requisito «legible por humanos» puede referirse al contenido del archivo, en lugar de su nombre. En otras palabras, estaría buscando archivos de texto . Eso es un poco más complicado. Como @ D_Bye sugirió en un comentario, luego debe usar el comando file para determinar el tipo de contenido del archivo. Pero no sería una buena idea ejecutar file después de una tubería, porque complicaría la tarea de mostrar el nombre del archivo. Esto es lo que sugiero:

find . -type f -size 1033c ! -executable -exec sh -c "file -b $0 | grep -q text" {} \; -print 

Así es brevemente cómo funciona la file:

  • El predicado -exec ejecuta sh -c "file -b $0 | grep -q text" FILENAME para cada FILENAME que cumpla todas las condiciones anteriores (tipo, tamaño, no ejecutable).
  • Para cada uno de esos archivos , un shell (sh) ejecuta este breve script : file -b $0 | grep -q text, reemplazando $0 con el nombre del archivo.
  • El file determina el tipo de contenido de cada archivo y genera esta información. La opción -b impide imprimir el nombre de cada archivo probado.
  • grep filtros la salida procedente de

programa, buscando líneas que contengan «texto» . (Vea usted mismo cómo se ve una salida típica del comandofile).

  • Pero grep no generar el texto filtrado, porque tiene la opción -q (silencioso) . Lo que hace es cambiar su estado de salida a 0 (que representa «verdadero»: se encontró el texto filtrado) o 1 (que significa «error «: el texto » texto « no apareció en la salida de file).
  • El estado de salida verdadero / falso proveniente de grep pasa más de sh a find y actúa como el resultado final del conjunto «-exec sh -c "file $0 | grep -q text" {} \;» prueba.
  • En caso de que la prueba anterior arrojara true , la -print se ejecuta el comando (es decir, se imprime el nombre del archivo probado).
  • Respuesta

    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:~$ 

    Comentarios

    • Simplemente use file inhere / * y cat / home / bandit4 / inhere / -file07

    Answer

    find -type f ! -executable -size 1033c 

    obtendrá el archivo del ejercicio

    Responder

    find . -type f -size 1033c ! -executable | xargs file | grep text 

    Fan de una sola línea

    Responder

    Creo que la forma más larga de encontrar la contraseña para este nivel de bandido mencionado por la mayoría usando find y grep es el comando más descriptivo.

    find . -type f -size 1033c ! -executable -exec file {} + | grep ASCII

    Pero, después de usar más el comando «archivo», me di cuenta de que es bastante fácil localizar archivos legibles por humanos (también conocidos como ASCII en este nivel) de esta manera al verificar los tipos de archivos de directorios completos.El directorio inherente contiene archivos con el nombre «-filexx» o verifique rápidamente todo el directorio inhere con file ./*

    Este fue mi enfoque.

    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 

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *