Восстановить удалённый файл через /proc
- имя
recover-deleted- образ
python:3.12-slim- таймаут
- 30с
Задание
Восстановить удалённый файл через /proc
Демон secret-writer открыл /data/secret.txt на запись и продолжает
дописывать туда данные (лог-стиль). Кто-то случайно сделал rm /data/secret.txt.
Самого файла на диске уже нет, но процесс всё ещё держит его открытым через
файловый дескриптор — а значит, содержимое всё ещё доступно через /proc.
Задача
Восстановите текущее содержимое в файл /tmp/recovered-secret.txt. Конкретно:
там должна оказаться строка, начинающаяся с the-password-is- (маркер лабы),
за которой идёт сам пароль.
Симптомы
$ ls /data/secret.txt
ls: cannot access '/data/secret.txt': No such file or directory
$ ls -l /proc/$(pgrep -f secret-writer)/fd/ 2>/dev/null | head
total 0
lrwx------ 1 root root 64 ... 0 -> /dev/null
lrwx------ 1 root root 64 ... 1 -> /dev/null
lrwx------ 1 root root 64 ... 2 -> /dev/null
l-wx------ 1 root root 64 ... 3 -> /data/secret.txt (deleted) ← вот оно
Видите (deleted) у FD — это и есть «удалённый, но открытый» файл.
Как восстановить
Файл доступен как /proc/<pid>/fd/<n> — это символическая ссылка на inode
(пусть и помечена deleted). Можно её просто скопировать:
$ cp /proc/<pid>/fd/3 /tmp/recovered-secret.txt
$ cat /tmp/recovered-secret.txt
the-password-is-s3cret
<pid> = PID процесса secret-writer, <n> = номер FD со ссылкой на
удалённый файл.
Почему это hard
Это классический трюк с LKSF/forensics: «думали, файл пропал, а процесс его
держит». Реальные сценарии — случайно удалённые логи nginx/mysql, которые
продолжают занимать место на диске (FD жив → inode не освобождён), или
вытащить ключ из памяти работающего сервиса. Лабра учит читать /proc/<pid>/fd
и понимать разницу между именем файла и inode.
Подсказки
pgrep -f secret-writer— найти PID процесса-владельца FD.ls -l /proc/<pid>/fd/— увидеть все дескрипторы; найти строку с(deleted).cat /proc/<pid>/fd/<n>— прочитать содержимое, хотя имя файла удалено.cp /proc/<pid>/fd/<n> /tmp/recovered-secret.txt— восстановить.
Подсказки
Hints: recover-deleted
Концепция
В Linux имя файла и его inode — разные вещи. rm удаляет имя (hard
link), но если процесс держит файл открытым через дескриптор, inode живёт до
тех пор, пока не закроется последний FD. Поэтому df показывает занятое
место, а ls уже не видит имени.
/proc/<pid>/fd/<N> — символическая ссылка на inode (с пометкой (deleted)),
и через неё можно читать/копировать содержимое, как будто файла и не удаляли.
Шаги
- Найти PID процесса, который держит файл:
pgrep -f secret-writer - Посмотреть его FD:
ls -l /proc/<pid>/fd/
Один из FD будет со ссылкой... -> /data/secret.txt (deleted). - Прочитать (чтобы убедиться, что там нужные данные):
cat /proc/<pid>/fd/<N> - Скопировать в ожидаемое место:
cp /proc/<pid>/fd/<N> /tmp/recovered-secret.txt - Проверить:
head -1 /tmp/recovered-secret.txt
Должна быть строка, начинающаяся сthe-password-is-.
Бонус
lsof +L1 показывает все файлы с link count < 1 (открытые, но удалённые).
В slim-образе lsof обычно нет, но его можно доставить: apt-get install lsof.
Терминал
Закрывается при остановке сессии.
Последние попытки
- Загрузка…
Разовый запуск (smoke-тест)
Атомарный цикл up → check → down. Полезно для CI; без предварительной подготовки состояния проверка завершится с ошибкой.