Skip to content

Commit

Permalink
Merge pull request #7 from alanleedev/main
Browse files Browse the repository at this point in the history
동기화
  • Loading branch information
kunggom committed Feb 7, 2023
2 parents 34423c5 + 6416aff commit d9a7b20
Show file tree
Hide file tree
Showing 4 changed files with 163 additions and 41 deletions.
74 changes: 34 additions & 40 deletions 02_ipinside_lws_agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,21 +67,21 @@ TouchEn nxKey와 유사하게 IPinside LWS Agent 애플리케이션도 로컬
복호화하면 꽤 많은 양의 바이너리 데이터를 얻을 수 있다:


![약간의 바이너리 데이터를 포함한 16진수 데이타 덤프. 다음 문자열이 눈에 띈다: QEMU Harddisk, Gigabit Network Connection](https://palant.info/temp/aW6mA9rC3oG5cF5d/wdata.png)
![약간의 바이너리 데이터를 포함한 16진수 데이터 덤프. 다음 문자열이 눈에 띈다: QEMU Harddisk, Gigabit Network Connection](https://palant.info/temp/aW6mA9rC3oG5cF5d/wdata.png)


결과물에서 보듯이, 가상 머신 내에서 IPinside를 실행중이다.
심지어 이 컴퓨터가 더 이상 VirtualBox 상에서 실행되고 있지 않음에도, 결과물 끝에 `VirtualBox`가 나타난다.


다른 뻔히 보이는 데이터는 내 가상 머신에 장착된 두 개의 하드 드라이브이다. 하나는 시리얼 번호가 `QM00001`이고 다른 하나는 `abcdef` 이다. `F0129A45` 는 주 하드 드라이브 볼륨의 시리얼 번호이다.
다른 명백한 데이터는 내 가상 머신에 장착된 두 개의 하드 드라이브로, 하나는 시리얼 번호가 `QM00001`이고 다른 하나는 `abcdef`이다. `F0129A45`는 주 하드 드라이브 볼륨의 시리얼 번호이다. 또한 `Intel(R) 82574L Gigabit Network Connection`으로 표시된 네트워크 카드 두 개의 정보도 확인할 수 있다. 키보드 모델(Standard PS/2 Keyboard)과 키보드 레이아웃(de-de) 정보도 있다.


그리고 자세히 살펴보면 다음과 같은 연속된 바이트가 보인다; `c0 a8 7a 01` (내 IP 주소인 192.168.122.1 을 나타냄), `c0 a8 7a 8c` (192.168.122.140, 첫 네트워크 카드의 IP 주소) 그리고 `c0 a8 7a 0a` (192.168.122.10, 두번째 네트워크 카드의 IP 주소).
그리고 자세히 살펴보면 다음과 같은 연속된 바이트가 보인다; `c0 a8 7a 01` (내 게이트웨이 IP 주소인 192.168.122.1을 나타냄), `c0 a8 7a 8c` (192.168.122.140, 첫 네트워크 카드의 IP 주소) 그리고 `c0 a8 7a 0a` (192.168.122.10, 두번째 네트워크 카드의 IP 주소).


하지만 이보다 더 많은 정보들이 있다.
예를 들면 하드 드라이브 정보 전에 나오는 `65` (문자 `e`)는 [GetProductInfo() 함수](https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getproductinfo)를 호출한 결과값이다. 이것은 내가 윈도우 10 홈 에디션을 사용하고 있는 것을 나타낸다. 그 전에 `74` (문자`t`) 는 내가 사용하는 정확한 윈도우 버전 정보를 저장하고 있다.
예를 들면 하드 드라이브 정보 전에 나오는 `65`(문자 `e`)는 [GetProductInfo() 함수](https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getproductinfo)를 호출한 결과값이다. 이것은 내가 윈도우 10 홈 에디션을 사용하고 있는 것을 나타낸다. 그리고 그 전에 `74`(문자 `t`)는 내가 사용하는 정확한 윈도우 버전 정보를 저장하고 있다.

#### 실행중인 프로세스에 대한 정보

Expand All @@ -91,30 +91,30 @@ TouchEn nxKey와 유사하게 IPinside LWS Agent 애플리케이션도 로컬
실제 사용하는 애플리케이션이 구글 크롬인데도 불구하고 이 정보가 전송된다.


웹사이트에서 아웃풋을 정하는 여러 파라미터를 IPinside에게 전송한다.
파라미터 중의 하나는 `winRemote`이다.
웹사이트는 결과물의 내용을 정하는 여러 매개변수를 IPinside agent에게 전달한다.
매개변수 중의 하나는 `winRemote`이다.
간단한 난독화가 적용(obfuscated)되어 있지만 난독화를 풀고 나면 다음과 같은 데이터를 얻을 수 있다:

> TeamViewer_Desktop.exe|rcsemgru.exe|rcengmgru.exe|teamviewer_Desktop.exe

이것을 보면 은행 웹사이트에서는 당신이 원격 접속 도구를 사용하는지 알고 싶어 한다.
만약 주어진 문자열과 일치하는 프로세스를 발견하게 되면 `wdata` 응답에 추가된다.
만약 위 문자열에 일치하는 프로세스가 감지되면 `wdata` 응답에 추가된다.


물론 이 기능은 원격 접속 도구만 찾는 용도로만 제한되지 않는다.
`winRemote` 파라미터를 `AGULAAAAAAtmaXJlZm94LmV4ZQA=`으로 대체하면 파이어 폭스의 현재 실행여부에 대한 정보를 받아올 수 있다.
`winRemote` 매개변수를 `AGULAAAAAAtmaXJlZm94LmV4ZQA=`으로 대체하면 파이어 폭스의 현재 실행여부에 대한 정보를 받아올 수 있다.
그러므로 이 기능은 관심있는 어떤 애플리케이션이든 그것의 실행여부를 찾는데 악용될 수 있다.


이것이 전부가 아니다.
IPinside agent는 substring으로도 매칭을 한다.
IPinside agent는 부분 문자열로도 매칭을 한다.
그래서 `fire`라는 이름이 들어간 프로세스가 실행중인지 알려 줄 수 있다.


웹사이트에서는 이 기능만으로 실행 가능한 프로세스를 모르는 상태에서도 충분히 실행 중인 프로세서의 목록을 얻어올 수 있다.
나는 `.exe` 접미사로 시작해서 깊이 우선탐색 (depth-first search)을 하는 웹페이지를 만들었다.
여기서 문제점은 IPinside의 각 요청에 대한 응답속도가 1/2 초 정도로 느리다는 것이었다.
여기서 문제점은 IPinside의 각 요청에 대한 응답속도가 0.5초 정도로 느리다는 것이었다.
성능을 약간 향상시키기 위해 여러 개의 추측을 하나의 요청으로 묶었고 이것을 바탕으로 40-50초마다 프로세스 이름을 찾아내는 개념 증명 (proof of concept) 페이지를 만들었다:


Expand All @@ -126,52 +126,49 @@ IPinside agent는 substring으로도 매칭을 한다.

### ndata

응답에서 `ndata` 부분은 훨씬 더 단순하다. 이것은 다음과 같다:
응답에서 `ndata` 부분은 훨씬 더 단순하다:

> ��HDATAIP=▚▚▚.▚▚▚.▚▚▚.▚▚▚��VD1NATIP=▚▚▚.▚▚▚.▚▚▚.▚▚▚��VD1CLTIP=192.168.122.140��VD2NATIP=��VD2CLTIP=192.168.122.10��VPN=2��ETHTYPE=ETH1

내가 데이터 복호화 과정에 실수를 한 것이 아니다.
``가 실제 응답에 포함되어 있다.
원래는  `` (reverse tilde 부호)를 구분자로 사용하려는 것인데 내 운영체제에 한국어 설정이 되어 있지 않기 때문에 (IPinside LWS Agent와 같이) 유니코드를 사용하지 않는 애플리케이션의 경우 문자 인코딩이 EUC-KR로 설정되지 않는다.
애플리케이션은 이런 상황을 지원하도록 만들지 않아서 UTF-8로의 변환을 제대로 처리하지 못한다.
원래 의도는 `` (reverse tilde 부호)를 구분자로 사용하려는 것인데, 내 운영체제에 한국어 설정이 되어 있지 않기 때문에 (IPinside LWS Agent와 같이) 유니코드를 사용하지 않는 애플리케이션의 경우 문자 인코딩이 EUC-KR로 설정되지 않는다.
애플리케이션이 이런 상황을 지원하도록 만들어지지 않아서 UTF-8로의 변환을 제대로 처리하지 못한다.


다른 한 편으로 `▚▚▚.▚▚▚.▚▚▚.▚▚▚` 는 내 IP주소를 숨기기 위해 직접 대체한 문자이다.
한편 `▚▚▚.▚▚▚.▚▚▚.▚▚▚`는 내 IP주소를 숨기기 위해 직접 대체한 문자이다.
애플리케이션은 두 가지 방식을 사용해서 IP 주소를 얻는다.
`VD1NATIP` 는 내 집에 있는 라우터로부터 얻어온 듯 보인다.
`VD1NATIP`는 내 집에 있는 라우터로부터 얻어온 듯 보인다.


하지만 `HDATAIP` 는 웹서버로부터 온다.
하지만 `HDATAIP`는 웹서버로부터 온다.
어떤 웹서버일까?
그것은 웹사이트가 애플리케이션에 전달하는 `host_info` 파라미터로 결정된다.
값은 난독화 처리된 값이며 실제 값은 다음과 같다:
그것은 웹사이트가 애플리케이션에 전달하는 `host_info` 매개변수로 결정된다.
값 또한 난독화 처리된 값이며, 실제 값은 다음과 같다:

> www.securetrueip.co.kr:80:/vbank_01.jsc:_INSIDE_AX_H=

앞의 2파트만 사용되는 것처럼 보인다.
애플리케이션은 `http://www.securetrueip.co.kr:80/androidagent.jsc`로 요청을 보낸다.
처음 두 부분만 사용되는 것처럼 보이며, 애플리케이션은 `http://www.securetrueip.co.kr:80/androidagent.jsc`로 요청을 보낸다.
응답 헤더의 내용 중 하나는 `RESPONSE_IP`이다.
여러분이 맞췄듯이 이것은 웹서버가 봤을 때의 접속자 IP주소이다.


여기서 애플리케이션은 하위 레벨의 WS2_32.DLL API를 사용하는데, 아마도 웹으로 전송되는 데이터가 프록시 서버나 VPN을 통하는 것을 방지하려는 듯하다.
결국 목표는 사용자를 비익명화 (deanomymizing)하는데 있으니 말이다.
여기서 애플리케이션은 로우 레벨의 WS2_32.DLL API를 사용하는데, 아마도 웹으로 전송되는 데이터가 프록시 서버나 VPN을 통하는 것을 방지하려는 듯하다.
결국 목표는 사용자를 비익명화(deanomymizing)하는데 있으니 말이다.

### udata


마지막으로 `udata`가 있는데 “u” 는 “unique”의 약자다.
여기에는 몇 가지 다른 아웃풋 타입이 있다.
다음은 타입 13이다:
마지막으로 `udata`가 있는데 “u” 는 “unique”의 약자다.
여기에는 몇 가지 다른 결과물 타입이 있으며, 아래는 타입 13이다:

> [52-54-00-A7-44-B5:1:0:Intel(R) 82574L Gigabit Network Connection];[52-54-00-4A-FD-6E:0:0:Intel(R) 82574L Gigabit Network Connection #2];$[QM00001:QEMU HARDDISK:];[abcdef:QEMU HARDDISK:];[::];[::];[::];

역시 네트워크 카드들과 하드 드라이브의 목록이 보인다.
하지만 이번에는 네트워크 카드의 MAC 주소도 목록에 포함되어 있다.
다른 아웃풋 타입은 대체로 유사한 데이터를 별도의 포맷으로 저장한 것이지만 타입 30은 예외이다.
역시 네트워크 카드들과 하드 드라이브의 목록이 보이는데, 이번에는 네트워크 카드의 MAC 주소도 목록에 포함되어 있다.
다른 결과물 타입은 대체로 유사한 데이터를 별도의 포맷으로 저장한 것이지만, 타입 30은 예외이다.
이것은 16바이트의 데이터로 16진수 CPU 식별자를 포함하여 15개의 서로 다른 [CPUID 명령호출](https://en.wikipedia.org/wiki/CPUID)의 결과를 합쳐서 만든 것이다.

## 이 데이터는 어떻게 보호하는가?
Expand Down Expand Up @@ -322,20 +319,17 @@ handle_request(request);
## 언제 수정될까?
나는 2022년 10월 21일 3건의 취약점 보고서를 KrCERT에 신고하였다.
11월 14일에 KrCERT에서 보고서들을 인터리젠에 전달하였다고 확인해 주었다.
그 이후로 아무 소식도 듣지 못하였다.
2022년 10월 21일에 취약점 3건을 KrCERT에 신고했다.
11월 14일, KrCERT에서는 이 신고 내용을 인터리젠에 전달했다고 회신하였다.
그리고 그 뒤로 아무런 소식도 듣지 못했다.
이번 취약점 공개 이전에 어떤 한국 기자가 인터리젠에 입장을 물어보았다.
그들은 내 취약점 신고를 받기는 하였으나, 2023년 1월 6일에 단 1건을 받았을 뿐이라고 주장했다.
아마도 그 때문에 오는 2월에 수정 버전을 출시할 예정이고, 그 시점에서 새 버전을 사용자에게 배포하는 것은 고객사(즉, 은행 등)에 달려 있다고 하였다.
이 사실을 공개하기 이전에 어떤 한국의 기자가 인터리젠에 답변을 요청하였다.
내 보고서를 받은 것은 확인해 주었으나 보고서 중에 하나만 2023년 1월 6일에서야 받았다고 주장하였다.
이마도 그 때문에 문제점에 대한 수정 버전은 2월에 배포할 예정이고, 그때부터 새로운 버전을 사용자에게 배포하는 것은 그들의 고객(즉 은행 등)에 달려 있다고 하였다.
다른 유사 애플리케이션처럼 이 소프트웨어는 자동 업데이트 기능이 없다.
그래서 사용자가 수동으로 업데이트를 다운로드하여 설치하거나 Wizvera Veraport와 같은 관리 애플리케이션을 통해 업데이트해야 한다.
은행에서 오래된 IPinside 버전의 사용을 거부하고 사용자에게 업데이트를 강제하지 않는 이상 둘 다 가능성이 작아 보인다.
다른 비슷한 애플리케이션과 마찬가지로, 이 소프트웨어에도 자동 업데이트 기능이 없다.
따라서 사용자는 수동으로 업데이트를 다운로드받아 설치하거나, 아니면 Wizvera Veraport와 같은 관리 애플리케이션을 통해 업데이트를 해야 한다.
하지만 은행에서 예전 버전의 IPinside 사용을 거부하고 사용자에게 업데이트를 강요하지 않는 한, 이 두 가지 모두 실현 가능성은 낮다.
## 과연 IPinside 는 온라인 뱅킹을 더 안전하게 만들까?
Expand Down
3 changes: 3 additions & 0 deletions 03_weakeing_tls_protection.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
링크에 오타가 있어서 수정 변경되었습니다.

번역글 보기: https://github.com/alanleedev/KoreaSecurityApps/blob/main/03_weakening_tls_protection.md
Loading

0 comments on commit d9a7b20

Please sign in to comment.