跟我把Kali Nethunter編譯至任意手機
Kali Nethunter是一款用於安全研究的手機韌體包,可以使Android裝置增加“無線破解”、“HID攻擊”、“偽造光碟機”等的硬體功能以及metasploit等軟體工具,目前官方只支援少量的Android手機,然而,透過重新編譯Kali Nethunter原始碼,可以將其編譯到其他型號的手機上
本文將以Oneplus one為例講解Kali Nethunter程式碼的移植方式,同時也在三星的i9100g手機上測試成功
0x00 Kali Nethunter架構分析
Kali Nethunter大體分為三個部分
- 定製過的手機核心:由於需要使用OTG外接usb網路卡、用手機模擬HID裝置、用手機模擬CDROM光碟機,必須對手機核心進行修改新增對應的驅動,以及patch相關的程式碼,如果沒有這一部分修改過的核心,Kali Nethunter將無法使用與硬體相關的所有功能
- chroot環境的檔案系統:所有相關的軟體程式以ARM架構的Kali為基礎整合在一個檔案系統內,透過linux的chroot功能可以在Android中跳轉至Kali檔案系統,然後把核心相關的東西mount進kali的檔案系統,之後就可以在這個chroot後的Kali中執行對應的命令了
- 用於提供介面的APK手機APP,僅僅是作為UI介面起展示作用,實際是透過呼叫chroot的Kali中的命令來實現所有功能的,當然這些APP也提供了一鍵掛載並啟用Kali chroot的功能
其中修改核心要求手機核心程式碼必須開源,儘管核心程式碼根據GPL協議必須開源,國內某些手機仍然不公開其核心原始碼,這也是Kali Nethunter僅支援Oneplus、三星和谷歌Nexus的原因
0x01 準備CM 12.1原始碼以及相關環境
首先,我們為了簡化修改核心的過程,可以直接編譯一份CyanogenMod 12.1的程式碼,其中就包括了對應機型(Oneplus one、三星i9100g)的核心程式碼。而且鑑於Kali Nethunter本身採用的就是CM 12.1的ROM,為了避免其他ROM中可能存在的相容性問題,建議選擇CyanogenMod支援的手機來進行移植
你可以參考CyanogenMod官方wiki上對應機型的編譯說明,這裡在Ubuntu上以Oneplus和i9100g為例演示編譯過程
親測編譯時硬碟至少需要100G可用空間,虛擬機器至少需要4GB記憶體,不要問我如果達不到要求會發生什麼……全是眼淚啊
在開始配置環境之前,先提示大家後文會有簡化的環境配置方式,不過建議大家還是按部就班地用“官方”方式配置,因為將來CM可能會有新的版本出現,而官方配置方式可以獲取到最新的程式碼
比如對於Oneplus one的官方示範:http://wiki.cyanogenmod.org/w/Build_for_bacon
sudo apt-get install bison build-essential curl flex git gnupg gperf libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 libxml2-utils lzop openjdk-7-jdk openjdk-7-jre pngcrush schedtool squashfs-tools xsltproc zip zlib1g-dev
然後64位系統還需要:
sudo apt-get install g++-multilib gcc-multilib lib32ncurses5-dev lib32readline-gplv2-dev lib32z1-dev
如果遇到軟體包不存在,可以apt-cache search一下包名,看看是不是改名字了
之後同步Android程式碼(程式碼從google上拿,該怎麼訪問google是你自己要解決的問題,下同,不再提示)
$ mkdir -p ~/bin
$ mkdir -p ~/android/system
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
然後把~/bin加進PATH中:
新增到~/.profile中
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
然後配置repo
$ cd ~/android/system/
$ repo init -u https://github.com/CyanogenMod/android.git -b cm-12.1
然後有兩種方式可以獲取特定裝置(Oneplus One)的相關程式碼檔案,一種是按照CyanogenMod Wiki上的做,另一種可以去百度(來自一加社群的《玩機組出品,CyanogenMod12編譯教程》),請自行百度自己裝置的程式碼獲取方式
mkdir ~/android/cm/.repo/local_manifests
gedit ~/android/cm/.repo/local_manifests/local_manifests.xml
新增
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<project name="CyanogenMod/android_device_oneplus_bacon" path="device/oneplus/bacon" remote="github" />
<project name="CyanogenMod/android_device_qcom_common" path="device/qcom/common" remote="github" />
<project name="CyanogenMod/android_device_oppo_msm8974-common" path="device/oppo/msm8974-common" remote="github" />
<project name="CyanogenMod/android_device_oppo_common" path="device/oppo/common" remote="github" revision="cm-12.0" />
<project name="CyanogenMod/android_kernel_oneplus_msm8974" path="kernel/oneplus/msm8974" remote="github" />
<project name="TheMuppets/proprietary_vendor_oppo" path="vendor/oppo" remote="github" />
<project name="TheMuppets/proprietary_vendor_oneplus" path="vendor/oneplus" remote="github" />
<project name="CyanogenMod/android_frameworks_opt_connectivity" path="frameworks/opt/connectivity" remote="github" revision="cm-11.0" />
</manifest>
之後就可以開始同步Android程式碼了
$ repo sync
注意,到這步之後不需要再get prebuilt了,因為我們用的是CM 12.1,老版本的CM才需要get prebuilt
之後就是編譯了(先不要修改核心,確保能夠編譯成功),進入android/system資料夾
source build/envsetup.sh
使用CCACHE可以加快編譯速度,但會吃掉硬碟空間,為了速度推薦設定為50G到100G之間,非必須
export USE_CCACHE=1
prebuilts/misc/linux-x86/ccache/ccache -M 50G
之後就可以開始編譯了,bacon是裝置名
$ croot
$ brunch bacon
編譯成功後將會生成cm-12.1-20151127-UNOFFICIAL-bacon.zip,這個就是ROM的刷機包了
0x02 簡易的CM 12.1編譯環境及程式碼
所有環境配置問題都可以用Woobuntu系統來解決,直接安裝Woobuntu後內部已經整合了Android編譯環境(包括adb)
程式碼我給大家打包好了,27個G,解壓縮就好(已經把核心patch過了),在Woobuntu中編譯命令如下:
tar -jxvf cm12_bacon_source.tar.bz2
cd android/system/
sudo su root
source build/envsetup.sh
export USE_CCACHE=1
prebuilts/misc/linux-x86/ccache/ccache -M 20G
croot
brunch bacon
簡單解釋一下,由於壓縮檔的檔案屬主是我,而不是你,部分檔案許可權會有問題,所以建議直接root許可權編譯(其實更優雅的方式是chown -R,只不過27個G程式碼都來chown一遍實在受不了),sudo時會要求輸入你的密碼,而我CCACHE只用了20G是因為我的硬碟實在太小,我最後親自從安裝Woobuntu開始測試了一遍,確認可以編譯成功。
簡而言之,這個簡化版本只需要你自己處理裝置相關程式碼就好了,比如說i9100g就只需要重新按照wiki設定breakfast i9100g和extract-files(如果網上能搜到更簡單的方式更好),之後brunch i9100g即可
0x03 修改Android核心
在修改Android核心時,我們需要交叉編譯ARM架構的程式碼
cd到對應機型的kernel資料夾下,例如演示的oneplus核心目錄為 [email protected]:~/android/system/kernel/oneplus/msm8974
export ARCH=arm
之後在arch/arm/configs資料夾裡面找到cm所用的defconfig,然後如下所示
make cyanogenmod_bacon_defconfig
之後就可以make menuconfig了
make menuconfig
然後就是根據Nethunter的github WIKI上的說明自由選擇驅動程式了,不過我只需要ATH9K的晶片驅動,所以直接在Device drivers -> Network device supports -> Wireless lan 裡面選中Atheros Wireless Cards ,如果你使用其他晶片的無線網路卡,請自己去選中對應的驅動程式
然後在networking support -> Wireless 裡面把Generic IEEE 802.11 Networking Stack (mac80211) 選中
由於Oneplus自己預設選中了OTG驅動,如果您為別的機型編譯,請檢查device driver裡面usb的otg選項有沒有選中
設定完畢後儲存退出
make savedefconfig
cp defconfig arch/arm/configs/cyanogenmod_bacon_defconfig
make mrproper
您如果是第一次嘗試,可以重新編譯一遍CM看看有無錯誤,然後我們就可以開始patch核心了
wget http://patches.aircrack-ng.org/mac80211.compat08082009.wl_frag+ack_v1.patch
patch -p1 < mac80211.compat08082009.wl_frag+ack_v1.patch
然後到https://github.com/pelya/android-keyboard-gadget裡面尋找自己核心版本的patch,這裡是3.4核心
wget https://raw.githubusercontent.com/pelya/android-keyboard-gadget/master/kernel-3.4.patch
patch -p1 < kernel-3.4.patch
如果不出意外的話,這個patch一定會報錯,因為kernel程式碼是不斷更新著的,不過別擔心,我們可以手動去patch
報錯:
[email protected]:~/android/system/kernel/oneplus/msm8974$ patch -p1 < kernel-3.4.patch
patching file drivers/usb/gadget/Makefile
patching file drivers/usb/gadget/android.c
Hunk #1 succeeded at 75 (offset 1 line).
Hunk #2 succeeded at 2192 with fuzz 2 (offset 101 lines).
Hunk #3 FAILED at 2156.
Hunk #4 FAILED at 2481.
2 out of 4 hunks FAILED -- saving rejects to file drivers/usb/gadget/android.c.rej
patching file drivers/usb/gadget/f_hid.c
Hunk #7 succeeded at 403 (offset -9 lines).
Hunk #8 succeeded at 422 (offset -9 lines).
Hunk #10 succeeded at 594 (offset -4 lines).
Hunk #11 succeeded at 614 (offset -6 lines).
Hunk #12 succeeded at 662 (offset -8 lines).
Hunk #13 succeeded at 713 (offset -8 lines).
patching file drivers/usb/gadget/f_hid.h
patching file drivers/usb/gadget/f_hid_android_keyboard.c
patching file drivers/usb/gadget/f_hid_android_mouse.c
[email protected]:~/android/system/kernel/oneplus/msm8974$
可以看到是android.c第3和第4處patch失敗,我們去手動patch
前兩處都已經patch成功了,所以跳過就好了
解釋一下:左邊是patch程式碼,右邊是目前的android.c,patch的意思是要在&uasp_function,
下面加一個&hid_function,
,第四處也去找一下用大腦找到位置敲上程式碼即可
然後就是重新編譯CM,然後生成的刷機包就是Nethunter超強定製核心的CM 12.1了
i9100g編譯時直接成功,而Oneplus則會報個錯,是跟usb驅動有關的,找到報錯位置程式碼,然後發現是一個結構體還有一個函式在使用前沒有定義,於是我無比瀟灑地把這個呼叫函式的程式碼!刪!掉!了!,經測試刪掉該程式碼不影響手機正常功能,Nethunter功能也經過測試非常穩定
0x04 編譯Kali Nethunter的rootfs
在Kali Nethunter的github頁面內有詳細的說明,強烈建議在Kali中進行Nethunter的編譯
mkdir ~/arm-stuff
cd ~/arm-stuff
git clone https://github.com/offensive-security/gcc-arm-linux-gnueabihf-4.7
export PATH=${PATH}:/root/arm-stuff/gcc-arm-linux-gnueabihf-4.7/bin
git clone https://github.com/offensive-security/kali-nethunter
cd ~/arm-stuff/kali-nethunter
./build-deps.sh
./androidmenu.sh
在編譯時選擇僅編譯rootfs(因為我們要自己操心核心的事情了)
0x05 刷機測試
如果你不會刷機,請先百度一下如何正常刷機,比如unlock bootloader啦,TWRP啦,這些百度去吧
刷機順序為:先刷CyanogenMod,再刷Kali Nethunter的rootfs
下圖是在測試HID攻擊的i9100g
檢查各項功能:
- 檢查DriveDroid能否模擬USB光碟機
- 檢查UsbKeyboard能否偽造滑鼠和鍵盤裝置
- 插上OTG和USB無線網路卡,看看能不能使用Wifite破解無線密碼
0x06 可能遇到的問題
在移植至三星i9100g手機時,由於手機記憶體儲空間不夠大(Kali Nethunter刷機方式要求至少有2GB的可用空間),因此一直刷機失敗,當終於定位到問題所在後,最終決定採用其他的方式載入Kali Nethunter的rootfs。首先把kali nethunter的rootfs編譯出來,然後做成一個img磁碟映象檔案,之後把這個img檔案放在sd卡中,動態掛載到/data/local/kali-armhf中,這樣就解決了記憶體儲空間不夠的問題
如果編譯核心出錯,您在debug的時候可以只編譯核心,toolchains在prebuilt資料夾裡面,自己設定cross_compile變數吧(常見是把亂選的驅動清除掉,能解決絕大部分報錯)
0x07 後話
以後我們就可以開始玩耍Nethunter了,比如把整個WooyunWifi都移植到手機上,再做上離線劫持釣魚的功能……不過這些都是編譯完Nethunter之後的事情了
結尾圖片:在手機上的WooyunWifi,開啟了熱點用於釣魚
相關文章
- Kali Linux NetHunter教程Kali NetHunter支援的裝置和ROMs2019-01-16Linux
- Kali Nethunter初體驗2020-08-19
- 一加6刷入kali nethunter2022-02-14
- C語言編譯器手機版2020-12-08C語言編譯
- 編譯打包自己的雲手機(redroid)映象2024-07-12編譯
- Linux平滑編譯升級php至5.5.02021-09-09Linux編譯PHP
- 怎樣把照片編輯成影片,手機上面操作很方便2021-03-05
- 自己動手編譯OpenJDK2019-02-19編譯JDK
- 04_Linux下把驅動編譯進核心2024-04-22Linux編譯
- WIN32 手動編譯2020-10-28Win32編譯
- 越獄手記:手動編譯安裝 Electra2018-06-20編譯
- Android手機連線編譯器失敗,埠號被佔用2018-11-05Android編譯
- vscode的gulp-less自動把less編譯成css2018-07-12VSCode編譯CSS
- Ubuntu 15.04編譯Android 6.0.1原始碼-Nexus5真機編譯2019-01-24Ubuntu編譯Android原始碼
- 精讀《手寫SQL編譯器-回溯》2018-07-30SQL編譯
- 手撕Vue-編譯指令資料2023-10-15Vue編譯
- Pocket Hacking: NetHunter實戰指南2020-08-19
- [譯]BigInt:JavaScript 中的任意精度整型2019-03-03JavaScript
- 從kali安裝到ssh連線kali虛擬機器2021-01-19虛擬機
- Kali Linux 滲透測試手冊(1.1)安裝虛擬機器2019-01-12Linux虛擬機
- 手寫 Vue2 系列 之 編譯器2022-03-16Vue編譯
- [譯]Flutter:從手機到桌面2019-04-29Flutter
- Java編譯與反編譯2021-03-20Java編譯
- 如何把C/C++程式編譯成Python模組-超實用2019-05-23C++編譯Python
- libusb android ndk編譯--編譯mips2019-01-12Android編譯
- hadoop編譯—+2.x編譯2019-01-19Hadoop編譯
- N1064編譯鏈編譯2024-08-19編譯
- 精讀《手寫 SQL 編譯器 - 詞法分析》2018-07-09SQL編譯詞法分析
- 精讀《手寫 SQL 編譯器 - 語法樹》2018-08-27SQL編譯
- 精讀《手寫 SQL 編譯器 - 文法介紹》2018-07-16SQL編譯
- 精讀《手寫 SQL 編譯器 – 文法介紹》2018-07-16SQL編譯
- 精讀《手寫 SQL 編譯器 - 語法分析》2018-07-23SQL編譯語法分析
- 精讀《手寫 SQL 編譯器 - 錯誤提示》2018-09-03SQL編譯
- 精讀《手寫 SQL 編譯器 – 詞法分析》2019-03-04SQL編譯詞法分析
- 編譯2024-09-02編譯
- 【譯】我是如何學習任意前端框架的2019-03-22前端框架
- Java的指令碼機制、編譯器API2021-11-21Java指令碼編譯API
- 程式碼線上編譯器(上)- 編輯及編譯2018-10-30編譯