题目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 "扫描完成!"
|
运行

题目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 "扫描完成!"
|
运行

小修改没有改脚本名字,和题目1输出不同
题目3
使用物理机CMD连接Windows 7 Samba服务,并在物理机使用CMD命令在Windows7 Samba服务所在机器C:\Windows\Temp\ 文件夹中新建 hello_chaitin.txt
step1:开启administrator用户
管理员开启cmd

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

setp2:连接smb中的c$

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

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

题目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

几个重要的信息:
项目使用php,数据库mysql
提供了现成的镜像,和dockerfile
结合本题要求,解题步骤如下
修改pikachu提供的dockerfile
这里想偷懒直接用官方的dockerfile,但是踩了个大坑。。。。
将mysql抽离出来
创建一个docker网络
改一下pikachu的配置文件
编写docker-compose.yml
step2:修改拉取项目并修改相关配置文件和dockerfile
拉取镜像

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

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

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


后记:后来发现dockerfile的sed也没生效,没有改密码,所以我们手动修改
在对inc/config.inc.php的修改中,我们发现dbpw后面的root不见了,我们给他补上,防止影响我们dockerfile的逻辑

不用操心了这个根本不生效,手动改密码吧
对dockerfile的测试
build一下

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

添加一个docker网络

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

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:
pikachu-db: image: mysql:5.7 container_name: pikachu-db environment: MYSQL_ROOT_PASSWORD: pikachu_db_pass MYSQL_DATABASE: pikachu networks: pikachu-network ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql web: build: . container_name: pikachu networks: - pikachu-network ports: - "8080:80" depends_on: - pikachu-db networks: pikachu-network: driver: bridge volumes: mysql_data:
|
直接运行

访问8080

存在的问题:
lnmp会多起一个mysql
使用pikachu提供的dockerfile踩的坑:
官方用的镜像是arm的
修改数据库密码的sed似乎不起作用
数据库初始化时需要创建一个pikachu的库
😢