문제상황)
관리자 실수로 악성코드가 침투되었다.
관리자 pc를 분석하여 어떤 사이트에서 어떤 파일을 통해 악성코드에 감염되었는지 확인해보자.
0) 관리자 pc의 해시값을 기록한다.
file evidence item > managerpc.vmdk 파일 올리기
(vmdk로 불러오는게 호환이 좋다.)
verify drive/image > 해시값 확인
=> 24a20e96a93b7582a3af4877080d4fb7
fd7737c706e6987d36ade3a764a9253ce96eac07
(md5 충돌 가능성 있으므로 sha1을 많이 사용한다.)
1) 관리자 pc의 윈도우 설치 시간을 기록한다.
SOFTWARE 파일 분석
root > windows > system32 > config > SOFTWARE
microsoft > windows nt > currentversion > installdate
2) 관리자 pc의 사용자를 특정한다.
2-1) 관리자pc에 존재하는 계정 확인
SAM 파일 분석
SAM 오른쪽 마우스 > OPEN WITH ... > REGISTRY VIEW
sam > account > users >
=> 000001F4(administrator)/000001F5(guest)/000003E8(manager)
=> administrator / guest / manager 찾음
2-2) 계정 중 소유자를 특정한다.
SOFTWARE 파일 분석
root > windows > system32 > config > SOFTWARE
microsoft > windows nt > currentversion >registeredowner
=> manager 확인
F데이터 분석하기
SAM 오른쪽 마우스 > OPEN WITH ... > REGISTRY VIEW
SAM > Domains > Account > Users > manager
RID(Relative identifier : 비교 식별 값)
F(fixed format : 고정적 형식)
V(variable format : 유동적 형식)
F 데이터에 저장된 내용
02 00 01 00 00 00 00 00 AD 6D
1B 2F F9 78 DB 01 00 00 00 00
00 00 00 00 58 54 D7 7C E4 33
D6 01 FF FF FF FF FF FF FF 7F
00 00 00 00 00 00 00 00 E8 03
00 00 01 02 00 00 14 02 00 00
00 00 00 00 00 00 29 00 01 00
00 00 00 00 21 01 00 00 00 00
***레지스트리 뷰 툴 이용하기
오른쪽 마우스 > show hex interpreter windows
- 마지막 로그인 시각: 8~15자리
AD 6D 1B 2F F9 78 DB 01
01DB78F92F1B6DAD
=> 마지막 로그인 시간: 2025-02-07T09:42:37.007812+09:00
- 마지막 패스워드 변경 시각: 24~31자리
58 54 D7 7C E4 33 D6 01
01D633E47CD75458
=> 마지막 패스워드 변경 시각: 2020-05-27T14:05:49.405500+09:00
- 마지막 실패 로그인 시각: 40~47자리
00 00 00 00 00 00 00
=>F 키 값이 00으로만 채워져 있다면 해당 유저는 로그인을 실패한 적이 없음
- 로그온 횟수: 66~67자리
2F 00
=> 로그온 횟수: 47회
F분석.py
import datetime
def filetime_to_datetime(filetime_hex):
"""Windows FILETIME을 UTC 날짜로 변환"""
filetime_int = int(filetime_hex, 16) # 16진수 → 10진수 변환
epoch_start = datetime.datetime(1601, 1, 1, tzinfo=datetime.timezone.utc)
utc_time = epoch_start + datetime.timedelta(seconds=filetime_int / 10_000_000)
# UTC → 한국 시간(KST) 변환
kst_time = utc_time.astimezone(datetime.timezone(datetime.timedelta(hours=9)))
return kst_time
def parse_f_data(f_data_hex):
"""SAM F 데이터 해석"""
# 16진수 문자열 → 바이트 변환 후 Little Endian 변환
last_login_bytes = bytes.fromhex(f_data_hex[16:32]) # 8바이트 Windows FILETIME
last_login_time = filetime_to_datetime(last_login_bytes[::-1].hex()) # Little Endian 변환 후 처리
last_password_change_bytes = bytes.fromhex(f_data_hex[48:64])
last_password_time = filetime_to_datetime(last_password_change_bytes[::-1].hex())
failed_login_count_bytes = bytes.fromhex(f_data_hex[56:64]) # 4바이트, 0x1C - 0x1F
failed_login_count = int(failed_login_count_bytes[::-1].hex(), 16) # Little Endian 변환 후 정수 변환
# 결과 출력
print("🔍 SAM F 데이터 분석 결과")
print(f"📅 마지막 로그인 시간: {last_login_time}")
print(f"🔑 마지막 비밀번호 변경 시간: {last_password_time}")
print(f" 로그인 실패 횟수: {failed_login_count}")
# 테스트용 예제 데이터 (16진수 F 값 입력)
f_data_example = "0200010000000000AD6D1B2FF978DB0100000000000000005854D77CE433D601FFFFFFFFFFFFFF7F0000000000000000E803000001020000140200000000000000002900010000000000210100000000"
parse_f_data(f_data_example)
3) 접속한 사이트를 확인한다.
NTUSER.DAT 파일 분석
리눅스의 경우
/home/.bashrc
/etc/.profile
users>manager
>ntuser.dat 오른쪽 마우스 > open with ... registry view
\Users\PC14\AppData\Local\Google\Chrome\UserData\Default\History
> urls 테이블 클릭
=> 2025-02-06 11:07:52 http://192.168.0.214 접속 기록 확인
4) 악성코드를 받은 기록을 확인한다.
NTUSER.DAT 파일 분석
users>manager
>ntuser.dat 오른쪽 마우스 > open with ... registry view
\Users\PC14\AppData\Local\Google\Chrome\UserData\Default\History
> downloads 테이블 클릭
=> C:\Users\manager\Downloads\jyb.exe
2025-02-06, 11:08:01
다운로드 받은 파일명, 다운로드 일시 확인
5) 관리자가 악성코드를 실행했는지 확인한다.
SOFTWARE 파일 분석
root > windows > system32 > config > SOFTWARE
Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
=> 악성코드를 실행시키지는 않았다