워게임 포렌식 #09 (Digital Forensics - Docker layers)
문제 출처 https://www.root-me.org/en/Challenges/Forensic/Docker-layers

flag 파일을 암호화하는 패스워드 분실로 이를 복구해야 한다.
힌트로는 docker Generic 취약점 sheet 를 주었지만, 링크 유효기간이 만료되어 보이지 않는다.

Start the challenge 를 누르면 아래와 같은 ch29 압축 파일이 생성된다.

압축을 풀면 아래 사진과 같은 파일이 존재한다

파일을 들어가면 docker 구조를 가지고 있다. 이를 리눅스에서 이미지를 mount해서 살펴보자.

Kali Linux에서 진행한다.
Y를 눌러 계속 진행한다.
sudo apt-get install docker.io

문제파일을 확인한다
ls -al

docker 이미지를 mount 한다.
docker load < ch29.tar

docker 이미지를 확인하고, docker 실행 및 /bin/sh로 docker 이미지 내부를 탐색한다.
docker images
docker run -i -t rootme/docker_layer /bin/sh
#ls

조금더 자세히 살펴보기 위해 ls -al 명령어를 사용하면 flag.enc 라는 암호화된 falg 파일이 보인다.

cat 명령어를 사용해 파일을 확인하면아래 사진과 같이 Salted되어 있다고 나온다.

flag.enc 파일의 내용을 통해 암호화 종류를 확인한다.
OpenSSL salted format이다.
복호화명령어 포맷은 아래와 같다.
openssl aes-128-cbc -d -in secret.txt.enc -out secret2.txt

따라서 flag.enc파일이 플래그를 나타내는 파일이라고 가정한다면, 암호화 되어있고 이를 풀어야 하는게 이번 문제의 핵심이다.
암호화에 사용된 키 파일을 찾아 복호화에 이용한다.
docker 이미지를 inspect 명령어를 사용해 확인하면, docker 시작 시 실행되는 명령어를 확인 가능하다.
docker inspect rootme/docker_layer

docker 구동 시 pass.txt파일을 삭제한다.
따라서 해당 파일을 조회하기 위해 find 명령어를 사용한다.
find / -name "*flag.enc*"

find 명령어 결과에서 docker 이미지와 관련한 pass.txt 파일이 2개 나온다.
/var/lib/docker/overlay2/b39239e0ffac33fbcce972371657e617163ea1610a4e059d3412e9e93edbb062/diff/pass.txt
/var/lib/docker/overlay2/d378b8d68afe8cee64e460703180363202228f4a1f6812dee55256516e598813/diff/pass.txt
첫번째 경로의 pass.txt 확인한다.
cat /var/lib/docker/overlay2/b39239e0ffac33fbcce972371657e617163ea1610a4e059d3412e9e93edbb062/diff/pass.txt

pass.txt 내용으로부터 AES 암호화의 키를
16진수 64개의 바이트 구성 -> 64 * 4 = 256 비트
AES의 256비트 키를 사용했다고 가정한다.
AES (Advanced Encryption Standard)에서
128비트 키 사용 -> 해시 값 길이 16바이트(128비트)
256비트 키 사용 -> 해시 값 길이 32바이트(256비트)
두 번째 경로의 pass.txt는 c 가 붙여져있다. 이는 문자 장치 파일을 나타내며 문자 장치에 대한 인터페이스를 제공한다.

키 파일로부터 암호화 파일을 복호화 한다.
아래 명령어를 사용해 암호화 파일(flag.enc)로부터 복호화 파일인 flag.txt 파일을 획득한다.
openssl enc -aes-256-cbc -iter 10 -d -in flag.enc -out flag.txt

아래와 같은 복호화 암호를 사용해 플래그를 획득한다.
pass.txt
d4428185a6202a1c5806d7cf4a0bb738a05c03573316fe18ba4eb5a21a1bc8ea


시도한 방법을 기술한다. docker 설정 관련 파일을 flag 관련 파일로 오해했다.
더 쉽게 문제를 풀기 위한 방법도 찾았다.
find 명령어를 사용해 flag 관련 파일을 검색한다.
# find . -name "*flag*"

첫번째 위치(/sys/devices/platform/serial8250/tty/ttyS2/
)의 flag파일을 확인한다.

16진수 값과 암호화를 연관시켜 AES 암호화라고 가정했다.
AES 암호화를 위해 암호화 키를 16진수 문자열을 바이트 배열로 변환하여 AES 키를 생성한다.
따라서 ttyS0, ttyS1, ttyS2, ttyS3을 조합해 키를 임의로 만들고 이를 사용해 복호화 시도한다.
# find . -name "*flag*"
./sys/devices/platform/serial8250/tty/ttyS2/flags
./sys/devices/platform/serial8250/tty/ttyS0/flags
./sys/devices/platform/serial8250/tty/ttyS3/flags
./sys/devices/platform/serial8250/tty/ttyS1/flags
./sys/devices/virtual/net/lo/flags
./sys/devices/virtual/net/eth0/flags
./sys/module/scsi_mod/parameters/default_dev_flags
./proc/sys/kernel/acpi_video_flags
./proc/sys/net/ipv4/fib_notify_on_flag_change
./proc/sys/net/ipv6/fib_notify_on_flag_change
./proc/kpageflags
./flag.enc
cat /sys/devices/platform/serial8250/tty/ttyS0/flags
cat /sys/devices/platform/serial8250/tty/ttyS1/flags
cat /sys/devices/platform/serial8250/tty/ttyS2/flags
cat /sys/devices/platform/serial8250/tty/ttyS3/flags
cat /sys/devices/virtual/net/lo/flags
cat /sys/devices/virtual/net/eth0/flags
해당 시리얼 포트의 속성이나 상태와 관련된 정보
복호화 목적 명령어의 사용이 헷갈려 문제를 푸는데 어려움을 겪었다.
복호화 시도 목적 사용 명령어는 아래와 같다.
openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000000 -salt -in InputFilePath -out OutputFilePath
-md에서d 옵션이 복호화 옵션인줄 알았지만, md 는 메시지 다이제스트를 생성 옵션이었다.
따라서 key 파일 이용 복호화에서 사용한 복호화 명령어를 사용해야 한다.
처음 문제를 다운로드 받고 이를 docker run 이전에 manifiest.json 파일을 확인하면, docker run 시 발생하는 내용을 확인할 수 있는데, 문제에서 제시하는 암호화에 사용되는 password 파일을 암호화 파일(문제의 flag가 있는 파일)을 생성하고 rm 명령어로 삭제해 버린다.

암호화 명령어와 삭제한 password파일(pass.txt)를 확인할 수 있다. 암호화 명령어를 반대로 -d 옵션을 사용해 복호화 하면 된다.

openssl 복호화 : https://nineninenine.blog/
openssl 형식 : http://justsolve.archiveteam.org/wiki/OpenSSL_salted_format
문제 원본 github(답도 존재한다) : https://github.com/nh4ttruong/r00tm3/blob/main/Forensics/Docker-layer/Docker-layer.md