课程内容
docker-compose
yml的构成
1 | version: '3.9' # Compose 文件格式版本 |
实例&&作业
docker-compose搭建harbor

已经启动过了,这里就不演示启动了
思考&&todo
复习内容没写,累了,周五下午打游戏去了。
1 | version: '3.9' # Compose 文件格式版本 |

已经启动过了,这里就不演示启动了
复习内容没写,累了,周五下午打游戏去了。
id:: 67401618-77f2-4cd7-ab26-b033e352aa66
配置vsftpd服务,添加ftp服务用户lihua,并限制lihua使用ftp服务的访问路径为/usr/share/ftp_files



修改/etc/vsftpd/vsftpd_userlist

创建/etc/vsftpd/user_conf目录,并添加lihua配置文件




配置ssh服务,要求用户jack可以使用id_rsa 免密登录ssh
server: centos.pcx.home
client: kali.pcx.home




在centos端查看在线用户:

在centos端查看~/.ssh/authorized_keys

在kali上编写ufw防火墙规则,禁止kali连接任何机器的smb服务

连接测试

现有规则查看

新规则添加

sudo ufw deny out 139/tcp,445和139都要禁止
查看规则

重启

尝试连接

基于Dockerfile构建的镜像搭建一个容器,要求同时具有ssh服务与redis服务,基础镜像选择 centos/debian/ubuntu均可

这里拉过了,就不拉了
启动脚本
1 | !/bin/bash |


查看镜像

创建容器


测试ssh连接

测试redis连接

bridge
host
none
查看:docker network ls,docker network inspect NETWORK
创建:docker network create -d TYPE network_name
加入:docker network connect NETWORK CONTAINER [CONTAINERS]
在创建容器时使用--network 指定网络即可docker run --network NETWORK IMAGE
查看docker volume ls
创建docker volume create volume_name
删除docker volume rm VOLUME
在创建容器时使用-v指定即可docker run -v VOLUME:xxx IMAGE
不使用dockerfile,基于CONIANER的修改生成新的镜像
使用docker commit CONTAINER IMAGE
不推荐使用:
难以维护
不透明,无法得知修改了什么
FROM:指定基础镜像。
RUN:运行命令。
CMD 和 ENTRYPOINT:指定容器启动命令。
COPY 和 ADD:复制文件到镜像中。
WORKDIR:设置工作目录。
ENV:设置环境变量。
EXPOSE:声明端口。
VOLUME:定义挂载点。
LABEL:添加元数据。
docker build -t IMAGE docker_file_dirname
docker-compose.yml是docker-compose启动所需的配置文件。默认是这个,如果你要使用其他的请在运行时指定docker-compose up -f /path/to/your_yml
创建docker-compose up [options],常用的参数-d后台运行
启停docker-compose start/stop
删除docker-compose down
创建docker网络
1 | docker network create -d bridge my_self_bridge |

php-apache环境搭建

因拓展无法安装,后面这个我换成了
php:8.0-apache,后面发现不是php版本的问题。dvwa官方推荐7.3及以上
创建mysql数据库

这里无需进行映射端口,使用主机名(容器名)连接即可
创建结束后,我们查看该网络的信息
1 | docker network inspect my_self_bridge |

我们发现这两个container已经加入到网络中了
把dvwa源码扔到php的app目录

复制配置文件并修改

这里的db_server我们可以设置为dvwa-mysql(容器名)
修改完成后访问setup.php

发现没有mysqli拓展
php镜像官方提供了一个工具docker-php-ext-install用于安装拓展
1 | docker exec -it my-apache-php-app /bin/bash |
现在我们退出容器,重新启动容器

拉取ubuntu镜像

创建一个ubuntu容器,并在后台运行

将kitten可执行文件上传

将镜像提交

根据刚创建的镜像开启一个新的容器,查看/bin下是否有kitten


dockerbuild文件编写
1 | FROM python:3.8 |
关于参数传递,可以使用,run的参数传递,环境变量,配置文件等

创建镜像docker build -t IMAGE:TAG .
运行docker run IMAGE args
DONE dockerfile编写
centos安装docker以及docker-compose | ziWindlu的博客
使用apt包管理器的发行版
1 | 添加公钥 |
特殊的,如果你使用的kalilinux,那么在添加仓库这一步需要将
"$(. /etc/os-release && echo "$VERSION_CODENAME")"替换为buster
方案1使用sudo无需输入密码
编辑你的sudoers
user_name ALL=(root:root) NOPASSWD: /bin/docker
这样你就可以愉快的sudo docker啦
方案2加入docker用户组(好用,推荐)
1 | usermod -aG docker $USER |
这样你就可以愉快的使用docker啦,不用使用sudo哦
编辑/etc/docker/daemon.json配置docker的代理
1 | { |
重启docker
1 | systemctl daemon-reload |
容器(CONTAINER)、镜像(IMAGE)
搜索镜像docker search IMAGE
拉取镜像docker pull IMAGE
docker run [options] IMAGE [command [args]]
| 参数 | 说明 | 举例 |
|---|---|---|
-d |
以守护程序运行(后台运行) | |
-v |
创建挂载绑定 | docker run -v /host/path:/container/path IMAGE |
-p |
端口映射 | docker run -p host_port:container_port IMAGE |
--name |
指定容器名 | docker -run --name container_name IMAGE |
--restart |
重启策略 | 常用的always,no |
-e |
设置环境变量 | docker run -e ENV_KEY="env_value" IMAGE |
--rm |
容器退出后删除 | docker run --rm busybox ping baidu.com |
docker update [options] CONTAINER [CONTAINERS]
删除容器docker rm CONTAINER
删除镜像docker rmi IMAGE
镜像
打包:docker save -o xx.tar IMAGE
导入:docker load -i xx.tar
容器
打包:docker export -o xx.tar CONTAINER
导入:docker import xx.tar IMAGE
TODO [[docker网络]]
docker logs -f CONTAINER
step1:将kitten可执行文件放到docker的/bin或其他可执行目录中
step2:接下来愉快的执行docker exec -it container_name kitten run-shell --shell=/path/to/shell啦
在dockerhub中搜索ngnix

我们使用官方镜像

nginx文档给出了一个简单的命令

在目录下创建一个index.html
{:height 132, :width 687}
访问localhost:8080

id:: 673d78e0-9c74-47bd-b3eb-5f9e34550dff
拉取lamp
docker pull mattrayner/lamp:latest-1804

启动容器
docker run -p "80:80" -v ${PWD}/app:/app mattrayner/lamp:latest-1804

我们发现了mysql的密码

下一步我们要修改mysql密码,我们直接使用phpmyadmin,账号为admin,密码为mysql的密码


下载dvwa源码并传到目标服务器

解压并复制一份dvwa配置


修改dvwa数据库配置

在网页端初始化dvwa


iptables(基于netfilter)
nftables(iptables的后继,现代化的防火墙)
ufw(基于iptables)
firewalld
四表(table):Filter表、NAT表、Mangle表、Raw表
五链(chain):PREROUTING链、INPUT链、FORWARD链、OUTPUT链、POSTROUTING链
匹配条件:
指定规则适用的数据包类型(如源地址、目标地址、协议等)。
IP 地址:-s 192.168.1.1(源地址)或 -d 10.0.0.1(目标地址)。
协议:-p tcp。
端口:–dport 22(目标端口)或 –sport 80(源端口)。
动作(Action):
定义数据包被匹配后执行的操作。
常见动作:
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包。
REJECT:拒绝数据包并返回响应。
LOG:记录数据包信息到日志中。
便捷的规则书写
多个ip
指定某个网络:iptables -A INPUT -s 192.168.1.1,192.168.1.0/24 -j ACCEPT
指定多个非连续ip:iptables -A INPUT -s 192.168.1.1,192.168.1.2,192.168.1.3 -j ACCEPT
指定多个连续ip:sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.120 -j ACCEPT
多个端口
使用,指定多个端口:-m multiport,iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
使用:指定多个端口:,iptables -A INPUT -p tcp --dport 1000:2000 -j ACCEPT
从上到下逐行匹配,第一条匹配成功后立即停止检查后续规则
因此,规则匹配的顺序应从具体到通用,特例优先,全局策略后置。
systemctl start/stop iptables
查看规则iptables -t [table] -L [chain] [options]
常用参数:
| 参数 | 说明 | 举例 |
|---|---|---|
-n |
numeric,显示数字ip和端口 | |
-v |
verbose,冗长的信息 | |
--line-number |
列出规则时在每一行添加数字(这个数字在删除时有帮助) |
iptables -t [table] -A [chain] [match] -j [action]
iptables -t [table] -D [chain]
table默认为filter
保存iptables-save > file
加载iptables-restore < file
自动导入:写一个开机自启脚本,使用 iptables-persistent
systemctl start/stop/restart ufw
ufw enable/disable/reload
状态查看:
systemctl status ufw
ufw status
ufw status [numberd] [verbose]
ufw action args
action:allow,reject,deny,limit
简单的args:
端口号/协议port[/protocol]
服务名service,example:samba,ftp,mysql
注意这里的mysql等服务都是默认的端口,如果你改了对应服务的端口,这里不会生效
指定出入方向
ufw allow out 22
值得注意的,如果没有指定方向那么方向默认为in
指定出入ip,协议,端口
ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 25
from:原ip,to 目的ip
指定网卡
ufw deny on interface proto tcp
一些方便的写法
any所有的ip
ufw delete add_thing
add_thing为你添加时输入的内容
ufw默认就是永久保存,无需做其他操作
systemctl start/stop/restart firewalld
firewall-cmd --list-all
firewall-cmd --add-xx args
example:
添加http服务放行firewall-cmd --add-service http
添加tcp88端口放行firewall-cmd --add-port 88/tcp
如果想要添加永久规则,需要添加参数
--permanent,例如firewall-cmd --permanent --add-service http,让其生效需要执行firewall-cmd --reload
firewall-cmd --remove-xx args
example:
删除服务规则firewall-cmd --remove-service service_name
应急模式firewall-cmd --panic-on/off
强制访问控制,为linux提供了细粒度的安全控制。
临时关闭
setenforce 0
永久关闭
编辑/etc/selinux/config
修改SELINUX为disableSELINUX=disabled
规则添加前,ping kali

添加规则

规则添加后,ping kali

未配置的情况

添加防火墙规则

配置后的情况

在pcx.z.home开启一个8000端口的http服务

访问正常

配置防火墙策略

配置后的情况

配置防火墙策略iptables -I OUTPUT -o interface_name -p icmp -j DROP
验证ping -I interface host
配置前

假装连不上
配置防火墙规则

连接成功

DONE kitty+zsh补全显示异常问题解决
kali的zsh配置的问题,我们自己配置就不会有这个问题了
man ufw
man iptables
服务sshd,端口22,配置文件:/etc/ssh/sshd_config,重要的相关文件~/.ssh/authorized_keys
服务cronie等,重要的相关文件/etc/crontab,/var/spool/cron/username
安装:yum install samba
archlinux下samba服务搭建 | ziWindlu的博客
端口445,139
配置文件:/etc/samba/smb.conf
smb用户管理:pdbedit
smbclient连接smbsmbclient --user username //host/share_name
挂载mount -t cifs -o username=user_name,password=passwd //host/share_name /local_mount_point
对于linux挂载需要安装
cifs-utils
win(net use)命令行挂载net use \\host\share_name password /user:user_name
windows的安全策略
防火墙默认组织smb连接
杀毒软件默认阻止smb连接
历史漏洞
ms17010(永恒之蓝)
CVE-2017-7494
安装:yum install vsftpd
端口:
配置文件:/etc/vsftpd/vsftpd.conf
常见配置
1 | # 匿名用户关闭 |
多用户列表配置
使用pam
auth required pam_listfile.so item=user sense=allow file=/etc/vsftpd/allow_list2 onerr=fail
ftp客户端ftp host
挂载mount -t fuse.curlftpfs ftp://user_name:password@host /mnt_point
id:: 673af920-f628-4041-8bdb-9821d32774c0
对于linux挂载需要安装
curlftpfs
linux默认会有对vsftp的安全配置,比如禁止root用户登陆
清华源
1 | pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple some-package |
1 | python -m pyftpdlib -u user_name -P password -p port --write |


/etc/vsftpd/vsftpd.conf主配置文件
1 | anonymous_enable=NO |
/etc/vsftpd/vsftpd.userlist配置文件编写
1 | root |
在vsftpd安装后,linux会在/etc/pam.d/vsftpd添加相关安全策略

修改/etc/vsftpd/ftpusers将里面的root删除,或者把这条策略删除
现在你就可以愉快的连接了

服务端

客户端

dvwa搭建过很多次了,这次准备0开始搭建一次。本文将会从一台centos裸机开始,搭建出dvwa靶场。
为了简化部分服务的枯燥安装,且复合中国特色,本文会使用bt面板。官方推荐XAMPP
前排提醒:本文有点抽象,在意的集美集帅们请轻按键盘上的ctrl+w
后记:
搭到一半,bt默认有些安全措施,导致dvwa初始化出现了各种问题。枯啦😥,越写越抽象,心态崩了。55555
没有使用pve的同志可以跳到centos的安装部分,使用vps或者实体鸡的大佬可以直接跳过了
虚拟机创建



以上是基本配置,部分简单的操作这里就不截图了
我们在安装时就将网卡配置好,免得后面再手动配置

配置root密码

为了更快捷的连接我们的dvwa主机,对自己电脑中的ssh进行配置。记得上传公钥

这样就可以使用ssh dvwa愉快的连接辣
如果你对ssh配置不感兴趣,这一步你可以跳过
前排提醒:安装前你无需对centos进行任何操作,宝塔安装脚本会帮你换源。你也无需担心找不到curl命令。即使是最小安装的centos,curl命令也是会有的。

id:: 6737337b-8018-4a31-b213-7fafa9020684
复制连接,粘贴到终端中运行
1 | url=https://download.bt.cn/install/install_lts.sh;if [ -f /usr/bin/curl ];then curl -sSO $url;else wget -O install_lts.sh $url;fi;bash install_lts.sh ed8484bec |

输入y确定
接下来就是等待

出现这个说明你已经成功安装了bt,接下就去愉快的安装lnmp吧
这个信息建议保存,不保存的话忘记了也能重置
使用浏览器进入面板地址
登陆成功后bt会让你绑定账号

老老实实绑定吧骚年

当你绑定完成账号后,bt就热情的推荐你安装lnmp,直接无脑一键安装
这个步骤有点慢,这个时候你可以去下载dvwa的源码
友情提示: php版本请使用7.3以上,dvwa在7.3以下有问题。
本文采用源码安装,dvwa提供了安装脚本,也有docker镜像。但是俺不得,就用源码装。
gayhub下载地址
Releases · digininja/DVWA · GitHub
这一步有n种方法传上去,这里我们使用bt自带的文件管理上传

解压缩

添加站点

域名这里我们写自己的ip地址,根目录选择解压后的dvwa的目录。
创建一个数据库,为了方便账号密码这里使用的是dvwa配置文件中默认的。如果你想要个性化,后面还需要修改dvwa对应的配置文件。

访问http://192.168.0.124
这里要替换成你的ip啊!!!! 😠
不出意外,你的dvwa就可以正常使用了
如果有意外(实际上根据上面的教程来百分百会出意外😁),请参考: 可能会遇到的问题

先不要着急点击创建数据库,看到红色的没有。请先解决。参考: 可能会遇到的问题
bt是作为建站使用的,会默认禁用很多php的危险函数,首先我们要先对这些危险函数放行。参考: 可能会遇到的问题

当红字都解决了,你就可以愉快的点击Create / Reset Database按钮辣😁
这个时候你可能会狂点,发现它好像不起作用。不要点辣,重新访问一下login.php试试

现在你可以,dvwa启动了
具体情况是这样
1 | Another app is currently holding the yum lock; waiting for it to exit... |
这是脚本在安装其他软件,我这个状态是sleeping,可以先给他停止了,虽然不知道会出什么问题..
比较稳妥的方法,使用ps看看是他在干什么
1 | ps -elf | grep 9557 |
以我的这个为例,yum正在安装polkit,等会脚本结束如果没有这个软件,我再手动给他装上就行了
DVWA System error config file not found. Copy
config/config.inc.php.dist to config/config.inc.php and configure to
your environment.

字面意思,按照他教你的方法做,将config/config.inc.php.dist 拷贝一份到config/config.inc.php
你可以用bt的文件管理来做这件事情

选择你建站时使用的php版本。
我有这么多php,是因为踩了很多坑,挨个都尝试了一遍 😢

拿起你的鼠标挨个删除吧
其实可能有更简便的方法来删除,但是我已经挨个点完了,所以你也要点🤓
你的红字可能不一样,这里仅介绍将Disabled的红字变成绿色的Enabled


仍然选择你对应的版本


搜索你对应的红色字的东西,把它后面的Off改成On


改完之后重启PHP,重启中间件
如果仍然是红的,那么请修改dvwa根目录下的php.ini

这个是验证码靶场用的,需要去咕噜咕噜申请验证码的key,不使用这个靶场可以忽略。🪿且咱们搭建在内网,没法申请这个key。如果你搭建在公网上,请自行参考dvwa文档
宝塔面板 简单好用的Linux/Windows服务器运维管理面板
Releases · digininja/DVWA · GitHub
nat,bridge,host-only
tree -L 1 /获取根目录结构
每个目录的作用
查看文件: ls
查看文件内容: cat,more,tail,head,其他的文件编辑器
修改文件: cp,mv,rm,rmdir
创建文件: mkdir,touch
查看网卡信息: ip,ifconfig
查看网络连接情况:netstat
修改网卡信息: nmtui,配置文件修改
redhat
/etc/sysconfig/network-script/ifcf-xxx
debain/etc/network/interfaces
查看进程: ps,top
进程管理: kill,top
修改权限: chmod
修改所属用户和组: chown
相关配置文件:/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow
创建: useradd,groupadd
修改: usermod,groupmod
删除: userdel,groupdel
切换用户: su
grep
find
find
whereis
打包解包:tar
压缩解压缩:zip,unzip
crontab
/etc/passwd
1 | 用户名:密码占位符:用户ID:组ID:用户全名:用户主目录:用户默认shell |
/etc/shadow
1 | 用户名:加密密码:最后修改密码的日期:最小密码年龄:最大密码年龄:警告期:不活动期:过期日期:保留字段 |
/etc/group/etc/gshadow
cat /etc/os-release查看系统相关信息
uname -a查看内核版本
工具
neofetch(已归档)
fastfetch(推荐)
bt.cn
开启自启动,并现在开启服务systemctl enable --now sshd
关闭开机自启动,并现在关闭服务systemctl disable --now sshd
修改配置文件,并令其生效
1 | systemctl daemon-reload |
ssh user@host连接
ssh-keygen生成公私钥对
ssh-copy-id -i /path/to/public user@host上传公钥
ssh上传公钥手动上传+命令上传 | ziWindlu的博客
对于ssh服务端的配置文件在/etc/ssh/sshd_config
几个重要的配置
1 | 允许root用户登陆 |
系统计划任务/etc/crontab
用户计划任务/var/spool/cron/username
查看(l)用户(u)的计划任务crontab -l -u username
编辑(e)用户(u)的计划任务crontab -e -u username


为用户lzf创建一个定时任务

asciinema不支持显示edit-in-kitty,以后需要避免使用
kitty仅可在显式的使用ssh连接的用户中使用edit-in-kitty,切换用户后
DONE 让kali的zsh支持c-p,c-n作为上和下键来使用
ssh-keygen
该命令会生成一个私钥和公钥在~/.ssh下
~/.ssh/authorized_keys将你的公钥内容复制到远程主机的这个文件中即可,多个要分多行

ssh-copy-id -i /your/public/key.pub username@host命令上传公钥