This hunt targets the presence of VShell, a lightweight web shell used by adversaries to maintain persistent access and execute commands on compromised hosts. Proactively hunting for these IOCs in Azure Sentinel is critical to identify stealthy backdoors that may have been established to bypass standard monitoring and enable lateral movement or data exfiltration.
Malware Family: VShell Total IOCs: 29 IOC Types: ip:port
| Type | Value | Threat Type | First Seen | Confidence |
|---|---|---|---|---|
| ip:port | 154[.]91[.]63[.]126:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]125:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]120:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]105:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]121:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]106:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]112:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]104:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]118:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]114:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]117:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]63[.]103:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]62[.]116:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]62[.]98:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]62[.]125:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]62[.]118:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]62[.]117:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]62[.]119:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]62[.]124:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]62[.]121:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 139[.]196[.]238[.]43:8090 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]62[.]106:8084 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 64[.]176[.]229[.]71:8443 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 49[.]233[.]70[.]168:1883 | botnet_cc | 2026-09-04 | 100% |
| ip:port | 154[.]91[.]59[.]99:8084 | botnet_cc | 2026-09-04 | 100% |
// Hunt for network connections to known malicious IPs
// Source: ThreatFox - VShell
let malicious_ips = dynamic(["116.205.137.86", "154.91.63.104", "154.91.62.121", "139.196.238.43", "154.91.59.99", "154.91.63.112", "154.91.62.116", "154.91.62.98", "154.91.63.118", "154.91.63.125", "154.91.63.114", "49.233.70.168", "154.91.63.103", "154.91.63.106", "154.91.63.126", "154.91.63.105", "154.91.63.120", "154.91.62.124", "192.255.128.122", "154.91.63.117", "154.91.62.119", "154.91.63.121", "154.91.62.117", "154.91.62.118", "154.91.62.125", "64.176.229.71", "154.91.56.121", "154.91.62.106"]);
CommonSecurityLog
| where DestinationIP in (malicious_ips) or SourceIP in (malicious_ips)
| project TimeGenerated, SourceIP, DestinationIP, DestinationPort, DeviceAction, Activity
| order by TimeGenerated desc
// Hunt in Defender for Endpoint network events
let malicious_ips = dynamic(["116.205.137.86", "154.91.63.104", "154.91.62.121", "139.196.238.43", "154.91.59.99", "154.91.63.112", "154.91.62.116", "154.91.62.98", "154.91.63.118", "154.91.63.125", "154.91.63.114", "49.233.70.168", "154.91.63.103", "154.91.63.106", "154.91.63.126", "154.91.63.105", "154.91.63.120", "154.91.62.124", "192.255.128.122", "154.91.63.117", "154.91.62.119", "154.91.63.121", "154.91.62.117", "154.91.62.118", "154.91.62.125", "64.176.229.71", "154.91.56.121", "154.91.62.106"]);
DeviceNetworkEvents
| where RemoteIP in (malicious_ips)
| project Timestamp, DeviceName, RemoteIP, RemotePort, InitiatingProcessFileName, ActionType
| order by Timestamp desc
| Sentinel Table | Notes |
|---|---|
CommonSecurityLog | Ensure this data connector is enabled |
DeviceNetworkEvents | Ensure this data connector is enabled |
Scenario: A DevOps engineer uses a standard curl or wget command to download a specific version of the VShell binary (e.g., vshell_1.2.0_linux_amd64) from a trusted internal artifact repository or GitHub release for testing purposes.
10.0.0.0/8) and the user agent string contains curl or Wget. Additionally, exclude if the destination path matches known artifact directories like /opt/artifacts/ or /tmp/downloads/.Scenario: An application team deploys a microservice that bundles the VShell client library for inter-service communication, resulting in the VShell binary being present in the container image or deployed to the host filesystem during a CI/CD pipeline execution.
jenkins, gitlab-runner, azure-pipelines-agent) or where the parent process is a container runtime like docker or containerd. Also, exclude if the file path resides within a container-specific mount point (e.g., /var/lib/docker/overlay2/).Scenario: A security engineer runs a YARA scan or memory dump analysis using a tool that references VShell IOCs as part of a broader threat hunting exercise, causing the VShell string or hash to appear in the process command line or loaded libraries.
yara, volatility, memdump, rclone) or where the user account belongs to the security-team or threat-hunters group.Scenario: A legacy application