
Un serveur C2 POC et un agent pour explorer si/comment la blockchain Ethereum peut être utilisée pour du C2.
BlockchainC2 est un petit serveur/agent POC visant à évaluer comment la Blockchain (plus précisément la fonctionnalité de Smart Contract d'Ethereum) peut être utilisée par un attaquant pour du C2.
Les détails concernant cette application sont disponibles ici.
Le Smart Contract utilisé dans ce POC est assez simple :
pragma solidity ^0.5.0;
contract EventC2 {
address owner;
event _ServerData(bool f, bool enc, int seq, string agentID, string data);
event _ClientData(bool f, bool enc, int seq, string agentID, string data);
constructor() public {
owner = msg.sender;
}
function AddClientData(string memory agentID, string memory d, int id, bool f, bool enc) public {
emit _ClientData(f, enc, id, agentID, d);
}
function AddServerData(string memory agentID, string memory d, int id, bool f, bool enc) public {
emit _ServerData(f, enc, id, agentID, d);
}
}
L'objectif de ce code Solidity est de transmettre des événements entre un serveur et plusieurs clients sous forme d'événements.
BlockchainC2 a été conçu pour fonctionner sur MacOS/Linux, mais l'agent peut être compilé pour s'exécuter sur MacOS, Windows ou Linux.
Pour compiler sur MacOS avec brew :
# Installer solidity et ethereum
brew tap ethereum/ethereum
brew install ethereum
brew install solidity
# Compilation
make all
Pour compiler sur Ubuntu :
# Installer solidity et ethereum
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc ethereum
# Compilation
make all
Pour effectuer une compilation croisée d'un agent pour Windows :
CGO_ENABLED=1 CC="x86_64-w64-mingw32-gcc" GOOS=windows go build blockchainc2/cmd/bc2agent
Vous aurez besoin de configurer un compte pouvant être utilisé par le composant serveur. Le moyen le plus simple de le faire est d'utiliser geth :
geth account new --keystore /tmp/mykeystore/
cat /tmp/mykeystore/*
De l'Ether peut être ajouté à votre portefeuille sur le testnet Ropsten en utilisant https://faucet.ropsten.be/.
Ajoutez le trousseau à votre config.json, par exemple :
{
"Key": "{\"address\":\"ADDRESS\",\"crypto\":{\"cipher\":\"aes-128-ctr\",\"ciphertext\":\"CT\",\"cipherparams\":{\"iv\":\"IV\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"06470fcc2121994e014f85e5ab9cdb3714c76b873a1f1186c3e623e87abc4a7a\"},\"mac\":\"SALT\"},\"id\":\"ID\",\"version\":3}",
"Endpoint": "wss://ropsten.infura.io/_ws",
"ContractAddress": "TODO_VIA_SETUP",
"GasPrice": 0
}
Pour déployer un contrat en utilisant bc2server :
./bin/bc2server -config ./config.json -pass Passw0rd -setup
Une fois le contrat déployé, ajoutez l'adresse à votre config.json et démarrez le serveur avec :
./bin/bc2server -config ./config.json -pass Passw0rd
Avec le serveur en cours d'exécution, les agents peuvent être attachés en utilisant :
./bin/bc2agent -config ./agent_config.json -pass Passw0rd
Il est recommandé d'utiliser un compte fraîchement créé pour un agent afin d'éviter les erreurs liées aux transactions en attente.