시스템 환경 분석
이번 문제는 R-Studio를 활용해 주어진 이미지를 분석하는 것으로 시작됩니다. Root 디렉터리에는 아무런 파일도 존재하지 않으며, 일반 사용자 계정을 살펴본 결과 Ubuntu 사용자가 발견되었습니다.
타겟 머신의 원격 연결 기록을 확인하기 위해 history 명령어를 실행했지만, 이전에 실행된 명령어들이 없었습니다. 또한 의심스러운 외부 연결 역시 발견되지 않았습니다. 네트워크 인터페이스 정보를 확인한 결과 두 개의 네트워크 카드만 존재했습니다.
여기서 우리는 커널 레벨에서 발생한 훅킹 가능성을 고려할 수 있습니다. 이를 검증하기 위해 tcpdump로 eth0 인터페이스를 모니터링했습니다. 그러나 예상과 달리 관련 IP 주소가 나타나지 않았습니다.
#!/bin/bash
INTERFACE="${1:-eth0}"
if [ "$(id -u)" -ne 0 ]; then
echo "관리자 권한으로 실행해야 합니다."
exit 1
fi
echo "현재 인터페이스($INTERFACE)의 TCP 연결 감시 중..."
tcpdump -i "$INTERFACE" -n -t -l tcp 2>/dev/null | awk '
BEGIN {
cmd = "ip -o addr show dev \"'"$INTERFACE"'\" | awk '\''$3 == \"inet\" {split($4, a, \"/\"); print a[1]}'\''"
cmd | getline local_ips
close(cmd)
split(local_ips, ips, " ")
}
{
if (match($0, /IP ([0-9.]+)\.([0-9]+) > ([0-9.]+)\.([0-9]+)/, m)) {
for (i in ips) {
if (m[1] == ips[i]) {
conn = sprintf("[%s:%s → %s:%s]", m[1], m[2], m[3], m[4])
if (!seen[conn]++) {
"date +\"%Y-%m-%d %H:%M:%S\"" | getline now
print "[" now "] " conn
fflush()
}
break
}
}
}
}'
문제 1: 주기적으로 활성화되는 C2 서버 식별
Ubuntu 홈 디렉터리를 조사하던 중 이름이 단순한 '1.txt'라는 파일을 발견했습니다. 해당 파일은 특정 웹사이트에서 파일을 다운로드하는 명령어를 포함하고 있었습니다.
전체 시스템에서 해당 파일을 찾으려고 했으나 실패했습니다. 하지만 .viminfo 파일을 분석한 결과, '/etc/systemd/system/system-upgrade.service' 파일이 수정되었음을 알 수 있었습니다. 해당 서비스 파일은 '/sbin/insmod' 명령어를 통해 특정 드라이버를 로드하는 내용을 포함하고 있었습니다.
드라이버 파일을 클라우드 샌드박스에서 분석한 결과 악성 코드임을 확인했습니다. IDA 프로그램으로 분석하여 최종적으로 4948 포트를 사용하는 TCP 연결이 목표 C2 서버와의 통신임을 파악했습니다.
flag{59110f555b5e5cd0a8713a447b082d63}
문제 2: 원격 제어 악성 코드 식별
위에서 언급된 드라이버 파일을 다시 분석한 결과, 'systemd-agentd'라는 파일이 추가적인 의심 대상으로 등장했습니다. 이를 샌드박스에서 실행한 결과 악성 코드임이 증명되었습니다.
flag{bccad26b665ca175cd02aca2903d8b1e}
문제 3: 지속성 악성 코드 다운로더 식별
IDAPython을 이용해 해당 파일을 분석한 결과, 'download_and_execute'라는 함수가 발견되었습니다. 해당 함수는 wget 명령어를 통해 특정 파일을 다운로드하고 chmod 명령어로 실행 권한을 부여하는 동작을 수행합니다.
flag{78edba7cbd107eb6e3d2f90f5eca734e}
문제 4: 다운로더의 초기 심입 흔적 추적
1.txt 파일에서 기록된 wget 명령어를 통해 삭제된 파일이 바로 다운로더의 초기 버전임을 추론할 수 있었습니다.
flag{9729aaace6c83b11b17b6bc3b340d00b}
문제 5: 악성 코드 통신 복호화
'systemd-agentd' 파일의 문자열 섹션을 분석한 결과 '/proc/self/exe' 호출이 발견되었습니다. 이후 sub_40641D 함수를 중심으로 암호화 키 추출 작업을 진행했습니다.
key_data = [
0x3D, 0x01, 0x20, 0x3A, 0x36, 0x58, 0x3A, 0x36, 0x1D, 0x01, 0x5A,
0x36, 0x3A, 0x5A, 0x0A, 0x3B, 0x5A, 0x1D, 0x36, 0x0F, 0x05, 0x29, 0x0E
]
decrypted_key = bytes(b ^ 0x69 for b in key_data)
print(decrypted_key.decode())
flag{ThIS\_1S\_th3\_S3cR3t\_fl@g}