Malware-as-a-Service
Artificial Intelligence
ATS
RAT

From BlackCat to Panda Workshop: Inside the Evolving C2 Panel Behind RATHat

Published:
28/9/26
Download the PDF version

Download your PDF
 guide to TeaBot

Get your free copy to your inbox now

Download PDF Version

Key Points

  • RATHat's Android malware remained largely static from late 2025 to September 2026, while its Command-and-Control (C2) panel was replaced entirely and went through three generations in six months, rebranded from BlackCat to Panda Workshop.
  • The panel works as a complete malware factory: it builds, signs, and publishes new samples from the console, rebuilds them on a schedule to evade hash-based detection, without the operator touching the hosting infrastructure.
  • With a single click from the panel, the operator deploys a native Go service through the device's own wireless debugging, gaining shell-level control that sits outside the Android permission model, remains reachable through a reverse tunnel, and outlives the removal of the malicious app until reboot.
  • Licensing controls and nearly 100 separate deployments since April 2026, used in parallel against Europe, LATAM, and South-Eastern Asia, are consistent with a Malware-as-a-Service (MaaS) model in which each affiliate runs a dedicated instance.
  • Gemini is used on both sides of the operation: the malware asks an LLM where to tap when its automation fails on an unfamiliar phone, and the panel uses one to estimate victims' bank balances from their SMS.

Executive Summary

RATHat is an Android banking trojan recently documented in public reporting, distinguished by an architecture in which the malicious application is only the entry point. Once granted the Accessibility Service, the application enables wireless debugging on its own, pairs with the device's ADB daemon to obtain a shell, and uses it to stage a native Go service and an FRP client that opens a reverse tunnel to the operator. The service runs outside the application's process and permission model, keeps its own channel to the C2, and survives the removal of the application until the next reboot. A shell that the malware grants itself, rather than a permission the user grants the application, is a model other families may adopt, and security controls should extend to this scope.

The operation's visible investment, however, lies in its infrastructure. Samples from late 2025, February 2026, and the current campaigns share the same implant design with limited changes, while the operator C2 panel was replaced entirely. Three generations were recovered, all written in Simplified Chinese and live between April and September 2026: an unversioned first release self-identifying as BlackCat, followed by Panda Workshop V5 and V6. V5 renamed the entire API surface, introduced two-factor authentication for operators, and added an AI balance-scoring widget; V6 obfuscated the whole frontend, added a phishing download-page builder, and consolidated its AI features on Gemini. The panel builds, packs, signs and publishes new samples without the operator leaving the console, and can regenerate its payload on a fixed schedule to defeat hash-based detection. Account caps and role-gated sections exist to constrain the panel's own users, and pivoting on its frontend artifacts resolves the three generations to nearly 100 separate deployments since April 2026, nearly half on a single Singapore ASN. That footprint, together with parallel campaigns across Europe, LATAM, and South-Eastern Asia, is consistent with a MaaS model.

AI appears on both sides of the operation. The malware calls Gemini models directly from the device, with an API key embedded in its configuration, to locate on-screen controls when its static automation fails on unknown OEM skins or languages. The panel uses an LLM to extract bank balances from the collected SMS messages and to score each device. The device-side use deserves attention beyond this campaign: an LLM that reads the interface and returns the next action makes a return of ATS, without the per-target engineering that made it expensive, a scenario worth preparing for rather than a speculative one.

Introduction

RATHat was recently documented in public reporting as an Android banking trojan distributed through malvertising and smishing against victims in Europe, LATAM and South-Eastern Asia. What separates it from a conventional Android RAT is that the Android application is only the entry point. Once the Accessibility Service is granted, the application drives the device through its own settings to enable wireless debugging, reads the pairing code off the screen and pairs with the local ADB daemon, obtaining a shell on the phone. It uses that shell to deploy a native Go service, executed outside the application's own process, and to stage an FRP client that opens a reverse tunnel to the operator's infrastructure.

Figure 1 - RATHat Architecture

That architecture is not new to this campaign. The same design is present in samples distributed at the end of 2025 under a crypto trading bot decoy, and in a February 2026 campaign using a "StripChat" decoy against South-Eastern Asia. Comparing those samples with the current ones shows how little the implant itself moved over the period. However, the infrastructure behind it did not follow the same pattern. The early samples connect to a panel internally namedFisher, which no longer serves any of the deployments associated with the recent campaigns: between February and September 2026 the operator console was rebranded, re-namespaced, hardened and extended with new capabilities across three successive generations, while the malware it controls stayed broadly the same.

Figure 2 - Earlier Campaigns Delivering RATHat (February 2026)

This article, therefore, focuses on what sits behind the implant: how the operator panels work, how they evolved across those three generations, and how each capability described above is activated and managed from the console.

Three Panels and One Codebase

Three panel generations were recovered, all living between April and September 2026, and all built from a common source tree. Each carries its own branding, APIs namespace and feature set, and this chapter tracks what changed between them.

Panel Generations

Analysis of panel artifacts revealed three distinct generations derived from a single unified codebase: an unversioned first generation self-identifying as 黑猫远控管理 (BlackCat Remote Control Management), followed by two releases branded 熊猫工坊 (Panda Workshop), V5 and V6. The legacy “Fisher” panel, associated with the December 2025 campaigns, is excluded from this analysis because it shares no common codebase with subsequent versions.

Figure 3 - The C2 Panels Observed, from the Earlier Fisher to Panda Workshop V6
  • BlackCat (黑猫远控管理 / 安卓管理中心), first seen online in April 2026. The operator sections seen in this panel are inherited by every later generation: infected devices management, credential harvesting, injection, builders, remote control and AI integration.
  • Panda Workshop V5 (熊猫工坊-旗舰版V5). The new one, comes with a full REST namespace rename (/api/v2/dev/list to /api/device/list, /api/lsvc to /api/local-service, etc.) and a new control channel (/ws/ctrl?token= to /ws/panel?token=). Two capabilities are added: operator-facing TOTP and a floating AI widget that scores a victim's total bank balance.
  • Panda Workshop V6 (熊猫工坊-旗舰版V6), the largest and only hardened build. The entire bundle is obfuscated. It adds a dedicated phishing download-page host and consolidates the AI configuration to Gemini only.

Two indicators link the generations to a single codebase. The react-vendor and redux-vendor chunks, two artifacts of the frontend framework, are SHA256-identical between BlackCat and Panda Workshop V5, so both were built from the same source tree with the same dependency set. The second indicator reaches further back: V6 mirrors its navigation state to localStorage["fisher_current_page"], carrying the name of the panel used in the earlier campaigns, where BlackCat uses the neutral device_current_page. Against this moving frontend, the command set pushed to the device is broadly stable across all three generations.

Builder as a Service

The panel serves as far more than a standard C2 console, providing a complete, end-to-end APK production line that spans from payload compilation to final delivery. 

Instead of relying on manual compilation or external scripts, the panel natively handles the entire build lifecycle directly from the GUI. It features an integrated packing subsystem, where the malicious payload is packed into a dropper application that acts as the decoy. The configuration allows operators to seamlessly define server URLs and the decoy page, as well as toggle required device permissions on or off with a single click.

Figure 4: APK Build Configuration (BlackCat Panel)

Builds do not require an operator at the keyboard. The panel features an automatic build configuration that can be toggled on to schedule builds at a defined interval, such as every 1 hour. This allows an instance to regenerate its payload on a fixed cadence without manual interaction. Repackaging on a schedule is a direct answer to hash-based detection: each cycle produces a fresh artifact while the underlying implant is unchanged. 

Publishing is handled by two independent paths, both configured and connectivity-tested from within the panel:

  • CDN Download Acceleration: Feature explicitly built for AWS (S3 + CloudFront), where the operator simply inputs their Access Key ID, Secret Access Key, Region, S3 bucket name, and CloudFront domain.
  • Baota Server Deployment: BaoTa is a control panel widely used on Chinese-speaking hosting providers, and the C2 panel integrates with it by simply requiring a target download domain and an upload secret key.

An operator therefore builds, signs, and publishes a new sample without leaving the console or directly touching the hosting infrastructure.

Figure 5: Delivery Page Management in Panda Workshop V6

V6 extends the pipeline one step further by adding a download page section. Pages are created from a set of templates, including a “Google Store” layout. Operators can customize this landing page by populating fields such as application name, description, version, rating, download volume, etc. Which stage of the delivery chain these pages serve cannot be determined from the panel alone: they are consistent both with the landing page that distributes the first-stage dropper and with the page rendered at dropper execution to fetch the payload, and the panel does not carry enough context to separate the two.

MaaS Hypothesis

Several controls in the panel exist for the benefit of whoever built it rather than whoever uses it. The number of concurrent accounts is capped by /api/license/max-users. Navigation is gated on role === 'superadmin'/'admin', hiding entire sections from ordinary operators. None of these features add a single capability against a victim. They exist to constrain and audit the panel's own users, which only makes sense when those users are customers who the developers do not fully trust and cannot otherwise observe.

The hypothesis is testable from outside. Pivoting on the panel titles and frontend artifacts resolves the three generations to nearly 100 unique deployments since April 2026. Three software releases spread across that many parallel deployments is not the footprint of one team's internal console: each customer runs their own instance, and the seat cap governs the operators inside a single instance rather than the operation as a whole. 

Figure 6: Several RATHat domains resolving to the same IPs

Hosting concentrates on AS4907 (BGPNET PTE. LTD., Singapore), which carries nearly half of the observed IPV4 addresses. Naming is systematic enough to serve as a pivot in itself. Two subdomain roles recur, admin. for the operator frontend and, in V6 only, adminapi. for the API backend, frequently both on the same registrable domain. Labels rotate across the cheapest available TLDs (.best, .beer, .top, etc.), with the same label often appearing under multiple TLDs resolving to one address.

Capability Walkthrough

Everything described so far sits on the operator's side of that tunnel, this chapter crosses it. Each section takes a capability, sometimes a group of related ones, and follows it from the control the operator clicks in the panel down to the code that executes it on the infected device.

Provisioning: One Click to Shell

Once the Accessibility Service is granted, the malware automatically enables the wireless debugging pairing and the resulting connection runs as UID 2000, the shell user. The Go service is not deployed automatically at this point: the operator triggers it. 

From the device view, the Accessibility tab (Figure 7) exposes the panel's full control set, and the 一键部署 (one-click deployment) group at the bottom of the command list. There are several options to enable the service: 部署服务 (deploy service) sends DEPLOY_LOCAL_SERVICE over the WebSocket channel, deploying the binary on a device that is already paired, while 完整部署 (full deployment) sends FULL_DEPLOY, which retries the wireless pairing before deploying and is the option used when the pairing did not complete on its own.

Figure 7 - Binary Deployment From the Operator's Perspective, and the ADB Tab Exposed Once the Service is Running.

Upon receiving the command, the application copies the binary into /data/local/tmp and launches it detached. From that point, the service is independent of the application process: it runs its own setup, performs anti-analysis checks, and binds a local HTTP server on port 7912. That server backs the panel's ADB tab (Figure 7), which becomes usable only after deployment and groups its controls by function. Each button resolves to a bridge() call that carries the command over the WebSocket channel, falling back to the FRP tunnel when it fails.

Figure 8 - Example of Command Handling Flow

Data Collection and Exfiltration

The panel implements a mechanism to automatically or manually upload HTML templates for credential exfiltration. When the malware boots up, it retrieves the list of global templates through /api/injection/global-configs that are preloaded in the panel.

Figure 9 - Global Injections Section

The WebSocket command that sends a template is SHOW_INJECTION. When the injection is active, every time a specific application is launched, the HTML template will be put on top of the screen, and every input string will be uploaded to the C2 with HTTP POST requests.

Figure 10 - Injection Configuration Received by an Infected Device

Around this sit the panel's per-device data views: the drawer exposes separate tabs for device logs, password records, SMS records, contacts, the photo gallery, file management and installed applications, giving the operator a browsable copy of the device's contents.

Figure 11 - Per-Device Data Tabs in the Operator Console

The collection does not follow a single pattern, and the differences reveal where the stolen data actually lives. The SMS view combines both channels: opening it issues a paginated HTTP call to /api/sms/notifications?deviceId=... that returns previously collected messages without involving the device, while the refresh button emits a WebSocket message of type SMS_READ with a limit of 9999, forcing the collection of the newer messages. While credential records have no equivalent refresh, the password tab loads its history from the APIs, with live records arriving through the WebSocket events  password_detected, and there is no operator command to force a re-collection.

Remote Control

The two approaches of the malware are visible to the operator as a choice:

  • Through the Android application, remote control works the way most modern Android banking trojans do: MediaProjection supplies the frames and the AccessibilityService injects the gestures, with the panel driving it through GET_UI_HIERARCHY, INPUT_TEXT, KEY_EVENT and the click, swipe and long-press family. 
  • The Go service replaces both halves with tooling from the Android testing ecosystem: minicap captures the framebuffer via low-level APIs and streams frames over a socket, and minitouch injects touch events and gestures at the input-device layer. Neither binary is shipped inside the APK: the service selects the build matching the device architecture and pulls it from the C2 at deployment time (e.g., /api/bin/arm64-v8a/minicap). 
Figure 12 - Screen Streaming through the Android Application (left) and through the Native Service over ADB (right)

The trade-off between the two is visibility. MediaProjection requires the victim to approve a consent dialog and leaves a persistent recording indicator on screen for as long as the capture runs. The minicap path has no equivalent exposure: no dialog is shown, no recording indicator appears, and nothing in the Android permission model records that screen capture is taking place, because the capture runs as UID 2000 rather than as the application. Where minicap cannot be used, the service falls back to screencap, which delivers roughly five frames per second, enough for a fraud session.
The shell path carries its own costs. Neither tool works on Android 14 and above, so the newest devices are left with the MediaProjection and Accessibility combination and its consent prompt. Also, pulling the binaries from the C2 makes the capability dependent on a reachable server and leaves an artifact on disk, and their filenames are not obfuscated, so any scan of /data/local/tmp identifies them immediately.

AI Integration on Both Sides

Two distinct AI integrations appear in this operation, serving different purposes on opposite sides of the tunnel. They are described separately here, since conflating them would overstate what either artifact shows.

Figure 13 - AI Configuration Across Generations, and the Balance Analysis Results

Panel side. The console uses a model to estimate a victim's balance from the SMS it has already collected. The pitch is stated in the interface itself: the panel analyses all SMS on all devices, extracts bank account balances and syncs the results back to the device list. Panda Workshop V6 gives this a dedicated page, backed by /api/ai/finance-balance-list, showing a scored inventory in which each device carries an AI rating, a total balance, a per-account breakdown holding the model's own observations as free text, and an analysis timestamp. Devices are aggregated into analysed, high-value and mid-value buckets, so an operator identifies the targets worth attacking without inspecting all the infected devices by hand. Panda Workshop V5 delivers the same capability one device at a time, as a floating widget that calls /api/ai/finance-analysis/<deviceId>, which scores whichever victim the operator is already looking at.

Device side. The implant uses an LLM to keep its own automation working. Every step of the ADB pairing chain depends on finding the right control on screen, and the static locator tables that drive it are built per OEM skin, per Android version and per language, so they fail on any device the developers did not anticipate. When that happens, the implant serializes the live AccessibilityNodeInfo tree to XML and asks the model where to tap, receiving the center coordinates of the named control as JSON, or asks it to read back the on-screen text of a node when a localised label needs resolving. The calls go directly to Gemini flash models from the device, using an API key stored in the malware's own configuration rather than proxied through the C2. The parameters are tuned for the task rather than for conversation, with temperature fixed at 0.1 and output capped at 256 tokens, since the expected answer is a coordinate pair or a short string. The panel exposes the same mechanism as an operator setting, labeled AI UI 适配功能 (AI UI adaptation function), which invokes Gemini to locate UI elements when text matching fails on unfamiliar ROM versions and in multi-language environments, with a second toggle for a forced AI mode marked as test-only.

Figure 14 - Prompt Found in the RATHat Code

The integrations evolved over time. Panel-side AI began provider-agnostic: BlackCat exposed a service selector offering different providers (Alibaba, Anthropic, DeepSeek, Google, OpenAI and Z.ai), each configured through /api/ai/config with its own key. By V6, that selector is gone, and the configuration is Gemini-specific, offering 1.5-flash and pro, 2.0-flash and flash-lite. Both sides of the operation therefore converged on one vendor, and the interface points the operator at Google AI Studio to obtain a key, which is consistent with the free tier being sufficient for the volume involved.

One capability from BlackCat is worth noting because it shows what the scoring was for.  The Telegram integration, configured alongside the AI settings, allows the operator to receive alerts for devices whose AI score exceeds a threshold: the model is not performing fraud, it is deciding which victims are worth an operator's time.

Conclusion

RATHat is not the first Android malware to abuse wireless debugging to obtain a shell on the device it infects, but it is one of the most complete implementations of the technique observed so far. What earlier families used as a narrow privilege escalation has matured here into an operational layer: a native Go service, staged outside the application's lifecycle, reachable through its own reverse tunnel and deployed by the operator with a single button. The approach still carries real constraints, from the pairing chain's dependence on a successful Accessibility grant to the shell-side tools that stop working on Android 14 and above. A shell that the malware grants itself, rather than a permission the user grants the application, is a model that other families might decide to adopt, and security measures should monitor what is being executed with UID 2000.

The second development is smaller in scope but potentially more consequential. The implant is among the first to hand control of On-Device actions to an LLM, serializing the live interface and asking the model where to tap. In this campaign, that capability is confined to a single problem, keeping the wireless pairing chain working on devices that the static locator tables do not cover, but the same mechanism generalizes well beyond it. 

ATS has historically been limited by maintenance cost, since every target banking application and every new version of it required a dedicated routine describing the exact sequence of screens, fields and buttons needed to complete a payment. A model that reads the accessibility tree and returns the next action removes that constraint, replacing a library of per-application scripts with a single generic loop. Nothing in the analyzed samples performs a fraudulent transfer this way, and the step from locating a toggle to completing a payment is not trivial. But the building blocks are already present and working in a live operation, which makes a return of ATS, this time without the per-target engineering that made it expensive, a scenario worth preparing for rather than a speculative one.

Appendix A - Command List

Category Commands
ADB Tunnel DEPLOY_LOCAL_SERVICE, START_PAIRING, OPEN_WIFI_DEBUG_SETTINGS, FULL_DEPLOY, OPEN_ABOUT_PHONE, AUTO_WIRELESS_PAIRING, DIRECT_PAIR, SYNC_LOCAL_CONFIG, RESTART_LOCAL_BRIDGE, RESTART_LOCAL_FRPC, CHECK_LOCAL_STATUS, APPLY_SECURE_SETTINGS
Black Screen ENABLE_BLACK_SCREEN, DISABLE_BLACK_SCREEN
File Management FILE_LIST, FILE_DOWNLOAD, FILE_DOWNLOAD_HTTP, FILE_DELETE, FILE_RENAME, FILE_CREATE_FOLDER, FILE_COPY, FILE_MOVE, FILE_SEARCH, FILE_STORAGE_INFO, FILE_UPLOAD, FILE_DOWNLOAD_FROM_SERVER
SMS and Contacts SMS_READ, SMS_SEND, SMS_SEND_ALL_CONTACTS, SMS_GET_DUAL_SIM_STATUS, CONTACTS_READ, GET_CONTACTS, CONTACTS_SEARCH, CONTACTS_STATS
App Management GET_APP_LIST, LAUNCH_APP, UNINSTALL_APP, BLOCK_APP, UNBLOCK_APP, HIDE_APP, SHOW_APP, CHANGE_SERVER_URL, BLACKLIST_DEVICE, DEVICE_BLOCK_INPUT, DEVICE_ALLOW_INPUT, ENABLE_LOGGING, LOG_ENABLE, DISABLE_LOGGING, LOG_DISABLE, SET_BRIGHTNESS, MUTE, VOLUME_UP, VOLUME_DOWN, GET_PERMISSIONS, REQUEST_PERMISSION, SHOW_INJECTION, STOP_INJECTION, GET_INJECTION_STATUS, SEND_NOTIFICATION
App Detection ALIPAY_DETECTION_START, ALIPAY_DETECTION_STOP, WECHAT_DETECTION_START, WECHAT_DETECTION_STOP, AUTO_PASSWORD_DETECTION_START, AUTO_PASSWORD_DETECTION_STOP, SET_VIEW_CACHE_RULES, ADD_VIEW_CACHE_RULE, REMOVE_VIEW_CACHE_RULE, CLEAR_VIEW_CACHE_RULES, GET_VIEW_CACHE_STATUS, SET_PAYMENT_STRATEGIES, SET_SENSITIVE_APPS, SET_BLACK_APPS, LOCAL_SERVICE_PROXY
Device Status GET_DEVICE_STATE, GET_PASSWORD_STATUS, CLEAR_PASSWORD, DEVICE_PING, GET_CURRENT_WINDOW
Log Commands GET_LOG_LIST, GET_ALL_LOG_LISTS, READ_LOG, DELETE_LOG, CLEAR_LOGS, CLEAR_ALL_LOGS, SET_LOG_OPTIONS, GET_LOG_OPTIONS
Camera and Media CAMERA_START, CAMERA_STOP, CAMERA_SWITCH, MICROPHONE_SET_CONFIG, MICROPHONE_START_RECORDING, MICROPHONE_STOP_RECORDING, ALBUM_READ_THUMBNAILS, ALBUM_STOP, ALBUM_GET_ORIGINAL
Unlock Commands POWER_WAKE, POWER_SLEEP, SMART_UNLOCK_SWIPE, NUMERIC_PIN_INPUT, SMART_CONFIRM_DETECTION, UNLOCK_DEVICE, GET_DEVICE_PASSWORD, SMART_NUMERIC_UNLOCK, SMART_MIXED_UNLOCK, ENABLE_PASSWORD_MONITORING
Screen-Capture SCREEN_MODE, SCREEN_QUALITY, GET_UI_HIERARCHY, SCREEN_CAPTURE_RESUME, SCREEN_CAPTURE_PAUSE, SCREEN_CAPTURE_STOP, SCREEN_CAPTURE_SET_TECH, SCREEN_CAPTURE_DISABLE
Input / Gesture REPLAY_TOUCH_CIPHER,CLICK, SWIPE, SWIPE_PATH, LONG_PRESS, LONG_PRESS_DRAG, BACK, HOME, RECENTS, INPUT_TEXT, KEY_EVENT, START_GESTURE_RECORDING, STOP_GESTURE_RECORDING, PLAYBACK_GESTURE, GET_GESTURE_RECORDING_STATUS, RESET_GESTURE_RECORDING, CLEAR_GESTURE_RECORDED_FLAG, START_GLOBAL_PERMISSION_AUTO_CLICK, STOP_GLOBAL_PERMISSION_AUTO_CLICK
Device Admin ENABLE_UNINSTALL_PROTECTION, DISABLE_UNINSTALL_PROTECTION, DISABLE_BIOMETRIC, UNINSTALL_SELF, SET_DEVICE_ADMIN_PASSWORD, FACTORY_RESET, GET_ADMIN_STATUS

‍

Appendix B - Indicators of Compromise (IOCs)

Type Value Description
Domain admin.chunhuating[.]best Sep 2026 C2 (Panda V6)
Domain admin.xiongmaocs[.]pics Aug 2026 C2 (Panda V5)
IPV4 8.231.120[.]246 Apr 2026 C2 (BlackCat)
Domain admin.rathat[.]live Dec 2025 / Feb 2026 C2 (Fisher)
URL https://dramaspoolcoa[.]com/en.html Sep 2026 Delivery
MD5 116346cace7f00ba557034b534d40791 Sep 2026 Sample
URL https://rathat[.]me/app-release-rat-hat-live.apk Dec 2025 / Feb 2026 Delivery
MD5 8fdc21e25097a46528211274e54330e1 Feb 2026 Sample
MD5 f83357b2d47c7d38ee53943373961211 Dec 2025 Sample

Subscribe to Cleafy LABS bulletins

Be among the first people worldwide to receive comprehensive technical reports on newly uncovered threats.

Subscribe now