이번 주차에서는 그동안 수행한 모바일 애플리케이션 공격 실습의 과정과 결과를 체계적으로 정리하였다. 주요 목표는 취약점별 PoC 결과를 문서화하고, OWASP MSTG/MASVS 기준에 따른 예방 조치를 제시하는 것이었다.
대상: 테스트용 모바일 애플리케이션 (내부 테스트 빌드)
환경: Android 11 (Emulator / Genymotion), Frida, adb, MobSF, Burp Suite
계정: 테스트 전용 계정 사용
도구: apktool, jadx, Frida, adb logcat, tcpdump, Burp, MobSF
클라이언트 → 서버 통신에 민감정보 평문 전송 가능성 확인
로컬 저장소(SharedPreferences / 파일)에 민감 토큰 평문 저장 확인
인증 우회 / 세션 고정 취약점 PoC 작성
취약점 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
모든 재현 과정은 내부 테스트 환경에서만 수행되었다.
재현순서
에뮬레이터 기동 (Android 11) → 앱 설치 및 실행
Burp Suite 프록시 연결 → 트래픽 캡처
로그인 시 POST /api/login 요청 확인 → HTTP로 전송되는 경우 패킷 저장
adb로 앱 데이터 디렉토리 접근 → shared_prefs에서 auth_token 평문 확인 (logs/sharedprefs_dump.txt)
토큰 없이 보호 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
모든 통신을 HTTPS로 강제 적용 및 HSTS 도입.
앱 내 TLS 검증 우회 코드 제거, Certificate Pinning 도입 검토(MSTG 권장).
토큰·민감 데이터는 Android Keystore(또는 Secure Enclave)에 저장하고 평문 저장 제거.
세션 관리 개선: 토큰 만료·재발급 로직 일관화, 서버측에서 토큰 무효화 구현.
로깅 최소화·민감데이터 마스킹: 로그에 민감 정보 출력 금지.
정적/동적 분석을 CI 파이프라인에 통합(MobSF 자동 스캔).
보안 코드 리뷰 체크리스트화 및 배포 전 보안 승인 프로세스 도입.
| 항목 | 발견된 문제 | MSTG/MASVS 권장 | 권고 적용 예시 |
|---|---|---|---|
| 통신 보안 | HTTP 전송, TLS 우회 코드 | MSTG-NETWORK-1~3, MASVS-1.1 | TLS 강제, Pinning 적용 |
| 안전한 저장 | 평문 토큰 저장 | MSTG-CRYPTO-1, MASVS-2.8 | Android Keystore 이용 |
| 인증/세션 | 토큰 검증 미흡 | MASVS-4.1~4.3 | 토큰 검증 로직 개선 |
a. 도전 과제
정적 분석(jadx/apktool)과 동적 분석(Frida, Burp)을 병행하면서 어떤 정보가 최종 증거로 유효한지 판단하는 데 어려움이 있었습니다.
TLS 우회 코드가 라이브러리 내부에 숨겨져 있어 추적에 시간이 많이 소요됐습니다.
b. 개선점
로그 캡처·스크린샷 표준 템플릿을 미리 만들어 정리 시간을 단축했습니다.
PoC 작성 시 재현 단계에 더 세부적인 체크포인트(예: 응답 헤더 값, 상태코드)를 추가해 신뢰도를 높였습니다.
c. 다음 학습 방향
모바일 보안 심화: 금번 발견한 TLS/저장소 이슈 외에도 동적 분석 자동화(Frida 스크립트 작성) 역량을 강화할 예정입니다.
서버 측 방어 검사: 서버단 토큰 검증·세션 관리의 취약점을 백엔드 관점에서 더 깊이 이해하기 위해 API 보안 테스트를 병행하겠습니다.
4주 동안 공격 탐지→PoC→보고서 작성→OWASP 비교→결과 보고서 작성까지 완결성 있게 마무리했습니다. 이번 과정에서 ‘증거 중심의 문서화’와 ‘우선순위 기반 권고 제시’의 중요성을 크게 느꼈습니다. 다음 목표는 발견한 권고를 바탕으로 방어 개선을 검증하고, 자동화된 스캔·테스트 체계를 구축하는 것입니다.