░░░                              ░░░             ▀▄
                       ▄ ▀▀▄              ░░░                                   ■  ▒          ░░░
                     ▄      ▒        ▄▄                ▒    ▄▀       ▒         ▄  ▀▄▄
                     ▄▄             ▄                ▄█    █       ▄▀           ▄█▀▀▀     ▀▀ ▄
                      ▀▄▀█▄▄▄▄▄▄██▀ ▀▄▀███▄▄▄      ▄▄█▄▄▄ █▄▄▄   ▄▀▄▄▀  ▄▄▄▄▄    ▀▄▀ ▒    ▄▄▄▄▀
                      ▀▀▄▄  █▄▀▀▄     ▄▀ ▄▄ ▀▄   ▄▀▄▀▀▀▀▄  ▀▄▀▀▄██▀█   █▀▌  ▐▄          ▄█▀▀▀▀▄▄
                            █▀ ▄▄ ▒   ░░   █ █▀ ▄▄▀ ■▀ ▀▄  ▒ ▀▄▀▄▀ █  ▀▄    ██▄  ▓     ▄█ ▄▀▀ ██▀▄
           ▄              ▒ ██   ▄    ▓▓   ▒ █▄ ██ █   ██  █▄  ▀  ▀▒  ██   ▐▌██  █ ▒   ▄█ ▓   ██            ▄
             ▀            ▒ ▀█     ▄  ██     █  ░░ ▒   ▓▓  █▄     ██  ▓▓   █ ░█  ▄ ▄   ██ ▒   ▀▄          ▀
            ▀▄            ▓ ▓█      ▀▀█▀▄▄▄▄▀   ▒▒     ░░▀ ▒▒ ░   ▒▒  ░░  ▐▌ ██  █ ▒   ▀▀ ▄▄▄▄▄ ▄         ▄▀
           ░█▀            █ █▓      ▒ ▓ ▀▀▄    ▄▄▄▄▄▓▓▀▄█  ░▓ ▒   ▓░▐ █▓  ▓  ▌▓  ░▒░ ▄▀██  ▄▄▄▀▀          ▀█░
           ▄╬▄            ▓ ▓▒      █ █▓   ▀▒▄  ▀░▀▀   █▓  ▓█ █   █▓  ▓█ ▐▌  ▓▓  ▓▓█ ▄▀█▓     ▄█ ▒        ▄╬▄
      ,    ▌█▌    ,       ▓ ░▀      ░ ▓█  ▀  ▀░░▄▄     ░▓  █▓ █   ▒█▐ ▌▓ █   ▌▒  █▓█   ░█ ▒   █▓ █   ,    ▐█▐    ,
      ▄ ▄ ═▌█▌═ ▄ ▄  ░░▀▀▀▀ ██      ░ █▒    ▀▄ ▀▓░░░▄▄ █░  ▓░ ▓   ▀█▐ █░▐▌   ▌█  ░░░   ▀░ ▓   ░█ ▀   ▄ ▄ ═▐█▐═ ▄ ▄ 
       ▀▀█▓▄▓█▓█▀▀    ▀▄ ▀░░░░   ▒  ▀▄▓▀▒     █  █▓▄▀▀▀░▄▀░░█ █   ░░█▀▀▓█    █   ░▓█ ▀▄▓█ ▓   ░  ▄▄   ▀▀█▓█▓▄▓█▀▀  
           ▀▓▄%         ▀  ▀▄     ▀░░▀ ▄    ▄▀  ▄▀     █▀  ▀█ ▓   ░▀▄▄  ▀ ▄▄▀   ▒▀ █▄  ▀█ █   ▓▄▀  ▀     %▄▓▀      
   ▒      •▀▒             ▀▄        ▄▄▀    ▒  ▄▀          ▀▄  ▓   ▄▀   ▀ ▄▄  ▀    ▄▀  ■▄  ░   ▀            ▒▀•      ▒   
 ▄▀▀▀▀▄▄▄█▄▄▒                ■                ░     ▒        ▀█         ■       ▄▀      ▀▄░                ▒▄▄█▄▄▄▀▀▀▀▄ 
 ░ ░  •▀                                       ▀ ▄▄▀                           ▒          ▀                     ▀•  ░ ░ 
 █ ▒▄▀                                                                               [ Arte por L.Ayres ]         ▀▄▒ █ 
 █ ▒                                                                                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒               B0F                                                                                              ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒                   H3y dud3,                                                                                    ▒ █
 █ █                   1 g0t y0u l33t m5g v14 #PID1337                                                              █ █
 █ ▒                               /                                                                                ▒ █
 █▒▒                              /                     H4ndl3 th3s3 b0x35 w1th c4r3 br0! :)                        ▒▒█
 █ ▒                             /                               /                                                  ▒ █
 █ █                                 .----.                   .----.                                                █ █
 █ ▒                     .---------. | == |       .---------. | == |                                                ▒ █
 █▒▒                     |.-"""""-.| |----|       |.-"""""-.| |----|                                                ▒▒█
 █ ▒                     ||  BR   || | == | <-->  ||  FR   || | == |                                                ▒ █
 █ █                     ||       || |----|   .   ||       || |----|                                                █ █
 █▒▒ ¡                   |'-.....-'| |::::|     . |'-.....-'| |::::|                                                ▒▒█
 █ ▒,█▄                  `"")---(""` |___.|   .   `"")---(""` |___.|                                                ▒ █
 █ █▀▀°                 /:::::::::::\" _  "  .   /:::::::::::\" _  "                                                █ █
 █▒▒                   /:::=======:::\`\`\      /:::=======:::\`\`\                                                 ▒▒█
 █ ▒                  `"""""""""""""""` '-`    `"""""""""""""""` '-`                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               -= Modelo de Atores com GO: Orquestra, Caos e Outras Ferramentas de Guerra =-                    ▒▒█
 █ ▒               by: Rodrigo Nas. trm0x2                                                                          ▒ █
 █ █                                                                                                                █ █
 █ ▒               --[ Agenda                                                                                       ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               - 0 -> Reflexão e propósito                                                                      ▒ █
 █ █               - 1 -> Modelo de atores                                                                          █ █
 █ ▒               - 2 -> Onde da pra chegar???                                                                     ▒ █
 █▒▒               - 3 -> Coda rapaa, bota pra rodar                                                              ¡ ▒▒█
 █ ▒               - 4 -> Mensagem aos joviais                                                                   ▄█,▒ █
 █ █               - 5 -> Agradecimentos                                                                         °▀▀█ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               0 - Reflexão e propósito                                                                         ▒ █
 █ █                                                                                                                █ █
 █ ▒               Tempo atrás quando submeti aqui um paper, falei da ideia de utilizarmos                          ▒ █
 █▒▒               uma linguagem de programação madura que apimentasse algumas estratégias                          ▒▒█
 █ ▒               utilizadas em aplicações modernas (ou nem tanto). Citamos elixir / erlang                        ▒ █
 █ █               e como o ecosistema da vm beam contribui para coisas incríveis.                                  █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               Lá deu pra ter uma ideia de como o modelo de atores funciona e porque                            ▒▒█
 █ ▒               os sistemas com milhões de dados transitando, brocando sem parar                                 ▒ █
 █ █               em tempo real funcionam, de uma forma fluída e orquestrada.                                      █ █
 █ ▒                                                                                                                ▒ █
 █▒▒ ¡             Ainda falando de código, decidi trazer agora uma figura que está mais que                        ▒▒█
 █ ▒,█▄            enraizada no mundo sec nos últimos anos: GOLANG.                                                 ▒ █
 █ █▀▀°            Tem sido uma experiência primorosa codar utilizando essa linguagem, que                          █ █
 █▒▒               nasce discreta e domina o mundo das computarias em pouco tempo.                                  ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               Não tem como negar que a qualidade das ferramentas trazidas pela comunidade                      █ █
 █ ▒               e empresas é de se admirar... da pra citar coisas como k8s, docker                               ▒ █
 █▒▒               e especificamente no mundo de segurança ferramentas excelentes como nuclei,                      ▒▒█
 █ ▒               bettercap e tantas outras que agora fazem parte do dia a dia de muitos.                          ▒ █
 █ █                                                                                                                █ █
 █ ▒               Para contribuir e dar uma pitada de pwnagem a ideia aqui é apresentar uma                        ▒ █
 █▒▒               abordagem diferente quando vamos construir uma aplicação...                                      ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               A combinação é perfeita: GOLANG e modelo de atores :beer:                                        █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               1 - Modelo de atores                                                                           ¡ ▒▒█
 █ ▒                                                                                                             ▄█,▒ █
 █ █               Explicação antes de tomar 4 canecas de cerveja:                                               °▀▀█ █
 █▒▒               ---                                                                                              ▒▒█
 █ ▒               Nos confins da década de 1970, enquanto a computação ainda "engatinhava" em                      ▒ █
 █ █               sua jornada, um conceito emergiu das sombras acadêmicas — o Modelo de Atores.                    █ █
 █ ▒               Proposto por Carl Hewitt em 1973, esse modelo não era apenas uma abstração                       ▒ █
 █▒▒               matemática; era uma resposta direta aos desafios da computação                                   ▒▒█
 █ ▒               concorrente e distribuída.                                                                       ▒ █
 █ █                                                                                                                █ █
 █ ▒               Em um mundo onde os sistemas precisavam se adaptar e evoluir,                                    ▒ █
 █▒▒               o Modelo de Atores ofereceu uma nova perspectiva:                                                ▒▒█
 █ ▒               unidades independentes, chamadas "atores", que interagem entre si por meio de                    ▒ █
 █ █               mensagens assíncronas, sem compartilhar estado.                                                  █ █
 █ ▒               ---                                                                                              ▒ █
 █▒▒ ¡                                                                                                              ▒▒█
 █ ▒,█▄            2 - Onde da pra chegar???                                                                        ▒ █
 █ █▀▀°                                                                                                             █ █
 █▒▒               Quando se trata de arruaça os nobres amigos se ajudam. Vo deixar aqui um                         ▒▒█
 █ ▒               exemplo do que pode ser feito. A ideia é montar uma fábrica onde aplicações                      ▒ █
 █ █               se conectam de uma ou mais máquinas. Dentro dessa fábrica, que vamos chamar                      █ █
 █ ▒               de cerebro, temos vários atores, cada um com sua função.                                         ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               Um desenho malucão pelo bem da ciência:                                                          ▒ █
 █ █                                                                                                                █ █
 █ ▒               +--------------------------------------------------------+                                       ▒ █
 █▒▒               |                      CEREBRO                           |                                       ▒▒█
 █ ▒               |                                                        |                                       ▒ █
 █ █               |  +-----------+                                         |                                       █ █
 █ ▒               |  |  CONTROL  | ------------                            |                                       ▒ █
 █▒▒               |  +-----------+            |                            |                                     ¡ ▒▒█
 █ ▒               |        |                  |                            |                                    ▄█,▒ █
 █ █               |        |                  |                            |                                    °▀▀█ █
 █▒▒               |  +------------+          +---+         +--------+      |                                       ▒▒█
 █ ▒               |  |  Registry  | <------  | C | ----->  | GHOST1 |      |                                       ▒ █
 █ █               |  +------------+          | O | <-----  | NMAPIT |      |                                       █ █
 █ ▒               |        |                 | M.|         +--------+      |                                       ▒ █
 █▒▒               |  +----------------+      |   |         +----------+    |                                       ▒▒█
 █ ▒               |  | ResultsWatcher | <--- | P | ----->  | GHOST2   |    |                                       ▒ █
 █ █               |  +----------------+      | I | <-----  | HUNTER   |    |                                       █ █
 █ ▒               |        |                 | P |         +----------+    |                                       ▒ █
 █▒▒               |  +----------+            | E | ----->  +-----------+   |                                       ▒▒█
 █ ▒               |  | Notifier |            +---+ <-----  | GHOST3    |   |                                       ▒ █
 █ █               |  +----------+________                  | EXPLOITER |   |                                       █ █
 █ ▒               |        |        |       \              +-----------+   |                                       ▒ █
 █▒▒ ¡             |    +-----+  +--------+  +---------+                    |                                       ▒▒█
 █ ▒,█▄            |    |email|  |telegram|  |baremetal|                    |                                       ▒ █
 █ █▀▀°            |    +-----+  +--------+  +---------+                    |                                       █ █
 █▒▒               +--------------------------------------------------------+                                       ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒               Dando nome aos bois:                                                                             ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               - Control:                                                                                       ▒ █
 █ █                 - O entrypoint do cerebro pode mandar mensagem para um ou mais atores                          █ █
 █ ▒               - Registry:                                                                                      ▒ █
 █▒▒                 - Responsável por manter o registro de todos os atores conectados                              ▒▒█
 █ ▒               - ResultsWatcher:                                                                                ▒ █
 █ █                 - Tarefas finalizadas (vc sabe...) são emitidas pra ca                                         █ █
 █ ▒               - Notifier:                                                                                      ▒ █
 █▒▒                 - Aviso via telegram ou máquina da rússia que a tarefa foi concluída                         ¡ ▒▒█
 █ ▒               - "GHOSTS"                                                                                    ▄█,▒ █
 █ █                 - Basicamente atores especializados. Um app rodando nmap, outro explorando                  °▀▀█ █
 █▒▒                   uma infraestrutura inteira ou quem sabe o velho e bom bruteforce                             ▒▒█
 █ ▒               - COM. PIPE (communication pipe)                                                                 ▒ █
 █ █                 - Aqui nossa conexão pode ser feita via rede através também de um módulo                       █ █
 █ ▒                   especializado que sabe lidar com os tipos/categorias e mandar para o lugar                   ▒ █
 █▒▒                   adequado :)                                                                                  ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               3 - Coda rapaa, bota pra rodar                                                                   █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               Esse sistema com mais algumas cervejas daria pra brincar legal mas vamos nos                     ▒▒█
 █ ▒               concentrar no conceito e ver as coisas funcionando minimamente (repo no final).                  ▒ █
 █ █                                                                                                                █ █
 █ ▒               Materializando as ideias, para implementar o modelo de atores vamos                              ▒ █
 █▒▒ ¡             nos deleitar com o excelente Ergo (https://docs.ergo.services/). Que                             ▒▒█
 █ ▒,█▄            basicamente nos da atalhos para trabalhar com modelo de atores.                                  ▒ █
 █ █▀▀°                                                                                                             █ █
 █▒▒               O manual ta embaixo do braço com ergo:                                                           ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               -> Criação de apps independentes                                                                 █ █
 █ ▒               -> Supervisores inteligentes que vão restaurar a aplicação em caso de                            ▒ █
 █▒▒                  emergencia (ao invés de chamadas telefonicas a gente pwna :D)                                 ▒▒█
 █ ▒               -> Passagem de mensagens através de nomes e pids                                                 ▒ █
 █ █               -> Criação de worker pools e atores para cada tarefa                                             █ █
 █ ▒               -> Criação de servidores tcp/apis para comunicação entre servidores                              ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               Setup cerebro                                                                                    ▒ █
 █ █                                                                                                                █ █
 █ ▒               $ ergo -init Cerebro \                                                                           ▒ █
 █▒▒                 -with-app App \                                                                              ¡ ▒▒█
 █ ▒                 -with-sup App:Sup \                                                                         ▄█,▒ █
 █ █                 -with-tcp Sup:TcpReceiver \                                                                 °▀▀█ █
 █▒▒                 -with-actor Sup:ResultsWatcher                                                                 ▒▒█
 █ ▒                 -with-web Sup:Api \                                                                            ▒ █
 █ █                                                                                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               - App                                                                                            ▒▒█
 █ ▒                 - Aplicação com as definições principais de resiliência e comportamento                        ▒ █
 █ █               - App:Sup                                                                                        █ █
 █ ▒                 - Árvore de supervisão dentro da aplicação que irá cuidar de outros apps                       ▒ █
 █▒▒                   e workers                                                                                    ▒▒█
 █ ▒               - Sup:TcpReceiver                                                                                ▒ █
 █ █                 - Servidor tcp pra receber dados exfiltrados, digo, notícias de culinária                      █ █
 █ ▒               - Sup:ResultsWatcher                                                                             ▒ █
 █▒▒ ¡               - Um ator / processo para receber tbm informações                                              ▒▒█
 █ ▒,█▄            - Sup:Api                                                                                        ▒ █
 █ █▀▀°              - Mundo moderno, quem quiser construir dash que consuma a api :p                               █ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               Mostrando magia na primeira cena do filme, esse é um trecho do nosso                             ▒ █
 █ █               supervisor:                                                                                      █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               cerebro/apps/app/sup.go:                                                                         ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               func (sup *Sup) Init(args ...any) (act.SupervisorSpec, error) {                                  █ █
 █ ▒                   var spec act.SupervisorSpec                                                                  ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒                   // set supervisor type                                                                       ▒ █
 █ █                   spec.Type = act.SupervisorTypeOneForOne                                                      █ █
 █ ▒                                                                                                                ▒ █
 █▒▒                   // add children                                                                            ¡ ▒▒█
 █ ▒                   spec.Children = []act.SupervisorChildSpec{                                                ▄█,▒ █
 █ █                       {                                                                                     °▀▀█ █
 █▒▒                           Name:    "tcpreceiver",                                                              ▒▒█
 █ ▒                           Factory: factory_TcpReceiver,                                                        ▒ █
 █ █                       },                                                                                       █ █
 █ ▒                       {                                                                                        ▒ █
 █▒▒                           Name:    "api",                                                                      ▒▒█
 █ ▒                           Factory: factory_Api,                                                                ▒ █
 █ █                       },                                                                                       █ █
 █ ▒                       {                                                                                        ▒ █
 █▒▒                           Name:    "resultswatcher",                                                           ▒▒█
 █ ▒                           Factory: factory_ResultsWatcher,                                                     ▒ █
 █ █                       },                                                                                       █ █
 █ ▒                   }                                                                                            ▒ █
 █▒▒ ¡                                                                                                              ▒▒█
 █ ▒,█▄                // set strategy                                                                              ▒ █
 █ █▀▀°                spec.Restart.Strategy = act.SupervisorStrategyTransient                                      █ █
 █▒▒                   spec.Restart.Intensity = 2 // How big bursts of restarts you want to tolerate                ▒▒█
 █ ▒                   spec.Restart.Period = 5    // In seconds.                                                    ▒ █
 █ █                                                                                                                █ █
 █ ▒                   return spec, nil                                                                             ▒ █
 █▒▒               }                                                                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒               Aqui com a lista []act.SupervisorChildSpec nós temos childs supervisionadas,                     ▒ █
 █▒▒               que de acordo com a nossa estratégia: act.SupervisorStrategyTransient indica                     ▒▒█
 █ ▒               um restart em crashes... se a aplicação quebrar, ela se recupera                                 ▒ █
 █ █               automaticamente (alôo papai do k8s). Também configuramos a quantidade de                         █ █
 █ ▒               restarts e a janela de tempo, ponto.                                                             ▒ █
 █▒▒                                                                                                              ¡ ▒▒█
 █ ▒               Antes de qualquer coisa, já vale olhar o output da ferramenta:                                ▄█,▒ █
 █ █                                                                                                             °▀▀█ █
 █▒▒               $ go run cmd/*.go                                                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               [info] 17E5009F: application 'system_app' (permanent) started                                    █ █
 █ ▒               [info] <17E5009F.0.1005>: started TCP server on localhost:7654                                   ▒ █
 █▒▒               (meta-process: Alias#<17E5009F.106848.25022.0>)                                                  ▒▒█
 █ ▒               [info] <17E5009F.0.1005>: you may check it with command below:                                   ▒ █
 █ █               [info] <17E5009F.0.1005>:    $ nc localhost 7654                                                 █ █
 █ ▒               [info] <17E5009F.0.1006>: started WebHandler to serve '/'                                        ▒ █
 █▒▒               (meta-process: Alias#<17E5009F.106849.25022.0>)                                                  ▒▒█
 █ ▒               [info] <17E5009F.0.1006>: started Web server Alias                                               ▒ █
 █ █               #<17E5009F.106850.25022.0>: use http://localhost:9090/                                           █ █
 █ ▒               [info] <17E5009F.0.1006>: you may check it with command below:                                   ▒ █
 █▒▒ ¡             [info] <17E5009F.0.1006>:    $ curl -k http://localhost:9090                                     ▒▒█
 █ ▒,█▄            [info] <17E5009F.0.1007>: started web worker process with args []                                ▒ █
 █ █▀▀°            [info] <17E5009F.0.1008>: started web worker process with args []                                █ █
 █▒▒               [info] <17E5009F.0.1009>: started web worker process with args []                                ▒▒█
 █ ▒               [info] <17E5009F.0.1010>: started process with name 'resultswatcher' and args []                 ▒ █
 █ █               [info] 17E5009F: application 'app' (transient) started                                           █ █
 █ ▒               [info] 17E5009F: node 'cerebro@localhost'                                                        ▒ █
 █▒▒               built with "Ergo Framework:3.1.0" successfully started                                           ▒▒█
 █ ▒               [info] 17E5009F: Cerebro token: cerebro-secret-cookie                                            ▒ █
 █ █                                                                                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               1 aplicação, múltiplos atores:                                                                   ▒▒█
 █ ▒               - tcp server iniciou na porta 7654                                                               ▒ █
 █ █               - web server iniciou na porta 9090 com (3 workers por request)                                   █ █
 █ ▒               - processo resultswatcher (a gente vai chegar nele via msg)                                      ▒ █
 █▒▒                                                                                                              ¡ ▒▒█
 █ ▒               Um ponto interessante a se notar é um output que deixei sobre o "token" desse nó:             ▄█,▒ █
 █ █                                                                                                             °▀▀█ █
 █▒▒               Cerebro token: cerebro-secret-cookie                                                             ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               Como é de costume em muitas aplicações distribuidas, aqui também usamos um cookie                █ █
 █ ▒               para que uma máquina ingresse no cluster. A config é simples:                                    ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               // cerebro/cmd/main.go                                                                           ▒ █
 █ █                                                                                                                █ █
 █ ▒               // set network cookie                                                                            ▒ █
 █▒▒               nodeOptions.Network.Cookie = "cerebro-secret-cookie"                                             ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               apps := []gen.ApplicationBehavior{                                                               █ █
 █ ▒                 app.CreateApp(),                                                                               ▒ █
 █▒▒ ¡             }                                                                                                ▒▒█
 █ ▒,█▄            nodeOptions.Applications = apps                                                                  ▒ █
 █ █▀▀°                                                                                                             █ █
 █▒▒               // starting cerebro                                                                              ▒▒█
 █ ▒               node, err := ergo.StartNode("cerebro@localhost", nodeOptions)                                    ▒ █
 █ █               if err != nil {                                                                                  █ █
 █ ▒                 panic(err)                                                                                     ▒ █
 █▒▒               }                                                                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒               Então a partir de agora, todas as aplicações que irão ingressar nesse cluster                    ▒ █
 █▒▒               precisam utilizar o mesmo cookie.                                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               Setup de um ghost / app arruaceiro                                                               █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               $ ergo -init Nmapit \                                                                          ¡ ▒▒█
 █ ▒                 -with-app App \                                                                             ▄█,▒ █
 █ █                 -with-sup App:Sup \                                                                         °▀▀█ █
 █▒▒                 -with-pool Sup:Pool                                                                            ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒               A diferença desse app é que agora temos uma Pool para executar workers                           ▒ █
 █▒▒               para tarefas específicas. Vamos simular um scanning nmap no nmapit                               ▒▒█
 █ ▒               e chama-lo através do cerebro (que pode ser outra máquina, em qualquer canto                     ▒ █
 █ █               do mundo):                                                                                       █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               // nmapit/apps/app/pool_worker.go                                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               func (w *PoolWorker) HandleMessage(from gen.PID, message any) error {                            █ █
 █ ▒                   w.Log().Info("nmap worker")                                                                  ▒ █
 █▒▒ ¡                 w.Log().Info("worker received message from %s, working...", from)                            ▒▒█
 █ ▒,█▄                time.Sleep(time.Duration(rand.Intn(5)) * time.Second)                                        ▒ █
 █ █▀▀°                return nil                                                                                   █ █
 █▒▒               }                                                                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒               Antes de chamar essa função de outra máquina, vamos ver como isso pode                           ▒ █
 █▒▒               ser feito localmente, de dentro a própria aplicação e não de outro nó:                           ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               // nmapit/cmd/main.go                                                                            █ █
 █ ▒               ...                                                                                              ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               // starting nmapit                                                                               ▒ █
 █ █               node, err := ergo.StartNode(gen.Atom(OptionNodeName), nodeOptions)                               █ █
 █ ▒               if err != nil {                                                                                  ▒ █
 █▒▒                 panic(err)                                                                                   ¡ ▒▒█
 █ ▒               }                                                                                             ▄█,▒ █
 █ █                                                                                                             °▀▀█ █
 █▒▒               node.Send(gen.Atom("pool"), "foo")                                                               ▒▒█
 █ ▒               ...                                                                                              ▒ █
 █ █                                                                                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               No momento que node.Send é executado, temos o seguinte output:                                   ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               terminal nmapit                                                                                  █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               ...                                                                                              ▒▒█
 █ ▒               [info] 87352B81: application 'system_app' (permanent) started                                    ▒ █
 █ █               [info] <87352B81.0.1005>: started process pool with 3 workers                                    █ █
 █ ▒               [info] <87352B81.0.1006>: started worker process in pool: <87352B81.0.1005>                      ▒ █
 █▒▒ ¡             [info] <87352B81.0.1007>: started worker process in pool: <87352B81.0.1005>                      ▒▒█
 █ ▒,█▄            [info] <87352B81.0.1008>: started worker process in pool: <87352B81.0.1005>                      ▒ █
 █ █▀▀°            [info] 87352B81: application 'app' (transient) started                                           █ █
 █▒▒               [info] 87352B81: node 'nmapit@localhost'                                                         ▒▒█
 █ ▒               built with "Ergo Framework:3.1.0" successfully started                                           ▒ █
 █ █               [info] <87352B81.0.1006>: nmap worker                                                            █ █
 █ ▒               [info] ...: worker received message from <87352B81.0.1>, working...                              ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               O output final indica que recebemos uma mensagem                                                 █ █
 █ ▒               que vai ser trabalhada de forma assícrona... bonito certo? :)                                    ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               Vamos então agora chamar remotamente esse mesmo processo na nossa pool.                          ▒ █
 █ █                                                                                                                █ █
 █ ▒               Lembra do nosso com. pipe? Que faz a ligação entre as coisas? Ele nasce agora:                   ▒ █
 █▒▒                                                                                                              ¡ ▒▒█
 █ ▒               // cerebro/apps/app/pipe.go                                                                   ▄█,▒ █
 █ █               package app                                                                                   °▀▀█ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               import (                                                                                         ▒ █
 █ █                   "time"                                                                                       █ █
 █ ▒                                                                                                                ▒ █
 █▒▒                   "ergo.services/ergo/act"                                                                     ▒▒█
 █ ▒                   "ergo.services/ergo/gen"                                                                     ▒ █
 █ █               )                                                                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               type Pipe struct {                                                                               ▒▒█
 █ ▒                   act.Actor                                                                                    ▒ █
 █ █               }                                                                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒ ¡             func Factory_Pipe() gen.ProcessBehavior {                                                        ▒▒█
 █ ▒,█▄                return &Pipe{}                                                                               ▒ █
 █ █▀▀°            }                                                                                                █ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               func (p *Pipe) Init(args ...any) error {                                                         ▒ █
 █ █                   p.Log().Info("pipe process started")                                                         █ █
 █ ▒                   p.SendAfter(p.PID(), "call_nmapit", 1*time.Second)                                           ▒ █
 █▒▒                   return nil                                                                                   ▒▒█
 █ ▒               }                                                                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒               func (p *Pipe) HandleMessage(from gen.PID, message any) error {                                  ▒ █
 █▒▒                   p.Log().Info("pipe got message from %s: %v", from, message)                                  ▒▒█
 █ ▒                   nmapIt := gen.ProcessID{Name: "pool", Node: "nmapit@localhost"}                              ▒ █
 █ █                   p.Log().Info("sending message to nmapit process %s", nmapIt)                                 █ █
 █ ▒                                                                                                                ▒ █
 █▒▒                   for i := 0; i < 10; i++ {                                                                  ¡ ▒▒█
 █ ▒                       if err := p.Send(nmapIt, "foo"); err != nil {                                         ▄█,▒ █
 █ █                           p.Log().Error("error sending message to nmapit: %v", err)                         °▀▀█ █
 █▒▒                           return nil                                                                           ▒▒█
 █ ▒                       }                                                                                        ▒ █
 █ █                   }                                                                                            █ █
 █ ▒                                                                                                                ▒ █
 █▒▒                   return nil                                                                                   ▒▒█
 █ ▒               }                                                                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               O simples fato de implementarmos act.Actor nos da a capacidade de um ator,                       ▒▒█
 █ ▒               isso inclui: recebimento de mensagens sync/async. Deteção de init e                              ▒ █
 █ █               fim do processo e muito mais. Lembre-se que aqui, quando chamamos esse worker                    █ █
 █ ▒               nós temos um processo. Ele é um só que foi invocado pela pool mas poderia ser                    ▒ █
 █▒▒ ¡             milhares ou milhões do mesmo, rodando localmente ou globalmente, essa é a                        ▒▒█
 █ ▒,█▄            graça do modelo de atores :beer:                                                                 ▒ █
 █ █▀▀°                                                                                                             █ █
 █▒▒               Vamos agora no nosso entrypoint (control) chamar o nosso pipe, que vai trigar                    ▒▒█
 █ ▒               o nmapit em outro nó. Essa chamada poderia ser feita através de uma api http                     ▒ █
 █ █               ou quem sabe de um comando tcp vindo de um raspberry na argentina :)                             █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               // cerebro/cmd/main.go                                                                           ▒▒█
 █ ▒               node.SpawnRegister(gen.Atom("pipe"), app.Factory_Pipe, gen.ProcessOptions{})                     ▒ █
 █ █                                                                                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               Vale lembrar agora do método func (p *Pipe) Init(args ...any) error { que                        ▒▒█
 █ ▒               declramos no pipe.go, ele é chamado automaticamente quando inicializamos                         ▒ █
 █ █               o ator.                                                                                          █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               No init vamos utlizar a chamada                                                                ¡ ▒▒█
 █ ▒               p.SendAfter(p.PID(), "call_nmapit", 1*time.Second)                                            ▄█,▒ █
 █ █               que basicamente se auto chama enviando uma mensagem com a string "call_nmapit".               °▀▀█ █
 █▒▒               Essa mensagem poderia ser qualquer coisa e geralmente é utilizada justamente                     ▒▒█
 █ ▒               para reagir de formas diferentes para cada tipo de mensagem.                                     ▒ █
 █ █                                                                                                                █ █
 █ ▒               Feito o send, iremos receber a mensagem no método HandleMessage:                                 ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               func (p *Pipe) HandleMessage(from gen.PID, message any) error {                                  ▒ █
 █ █                   p.Log().Info("pipe got message from %s: %v", from, message)                                  █ █
 █ ▒                   nmapIt := gen.ProcessID{Name: "pool", Node: "nmapit@localhost"}                              ▒ █
 █▒▒                   p.Log().Info("sending message to nmapit process %s", nmapIt)                                 ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █                   for i := 0; i < 10; i++ {                                                                    █ █
 █ ▒                       if err := p.Send(nmapIt, "foo"); err != nil {                                            ▒ █
 █▒▒ ¡                         p.Log().Error("error sending message to nmapit: %v", err)                            ▒▒█
 █ ▒,█▄                        return nil                                                                           ▒ █
 █ █▀▀°                    }                                                                                        █ █
 █▒▒                   }                                                                                            ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █                   return nil                                                                                   █ █
 █ ▒               }                                                                                                ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               Vamos ao que faz a mágica acontecer:                                                             █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               1.                                                                                               ▒▒█
 █ ▒               nmapIt := gen.ProcessID{Name: "pool", Node: "nmapit@localhost"}                                  ▒ █
 █ █                                                                                                                █ █
 █ ▒               Aqui estamos falando que queremos interagrir com o processo chamado "pool"                       ▒ █
 █▒▒               (lembra no cerebro? Spawnamos lá o register que identifica o processo).                        ¡ ▒▒█
 █ ▒               E esse processo está localizado no nó "nmapit@localhost".                                     ▄█,▒ █
 █ █                                                                                                             °▀▀█ █
 █▒▒               2.                                                                                               ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               for i := 0; i < 10; i++ {                                                                        █ █
 █ ▒                       if err := p.Send(nmapIt, "foo"); err != nil { <-- aqui                                   ▒ █
 █▒▒                           p.Log().Error("error sending message to nmapit: %v", err)                            ▒▒█
 █ ▒                           return nil                                                                           ▒ █
 █ █                       }                                                                                        █ █
 █ ▒                   }                                                                                            ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               Agora com o Send que pertence a struct *Pipe mandamos uma mensagem                               █ █
 █ ▒               para o processo no outro nó. Aqui nós só conseguimos mandar a msg                                ▒ █
 █▒▒ ¡             pq nossa struct herda as funções de processo / ator.                                             ▒▒█
 █ ▒,█▄                                                                                                             ▒ █
 █ █▀▀°            poc:                                                                                             █ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               terminal cerebro:                                                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒               ...                                                                                              ▒ █
 █▒▒               [info] 17E5009F: application 'app' (transient) started                                           ▒▒█
 █ ▒               [info] 17E5009F: node 'cerebro@localhost'                                                        ▒ █
 █ █               built with "Ergo Framework:3.1.0" successfully started                                           █ █
 █ ▒               [info] 17E5009F: Cerebro token: cerebro-secret-cookie                                            ▒ █
 █▒▒               [info] <17E5009F.0.1011>: pipe process started                                                   ▒▒█
 █ ▒               [info] <17E5009F.0.1011>: pipe got message from <17E5009F.0.1011>: call_nmapit                   ▒ █
 █ █               [info] <17E5009F.0.1011>: sending message to nmapit process <87352B81.'pool'>                    █ █
 █ ▒               [info] 17E5009F: new connection with 'nmapit@localhost' (87352B81)                               ▒ █
 █▒▒                                                                                                              ¡ ▒▒█
 █ ▒                                                                                                             ▄█,▒ █
 █ █               A mágica está acontecendo:                                                                    °▀▀█ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               [info] <17E5009F.0.1011>: pipe got message from <17E5009F.0.1011>: call_nmapit                   ▒ █
 █ █                 -> Nosso pipe sendo solicitado                                                                 █ █
 █ ▒               [info] <17E5009F.0.1011>: sending message to nmapit process <87352B81.'pool'>                    ▒ █
 █▒▒                 -> Mandamos a mensagem para o outro nó, procurando pelo processo pool                          ▒▒█
 █ ▒               [info] 17E5009F: new connection with 'nmapit@localhost' (87352B81)                               ▒ █
 █ █                 -> O ergo mostra que a conexão foi estabelecida                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               Enquanto isso no lustre do castelo, lá no nmap it:                                               ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               terminal nmapit:                                                                                 █ █
 █ ▒                                                                                                                ▒ █
 █▒▒ ¡             [info] 87352B81: application 'app' (transient) started                                           ▒▒█
 █ ▒,█▄            [info] 87352B81: node 'nmapit@localhost'                                                         ▒ █
 █ █▀▀°            built with "Ergo Framework:3.1.0" successfully started                                           █ █
 █▒▒               [info] 87352B81: new connection with 'cerebro@localhost' (17E5009F)                              ▒▒█
 █ ▒               [info] <87352B81.0.1008>: nmap worker                                                            ▒ █
 █ █               [info] <87352B81.0.1008>: worker received message from <17E5009F.0.1011>                         █ █
 █ ▒               working...                                                                                       ▒ █
 █▒▒               [info] <87352B81.0.1006>: nmap worker                                                            ▒▒█
 █ ▒               [info] <87352B81.0.1006>: worker received message from <17E5009F.0.1011>,                        ▒ █
 █ █                working...                                                                                      █ █
 █ ▒               [info] <87352B81.0.1007>: nmap worker                                                            ▒ █
 █▒▒               [info] <87352B81.0.1007>: worker received message from <17E5009F.0.1011>,                        ▒▒█
 █ ▒                working...                                                                                      ▒ █
 █ █               [info] <87352B81.0.1007>: nmap worker                                                            █ █
 █ ▒               [info] <87352B81.0.1008>: nmap worker                                                            ▒ █
 █▒▒               [info] <87352B81.0.1008>: worker received message from <17E5009F.0.1011>,                      ¡ ▒▒█
 █ ▒                working...                                                                                   ▄█,▒ █
 █ █               [info] <87352B81.0.1007>: worker received message from <17E5009F.0.1011>,                     °▀▀█ █
 █▒▒                working...                                                                                      ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █                                                                                                                █ █
 █ ▒               [info] 87352B81: new connection with 'cerebro@localhost' (17E5009F)                              ▒ █
 █▒▒                 -> conexão estabelecida                                                                        ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               e em seguida os workers trabalhando...                                                           █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               Em um cenário onde temos o cerebro rodando em uma máquina ou replicado                           ▒▒█
 █ ▒               em um cluster k8s com 50 pods poderíamos chamar do nmap por exemplo                              ▒ █
 █ █               o armazenamento desse resultado dentro do worker:                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒ ¡             func (w *PoolWorker) HandleMessage(from gen.PID, message any) error {                            ▒▒█
 █ ▒,█▄            ... working in something funny                                                                   ▒ █
 █ █▀▀°                                                                                                             █ █
 █▒▒               resultMachine := gen.ProcessID{                                                                  ▒▒█
 █ ▒                 Name: "resultsWatcher",                                                                        ▒ █
 █ █                 Node: "nmapit@someip"                                                                          █ █
 █ ▒               }                                                                                                ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               w.Send(resultMachine, myPreciousPayload)                                                         ▒ █
 █ █                                                                                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               O resto fica a critério da sua criatividade... :)                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               ---                                                                                              █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               4 - Mensagem aos joviais                                                                       ¡ ▒▒█
 █ ▒               Como diria strauss nos seus artigos ácidos e atemporais: Para ser bom                         ▄█,▒ █
 █ █               programador você precisa entender o que uma função faz. Vc precisa                            °▀▀█ █
 █▒▒               saber o porque aquilo ali está ali...                                                            ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               Nós não podemos nos afastar da base das coisas. O pensamento crítico,                            █ █
 █ ▒               a cultura hacker nos provoca e nos coloca nesse caminho.                                         ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               Combata os bullshiteiros, exploda os ditadores e mostre do que um                                ▒ █
 █ █               cluster unido é capaz!                                                                           █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               phrack#72                                                                                        ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               en: The hacker ethos remains the same - be curious about your world, make do                     █ █
 █ ▒               with what you have, and show how things can be better.                                           ▒ █
 █▒▒ ¡                                                                                                              ▒▒█
 █ ▒,█▄            pt-br: O ethos hacker permanece o mesmo – seja curioso sobre o seu mundo, faça                   ▒ █
 █ █▀▀°            o melhor com o que você tem e mostre como as coisas podem ser melhores.                          █ █
 █▒▒                                                                                                                ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               Keep hacking :)!!!                                                                               █ █
 █ ▒                                                                                                                ▒ █
 █▒▒               5 - Agradecimentos                                                                               ▒▒█
 █ ▒               Um brinde a zine tr4m014 por incentivar e continuar a movimentar a cena hacker.                  ▒ █
 █ █               Abraço aos bsdgurus que não podem ter suas identidades reveladas.                                █ █
 █ ▒               Cumprimentos à p0cl4bs> rootkits (fins estudantis), network programming e                        ▒ █
 █▒▒               tudo que é malucão e diferente!                                                                  ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █               repo ref: https://github.com/girorme/cerebro-ergo-example                                        █ █
 █ ▒                                                                                                                ▒ █
 █▒▒                      meow                                                                                    ¡ ▒▒█
 █ ▒                /\_/\  /                                                                                     ▄█,▒ █
 █ █               ( o.o )                                                                                       °▀▀█ █
 █▒▒                > ^ <                                                                                           ▒▒█
 █ ▒                                                                                                                ▒ █
 █ █                By Rodrigo N4s                                                                                  █ █
 █ ▒                []'s                                                                                            ▒ █
 █▒▒                                                                                                                ▒▒█
 █ ▒               E0F                                                                                              ▒ █
 █ █                                                                                                                █ █
 █ ▒                                                                                                                ▒ █
 █▒▒▒▒▒ ░░                                                                                                    ▒▒▒▒▒▒▒▒█
 █ ▒                                                                                                                ▓▄█
 █ █                                    T R A M O I A   ·   Z I N E   ·  2 0 2 6                                 gld ██
  ▀▄▄▄▄                                                                                                          ▒▒▄▄▀