#!/bin/bash
==========================================
CentOS 7/8 一键搭建 Pikachu 靶场(完整修复版)
适配 EOL 系统、自动修复源、稳定配 DNS、防 Apache 冲突
==========================================
set -e
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "{GREEN}\[0/11\] 检查 root 权限...{NC}"
if [ "$EUID" -ne 0 ]; then
echo -e "{RED}请用 sudo 或 root 用户执行{NC}"
exit 1
fi
判断系统版本
if [ -f /etc/os-release ]; then
. /etc/os-release
VER=$VERSION_ID
else
echo -e "{RED}无法识别系统版本{NC}"
exit 1
fi
echo -e "{GREEN}\[1/11\] 配置 DNS(nmcli 方式,不崩网络)...{NC}"
if systemctl is-active NetworkManager >/dev/null 2>&1; then
nmcli connection modify ens33 ipv4.dns "223.5.5.5 119.29.29.29" 2>/dev/null || true
nmcli connection modify ens33 ipv4.ignore-auto-dns yes 2>/dev/null || true
nmcli connection up ens33 2>/dev/null || true
echo -e "{GREEN}DNS 已通过 nmcli 写入 ens33{NC}"
else
echo "nameserver 223.5.5.5" > /etc/resolv.conf
echo "nameserver 119.29.29.29" >> /etc/resolv.conf
echo -e "{YELLOW}NetworkManager 未运行,已写入 /etc/resolv.conf{NC}"
fi
echo -e "{GREEN}当前 DNS:{NC}"
grep "^nameserver" /etc/resolv.conf | head -3
echo ""
echo -e "{GREEN}\[2/11\] 修复 YUM 源(CentOS 7 EOL 切换 vault/阿里云)...{NC}"
mkdir -p /etc/yum.repos.d/bak
cp /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ 2>/dev/null || true
if [[ "$VER" == 7* ]]; then
CentOS 7 已停止维护,切阿里云源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 2>/dev/null || \
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 2>/dev/null || true
同时安装 epel
yum install -y epel-release 2>/dev/null || \
rpm -Uvh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm 2>/dev/null || true
yum clean all
yum makecache
PKG_MGR="yum"
elif [[ "$VER" == 8* ]]; then
dnf install -y epel-release
dnf clean all
dnf makecache
PKG_MGR="dnf"
else
PKG_MGR="yum"
yum clean all
yum makecache
fi
echo -e "{GREEN}\[3/11\] 安装 LAMP + 工具...{NC}"
$PKG_MGR install -y -q httpd mariadb-server mariadb \
php php-mysqlnd php-gd php-mbstring php-xml php-json \
git wget unzip curl
echo -e "{GREEN}\[4/11\] 启动并启用服务...{NC}"
systemctl start httpd 2>/dev/null || true
systemctl start mariadb 2>/dev/null || true
systemctl enable httpd >/dev/null 2>&1
systemctl enable mariadb >/dev/null 2>&1
echo -e "{GREEN}\[5/11\] 初始化 MariaDB...{NC}"
DB_NAME="pikachu"
DB_USER="pikachu"
DB_PASS="pikachu123"
ROOT_PASS="root123"
给 root 设密码(如果还没设)
mysqladmin -u root password "$ROOT_PASS" 2>/dev/null || true
创建库和用户
mysql -u root -p"$ROOT_PASS" -e "
CREATE DATABASE IF NOT EXISTS ${DB_NAME} DEFAULT CHARACTER SET utf8mb4;
CREATE USER IF NOT EXISTS '{DB_USER}'@'localhost' IDENTIFIED BY '{DB_PASS}';
GRANT ALL PRIVILEGES ON {DB_NAME}.\* TO '{DB_USER}'@'localhost';
FLUSH PRIVILEGES;
" 2>/dev/null || {
echo -e "{RED}数据库配置失败,请检查 MariaDB 是否已启动{NC}"
exit 1
}
echo -e "{GREEN}\[6/11\] 下载 Pikachu 源码...{NC}"
cd /var/www/html
rm -rf pikachu
先尝试 git,失败则用 wget 下载 zip(GitHub 可能被墙)
if git clone https://github.com/zhuifengshaonianhanlu/pikachu.git 2>/dev/null; then
echo -e "{GREEN}通过 git clone 下载成功{NC}"
else
echo -e "{YELLOW}git 失败,改用 wget 下载 zip...{NC}"
wget -q https://github.com/zhuifengshaonianhanlu/pikachu/archive/refs/heads/master.zip -O pikachu.zip
unzip -q -o pikachu.zip
mv pikachu-master pikachu
rm -f pikachu.zip
echo -e "{GREEN}通过 wget 下载并解压成功{NC}"
fi
echo -e "{GREEN}\[7/11\] 配置数据库连接...{NC}"
cd /var/www/html/pikachu
if [ -f "inc/config.inc.php.dist" ]; then
cp inc/config.inc.php.dist inc/config.inc.php
else
mkdir -p inc
fi
确保配置文件存在且内容正确
cat > inc/config.inc.php << EOF
<?php
define('DBHOST', '127.0.0.1');
define('DBUSER', '${DB_USER}');
define('DBPW', '${DB_PASS}');
define('DBNAME', '${DB_NAME}');
define('DBPORT', '3306');
?>
EOF
echo -e "{GREEN}\[8/11\] 修复 Apache 配置(防端口冲突 + 监听所有网卡)...{NC}"
HTTPD_CONF="/etc/httpd/conf/httpd.conf"
备份
cp "HTTPD_CONF" "{HTTPD_CONF}.bak.$(date +%s)" 2>/dev/null || true
清理所有 Listen 行,只留一条干净的
sed -i '/^Listen/d' "$HTTPD_CONF"
echo "Listen 80" >> "$HTTPD_CONF"
加 ServerName 消除启动警告
if ! grep -q "^ServerName" "$HTTPD_CONF"; then
echo "ServerName localhost:80" >> "$HTTPD_CONF"
fi
确保没有 127.0.0.1 限定
sed -i 's/^Listen 127.0.0.1:80/Listen 80/g' "$HTTPD_CONF" 2>/dev/null || true
echo -e "{GREEN}\[9/11\] 权限、防火墙、SELinux...{NC}"
chown -R apache:apache /var/www/html/pikachu
chmod -R 755 /var/www/html/pikachu
if command -v firewall-cmd &> /dev/null; then
firewall-cmd --permanent --add-service=http >/dev/null 2>&1 || true
firewall-cmd --reload >/dev/null 2>&1 || true
fi
SELinux 临时关闭 + 永久关闭
setenforce 0 2>/dev/null || true
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 2>/dev/null || true
echo -e "{GREEN}\[10/11\] 重启 Apache...{NC}"
先杀掉可能残留的 httpd(防端口占用)
pkill -9 httpd 2>/dev/null || true
sleep 1
systemctl restart httpd
echo -e "{GREEN}\[11/11\] 验证...{NC}"
HTTP_STATUS=$(systemctl is-active httpd)
LISTEN_RESULT=$(ss -tlnp 2>/dev/null | grep :80 || true)
echo "Apache 状态: $HTTP_STATUS"
echo "端口监听: $LISTEN_RESULT"
if [ "HTTP_STATUS" = "active" \] \&\& echo "LISTEN_RESULT" | grep -q ":80"; then
IP_ADDR=(ip route get 1 2\>/dev/null \| awk '{print 7; exit}' || hostname -I | awk '{print $1}')
echo ""
echo -e "{GREEN}========================================{NC}"
echo -e "{GREEN} Pikachu 安装完成!{NC}"
echo -e "{GREEN}========================================{NC}"
echo -e " 初始化地址: {GREEN}http://{IP_ADDR}/pikachu/install.php${NC}"
echo -e " 访问地址: {GREEN}http://{IP_ADDR}/pikachu${NC}"
echo -e " 数据库: {GREEN}{DB_NAME} / {DB_USER} / {DB_PASS}${NC}"
echo -e "{GREEN}========================================{NC}"
echo ""
echo "【下一步】虚拟机 Snort 联调:"
echo " 1. 虚拟机设为'桥接模式'"
echo " 2. 物理机浏览器访问 http://${IP_ADDR}/pikachu"
echo " 3. 不要用 127.0.0.1,必须用上面的局域网 IP"
else
echo -e "{RED}Apache 启动异常,请检查 /var/log/httpd/error_log{NC}"
exit 1
fi