Unfurl: URL 포렌식

Hunjison·2023년 4월 4일
0

Digital Forensics

목록 보기
15/17

설명

unfurl 이라는 유명한 프로젝트가 있다.
링크는 https://dfir.blog/unfurl/ 이고, URL만 넣어도 알아서 분석을 마쳐준다.
그 중에서도 오늘은 Unfurl > google > timestamp 를 알려주는 parameter 2개를 분석할 예정이다(ei parameter, ved parameter)

1. ei parameter

http://cheeky4n6monkey.blogspot.com/2014/10/google-eid.html

https://github.com/obsidianforensics/unfurl/blob/main/unfurl/parsers/parse_google.py

https://deedpolloffice.com/blog/articles/decoding-ei-parameter

1.1. 정리

  • Google search 할 때에 ei 파라미터가 생성된다.
    • chrome 기본 검색 엔진을 통해 검색했을 때는 ei 생성되지 않으나,
      google에 직접 검색했을 때에는 ei 가 생성됨
    • 검색 시에 ei 생성되지만, 이미지 탭, 뉴스 탭, 쇼핑 탭 등등 이동하면 ei 삭제됨

1.2. 형태

  • O6krZNHNNZC6hwOq4aOgCQ
    • 껍데기 벗겨진 Protobuf 형태(?)
    • base64 패딩 맞춰준 후에 base64 decode
    • 앞에서 4바이트 Little endian → unix timestamp
      뒤부터 protobuf varint 3개가 오는 형태
  • 파라미터 1은 Unix timestamp
    파라미터 2는 microseconds
    파라미터 3,4 Unknown
  • Python Code
    # python 3.X
    # https://github.com/obsidianforensics/unfurl/blob/3363420baf689a665715cd748c4f5b9880822a04/unfurl/parsers/parse_google.py
    
    import struct, base64
    
    def parse_ei(ei):
        decoded = base64.urlsafe_b64decode(ei)
    
        # grab 1st 4 bytes and treat as LE unsigned int
        timestamp = struct.unpack('<i', decoded[0:4])[0]
        parsed = [timestamp]
    
        varint_offset = 4  # First 4 (0-3) bytes are the timestamp
        for _ in [1, 2, 3]:
            try:
                value, bytes_used = decode_varint(decoded[varint_offset:])
                parsed.append(value)
                varint_offset += bytes_used
            except TypeError as e:
                log.warning(f'Unable to decode varint from {decoded}: {e}')
                return
    
        return parsed
    
    def decode_varint(source):
        result = 0
        number_of_bytes = 0
        for read in source:
            result |= ((read & 0x7F) << (number_of_bytes * 7))
            number_of_bytes += 1
            if (read & 0x80) != 0x80:
                return result, number_of_bytes
    
    def correct_b64_padding(s):
        return s + '='*(4 - len(s) % 4)

2. ved parameter

https://www.magnetforensics.com/resources/analyzing-timestamps-in-google-search-urls/

https://deedpolloffice.com/blog/articles/decoding-ved-parameter

2.1. 정리

  • Google search 할 때에 ved 파라미터 생성
    • ei 와는 달리 ved 는 이미지 탭, 쇼핑탭 등 이동해도 계속 존재함
      그러나, 값은 계속 바뀜!
  • 파라미터 1: link index
    파라미터 2: link type
    파라미터 3:

2.2. 형태

  • 0ahUKEwiR17e4s4_-AhUQ3WEKHarwCJQQ4dUDCA8

    • 맨 앞 0 또는 2 가 와야함. 별다른 의미는 없음
      만약 1 이 오면 암호화된 형태로, 해독 불가능(실제로 보지는 못함)
    • 맨 앞 1바이트를 제외한 나머지 영역은 protobuf로 해독하고 있으며 proto 아래와 같음
    • Protobuf 해독된 결과를 보기 위해 디버깅 코드를 삽입하고 결과를 확인
    • V13_Outer 내부에 timestamp가 존재하는 것을 확인
profile
비전공자 출신 화이트햇 해커

1개의 댓글

comment-user-thumbnail
2023년 6월 26일

좋은 글 감사합니다!!
궁금한 점이 있는데 메일 알 수 있을까요?

답글 달기