Needle - iOS Application and Device 해킹/보안 분석 프레임워크

Needle은 Drozer로 유명한 MWR Lab에서 만든 iOS 분석용 프레임워크입니다. Drozer와 비슷하게 디바이스에 Agent를 내리고 앱과 디바이스에 대한 분석을 할 수 있습니다.

보통은 Frida + Burp(ZAProxy)의 조합으로 분석을 하는데, 보다보니 Needle이 Frida 사용에 있어 좀 편리한 부분이 있더군요.

크게 디바이스에 대한 분석(키체인 이런거.) + Frida의 후킹 코드들, Cycript의 코드단 분석 정도를 하나의 명령 행에서 처리할 수 있도록 구성되어 있습니다.

Needle!

 

Setup - Agent

Needle은 Agent <=> Server 방식의 Application으로 대상 디바이스랑 분석기기(서버)에 모두 세팅이 되어야하니다. 시디아 소스 추가 후 needle agent 받아주시면 끝납니다. ( Cydia > Source > Add )

http://mobiletools.mwrinfosecurity.com/cydia/ 추가 후

Search에서 Needle 찾아주시면 Needle agent가 나옵니다. 설치해쥐면 됩니다.

Setup - Server

공식 깃허브에서 코드 클론해주시고..

#> git clone https://github.com/mwrlabs/needle

필수 패키지, python library 설치해줍니다. 리눅스의 경우 apt-get , macos는 brew로 해주시고 python 라이브러리는 모두 pip 지원이 되므로 pip 통해서 설치해줍시다.

One line script

git clone https://github.com/mwrlabs/needle
cd needle; mkdir 3rd 
if $1 = 'macos'
then
  sudo apt-get install python2.7 python2.7-dev sshpass sqlite3 lib32ncurses5-dev ; sudo pip install readline paramiko sshtunnel frida mitmproxy biplist
else
  brew install python; brew install libxml2; xcode-select -install; sudo -H pip install --upgrade --user readline; sudo -H pip install --upgrade --user paramiko; sudo -H pip install --upgrade --user sshtunnel; sudo -H pip install --upgrade --user frida; sudo -H pip install --upgrade --user biplist; brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb; wget https://github.com/mitmproxy/mitmproxy/releases/download/v0.17.1/mitmproxy-0.17.1-osx.tar.gz; tar -xvzf mitmproxy-0.17.1-osx.tar.gz; sudo cp mitmproxy-0.17.1-osx/mitm* /usr/local/bin/
fi

Linux

#> sudo apt-get install python2.7 python2.7-dev sshpass sqlite3 lib32ncurses5-dev
#> sudo pip install readline paramiko sshtunnel frida mitmproxy biplist sshtunnel paramiko

macOS

#> brew install python
#> brew install libxml2
#> xcode-select --install

#> sudo -H pip install --upgrade --user readline;
#> sudo -H pip install --upgrade --user paramiko;
#> sudo -H pip install --upgrade --user sshtunnel;
#> sudo -H pip install --upgrade --user frida;
#> sudo -H pip install --upgrade --user biplist

#> brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

#> wget https://github.com/mitmproxy/mitmproxy/releases/download/v0.17.1/mitmproxy-0.17.1-osx.tar.gz
#> tar -xvzf mitmproxy-0.17.1-osx.tar.gz
#> sudo cp mitmproxy-0.17.1-osx/mitm* /usr/local/bin

설치가 완료되면 needle.py 실행해주시면 대화형 쉘로 바로 넘어가집니다.

root@de98522c1939:/needle/needle# python needle.py

             __   _ _______ _______ ______         _______
             | \  | |______ |______ |     \ |      |______
             |  \_| |______ |______ |_____/ |_____ |______

                   Needle v1.3.2 [mwr.to/needle]
  [MWR InfoSecurity (@MWRLabs) - Marco Lancini (@LanciniMarco)]

[needle] >

추가로 이후에 Frida쪽 기능 쓰려면 이런 에러가 발생할 수도 있는데요, 이는 Agent가 설치된 단말에 lipo 명령이 없어서 발생하는 문제입니다. 별도 패키지로 제공되는 명령은 아닌 것 같고, Cydia에서 “Darwin CC Tools” 설치로 해결이 가능합니다.

[!] sh: lipo: command not found
참고: https://github.com/mwrlabs/needle/issues/172

How to use?

보통의 보안/해킹 툴들과 비슷하게 전반적인 구조는 Metasploit과 동일합니다. 명령어도 거의 비슷하니 익숙하신 분이라면 적응에는 크게 문제없을 것 같네요. 모든 테스트의 시작인 help를 보면..

[needle][list_apps] > help

Commands (type [help|?] <topic>):
---------------------------------
add_issue     exit  issues  load  reload    search  shell_local  use
back          help  jobs    pull  resource  set     show
exec_command  info  kill    push  run       shell   unset

이런식으로 나타나는데요 대충 정리해보면

[ 기본 명령 ] show : 옵션이던 뭐던 볼떄.. use : 모듈 사용 (un)set : 인자값 설정(show options으로 본 이후 해당 값들) back : 모듈 상위로 exit : 종료

[ 자체적인 이슈관리 ] issues : 이슈 리스트 보기 add_issue : 이슈 등록

[ 나머지 ] push : 데이터 밀어넣기 shell : 디바이스 쉘 연결 등등… 거의 읽히는 대로의 의미와 Metasploit console의 명령 형태랑 비슷합니다. 특별한건 없어요 (사실 쓰기 귀찮..)

모듈을 선택하지 않은 상태(현재?)에서 show options을 보면 global하게 적용된 설정을 볼 수 있습니다. 여기엔 needle agent의 ip / port 등이 있고 설정 후 다른 기능이나 모듈을 사용하면 해당 정보를 기반으로 기능을 수행하게 됩니다.

[needle] > show options

  Name                      Current Value         Required  Description
  ------------------------  -------------         --------  -----------
  AGENT_PORT                4444                  yes       Port on which the Needle Agent is listening
  APP                                             no        Bundle ID of the target application (e.g., com.example.app). Leave empty to launch wizard
  DEBUG                     False                 yes       Enable debugging output
  HIDE_SYSTEM_APPS          False                 yes       If set to True, only 3rd party apps will be shown
  IP                        192.168.0.6           yes       IP address of the testing device (set to localhost to use USB)
  OUTPUT_FOLDER             /root/.needle/output  yes       Full path of the output folder, where to store the output of the modules
  PASSWORD                  ********              yes       SSH Password of the testing device
  PORT                      22                    yes       Port of the SSH agent on the testing device (needs to be != 22 to use USB)
  PUB_KEY_AUTH              True                  yes       Use public key auth to authenticate to the device. Key must be present in the ssh-agent if a passphrase is used
  SAVE_HISTORY              True                  yes       Persists command history across sessions
  SKIP_OUTPUT_FOLDER_CHECK  False                 no        Skip the check that ensures the output folder does not already contain other files. It will automatically overwrite any file
  USERNAME                  root                  yes       SSH Username of the testing device
  VERBOSE                   True                  yes       Enable verbose output

하위 모듈로 가서도 동일하게 필수 인자값등을 확인하려면 show options 으로 보시고 set 명령으로 세팅, run 으로 실행하는 형태로 진행하시면 됩니다. (몇번 써보면 어떤 방식인지 금방 감 오실거에요)

기본적인 쉘 접근부터 해보면.. 우선 Needle Agent에서 Listen을 활성화 해줍니다. (우측 상단에 포트있어요) (대다수 기능은 Agent에서 활성화가 되어야 수행 가능하고 간혹 Connection 에러 발생하면 Agent에서 내렸다가 올려주시면 됩니다)

Server에서 IP랑 PORT 세팅하고 shell 명령 넣어주시면..

[needle] > shell
[*] Spawning a shell...
[*] Checking connection with device...
[V] Connection not present, creating a new instance
[V] [AGENT] Connecting to agent (192.268.0.6:4444)...
[+] [AGENT] Successfully connected to agent (192.268.0.6:4444)...
[V] [SSH] Connecting (192.268.0.6:22)...
[+] [SSH] Connected (192.268.0.6:22)
Warning: Permanently added '192.268.0.6' (RSA) to the list of known hosts.
Last login: Mon Dec  3 21:44:15 2018 from 192.268.0.4
vaha:~ root#
vaha:~ root#

디바이스에 바로 접근이 됩니다. (그냥 ssh로 접근한거) 이제 neelde의 강점인 module로 테스트를 진행해보죠.

Use modules

우선 사용할 모듈을 골라봅시다. show modules로 전체 모듈 리스트를 보거나 search로 필요한 기능을 찾아서 보시면 됩니다.

[needle] > show modules

  _Templates
  ----------
    _templates/template_background
    _templates/template_base
    _templates/template_frida
    _templates/template_frida_script
    _templates/template_static

  Binary
  ------
    binary/info/checksums
    binary/info/compilation_checks
    binary/info/metadata
    binary/info/provisioning_profile
    binary/info/universal_links
    binary/installation/install
    binary/installation/pull_ipa
    binary/reversing/class_dump
    binary/reversing/class_dump_frida_enum-all-methods
    binary/reversing/class_dump_frida_enum-classes
    binary/reversing/class_dump_frida_find-class-enum-methods
    binary/reversing/shared_libraries
    binary/reversing/strings

  Comms
  -----
    comms/certs/delete_ca
    comms/certs/export_ca
    comms/certs/import_ca
    comms/certs/install_ca_burp
    comms/certs/install_ca_mitm
    comms/certs/list_ca
    comms/certs/view_cert
    comms/proxy/pinning_bypass_frida
    comms/proxy/proxy_regular

  Device
  ------
    device/agent_client
    device/clean_storage
    device/dependency_installer
    device/hosts
    device/list_apps

  Dynamic
  -------
    dynamic/detection/jailbreak_detection
    dynamic/detection/script_jailbreak-detection-bypass
    dynamic/ipc/open_uri
    dynamic/memory/heap_dump
    dynamic/monitor/files
    dynamic/monitor/pasteboard
    dynamic/monitor/syslog
    dynamic/watch/syslog

  Hooking
  -------
    hooking/cycript/cycript_shell
    hooking/cycript/cycript_touchid
    hooking/frida/frida_launcher
    hooking/frida/frida_shell
    hooking/frida/frida_trace
    hooking/frida/script_anti-hooking-check
    hooking/frida/script_dump-ui
    hooking/frida/script_hook-all-methods-of-class
    hooking/frida/script_hook-method-of-class
    hooking/frida/script_touch-id-bypass
    hooking/theos/list_tweaks
    hooking/theos/theos_tweak

  Mdm
  ---
    mdm/effective_user_settings

  Static
  ------
    static/code_checks

  Storage
  -------
    storage/backup/icloud_content_frida
    storage/caching/keyboard_autocomplete
    storage/caching/screenshot
    storage/data/container
    storage/data/files_binarycookies
    storage/data/files_cachedb
    storage/data/files_plist
    storage/data/files_sql
    storage/data/keychain_dump
    storage/data/keychain_dump_frida

대상 디바이스에 있는 앱 리스트를 뽑아보죠.

[needle][class_dump_frida_enum-classes] > use device/list_apps
[+] Resource file successfully loaded
[needle][list_apps] > show options

  Name              Current Value  Required  Description
  ----------------  -------------  --------  -----------
  HIDE_SYSTEM_APPS  False          yes       If set to True, only 3rd party apps will be shown

[needle][list_apps] > run
[*] Checking connection with device...
[+] Already connected to: 192.268.0.6
[*] Looking for apps...
[+] Apps found:
        0 - com.apple.CTCarrierSpaceAuth
        1 - com.apple.MobileAddressBook
        2 - com.apple.CheckerBoard
        3 - com.appsolutegames.kubic
        4 - com.apple.carkit.DNDBuddy
        5 - com.apple.WebContentFilter.remoteUI.WebContentAnalysisUI
        

msfconsole 쓰는거랑 거의 비슷하기 떄문에 다른 기능들도 비슷하게 사용하시면 됩니다. needle에서 구현해놓은 frida나 cycript 스크립트로 어느정도 풀리는 앱들이 있겠지만, 아닌 경우도 많을겁니다. 떄에 따라 직접 코드를 넣어서 사용해야할 때가 많은데, 이 때 template 쪽 코드 수정해서 사용하시면 될 것 같습니다.

  _Templates
  ----------
    _templates/template_background
    _templates/template_base
    _templates/template_frida
    _templates/template_frida_script
    _templates/template_static

각 종류별로 스크립트 템플릿이 있고, 이를 기반으로 스크립트를 추가할 수 있습니다.

다른 사용법은 wiki 참조(https://github.com/mwrlabs/needle/wiki) 해주시며 좋을듯 합니다.