[2014 codeengn conference 11] 남대현 - ios mobilesafari fuzzer 제작 및 fuzzing

Post on 12-Jul-2015

242 Views

Category:

Education

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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/

top related