Kali NetHunter Setup
Check Your Model Number Before Anything Else
Settings → About phone → Model number. This guide is only for the Exynos S10 family:
SM-G973F,SM-G973F/DS,SM-G973N(Galaxy S10) → continueSM-G975F,SM-G975F/DS,SM-G975N(Galaxy S10+) → continueSM-G970F,SM-G970F/DS,SM-G970N(Galaxy S10e) → continueSM-G977B,SM-G977N(Galaxy S10 5G) → continue
Stop if your model ends in U, U1 or W (e.g. SM-G973U), or if it is one of the Chinese Snapdragon models SM-G9700, SM-G9730, SM-G9750 or SM-G9770 (beyond*q): those are all Snapdragon variants with locked bootloaders. There is no LineageOS build and no NetHunter build for them, so this path cannot work — use NetHunter Rootless instead. The Galaxy S10 Lite (SM-G770F) is not supported either.
Many people misread the model off the About screen. Once USB debugging is on, the getprop block in Pre-Flight & Rollback Prep is the authoritative check — ro.product.model plus ro.product.device together name the exact variant.
Continuing on an unsupported model means wiping the phone and permanently tripping Knox for nothing.
| Device | Model Number | Codename |
|---|---|---|
| Galaxy S10 (Exynos) | SM-G973F | beyond1lte |
| Galaxy S10+ (Exynos) | SM-G975F | beyond2lte |
| Galaxy S10e (Exynos) | SM-G970F | beyond0lte |
| Galaxy S10 5G (Exynos) | SM-G977B / SM-G977N | beyondx |
| Galaxy S10 (Snapdragon) | SM-G973U | beyond1q — locked bootloader, no LineageOS |
/DS dual-SIM and Korean N variants of the S10/S10+/S10e are also supported. Only the Exynos beyond*lte / beyondx codenames are — Snapdragon *q variants and the S10 Lite (SM-G770F) are not.
Install full Kali NetHunter on an unlockable Android device with a Samsung Galaxy S10 Exynos path as the primary example. This refresh prioritizes version checks, device fit, and recovery checkpoints so you can stop early if your hardware or firmware path is wrong.
Read This First
- This will wipe your device. Back up everything first.
- You must already be on Android 12 stock firmware. LineageOS builds for this device require an Android 12 version of the stock OS to be installed before you start — an older stock build or any custom ROM does not satisfy it.
- Remove all Google accounts from the phone before the wipe, or Factory Reset Protection will lock you out of the fresh install.
- Samsung Galaxy S10-family NetHunter builds currently require a matching LineageOS-based path, not stock Samsung firmware.
- Exynos Samsung models are the intended target. Many Snapdragon carrier variants still cannot be unlocked reliably.
- Use a Linux machine for flashing, a known-good data cable, and a direct motherboard USB port instead of a hub or dock.
- Set aside 1-2 hours for the whole job (roughly 30-60 minutes of downloads and preparation, 15-30 minutes of flashing, up to 15 minutes for the first boot), 4+ GB of downloads, and at least 60% battery on both the phone and laptop.
- Unlocking the bootloader permanently trips Knox and may disable Samsung Pay, Secure Folder, and some enterprise controls.
Always Verify Latest Versions
Firmware, recoveries, and tools update frequently. Before flashing, confirm you have the latest compatible versions:
- LineageOS: wiki.lineageos.org/devices/beyond1lte — beyond1lte currently ships LineageOS 23.2 (Android 16); 22.1, 22.2 and 23.0 are retired. Use whatever the official install page shows, and match your NetHunter build to it.
- Lineage Recovery + vbmeta: both
recovery.imgand thevbmeta.imgfrom your build are published in your build's file list on the LineageOS download page, alongsideboot.imganddtbo.img. The install page explains the procedure — it never mentions vbmeta, and it now flashes recovery withsamloader, which is also what this guide's verified run used.heimdall flash --RECOVERY recovery.img --VBMETA vbmeta.img --no-rebootdoes the same job if you prefer Heimdall — but stay on one tool once a path is working. Thatvbmeta.imgis a signed 8 KB AVB image with verification and hashtree disabled (flags0x3), which is what turns Android Verified Boot off. Take thevbmeta.imgfrom the same build as your ROM — its rollback index tracks that build's security patch level. TWRP is no longer part of the supported S10 flow. - NetHunter: kali.org/get-kali/#kali-mobile — match the exact codename and LineageOS generation in the filename (e.g. beyond1lte-los for LineageOS 23.x). It installs as a Magisk module, not a recovery flash.
- Magisk: github.com/topjohnwu/Magisk/releases — use v30.7, the version verified on this device on 2026-10-17. Do not use v28.1: its patched boot images are rejected by this phone's bootloader (see Step 4.2), so the old upstream pin now costs readers a scare and a re-flash.
The Kali S10 doc has not been refreshed — it still pins Magisk v28.1, which is now known-bad on this hardware. Magisk upstream also documents installing via recovery/sideload as deprecated, and the verified path reflects that: install the v30.7 APK, use Install → Select and Patch a File on the boot.img from your exact LineageOS build, then flash that patched image. Samsung's bootloader has no fastboot of its own, but LineageOS ships fastbootd (a recovery-level fastboot) reachable with adb reboot fastboot — so the commonly posted fastboot flash boot does work here, and the older advice on this page that it does not was wrong. If fastboot devices stays empty, flash from Download Mode with samloader flash -p BOOT … instead. Keep the unpatched boot.img on disk: it is both the patch input and the way back to a clean, un-rooted boot.
Freshness Rule for This Page
Verified end-to-end on 2026-10-17 on an SM-G973F (beyond1lte) from stock Android 12, with LineageOS 23.2 (lineage-23.2-20261016-nightly-beyond1lte), Magisk 30.7, samloader-rs 2.2.0 and NetHunter 2026.2 (los-sixteen full) — rooted, kernel in place, Kali chroot extracted, su -c id = uid 0. Everything below that is presented as verified was exercised on that hardware; anything the run did not cover is still framed as advice, not proof.
The authoritative upstream sources remain the official Kali NetHunter Galaxy S10 install doc, the LineageOS install page and the NetHunter downloads page — re-check all three every time you reuse this guide. Where upstream still pins an older Magisk than v30.7, this page's dated build set wins: the older version is known-bad here. For any other filename, LineageOS generation or recovery difference, trust upstream and adjust before flashing.
The Whole Job
The required sequence, end to end. Each step links to its section; the checkpoint tells you whether you can move on.
- Check the model number — Exynos = go, Snapdragon = stop
- Download everything — all files on local disk before you start
- Confirm Android 12 stock firmware — the LineageOS firmware prerequisite; update the stock build first if you are below it
- Unlock the bootloader — erases the phone, trips Knox permanently; Download Mode must be entered from a full power-off or the unlock prompt never appears
- Flash Lineage Recovery + vbmeta —
samloader flash -p RECOVERY … -p VBMETA … - Boot straight into Lineage Recovery — do not let Android boot first
- Format data — required before sideloading
- Sideload LineageOS — skip GApps on a pentest device, and watch the screen for
Completed status 0 - Root with Magisk v30.7 — patch your build's
boot.imgin the app, flash it, check the Magisk app shows a version and not "N/A" - Install NetHunter as a Magisk module — first boot takes 5-15 minutes
- Verify —
su -c idreturnsuid=0(root)andnethunterdrops you into Kali
Isolate First
A bootloader unlock and a NetHunter chroot are not contained by a hypervisor, so the boundary has to be physical: a device you are willing to wipe, on an SSID you own. Flashing the phone you carry every day is the mobile version of bridging to the home LAN.
- Network type
- Physical device, no virtual network
- Lab network
- n/a
- Subnet
- No local subnet — this lab is a phone you own
There is no VM network to create here. Isolation means one owned device, fully backed up, with your SIM, work profile and personal accounts removed before the flash.
IP plan
| Role | Identifier |
|---|---|
| Test device | owned, backed up, codename verified |
| Host workstation | adb over USB |
| Network | your practice SSID (see the Wireless Lab) |
Nothing to create here — this lab has no virtual network. The boundary is the account or the device itself, not an adapter.
Prove it is isolated
adb devices -l; adb shell ip -4 routeExpected: the device listed once, and its only route on the practice AP subnet. A route through your home router means the phone is still on your home network while you flash it.
Never flash or test a device you do not own or cannot afford to lose, and never leave personal accounts on the test device.
Lab Runbook
Use this page as a controlled lab build, not a production hardening guide. Prove the network is isolated before running exercises, then validate and clean up from the operational section at the end of the page.
Plan
N/A — no local VM; 4 GB downloads plus backups. Device dependent. Isolation: Use only owned devices and authorized wireless targets.
Outcomes
- - Model verified
- - Backups complete
- - Matched ROM/recovery/NetHunter files
- - Rollback path documented
Compatibility Check — Go / No-Go
Do this before you download anything. Success depends on the exact model, codename, bootloader state, recovery support, base-ROM generation, and a known rollback path. Device-family names are not enough — if any row lands in the Stop column, resolve it before flashing.
| Check | Go signal | Stop signal | Evidence to keep |
|---|---|---|---|
| Official support | Exact codename appears on the official Kali mobile download page. | Only a similar model or an old forum build exists. | URL, codename, filename, date. |
| Bootloader | Unlock is supported for your exact model and region. | Carrier, Snapdragon region, or OEM policy blocks unlock. | Download Mode screenshot, samloader output, or adb shell getprop ro.boot.flash.locked = 0. |
| Recovery | Lineage Recovery (or supported recovery) matches your exact codename. | Recovery exists only for another variant. | Recovery filename, hash, source URL. |
| Base ROM | LineageOS generation matches the NetHunter build (e.g. both 23.x). | NetHunter ZIP expects a different LineageOS/Android generation. | ROM version, Android version, codename. |
| Rollback | Stock firmware, recovery path, and key combos are documented. | No known stock image or unreliable USB detection. | Firmware link, checksum, rollback notes. |
Good Candidate
Official NetHunter build, unlockable bootloader, matching recovery, active ROM docs, and a known rollback path.
Research Candidate
Partial or community support exists, but one of recovery, ROM, kernel, or rollback is uncertain.
Do Not Flash Yet
Locked bootloader, mismatched codename, missing stock firmware, unclear recovery support, or no trustworthy source.
Which Edition Fits Your Device
Use This Guide
You have an unlockable device, you are comfortable wiping it, and you want full NetHunter with root and the full kernel feature set.
Choose Lite Instead
Your phone can be rooted but does not have a practical custom-kernel path. You still want the app, Kali container, and post-exploitation tooling.
Choose Rootless Instead
Your bootloader is locked, your model is a carrier Snapdragon Samsung, or you only need portable Kali tooling without kernel features.
Pre-Flight & Rollback Prep
Pre-Flight Checks
- Confirm your exact model number and codename with the
getpropblock below — not from a glance at the About screen — then map it to the correct codename before downloading anything. - Confirm the phone is on Android 12 stock firmware — not Android 10/11 and not a custom ROM. See the firmware prerequisite in this section before you download anything else.
- Confirm your NetHunter filename and your LineageOS build target the same generation (e.g. both LineageOS 23.x).
- You will run these checks later: adb devices after Step 2.1, and once in Download Mode samloader (or fastboot devices inside fastbootd) must see the phone.
- Download everything to local disk first. Do not depend on live mirror scraping while the phone is already in recovery mode.
- Keep a manual recovery path ready: official LineageOS install page, official NetHunter download page, and a fallback flashing machine if samloader misbehaves.
Device identity gate. Once USB debugging is on, read the state off the device rather than off the About screen — ro.product.model and ro.product.device together name the exact variant, the bootloader lines say whether the phone is already unlocked, and the last line says whether Samsung is willing to expose the unlock toggle at all:
adb devices -l
# Identity — read the two model lines together
adb shell getprop ro.product.model # e.g. SM-G973F
adb shell getprop ro.product.device # e.g. beyond1 (stock firmware)
adb shell getprop ro.build.version.release # must be 12 (stock Android prerequisite)
# Bootloader state
adb shell getprop ro.boot.flash.locked # 1 = locked bootloader, 0 = unlocked
adb shell getprop ro.boot.verifiedbootstate # green = stock, orange = custom
# OEM unlocking toggle — Samsung only exposes it with Wi-Fi + a correct clock
adb shell getprop sys.oem_unlock_allowed # 1 = toggle is ON
Stop here if ro.product.device is a Snapdragon *q codename, or if ro.build.version.release is anything other than 12. A sys.oem_unlock_allowed of 0 is not a dead end — see the unlock prerequisites in Step 2.1.
Rollback Notes — Read Before the First Flash
- Restoring the stock
boot.imgfrom your ROM build removes Magisk cleanly —samloader flash -p BOOT boot.img(or fastbootd) is the whole un-root step. There is no un-root dance, no leftover daemon, no recovery script. - Uninstalling the NetHunter module in Magisk rolls back the Kali side.
- Keep
Magisk-v30.7.apk, the build'sboot.img,recovery.imgandvbmeta.img, andSHA256SUMS.local.txtin the same folder as your notes. Version numbers matter more than filenames here — record the exact LineageOS build, Magisk, samloader and NetHunter versions you used. - Knox has no rollback. Decide that before you unlock, not after.
Write This Down Before Flashing
- Download stock firmware / factory images and note their checksums before the device enters Download or Recovery mode.
- Record the exact Download Mode and Recovery key combos for your model.
- Keep the original USB cable and a known-good direct USB port on hand.
- Note any Knox / warranty impact so there are no surprises later.
- Do not proceed if the battery is low, USB disconnects intermittently, or device detection is unstable.
1. Prerequisites & Downloads
Supported Devices
NetHunter has three practical installation paths. Pick the one that matches your hardware reality before you collect files:
NetHunter (Full)
Requires an unlockable device and an officially supported kernel path. This is the only route that gives you the full HID, BadUSB, and wireless feature set.
Use this page only if this is your target state.
NetHunter Rootless
No root required. Runs in Termux and avoids bootloader, recovery, and firmware changes.
Best fallback when your bootloader path is blocked.
NetHunter Lite
Rooted device with no custom-kernel dependency. App + Kali container, but not the full hardware feature set.
Useful when full NetHunter support is incomplete for your model.
This Guide Covers Full NetHunter
LineageOS Required for Samsung Devices
Hard Prerequisite: Android 12 Stock Firmware
This is the step most people skip. The LineageOS install page lists it under Checking the correct firmware, after the basic requirements. Verbatim: "LineageOS builds for this device require an Android 12 version of the stock OS to be installed prior to following the installation guide."
- Check Settings → About phone → Android version. What matters is the Android version, not the One UI / vendor version.
- If it is lower than 12, update to the final stock firmware for your exact model first (Samsung Smart Switch, or Odin with the stock ROM), then boot it once before continuing.
- The S10, S10+, S10e and S10 5G all stopped at Android 12 / One UI 4.1, so a fully updated phone already meets this. An S10 still on Android 10 or 11 does not.
- Being on another custom ROM — including an unofficial LineageOS build of the same version — does not fulfil this requirement. Firmware means the stock device images, not the Android version string.
- The install page also lists a basic requirement: boot the stock OS at least once and check that every function works — calls, camera, Wi-Fi, mobile data, sensors, and charging. Do this before the wipe, while stock firmware is still recoverable.
- Remove all Google accounts from the phone before you wipe it, or Factory Reset Protection will block the fresh install.
The install page is explicit about the consequence of getting this wrong: a failed install, unexpected crashes after booting, or permanent damage to the device.
Expected Time and Failure Points
What You'll Need
Hardware
- ☑️ Samsung Galaxy S10 (SM-G973F/Exynos) — or your supported device
- ☑️ Short, known-good USB-C data cable connected directly to the computer
- ☑️ Linux PC/laptop (Kali Linux recommended)
- ☑️ microSD card (optional, for storing images/wordlists)
- ☑️ USB OTG adapter (for external WiFi adapters later)
Cable Quality Matters
Software Downloads
Download all files to a folder on your Kali machine (e.g., ~/nethunter-install/).
| File | Source | Notes |
|---|---|---|
| samloader-rs | GitHub releases | Primary flashing tool for Download Mode — recovery + vbmeta, and later the patched boot.img. Pick the asset for your CPU architecture (2.2.0 is what the verified run used). Also gives you print-pit for a partition-table dump |
| Heimdall (alternative) | GitHub | Does the same Download Mode writes and also works, but the verified 2026-10-17 run never needed it. In Kali's repos: apt install heimdall-flash. Stay on one tool once a path is working |
| Lineage Recovery + vbmeta | LineageOS downloads | Both recovery.img and the vbmeta.img from your build are in its file list — use the pair from the same build as your ROM. TWRP is not used on the current S10 path |
LineageOS boot.img |
LineageOS downloads | Required for root — the Magisk app patches this exact file and you flash the result (Step 4.2). It must come from the same build as your ROM; a boot image from a different build will not match. It is also your clean un-root image, so keep it |
| LineageOS ROM | LineageOS downloads | Required — sideload before NetHunter (match your codename & generation) |
| MindTheGapps (optional) | LineageOS Gapps | Skip it on a pentest device — NetHunter ships its own app store (NetHunter Store / F-Droid), so Google services add attack surface and setup noise for nothing. Only fetch it if you specifically want a Google account on the phone; it must match the LineageOS Android version |
Magisk v30.7 (.apk) |
GitHub release | For root. Install the APK and let it patch boot.img (Step 4.2) — do not sideload it as a zip. v28.1 is known-bad on this device: its patched boot images are rejected by the bootloader and drop the phone into Download Mode |
| NetHunter installer ZIP | kali.org | Pick your codename and channel — for LineageOS 23.2 (Android 16) that is beyond1lte-los in the sixteen channel (e.g. kali-nethunter-<release>-beyond1lte-los-sixteen-full.zip). The kernel ships inside this ZIP. Installed via Magisk → Modules, not recovery |
Download by hand. The current S10 install is one ROM sideload, one adb-side boot-image patch and one Magisk module, so there is very little left to automate. The old TWRP-era auto-installer that used to live here no longer matches this flow and has been retired to avoid steering you down the wrong path.
If you do reuse a scripted download helper from elsewhere, never blind-run it: read it first, verify every URL and filename against upstream, run it download-only, and check hashes before anything touches a partition.
Once every download is on local disk, hash each file and keep the list with your lab notes:
# Hash every file you are about to flash and keep the list with your lab notes
sha256sum *.img *.zip *.apk 2>/dev/null | tee SHA256SUMS.local.txt2. Unlock the Bootloader
Step 2.3 Erases This Phone
Knox Will Be Tripped
Step 2.1: Enable Developer Options
- Connect the phone to Wi-Fi with working internet, then set Settings → General management → Date and time → Automatic date/time. Samsung checks both before it will offer the unlock toggle (
ADB-visible assys.oem_unlock_allowed). - Go to Settings → About Phone → Software Information
- Tap Build Number 7 times until you see "Developer mode enabled"
- Go back to Settings → Developer Options
- Enable OEM Unlocking (it may not appear yet — see the callout below)
- Enable USB Debugging
The OEM Unlocking Toggle Needs Network + a Correct Clock
The toggle is not simply there on a fresh device: Samsung gates it on the phone having been online over Wi-Fi and its system clock being correct. A new Samsung's clock is often wrong before its first network sync, which is exactly when people go hunting for the toggle and conclude their model is locked. Leave it on Wi-Fi with Automatic date/time on, then look again.
Check it from the PC rather than by eye — adb shell getprop sys.oem_unlock_allowed must return 1. Do not start the unlock until it does, and re-check it after the post-unlock reboot (Step 2.3).
With USB debugging on, capture your starting state so you can prove what changed and roll back cleanly:
adb devices
adb shell getprop ro.product.model
adb shell getprop ro.product.device
adb shell getprop ro.build.version.release # must be 12
adb shell getprop ro.boot.flash.locked
adb shell getprop ro.boot.verifiedbootstate
adb shell getprop sys.oem_unlock_allowed # 1 = the unlock toggle is ONStep 2.2: Boot to Download Mode
- Unplug the USB cable first — a phone that is still charging from the PC will not stay powered off.
- Power the phone off completely.
- Hold Volume Down + Bixby together.
- While still holding both, connect the USB cable to the phone (the other end is already in your Kali machine).
- Keep holding until the warning screen appears.
Two Different Download Modes — Only One Can Unlock
This distinction is the one that stalls people. The "press Volume Up to unlock the bootloader" prompt only exists when Download Mode was entered from a full power-off, exactly as above. If you enter Download Mode from a running OS with adb reboot download, you land on the same-looking screen without the unlock option — and people then stand there holding Volume Up against the wrong mode, convinced the unlock is broken.
adb reboot download is still perfectly fine later, for flashing recovery, vbmeta and boot — just never for the unlock. If you are unsure which mode you are in, power off and repeat the key combo above.
Step 2.3: Unlock on the Device
- You must be in the power-off Download Mode from Step 2.2, not the one from
adb reboot download— the unlock prompt does not exist in the latter. - In Download Mode, long-press Volume Up (3-5 seconds) to open the bootloader unlock prompt.
- Read the warning, then short-press Volume Up to confirm the unlock.
- The phone wipes itself and reboots automatically.
- Complete basic Android setup again (skip the accounts), then return to Developer Options and re-enable USB Debugging.
- Re-enable Developer Options if the reset removed them, then confirm OEM Unlocking is still enabled. The LineageOS install page requires this check after the reset — if the toggle reverted to off, switch it back on and let the phone settle before continuing. Provable check:
adb shell getprop sys.oem_unlock_allowed→1.
Confirm the unlock actually took before you flash anything. ro.boot.flash.locked must flip to 0 and ro.boot.verifiedbootstate to orange (custom/unverified boot):
adb shell getprop ro.boot.flash.locked # 0
adb shell getprop ro.boot.verifiedbootstate # orangeNo Flashing Tool Can Unlock It
3. Flash Lineage Recovery
Why Lineage Recovery, Not TWRP
adb sideload, and installs NetHunter itself as a Magisk module — you never flash TWRP, and the NetHunter ZIP is installed from the Magisk app rather than flashed in recovery. Any guide that tells you to flash TWRP and then flash a NetHunter ZIP for the S10 predates this method. If in doubt, follow the official Kali S10 doc.
Step 3.1: Confirm Your Codename
Your codename table is at the top of the page. Once you have your codename, download that device's recovery.img (Lineage Recovery) and the vbmeta.img from the LineageOS download page — both sit in your build's file list next to the ROM. The install page covers the procedure.
Exynos Only
beyond*q, including SM-G9730) have locked bootloaders and no LineageOS build, so this path does not apply to them — use NetHunter Rootless instead. Confirm your model in Settings → About Phone and stop if your filenames do not match it.
Step 3.2: Flash Recovery + vbmeta with samloader
With the phone in Download Mode (from Section 2), flash Lineage Recovery and the vbmeta.img from your build in one command. That vbmeta carries verification and hashtree disabled (flags 0x3), which is what turns Android Verified Boot off so the custom recovery and ROM will boot.
# Navigate to your download folder
cd ~/nethunter-install
# Phone in Download Mode:
# power off -> unplug -> hold Vol Down + Bixby -> plug in USB -> keep holding
# (for flashing, adb reboot download is fine too — only the unlock needs the
# power-off entry)
# Write Lineage Recovery to RECOVERY and the matching vbmeta to VBMETA in one
# command. That vbmeta carries verification + hashtree disabled (flags 0x3),
# which is what switches Android Verified Boot off so recovery and the ROM boot.
samloader flash -p RECOVERY recovery.img -p VBMETA vbmeta.img
# Heimdall performs the same writes if that is what you already have —
# pick one tool and stay on it once a path is working:
# heimdall flash --RECOVERY recovery.img --VBMETA vbmeta.img --no-rebootFilenames
recovery.img is the Lineage Recovery image for your codename, and vbmeta.img is the AVB image from your build with verification and hashtree disabled (flags 0x3) — both come from your build's file list on the LineageOS download page, not from the install instructions. Use the pair from the same build as your ROM. Both the LineageOS wiki and this guide flash recovery with samloader (2.2.0 in the verified run); heimdall flash --RECOVERY recovery.img --VBMETA vbmeta.img --no-reboot is the Kali S10 doc's command and works equally well if Heimdall is installed. If your filenames differ, rename them or adjust the command — the -p RECOVERY / -p VBMETA (or --RECOVERY / --VBMETA) targets are what matter.
Step 3.3: Boot Straight Into Recovery
This is the single most common place people brick the flow. You must jump directly from Download Mode into recovery. If you let stock Android boot even once, it restores the stock recovery and you have to flash again.
- Keep the USB cable connected to your PC. The LineageOS install page performs this key combo "while the device is connected to a PC via USB cable", and sideloading in Section 4 needs the connection anyway.
- Force-exit Download Mode: hold Volume Down + Power for ~7-10 seconds until the screen goes black.
- The instant the screen goes black, switch to Volume Up + Bixby + Power and keep holding.
- Release when the Lineage Recovery menu appears.
Required: Format Data Before Sideloading
4. Install LineageOS, Magisk & NetHunter
The ROM is sideloaded from Lineage Recovery, root is then done from a booted LineageOS by patching boot.img in the Magisk app, and NetHunter installs as a Magisk module. Do it in order — the ROM must boot before you can patch its boot image, and root must work before NetHunter.
Order of Operations
- In Lineage Recovery: Factory reset → Format data (done in Section 3.3).
- Sideload the LineageOS ROM and watch the phone screen for
Completed status 0. - Reboot to system and finish LineageOS setup. Skip GApps — NetHunter brings its own app store.
- Re-enable Developer options + USB debugging on the fresh install.
- Root: install Magisk v30.7, patch your build's
boot.img, flash the patched image (Step 4.2). - Push the NetHunter installer and install it as a Magisk module.
Step 4.1: Sideload LineageOS (and optional GApps)
In Lineage Recovery choose Apply update → Apply from ADB, then sideload each file. Re-enter Apply from ADB before each new sideload.
# Recovery: Apply update -> Apply from ADB, then on your Kali machine:
# 1) Sideload the LineageOS ROM (match your exact filename)
adb -d sideload lineage-23.2-*-beyond1lte-signed.zip
# 2) (Optional) Google apps — skip this on a pentest device. If you do want it,
# re-enter Apply from ADB first, then:
adb -d sideload MindTheGapps-*-arm64-*.zip
# A "Signature verification failed" prompt is normal for GApps — choose Yes.A 47% Stop in adb Can Still Be a Good Transfer
On some runs adb's own output stops around 47% with "failed to read command". That artefact is known-benign — the transfer is usually still happening. What decides it is the phone screen: watch the install phase through to Completed status 0 before you believe the sideload.
A silent 47% stop plus a later boot failure means the ROM was half-written, not installed — re-sideload rather than assuming. If the zip ends at an odd percentage without an on-screen status 0, also run unzip -t on it locally before trying again.
Skip GApps on a Pentest Device
Step 4.2: Root — Patch boot.img with Magisk v30.7
Magisk v28.1 Is Known-Bad on This Device
The Kali S10 doc still pins v28.1. On this hardware a v28.1-patched boot image is rejected by the bootloader: after flashing it the phone cycles on Samsung's orange "device is corrupt" warning straight into Download Mode, even with the cable unplugged. Restoring the pristine boot.img recovers it instantly — which isolates the failure to the patched image, not the write. The identical procedure patched with v30.7 boots cleanly.
So v28.1 is not merely "an old pin" any more: it is broken here. If an older tutorial hands you v28.1, stop and use v30.7.
Root here is an image patch, not a recovery flash. The Magisk app patches your build's boot.img on the phone, and you flash the patched result. This is also why boot.img must come from the same build as the ROM you sideloaded.
# Phone booted into LineageOS, with Developer options + USB debugging on.
# 1) Install the Magisk v30.7 app and stage this build's boot.img
adb install -r Magisk-v30.7.apk
adb push boot.img /sdcard/Download/
# 2) In the Magisk app:
# Install -> Select and Patch a File -> Download/boot.img -> Let's go
# It writes magisk_patched-30700_XXXX.img alongside the input file.
# 3) Pull the patched image back
adb pull /sdcard/Download/magisk_patched-30700_XXXX.img .
# 4) Flash it. Use fastbootd — the recovery-level fastboot LineageOS ships.
# Samsung's own bootloader has no fastboot, but fastbootd does work here:
adb reboot fastboot
fastboot devices # shows "... fastbootd"
fastboot flash boot magisk_patched-30700_XXXX.img # expect "Writing 'boot' ... OKAY"
fastboot reboot
# Alternative if fastbootd is not detected — Download Mode + samloader:
# samloader flash -p BOOT magisk_patched-30700_XXXX.img
# 5) Verify root
adb shell 'su -c id'
# uid=0(root) gid=0(root) groups=0(root) context=u:r:magisk:s0
After the reboot, confirm the Magisk app shows an installed version number (not "N/A") before continuing. "N/A" means the running boot image is not carrying Magisk — re-patch with v30.7 and reflash boot. If you got there via fastbootd, try Download Mode with samloader to rule out a slot issue.
Keep the Pristine boot.img — It Is Your Un-Root
boot.img from the same build (samloader flash -p BOOT boot.img, or the fastbootd equivalent) removes Magisk cleanly — there is no un-root procedure to run. Keep boot.img, Magisk-v30.7.apk and the patched image beside your notes.
Legacy Alternative: Sideload Magisk in Recovery
Older guides — including the Kali doc — sideload Magisk from Lineage Recovery. That is not the verified route on this device, and Magisk upstream marks recovery installs deprecated. Use it only if the patch-and-flash path above will not work for you, and still with v30.7, never v28.1.
If the sideload route leaves you booting straight into Download Mode, restore the pristine boot.img and go back to the patch-and-flash path.
# LEGACY ALTERNATIVE ONLY — not the verified path on this device.
# Recovery expects a .zip, so copy the APK to a .zip first
cp Magisk-v30.7.apk Magisk-v30.7.zip
# Recovery: Apply update -> Apply from ADB, then:
adb -d sideload Magisk-v30.7.zip
# "Signature verification failed" also appears here — choose Yes.
# Then Recovery -> Reboot -> System, and open the Magisk app to finish setup.Step 4.3: Install NetHunter as a Magisk Module
With root working, push the NetHunter installer to the phone and install it from inside Magisk — there is no recovery flash for this step.
The Kernel Ships Inside the Installer
HID/BadUSB and external-adapter injection both come from the NetHunter kernel bundled in this installer ZIP — not from the ROM, and not from a separate kernel flash. You do not need to flash a kernel yourself. Built-in Wi-Fi monitor mode is the exception: it needs the optional Nexmon module described in Step 4.4.
What matters is that the channel matches your ROM: LineageOS 23.2 (Android 16) takes the sixteen build (beyond1lte-los-sixteen), while the older fifteen builds pair with LineageOS 22.2. Never mix the two — the installer's kernel modules are built for one specific LineageOS generation.
Formatting data in Section 3.3 cleared /data, which wiped the Developer options and USB debugging you enabled in Step 2.3. They have to be back on before Step 4.2's patch and before this push:
- In Android: Settings → About phone → Software information → tap Build number 7 times to re-enable Developer options.
- Settings → Developer options → enable USB debugging.
- Connect the phone and tap Allow on the RSA prompt on the phone screen.
# From normal Android (root working), push the NetHunter installer:
adb push kali-nethunter-2026.2-beyond1lte-los-sixteen-full.zip /sdcard/Download/
# In the Magisk app:
# Modules -> Install from storage -> select the NetHunter zip
# Do not reboot manually while it runs — let it finish and prompt you
# The first boot afterwards takes 5-15 minutes (Kali chroot extraction)Step 4.4: Optional — Internal Wi-Fi Monitor Mode (Nexmon)
The S10's built-in Wi-Fi only does monitor mode and injection if you also install the optional Nexmon Magisk module; without it, use a supported external USB adapter (see Post-Install). Match the module to your exact LineageOS and kernel build, then install it the same way you installed NetHunter:
# From normal Android (root working), push the module — after confirming it
# exists for YOUR NetHunter release (see the callout below):
adb push nexmon-s10.zip /sdcard/Download/
# In the Magisk app:
# Modules -> Install from storage -> select nexmon-s10.zip
# Reboot when promptedThis Asset May Simply Not Exist for Your Release
nexmon-s10.zip is only shipped against older NetHunter releases. The newest release that publishes it is nethunter-23.0, and there is no Nexmon asset for a los-sixteen / LineageOS 23.2 build — if you cannot find it in the asset list for your NetHunter release, that is expected, not a broken download. Do not go hunting for a file that was never published, and do not install an older release's module on a newer kernel.
Check the release asset list and the module's own kernel requirement against uname -r on your device before installing; if it does not match your LineageOS 23.2 / Android 16 kernel, skip it and use an external adapter. Built-in Wi-Fi monitor mode is the one feature you lose; HID/BadUSB and external-adapter work are unaffected.
First Boot Takes Time
5. First Boot & Configuration
Step 5.1: Initial Android Setup
The phone is already set up from Step 4.2. You should now see NetHunter, NetHunter Store, NetHunter Terminal and Magisk in the app drawer.
Step 5.2: Grant Root Access
- Open NetHunter app
- A Magisk superuser prompt will appear — tap Grant
- The app will initialize and download additional components
- Open NetHunter Terminal — grant root when prompted
If the app reports Chroot not found, install it from NetHunter → Kali Chroot Manager (see Troubleshooting).
Step 5.3: Verify Installation
# Open NetHunter Terminal and run:
# 1) Root gate
su -c id
# Should show: uid=0(root)
# 2) Kernel — this must be the NetHunter kernel, not plain LineageOS
su -c uname -r
# Expect the NetHunter kernel — a -nethunter suffix on some builds; the
# verified LineageOS 23.2 build reported 4.14.356-v0lk3n-beyond1lte_los-23.2
# 3) Kernel modules are actually installed (run in the Android shell, not the
# chroot — the chroot's /lib/modules is usually empty)
su -c ls /system/lib/modules
# 4) Kali chroot
nethunter
cat /etc/os-release
# Should show Kali Linux
# Exit chroot
exit
If uname -r shows neither a -nethunter tag nor a NetHunter build tag (the verified build read 4.14.356-v0lk3n-beyond1lte_los-23.2), or /system/lib/modules is empty, the module did not take — re-install the NetHunter zip from Magisk (Step 4.3) before troubleshooting anything inside Kali.
You are done when: su -c id returns uid=0(root), nethunter drops you into a Kali shell, and the Magisk app shows an installed version. Everything below this point is optional.
6. Post-Install Setup
Update Kali Chroot
# Enter NetHunter chroot
nethunter
# Update package lists and upgrade
apt update && apt full-upgrade -y
# Install additional tools
apt install -y seclists wordlists nmap sqlmap
# Clean up
apt autoremove -y && apt autoclean
# Exit chroot
exitConfigure Kali Services
NetHunter includes a service manager. Open the NetHunter app and navigate to:
SSH Server
Enable to SSH into your phone from another machine. Change default credentials!
Apache + MySQL
Host phishing pages or run local web tools.
VNC Server
Get a full Kali desktop on your phone.
Bluetooth Arsenal
Bluetooth scanning and attacks.
External WiFi Adapter Setup
For packet injection and monitor mode, connect a supported external USB WiFi adapter via OTG:
# Recommended adapters with NetHunter kernel support:
# - Alfa AWUS036ACH (RTL8812AU)
# - Alfa AWUS036NHA (Atheros AR9271, ATH9K_HTC)
# - Any adapter on RTL88XXAU, RTL88X2BU or RTL8188EUS
# Not supported: RT2800/RT5372 parts (e.g. the Panda PAU05) — the
# NetHunter kernel does not ship that driver.
# Connect adapter via OTG cable, then:
nethunter
# Check interface
ip a
# Should show wlan1 or similar
# Enable monitor mode (using NetHunter app is easier)
airmon-ng check kill
airmon-ng start wlan1
# Verify monitor mode
iwconfig
# Should show wlan1mon in Monitor modeHID Attacks (Keyboard Emulation)
One of NetHunter's killer features — your phone acts as a USB keyboard to type payloads:
- Open NetHunter → HID Attacks
- Choose a payload (e.g., PowerShell reverse shell, Windows backdoor)
- Connect phone to target Windows PC via USB
- Tap Execute — phone types the payload automatically
Authorized Use Only
Troubleshooting
"OEM unlocking" is missing or grayed out
Samsung only exposes the toggle once the phone has been online over Wi-Fi and its system clock is correct — both, not one. Set the clock to automatic, stay on Wi-Fi, and look again. On the verified run, connectivity plus a correct clock was the gate; the widely-quoted waiting period was not what blocked it.
Do not proceed until adb shell getprop sys.oem_unlock_allowed returns 1, and re-check it after the post-unlock reboot. If it stays 0 on a carrier-locked phone, the carrier may have to release the device first.
Unlock prompt never appears while holding Volume Up
You are in the wrong Download Mode. The "press Volume Up to unlock the bootloader" prompt only exists when Download Mode was entered from a full power-off (power off → unplug → hold Volume Down + Bixby → plug in). The screen you reach with adb reboot download looks identical but exposes no unlock option. Power off and repeat the key combo — adb reboot download is still fine for flashing, just not for unlocking.
samloader or Heimdall doesn't see the device
First eliminate transport issues: swap the cable, move to a direct USB port, disconnect hubs, and boot the phone fully back into Download Mode before changing packages. On the verified run, samloader's very first print-pit died on a flaky cable/port — the tool was never the problem.
# Add udev rules for Samsung Download Mode and Google/fastbootd
sudo tee /etc/udev/rules.d/51-android.rules << 'EOF'
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
EOF
# Reload udev
sudo udevadm control --reload-rules
sudo udevadm trigger
# Reconnect device and try againSamsung boots back to stock recovery
That usually means Android booted once before you entered Lineage Recovery, so stock restored itself. Re-flash recovery.img + vbmeta.img with samloader (or Heimdall), then boot directly into recovery (Vol Up + Bixby + Power) without letting Android boot in between.
Phone lands in teal Download Mode right after a flash
Get out of it first: force-restart with Volume Down + Power until the screen goes black, then release. If it recurs, work through these in order:
- Interrupted ROM install — re-sideload and watch the phone screen for
Completed status 0. A ~47% adb stop with no on-screen confirmation is a half-written ROM, not a successful transfer. - Recovery + vbmeta handoff — re-flash both and jump straight into recovery without letting Android boot in between (Section 3.3).
- A bad Magisk boot patch — if it started right after rooting, restore the pristine
boot.imgfrom your ROM build (samloader flash -p BOOT boot.img) and then use v30.7. This is exactly what a v28.1-patched image does on this device.
Boot loop after flashing
Boot back into Lineage Recovery (Vol Up + Bixby + Power) and:
- Go to Factory reset → Format data and confirm
- Verify your LineageOS ROM and NetHunter filenames target the same generation (e.g. both LineageOS 23.x)
- Re-sideload the LineageOS ROM, then redo root by re-patching
boot.imgwith Magisk v30.7, then re-add the NetHunter module from the Magisk app - If it still fails, do a clean re-flash following the official LineageOS install guide before retrying NetHunter
NetHunter app shows "Chroot not found"
The chroot may not have extracted. Open NetHunter → Kali Chroot Manager and tap Install Kali Chroot. Choose "Full" for all tools or "Minimal" for faster install.
Magisk shows "N/A" or root prompts never appear
"N/A" means the running boot image is not carrying Magisk — the app is installed but the patch is not live. Re-do the patch with v30.7 and reflash boot:
- Confirm
boot.imgcame from the same build as the ROM you sideloaded. - Magisk → Install → Select and Patch a File, then flash the new
magisk_patched-*.img. - If you flashed via fastbootd, try Download Mode with
samloader flash -p BOOT …instead to rule out a slot issue. - Open the NetHunter app and grant the Magisk superuser prompt before troubleshooting NetHunter itself.
USB drops during a flash
Cable first, then port. Drop hubs, docks and front-panel ports and use a clean port directly on the motherboard — on the verified run a marginal connection killed samloader's very first print-pit, which reads like a protocol error and is not. Re-run the command once the link is stable instead of changing tools.
WiFi injection not working
Your device may not have a custom kernel with injection patches. Check the NetHunter downloads page. If not listed, you'll need NetHunter Lite with an external adapter.
What a failed first boot looks like
Healthy First Boot
Boot animation runs for several minutes, then Android setup appears and Magisk plus NetHunter apps are present.
Recovery Loop
Usually points to a bad recovery handoff, storage mount issue, or an incomplete ROM flash.
Samsung Logo Loop
Usually means version mismatch, encryption not cleared, or the wrong flash order. Go back to recovery instead of repeatedly hard rebooting.
Other Devices (Not Your Path)
Use Vendor-Specific Unlock Paths
OnePlus Devices
Excellent NetHunter support. Bootloader unlock is simpler (Settings → Developer Options → OEM Unlock is instant).
- • Use fastboot instead of Heimdall
- • 7/8/9 series are A/B devices with no separate recovery partition, so recovery is normally booted from an image rather than flashed; check the device's current NetHunter target first — NetHunter publishes its own Lineage Recovery build for the OnePlus 7, so an older
fastboot boot twrp.imgrecipe may no longer be the supported route - • OnePlus 7/8/9 series have full kernel support
Google Pixel
Great development support but limited NetHunter kernel features.
- • Use fastboot
- •
fastboot flashing unlock - • Pixel 6a has a full NetHunter build; check the device list per model rather than assuming — other Pixel generations are often Lite-only or absent
Xiaomi Devices
Bootloader unlock requires Mi Unlock tool and a waiting period (72h-30d).
- • Apply via Mi Unlock
- • Some models have excellent kernel support
- • Check XDA forums for device-specific guides
Snapdragon Samsung
US carrier variants often have locked bootloaders that cannot be unlocked.
- •
SM-G973UandSM-G973U1are both Snapdragonbeyond1q— no LineageOS build and no NetHunter build, so Rootless is the only option - • Consider NetHunter Rootless as fallback
Best Devices for NetHunter (2026)
Always confirm current support on the NetHunter device list before buying — support moves.
- OnePlus 7/7T/8/8T/Nord — Long-standing favorites: easy unlock, full kernel features
- Samsung Galaxy S10 (Exynos) — This guide's target; solid HID + LineageOS path
- Google Pixel 6a — Trivial unlock, clean AOSP base, and a full NetHunter build; confirm other Pixel generations on the device list before buying
- Xiaomi Poco F-series — Budget-friendly with active custom-kernel communities
Quick Reference Card
S10 Boot Key Combos
| Download Mode | Vol Down + Bixby + USB cable — entered from full power-off for the unlock prompt; adb reboot download for flashing |
| Recovery (Lineage) | Vol Up + Bixby + Power (release when the Lineage Recovery menu appears) |
| Force Restart | Vol Down + Power (hold ~7-10 seconds) |
| Safe Mode | Hold Vol Down during boot logo |
# === NETHUNTER QUICK COMMANDS ===
# Enter Kali chroot
nethunter
# Start Kali chroot with command
nethunter -c "nmap -sV 192.168.1.1"
# Start KeX (VNC desktop)
nethunter kex &
# Check root
su -c id
# WiFi monitor mode (in chroot)
airmon-ng start wlan1
# Packet capture
airodump-ng wlan1mon
# === SAMLOADER (Download Mode) ===
samloader flash -p RECOVERY recovery.img -p VBMETA vbmeta.img
samloader flash -p BOOT boot.img # restore pristine boot = un-root
samloader flash -p BOOT magisk_patched-30700_*.img # root with a v30.7 patch
# === FASTBOOTD (from booted LineageOS) ===
adb reboot fastboot
fastboot devices
fastboot flash boot magisk_patched-30700_*.img
fastboot reboot
# === S10 SIDELOAD (in Lineage Recovery: Apply update -> Apply from ADB) ===
adb -d sideload lineage-23.2-*-beyond1lte-signed.zip
# === HEIMDALL (equivalent writes, if that is your tool) ===
# heimdall flash --RECOVERY recovery.img --VBMETA vbmeta.img --no-reboot
# heimdall print-pit # print partition tableReadiness And Evidence
What this lab must have before you start, and what to capture so the work is repeatable and reportable.
Minimum Viable Setup
- One owned supported device
- Verified codename and unlock state
- Stock firmware or rollback path downloaded first
Evidence To Capture
- Device model/codename output
- Hash list for downloaded files
- Bootloader/recovery detection output
- First boot and NetHunter app screenshots
Keep It Fresh
Re-check these against the current release before you trust the lab again.
-
LineageOS, recovery, NetHunter ZIP Every flash attempt
Check upstream device pages immediately before flashing.
-
Helper scripts Every run
Review URLs, filenames, hashes, and dry-run/download-only behavior.
Setup Anti-Patterns
Habits that turn a useful lab into an unnecessary risk.
- Flashing from stale forum screenshots
- Trusting a helper script before auditing URLs and hashes
- Testing wireless features against unauthorized targets
Operational Safety Baseline
Apply these rules before running any lab command on this page.
- Work only on systems you own or have explicit authorization to test.
- Keep vulnerable services off your home LAN and off public interfaces.
- Take clean snapshots before every exercise and before every vulnerable configuration change.
- Use dedicated cloud accounts, subscriptions, and projects with billing alerts before deployment.
- Write down the teardown command before you run the setup command.
Validation Checkpoints
- -adb and flashing tool detect device
- -Downloaded files match codename
- -First boot completes
- -NetHunter app and chroot launch
Cleanup And Rollback
- -Keep stock firmware/recovery links
- -Document Knox/warranty state
- -Remove unauthorized test profiles