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) 해주시며 좋을듯 합니다.