ν‹°μŠ€ν† λ¦¬ λ·°

κ°œμš”

μ•ˆλ“œλ‘œμ΄λ“œμ˜ Broadcast ReceiverλŠ” "방솑 μˆ˜μ‹ μž"λΌλŠ” 의미λ₯Ό 가지고 있으며 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 4λŒ€ ꡬ성 λ‹¨μœ„μ€‘ ν•˜λ‚˜λ‘œ μΈν…νŠΈ(Intent)λΌλŠ” μΌμ’…μ˜ λ©”μ‹œμ§€ 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•ˆλ“œλ‘œμ΄λ“œμ™€ μ‚¬μš©μž 간에 μƒν˜Έμž‘μš©μ„ ν•©λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ Broadcast Receiverλž€ μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ μ‘΄μž¬ν•˜λŠ” μ΄λ²€νŠΈλ“€μ΄ λ°œμƒν•˜λ©΄ 각 κ°μ²΄λ“€λ‘œ μ μ ˆν•œ λΈŒλ‘œλ“œμΊμŠ€νŠΈ λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄κ²Œ λœλŠ”λ° μ΄λ•Œ μ‹ ν˜Έλ₯Ό λ°›μ•„ 사전에 μ •μ˜ν•΄λ†“μ€ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€.

사전에 μ •μ˜ 해놓은 μž‘μ—…μ΄λž€??

배터리 μƒνƒœ μ•Œλ¦Ό(배터리 λΆ€μ‘±/μΆ©λΆ„)
λ©”μ‹œμ§€ 솑/μˆ˜μ‹ (λ©”μ‹œμ§€κ°€ 전솑/μ‹€νŒ¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€)
μΈμ¦μ½”λ“œ μž…λ ₯
사진 캑처(사진이 μ €μž₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€)

λ§Œμ•½ λ³„λ„μ˜ κΆŒν•œμ΄ μ—†λŠ” 즉 μ•ˆμ „ν•˜μ§€ μ•Šμ€ λ¦¬μ‹œλ²„ 섀정을 ν•΄λ‘” 경우 μ‚¬μš©μžκ°€ λ°›λŠ” 정상적인 μ•Œλ¦Όμ„ 쀑간에 κ°€λ‘œμ±„κ±°λ‚˜ μΈκ°€λœ 자만 μˆ˜ν–‰μ΄ κ°€λŠ₯ν•œ ν–‰μœ„λ₯Ό κ°•μ œλ‘œ μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν•΄λ‹Ή 취약점을 ν™•μΈν•˜κΈ° μœ„ν•΄ 동적 뢄석도ꡬ인 "Drozer(λ“œλ‘œμ €)"λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

ꡬ좕 방법은 ν•˜λ‹¨μ˜ ν¬μŠ€νŒ… μ°Έκ³ 

guleum-zone.tistory.com/152

 

[Android] λ“œλ‘œμ €(Drozer) ν™˜κ²½ ꡬ좕

κ°œμš” DrozerλŠ” FSecureLABSμ—μ„œ κ°œλ°œν•œ μ•ˆλ“œλ‘œμ΄λ“œ 동적 뢄석 ν”„λ ˆμž„μ›Œν¬λ‘œ PC와 λ””λ°”μ΄μŠ€ μ‚¬μ΄μ˜ Agentλ₯Ό 톡해 μ•±μ˜ 취약성을 ν…ŒμŠ€νŠΈν•  수 μžˆλŠ” λ„κ΅¬μž…λ‹ˆλ‹€. λ“œλ‘œμ € 전에 MercuryλΌλŠ” μ΄λ¦„μœΌλ‘œ μ‚¬μš©λ˜μ—ˆ

guleum-zone.tistory.com


μ·¨μ•½ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μΈ "인 μ‹œνμ–΄ 뱅크"λŠ” νŒ¨μŠ€μ›Œλ“œλ₯Ό κ΅μ²΄ν•˜κΈ° μœ„ν•΄μ„  기쑴에 μ‚¬μš©λœ 둜그인 정보λ₯Ό μž…λ ₯ν•΄μ•Όμ§€λ§Œ λ„˜μ–΄κ°ˆ 수 μžˆκ²Œλ” λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μ„€μΉ˜λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŒ¨ν‚€ 지λͺ…을 ν™•μΈν•˜κΈ° μœ„ν•΄μ„  μƒλ‹¨μ˜ λͺ…령어와 별칭을 μ‘°ν•©ν•˜μ—¬ μ‰½κ²Œ ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

일단 λ§€λ‹ˆνŽ˜μŠ€νŠΈ 섀정을 ν™•μΈν•˜μ—¬ 섀정이 μ–΄λ–»κ²Œ 이루어져 μžˆλŠ”μ§€ 확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

λ§€λ‹ˆνŽ˜μŠ€νŠΈ 섀정값을 확인해 λ³Έ κ²°κ³Ό exported="true" ν™œμ„±ν™”λ‘œ μ„€μ •λœ λ‚΄μš©μ΄ ν™•μΈλ©λ‹ˆλ‹€.

 

λ“œλ‘œμ €λ₯Ό 톡해 λŒ€μƒ μ•±μ˜ 동적 뢄석을 μˆ˜ν–‰ν•΄λ³΄λ©΄ 외뢀에 λ…ΈμΆœλ˜μ–΄ μžˆλŠ” 1개의 Brodcast Receiverκ°€ ν™•μΈλ©λ‹ˆλ‹€.

 

외뢀에 λ…ΈμΆœμ΄ λ˜μ–΄μžˆμœΌλ©΄ 두 λ²ˆμ§Έλ‘œλŠ” μ„€μ •λœ κΆŒν•œμ΄ μ‘΄μž¬ν•˜λŠ”μ§€ 확인해 μ£Όμ‹œλ©΄ λ©λ‹ˆλ‹€. "permission: null"을 톡해 λ³„λ„μ˜ κΆŒν•œμ΄ μ‘΄μž¬ν•˜μ§€ μ•Šμ•„ λˆ„κ΅¬λ‚˜ 호좜이 κ°€λŠ₯ν•  κ²ƒμœΌλ‘œ νŒλ‹¨λ©λ‹ˆλ‹€.

 

μ™ΈλΆ€μ—μ„œ κΆŒν•œ 없이 호좜이 κ°€λŠ₯ν•œ λ¦¬μ‹œλ²„λ₯Ό λ“œλ‘œμ €λ₯Ό 톡해 ν•œλ²ˆ μ‹€ν–‰ν•΄ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

# nox_adb logcat

adb의 "logcat" λͺ…령을 μ‚¬μš©ν•˜μ—¬ 둜그λ₯Ό 확인해본 κ²°κ³Ό "phone number is null"μ΄λΌλŠ” 응닡 λ©”μ‹œμ§€λ₯Ό λ³΄λƒ„μœΌλ‘œμ¨ λ°˜μ‘ν•œ 것을 ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.(λ©”μ‹œμ§€κ°€ ν™”λ©΄μ—λŠ” λ‚˜νƒ€λ‚˜μ§€ μ•ŠμŒ)

jadxλΌλŠ” λ””μ»΄νŒŒμΌ 도ꡬλ₯Ό ν™œμš©ν•˜μ—¬ insecurebankv2의 λ‘œμ§μ„ ν•œλ²ˆ ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

getStringExtra에 "phonenumber"와 "newpass"λ₯Ό λ°›κ³  μž…λ ₯된 값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우 "phone number is null"μ΄λΌλŠ” λ©”μ‹œμ§€λ₯Ό μ‘λ‹΅ν•˜λŠ” 것이 ν™•μΈλ©λ‹ˆλ‹€.

 

λ˜ν•œ 37번 라인에 String textMessage = "Updated Password from: " + decryptedPassword + " to: " + newpass; 을 톡해 νŒ¨μŠ€μ›Œλ“œλ₯Ό λ³€κ²½ μ‹œ 기쑴에 μ €μž₯된 νŒ¨μŠ€μ›Œλ“œλ₯Ό 볡화 ν•˜μ—¬ μƒˆλ‘œ μž…λ ₯된 νŒ¨μŠ€μ›Œλ“œμ™€ ν•¨κ»˜ λ‚˜νƒ€λ‚œλ‹€λŠ” 것을 μœ μΆ”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ“œλ‘œμ €λ₯Ό 톡해 μ†ŒμŠ€μ—μ„œ ν™•μΈν•œ λ§€κ°œλ³€μˆ˜μ— μž„μ˜ 값을 λ‚ λ € decryptedPasswordκ°€ λ‘œκ·Έμ—μ„œ ν™•μΈλ˜λŠ”μ§€ λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

guleumμ΄λΌλŠ” μž„μ˜ νŒ¨μŠ€μ›Œλ“œλ₯Ό λ³΄λƒ„μœΌλ‘œμ¨ λ‘œμ§μ— κ΅¬μ„±λœ 이전 νŒ¨μŠ€μ›Œλ“œκΉŒμ§€ λ³΅ν˜Έν™”λ˜μ–΄ λ‘œκ·Έμ— λ…ΈμΆœλœ 것을 ν™•μΈν•˜μ‹€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 


μ·¨μ•½ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μΈ μ•ˆλ“œλ‘œ 고트λ₯Ό λŒ€μƒμœΌλ‘œ ν•œ 번 더 진행해 λ³΄κ² μŠ΅λ‹ˆλ‹€. μœ„μ— λ³΄μ‹œλŠ” κ²ƒμ²˜λŸΌ 외뢀에 λ…ΈμΆœλœ 1개의  Broadcast Receiverκ°€ ν™•μΈλ©λ‹ˆλ‹€.

 

λ§ˆμ°¬κ°€μ§€λ‘œ λ³„λ„μ˜ κΆŒν•œμ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ“œλ‘œμ € μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή 앱을 μ‹€ν–‰μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ…ΈμΆœλœ λ¦¬μ‹œλ²„μΈ "ShowDataReceiver"κ°€ μ–΄λ–€ λ‘œμ§μΈμ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ jadx의 λ¬Έμžμ—΄ 검색을 μ‚¬μš©ν•˜μ—¬ 확인해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

μ €μž₯된 μ‚¬μš©μžμ˜ ID와 Passwordκ°€ 둜직 μžμ²΄μ— λ‚˜μ™€ μžˆμ„ μ •λ„λ‘œ μ·¨μ•½ν•˜μ§€λ§Œ μ €ν¬λŠ” λ¦¬μ‹œλ²„λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν•΄λ‹Ή μ•±μ—μ„œ ν™•μΈν•˜κ² μŠ΅λ‹ˆλ‹€.

 

인 μ‹œνμ–΄ λ±…ν¬μ²˜λŸΌ μž„μ˜ 값을 μž…λ ₯ν•΄μ•Ό 이전 νŒ¨μŠ€μ›Œλ“œκ°€ λ‚˜μ˜€λŠ” 둜직이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ‹ˆ κ·Έλƒ₯ ν˜ΈμΆœν•΄ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

μ„±κ³΅μ μœΌλ‘œ μ ‘κ·Ό κΆŒν•œμ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” Broadcast Receiverλ₯Ό μ™ΈλΆ€μ—μ„œ ν˜ΈμΆœν•˜μ—¬ λ…ΈμΆœλ˜μ§€ 말아야 ν•  정보가 λ‚˜νƒ€λ‚œ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λŒ€μ‘λ°©μ•ˆ

λ§€λ‹ˆνŽ˜μŠ€νŠΈ 파일의 속성 쀑 <receiver> νƒœκ·Έμ—μ„œ λΆˆν•„μš”ν•œ κΈ°λŠ₯은 exported="false" λΉ„ν™œμ„±ν™”ν•˜μ—¬ 외뢀에 λ…ΈμΆœλ˜μ§€ μ•Šλ„λ‘ μ„€μ •ν•΄μ•Ό 되며 λ§Œμ•½ ν•„μš”ν•œ κΈ°λŠ₯일 경우 λ³„λ„μ˜ "Permission"속성을 톡해 접근을 μ œν•œν•΄μ•Ό λœλ‹€.

/* Androidmanifest.xml */
<receiver android:name=".MyBroadcastReceiver"
	android:permission="android.permission.SEND_SMS">
    <intent-filter>
       <action android:name="android.intent.action.AIRPLANE_MODE"/>
    <intent-filter>
</receiver>

μœ„μ™€ 같이 μˆ˜μ‹  μ•±μ˜ λ§€λ‹ˆνŽ˜μŠ€νŠΈμ— μ„ μ–Έλœ μˆ˜μ‹ μžκ°€ μ‘΄μž¬ν•  경우 λ°œμ‹  앱이 κΆŒν•œμ„ μš”μ²­μ„ ν•΄μ•Όλ§Œ μˆ˜μ‹ μžμ—κ²Œ Broadcastλ₯Ό 전솑할 수 있게 λ©λ‹ˆλ‹€.

κ³΅μœ ν•˜κΈ° 링크
Comment