Git 이력에서 삭제된 파일과 비밀정보 찾기

🛡️ 강사 제공 인가된 실습 환경에서 수행

이번에는 이전 편에 이어서 Chapter 2 문제들을 풀어봤다.

1번과 2번 문제는 CJ올리브네트웍스와 관련된 OSINT 문제였다.
이메일 주소를 찾거나, 사용 중인 SSL VPN 서비스의 개발사를 찾는 식의 문제였는데 이번 글에서는 생략하려고 한다.


3번

개발자가 커밋한 홍보 이미지에 수상한 흔적이 남아 있는 것 같습니다.

먼저 현재 디렉터리의 파일 목록을 확인했다.

ls -la

파일 목록을 보니 .git 디렉터리가 있었다.
즉 현재 위치가 Git 저장소라는 뜻이다.

먼저 README.mddeploy.conf 파일을 확인했다.

cat README.md
cat deploy.conf

deploy.conf의 내용을 보면 다음과 같은 항목이 있었다.

asset=company.png

그런데 현재 파일 목록에는 company.png가 보이지 않았다.

따라서 현재 디렉터리에서는 사라졌지만, 과거 Git 커밋에는 남아 있을 가능성이 있다고 판단했다.

Git 커밋 기록과 파일 변경 상태를 확인했다.

git log --all --name-status --oneline

출력을 확인해보니 과거 커밋에서 company.png가 추가된 기록이 있었다.

A       company.png

여기서 AAdded, 즉 해당 커밋에서 파일이 추가되었다는 뜻이다.

이제 해당 커밋에서 이미지 파일을 추출했다.

git show 28a1dbf:company.png > /tmp/company.png

명령어를 나눠서 보면 다음과 같다.

git show 28a1dbf:company.png

28a1dbf 커밋 시점의 company.png 파일 내용을 출력한다.

> /tmp/company.png

출력된 내용을 /tmp/company.png 파일로 저장한다.

이미지는 바이너리 파일이므로 cat 대신 strings 명령어를 사용했다.

strings /tmp/company.png

이미지 내부의 주석 영역에서 플래그를 확인할 수 있었다.

짠!


4번

커밋한 기록을 볼 수 있나요?

이번 문제도 Git 저장소에서 진행됐다.

이런 문제는 먼저 Git 커밋 기록을 확인하는 것이 좋다.

git log --all --name-status --oneline

이 명령은 다음 정보를 함께 보여준다.

커밋 해시
커밋 메시지
변경된 파일명
파일의 변경 상태

파일 상태는 다음과 같다.

A = Added
M = Modified
D = Deleted
R = Renamed

여러 커밋 중 다음 메시지가 수상해 보였다.

ops: rotate deployment audit marker

audit marker라는 표현이 임시 토큰이나 플래그와 관련 있을 가능성이 있다고 판단했다.

해당 커밋의 메시지와 변경 내용을 자세히 확인했다.

git show c490357

플래그는 변경된 파일 안이 아니라 커밋 메시지 본문에 남아 있었다.

즉 민감정보는 파일 내용뿐 아니라 Git 커밋 메시지에도 남을 수 있다는 것을 확인할 수 있었다.

발견!


5번

우리는 반드시 SSH에 접속해야 합니다

Port 범위: 1~2000

이 문제는 SSH 서비스가 실행 중인 포트를 찾아 접속하는 문제였다.

SSH의 기본 포트는 22번이지만, CTF에서는 다른 포트로 변경해두는 경우가 많다.

문제에서 포트 범위를 1~2000으로 알려줬기 때문에 nmap을 이용해 해당 범위만 스캔했다.

nmap -sV -p 1-2000 대상_IP

옵션의 의미는 다음과 같다.

-sV

열린 포트에서 실행 중인 서비스의 종류와 버전을 확인한다.

-p 1-2000

1번부터 2000번까지의 TCP 포트만 검사한다.

출력에서 ssh 서비스가 실행 중인 포트를 찾은 뒤 다음과 같이 접속하면 된다.

ssh ctf@대상_IP -p 포트번호

즉 이 문제의 핵심은 다음과 같다.

nmap으로 열린 SSH 포트 탐색
→ 발견한 포트로 SSH 접속
→ 플래그 확인

6번

Git을 통해 사라진 정보를 찾아야 합니다

먼저 현재 파일과 Git 저장소의 구조를 확인했다.

ls -la

현재 파일 목록만 봐서는 특별한 단서가 보이지 않았다.

하지만 .git 디렉터리가 존재하므로 과거 커밋 기록을 확인했다.

git log --all --name-status --oneline

출력에서 다음 기록을 발견했다.

438931f chore: remove legacy backup config from bundle
D       config/backup.conf

여기서 DDeleted를 뜻한다.

438931f 커밋에서 다음 파일이 삭제되었다.

config/backup.conf

현재 디렉터리에서는 파일이 사라졌지만, Git 기록에는 삭제되기 전 내용이 남아 있다.

삭제되기 전 파일 내용을 확인했다.

git show 438931f^:config/backup.conf

명령어를 나눠서 보면 다음과 같다.

438931f

config/backup.conf 파일이 삭제된 커밋 해시다.

^

해당 커밋의 바로 이전 상태, 즉 부모 커밋을 의미한다.

:config/backup.conf

확인할 파일의 경로다.

따라서 전체 명령은 다음과 같은 의미다.

438931f 커밋이 적용되기 직전의
config/backup.conf 파일 내용을 출력

삭제되기 전 설정 파일 안에서 플래그를 확인할 수 있었다.

끝!!


마무리

Chapter 2에서는 Git과 관련된 문제가 많이 나왔다.

이번 문제들을 풀면서 다음 명령어를 반복적으로 사용했다.

git log --all --name-status --oneline
git show 커밋해시
git show 커밋해시:파일경로
git show 커밋해시^:파일경로

각 명령어의 용도는 다음과 같다.

git log --all --name-status --oneline
→ 전체 커밋과 파일 변경 상태 확인

git show 커밋해시
→ 특정 커밋의 메시지와 변경 내용 확인

git show 커밋해시:파일경로
→ 특정 커밋 시점의 파일 내용 확인

git show 커밋해시^:파일경로
→ 특정 커밋이 적용되기 직전의 파일 내용 확인

현재 작업 디렉터리에서 파일을 삭제하더라도 Git 이력에는 과거 내용이 남을 수 있다.

특히 비밀번호, 토큰, API 키 같은 민감정보를 Git에 한 번이라도 커밋하면 나중에 파일을 삭제하더라도 과거 커밋을 통해 다시 확인할 수 있다는 점이 인상적이었다.

**GPT 마스터 **

원본 · velog.io