标题: ChatGPT编写的文件上传方案
作者: bluerust 创建: 2023-03-08 13:46 更新: 链接: https://scz.617.cn/network/202303081346.txt
背景大致如下
a) Win10位于堡垒机内侧,正常情况下外侧用户通过网页VNC控制Win10 b Win10的1024/TCP以上端口外侧可达,但无法主动向外connect c) 无法在Win10上用PowerShell,但找到.net编译器csc.exe,且cmd可用 d) 外侧Linux是己方完全可控主机,Linux->Win10可单向建立TCP连接 e) 原始需求是从Linux向Win10上传Python安装包
首先去找csc.exe,这玩意不在缺省PATH上,但很多Win10上都有,比如
dir /S C:\csc.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
然后我让ChatGPT用C#写一个收文件的服务端(server.cs)
using System; using System.IO; using System.Net; using System.Net.Sockets;
class Program { static void Main () { // Set the IP address and port number to listen on // Change this to your desired IP address IPAddress IP = IPAddress.Parse( "x.x.x.x" ); // Change this to your desired port number int Port = 1314; // Create the TCP listener and start listening for incoming connections TcpListener listener = new TcpListener( IP, Port ); listener.Start(); Console.WriteLine( "Server listening on {0}:{1}", IP, Port ); while ( true ) { // Wait for a client connection to come in TcpClient client = listener.AcceptTcpClient(); Console.WriteLine( "Client connected from {0}", client.Client.RemoteEndPoint ); // Create a binary reader to read incoming data from the client BinaryReader reader = new BinaryReader( client.GetStream() ); // Read the first 4 bytes to get the length of the incoming file int FileSize = reader.ReadInt32(); // Read the file data into a buffer byte[] FileData = reader.ReadBytes( FileSize ); // Close the client connection client.Close(); // Write the file data to disk File.WriteAllBytes( "some.bin", FileData ); Console.WriteLine( "File received and saved to some.bin" ); } } }
看了一眼它这个实现,前4字节是文件大小,之后是文件内容,没法直接和nc配合, 于是我又让ChatGPT用Python写一个发文件的客户端(client.py)
import sys, socket
Set the server IP address and port number
Change this to your server's IP address
IP = 'x.x.x.x'
Change this to your server's port number
Port = 1314
Create a TCP socket and connect to the server
Sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) Sock.connect( ( IP, Port ) ) print( 'Connected to server' )
Open the binary file to send to the server
with open( sys.argv[1], 'rb' ) as f : # Read the file data into a buffer data = f.read() # Convert the file size to a 4-byte binary representation size = len( data ).to_bytes( 4, byteorder='big' ) # Send the file size to the server Sock.send( size ) # Send the file data to the server Sock.send( data )
print( 'File sent to server' )
Close the socket
Sock.close()
在Win10上编译并执行服务端
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /nologo server.cs server.exe
在Linux上执行客户端
python3 client.py some.bin
在Linux上取文件哈希
sha256sum some.bin
在Win10上校验文件哈希
certutil -hashfile some.bin sha256
整套方案未必是最优解,但胜在快速达成目的,生产力工具,妥妥的。