2023 FIESTA 금융보안 위협 분석 대회 #4 시나리오 - 악성 앱

2023. 10. 18. 22:01CTF

목차

01) 시나리오 - 랜섬웨어 1

02) 시나리오 - 공급망 공격 1, 2

03) 시나리오 - APT 1, 2

04) 시나리오 - 악성 앱 1, 2

05) 침해대응 - 문제 3


시나리오 - 악성 앱 1 (100+73 pts)

악성 앱 1

홈페이지 접속 시 apk 파일 다운 기능이 있다.

 

apk 다운로드

‘f’인자 매개변수 base64 디코딩 결과는 웹 경로로 추측되는 ‘files/fastpayments_v1.13243.apk’이.

 

인자 Base64 디코딩

‘../../../../../../etc/passwd’base64 인코딩하여 전달한 결과 /etc/passwd 파일을 획득했다. 이는 파일 다운로드 취약점이 존재함을 의미한다.

 

파일 다운로드 취약점

파일 다운로드 취약점으로 ‘/proc/self/cmdline’을 읽어 서비스 이름이 ‘web/app.py’인 것을 확인한다.

 

서비스 실행 명령어 확인

파일 다운로드 취약점으로 ‘../web/app.py’를 다운 후 소스코드 분석 결과 admin 페이지가 존재한다.

 

admin페이지 확인

파일 다운로드 취약점으로 admin 페이지 소스코드를 다운 후 분석 결과 flag를 획득했다.

 

admin 페이지의 flag 획득

fiesta{7f9f71a7922f9d29d0c7d1995651799}

 


시나리오 - 악성 앱 2 (200+91 pts)

악성 앱 2

모바일 에뮬레이터 Nox를 이용하여 악성 앱을 설치하고 실행시켜 기능들을 확인하였다.

입력칸을 채워 하단의 QR 결제 코드 생성 버튼을 누르면 QR 코드를 획득할 수 있다.

이 과정에서 사용자의 개인정보를 공격자의 서버로 전송하는 통신이 존재할 것이라고 추측하였다.

 

악성 앱 기능 확인

패킷을 자세히 확인하기 위해 adb 쉘에서 아래와 같은 명령어로 tcp 통신 패킷을 캡쳐하였다.

$ tcpdump -i any -n -s 0 -w /sdcard/Download/1557.pcap

 

와이어샤크의 tcp stream에서 개인정보를 암호화하여 공격자의 서버에 전송하는 것을 확인할 수 있었다.

이를 통해 공격자의 서버 IP13.124.114.239이고 9999포트를 이용한다는 것을 확인할 수 있었다.

 

사용자의 개인정보를 암호화 후 전송

Jadx-gui를 이용하여 FastPayments.apk파일을 열고 공격자 서버 IP를 검색하면 쉽게 패킷 통신을 전송하는 메소드를 찾을 수 있다. g2.n.f에서 입력 정보 암호화와 전송이 이루어지고있었다.

 

g2.n.f 암호화 과정
g2.n.f 암호화 과정

따라서 암호화 전의 값을 알아내기 위해 android.compose.ui.platform.a0.B가 호출될 때의 인자값과 리턴값을 출력하는 프리다 후킹 코드를 실행하였다.

후킹 자바스크립트 코드는 jadx [Frida 스니펫으로 복사] 기능을 사용하여 간단하게 작성하였다.

 

- fiestabase.py

import frida, sys

bundle = "com.ctf.fastpayments"
scriptfile = "./fiesta.js"

with open(scriptfile, 'r') as f:
    script = f.read()

device = frida.get_usb_device(5)
target_process = device.spawn(bundle)
process_session = device.attach(target_process)

script = process_session.create_script(script)
script.load()

device.resume(target_process)
sys.stdin.read()

- fiesta.js

setImmediate(function() {
	Java.perform(function() {
		let a0 = Java.use("androidx.compose.ui.platform.a0");
		a0["B"].implementation = function (str) {
    		console.log('B is called' + ', ' + 'str: ' + str);
    		let ret = this.B(str);
    		console.log('B ret value is ' + ret);
    		return ret;
		};
		console.log("[*] Script finish");
	});
});

 

리턴값 출력

마지막 리턴값이 tcpdump를 통해 확인한 key의 암호화 값에 해당하므로 호출시의 인자값이 key 값에 해당한다. 따라서 key1131109899110112109 이다.

 

fiesta{1131109899110112109}