Android InsecureBankv2 모의 해킹해보기 _4주차(마지막)

엄수현·2025년 10월 6일

이번 주차에서는 그동안 수행한 모바일 애플리케이션 공격 실습의 과정과 결과를 체계적으로 정리하였다. 주요 목표는 취약점별 PoC 결과를 문서화하고, OWASP MSTG/MASVS 기준에 따른 예방 조치를 제시하는 것이었다.

1. 실습 환경 (요약)

  • 대상: 테스트용 모바일 애플리케이션 (내부 테스트 빌드)

  • 환경: Android 11 (Emulator / Genymotion), Frida, adb, MobSF, Burp Suite

  • 계정: 테스트 전용 계정 사용

  • 도구: apktool, jadx, Frida, adb logcat, tcpdump, Burp, MobSF

2. 공격 시나리오(요약)

  1. 클라이언트 → 서버 통신에 민감정보 평문 전송 가능성 확인

  2. 로컬 저장소(SharedPreferences / 파일)에 민감 토큰 평문 저장 확인

  3. 인증 우회 / 세션 고정 취약점 PoC 작성

3. 취약점 분석

  • 취약점 A — 민감정보 평문 전송 (HTTP / 불충분한 TLS 검증)

    발견 경로: 네트워크 트래픽 분석(Burp + tcpdump) 중 일부 API가 HTTP로 통신하거나 TLS 검증을 우회하는 코드 발견.

    증거:
    POST /api/login 요청이 HTTP로 전송됨.

    서버 인증서 검증을 우회하는 코드 조각(예: TrustManager에서 모든 인증서 허용). (로그: logs/trustmanager_bypass.txt)

    영향: 중간자(Man-in-the-Middle) 공격으로 계정정보·토큰 탈취 가능 → 서비스 계정 도용 및 개인정보 유출 위험.

    심각도: High

  • 취약점 B — 로컬 평문 토큰 저장 (Insecure Storage)

    발견 경로: 소스 역분석(jadx) 및 실행 중 파일 확인.

    증거:
    SharedPreferences에 auth_token이 암호화 없이 저장됨.

    adb로 추출한 파일에서 토큰 평문 확인. (로그: logs/sharedprefs_dump.txt)

    영향: 물리적으로 기기를 획득하거나 루팅된 환경에서는 토큰 탈취 가능.

    심각도: High

  • 취약점 C — 인증 우회 (잘못된 세션 검증)

    발견 경로: API 응답/헤더 조작 실험.

    증거:
    세션 토큰 없이 특정 API 호출이 정상 응답을 주는 케이스 확인.

    서버측에서 토큰 만료/검증 로직이 일관되지 않음. (로그: logs/no_token_api_calls.txt)

    영향: 인증 없이 민감 정보 접근 가능 → 권한 상승 리스크.

    심각도: Medium

4. PoC 재현 절차

모든 재현 과정은 내부 테스트 환경에서만 수행되었다.
재현순서

  1. 에뮬레이터 기동 (Android 11) → 앱 설치 및 실행

  2. Burp Suite 프록시 연결 → 트래픽 캡처

  3. 로그인 시 POST /api/login 요청 확인 → HTTP로 전송되는 경우 패킷 저장

  4. adb로 앱 데이터 디렉토리 접근 → shared_prefs에서 auth_token 평문 확인 (logs/sharedprefs_dump.txt)

  5. 토큰 없이 보호 API 호출 → 응답 코드 200 수신 확인

자동 증거 수집 스크립트

아래 스크립트는 PoC 증거(스크린샷, logcat, SharedPrefs, DB 샘플, HTTP/HTTPS 헤더)를 자동으로 수집하여 poc_evidence/ 폴더에 정리한다.
공개 시에는 자동 생성되는 *.masked.txt 파일을 사용하고, 민감정보를 반드시 수동 검토 후 공개해야 한다.

파일명: collect_poc_for_report.bat

@echo off
REM =========================
REM collect_poc_for_report.bat
REM - 테스트 전용 PoC 증거 수집 스크립트 (Windows CMD)
REM - 사용법: 메모장에 붙여넣고 collect_poc_for_report.bat로 저장 후 실행
REM =========================

setlocal

REM === 설정: 반드시 본인 값으로 바꿀 것 ===
REM) set PKG=com.mycompany.mytestapp
set PKG=com.example.app
REM 출력 폴더 (현재 .bat 위치에 poc_evidence 폴더 생성)
set OUTDIR=%~dp0poc_evidence
REM) set API_HOST=staging.api.yourdomain.com
set API_HOST=api.example.com

REM === 변경 불가(일반적으로 그대로 둬도 됨) ===
mkdir "%OUTDIR%" 2>nul

echo ==================================================
echo PoC evidence collection starting...
echo Output directory: %OUTDIR%
echo ==================================================

echo [1/8] adb devices (connected devices)...
adb devices > "%OUTDIR%\01_devices.txt" 2>&1
type "%OUTDIR%\01_devices.txt"

echo.
echo [2/8] screencap (capture device screen to PC)...
adb shell screencap -p /sdcard/poc_screen.png 2> "%OUTDIR%\err_screencap.txt"
adb pull /sdcard/poc_screen.png "%OUTDIR%\poc_screen.png" 2> "%OUTDIR%\err_pull_screencap.txt"

echo.
echo [3/8] adb logcat dump (recent logs)...
adb logcat -d > "%OUTDIR%\02_logcat_dump.txt" 2>&1

echo.
echo [4/8] filter logcat for keywords (token, auth, error)...
adb logcat -d | findstr /i "token auth error exception" > "%OUTDIR%\03_logcat_filtered.txt" 2>&1

echo.
echo [5/8] shared prefs (run-as 사용: 테스트 앱일 때만 성공)
adb shell run-as %PKG% cat /data/data/%PKG%/shared_prefs/auth_prefs.xml > "%OUTDIR%\04_auth_prefs.xml" 2> "%OUTDIR%\04_auth_prefs_error.txt"

echo.
echo [6/8] sqlite sample (테스트 DB 이름에 맞게 변경 필요)
REM DB 경로/테이블은 앱마다 다름. 필요하면 여기 수정.
adb shell run-as %PKG% sqlite3 /data/data/%PKG%/databases/app.db "SELECT * FROM users LIMIT 5;" > "%OUTDIR%\05_db_users_sample.txt" 2> "%OUTDIR%\05_db_error.txt"

echo.
echo [7/8] quick curl (HTTP/HTTPS header compare)
curl -I http://%API_HOST%/api/login > "%OUTDIR%\06_curl_http.txt" 2>&1
curl -I https://%API_HOST%/api/login > "%OUTDIR%\07_curl_https.txt" 2>&1

echo.
echo [8/8] collect environment info (optional)
echo OS: %OS% > "%OUTDIR%\08_env_info.txt"
echo DATE: %DATE% %TIME% >> "%OUTDIR%\08_env_info.txt"
where adb >> "%OUTDIR%\08_env_info.txt" 2>&1
where curl >> "%OUTDIR%\08_env_info.txt" 2>&1

echo.
echo ==================================================
echo Done. Evidence saved to: %OUTDIR%
echo ==================================================

REM ====== 공개용으로 민감정보 마스킹(간단 옵션) ======
REM 아래 PowerShell 명령은 긴 연속 영숫자(: 토큰처럼 보이는 문자열)***** 로 대체
REM 원본 파일은 손대지 않고 복사본(파일.masked.txt)을 만듦
echo Masking sensitive-looking tokens in text outputs...
powershell -Command ^
  "Get-ChildItem -Path '%OUTDIR%' -Filter *.txt | ForEach-Object { $c = Get-Content $_.FullName -Raw; $masked = $c -replace '([A-Za-z0-9\-_]{20,})','*****'; $out = $_.FullName + '.masked.txt'; Set-Content -Path $out -Value $masked }" 2> "%OUTDIR%\mask_err.txt"

echo.
echo *주의*: 공개 전 꼭 파일(.masked.txt)을 확인하고 민감정보가 잘 제거되었는지 수동으로 검토하세요.
echo Press any key to exit...
pause >nul

endlocal

5. 개선 및 권고 사항(우선순위별 제안)

  • 즉시 조치 필요

모든 통신을 HTTPS로 강제 적용 및 HSTS 도입.

앱 내 TLS 검증 우회 코드 제거, Certificate Pinning 도입 검토(MSTG 권장).

토큰·민감 데이터는 Android Keystore(또는 Secure Enclave)에 저장하고 평문 저장 제거.

  • 중기 개선

세션 관리 개선: 토큰 만료·재발급 로직 일관화, 서버측에서 토큰 무효화 구현.

로깅 최소화·민감데이터 마스킹: 로그에 민감 정보 출력 금지.

  • 장기 개선

정적/동적 분석을 CI 파이프라인에 통합(MobSF 자동 스캔).

보안 코드 리뷰 체크리스트화 및 배포 전 보안 승인 프로세스 도입.

6. OWASP MSTG / MASVS 비교 검토

항목발견된 문제MSTG/MASVS 권장권고 적용 예시
통신 보안HTTP 전송, TLS 우회 코드MSTG-NETWORK-1~3, MASVS-1.1TLS 강제, Pinning 적용
안전한 저장평문 토큰 저장MSTG-CRYPTO-1, MASVS-2.8Android Keystore 이용
인증/세션토큰 검증 미흡MASVS-4.1~4.3토큰 검증 로직 개선

7. 학습 회고 — 도전과제·개선점·다음 학습 방향

a. 도전 과제

정적 분석(jadx/apktool)과 동적 분석(Frida, Burp)을 병행하면서 어떤 정보가 최종 증거로 유효한지 판단하는 데 어려움이 있었습니다.

TLS 우회 코드가 라이브러리 내부에 숨겨져 있어 추적에 시간이 많이 소요됐습니다.

b. 개선점

로그 캡처·스크린샷 표준 템플릿을 미리 만들어 정리 시간을 단축했습니다.

PoC 작성 시 재현 단계에 더 세부적인 체크포인트(예: 응답 헤더 값, 상태코드)를 추가해 신뢰도를 높였습니다.

c. 다음 학습 방향

모바일 보안 심화: 금번 발견한 TLS/저장소 이슈 외에도 동적 분석 자동화(Frida 스크립트 작성) 역량을 강화할 예정입니다.

서버 측 방어 검사: 서버단 토큰 검증·세션 관리의 취약점을 백엔드 관점에서 더 깊이 이해하기 위해 API 보안 테스트를 병행하겠습니다.

8. 결론

4주 동안 공격 탐지→PoC→보고서 작성→OWASP 비교→결과 보고서 작성까지 완결성 있게 마무리했습니다. 이번 과정에서 ‘증거 중심의 문서화’와 ‘우선순위 기반 권고 제시’의 중요성을 크게 느꼈습니다. 다음 목표는 발견한 권고를 바탕으로 방어 개선을 검증하고, 자동화된 스캔·테스트 체계를 구축하는 것입니다.

0개의 댓글