Share via


Azure Firewall용 Microsoft Sentinel을 사용하여 맬웨어 탐지

맬웨어는 컴퓨터 시스템, 네트워크 또는 디바이스의 보안 및 기능을 손상, 중단 또는 훼손시키도록 설계된 소프트웨어입니다. 여기에는 바이러스, 웜, 트로이 목마, 랜섬웨어, 스파이웨어, 애드웨어, 루트킷 등과 같은 다양한 유형의 위협이 포함됩니다. 맬웨어는 중요한 데이터 도용, 파일 암호화 또는 삭제, 원치 않는 광고 표시, 성능 저하, 디바이스 무단 제어와 같은 다양한 부정적인 영향을 미칠 수 있습니다.

시스템 또는 네트워크에서 맬웨어를 식별하고 제거하는 것이 중요하며, 이는 서명 기반, 동작 기반, 추론 기반 또는 기계 학습 기반 기술과 같은 다양한 탐지 기술을 사용하여 수행할 수 있습니다. 맬웨어 탐지는 사용자의 보안 및 프라이버시 보호뿐만 아니라 시스템 및 네트워크의 무결성과 가용성을 보호하는 데 중요합니다.

Azure Firewall IDPS 기능은 기본적으로 맬웨어를 자동으로 탐지 및 거부하고 클라우드 워크로드가 감염되지 않도록 방지할 수 있습니다. 미리 빌드된 탐지 쿼리와 Microsoft Sentinel을 사용하여 자동화된 탐지 및 대응하면 이 기능을 더욱 향상시킬 수 있습니다. 이 문서에서는 미리 정의된 Azure Firewall용 KQL 탐지 쿼리를 사용하여 Coinminer, Cl0p, Sunburst 같은 Azure Firewall 로그에 있는 몇 가지 일반적인 맬웨어를 탐지하는 방법을 살펴봅니다.

이러한 탐지를 통해 보안 팀은 내부 네트워크의 컴퓨터가 탐지 규칙 쿼리에 정의된 알려진 IOC(손상 지표)에 링크된 인터넷의 도메인 이름 또는 IP 주소에 대한 연결을 요청할 때 Sentinel 경고를 받을 수 있습니다. 진양성 탐지는 IOC(손상 지표)로 간주되어야 합니다. 그런 다음 보안 인시던트 대응 팀이 대응을 시작하고 이러한 탐지 신호에 따라 적절한 사용자 지정 수정 작업을 구현할 수 있습니다.

다음 쿼리를 사용하여 분석 규칙을 배포하는 지침은 Azure Web Application Firewall과 함께 Microsoft Sentinel을 사용하여 새 위협 탐지를 참조하세요.

일반적인 맬웨어 익스플로잇

다음 맬웨어 익스플로잇은 오늘날의 네트워크에서 일반적입니다.

Coinminer

최근 암호화 마이닝의 급증으로 인해 고성능 네트워크 처리 장치의 필요성이 증가하고 있습니다. 합법적이든 불법적이든 분산 컴퓨팅이 확장되고 마이닝 소프트웨어의 가용성이 확산되고 있습니다.

Coinminer는 암호화 마이닝에 피해자의 컴퓨터 하드웨어 리소스를 몰래 사용하는 맬웨어 유형을 나타냅니다. 의심하지 않는 사용자의 PC에 내장된 GPU(그래픽 처리 장치)가 암호화 마이닝 및 트랜잭션 블록 해시 계산을 위한 다양한 스크립트를 실행하는 데 사용됩니다.

이러한 위협의 위험을 완화하려면 일반적인 진입점에서 사전 조치를 구현해야 합니다. 여기에는 적절한 인증, 웹 애플리케이션 구성 및 업데이트로 Jupyter 소프트웨어를 배포하여 취약성을 최소화하고, Docker에 대한 외부 액세스를 제어하고, 추가 제로 트러스트 원칙을 따르는 것이 포함됩니다.

다음 탐지 쿼리를 사용하면 Sentinel에서 Azure Firewall 로그를 사용하여 이 맬웨어를 자동으로 탐지하고 대응하는 분석 규칙을 만들 수 있습니다.

// Coinminer Detection Rule
// Detects suspicious traffic patterns associated with coinmining activity in Azure Firewall logs for Sentinel

let coinminerPorts = dynamic(["2375", "2376", "2377", "4243", "4244"]); // List of known coinminer ports  
//Assign the known domains to a variable
let coinminerdomains = dynamic(["teamtnt.red", "kaiserfranz.cc", "45.9.148.123"]); // List of known coinminer domains  

(union isfuzzy=true 

(AzureDiagnostics  
| where ResourceType == "AZUREFIREWALLS"  
| where Category == "AzureFirewallApplicationRule" 
| parse msg_s with Protocol 'request from ' SourceHost ':' SourcePort 'to ' DestinationHost ':' DestinationPort '. Action:' Action 
| extend action_s = column_ifexists("action_s", ""), transactionId_g = column_ifexists("transactionId_g", "")  
| where DestinationPort in (coinminerPorts) // Filter traffic on known coinminer ports  
| summarize CoinminerAttempts = count() by DestinationHost, DestinationPort  
| where CoinminerAttempts > 10 // Adjust threshold as needed  
), 

(AZFWIdpsSignature 
| where DestinationPort in (coinminerPorts) 
| summarize CoinminerAttempts = count() by DestinationIp, DestinationPort 
| where CoinminerAttempts > 10 // Adjust threshold as needed   

), 

(AzureDiagnostics  
| where ResourceType == "AZUREFIREWALLS"  
| where Category == "AzureFirewallDnsProxy"  
| parse msg_s with "DNS Request: " ClientIP ":" ClientPort " - " QueryID " " Request_Type " " Request_Class " " Request_Name ". " Request_Protocol " " Request_Size " " EDNSO_DO " " EDNS0_Buffersize " " Response_Code " " Response_Flags " " Response_Size " " Response_Duration  
| where Request_Name has_any(coinminerdomains)  
| extend DNSName = Request_Name  
| extend IPCustomEntity = ClientIP  

),  

(AzureDiagnostics  
| where ResourceType == "AZUREFIREWALLS"  
| where Category == "AzureFirewallApplicationRule"  
| parse msg_s with Protocol ' request from ' SourceHost ':' SourcePort 'to' DestinationHost ':' DestinationPort '. Action:' Action  
| where isnotempty(DestinationHost)  
| where DestinationHost has_any(coinminerdomains)  
| extend DNSName = DestinationHost  
| extend IPCustomEntity = SourceHost), 

(AZFWApplicationRule 
| where isnotempty(Fqdn) 
| where Fqdn has_any (coinminerdomains)   
| extend DNSName = Fqdn  
| extend IPCustomEntity = SourceIp), 

(AZFWDnsQuery 
| where isnotempty(QueryName) 
| where QueryName has_any (coinminerdomains) 
| extend DNSName = QueryName 
| extend IPCustomEntity = SourceIp 

), 

(AZFWIdpsSignature 
| where DestinationIp has_any (coinminerdomains) 
| extend DNSName = DestinationIp 
| extend IPCustomEntity = SourceIp 

), 

(AZFWIdpsSignature 
| where Description contains "coinminer" 
| extend DNSName = DestinationIp 
| extend IPCustomEntity = SourceIp 
) 

)

Cl0p

Cl0p는 피해자의 파일에 고유한 암호화 키를 적용한 다음 파일의 암호 해독에 대한 대가를 요청하는 랜섬웨어입니다. 데이터 전송 소프트웨어 MOVEit의 취약성을 악용하고 cl0p를 전달할 목적으로 수많은 직원에게 스피어 피싱 이메일을 보냅니다. 그런 다음 truebotdewmode 같은 도구를 사용하여 네트워크 내에서 횡적으로 이동하고 데이터를 유출합니다. 이 랜섬웨어는 AES-256 암호화 알고리즘을 사용하여 파일을 암호화합니다.

Cl0p 취약성에는 CVE-2023-35036, CVE-2023-34362, CVE-2023-35708이 포함됩니다. 2023년 6월, FBI 및 CISA는 이 익스플로잇에 대한 보도 자료를 발표했습니다. cl0p 랜섬웨어의 효과는 미국 중서부의 여러 대학 및 정부 기관에서 나타났습니다. 항공사, TV 방송국, 영국 기반 소매점이 cl0p 랜섬웨어 갱단의 최신 희생자입니다.

다음 탐지 쿼리를 사용하면 Sentinel에서 Azure Firewall 로그를 사용하여 이 맬웨어를 자동으로 탐지하고 대응하는 분석 규칙을 만들 수 있습니다.

Cl0p용 탐지 쿼리: Firewall Malware Detections for Sentinel/Detection - Analytic rule query for Cl0p.json

Sunburst

이 맬웨어는 DGA(도메인 생성 알고리즘) 문자열을 사용하여 탐지를 회피하고 명령 및 제어 백도어 공격을 설정하여 피해자를 표적으로 삼습니다. DGA 문자열은 구문에 사용되는 패턴이 복잡하고 도메인 정보가 지속적으로 변경되어 보안 도구가 맬웨어에서 사용되는 도메인을 식별하기 어려운 경우가 많습니다.

다음 탐지 쿼리를 사용하면 Sentinel에서 Azure Firewall 로그를 사용하여 이 맬웨어를 자동으로 탐지하고 대응하는 분석 규칙을 만들 수 있습니다.

Sunburst 맬웨어용 탐지 쿼리: Firewall Malware Detections for Sentinel/Detection - Analytic rule query for Sunburst.json