T1102.003

One-Way Communication

Adversaries may use an existing, legitimate external Web service as a means for sending commands to a compromised system without receiving return output over the Web service channel. Compromised systems may leverage popular websites and social media (GitHub, Twitter/X, Telegram, GitLab, TechNet) to host command and control (C2) instructions. Those infected systems may send output back over a different C2 channel or return no output at all. Using common services makes it easier for adversaries to hide in expected noise, and SSL/TLS encryption from Web service providers adds an additional layer of protection.

Microsoft Sentinel / Defender
kusto
let LegitWebServices = dynamic([
  "api.twitter.com", "twitter.com", "x.com", "api.x.com",
  "github.com", "raw.githubusercontent.com", "gist.github.com",
  "gitlab.com", "api.telegram.org", "t.me",
  "pastebin.com", "paste.ee", "hastebin.com",
  "technet.microsoft.com", "social.technet.microsoft.com",
  "docs.google.com", "drive.google.com", "googleapis.com",
  "onedrive.live.com", "sharepoint.com",
  "discord.com", "discordapp.com",
  "reddit.com", "redd.it",
  "notion.so", "trello.com",
  "digitalpoint.com"
]);
let SuspiciousProcesses = dynamic([
  "powershell.exe", "pwsh.exe", "cmd.exe", "wscript.exe", "cscript.exe",
  "mshta.exe", "rundll32.exe", "regsvr32.exe", "certutil.exe",
  "curl.exe", "wget.exe", "bitsadmin.exe", "msiexec.exe",
  "python.exe", "python3.exe", "ruby.exe", "node.exe",
  "wmic.exe", "msbuild.exe"
]);
DeviceNetworkEvents
| where Timestamp > ago(24h)
| where RemoteUrl has_any (LegitWebServices)
| where InitiatingProcessFileName has_any (SuspiciousProcesses)
| extend IsEncodedCmd = InitiatingProcessCommandLine has_any ("-EncodedCommand", "-enc ", "FromBase64String", "base64")
| extend IsScheduledOrService = InitiatingProcessParentFileName in~ ("svchost.exe", "taskeng.exe", "taskhostw.exe", "services.exe", "WmiPrvSE.exe")
| extend IsScriptingHost = InitiatingProcessFileName in~ ("wscript.exe", "cscript.exe", "mshta.exe")
| extend SuspiciousParent = InitiatingProcessParentFileName in~ ("winword.exe", "excel.exe", "powerpnt.exe", "outlook.exe", "onenote.exe", "msaccess.exe", "acrord32.exe", "acrobat.exe")
| extend NetworkRequestCount = 1
| project Timestamp, DeviceName, AccountName,
         InitiatingProcessFileName, InitiatingProcessCommandLine,
         InitiatingProcessParentFileName, InitiatingProcessParentCommandLine,
         RemoteUrl, RemoteIP, RemotePort, RemoteIPType,
         IsEncodedCmd, IsScheduledOrService, IsScriptingHost, SuspiciousParent
| sort by Timestamp desc
medium severity medium confidence

Data Sources

Network Traffic: Network Connection Creation Process: Process Creation Microsoft Defender for Endpoint

Required Tables

DeviceNetworkEvents

False Positives

  • Developers and DevOps engineers using git clients, GitHub CLI, or GitLab runners on workstations that legitimately connect to GitHub or GitLab
  • IT automation tools (Ansible, Puppet, Chef) polling GitHub for configuration or playbook updates
  • Software update mechanisms that fetch release notes, changelogs, or update manifests from GitHub or Google APIs
  • Security tools and EDR agents that check reputation feeds or pull threat intel from public repositories
  • Collaboration tools installed as services that connect to Discord, Telegram, or Slack APIs for notifications

Unlock Pro Content

Get the full detection package for T1102.003 including response playbook, investigation guide, and atomic red team tests.

Response PlaybookInvestigation GuideHunting QueriesAtomic Red Team TestsTuning Guidance

Related Detections