Змініть дозволи файлу за допомогою моєї кішки


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

Коренева файлова система мертва. Але моя кішка ще жива (на моїй пам’яті):

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

Він такий самотній, проте всі його друзі пішли:

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

Система все ще працює і виконує своє призначення. Я знаю, я знаю, єдиною розумною відповіддю на це є зниження системи та заміна кореневого накопичувача. На жаль, це не варіант, оскільки це коштуватиме багато часу та грошей. Також це вб'є мою кішку, і це мене засмутить.

Я думав принести йому своїх донорських друзів від донора. Я не наважуюся намагатися їх зафіксувати на випадок, якщо ssh спробує завантажити його і скоротить рядок (двійковий файл все одно відсутній). Це звучить як робота для двоюрідного брата моєї кішки:

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

На жаль, він давно минув.

Тепер я можу спробувати обдурити свого кота, щоб він виконав ритуал, щоб воскресити його:

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

І це працювало. Він майже живий:

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

Йому просто потрібна крихітна іскра життя. Та маленька +xмагічна заклинання, яку я наразі не можу сказати.

Чи можете ви допомогти мені повернути друзів моєї кішки?


3
Чи можете ви запустити /lib/ld-linux.so.2 ./netcat(або еквівалент вашої системи) і щось отримати?
Майкл Гомер

4
Також: яка це операційна система? У вас встановлені файлові системи vfat або NTFS? Мережеві файлові системи? Розділи, якими можна видалити вміст? Чи існують якісь - або доступні файли з правами на виконання?
Майкл Гомер

3
"Крім того, це вб'є мою кішку, і це мене засмутить". - Я завжди вважав, що приказка "Жодним дівчатам не було пошкоджено під час виробництва цього", це була просто приказка, але добре ...
rugk

7
Я цілком повинен був підтримати це за всі ці котячі аналогії… 😂
rugk

2
бідна кішка, я сподіваюся, що він добре :(
кіт

Відповіді:


37

Є кілька можливостей, все залежно від точних параметрів вашої ситуації прямо зараз. Я буду припускати Linux у наступних прикладах, де це можливо, але подібні функціональні можливості існують на інших платформах у більшості випадків.

  • Можливо, ви зможете отримати динамічний завантажувач для запуску виконуваного файлу для вас. Якщо припустити, що catце динамічно пов'язане, еквівалент вашої платформи, /lib/ld-linux.so.2ймовірно, також буде в пам'яті і, таким чином, можна використовувати для запуску двійкового файлу:

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

    У вас може бути кілька таких (ймовірно, 32- та 64-розрядні), і може бути декілька копій або символьні посилання, які потребують вирішення. Один з таких може працювати.

  • Якщо у вас встановлена ​​файлова система vfat або NTFS або інша, яка розглядає всі файли як 777, ви можете створити там свій виконуваний файл.

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
  • Якщо у вас є змонтована мережева файлова система, навіть якщо вона не є локальною для запису, ви можете створювати файли на віддаленій системі та використовувати їх нормально.
  • Якщо на змонтованому розділі, який не хвилює вміст, на диску, який все ще працює, ви можете замінити вміст новим зображенням того ж типу файлової системи, що містить виконувані файли - catце буде добре для цього в роль, яку зазвичай використовують люди dd, і ви можете надавати зображення по мережі.

    $ cat > /dev/sdb1 < ...

    Цей варіант правдоподібний, але в ньому є багато місця, де не можна працювати, залежно від того, що саме є в пам'яті цього розділу.

  • Якщо є будь-який доступний файл, який має дозвіл на виконання будь-якої файлової системи, що записується, ви можете cat >в ньому замінити вміст на вибраний бінарний файл.

    $ cat > ~/test.py < ...
  • Оскільки Bash все ще працює, ви можете динамічно завантажувати плагін Bash в процес, що розкриває chmod. Зокрема, ви можете встановити та завантажитиctypes.sh , який надає інтерфейс іноземної функції Bash, а потім dlcall chmod ./netcat 511.
  • Ви можете внести динамічний файл бібліотеки foo.soсвоєї конструкції, а потім catзавантажити його від свого імені LD_PRELOAD, що дозволяє виконувати довільний код.

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

    Якщо ви перехопите, наприклад open,:

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

    тоді ви можете робити все, що вам потрібно зробити там.

Моя пропозиція полягатиме в тому, щоб ввести busyboxперший статично пов'язаний виконуваний файл у якості першого елемента (або насправді єдиного елемента), щоб у вас був доступний повний спектр команд без повторного використання будь-якого злому, який довів вас до цього виснаження.


3
Повторно "статично пов'язаний busybox": Зауважте, що він sashбув спеціально розроблений для подібних випадків використання, і він може бути легше доступний у крайній частині (наприклад, ви можете встановити його заздалегідь, а копію залишити десь так, щоб вона зберігалася в пам'яті, коли система перерви ... або ви можете вирвати своїх домашніх тварин і придбати купу худоби, напевно).
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.