Skip to content

Commit 7a586da

Browse files
committed
feat(install): add optional EvilClaw integration to install.sh
Add two-phase EvilClaw setup: download binary before server start, then generate listener cert + config + systemd service after server is running. Interactive prompt lets users opt in; non-interactive mode skips automatically.
1 parent 0a1fdd6 commit 7a586da

1 file changed

Lines changed: 128 additions & 1 deletion

File tree

install.sh

Lines changed: 128 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,127 @@ install_malefic(){
189189
install_resources
190190
}
191191

192+
# install evilclaw (optional)
193+
install_evilclaw(){
194+
if [[ -t 0 ]]; then
195+
while true; do
196+
read -p "Do you want to install EvilClaw (LLM Agent C2 Bridge)? [y/n] " install_ec
197+
install_ec=${install_ec,,}
198+
if [[ "$install_ec" == "y" || "$install_ec" == "yes" ]]; then
199+
break
200+
elif [[ "$install_ec" == "n" || "$install_ec" == "no" ]]; then
201+
log_task_status "completed" "EvilClaw installation skipped"
202+
return
203+
else
204+
echo "Invalid input, please enter y(yes) or n(no)."
205+
fi
206+
done
207+
else
208+
log_task_status "completed" "No interactive shell detected. Skipping EvilClaw installation."
209+
return
210+
fi
211+
212+
local EVILCLAW_VERSION=${EVILCLAW_VERSION:="v0.1.0"}
213+
local EVILCLAW_DIR="$IoM_ROOT_DIR/evilclaw"
214+
local EVILCLAW_RELEASES_URL="https://github.com/chainreactors/EvilClaw/releases/download/$EVILCLAW_VERSION"
215+
216+
mkdir -p "$EVILCLAW_DIR"
217+
pushd "$EVILCLAW_DIR"
218+
219+
log_task_status "in_progress" "Downloading EvilClaw..."
220+
download_file "$EVILCLAW_RELEASES_URL/evilclaw_linux_amd64.tar.gz" "evilclaw.tar.gz"
221+
tar -xzf evilclaw.tar.gz
222+
rm -f evilclaw.tar.gz
223+
chmod +x evilclaw
224+
popd
225+
226+
INSTALL_EVILCLAW=true
227+
log_task_status "completed" "EvilClaw downloaded successfully"
228+
}
229+
230+
# setup evilclaw after server is running
231+
setup_evilclaw(){
232+
if [ "$INSTALL_EVILCLAW" != "true" ]; then
233+
return
234+
fi
235+
236+
local EVILCLAW_DIR="$IoM_ROOT_DIR/evilclaw"
237+
local SERVER_DIR="$IoM_ROOT_DIR/malice-network"
238+
local AUTH_FILE="$EVILCLAW_DIR/evilclaw.auth"
239+
240+
# wait for server to be ready
241+
log_task_status "in_progress" "Waiting for malice-network server to start..."
242+
for i in $(seq 1 30); do
243+
if "$SERVER_DIR/malice_network_linux_amd64" listener list &>/dev/null; then
244+
break
245+
fi
246+
sleep 2
247+
done
248+
249+
# generate listener auth for evilclaw
250+
log_task_status "in_progress" "Generating EvilClaw listener certificate..."
251+
pushd "$SERVER_DIR"
252+
./malice_network_linux_amd64 listener add evilclaw
253+
mv evilclaw.auth "$AUTH_FILE"
254+
popd
255+
log_task_status "completed" "Listener certificate generated"
256+
257+
# generate minimal config.yaml
258+
cat > "$EVILCLAW_DIR/config.yaml" <<-EOFCFG
259+
host: "127.0.0.1"
260+
port: 8317
261+
262+
api-keys:
263+
- "changeme"
264+
265+
c2-bridge:
266+
enable: true
267+
auth-file: "$AUTH_FILE"
268+
listener-name: "evilclaw"
269+
listener-ip: "$ip_address"
270+
pipeline-name: "llm-pipeline"
271+
EOFCFG
272+
log_task_status "completed" "EvilClaw config generated at $EVILCLAW_DIR/config.yaml"
273+
274+
# create systemd service
275+
local LOG_DIR="/var/log/evilclaw"
276+
mkdir -p "$LOG_DIR"
277+
chmod 755 "$LOG_DIR"
278+
cat > /etc/systemd/system/evilclaw.service <<-EOF
279+
[Unit]
280+
Description=EvilClaw LLM Agent C2 Bridge
281+
After=malice-network.service
282+
Requires=malice-network.service
283+
284+
[Service]
285+
WorkingDirectory=$EVILCLAW_DIR
286+
Restart=always
287+
RestartSec=5
288+
User=root
289+
ExecStart=$EVILCLAW_DIR/evilclaw
290+
291+
StandardOutput=append:$LOG_DIR/debug.log
292+
StandardError=append:$LOG_DIR/error.log
293+
294+
[Install]
295+
WantedBy=multi-user.target
296+
EOF
297+
298+
chown root:root /etc/systemd/system/evilclaw.service
299+
chmod 600 /etc/systemd/system/evilclaw.service
300+
systemctl daemon-reload
301+
systemctl enable evilclaw
302+
systemctl start evilclaw
303+
304+
log_task_status "in_progress" "EvilClaw config : $EVILCLAW_DIR/config.yaml"
305+
log_task_status "in_progress" "EvilClaw log : $LOG_DIR/debug.log"
306+
log_task_status "completed" "EvilClaw service started successfully!"
307+
echo ""
308+
echo " NOTE: Edit $EVILCLAW_DIR/config.yaml to add your LLM API keys."
309+
echo " EvilClaw supports hot reload — no restart needed after editing."
310+
echo ""
311+
}
312+
192313
create_systemd_service(){
193314
local SERVER_FILE="${IoM_ROOT_DIR}/malice-network/malice_network_linux_amd64"
194315
local LOG_DIR="/var/log/malice-network"
@@ -234,13 +355,19 @@ if [[ "$EUID" -ne 0 ]]; then
234355
exit 1
235356
fi
236357

358+
INSTALL_EVILCLAW=false
359+
237360
# --- get Ip ---
238361
setup_environment
239362
# --- Install Malice Network ---
240363
install_malice_network
241364
# --- Install Malefic ---
242365
install_malefic
366+
# --- Install EvilClaw (optional) ---
367+
install_evilclaw
243368
# --- Install Docker if not installed ---
244369
check_and_install_docker
245370
# --- Create systemd service ---
246-
create_systemd_service
371+
create_systemd_service
372+
# --- Setup EvilClaw (after server starts) ---
373+
setup_evilclaw

0 commit comments

Comments
 (0)