반응형

이번에는 MEC Increasing mail flow security posture 섹션에 대한 Self-Study 포스팅입니다.

내용이 너무 길기 때문에  파트를 2개로 나눠서 진행 하겠습니다.

Deep Dive: Increasing Mail Flow Security Posture

[Bypassing 3rd-party antispam]

Exchange Online 사용하는 구조에서 가장 많이 사용하는 메일 수신 흐름은 아래와 같이 EOP 앞단에 3rd Party 사용하는 구조입니다. MX 레코드를 3rd Party Antispam 으로 구성한 , Relay 형태로 EOP 전달합니다. MEC 세션에서는 이러한 구조가 악의적인 공격자의 타겟이 된다고 설명하고 있습니다.

 

 

기본적으로 여기서 일어난 일은 발신자에게 기대해야 하는 것은 EOP에 메시지를 보내고 그 다음 메시지와 MX 레코드를 보내는 것이기 때문입니다.

 

강의에서는 기업들이 일반적으로 구성하는 환경들에 취약점이 있다고 지적하고 있습니다.

만약 Custom Domain contoso.com 경우 EOP 주소는 contoso-com.mail.protection.outlook.com 으로 지정되는데, Bad Actor 들이 해당 주소로 직접 공격할 있다고 언급합니다.

물론 EOP 주소로 직접 메일을 발송한다고 해서, EOP 검사를 하는 것은 아닙니다.

모든 메일이 스팸장비를 거친다고 생각한다면, 여러가지 시나리오에서 보안홀이 발생할 있습니다.

 

[EOP Lockdown]

여기서 예상되는 경로 이외의 나머지 경로를 차단하는 것을 Lockdown 이라고 표현하였습니다.

Lab 구성을 위해서 Inbound Partner Connector 생성에 대해서 안내하고 있습니다.

 

예시에서는 인증서, IP 기반을 나눠서 명령어로 설명하고 있습니다.

인증서 기반의 장점은 IP 한정하지 않고 일치하는 인증서에 대해서는 수신하도록 하는 커넥터입니다. 릴레이 범위가 매우 넓고 일일이 IP 추가하는 번거로움을 있습니다.

IP 기반의 장점은 인증서를 지원하지 않는 시스템(TLS 지원하지 않는 시스템)이나 스팸장비처럼 IP 변동이 없을 경우 적절합니다.

New-InboundConnector -Name "From 3rd-party AS" -ConnectorType Partner -RestrictDomainsToIPAddresses $true -SenderIPAddresses "218.50.XX.XX" -SenderDomains "*"

기술자료: New-InboundConnector (ExchangePowerShell) | Microsoft Learn

 

이미 테스트 환경은 Hybrid 구성이 되어 있으므로 아래와 같이 Inbound Connector 2개인 것을 확인할 있습니다.

커넥터의 전체 속성에도 차이가 있습니다.

<Hybrid Connector>

<Partner Connector>

 

<ConnectorType>

The ConnectorType parameter specifies the category for the source domains that the connector accepts messages for. Valid values are:
  • Partner: External partners or services.
  • OnPremises: Your on-premises email organization. Use this value for accepted domains in your cloud-based organization that are also specified by the SenderDomains parameter.

EAC 페이지에서 커넥터 생성시 아래와 같은 차이가 있습니다.

<Partner>

 

<Onpremises> -> All Accepted domains 대한 옵션의 사용 여부가 중요한 것으로 보입니다.

 

커넥터를 생성할 , Partner 달리 Onpremises TlsCertificateName 이나 SenderIPAddresses 값을 지정해 줘야 합니다. 이외의 차이점은 아직 발견하지 못했습니다.

<ConnectorSource>

The ConnectorSource parameter specifies how the connector is created. Valid input for this parameter includes the following values:

  • Default: The connector is manually created. This is the default value.
  • HybridWizard: The connector is automatically created by the Hybrid Configuration Wizard.
  • Migrated: The connector was originally created in Microsoft Forefront Online Protection for Exchange.

ConnectorSource 어떻게 만들어 졌느냐의 기록적인 의미로 보입니다. 물론 Header 상의 차이는 있겠지만, 기능적인 차이는 없는 것으로 보여집니다. Default EXO에서 직접생성시, HybridWizard 온프레미스에서 마법사를 통해서 생성시 지정되는 값입니다.

 

<CloudServicesMailEnabled>

Note: We recommend that you don't use this parameter unless you are directed to do so by Microsoft Customer Service and Support, or by specific product documentation. Instead, use the Hybrid Configuration wizard to configure mail flow between your on-premises and cloud organizations. For more information, see Hybrid Configuration wizard.


The CloudServicesMailEnabled parameter specifies whether the connector is used for hybrid mail flow between an on-premises Exchange environment and Microsoft 365. Specifically, this parameter controls how certain internal X-MS-Exchange-Organization-* message headers are handled in messages that are sent between accepted domains in the on-premises and cloud organizations. These headers are collectively known as cross-premises headers.


Valid values are:
  • $true: The connector is used for mail flow in hybrid organizations, so cross-premises headers are preserved or promoted in messages that flow through the connector. This is the default value for connectors that are created by the Hybrid Configuration wizard. Certain X-MS-Exchange-Organization-* headers in outbound messages that are sent from one side of the hybrid organization to the other are converted to X-MS-Exchange-CrossPremises-* headers and are thereby preserved in messages. X-MS-Exchange-CrossPremises-* headers in inbound messages that are received on one side of the hybrid organization from the other are promoted to X-MS-Exchange-Organization-* headers. These promoted headers replace any instances of the same X-MS-Exchange-Organization-* headers that already exist in messages.
  • $false: The connector isn't used for mail flow in hybrid organizations, so any cross-premises headers are removed from messages that flow through the connector.

CloudServicesMailEnabled Hybrid 마법사로 설정되도록 하는 것을 권장한다고 나와있습니다. 수동으로 임의조작할 경우 Side Effect 발생할 있기 때문입니다. $True 설정될 경우 X-MS-Exchange-Organization Header 값을 변경하여 내부 메일에 대한 구분이 이루어 진다고 설명하고 있습니다. 관련된 테스트는 뒤에서 자세히 확인해 보도록 하겠습니다.

 

<RequireTls, TlsSenderCertificateName, RestrictDomainsToIPAddresses, SenderIPAddresses>

TlsSenderCertificateName
The TlsSenderCertificateName parameter specifies the TLS certificate that's used when the value of the RequireTls parameter is $true. A valid value is an SMTP domain. Wildcards are supported to indicate a domain and all subdomains (for example, *.contoso.com), but you can't embed the wildcard character (for example, domain.*.contoso.com is not valid).

RequireTls
The RequireTLS parameter specifies whether to require TLS transmission for all messages that are received by the connector. Valid values are:
  • $true: Reject messages if they aren't sent over TLS. This is the default value
  • $false: Allow messages if they aren't sent over TLS.
RestrictDomainsToIPAddresses
The RestrictDomainsToIPAddresses parameter specifies whether to reject mail that comes from unknown source IP addresses. Valid values are:
  • $true: Automatically reject mail from domains that are specified by the SenderDomains parameter if the source IP address isn't also specified by the SenderIPAddress parameter.
  • $false: Don't automatically reject mail from domains that are specified by the SenderDomains parameter based on the source IP address. This is the default value.
SenderIPAddresses
The SenderIPAddresses parameter specifies the source IPV4 IP addresses that the connector accepts messages from. Valid values are:
  • Single IP address: For example, 192.168.1.1.
  • Classless InterDomain Routing (CIDR) IP address range: For example, 192.168.0.1/25. Valid subnet mask values are /24 through /32.

RequireTls, TlsSenderCertificateName 세트라고 봐도 같습니다. Hybrid 마법사는 일반적으로 인증서 방식으로 커넥터가 생성됩니다. RequireTls True 당연히 TlsSenderCertificateName 지정되어야 합니다.

RestrictDomainsToIPAddresses, SenderIPAddresses 같은 맥락입니다. IP 지정했다면, RestrictDomainsToIPAddresses True 되어야 합니다.

 

[Bypass leveraging]

3rd Party Antispam 이외에도 On-Premise 통하여 우회하는 취약점에 대해서도 강조하였습니다.

물론 아래의 그림상 전제는 EXO->On-Premise 전달할 때에는 3rd Party Antispam 장비가 없다는 전제인 것으로 보입니다.

설명을 이해하려면, Hybrid Configuration Wizard(HCW) 어떻게 진행되는지 이해가 필요할 같습니다.

우선 HCW Log 아래의 위치에서 확인할 있습니다.

Log 파일에서 ReceiveConnector 키워드로 찾아보면, 아래의 기록을 확인할 있습니다.

부분은 아래의 단계와 연관 있는 것으로 보입니다.

EXO -> On-Premise 메일을 전달 하는 흐름이라면 다음과 같습니다.

 

8 구간에서 Outbound to <GUID> Connector -> Default Frontend <Servername> Connector 전달하기 때문에 Default Frontend Connector 설정을 변경하는 것입니다. 사실 직접 받는 것이 3rd Party 장비라면, Receive Connector 설정 변경은 의미가 없을 것으로 보입니다.

Set-ReceiveConnector -AuthMechanism 'Tls, Integrated, BasicAuth, BasicAuthRequireTLS, ExchangeServer' -Bindings '[::]:25','0.0.0.0:25' -Fqdn 'EX19MBX1.contoso.kr' -PermissionGroups 'AnonymousUsers, ExchangeServers, ExchangeLegacyServers' -RemoteIPRanges '::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff','0.0.0.0-255.255.255.255' -RequireTLS: $false -TLSDomainCapabilities 'mail.protection.outlook.com:AcceptCloudServicesMail' -TLSCertificateName '<I>CN=Sectigo RSA Domain Validation Secure Server CA, O=Sectigo Limited, L=Salford, S=Greater Manchester, C=GB<S>CN=mail.contoso.kr' -TransportRole FrontendTransport -Identity 'EX19MBX1\Default Frontend EX19MBX1'

RemoteIPRanges EOP IP만을 지정한 것이 아닌 모든 IP 주소 범위가 지정되어 있습니다. 모든 IP 범위는 Default Frontend Connector 기본 값입니다.

 

그리고 TLSDomainCapabilities에 대해서는 기술자료에서는 다음과 같이 설명하고 있습니다.

TlsDomainCapabilities

The TlsDomainCapabilities parameter specifies the capabilities that the Receive connector makes available to specific hosts outside of the organization. Remote hosts are authenticated with TLS with certificate validation before these capabilities are offered.

This parameter uses the following syntax:
"Domain1:Capability1,Capability2,"...,"Domain2:Capability1,Capability2,...",...
You can only use this parameter in Exchange hybrid deployments, and the valid Capability values are:
  • AcceptCloudServicesMail (Exchange 2013 or later)
  • AcceptOorgProtocol (Exchange 2010)
More Capability values are available, but there is no scenario to use them. For more information, see Advanced Office 365 Routing.
The available Domain values are an SMTP domain (for example, contoso.com), or the value NO-TLS for non-TLS encrypted inbound connections.
For example, ."contoso.com:AcceptOorgProtocol","fabrikam.com:AcceptCloudServicesMail"


기계번역
TlsDomainCapabilities 매개 변수는 수신 커넥터가 조직 외부의 특정 호스트에서 사용할 수 있도록 하는 기능을 지정합니다. 원격 호스트는 이러한 기능이 제공되기 전에 인증서 유효성 검사를 통해 TLS로 인증됩니다.


이 매개변수는 다음 구문을 사용합니다.
"Domain1:Capability1,Capability2,"...,"Domain2:Capability1,Capability2,...",...
Exchange 하이브리드 배포에서만 이 매개변수를 사용할 수 있으며 유효한 기능 값은 다음과 같습니다.
  • AcceptCloudServicesMail(Exchange 2013 이상)
  • AcceptOorgProtocol(Exchange 2010)
더 많은 기능 값을 사용할 수 있지만 사용할 시나리오가 없습니다. 자세한 내용은 고급 Office 365 라우팅 을 참조하세요 .
사용 가능한 도메인 값은 SMTP 도메인(예: contoso.com)이거나 TLS로 암호화되지 않은 인바운드 연결의 경우 NO-TLS 값입니다.
예를 들어, "contoso.com:AcceptOorgProtocol","fabrikam.com:AcceptCloudServicesMail"
Set-ReceiveConnector (ExchangePowerShell) | Microsoft Learn

해당 값이 적용되었는지 유무는 프로토콜 로그를 통해서 확인할 있습니다.

프로토콜 로그를 통해서 있는 사실은 mail.protection.outlook.com 도메인이 일치하면, TlsDomainCapabilities 적용된다는 점입니다. 그렇다는 것은 다른 테넌트에서 발송시에도 동일하게 판정될 것입니다.

 

Fabrikam.kr 등록된 다른 테넌트에서 Outbound Connector 동일하게 설정한 , 동일한 로그가 기록되는지 확인해 보았습니다.

 

 

다음과 같이 동일하게 기록되는 것을 확인할 있습니다. 특히 XOORG 동일하게 기록됩니다.

강의상에서는 부분이 악용될 소지가 있다고 설명하고 있습니다. 하이브리드 구성의 특성상 커넥터나 IP 허용목록 설정으로 인하여 SCL Level -1 기록될 가능성이 존재하기 때문입니다.

 

방화벽단에서 막을 없는 이유로는 Contoso.kr Fabrikam.kr 테넌트는 동일한 EOP 사용하기 때문에 구분하는 것은 불가능합니다.

또한 protection.outlook.com 주소를 기반으로 하기때문에 URL 기반으로도 구분이 불가능합니다. 세션에서 궁극적으로 전달하고자 하는 메시지는 3rd Party Antispam, Exchange Server 등과 같이 "Hybrid 환경은 추가적인 설정이 필요하다." 입니다.

 

[Demo1]

Demo1에서는 Bad Actor 모델의 테넌트에서 Outbound Connector 생성 -> 공격 대상의 On-Premise 직접 발송 -> Relay 이용하여 대상테넌트로 수신하게 하는 테스트가 목표입니다.

 

Step1. Outbound Connector 생성

 

Fabrikam.kr 테넌트에서 아래와 같이 Outbound Connector 생성

User01@fabrikam.kr -> Cloud1@contoso.kr 메일 발송하면,

아래와 같은 순서로 전달됩니다.

Frontend Receive Protocol Log 보면 아래와 같이 수신 기록을 확인할 있습니다. 그림상 1 흐름에 해당합니다.

Transport (hub) Send Protocol Log 보면 아래와 같이 송신 기록을 확인할 있습니다. 그림상 2 흐름에 해당합니다.

Exchange Online에서 Message Trace 상세 항목으로 내보내기를 진행하면,

Transport Service 단인 Default <Server Name> Connector 에서 수신하고, 최초 수신은 mail.onmicrosoft.com 받는 것을 있습니다. 이후 주소를 Primary Address Rewrite 합니다. 어떻게 보면 Hybrid 구조의 당연한 수순입니다.

그리고 Custom_data 항목에서 생성한 커넥터를 통해서 수신된 것을 확인할 있습니다.

 

 

그리고 아래와 같이 수신된 것을 확인할 있습니다.

 

영상에서는 Header 분석기에서 IP Filter Verdict CAL 언급하였습니다.

CAL 클릭하면 아래의 기술자료로 이동합니다.

Anti-spam message headers - Office 365 | Microsoft Learn

-> IP Allow List에서 허용하면, 지금과 같이 피싱메일이 수신될 있는 시나리오가 있다 라고 설명하고 있습니다.

 

그리고 Get-HostedConnectionFilterPolicy 확인시켜줍니다.

[X-OriginatorORG]

Lock down 진행하기전에 먼저 X-OriginatorOrg라는 중요한 헤더에 대해 알아야 합니다.

해당 내용에서 한글로 입력한 부분은 강연 내용을 번역한 내용입니다. 우선 대응 되는 개념을 비교해서 두서 없이 작성해보았습니다. 이후

나리오 1,2 보면 이해하기 쉬울 것으로 생각됩니다.

 

When email is sent from or relayed through your own tenant, Exchange Online will send XOORG SMTP command extension with the "MAIL FROM" Command.

자체 테넌트에서 전자 메일을 보내거나 릴레이하면 Exchange Online에서 "MAIL FROM" 명령과 함께 XOORG SMTP 명령 확장을 보냅니다.

 

XOORG = Sender's P2 or P1 domain if it's a tenant's accepted domain

XOORG = The default accpted domain where the sender is external (like forward scenario)

보낸 사람의 주소가 테넌트의 허용 도메인과 같다면, XOORG 보낸 사람의 P1 or P2 도메인과 동일합니다.

Relay or Forwarding 시나리오에서는 XXORG 테넌트의 기본 허용 도메인이 됩니다.

 

Frontend Protocol log 상에서 다음과 같이 확인됩니다.

The following two conditions are checked on the on-premises Server:

If the Receive connector TlsDomainCapabilities is set to AcceptCloudServicesMail or AcceptOorgProtocol and

If the XOORG Domain matches any on-premises Accepted Domain

이제 테넌트에서 Hybrid On-premises server로 메일이 전송되면 On-premises server는 두 가지를 확인합니다.

먼저 수신된 커넥터 TlsDomainCapabilitiesAcceptCloudServicesMail 또는 AcceptOorgProtocol로 설정되어 있는지 확인합니다.

두 번째는 mail from 명령으로 언급된 XOORG 도메인이 서버의 허용 도메인 중 하나와 일치하는 경우입니다.

 

Set-ReceiveConnector (ExchangePowerShell) | Microsoft Learn

 

 

On-premises server will treat the connection as Authenticated and will promote cross premises headers to org headers. Also, this will make sure that all emails directly sent from or relayed through EOP have the "X-OriginatorOrg" header set to your Verified Domain in EXO.

온-프레미스 서버는 연결을 인증됨으로 처리하고 크로스-프레미스 헤더를 조직 헤더로 승격합니다. 또한 EOP에서 직접 보내거나 EOP를 통해 릴레이되는 모든 이메일에 "X-OriginatorOrg" 헤더가 EXO의 확인된 도메인으로 설정되어 있는지 확인합니다.

 

해더 상에서 아래의 요소들을 설명하는 것으로 보입니다.

This is automatically setup for you by the hybrid Configuration Wizard, and in hybrid scenario, XOORG SMTP command is how we keep thins secure.

이들은 하이브리드 구성 마법사에 의해 자동으로 설정되며 하이브리드 시나리오에서 XOORG SMTP 명령은 보안을 유지하는 방법입니다.

 

[Blue Team: Scenario 1]

아래의 시나리오는 조직의 테넌트가 아닌 다른 테넌트(fabrikam.kr)에서 우회하여 On-Premise 발송하는 것을 X-OriginatorORG Header 값을 기준으로 차단하는 시나리오입니다.

 

Exchange On-Premise 상에서 규칙을 생성합니다.

Powershell 진행한다면, 다음과 같이 입력합니다.

New-TransportRule -Name "Lockdown Exchange On-Prem" -FromScope NotInOrganization -RejectMessageReasonText 'You are not allowed to send email directly, use MX!' -ExceptIfHeaderContainsMessageHeader 'X-OriginatorOrg' -ExceptIfHeaderContainsWords 'contoso.kr'

ECP 상에서는 다음과 같이 생성합니다.

 

실제로 아래와 같이 우회하도록 설정하고 발송 시도시,

 

아래와 같이 NDR 수신되는 것으로 확인됩니다.

 

Header 상의 X-OriginatorOrg 기준으로 차단한 것을 확인할 있습니다.

 

[Blue Teams: Scenario 2]

두번째 시나리오는 MX 레코드가 3rd Party Email Filter , 3rd Party 거쳐서 들어오는 메일과 거치지 않는 메일을 구분하여 차단하는 시나리오입니다.

 

우선 기존 mail.contoso.kr Direct 전달하는 커넥터를 Disable 하고 아래와 같이 MX 레코드를 통해서 수신하도록 , 메일 발송을 진행해 보았습니다.

아래와 같이 메일 발송

 

Onpremise 사서함에서 수신

Header상에서 Edge 거쳐서 수신됨 확인

X-OriginatorORG 헤더는 없는 것으로 확인됩니다.

 

Protocol Log 보면 Edge에서 수신할 때에는 TlsDomainCapabilities='None',Domain='' 으로 체크되기 때문에 MAIL FROM 명령어 단계에서 XOORG 기록이 없는 것을 있습니다.

 

다시 한번 기존의 Protocol Log 비교해 보면 XOORG XOrginatorORG 개념을 쉽게 이해할 있을 것입니다.

 

 

그래서 아래의 구조에서는 X-OriginatorORG Header 값이 존재하는지 여부를 가지고 규칙 생성을 안내하고 있습니다.

 

Exchange Management Shell 기준으로는 다음 명령어로 생성합니다.

New-TransportRule -Name "Lockdown Exchange On-Prem 2" -HeaderMatchesMessageHeader 'X-OriginatorOrg' -HeaderMatchesPatterns '$' -ExceptIfHeaderContainsMessageHeader 'X-OriginatorOrg' -ExceptIfHeaderContainsWords 'contoso.kr' -RejectMessageReasonText 'You are not allowed to send email directly, use MX!'

ECP 상에서는 다음과 같이 생성합니다.

 

규칙은 Header 상에 X-originatorOrg 값이 존재하고, 값이 contoso.kr 아니면 Block 한다는 의미입니다.

 

아래와 같이 테스트 메일 발송

 

아래와 같이 NDR 수신되는 것을 확인할 있습니다.

한번에 해당 세션을 전부 다루고 싶지만.. 너무 작성기간이 길어 질 것 같아서 나눠서 다룹니다.

난이도가 있는 부분이기 때문에 2번째 파트는 한동안 업데이트가 없을 수도 있습니다....

반응형

+ Recent posts