배경

SOC101 강의를 보던 중 실수로 rm * 명령어를 잘못 실행해서 실습 파일이 삭제되었습니다.

삭제된 파일은 1.pcap이며 원래 경로는 /home/ubuntu/Desktop/02_NetworkAnalysis/03_Snort/Pcaps였습니다. 다행히 분석을 위해 Wireshark에서 해당 pcap 파일을 열어 둔 상태였습니다.

Linux에서는 파일이 삭제되어도 어떤 프로세스가 그 파일을 아직 열고 있으면 디스크의 inode가 바로 사라지지 않습니다. 이때 /proc/<PID>/fd에 남아 있는 파일 디스크립터를 복사하면 파일을 복구할 수 있습니다.

복구가 끝날 때까지 Wireshark를 종료하면 안 됩니다. 프로세스가 파일을 닫으면 /proc/<PID>/fd에서도 접근할 수 없게 됩니다.

파일 복구

1. 삭제된 pcap을 열고 있는 프로세스 찾기

sudo lsof +L1 | grep -Ei 'pcap|wireshark'

+L1 옵션은 링크 수가 1보다 작은 열린 파일, 즉 삭제되었지만 아직 프로세스가 잡고 있는 파일을 찾을 때 사용합니다. 상황에 따라 다음처럼 확인해도 됩니다.

sudo lsof | grep deleted | grep -Ei 'pcap|wireshark'

예상되는 출력은 다음과 비슷합니다.

Wireshark  4348  ubuntu  25r  REG  8,1  123456  0  12345  /home/ubuntu/Desktop/02_NetworkAnalysis/03_Snort/Pcaps/1.pcap (deleted)

여기서 4348은 PID이고, 25r에서 숫자 25는 파일 디스크립터 번호입니다.

2. /proc/<PID>/fd에서 fd 확인하기

PID를 확인했으면 해당 프로세스의 fd 디렉터리를 확인합니다.

sudo ls -l /proc/4348/fd | grep deleted

출력 예시는 다음과 같습니다.

25 -> /home/ubuntu/Desktop/02_NetworkAnalysis/03_Snort/Pcaps/1.pcap (deleted)

파일 타입도 확인합니다.

sudo file /proc/4348/fd/25

tcpdump capture file 또는 pcapng capture file처럼 pcap 계열 파일로 표시되면 복구 대상이 맞습니다.

3. 안전한 위치로 먼저 복사하기

바로 원래 경로에 쓰기보다 별도 복구 폴더에 먼저 복사하는 것이 안전합니다.

mkdir -p ~/recovered-pcaps
sudo cp /proc/4348/fd/25 ~/recovered-pcaps/1.pcap
sudo chown "$USER:$USER" ~/recovered-pcaps/1.pcap

cp가 실패하면 dd로도 복사할 수 있습니다.

sudo dd if=/proc/4348/fd/25 of=~/recovered-pcaps/1.pcap bs=4M status=progress
sudo chown "$USER:$USER" ~/recovered-pcaps/1.pcap

4. 복구된 파일 검증하기

복사한 파일이 정상적으로 읽히는지 확인합니다.

capinfos ~/recovered-pcaps/1.pcap
tcpdump -r ~/recovered-pcaps/1.pcap -nn -c 5

capinfos가 패킷 수와 캡처 포맷을 정상적으로 보여 주고, tcpdump가 처음 몇 개 패킷을 출력하면 복구가 성공한 것입니다.

5. 원래 위치로 되돌리기

검증이 끝난 뒤 원래 경로에 다시 복사합니다.

mkdir -p /home/ubuntu/Desktop/02_NetworkAnalysis/03_Snort/Pcaps
cp ~/recovered-pcaps/1.pcap /home/ubuntu/Desktop/02_NetworkAnalysis/03_Snort/Pcaps/1.pcap

실패하는 경우

  • lsof에서 (deleted) 파일이 보이지 않으면 Wireshark가 더 이상 파일을 잡고 있지 않은 상태입니다.
  • Wireshark를 이미 종료했다면 /proc/<PID>/fd 방식으로는 복구할 수 없습니다.
  • 권한 오류가 나면 sudo로 다시 실행합니다.
  • 파일이 일부만 복사되었거나 손상되었다면 editcap으로 읽히는 구간만 따로 저장할 수 있는지 확인합니다.
editcap ~/recovered-pcaps/1.pcap ~/recovered-pcaps/1-fixed.pcap