DAY36
DAY36

osforensic 사용하기2


osforensic
무료판(30일) > 케이스 3개까지만 생성 가능
기존 3개 차면 삭제하는 식으로 진행

계속 사용하고 싶으면 autopsy 사용하기(무료)

--------------------------------------
관리자 실수로 악성코드가 침투되었다.
0) stManager 해시값은 무엇인가?
	file evidence item > managerpc.vmdk 파일 올리기
	(vmdk로 불러오는게 호환이 좋다.)
	verify drive/image > 해시값 확인!
	=> 24a20e96a93b7582a3af4877080d4fb7
	   fd7737c706e6987d36ade3a764a9253ce96eac07
	   (md5 충돌 가능성 있으므로 sha1을 많이 사용한다.)


리눅스 > 로그 분석
		/var/log
윈도우 > 이벤트, 레지스트리, 약간의 로그
경로 root > windows > system32 > config에서 5개의 레지스트리 파일 확인
=> SAM/ SECURITY/ SOFTWARE/ SYSTEM/ DEFAULT

1) 컴퓨터 부팅 및 셧다운 시간은?
	SYSTEM 파일 분석
	경로
	C:\Windows\System32\config\SYSTEM
	ControlSet001\Control\Windows\ShutdownTime
2) 사용자는 누구인가?
	SAM 파일 분석
	SAM 오른쪽 마우스 > OPEN WITH ... > REGISTRY VIEW
	sam > account > users > 
	=> 000001F4(administrator)/000001F5(guest)/000003E8(manager)
	=> administrator / guest / manager 찾음

3) 무슨 사이트에 접속했나?
4) 무슨 파일을 받았나?
users > manager > downloads > jyb.exe 찾기
가져오자마자 방화벽이 지움 !!
5) 파일을 실행했나?

Bootstrap Example

SAM 파일 분석용 코드 짜기

	
	*forensic.py*

기본 구조

import regipy

class Forensic:
    pass

def main():
    sam_path = r'C:\Users\PC1\Desktop\export\SAM'
    
    print("start program")

    # SAM 파일을 Hive 객체로 로드
    hive = regipy.RegistryHive(sam_path)
    
    #hive = regipy.Hive(sam_path)
    print(hive,dir(hive))

if __name__=="__main__":
    main()

레지스트리 구조 파악하기

import regipy

class Forensic:
    pass

def main():
    sam_path = r'C:\Users\PC13\Desktop\export\SAM'
    
    print("start program")

    hive = regipy.RegistryHive(sam_path)
    
    root_key = hive.get_key('SAM')
    domains_key = root_key.get_subkey('Domains')
    account_key = domains_key.get_subkey('Account')
    users_key = account_key.get_subkey('Users')
    names_key = users_key.get_subkey('Names')
    print(users_key,dir(users_key))
    for user in names_key.iter_subkeys():
        print(user.name)


if __name__=="__main__":
    main()

반복문 이해하기

import regipy
import binascii

def extract_ntlm_hash(key):
    """
    특정 레지스트리 키에서 NTLM 해시를 추출합니다.
    """
    try:
        # 'user' 키에서 NTLM 해시 정보 추출 (주로 'F' 값에 있음)
        values = key.iter_values()
        for value in values:
            if 'F' in value.name:  # F 값이 패스워드 해시를 포함하는 경우
                print(f"NTLM Hash Found: {binascii.hexlify(value.value).decode()}")
                return binascii.hexlify(value.value).decode()  # 해시 값을 리턴
    except Exception as e:
        print(f"Error extracting NTLM hash: {e}")
    return None

def explore_user_info(hive, path):
    try:
        # 해당 경로가 존재하는지 확인
        key = hive.get_key(path)
        print(f"Found key at: {path}")
        
        # 서브키가 있을 경우, 서브키 탐색 (사용자 계정 정보는 이곳에 있을 가능성이 있음)
        subkeys = key.iter_subkeys()
        if subkeys:
            for subkey in subkeys:
                print(f"User SID: {subkey.name}")  # SID를 사용자 계정 식별자로 표시
                user_subkey_path = f"{path}\\{subkey.name}"
                
                # 각 SID에 해당하는 사용자 정보 출력
                explore_user_info(hive, user_subkey_path)
        else:
            print("No subkeys found for user info.")

        # 값을 확인하여 사용자 정보 출력 (값이 존재하면 사용자 관련 정보일 가능성 있음)
        values = key.iter_values()
        if values:
            for value in values:
                print(f"Value Name: {value.name}")
                
                if hasattr(value, 'value'):
                    print(f"Value Data: {value.value}")  # 값 데이터 출력
                else:
                    print("No value attribute found for this value.")
                
                if hasattr(value, 'value_type'):
                    print(f"Value Type: {value.value_type}")
                else:
                    print("No value_type attribute found for this value.")
                
                # 비밀번호 해시 추출
                if 'F' in value.name:  # 'F' 필드에서 해시가 추출될 수 있음
                    print(f"NTLM Hash Found: {binascii.hexlify(value.value).decode()}")
        else:
            print("No values found for user info.")

    except Exception as e:
        print(f"Error exploring {path}: {e}")

def main():
    sam_path = r'C:\Users\PC11\Desktop\export\SAM'

    print("start program")

    # SAM 파일을 Hive 객체로 로드
    hive = regipy.RegistryHive(sam_path)

    print("Exploring user information in SAM file...")

    # 'SAM\Domains\Account\Users' 경로에서 사용자 정보 탐색
    explore_user_info(hive, r'HKEY_LOCAL_MACHINE\SAM\Domains\Account\Users')

if __name__ == "__main__":
    main()

Bootstrap Example

SYSTEM 파일 분석용 코드 짜기


1.지금 실행중인 윈도우 레지스트리 system 파일 분석
import winreg
from datetime import datetime, timedelta

def filetime_to_datetime(filetime):
    """Windows FILETIME (100ns 단위) 값을 datetime 형식으로 변환"""
    windows_epoch = datetime(1601, 1, 1)
    return windows_epoch + timedelta(microseconds=filetime // 10)

def get_last_boot_time():
    try:
        # 레지스트리 경로
        reg_path = r"SYSTEM\ControlSet001\Control\Windows"
        reg_key = "ShutdownTime"

        # 관리자 권한으로 레지스트리 읽기
        with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, reg_path, 0, winreg.KEY_READ) as key:
            last_boot_time, reg_type = winreg.QueryValueEx(key, reg_key)

            # 바이트 데이터를 정수로 변환 (리틀 엔디안)
            last_boot_time_int = int.from_bytes(last_boot_time, byteorder='little')

            # FILETIME 값을 실제 날짜로 변환
            boot_time = filetime_to_datetime(last_boot_time_int)

            print(f" 마지막 부팅 시간: {boot_time}")
    except PermissionError:
        print(" 오류: 관리자 권한으로 실행해야 합니다.")
    except Exception as e:
        print(f" 오류 발생: {e}")

# 실행
get_last_boot_time()

=> 결과값:마지막 부팅 시간: 2025-01-15 12:00:20.797606

2. 경로 변경..

Bootstrap Example

미션: 악성코드 올리기


스위치 버튼 2로 변경 후
http://125.246.95.253으로 접속
칼리 활성화 후 서버에 각 조 별로 악성코드 만들어서 올리기
4조: 4.exe

***TIP
kali
apache2 000-default 파일 설정한 뒤에 a2enmod userdir 해야함!!