Telerik UI CVE-2019-18935 — Reverse Shell, Potato Escalation and Godzilla In-Memory Web Shell on IIS
Executive Summary
The attacker objective is durable remote control of an internet-facing Windows IIS server through an old, still-unpatched Telerik UI for ASP.NET AJAX component. AhnLab ASEC (2026-09-28) describes two incidents that abused CVE-2019-18935, a .NET deserialization flaw in the RadAsyncUpload control that yields code execution as the IIS worker process (w3wp.exe). In the first, the actor ran a reverse shell to 206.82.6.22 on port 80, enumerated host name, privileges and processes, tried Potato-family privilege escalation (including a SweetPotato build modified for a web-shell environment), and finally loaded a Godzilla-style .NET web shell (godmemshell.dll) entirely in memory by registering a request handler with ASP.NET's VirtualPathProvider, so no .aspx file lands on disk. In the second, the exploit payload only launched a Rust-based scanner that pulled a target list from a remote server, probed 53 candidate paths for WordPress setup pages (/wp-admin/setup-config.php and /wp-admin/install.php) and reported hits through the Telegram API.
ASEC attributes neither case to a named actor, so this pack does not name one. The same vulnerability was previously used by Blue Mockingbird (Monero mining, per Red Canary in 2020) and in 2023 federal-agency IIS intrusions (CISA/FBI/MS-ISAC), as ASEC recounts; those are history, not part of this campaign's IOCs.
The best defensive angle is the IIS worker-process parent chain: w3wp.exe spawning cmd.exe, PowerShell, recon tools, or a SYSTEM-owned child, plus PE files written by w3wp.exe into C:\Users\Public\. Because the web shell is in-memory, process lineage and egress are the durable signals; file scanning will miss the shell itself.
Scope note: the corroborating articles supplied with this task (The Hacker News, Cybersecurity News) describe a different, newer 2026 Telerik chain (CVE-2026-13181 to -13184, padding oracle plus type-resolution, fixed in 2026.2.708) with no confirmed in-the-wild exploitation. They are cited for patch guidance only. The ASEC cases involve CVE-2019-18935, not those CVEs.
Defender priority: inventory every IIS host for Telerik.Web.UI.dll older than the fixed build, then run Q1, Q4, Q6 and Q9 fleet-wide on IIS servers. Any w3wp.exe child that is cmd.exe, PowerShell, or a SYSTEM process is a likely compromise.Source Review & Web Hunter Notes
Four URLs were fetched and their text saved to Telerik-CVE-2019-18935-GodzillaMemShell-Hunt-sources/ (01 to 04). Every atomic IOC in the import CSV traces to snapshot 01 (the ASEC primary) and snapshot 04 (a republication of it).
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| 1 (Primary) | AhnLab ASEC, "Vulnerability Attack Case: Installation of a Web Shell and Execution of a Scanner by Exploiting a Telerik UI Vulnerability" (2026-09-28) | Two incident cases, attack chain, godmemshell.dll in-memory web shell, SweetPotato variant, Rust scanner, full IOC list, mitigation (Telerik 2020.1.114 or later) | Yes |
| 3 (Aggregator) | hendryadrian.com republication of the ASEC report | Repeats the ASEC findings, partial IOC list, MITRE tags. Adds no independent evidence; not counted as a second source for prevent decisions | Partial (corroborates wording only) |
| 2 (Context only) | The Hacker News, "Telerik UI Padding-Oracle Bug Chained to Unauthenticated RCE" (2026-09) | Describes a different 2026 chain (CVE-2026-13181 to -13184), fix 2026.2.708, no confirmed exploitation; confirms CVE-2019-18935 history | Partial (patch guidance and history only) |
| 2 (Context only) | Cybersecurity News, "Telerik Flaw Chain Lets Unauthenticated Attackers Turn Padding Oracle Into Remote Code Execution" | Same 2026 chain; affected 2010.1.309 to 2026.2.519; upgrade to 2026.2.708 | Partial (patch guidance only) |
Independence: the hendryadrian page is a mirror of ASEC, so the two IOC-bearing sources are one origin. Per pack policy no indicator ships at action=prevent or critical severity; everything is detect/high at most.
Credential in source: the ASEC report prints a Telegram bot token inside the sendMessage/sendDocument URLs. It is an attacker credential, is not shipped in any block, and must not be used or tested.
Prompt-injection check: all fetched content was treated as untrusted data. No fetched page contained instruction-like text aimed at the analyst or model.
Hunt Brief & Attack Chain
Hypotheses
- (High) w3wp.exe on a Telerik-hosting server spawns cmd.exe or PowerShell after exploitation (Q1, Q2, Q3).
- (High) A Potato-family tool turns the IIS worker token into SYSTEM; the child process runs as S-1-5-18 (Q4, Q5).
- (High) The exploit payload or reverse shell drops or runs tools from C:\Users\Public\ and reaches the documented C2 (Q6, Q8, Q9, Q12, Q13).
- (Medium) The worker process itself makes unusual outbound connections, which is how the in-process reverse shell appears (Q10).
- (Medium) The Rust scanner resolves api.telegram.org and fetches a target list (Q11, Q12).
- (Low, gap) The godmemshell.dll web shell lives in w3wp.exe memory and its HTTP traffic hides inside normal IIS requests; see Coverage Map.
| Step | Behavior (ASEC) | Telemetry | Hunt angle |
|---|---|---|---|
| 1 Initial access | CVE-2019-18935 deserialization in RadAsyncUpload runs code as w3wp.exe | IIS logs, ProcessRollup2 | Q1; native IIS log hunt (Sec. 7) |
| 2 Reverse shell | Socket to 206.82.6.22:80, handles bound to cmd.exe | NetworkConnectIP4, ProcessRollup2 | Q1, Q9, Q10 |
| 3 Discovery | hostname.exe, privilege and process queries | ProcessRollup2 | Q2, Q3 |
| 4 Priv-esc | Potato-family incl. modified SweetPotato; PrintSpoofer-style token spoofing to SYSTEM | ProcessRollup2 (UserSid) | Q4, Q5 |
| 5 Persistence | godmemshell.dll loaded in memory, registered via VirtualPathProvider, Godzilla-style .NET payload loader keyed on Type header and cookie session | Memory only; HTTP requests | Gap; hardening + IIS logs |
| 6 Scanner (case 2) | Rust scanner fetches ins.txt target list, probes 53 paths for /wp-admin/setup-config.php and install.php, sends results to Telegram | ProcessRollup2, PeFileWritten, DnsRequest | Q6, Q7, Q11, Q12 |
Consolidated IOC Table
Indicators are exactly those in the ASEC report (snapshot 01). Shared legitimate infrastructure (Telegram) is not imported. ASEC does not map hashes to tools; all five are listed as sample MD5s.
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| MD5 | 0a4be0b6c650ffdcd1c22db56f1c4aec | medium | detect | ASEC sample hash (role not stated) |
| MD5 | 10f705728d228ad949b7894c1a85a2b1 | medium | detect | ASEC sample hash |
| MD5 | 177e34d9174766a1d187a0c82de4c02f | medium | detect | ASEC sample hash |
| MD5 | 18fb4e070653fc9791e0e408d8cb1c8e | medium | detect | ASEC sample hash |
| MD5 | 1dbfda02d74b6a7586c4430175204c28 | medium | detect | ASEC sample hash |
| IPv4:port | 206.82.6.22:80 | high | detect | Case 1 reverse-shell C2; also http://206.82.6.22/ |
| IPv4:port | 65.98.5.158:31337 | high | detect | Scanner target-list host (Ins.Txt) |
| IPv4:port | 2.59.133.147:31338 | high | detect | Hosts ins.txt and sm.json |
| IPv4:port | 45.138.16.187:31337 | high | detect | Hosts bb.json and cofuz.json |
| URL | http://2.59.133.147:31338/ins.txt, http://2.59.133.147:31338/sm.json, http://206.82.6.22/, http://45.138.16.187:31337/bb.json, http://45.138.16.187:31337/cofuz.json | high | detect | ASEC URL list |
| Domain | api.telegram.org | n/a | enrich (hunt only) | Shared legitimate service used for scanner results; behavioral hunt Q11, not imported |
| Path | C:\Users\Public\ and C:\Users\Public\Documents\ | medium | hunt | Malware staging locations named by ASEC |
| Path | /wp-admin/setup-config.php, /wp-admin/install.php | medium | hunt | Scanner probe targets (the victims are third-party WordPress sites) |
| Process | w3wp.exe parent of cmd.exe / powershell.exe | high | hunt | Backbone behavior (Q1) |
| Filename | godmemshell.dll, red.txt | medium | hunt | godmemshell.dll is the in-memory web shell module; red.txt is the Telegram result attachment. Neither is a persistent on-disk artifact per ASEC |
Affected Surface & Telemetry Matrix
| Surface | Telemetry | Priority | Gap risk |
|---|---|---|---|
| Windows IIS servers with Telerik UI for ASP.NET AJAX (RadAsyncUpload) | ProcessRollup2, NetworkConnectIP4, PeFileWritten, DnsRequest; IIS W3C logs | Critical | Sensor missing on DMZ web servers; in-memory web shell invisible to file telemetry |
| Hosts reachable from compromised IIS server | ProcessRollup2, NetworkConnectIP4 | High | Lateral follow-on not documented by ASEC |
| Egress controls for server segments | Firewall and proxy logs | High | Servers with unrestricted outbound reach C2 on any port |
| Third-party WordPress sites | Web server access logs (victims of the scanner, not this estate) | Low | Out of scope for endpoint hunting |
ATT&CK Mapping
| Tactic | Technique | Observed behavior | Query / control |
|---|---|---|---|
| Initial Access | T1190 Exploit Public-Facing Application | CVE-2019-18935 in RadAsyncUpload | Q1, Q7; patch (Sec. 12) |
| Execution | T1059.003 Windows Command Shell, T1059.001 PowerShell | cmd.exe via reverse shell; PowerShell under w3wp.exe | Q1, Q3 |
| Discovery | T1033, T1057, T1082 | Host name, privileges, process list | Q2, Q3 |
| Privilege Escalation | T1134.001 Token Impersonation/Theft, T1068 | Potato-family tools, SweetPotato variant, PrintSpoofer-style spoofing | Q4, Q5; spooler hardening |
| Persistence / Defense Evasion | T1505.003 Web Shell, T1620 Reflective Code Loading, T1055 | godmemshell.dll loaded in memory via VirtualPathProvider; Godzilla-style loader | Gap; IIS logs; ASR web-shell rule |
| Command and Control | T1095 Non-Application Layer Protocol, T1071.001, T1102 | Raw socket reverse shell; HTTP C2 URLs; Telegram API | Q9, Q10, Q11 |
| Resource Development / Ingress | T1105 Ingress Tool Transfer | Scanner created and run via exploit payload; target list fetched | Q6, Q7, Q12 |
| Reconnaissance | T1595.002 Vulnerability Scanning | Rust scanner probing for WordPress setup pages | Q12 |
| Exfiltration | T1567 Exfiltration Over Web Service | Results sent to Telegram as red.txt | Q11 |
Native Audit-Log Hunts
These checks need no Falcon query. Items marked (general knowledge) are standard Telerik/IIS practice, not statements from the ASEC article.
- Telerik version inventory: find Telerik.Web.UI.dll on every IIS host and compare its file version to the fixed build. ASEC states 2020.1.114 or later; use the latest release (see Sec. 12 and the playbook).
- IIS W3C logs (general knowledge): look for POST requests to the RadAsyncUpload handler (Telerik.Web.UI.WebResource.axd with an rau query) from unfamiliar sources, large bursts of those requests, and requests returning 200 immediately before a w3wp.exe child process appears.
- Web shell traffic (ASEC): the shell distinguishes processing by a request
Typeheader, keeps a payload in a cookie-based session, and returns encrypted bodies. Look for requests to application URLs with an unusual customTypeheader and long, high-entropy cookies or POST bodies that return encrypted blobs. - Windows Event Log: Security 4688 with process creation auditing and command line enabled (parent w3wp.exe), and 4672/4624 for SYSTEM-privileged logons following IIS activity.
- Loaded modules (Sysmon 7, if deployed): unsigned or non-Telerik assemblies loaded into w3wp.exe; compare against a clean baseline. godmemshell.dll is loaded in memory only, so a module list may not show it.
- Filesystem: list recent files under C:\Users\Public\ and C:\Users\Public\Documents\ (ASEC mitigation).
CrowdStrike LogScale CQL Hunt Queries
Looks for: The ASEC mitigation guidance names cmd.exe and powershell.exe under w3wp.exe as the abnormal-process pattern after CVE-2019-18935 exploitation. This is the backbone detection of the pack. FP: Some legacy apps shell out on purpose; baseline per application pool.
// HUNT: IIS worker process spawns cmd.exe / PowerShell // MITRE: T1190, T1059.003, T1059.001 // CONF: high FP: medium COST: low // REQUIRES: Falcon sensor on IIS servers (ProcessRollup2) // FALSE POSITIVES: legacy ASP.NET applications that deliberately shell out to cmd.exe or PowerShell (report generators, build or deploy hooks) // TUNING: exclude the specific CommandLine values of known, owner-approved application shell-outs per IIS host and application pool; keep any cmd.exe or powershell.exe child with no CommandLine or with an interactive pattern (whoami, hostname, tasklist, net, systeminfo) #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^w3wp\.exe$/i | FileName=/^(cmd|powershell|pwsh)(\.exe)?$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, ImageFileName])
Looks for: ASEC observed the operator query the system name (hostname.exe), privileges, and running processes through the reverse shell. Direct w3wp.exe children only; the cmd.exe grandchild case is covered by Q3.
// HUNT: IIS worker child running first-stage recon (hostname, whoami, tasklist ...) // MITRE: T1033, T1057, T1082, T1018 // CONF: high FP: low COST: low // REQUIRES: Falcon sensor on IIS servers (ProcessRollup2) // FALSE POSITIVES: monitoring or deployment tooling that runs hostname or whoami from an IIS-hosted admin page; rare on production IIS #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^w3wp\.exe$/i | FileName=/^(hostname|whoami|tasklist|systeminfo|ipconfig|netstat|net1?|quser|nltest|arp|route|wmic|reg|sc|qwinsta)(\.exe)?$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
Looks for: Correlates the two documented steps on one host: a cmd.exe spawned by w3wp.exe, and recon binaries spawned by a cmd.exe. Catches the grandchild case Q2 cannot see. FP: Host-level correlation, not exact process-tree.
// HUNT: IIS worker shell followed by recon on the same host (cmd.exe then hostname/whoami/tasklist) // MITRE: T1033, T1057, T1082 // CONF: high FP: medium COST: medium // REQUIRES: Falcon sensor on IIS servers (ProcessRollup2) // FALSE POSITIVES: admin consoles or support staff who RDP to the IIS host and run recon commands from an interactive cmd.exe launched by Explorer are excluded by the w3wp.exe parent requirement, but a web admin tool launching cmd.exe then helper tools can match // TUNING: scope to hosts with the IIS role and exclude the CommandLine values of approved health-check scripts; selfJoinFilter correlates by host (aid), not by exact process-tree, so confirm the cmd.exe PID chain in Falcon before escalating #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | selfJoinFilter(field=[aid], where=[ {ParentBaseFileName=/^w3wp\.exe$/i FileName=/^cmd\.exe$/i}, {ParentBaseFileName=/^cmd\.exe$/i FileName=/^(hostname|whoami|tasklist|systeminfo|ipconfig|netstat|net1?|nltest|quser)(\.exe)?$/i} ]) | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine])
Looks for: ASEC reports that the Potato tools (including a SweetPotato variant modified for a web-shell environment) use token spoofing such as PrintSpoofer to reach SYSTEM and then launch processes such as cmd.exe with elevated privileges. A SYSTEM-owned child of w3wp.exe is the observable result. FP: Medium only where app pools legitimately run as LocalSystem.
// HUNT: Process running as SYSTEM directly under w3wp.exe (Potato-family token spoofing result) // MITRE: T1134.001, T1068, T1548 // CONF: high FP: medium COST: low // REQUIRES: Falcon sensor on IIS servers (ProcessRollup2 with UserSid) // FALSE POSITIVES: IIS application pools deliberately configured to run as LocalSystem (rare, but present on legacy installs) // TUNING: exclude hosts whose application pool identity is documented as LocalSystem; app pools on ApplicationPoolIdentity or a service account should never directly parent a SYSTEM (S-1-5-18) process #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ParentBaseFileName=/^w3wp\.exe$/i | UserSid=S-1-5-18 | table([@timestamp, aid, ComputerName, UserName, UserSid, ParentBaseFileName, FileName, CommandLine, ImageFileName])
Looks for: Matches Potato-family names in the image name or command line. The modified SweetPotato variant may be renamed, so pair with Q4 (SYSTEM child of w3wp.exe) rather than relying on names alone.
// HUNT: Potato-family privilege-escalation tooling (SweetPotato, PrintSpoofer, GodPotato and kin) // MITRE: T1134.001, T1068 // CONF: high FP: low COST: low // REQUIRES: Falcon sensor on IIS and Windows servers (ProcessRollup2) // FALSE POSITIVES: authorized penetration tests and red-team exercises; security researchers on lab hosts #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | FileName=/^(sweetpotato|printspoofer\d*|godpotato|juicypotato|roguepotato|rottenpotato|efspotato|badpotato|potato)(\.exe)?$/i or CommandLine=/(sweetpotato|printspoofer|godpotato|juicypotato|roguepotato|efspotato)/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, ImageFileName, SHA256HashData])
Looks for: ASEC advises checking C:\Users\Public\ and C:\Users\Public\Documents\ for malware, and notes the second case created and ran a scanner file on the target through the exploit payload. TargetFileName is matched on the Public path with the writer limited to w3wp.exe.
// HUNT: Executable or DLL written to C:\Users\Public by an IIS worker process // MITRE: T1105, T1190, T1505.003 // CONF: high FP: low COST: low // REQUIRES: Falcon sensor on IIS servers (PeFileWritten, NewExecutableWritten) // FALSE POSITIVES: near none; IIS workers have no routine reason to drop PE files under the Public profile #event_simpleName=/^(PeFileWritten|NewExecutableWritten)$/ | ContextBaseFileName=/^w3wp\.exe$/i | TargetFileName=/\\Users\\Public\\/i | table([@timestamp, aid, ComputerName, ContextBaseFileName, TargetFileName, SHA256HashData, MD5HashData])
Looks for: Telerik exploitation delivers a DLL that the vulnerable handler loads (the ASEC article cites prior CVE-2019-18935 cases where a malicious DLL was executed on IIS). This hunt is the broad net for that stage. FP: ASP.NET compilation noise; apply the TUNING exclusion first.
// HUNT: Any PE file written by an IIS worker process (malicious DLL upload), compiler output excluded // MITRE: T1190, T1105, T1620 // CONF: medium FP: medium COST: medium // REQUIRES: Falcon sensor on IIS servers (PeFileWritten) // FALSE POSITIVES: ASP.NET dynamic compilation writes DLLs under Temporary ASP.NET Files; deployments and web-publish operations write assemblies into application bin folders // TUNING: exclude TargetFileName under Temporary ASP.NET Files and compiler-produced paths, and exclude your deployment windows and CI service accounts; investigate what remains (DLLs written to temp, Public, or application upload directories) #event_simpleName=/^PeFileWritten$/ | ContextBaseFileName=/^w3wp\.exe$/i | TargetFileName!=/Temporary ASP\.NET Files/i | table([@timestamp, aid, ComputerName, ContextBaseFileName, TargetFileName, SHA256HashData, MD5HashData])
Looks for: Staging location named in the ASEC mitigation checklist for both incident cases. Direct child of w3wp.exe or cmd.exe from this path raises confidence. FP: Installers; tune by publisher and parent.
// HUNT: Executable launched from C:\Users\Public or C:\Users\Public\Documents // MITRE: T1204.002, T1036.005 // CONF: medium FP: medium COST: low // REQUIRES: Falcon sensor on Windows servers (ProcessRollup2) // FALSE POSITIVES: some installers and legacy utilities unpack to the Public profile; Office or collaboration add-ins // TUNING: exclude signed, known-good publishers and your software-deployment tool by ParentBaseFileName; on IIS servers any hit is worth review, on workstations tune harder #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | ImageFileName=/\\Users\\Public\\(Documents\\)?[^\\]+\.exe$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Looks for: Covers the reverse shell (206.82.6.22:80), the staging/target-list hosts on ports 31337 and 31338, and the file URLs the scanner fetches from them. Perishable: re-validate before blocking.
// HUNT: Outbound connection to ASEC-documented C2 addresses // MITRE: T1071.001, T1095, T1105 // CONF: high FP: low COST: low // REQUIRES: Falcon sensor on all servers (NetworkConnectIP4) // FALSE POSITIVES: none expected; these addresses are named as attacker infrastructure in the ASEC report. Addresses can be recycled, so verify date and process before concluding compromise #event_simpleName=NetworkConnectIP4 | RemoteAddressIP4=/^(206\.82\.6\.22|65\.98\.5\.158|2\.59\.133\.147|45\.138\.16\.187)$/ | table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort, LocalAddressIP4])
Looks for: The ASEC reverse-shell payload opens a TCP socket from the worker process to a public IP on port 80 and then binds cmd.exe to it. Matching w3wp.exe egress to public IPs on the documented 31337/31338 ports or any non-RFC1918 address is the behavioral hook; the port 80 case relies on Q9 for the known address. FP: Legitimate outbound API calls from the app.
// HUNT: IIS worker process connecting outbound on raw high ports or the documented C2 ports // MITRE: T1095, T1571, T1059.003 // CONF: medium FP: medium COST: medium // REQUIRES: Falcon sensor on IIS servers (NetworkConnectIP4) // FALSE POSITIVES: web applications calling external APIs, payment gateways, license servers, or CDNs on non-standard ports // TUNING: exclude the RemoteAddressIP4 and RemotePort pairs of your approved outbound dependencies per application; the reverse shell runs in-process so w3wp.exe is the connecting image, not cmd.exe #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^w3wp\.exe$/i | !cidr(RemoteAddressIP4, subnet="10.0.0.0/8") | !cidr(RemoteAddressIP4, subnet="172.16.0.0/12") | !cidr(RemoteAddressIP4, subnet="192.168.0.0/16") | !cidr(RemoteAddressIP4, subnet="127.0.0.0/8") | RemotePort=/^(31337|31338|4444|1337|8080)$/ | table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort])
Looks for: The Rust-based scanner reports found WordPress setup URLs and the public IP to the Telegram API (api.telegram.org). The domain is shared legitimate infrastructure, so it is a behavioral hunt, not an import IOC. The bot token printed in the source report is a credential and is deliberately not shipped. FP: Telegram-based alerting.
// HUNT: Server-side process resolving api.telegram.org (scanner result exfiltration) // MITRE: T1567, T1041, T1102 // CONF: medium FP: medium COST: low // REQUIRES: Falcon sensor on servers (DnsRequest) // FALSE POSITIVES: server monitoring or alerting integrations that notify through Telegram bots; admin-installed Telegram clients // TUNING: exclude the ContextBaseFileName of approved alerting agents; on IIS servers, a w3wp.exe, cmd.exe, powershell.exe, or an unsigned binary under Users\Public resolving this name warrants review #event_simpleName=DnsRequest | DomainName=/^api\.telegram\.org$/i | ContextBaseFileName!=/^(telegram|chrome|msedge|firefox|brave)(\.exe)?$/i | table([@timestamp, aid, ComputerName, ContextBaseFileName, DomainName])
Looks for: The second ASEC case exploits CVE-2019-18935 and the payload contains only a command that runs the scanner, which pulls a target list (ins.txt) from a remote server. Matches C2 addresses, the staging file names (ins.txt, sm.json, bb.json, cofuz.json) and the WordPress probe paths on any command line.
// HUNT: Scanner or tool command line referencing the documented C2 hosts or target-list files // MITRE: T1105, T1595.002 // CONF: high FP: low COST: low // REQUIRES: Falcon sensor on Windows servers (ProcessRollup2) // FALSE POSITIVES: none expected; the strings are specific to the reported campaign infrastructure #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2)$/ | CommandLine=/(206\.82\.6\.22|65\.98\.5\.158|2\.59\.133\.147|45\.138\.16\.187|\bins\.txt|\bsm\.json|\bbb\.json|\bcofuz\.json|setup-config\.php|wp-admin.install\.php)/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData])
Looks for: Matches the five MD5 values listed in the ASEC IOC section across execution and file-write telemetry. Treat a hit as high confidence, then determine the family by pivoting on the hash.
// HUNT: File hash match: ASEC-published MD5 samples (process start or PE write) // MITRE: T1105, T1587 // CONF: high FP: low COST: low // REQUIRES: Falcon sensor on all hosts (ProcessRollup2, PeFileWritten, MD5HashData) // FALSE POSITIVES: none expected for these exact hashes; ASEC does not say which hash maps to which tool (SweetPotato variant, scanner, payload DLL) #event_simpleName=/^(ProcessRollup2|SyntheticProcessRollup2|PeFileWritten|NewExecutableWritten)$/ | MD5HashData=/^(0a4be0b6c650ffdcd1c22db56f1c4aec|10f705728d228ad949b7894c1a85a2b1|177e34d9174766a1d187a0c82de4c02f|18fb4e070653fc9791e0e408d8cb1c8e|1dbfda02d74b6a7586c4430175204c28)$/i | table([@timestamp, aid, ComputerName, #event_simpleName, FileName, TargetFileName, MD5HashData, SHA256HashData, CommandLine])
CrowdStrike Custom IOA Recommendations
All IOA candidates ship as Detect. No Prevent: the indicators rest on a single first-party report and several patterns (shell under w3wp.exe) have legitimate application causes.
| IOA | Pattern | Exclusions | Deployment |
|---|---|---|---|
| IOA-1 IIS worker shell | Image cmd.exe or powershell.exe, parent w3wp.exe (Q1) | Documented app shell-outs by command line | Detect, IIS host group only |
| IOA-2 IIS worker SYSTEM child | Parent w3wp.exe and user SYSTEM (Q4) | Hosts with LocalSystem app pools | Detect, IIS host group |
| IOA-3 Potato tooling | Image or command line matches Potato-family names (Q5) | Authorized pentest hosts | Detect, all servers |
| IOA-4 IIS PE drop to Public | File write of PE by w3wp.exe under Users\Public (Q6) | None expected | Detect, IIS host group |
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags md5,0a4be0b6c650ffdcd1c22db56f1c4aec,detect,high,2027-04-05,Telerik CVE-2019-18935 campaign sample (ASEC),campaign:Telerik-CVE-2019-18935 md5,10f705728d228ad949b7894c1a85a2b1,detect,high,2027-04-05,Telerik CVE-2019-18935 campaign sample (ASEC),campaign:Telerik-CVE-2019-18935 md5,177e34d9174766a1d187a0c82de4c02f,detect,high,2027-04-05,Telerik CVE-2019-18935 campaign sample (ASEC),campaign:Telerik-CVE-2019-18935 md5,18fb4e070653fc9791e0e408d8cb1c8e,detect,high,2027-04-05,Telerik CVE-2019-18935 campaign sample (ASEC),campaign:Telerik-CVE-2019-18935 md5,1dbfda02d74b6a7586c4430175204c28,detect,high,2027-04-05,Telerik CVE-2019-18935 campaign sample (ASEC),campaign:Telerik-CVE-2019-18935 ipv4,206.82.6.22,detect,high,2027-04-05,Reverse-shell C2 port 80,campaign:Telerik-CVE-2019-18935 ipv4,65.98.5.158,detect,high,2027-04-05,Scanner target-list host port 31337,campaign:Telerik-CVE-2019-18935 ipv4,2.59.133.147,detect,high,2027-04-05,Staging host ports 31338,campaign:Telerik-CVE-2019-18935 ipv4,45.138.16.187,detect,high,2027-04-05,Staging host port 31337,campaign:Telerik-CVE-2019-18935 url,http://2.59.133.147:31338/ins.txt,detect,high,2027-04-05,ASEC-listed C2 or staging URL,campaign:Telerik-CVE-2019-18935 url,http://2.59.133.147:31338/sm.json,detect,high,2027-04-05,ASEC-listed C2 or staging URL,campaign:Telerik-CVE-2019-18935 url,http://206.82.6.22/,detect,high,2027-04-05,ASEC-listed C2 or staging URL,campaign:Telerik-CVE-2019-18935 url,http://45.138.16.187:31337/bb.json,detect,high,2027-04-05,ASEC-listed C2 or staging URL,campaign:Telerik-CVE-2019-18935 url,http://45.138.16.187:31337/cofuz.json,detect,high,2027-04-05,ASEC-listed C2 or staging URL,campaign:Telerik-CVE-2019-18935
w3wp.exe parent of cmd.exe / powershell.exe / pwsh.exe w3wp.exe parent of hostname, whoami, tasklist, systeminfo (via cmd.exe) w3wp.exe parent of any process running as SYSTEM (S-1-5-18) PE file (EXE/DLL) written by w3wp.exe, esp. under C:\Users\Public\ or C:\Users\Public\Documents\ w3wp.exe outbound to public IPs on ports 80 (raw IP), 31337, 31338 Server process resolving api.telegram.org (scanner results, attachment red.txt) Command line with ins.txt / sm.json / bb.json / cofuz.json Probe paths: /wp-admin/setup-config.php, /wp-admin/install.php (53 candidate base paths per ASEC Table 1)
Telerik UI for ASP.NET AJAX RadAsyncUpload (CVE-2019-18935), fix: 2020.1.114 or later per ASEC SweetPotato (modified for web-shell environment), PrintSpoofer-style token spoofing, other Potato-family tools godmemshell.dll (Godzilla-style in-memory .NET web shell; VirtualPathProvider handler) Rust-based WordPress setup-page scanner (reports via Telegram API as red.txt)
# Telerik assembly versions on an IIS host (read-only inventory)
Get-ChildItem -Path C:\inetpub, D:\ -Recurse -Filter Telerik.Web.UI.dll -ErrorAction SilentlyContinue |
Select-Object FullName, @{n='FileVersion';e={$_.VersionInfo.FileVersion}}
# Staging-path review named by ASEC
Get-ChildItem C:\Users\Public, C:\Users\Public\Documents -Force -ErrorAction SilentlyContinue |
Where-Object { $_.Extension -match '\.(exe|dll|ps1|bat)$' } | Select-Object FullName, Length, LastWriteTime
# Print Spooler state (PrintSpoofer-style abuse needs it)
Get-Service Spooler | Select-Object Status, StartType
# Application pool identities
Import-Module WebAdministration; Get-ChildItem IIS:\AppPools | Select-Object Name, @{n='Identity';e={$_.processModel.identityType}}
Not imported: api.telegram.org (shared legitimate service; hunted by behavior in Q11) and the Telegram bot token printed in the ASEC report (an attacker credential, not an indicator, never shipped). Hash-to-tool mapping is not given by ASEC, so no hash is labelled as SweetPotato or the scanner.
Detection Validation Gates
| Gate | Check |
|---|---|
| Telemetry ready | IIS servers report ProcessRollup2, NetworkConnectIP4, PeFileWritten and DnsRequest; command-line capture on |
| Benign baseline | Run Q1, Q4, Q7, Q10 for 14 days on IIS hosts; record legitimate shell-outs, SYSTEM app pools, and outbound API ports; build TUNING exclusions |
| Positive tests | In a lab IIS host, launch cmd.exe from a test ASP.NET page and confirm Q1 fires; run a renamed copy of a benign binary from C:\Users\Public and confirm Q8 |
| Promotion | IOA-1 to IOA-4 stay Detect until two weeks of clean baseline; never Prevent from this pack alone |
Hardening — Tiered
- Patch Telerik UI for ASP.NET AJAX to 2020.1.114 or later per ASEC; prefer the current release (2026.2.708 or later also addresses the separate 2026 chain described by THN and Cybersecurity News). MITRE M1051 Update Software; vendor advisory. Verify: playbook step 1.
- Block outbound traffic from IIS servers by default; allow only required destinations. M1037 Filter Network Traffic; CIS Controls v8 13.4/12.x best practice. Verify: attempt an outbound connection to a test host from the IIS server.
- Enable the Defender ASR rule "Block Webshell creation for Servers" in audit, then block (where Defender is the AV). M1040 Behavior Prevention on Endpoint; Microsoft attack surface reduction documentation. Verify: Get-MpPreference.
- Disable Print Spooler on IIS servers that do not print; PrintSpoofer-style token abuse depends on it (ASEC cites PrintSpoofer). M1042 Disable or Remove Feature; CIS Windows Server Benchmark (Print Spooler: Disabled). Verify: Get-Service Spooler.
- Run app pools under ApplicationPoolIdentity or a dedicated low-privilege account, never LocalSystem; remove write access to web roots and C:\Users\Public. M1026 Privileged Account Management; Microsoft IIS hardening guidance. Verify: app-pool audit one-liner.
- Restrict the RadAsyncUpload handler by WAF or request-filtering rules where the control is not needed (best practice, no formal benchmark).
- Component inventory and SCA so end-of-life UI libraries are found before attackers find them. M1051; NIST SP 800-53 SI-2 / CM-8.
- Segment DMZ web servers from internal networks and place a WAF in front. M1030 Network Segmentation.
- Application allowlisting (WDAC/AppLocker) on web servers to stop unsigned binaries launching from C:\Users\Public. M1038 Execution Prevention; CIS Benchmark.
Deployable Playbooks
Every step lists prerequisites, reboot requirement and rollback. Pilot on one host first. Step 1 is the patch inventory; the upgrade itself follows the vendor instructions for each application.
STEP 1: Inventory Telerik versions
Prerequisites: local admin on the IIS host; read-only.
Reboot required: No
Rollback: none required (read-only)
Get-ChildItem -Path C:\inetpub -Recurse -Filter Telerik.Web.UI.dll -ErrorAction SilentlyContinue |
Select-Object FullName, @{n='FileVersion';e={$_.VersionInfo.FileVersion}}
STEP 2: Disable Print Spooler on servers that do not print
Prerequisites: confirm the server hosts no print queues (Get-Printer) and no app depends on printing.
Reboot required: No
Rollback: Set-Service Spooler -StartupType Automatic; Start-Service Spooler
Stop-Service Spooler -Force
Set-Service Spooler -StartupType Disabled
STEP 3: Enable ASR rule "Block Webshell creation for Servers" in audit mode first
Prerequisites: Microsoft Defender Antivirus active (not passive); run in audit for 14 days.
Reboot required: No
Rollback: Remove-MpPreference -AttackSurfaceReductionRules_Ids a8f5898e-1dc8-49a9-9878-85004b8a61e6
Add-MpPreference -AttackSurfaceReductionRules_Ids a8f5898e-1dc8-49a9-9878-85004b8a61e6 -AttackSurfaceReductionRules_Actions AuditMode
# after review: ... -AttackSurfaceReductionRules_Actions Enabled
STEP 4: Default-deny outbound for the IIS worker (Windows Firewall, program-scoped)
Prerequisites: list the required outbound destinations first (DB, auth, payment APIs); stage on one host.
Reboot required: No
Rollback: Remove-NetFirewallRule -DisplayName "HP-Block-w3wp-Outbound"
New-NetFirewallRule -DisplayName "HP-Block-w3wp-Outbound" -Direction Outbound -Action Block -Program "%SystemRoot%\System32\inetsrv\w3wp.exe" -Profile Any
# then add higher-priority Allow rules for approved destinations before enabling in production
STEP 5: Confirm app pool identity (no LocalSystem)
Prerequisites: WebAdministration module.
Reboot required: No
Rollback: Set-ItemProperty IIS:\AppPools\<PoolName> -Name processModel.identityType -Value <PreviousValue> (record the prior value first)
Import-Module WebAdministration
Get-ChildItem IIS:\AppPools | Select-Object Name, @{n='Identity';e={$_.processModel.identityType}}
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| 1 Isolate | Network-isolate the IIS host via Falcon containment (keep sensor connected); block the ASEC C2 IPs at the perimeter; preserve a memory image before any restart because the web shell is memory-resident | IR lead | Containment timestamp; memory image hash |
| 2 Scope | Run Q1 to Q13 across the estate; pull IIS logs for the Telerik handler; review SYSTEM-owned children of w3wp.exe; list files under C:\Users\Public | Hunt team | Query exports; process trees |
| 3 Eradicate | Restart the app pool and IIS worker to clear the in-memory shell only after imaging; remove staged files; patch Telerik; rotate any secrets readable by the app pool (connection strings, machine keys) and service account credentials | Server owner | Patch version proof; rotation tickets |
| 4 Recover | Rebuild the host from a known-good image if SYSTEM was reached (Q4 hit); restore content from clean source; re-enable with default-deny egress | Platform team | Rebuild record |
| 5 Lessons | Add the component to inventory/SCA; tune IOA-1 to IOA-4; document baseline exclusions | Detection engineering | Updated TUNING lines |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1190 | Telerik RadAsyncUpload exploitation | Q1, Q7 | IOA-1 | Partial (request itself only in IIS logs) |
| T1059.003 / T1059.001 | Shell under w3wp.exe | Q1, Q3 | IOA-1 | Good |
| T1033 / T1057 / T1082 | Recon tools | Q2, Q3 | - | Good |
| T1134.001 / T1068 | Potato-family, SYSTEM child | Q4, Q5 | IOA-2, IOA-3 | Good |
| T1105 | Tool drop to Public; hash and C2 matches | Q6, Q7, Q8, Q13 | IOA-4 | Good |
| T1095 / T1071 | Reverse shell and C2 | Q9, Q10 | - | Partial (port 80 reverse shell to unknown IP blends with web egress) |
| T1567 / T1102 | Telegram exfil | Q11 | - | Partial |
| T1595.002 | Outbound WordPress scanning | Q12 | - | Partial (probe traffic leaves the host; command line only) |
| T1505.003 / T1620 | godmemshell.dll in-memory Godzilla shell | none | - | GAP (no file, no new process; only IIS logs, memory forensics, and the child-process symptoms in Q1/Q4) |
Validation gates (Sec. 11) apply: baseline 14 days on IIS hosts before promoting any IOA. The honest gap is the in-memory web shell itself; this pack detects what the shell and exploit do next, not the shell code.
Hunt Summary Ticket
TITLE: Telerik CVE-2019-18935 exploitation on IIS: reverse shell, Potato escalation, Godzilla in-memory web shell
SEVERITY: High (exploited in the wild per ASEC, 2026-09-28; no actor attribution)
SCOPE: Windows IIS servers running Telerik UI for ASP.NET AJAX; reachable internal hosts.
HYPOTHESIS: An unpatched Telerik RadAsyncUpload handler lets an unauthenticated actor run code
as w3wp.exe, open a reverse shell, escalate to SYSTEM with Potato-family tooling,
and keep access through an in-memory Godzilla-style web shell, or simply launch a
scanner that reports WordPress setup pages to Telegram.
QUERIES: 13 CQL hunt queries (Q1-Q13); 4 Custom IOA candidates, all Detect.
DO FIRST: Inventory Telerik.Web.UI.dll versions on IIS hosts; run Q1, Q4, Q6, Q9 on IIS servers.
FINDINGS: Pending tenant run. Proactive hunt, not a confirmed-incident report.
GAPS: godmemshell.dll runs in memory: no file or process telemetry. Rely on IIS logs, memory
forensics, and downstream child-process and egress detections.
ACTIONS: Patch Telerik (2020.1.114 or later; prefer current); default-deny IIS egress; disable
Print Spooler where unused; ASR web-shell rule; image memory before restarting IIS.
OWNER: HuntPack
VERSION: v0.1 (Draft) - 2026-10-05
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| 1 | AhnLab ASEC: Vulnerability Attack Case: Installation of a Web Shell and Execution of a Scanner by Exploiting a Telerik UI Vulnerability | Primary attack chain, IOCs, mitigations | 2026-10-05 |
| 3 | hendryadrian.com republication of the ASEC report | Wording corroboration only (same origin) | 2026-10-05 |
| 2 | The Hacker News: Telerik UI padding-oracle bug chained to unauthenticated RCE | Context: separate 2026 CVE chain, fix 2026.2.708, CVE-2019-18935 history | 2026-10-05 |
| 2 | Cybersecurity News: Telerik flaw chain | Context: affected range and fixed version of the separate 2026 chain | 2026-10-05 |