This Post Covers
Teamviewer는 알려진 무료 원격제어 도구 중 사용이 간편해서 IT 종사자 뿐만 아니라 비종사자도 많이 사용하는 프로그램이다. PC에 많은 지식이 없는 친구, 부모님 등 컴퓨터에 설치하여 직접 방문하지 않고 원격을 통해 이슈를 해결할 수 있는 고마운 친구(?)이다.
팀뷰어의 로그에 대한 분석은 이미 예전부터 많은 사람들이 내용을 공개하였다. 구글에서 teamviewer forensics로 검색해도 많이 나온다. 하지만 버전이 업그레이드 됨에 따라 일부 구조가 변경되고 저장 경로가 바뀌고 한 것뿐이지 전체적인 로그의 틀은 동일하다.
최근 사건에서 사용됐던 동일한 버전에서 이것저것 분석을 진행하다가 우연히 IPv6 정보가 확인되어 두 편으로 나눠 포스팅을 남긴다.
TeamViewer(v15.16.8) Logs
일반적인 수사/분석 관점의 경우는 피해자의 PC에서 가해자의 정보 또는 가해자와 연결될 만한 정보를 찾아내는 것이 중요하다. 이런 관점에서 본다면 팀뷰어에서 큰 의미가 있을만한 로그는 두 가지이다.
- 원격 접속 로그: Connections_incoming.txt
- 접속 상세 로그: TeamViewer##_Logfile.log
로그는 기본적으로 설치 폴더에 저장되며 x64 아키텍쳐에 x64 바이너리를 설치했다면 C:\Program Files\TeamViewer에 저장되고 x86 바이너리로 설치했다면 C:\Program Files (x86)\TeamViewer에 저장이 된다.
Fig 1.과 같이 Device A에서 B로 원격을 시도한 경우 다음과 같이 로그가 남는다.
[ Fig 1. Remote Support Scenario from Device A to B ]
Connections_incoming.txt (UTC 0)
1. A’s TeamViewer Autogenerated ID
첫 번째로 A의 팀뷰어 아이디가 남는데 여기서 아이디는 프로그램이 원격 통신을 위해 자동으로 부여하는 임의의 숫자 값을 의미한다. 해당 값은 PC를 종료하거나 프로그램을 종료한 뒤 다시 실행시켜도 그대로 유지되는 값이며 보통 9자리나 10자리로 구성된다.
[ Fig 2. Teamviewer remote control ID ]
특이한 점은 테스트 당시 프로그램을 재설치 하더라도 값이 변하지 않았다. 컴퓨터 GUID 등 값을 이용해서 ID를 생성하는 것인지는 좀 더 판단이 필요하다.
2. A’s Display Name or Teamviewer ID(if login)
해당 컬럼은 오해하기 쉬울 수 있다. 주위의 많은 사람들이 단순히 A의 컴퓨터 이름이 기록되는 컬럼이구나라고 흔히 알고 있었다. 그런데 조금 더 정확하게 살펴보면 일단 팀뷰어에 로그인 후에 원격 통신을 한 경우와 로그인을 하지 않고 원격 통신을 한 경우로 나눠진다.
만일 로그인을 하지 않고 프로그램을 사용하면, 팀뷰어는 원격 대상자(B)에게 보일 이름으로 컴퓨터의 이름으로 초기 설정된다. 그리고 이 값이 로그에 남는 것이다.
[ Fig 3. Display name ]
만일 이 값을 임의로 변경하면 Connections_incoming.txt 및 TeamViewer##_Logfile.log 로그에서도 변경한 값으로 로그가 생성된다.
팀뷰어는 로그인해서 사용할 수도 있는데 로그인을 하면 자신이 자주 사용하는 원격 대상 PC 정보를 저장할 수도 있고, 해당 PC가 현재 켜졌는지 꺼졌는지도 확인할 수 있을 정도로 편한 인터페이스를 제공한다.
그럼 여기에서 팀뷰어 계정으로 로그인을 하게 되면 어떻게 될까? 로그인을 하면 로그인 계정의 유저명이 우선순위가 더 높아 유저명으로 로그가 생성된다. 유저명은 역시 설정에서 변경이 가능하다.
아래 Fig 4. 그림으로 로그인을 하지 않을 때(왼쪽)와 로그인을 한 경우(오른쪽)로 나눠서 로그가 어떻게 남는지를 표현하였다.
[ Fig 4. Log generated depending on login/logout status ]
3. Remote Support Start Time (UTC 0)
원격을 시작한 일시이며 dd-MM-yyyy hh:mm:ss 형태로 기록되며, 중요한 것은 UTC 0로 로깅되니 로컬 타임에 맞춰 시간값을 보정해줘야 한다. 대한민국이라면 9시간을 더하여(UTC+9) 로그를 분석 및 판단하여야 한다.
4. Remote Support End Time (UTC 0)
원격을 종료한 일시이며 나머지 내용은 Start Time과 내용은 동일하다.
5. B’s OS Account (Username)
다섯 번째 항목도 헷갈릴 수 있으나 이 부분은 팀뷰어 로그인과는 상관이 없이 원격을 받는 시스템 OS의 유저명으로 로그를 기록한다. 그런데 여기서 한 가지 생각해 봐야 할 문제는 윈도우의 경우, 이메일로 로그인을 하는 경우와 로그인을 사용하지 않았을 때로 나뉠 것이다.
결론부터 말하면 확인해본 결과 MS 계정으로 윈도우 로그인을 하거나 로컬 계정으로 사용하거나 상관없이 무조건 로컬 사용자 계정명으로 기록이 남았다.
TeamViewer##_Logfile.log (LocalTime)
‘connections_incoming.txt’ 로그와 다르게 ‘TeamViewer##_Logfile.log’ 로그는 원격 연결에 대한 더 상세한 정보를 담고 있다. 파일명에 기재된 두 자리 숫자(##)는 팀뷰어 소프트웨어에 대한 버전을 의미하는데, 조금 더 상세하게 말하면 버전 중 가장 상위인 메이저 숫자를 말한다.
Version 정보(X.Y.Z.)
Major Version . Minor Version . Build or Maintenance Version(patch) 형태로 구성된다.
‘TeamViewer##_Logfile.log’ 로그 역시 시간을 기록하는데 시간은 로컬 타임으로 보정되어 로그가 기록된다. 즉 우리나라의 경우 시스템 시간에 맞게 UTC+9로 기록이 된다. 해당 로그는 동일한 이름으로 2개가 존재하는데 로그의 내용도 다르고 저장되는 경로도 다르다.
1. %USERPROFILE%\AppData\Roaming\TeamViewer\TeamViewer##_Logfile.log
➔ 소프트웨어 동작에 대한 전반적인 로그를 기록
[ Fig 1. %USERPROFILE%\AppData\Roaming\TeamViewer ]
[ Fig 2. Content of TeamViewer15.log ]
2. C:\Program Files(x86)\TeamViewer\TeamViewer##_Logfile.log (install path)
➔ 원격 접속 및 연결에 대한 상세로그
[ Fig 3. Remote Access Log ]
Fig 3.에 두 가지 메이저 버전에 대한 로그가 보이는데 이는 버전이 14에서 15로 업그레이드된 것을 의미한다. 그리고 로그가 약 1MB 이상 되면 기존 로그 파일이 _OLD 이름으로 자동 아카이빙 되고 새로운 로그를 기록한다.
Log Analysis Flow & Tips
아래 디바이스 A에서 B로 원격 접속을 가정하고 로그가 어떻게 남는지 살펴보도록 하자.
1. Session Start & Encryption Negotiation
원격 세션이 시작될 때 로그는 Activating Router carrier 문구로 시작된다. 그리고 팀뷰어 중개서버를 연결하고 노드 간 암호화 통신을 위한 RSA 키 협상 절차가 진행된다. 실제 A와 B는 AES-256 대칭키로 암호화 통신을 한다. 더 자세한 내용은 여기에서 확인할 수 있다.
[ Fig 4. Teamviewer Connection Log on Device B ]
2. Fingerprint
협상이 끝나면 SHA256으로 해시화한 fingerprint를 교환하는데, 9~10자리 숫자로 구성된 Teamvier ID와 같이 fingerprint 값도 기기마다 모두 다르다. 사용하는 이유는 원격 대상이 진짜 그 상대 기기가 맞는지 확인 및 검증하기 위해서 사용된다.
숫자로 구성된 팀뷰어 아이디와 비밀번호만 있으면 원격 접속할 수 있기 때문에 이런 허점이 보완하고자 Fingerprint를 이용하여 원격 기기와 상대방에 대한 검증 차원에서 필요한 기술이라고 볼 수 있다.
[ Fig 5. Local Fingerprint of Device B ]
Fig 4.처럼 로컬 및 리모트 fingerprint 값이 로그에 남게 되는데 피해자 PC에서 남은 리모트 값과 피의자로 의심되는 사람의 압수된 PC에서 확인된 로컬 값이 연결고리로 작용할 수 있으니 잘 살펴봐야 한다.
3. Participants
로그를 보다 보면 수많은 로그 중 어느 것이 Device A와 관련된 정보이고 어느게 Device B에 대한 정보인지 헷갈릴 수 있다. 이럴 때 type 번호와 role 번호를 기억하면 쉽게 식별할 수 있다.
Device A(Support PC)의 경우 항상 type 6 and role 6로 로그가 기록되고 Device B(Client PC)의 경우 type 3 and role 3로 남는다. 만일 나중에 팀뷰어 로그를 분석할 때 오히려 이 두개의 숫자가 헷갈린다면 쉽게 찾을 수 있는 방법은 “공격자는 항상 사건에 있어 우위를 점한다. 따라서 번호가 높다.”라고 기억하면 한방에 확 와닿을 것이다.
- type 6, role 6: Support PC(Device A)
- type 3, role 3: Client PC(Device B)
[ Fig 6. Log type & role by Participants ]
4. IPv4 (Public vs. Private)
네트워크 환경, 특히 P2P(Peer-to-Peer) 통신에서 항상 문제가 되는 부분은 NAT 부분일 것이다. Device A와 B가 통신할 때 처음부터 상대방의 공인 IP, 사설 IP를 아는 것도 아니고, 만일 알지라도 통신을 위한 포트포워딩 설정 또는 NAT 테이블 관리를 해주는 장비가 없이는 상호 간 직접 통신하지 못한다.
개인 PC 환경에서 네트워크 장비나 공유기의 설정을 해야 한다면 그건 고도의 IT 지식을 요구하기 때문에 일반적인 사용자들은 사용하기 어려울 것이다. 그렇기 때문에 이를 대신해 줄 수 있는 무언가가 필요하다.
팀뷰어에서는 중계서버가 A와 B간 통신이 이뤄질 때 NAT 테이블을 관리하는 역할을 대신하여 해주는데 이런 기법을 ‘UDP hole punching’ 이라고 부른다.
UDP hole punching is a commonly used technique employed in network address translation (NAT) applications for maintaining User Datagram Protocol (UDP) packet streams that traverse the NAT.
로그에서도 보면 UDPv4: punch 등과 같은 키워드로 로그를 남기고 있다. 해당 로그를 통해 상대방의 공인 IP 주소를 알 수 있다.
- punch received a=Public IP:Port
- punch ignored a=Public IP:Port
[ Fig 7. Public IP Address of Device A ]
한 가지 중요한 건 원격할 때마다 상대방의 공인 IP 정보가 100% 남지는 않는다는 것이다. 나도 사실 이 문제에 대해 왜 어떤 경우에는 나오지 않을까라고 고민을 했었고, 생각해 본 결과 아마 오랫동안 서로 간 통신이 없거나 프로그램 종료 등 사유로 NAT 테이블 정보가 서버에서 삭제된 이후 원격 시도를 하면 다시 그 정보가 처음부터 생성되어 로그가 남고, 그렇지 않은 경우 기존에 정보가 있기 때문에 로그를 안남기지 않을까 하는 개인적인 추정이다.
테스트 시 만일 A와 B가 동일한 사설 네트워크인 경우에는 중계서버에서 통신을 공인 IP로 통신할 필요없이 서로의 사설 주소로 통신하는 Internal Network Hole-Punching 유형이 적용되어 상호간 사설 IP로 통신을 한다. ➜ Hole Punching 기술 유형
따라서 팀뷰어 로그에서 아래와 같이 사설 아이피 대역이 나오는 이유이다.
- punch received a=Private IP:Port
[ Fig 8. Private IP Address of Device A ]
5. IPv6 (Public)
지금까지 로그에서 IPv6 관련된 로그를 본 적이 없었다. 아마 있었어도 자세히 봐야겠다는 인식 자체가 없었을지도 모른다. 최근에 모바일로 연결 실험을 하다 IPv6 정보를 면밀히 관찰하였다.
모바일 기기에서 공인 IPv6를 확인하는 방법은 http://test-ipv6.com 사이트에 접속하면 할당된 공인 IPv6를 확인할 수 있는데 무조건 다 나오는 것은 아니고 나오지 않은 경우가 좀 더 많은 것 같다.
로그에서 IPv6와 Device A의 할당된 공인 IPv6가 일치함을 확인하였고 앞으로는 해당 정보를 가지고 추적의 단서로 사용하면 될 것이다.
[ Fig 9. IPv6 log ]
위에서 언급했듯이 모든 휴대폰에서 팀뷰어로 원격 시도를 했을 때 IPv6 로그가 생성되는 것은 아니다. 실험을 통해 확인한 부분은 사업자 측에서 해당 기기를 IPv6로 직접 할당하고 버전 6를 통해 직접 통신을 할 수 있냐라는 부분으로 판단할 수 있을 것 같다.
내 휴대폰 및 테스트 폰, 회사 동료들의 휴대폰을 거의 반강제적(?)으로 동원시켜 총 6종류를 확인했고, 요금제는 Galaxy S10 5G 모델만 5G 요금제를 사용하고 나머지는 모두 LTE(4G) 요금제를 사용 중이었다.
결과는 다음 표와 같았다. 요약하면 기기가 5G를 지원해야 했고, 요금제에 상관없이 현재 SKT 통신사를 이용하는 기기에서만 IPv6가 확인되었다.
No.Test MobileModel5G SupportService Provider(carrier)Data Planin Log
1 | iPhone 8 | A1906 | No | LG U+ | LTE | IPv4 |
2 | iPhone X | A1901 | No | SKT | LTE | IPv4 |
3 | LG VEVET | LM-G910N | No | KT | LTE | IPv4 |
4 | iPhone 12 | A2403 | Yes | LG U+ | LTE | IPv4 |
5 | Galaxy S10 5G | SM-G977N | Yes | SKT | 5G | IPv6 |
6 | Galaxy A Quantum | SM-A716S | Yes | SKT | LTE | IPv6 |
앞으로는 5G를 지원하는 모바일이 확대될 것이고 그에 맞춰 통신사도 기술 및 통신 정책들도 계속 변할 예정이기에 IPv6에 대한 로그는 점점 많이 보일 것으로 예상된다.
현재 IPv6를 필터링을 위한 키워드 문구는 다음과 같다. (정규표현식 사용 무방)
- EmergingUdpConnection::AsyncSendTo::Handler Send error system:1231 to Public IPv6:port
아이폰의 경우 휴대폰 기기에 설정된(일반 > 정보 > 이름) 아이폰 명이 기록되는 반면 2개의 갤럭시 휴대폰으로 원격 접속을 했을 때, Connections_imcoming.txt 로그에서 디폴트로 Display Name이 null로 표시된다. 만일 팀뷰어 계정으로 로그인을 한 상태에서 원격 접속을 했다면 로그인 계정이 남을 것이다.
또한, Display Name이 null로 나왔어도 상세 로그에서는 갤럭시 기기 모델명을 확인할 수 있어 해외향으로만 나온 모델인지, 국내향인 모델인지도 추가 검색이 가능할 수 있다.
6. Update Log
팀뷰어 로그에서는 소프트웨어 업데이트 로그도 남기는데 업데이트 버전 정보, 시간 정보, 업데이트 파일 저장을 위한 임시 디렉터리 등 정보를 남긴다. 테스트 환경에서 확인된 임시 디렉터리 경로에는 “incheon”과 같이 윈도우 사용자명이 포함되어 있는데 이는 또 다른 증거 요소로 사용될 수 있으니 간과하지 말아야 할 부분이다.
[ Fig 10. Tracking Software Update ]
7. Session End
원격 세션 종료 시 ‘RemoveParticipants’ 키워드의 로그를 시작으로 관련 서비스, 쓰레드를 종료하는 로그가 남는다.
[ Fig 11. Remote Session End ]
Wrap-up
Connections_incoming.txt 파일에서 원격으로 접속한 사람의 정보를 일부 확인할 수 있었다. 겉으로 보기에 단순해 보이는 로그로 좀 더 면밀히 살펴보면 판단의 오류를 줄일 수 있다.
- Teamviewer Autogenerated ID
➔ 팀뷰어에서 자체 생성되는 고유 ID값 - Display Name or Teamviewer ID
➔ 만일 이름이 PC명이 아니라면 팀뷰어로 로그인한 계정일 가능성 존재하기에 영장으로 가기 전 OSINT(Open Source Intelligence)를 사용할 수 있다.
'로그' 카테고리의 다른 글
방화벽 로그 분석 (FW Analysis) (0) | 2025.02.05 |
---|---|
몽고DB 쿼리 조회 (MongoDB Query) (0) | 2023.04.25 |
원격접속 시 이벤트 로그의 변화 (Event ID 1149 261) (3) | 2022.10.01 |
애니데스크 접속 기록 (Anydesk log) (0) | 2022.10.01 |
댓글