ํฐ์คํ ๋ฆฌ ๋ทฐ
๊ฐ์
iOS์์๋ ์ค์น๋ ์ฑ ๊ฐ์ ์ฌ์ฉ์์ ํธ์์ฑ์ ์ํ "๊ณต์ ํด๋ฆฝ๋ณด๋"๊ฐ ์์ต๋๋ค. ์คํ ์ค์ธ ์ฑ์์ ์ผ๋ถ ํ ์คํธ๋ฅผ "๋ณต์ฌ" ๋๋ "์๋ผ๋ด๊ธฐ"์ -> pasteboard ๋ฒํผ์ ์ ์ฅ๋๋ฉฐ ์ด๋ ๋ค๋ฅธ ์ฑ์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํด์ผ ๋ ํ์๊ฐ ์์ต๋๋ค. ์๋ํ๋ฉด ์ฑ ๋ด๋ถ์ ๋จ์ ์ ์ฅ๋๋ ๊ฒ์ด ์๋ ๋จ๋ง ์ฅ์น ๋ด๋ถ์ ๋ฒํผ ํํ๋ก ๊ธฐ๋ก๋๊ธฐ์ ๋ค๋ฅธ ์ฑ์ ํตํด ์ด ๊ฐ์ ํธ์ถํ์ฌ ์ ์ถํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋ก ๊ฐ์ ๊ณต์ ํ ์ ์๋ ํด๋ฆฝ๋ณด๋๋ฅผ ์ ํ์์๋ Pasteboard๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค. ์ฌ์ฉ์ ๊ด์ ์์ ๋ณด์๋ฉด ์ด ๊ธฐ๋ฅ์ ๋งค์ฐ ํธ๋ฆฌํ๊ณ ํ์์ ์ธ ์ญํ ๋ก ์๋ฆฌ ์ก์ ์์ต๋๋ค. ๋ง์น ๊ธด ๋ฐ์ดํฐ ํํ๋ฅผ ๊ฐ์ง๋ ์ฐ๋ฝ์ฒ, ์ฃผ์, ์นด๋๋ฒํธ ๋ฑ์ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ณดํต ๋ณต์ฌ ๋ฐ ๋ถ์ฌ ๋ฃ๊ธฐ๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
Example ์ฝ๋
NSLog(@"clipboard = %@", [UIPasteboard generalPasteboard].string);
์ฑ ์ ํ๋ฆฌ์ผ์ด์ ์์ Clipboard๋ฅผ ์ฝ๊ธฐ ์ํด์ ์์ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. ์ ์ฉํ๋ ๋ฒ์ด ๊น๋ค๋ก์ด ํธ์ ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํ์๋ก ํ๋ ์ฑ์ด๋ผ๋ฉด ๋๋ถ๋ถ ์ ์ฉ๋์ด ์์ ๊ฒ๋๋ค.
์ด๋ฌํ ํธ๋ฆฌ ๊ธฐ๋ฅ์ด ์๋ฌด๋ฐ ์ ์ฝ ์์ด ๋ฌด์ ํ ์ ์ผ๋ก ๋ฐ์ดํธ์ ์ก์ธ์ค ํ ์ ์๋ค๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ๋ฐ์ํ ์ ์์๊น์? ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ณต์ฌํ ๋ฐ์ดํฐ๊ฐ ๊ธ์ต๊ณผ ๊ด๋ จ๋ ๋ฏผ๊ฐํ ์ ๋ณด์ธ ์ํ์์ ์์ ํ์ง ์์ ๊ณณ ๋๋ ๋ถ์คํ ์ํ๋ก ๋ฐฉ์น๋ ๊ฒฝ์ฐ ๊ณต๊ฒฉ์๋ ๊ฐ์ ๋ฌด๋จ์ผ๋ก ์ถ์ถํ์ฌ ์ ์ถํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
์ทจ์ฝํ ์ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ผ๋ก ํ ์คํธ๋ฅผ ์งํํด๋ณด๊ฒ ์ต๋๋ค. ๊ฐ์ด ๋ค์ด๊ฐ๋ ๋ถ๋ถ์ด ๊ณ์ข๋ฒํธํ CVC ๋๋ฒ๋ง์ ๋ฐ๋ ํ์ด์ง์์ "Copy"๋ฅผ ์ ํํฉ๋๋ค.
https://github.com/interference-security/frida-scripts/blob/master/iOS/pasteboard-monitoring.js
GitHub - interference-security/frida-scripts: Frida Scripts
Frida Scripts. Contribute to interference-security/frida-scripts development by creating an account on GitHub.
github.com
pasteboard ๋ฒํผ์ ๊ธฐ๋ก๋ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ ๋งํฌ์ ์ฒจ๋ถ๋ frida script๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
//Twitter: https://twitter.com/xploresec
//GitHub: https://github.com/interference-security
function start_pasteboard_monitoring(interval_value)
{
var pasteboard = (ObjC.classes.UIPasteboard).generalPasteboard();
var latest_word = "";
setInterval(function(){
try
{
//๋ณต์ฌ๋ ๊ฐ์ ๋ฌธ์์ด ํ์์ผ๋ก ์ ธ์์ on_pasteboard ๋ผ๋ ๋ณ์์ ๋ด์
var on_pasteboard = pasteboard.string().toString()
//latest_word์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น ๊ฐ์ด๋ฉฐ ๋ณต์ฌ๋ ๋ฌธ์์ด๊ณผ ๋์ผํ์ง ์์ผ๋ฉด “Found on pasteboard”๋ผ๋ ์ฝ์๋ก๊ทธ์ ํจ๊ป ๊ฐ์ด ์ถ๋ ฅ๋จ
if(on_pasteboard != latest_word)
{
console.log("[*] Found on pasteboard: "+ on_pasteboard);
//๋ณต์ฌ๋ ๊ฐ์ latest_word์ ๋ค์ ๋ค์ด๊ฐ์ ๋น๊ต ๋๊ธฐ ๋๋ฌธ์ ์๋จ์ ๋น๊ต๋ฌธ์ ๊ฑธ๋ ค ์ค๋ณต๋ ๊ฐ์ด ์ฝ์๋ก๊ทธ์ ์ฐํ์ง ์๊ฒ ๋์ด ์์
latest_word = on_pasteboard;
}
}
catch(err)
{
a = "";
}
}, interval_value);
}
//start_pasteboard_monitoring(INTERVAL_VALUE_HERE_MILLISECONDS)
start_pasteboard_monitoring(2000)
interval_value๋ฅผ ์ธ์๋ก ์ง์ ํ setInterval์ ์ฌ์ฉํ์ฌ ๋ด๋ถ ์ฝ๋๋ฅผ -> start_pasteboard_monitoring(2000)์ ์ํด 2์ด๋ง๋ค ์์ ์ ์ํํ๋๋ก ๋์ด ์์ต๋๋ค.
์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ํ์ธํด๋ณด๋ฉด DVIA-v2์ฑ์ ์คํ๋๊ณ ์์ง ์์ผ๋ฉฐ pasteboard ์ทจ์ฝ์ ์ด ์กด์ฌํ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ ์ฅ๋ ๊ฐ์ ํ์ธํ ์ ์์ต๋๋ค.
POC ์ฝ๋๋ฅผ “Safari” ์ ํ๋ฆฌ์ผ์ด์ ์ attach ํด๋ณด๋ฉด์ฑ์ ์ ์ฅ๋์๋ ๊ฐ์ธ์ ๋ณด๊ฐ ์ฝ์ ๋ก๊ทธ์ ์ถ๋ ฅ๋ฉ๋๋ค.
๋์๋ฐฉ์
UIPasteboard ํด๋์ค์์ ๊ธฐ๊ธฐ๊ฐ์ ๋ณต์ฌ ๋ฐ์ดํฐ๊ฐ ๊ณต์ ๋๋๋ฐ, ์ ์ฅ๋๋ ์ข ๋ฅ์ ๋ง๋ฃ ์์ ์ ์ต์ํ์ผ๋ก ์ค์ ํ์ฌ ๊ตฌํํ๊ฑฐ๋ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์์ญ์ ์ผ๋ฐ์ ์ธ General Pasteboard ๋ฐฉ์์ด ์๋ "Custom Pasteboard" ์ฌ์ฉํ๊ฑฐ๋ ๊ธ์ต๊ถ์์ ์ฝ๊ฒ ๋ณผ ์ ์๋ "๊ฐ์ ํคํจ๋"๋ฅผ ํตํด ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
'MOBILE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] FairPlay DRM ๋ณตํธํ (0) | 2021.09.26 |
---|---|
[iOS] Functions Hooking (1) | 2021.09.24 |
[iOS] Objection ์ฃผ์ ๋ช ๋ น์ด (0) | 2021.02.14 |
[Android] Data Storage(Plain/Encryption) ์ทจ์ฝ์ (0) | 2021.02.13 |
[Android] Content Provider ์ทจ์ฝ์ (2) | 2021.02.10 |