week3_kls_exam

题目1

编写shell脚本,能够对指定IP地址段进行icmp探测扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
# 检查是否传入了 CIDR 格式的网段
if [ -z "$1" ]; then
echo "用法: $0 <CIDR格式网段>"
echo "例如: $0 192.168.0.0/24"
exit 1
fi
# 获取网段和掩码
CIDR=$1
# 将 CIDR 格式分解为网络地址和子网掩码
NETWORK=$(echo $CIDR | cut -d'/' -f1)
NETMASK=$(echo $CIDR | cut -d'/' -f2)
# 将网络地址转为十进制
ip_to_decimal() {
local IFS=.
read -r i1 i2 i3 i4 <<< "$1"
echo $(( (i1 << 24) + (i2 << 16) + (i3 << 8) + i4 ))
}
# 将十进制地址转为点分十进制
decimal_to_ip() {
local ip=$1
echo "$(( (ip >> 24) & 255 )).$(( (ip >> 16) & 255 )).$(( (ip >> 8) & 255 )).$(( ip & 255 ))"
}
# 计算起始 IP 和结束 IP
start_ip=$(ip_to_decimal $NETWORK)
end_ip=$((start_ip + (1 << (32 - NETMASK)) - 1))
echo "正在扫描网段 $CIDR ..."
# 循环扫描每个 IP
for ip in $(seq $start_ip $end_ip); do
target=$(decimal_to_ip $ip)
# 使用 ping 检查是否在线 (-c 1 表示发送 1 个包, -W 1 表示超时时间 1 秒)
ping -c 1 -W 1 $target &> /dev/null
if [ $? -eq 0 ]; then
echo "发现活动主机: $target"
fi
done
echo "扫描完成!"

运行

image.png

题目2

编写shell脚本,探测指定IP地址段有哪些计算机开启了80(HTTP)端口

本题对题目1稍加修改即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
# 检查是否传入了 CIDR 格式的网段
if [ -z "$1" ]; then
echo "用法: $0 <CIDR格式网段>"
echo "例如: $0 192.168.0.0/24"
exit 1
fi
# 获取网段和掩码
CIDR=$1
# 将 CIDR 格式分解为网络地址和子网掩码
NETWORK=$(echo $CIDR | cut -d'/' -f1)
NETMASK=$(echo $CIDR | cut -d'/' -f2)
# 将网络地址转为十进制
ip_to_decimal() {
local IFS=.
read -r i1 i2 i3 i4 <<< "$1"
echo $(( (i1 << 24) + (i2 << 16) + (i3 << 8) + i4 ))
}
# 将十进制地址转为点分十进制
decimal_to_ip() {
local ip=$1
echo "$(( (ip >> 24) & 255 )).$(( (ip >> 16) & 255 )).$(( (ip >> 8) & 255 )).$(( ip & 255 ))"
}
# 计算起始 IP 和结束 IP
start_ip=$(ip_to_decimal $NETWORK)
end_ip=$((start_ip + (1 << (32 - NETMASK)) - 1))
echo "正在扫描网段 $CIDR ..."
# 循环扫描每个 IP
for ip in $(seq $start_ip $end_ip); do
target=$(decimal_to_ip $ip)
# 使用 curl 检查是否开启80端口
curl "http://$target" &> /dev/null
if [ $? -eq 0 ]; then
echo "发现开启80端口主机: $target"
fi
done
echo "扫描完成!"

运行

image.png

小修改没有改脚本名字,和题目1输出不同

题目3

使用物理机CMD连接Windows 7 Samba服务,并在物理机使用CMD命令在Windows7 Samba服务所在机器C:\Windows\Temp\ 文件夹中新建 hello_chaitin.txt

step1:开启administrator用户

管理员开启cmd

image.png

设置administrator的密码并激活改用户

image.png

setp2:连接smb中的c$

image.png

setp3:cd到挂载的目录,并创建hello_chaitin.txt

image.png

D:\windows\中有Temp文件,我们无需创建,仅需创建txt即可

image.png

题目4

描述TCP三次握手与四次挥手过程

c:client,s:server

三次握手:

c:我来了哦SYN

s:知道来,来吧SYN/ACK

c:那我真的来了哦SYN

四次挥手

c:我走了哦,要想我FIN/ACK

s:知道了ACK

s:你走吧,勿念FIN/ACK

c:555我走了ACK

题目5

使用docker搭建 Pikachu 网站,要求网站服务单独使用一个容器,数据库服务单独使用一个容器

step1:分析题目

我们前往pikachu的gayhub中查看readme

image.png

几个重要的信息:

项目使用php,数据库mysql

提供了现成的镜像,和dockerfile

结合本题要求,解题步骤如下

修改pikachu提供的dockerfile

这里想偷懒直接用官方的dockerfile,但是踩了个大坑。。。。

将mysql抽离出来

创建一个docker网络

改一下pikachu的配置文件

编写docker-compose.yml

step2:修改拉取项目并修改相关配置文件和dockerfile

拉取镜像

image.png

查看dockerfile并结合ai提取关键信息

image.png

官方提供的dockerfile中将数据库密码置空了,好像是等待我们修改这里,我们修改成我们的mysql密码,修改后如下

image.png

蛋,这个不生效

修改mysql连接地址

由dockerfile可知,数据库连接地址在pkxss/inc/config.inc.php inc/config.inc.php,因为官方的dockerfile只对这两个文件修改了数据库密码。

image.png

image.png

后记:后来发现dockerfile的sed也没生效,没有改密码,所以我们手动修改

在对inc/config.inc.php的修改中,我们发现dbpw后面的root不见了,我们给他补上,防止影响我们dockerfile的逻辑

image.png

不用操心了这个根本不生效,手动改密码吧

对dockerfile的测试

build一下

image.png

失败了,被官方摆了一道,官方的dockerfile使用的镜像是arm平台的,我们替换成x64平台的0.8.0-1804-php7

整个mysql

image.png

添加一个docker网络

image.png

经历了千辛万苦终于调试成功了

image.png

step3编写docker-compose.yml

最后版本的dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FROM mattrayner/lamp:0.8.0-2004-php7
LABEL maintainer="8023 - i@8023.moe"
LABEL description="pikachu on php7 with expect @230613"
COPY . /app/
RUN apt-get update -y &&\
apt-get install -y php7.4-dev php-pear expect tcl-dev tcl-expect-dev &&\
ln -s /usr/include/tcl8.6/tcl.h /usr/include/tcl.h &&\
ln -s /usr/include/tcl8.6/tclDecls.h /usr/include/tclDecls.h &&\
ln -s /usr/include/tcl8.6/expect_tcl.h /usr/include/expect_tcl.h &&\
ln -s /usr/include/tcl8.6/tclPlatDecls.h /usr/include/tclPlatDecls.h &&\
pecl channel-update pecl.php.net && pecl install expect &&\
sed -i '/AllowNoPassword/s/false/true/g' /var/www/phpMyAdmin-5.1.1-all-languages/config.inc.php ;\
sed -i '/display_startup_errors/s/Off/On/g' /etc/php/7.4/apache2/php.ini ;\
sed -i '/allow_url_include/s/Off/On/g' /etc/php/7.4/apache2/php.ini ;\
sed -i '/allow_url_fopen/s/Off/On/g' /etc/php/7.4/apache2/php.ini ;\
sed -i '/display_errors/s/Off/On/g' /etc/php/7.4/apache2/php.ini ;\
sed -i '$a extension=expect.so' /etc/php/7.4/apache2/php.ini ;\
phpenmod expect && \
apt-get remove -y php7.4-dev tcl-dev tcl-expect-dev &&\
apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*
EXPOSE 80
CMD ["/run.sh"]

最后版本的docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: '2'
services:
# MySQL 服务
pikachu-db:
image: mysql:5.7
container_name: pikachu-db
environment:
MYSQL_ROOT_PASSWORD: pikachu_db_pass # 设置 MySQL root 密码
MYSQL_DATABASE: pikachu # 可选:指定初始数据库
networks:
pikachu-network # 连接到指定的网络
ports:
- "3306:3306" # 映射 MySQL 端口
volumes:
- mysql_data:/var/lib/mysql # 保持数据持久化
web:
build: . # 指定 Web 容器的构建目录(包含 Dockerfile)
container_name: pikachu
networks:
- pikachu-network # 连接到指定的网络
ports:
- "8080:80" # 映射 Web 端口
depends_on:
- pikachu-db
networks:
pikachu-network: # 自定义网络
driver: bridge
volumes:
mysql_data: # MySQL 数据卷

直接运行

image.png

访问8080

image.png

存在的问题:

lnmp会多起一个mysql

使用pikachu提供的dockerfile踩的坑:

官方用的镜像是arm的

修改数据库密码的sed似乎不起作用

数据库初始化时需要创建一个pikachu的库

😢