[2014 CodeEngn Conference 11] 남대현 - iOS MobileSafari Fuzzer 제작 및 Fuzzing
-
Upload
gangseok-lee -
Category
Education
-
view
242 -
download
2
Transcript of [2014 CodeEngn Conference 11] 남대현 - iOS MobileSafari Fuzzer 제작 및 Fuzzing
iOS MobileSafari Fuzzer 제작 및 Fuzzing
namdaehyeon
WHO AM I
•Mobile����������� ������������������ (은행,카드,증권,게임사,대기업,����������� ������������������ 강의등)����������� ������������������
•모바일환경,����������� ������������������ IoT,����������� ������������������ Source����������� ������������������ Auditing����������� ������������������
•머신러닝����������� ������������������ (장효영군에게����������� ������������������ 감사를)����������� ������������������
•좋은분들����������� ������������������ 덕분에����������� ������������������ 책도����������� ������������������ 한권����������� ������������������ 썼습니다.����������� ������������������
•이자리를����������� ������������������ 빌려����������� ������������������ 다시한번����������� ������������������ 감사드립니다.����������� ������������������
•영어를����������� ������������������ 잘하고����������� ������������������ 싶어����������� ������������������ 매일����������� ������������������ 전화영어����������� ������������������ 25분씩하고����������� ������������������ 있는..
발표순서
Fuzzer 제작 Fuzzing결심
1. 시도 -> 실패
2. 시도 -> 실패
목표(Goal)
•나만의����������� ������������������ MobileSafari����������� ������������������ Fuzzer를����������� ������������������ 만들어보자.����������� ������������������
•24시간����������� ������������������ 7일.����������� ������������������ 스스로����������� ������������������ 돌도록����������� ������������������ 만들자.
Goal
•나만의����������� ������������������ MobileSafari����������� ������������������ Fuzzer를����������� ������������������ 만들어보자.����������� ������������������
•JavaScript를����������� ������������������ 이용하지����������� ������������������ 말자����������� ������������������
•Server����������� ������������������ &����������� ������������������ Client����������� ������������������ 구조����������� ������������������
•MobileSafari����������� ������������������ 스스로����������� ������������������ Refresh����������� ������������������ 가능할것����������� ������������������ or����������� ������������������
•MobileSafari����������� ������������������ URL����������� ������������������ 입력����������� ������������������ ->����������� ������������������ 이동����������� ������������������
•24시간����������� ������������������ 7일.����������� ������������������ 스스로����������� ������������������ 돌도록����������� ������������������ 만들자����������� ������������������
•Low����������� ������������������ Memory,����������� ������������������ Fuzzing중����������� ������������������ Crash후����������� ������������������ 재실행할것����������� ������������������
•실행되었더라도����������� ������������������ ASLR인����������� ������������������ iOS에서����������� ������������������ 어떻게����������� ������������������ 객체����������� ������������������ 주소를����������� ������������������ 알����������� ������������������ ����������� ������������������
����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ 아서����������� ������������������ 객체에����������� ������������������ 메시지를����������� ������������������ 보낼것인가?����������� ������������������
•예외처리����������� ������������������ 필요(NSAlertDialog)
발표순서
Fuzzer 제작 Fuzzing결심
1. 시도 -> 실패
2. 시도 -> 실패
JavaScript를 이용하지 말자
•필요조건����������� ������������������
•Server-Client구조를����������� ������������������ 이용
JavaScript를 이용하지 말자
•필요조건����������� ������������������
•반복적으로����������� ������������������ Refresh����������� ������������������
•BrowserController����������� ������������������ Class����������� ������������������ ����������� ������������������
•_initSubview:����������� ������������������
•reloadFromAddressView:
1
2
JavaScript를 이용하지 말자
•성공!!����������� ������������������
•같은����������� ������������������ 주소����������� ������������������ 반복적으로����������� ������������������ Refresh����������� ������������������ 가능.����������� ������������������ but����������� ������������������ .����������� ������������������ .����������� ������������������ .����������� ������������������ ����������� ������������������
•Crash발생시����������� ������������������ PoC확인����������� ������������������ 어려움
JavaScript를 이용하지 말자
•필요조건����������� ������������������ 1����������� ������������������
•URL을����������� ������������������ 변경하여야����������� ������������������ 함.����������� ������������������
•변경한����������� ������������������ URL로����������� ������������������ 이동하도록����������� ������������������ 메시지를����������� ������������������ 보내야한다.����������� ������������������
•AddressTextField����������� ������������������ Object����������� ������������������
•AddressView����������� ������������������ Class����������� ������������������
•필요조건����������� ������������������ 2����������� ������������������
•iOS����������� ������������������ ASLR����������� ������������������ 극복해야만한다..����������� ������������������
•ASLR(Address����������� ������������������ Space����������� ������������������ Layout����������� ������������������ Randomization)
JavaScript를 이용하지 말자•iOS����������� ������������������ ASLR����������� ������������������
•iOS����������� ������������������ 4.3����������� ������������������ Default.����������� ������������������
•PIE����������� ������������������ (Position����������� ������������������ Independent����������� ������������������ Executables)
JavaScript를 이용하지 말자•iOS����������� ������������������ ASLR����������� ������������������
•iOS����������� ������������������ 4.3����������� ������������������ Default.����������� ������������������
•PIE����������� ������������������ (Position����������� ������������������ Independent����������� ������������������ Executables)
JavaScript를 이용하지 말자•iOS����������� ������������������ ASLR����������� ������������������
•iOS����������� ������������������ 4.3����������� ������������������ Default.����������� ������������������
•PIE����������� ������������������ (Position����������� ������������������ Independent����������� ������������������ Executables)
JavaScript를 이용하지 말자•Bypass����������� ������������������ iOS����������� ������������������ ASLR����������� ������������������
•앱이����������� ������������������ 실행될때마다����������� ������������������ 객체의����������� ������������������ 주소는����������� ������������������ 항상����������� ������������������ 변한다..����������� ������������������
•객체에����������� ������������������ 메시지를����������� ������������������ 보내어����������� ������������������ 특정����������� ������������������ 기능을����������� ������������������ 할����������� ������������������ 수����������� ������������������ 있음.����������� ������������������
•이����������� ������������������ 객체를����������� ������������������ 직접����������� ������������������ 가져다����������� ������������������ 쓸수만����������� ������������������ 있다면…⋯
Carrier 12:00 PM
Page Title
http://www.domain.com Google
JavaScript를 이용하지 말자
•Bypass����������� ������������������ iOS����������� ������������������ ASLR����������� ������������������
•AddressView����������� ������������������ Class
JavaScript를 이용하지 말자
•Bypass����������� ������������������ iOS����������� ������������������ ASLR����������� ������������������
•AddressTextField����������� ������������������ Object
JavaScript를 이용하지 말자
•Bypass����������� ������������������ iOS����������� ������������������ ASLR����������� ������������������
•객체의����������� ������������������ index는����������� ������������������ 고정이다.
Carrier 12:00 PM
Page Title
http://www.domain.com Google
JavaScript를 이용하지 말자
•객체����������� ������������������ Hirarchy
UIApplication KeyWindow
objectAtIndex:0
objectAtIndex:0
objectAtIndex:0
objectAtIndex:0
objectAtIndex:1
objectAtIndex:2
JavaScript를 이용하지 말자
•객체����������� ������������������ Hirarchy
UIApplication KeyWindow
objectAtIndex:0
objectAtIndex:0
objectAtIndex:0
objectAtIndex:0
objectAtIndex:1
objectAtIndex:2
UIApp.keyWindow .subviews [0] .subviews [0] .subviews [2]
Carrier 12:00 PM
Page Title
http://www.domain.com Google
JavaScript를 이용하지 말자
•객체����������� ������������������ Hirarchy
var kTmpObject = new Instance(0x14100)
0x14100 MobileSafariWindow
0x14200 UITransitionView
0x14300 UIView
0x14400 UIToolbarButton
0x14500 UISwappableImageView
0x14600 TablToolbarButton
Carrier 12:00 PM
Page Title
http://www.domain.com Google
JavaScript를 이용하지 말자
•객체����������� ������������������ Hirarchy
var kAA = new Instance( )0x14100 MobileSafariWindow
0x14100 MobileSafariWindow
0x14200 UITransitionView
0x14300 UIView
0x14400 UIToolbarButton
0x14500 UISwappableImageView
0x14600 TablToolbarButton
JavaScript를 이용하지 말자
•객체����������� ������������������ 가져오기����������� ������������������
•gdb,����������� ������������������ cycript����������� ������������������
•po����������� ������������������ [[UIApplication����������� ������������������ sharedApplication]����������� ������������������ .����������� ������������������ .����������� ������������������ .
cy# var kAddressView = new Instance(UIApp.keyWindow .subviews [0].subviews [0].subviews [2]) #"<AddressView: 0x2d3ce0; frame = (0 0; 320 60); clipsToBounds = YES; layer = <CALayer: 0x2d3e40>>" cy#
subview index
JavaScript를 이용하지 말자
•이렇게����������� ������������������ 얻은����������� ������������������ 객체에����������� ������������������ ����������� ������������������ Message보내기
//iPhone 4 iOS 5.1.1 function Fuzzing(URL) {
var kAddressView = new Instance (UIApp.keyWindow.subviews[0].subviews[0].subviews[2]); var kAddressTextField = new Instance (UIApp.keyWindow.subviews[0].subviews[0].subviews[2]. subviews[2].subviews[0]); [kAddressTextField setText:URL]; [kAddressView goToURL]; }
JavaScript를 이용하지 말자
•이렇게����������� ������������������ 얻은����������� ������������������ 객체에����������� ������������������ ����������� ������������������ Message보내기
//iPod Touch 4th iOS 6.1.6 function Fuzzing(URL) {
var kAddressView = new Instance (UIApp.keyWindow.subviews[0].subviews[0].subviews[2]); var kAddressTextField = new Instance (UIApp.keyWindow.subviews[0].subviews[0].subviews[2] .subviews[0].subviews[1].subviews[2]; [kAddressTextField setText:URL]; [kAddressView goToURL];
}
JavaScript를 이용하지 말자
•객체����������� ������������������ 주소가����������� ������������������ 아닌����������� ������������������ index를����������� ������������������ 가져와서����������� ������������������ 메시지����������� ������������������ 보내기����������� ������������������ DEMO
24시간 7일. 스스로 돌도록 만들자
•필요조건����������� ������������������ 3����������� ������������������
•때때로����������� ������������������ 잘못����������� ������������������ 처리된����������� ������������������ 결과에����������� ������������������ 대한����������� ������������������ 대비책이����������� ������������������ 있어야����������� ������������������ 한다.����������� ������������������
•URL����������� ������������������ 처리하지����������� ������������������ 못했을때����������� ������������������ AlertDialog나타남����������� ������������������
•생성되는����������� ������������������ AlertDialog핸들링을����������� ������������������ 못하면����������� ������������������ Fuzzer����������� ������������������ Crash
24시간 7일. 스스로 돌도록 만들자
•AlertDialog����������� ������������������ Handling
Carrier 12:00 PM
Page Title
http://www.domain.com Google
0x14100 UIAlertView
if ( objectAtIndex:0 == isKindofClass:[UIAlertView class]) { [KILL UIAlertView];}
24시간 7일. 스스로 돌도록 만들자
•필요조건����������� ������������������ 4����������� ������������������
•MobileSafari����������� ������������������ 재실행����������� ������������������
•이미����������� ������������������ 설치되어����������� ������������������ 있는����������� ������������������ System����������� ������������������ APP����������� ������������������ 이용����������� ������������������
•매����������� ������������������ 30초마다����������� ������������������ “MobileSafari”가����������� ������������������ 실행중인지����������� ������������������ Check����������� ������������������
•“MobileSafari”가����������� ������������������ 없다면…⋯����������� ������������������ Safari실행…⋯
NSTimer
Safari Check
•MobileSafari����������� ������������������ 재실행����������� ������������������
•NSTimer����������� ������������������ 삽입.����������� ������������������
•MobileSafari����������� ������������������ 프로세스����������� ������������������ 확인����������� ������������������ 메소드����������� ������������������ 구현.
NSTimer
Safari Check
Hook
24시간 7일. 스스로 돌도록 만들자
24시간 7일. 스스로 돌도록 만들자
NSTimer
Safari Check
Fail
•MobileSafari����������� ������������������ 재실행����������� ������������������
•이미����������� ������������������ 설치되어����������� ������������������ 있는����������� ������������������ System����������� ������������������ APP����������� ������������������ 이용����������� ������������������
•매����������� ������������������ 30초마다����������� ������������������ “MobileSafari”가����������� ������������������ 실행중인지����������� ������������������ Check����������� ������������������
•“MobileSafari”가����������� ������������������ 없다면…⋯����������� ������������������ Safari실행…⋯
24시간 7일. 스스로 돌도록 만들자
•실패의����������� ������������������ 원인:����������� ������������������ 백그라운드����������� ������������������
•Backgound진입시����������� ������������������ MobileSafari에����������� ������������������ 영향을����������� ������������������ 주지����������� ������������������ 않음.����������� ������������������
•일정����������� ������������������ 시간이����������� ������������������ 지나면����������� ������������������ MobileNote,����������� ������������������ MobileSafari����������� ������������������ Timer����������� ������������������ ����������� ������������������
����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ 모두����������� ������������������ 미작동
NSTimer
Safari Check
NSTimer
Safari Fuzzing
24시간 7일. 스스로 돌도록 만들자
•MobileSafari����������� ������������������ 실행����������� ������������������ (다른방법����������� ������������������ 시도)����������� ������������������
•현재����������� ������������������ 탈옥(jailbreak)환경에서����������� ������������������ MobileSafari����������� ������������������ Check구현����������� ������������������
•Console형태의����������� ������������������ 어플리케이션을����������� ������������������ 만들어서����������� ������������������ 해보자.����������� ������������������
•MobileNote.app을����������� ������������������ 이용한����������� ������������������ 방법과����������� ������������������ 같음.
NSTimer
Safari Check
24시간 7일. 스스로 돌도록 만들자
•MobileSafari����������� ������������������ 실행����������� ������������������ (다른방법����������� ������������������ 시도)����������� ������������������
•현재����������� ������������������ 탈옥(jailbreak)환경에서����������� ������������������ MobileSafari����������� ������������������ Check구현����������� ������������������
•Console형태의����������� ������������������ 어플리케이션을����������� ������������������ 만들어서����������� ������������������ 해보자.����������� ������������������
•MobileNote.app을����������� ������������������ 이용한����������� ������������������ 방법과����������� ������������������ 같음.
24시간 7일. 스스로 돌도록 만들자
•Console형태의����������� ������������������ 어플리케이션����������� ������������������
•[[UIApplication����������� ������������������ sharedApplication����������� ������������������ openURL:]
MobileSafari실행����������� ������������������ 안됨
Fail
24시간 7일. 스스로 돌도록 만들자
•Console형태의����������� ������������������ 어플리케이션
MobileSafari실행됨!
Success
24시간 7일. 스스로 돌도록 만들자
Hooking Module
1. WebServer에서 환경설정 파일을 읽어들여 MobileSafari Checking
1. Timer
2. WebServer에서 설정파일을 읽어들여 Fuzzing URL 기본 틀구성
3. Safari환경설정에 저장한 마지막 설정을 읽어들여 Fuzzing URL완성
4. URL Refresh완성
5. goToURL 메시지 전송 (Fuzzing시작)
1
2
34
24시간 7일. 스스로 돌도록 만들자
DEMO
발표순서
Fuzzer 제작 Fuzzing결심
1. 시도 -> 실패
2. 시도 -> 실패
iOS MobileSafari Fuzzing
Fuzzing
•CFURL����������� ������������������ Null����������� ������������������ Pointer����������� ������������������ Dereference����������� ������������������
•Opera����������� ������������������ Coast����������� ������������������
•URL처리함수인����������� ������������������ CFURL����������� ������������������ *함수의����������� ������������������ 부적절한사용����������� ������������������
•[NSURL����������� ������������������ URLWithString:@“http://example.com/%”];����������� ������������������
•CFURLCreateWithString(kCFAllocatorDefault,����������� ������������������ CFSTR����������� ������������������
����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ (“http://example.com/%”),����������� ������������������ NULL);����������� ������������������ ==����������� ������������������ >����������� ������������������ NULL����������� ������������������
•CFURLCopyAbsoluteURL(url);����������� ������������������
•=>����������� ������������������ NULL����������� ������������������ pointer����������� ������������������ derefrence����������� ������������������
•From����������� ������������������ D2T2-Exploring-and-Exploiting-iOS-Web-Browsers
Fuzzing
Fuzzing
•CFURL����������� ������������������ Null����������� ������������������ Pointer����������� ������������������ Dereference����������� ������������������
•Opera����������� ������������������ Coast����������� ������������������
•URL처리함수인����������� ������������������ CFURL����������� ������������������ *함수의����������� ������������������ 부적절한사용����������� ������������������
•[NSURL����������� ������������������ URLWithString:@“http://example.com/%”];����������� ������������������
•CFURLCreateWithString(kCFAllocatorDefault,����������� ������������������ CFSTR����������� ������������������
����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ ����������� ������������������ (“http://example.com/%”),����������� ������������������ NULL);����������� ������������������ ==����������� ������������������ >����������� ������������������ NULL����������� ������������������
•CFURLCopyAbsoluteURL(url);����������� ������������������
•=>����������� ������������������ NULL����������� ������������������ pointer����������� ������������������ derefrence����������� ������������������
•From����������� ������������������ D2T2-Exploring-and-Exploiting-iOS-Web-Browsers
No Crash
Fuzzing
xlog_width > 10000
xlog_height > 10000
Fuzzing
Fuzzing
xlog_width < 10000
xlog_height < 10000
Fuzzing
DEMO
Fuzzing
Question
?감사합니다
References
• Exploring-and-Exploiting-iOS-Web-Browsers, PDF
• https://developer.mozilla.org/ko/docs/Gecko_DOM_Reference
• http://quirksmode.org/dom/core/