macOS ships with a launchd plist for tftpd at /System/Library/LaunchDaemons/tftp.plist. Loading it with launchctl starts the TFTP server on UDP port 69, serving /private/tftpboot. Requires root. A placeholder file must be created for each file to be transferred, as the default configuration does not allow tftpd to create new files.
sudolaunchctlload-w/System/Library/LaunchDaemons/tftp.plist# Create placeholder for each file to be receivedsudotouch/private/tftpboot/payload.sh&&sudochmod666/private/tftpboot/payload.sh
Evidence
Upstream reference
Environment
Local host
Compatibility
Imported from LOOBins; availability and behaviour depend on macOS version, privacy permissions and installed components. Not lab tested here.
Native
Lateral Movement, Persistence
Detection
No detections at time of publishing: No detections at time of publishing
Run unprivileged TFTP server on a non-standard port
Lateral MovementDefense EvasionPersistencemacOS
Without root access, tftpd can be loaded from a user-created launchd plist stored anywhere on disk (e.g., /tmp). Passing the -w flag allows tftpd to create new files on write, removing the placeholder requirement. The server can be bound to any unprivileged port.