热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Go渗透测试编程(二)——TCP、扫描器和代理

Go渗透测试编程(二)——TCP、扫描器和代理-注意由于系列文章仅是我在阅读BHG时进行的一些记录,并不是一个很严谨的教程,且本章标题会跟随书的章节目录。TCP协议传输控制协议(T

注意

由于系列文章仅是我在阅读BHG时进行的一些记录,并不是一个很严谨的教程,且本章标题会跟随书的章节目录。


TCP协议

传输控制协议(Transmission Control Protocel,TCP)是面向连接的可靠通信的主要标准,以及现代网络的基础。BHG要求我们能够从TCP的工作原理入手,开发可以识别打开/关闭的端口,通过端口转发绕过出口限制。

TCP的握手机制

分为以下三种情况

  1. 端口开放
    如果端口是开放的,就会进行经典的三次握手:syn->syn-ack->ack;
  2. 端口关闭
    如果端口关闭,服务器会以rst数据包而非syn-ack数据包进行响应;
  3. 防火墙过滤
    如果流量被防火墙过滤,客户端通常不会从服务器收到任何响应;

编写TCP扫描器

通过编写一个端口扫描器去理解TCP握手过程以及3种端口状态,以确定TCP端口是否可用,或者已关闭和使用过滤状态进行响应

Go的net包

通过net.Dial(network, address string),启动客户端到服务端的连接
network参数:字符串类型,用于标识要启动的连接的类型。Dial不仅适用于TCP,还可以用于创建UNIX套接字、UDP和第4层协议的连接
address参数:字符串类型,标识要连接的主机。对于IPv4/TCP连接,使用host:port的形式
返回值:Conn,err;若连接成功,err为nil

示例:基本的单端口扫描器

package main

import (
    "fmt"
    "net"
)

func main() {
    _, err := net.Dial("tcp", "scanme.namp.org:80")
    if err == nil {
        fmt.Println("Connection successful")
    }
}

示例:非并发多端口扫描器

package main

import (
    "fmt"
    "net"
)

func main() {
    for i := 1; i <= 1024; i++ {
        address := fmt.Sprintf("scanme.nmap.org:%d", i)
        connm err := net.Dial("tcp", address)
        if err != nil {
            continue
        }
        conn.Close()
        fmt.Println("%d open\n", i)
    }
}

示例:并发扫描器

package main

import (
    "fmt"
    "net"
    "sync"
)

func main() {
    //同步计数器
    var wg sync.WaitGroup
    //扫描前1024个端口
    for i := 1; i <1024; i++ {
        wg.Add(1)
        //启动goroutine
        go func(j int) {
            //延后至外层函数返回时执行
            defer wg.Done()
            address := fmt.Sprintf("scanme.nmap.org:%d", j)
            conn, err := net.Dial("tcp", address)
            if err != nil {
                return
            }
            conn.Close()
            fmt.Printf("%d open\n", j)
        }(i)
    }
    //函数阻塞,等待同步计数器为0
    wg.Wait()
}
缺点:扫描过多的主机或端口,可能会导致网络或系统限制,造成结果不正确

使用goroutine池管理正在进行的并发工作,通过for循环创建一定数量的worker goroutine作为资源池

示例:worker
import (
    "fmt"
    "net"
    "sort"
)
//parameter:
//ports: int类型的通道,用于接收工作
//results: int类型的通道,用于接收结果
func worker(ports, results chan int){
    for p := range ports {
        address := fmt.Sprintf("scanme.nmap.org:%d", p)
        conn, err = net.Dial("tcp", address)
        if err != nil {
            // 端口关闭,接收0
            results <- 0
            continue
        }
        conn.Close()
        // 端口打开,接收端口号
        results <- p
    }
}
func main() {
    //使用make函数创建通道
    ports := make(chan int, 100)
    results := make(chan int)
    var openports []int
    // cap函数计算通道的容量
    // for循环启动所需数量的worker goroutine
    for i := 0; i 

构造TCP代理

构建回显服务器(仅回显给定响应到服务器)

io.Reader

type Reader interface {
    Read(p []byte) (n int, err error)
}

io.Writer

type Writer interface {
    Write(p []byte) (n int, err error)
}

net.Conn:Go面向流的网络连接
Conn实现了针对接口Reader和Writer定义的函数Read([]byte)和Write([]byte),即Conn即是Reader也是Writer---->TCP是双向连接,可以发送或接收数据

回显服务器构建流程

1.使用net.Listen(network, address string)在特定端口上打开TCP监听器
2.listener.Accpet()等待客户端连接成功后,创建并返回一个Conn对象,使用该对象接收和发送数据

推荐阅读
  • 本文介绍了网络编程的要点,包括InetAddress类获取IP地址的方法,IP地址的定义和表示方法,IPv4和IPv6的区别,以及网络通信协议中的端口和协议类型。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了VoLTE端到端业务详解|VoLTE用户注册流程相关的知识,希望对你有一定的参考价值。书籍来源:艾怀丽 ... [详细]
  • SQL Server 2008 到底需要使用哪些端口?
    SQLServer2008到底需要使用哪些端口?-下面就来介绍下SQLServer2008中使用的端口有哪些:  首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果 ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
  • c# java socketn 字节流_C#Socket编程详解(一)TCP与UDP简介
    一、TCP与UDP(转载)1、TCP1.1定义TCP(TransmissionControlProtocol)传输控制协议。是一种可靠的、面向连接的协议(eg:打电话)、传输效率低 ... [详细]
  • 大数据环境下的存储系统构建:挑战、方法和趋势
    大数据环境下的存储系统构建:挑战、方法和趋势陈游旻,李飞,舒继武清华大学计算机科学与技术系,北京100084摘要:互联网规模的迅速扩展促使 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
书友68570125
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有