Cambiar los permisos de un archivo con la ayuda de mi gato

55
root@system:~# less myfile
-bash: /bin/less: Input/output error

El sistema de archivos raíz está muerto. Pero mi gato todavía está vivo (en mi memoria):

root@system:~# cat > /tmp/somefile
C^d
root@system:~#

Sin embargo, está un poco solo, todos sus amigos se han ido:

root@system:~# mount
-bash: /bin/mount: Input/output error
root@system:~# dmesg
-bash: /bin/dmesg: Input/output error
root@system:~# less
-bash: /bin/less: Input/output error
root@system:~# chmod
-bash: /bin/chmod: Input/output error

El sistema aún se está ejecutando y cumple su propósito. Lo sé, lo sé, la única respuesta sensata a esto es bajar el sistema y reemplazar la unidad raíz. Desafortunadamente, esa no es una opción, ya que costaría mucho tiempo y dinero. Además, mataría a mi gato, y eso me pondría triste.

He pensado en traerle a sus amigos habituales de un donante. No me atrevo a intentar scp en ellos, en caso de que ssh intente cargarlo y corte la línea (el binario desaparece de todos modos). Esto suena como un trabajo para el primo de mi gato:

root@system:~# netcat -l 1234 > /tmp/less
-bash: netcat: command not found

Lamentablemente se fue hace mucho tiempo.

Ahora, puedo tratar de engañar a mi gato para que realice un ritual para resucitarlo:

cat > netcat < /dev/tcp/localhost/9999

Y ese tipo de trabajo. Él está casi vivo:

root@system:/tmp# /tmp/netcat
-bash: /tmp/netcat: Permission denied

Solo necesita una pequeña chispa de vida. Ese pequeño +xencantamiento mágico que no puedo recitar en este momento.

¿Me pueden ayudar a traer a los amigos de mi gato?

goncalopp
fuente
3
¿Se puede ejecutar /lib/ld-linux.so.2 ./netcat(o el equivalente de su sistema) y hacer que algo funcione ?
Michael Homer
44
Además: ¿qué sistema operativo es este? ¿Tiene algún sistema de archivos vfat o NTFS montado? Sistemas de archivos de red? ¿Particiones de las que puede borrar el contenido? ¿Hay alguna archivos accesibles con permiso de ejecución?
Michael Homer
3
"Además, mataría a mi gato, y eso me pondría triste". - Siempre pensé que el dicho "Ningún niño fue dañado durante la producción de esto" era solo un dicho, pero bueno ...
rugk
77
Tuve que votar por todas estas analogías de gatos ... 😂
rugk
2
pobre gato, espero que esté bien :(
gato

Respuestas:

37

Hay varias posibilidades, todas dependiendo de los parámetros exactos de su situación en este momento. Asumiré Linux en los siguientes ejemplos cuando corresponda, pero existe una funcionalidad similar en otras plataformas en la mayoría de los casos.

  • Es posible que pueda hacer que el cargador dinámico ejecute un ejecutable por usted. Suponiendo que catesté vinculado dinámicamente, el equivalente de su plataforma /lib/ld-linux.so.2probablemente también estará en la memoria y, por lo tanto, se podrá usar para ejecutar un binario:

    $ /lib64/ld-linux-x86-64.so.2 ./chmod
    chmod: missing operand
    

    Puede tener varios de estos (es probable que sean de 32 y 64 bits) y puede haber varias copias disponibles o enlaces simbólicos que deben resolverse. Uno de esos puede funcionar.

  • Si tiene un sistema de archivos vfat o NTFS montado, u otro que trata todos los archivos como 777, puede crear su ejecutable allí.

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
  • Si tiene un sistema de archivos de red montado, incluso si no se puede escribir localmente, puede crear archivos en el sistema remoto y usarlos normalmente.
  • Si hay una partición montada de la que no le importa el contenido, en una unidad que todavía funciona principalmente, puede reemplazar el contenido con una nueva imagen del mismo tipo de sistema de archivos que contiene los ejecutables que desea, catdebería estar bien para esto en el rol que suelen usar las personas ddy puede proporcionar la imagen a través de la red

    $ cat > /dev/sdb1 < ...

    Este es plausible, pero tiene muchos lugares para no trabajar dependiendo de lo que todavía está exactamente en la memoria de esa partición.

  • Si hay algún archivo accesible que tenga permiso de ejecución en cualquier sistema de archivos grabable, puede cat >ingresarlo para reemplazar el contenido con un binario de su elección.

    $ cat > ~/test.py < ...
  • Como Bash todavía se está ejecutando, puede cargar dinámicamente un complemento de Bash en el proceso que expone chmod. En particular, podría instalar y cargarctypes.sh , lo que proporciona una interfaz de función ajena a Bash, y luego dlcall chmod ./netcat 511.
  • Puede traer un archivo foo.sode biblioteca dinámica de su construcción y luego catcargarlo en su nombre LD_PRELOAD, permitiéndole ejecutar código arbitrario.

    $ LD_PRELOAD=./hack.so cat /dev/null

    Si interceptas, por ejemplo open:

    int open(const char *path, int flags, ...) {
        chmod(path, 0755);
        return -1;
    }
    

    entonces puedes hacer lo que necesites hacer allí.

Mi sugerencia sería traer un busyboxejecutable vinculado estáticamente como el primer elemento (o realmente, el único elemento) para que tenga la gama completa de comandos disponibles sin reutilizar cualquier truco que lo haya llevado al agotamiento.

Michael Homer
fuente
3
Re "vinculado estáticamente busybox": sashtenga en cuenta que fue diseñado específicamente para este tipo de caso de uso y puede estar más fácilmente disponible en caso de necesidad (por ejemplo, puede instalarlo con anticipación y dejar una copia ejecutándose en algún lugar para que esté en la memoria cuando el sistema rompe ... o puedes deshacerte de tus mascotas y comprar un montón de ganado, supongo).
Kevin