当前位置:首页 > CN2资讯 > 正文内容

限定源端口访问目标

3天前CN2资讯

限定源端口访问目标

1.1. 起因

在渗透测试时,客户需要对我们的测试IP进行加白,但是此次客户要求精确到固定端口或者小范围端口(不能1-65535),根据以前的经验,默认是加白IP和全端口,因为代理建立连接使用的端口是随机的,所以这次算是从头查找资料总结一下各种指定源端口的方式。

这里的端口是指与目标建立连接时使用的源端口,而不是代理监听的端口。

1.2. 注意

最好使用服务器(VPS)发送请求。如果在局域网内向外网发起请求,即使本机指定了端口,也无济于事,因为实际发出请求的是最外层网络设备。

1.3. 方法一:NC

# 指定12345端口,缺点是一次一用,比较麻烦 nc <IP> <Port> -p 12345

1.4. 方法二:批量占用端口

查找了很多资料,但都没能找到合适的工具。最终我想到了一种笨拙的方法:强制占用所有可用的端口。这样当代理发起请求时,就会自动选择未被占用的端口。python代码举例如下:

import socket import time # 要占用的端口范围 start_port = 1 end_port = 60000 # 创建套接字 socks = [] for port in range(start_port, end_port+1): try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('0.0.0.0', port)) sock.listen(1) socks.append(sock) except: print(f"{port} 被其他应用占用") print(f'已占用端口范围: {start_port} - {end_port}') # 长期占用端口 while True: time.sleep(60)

效果如下,可见都是60000后的端口连接。

1.5. 方法三:手动实现代理转发

自己实现一个代理。监听一个端口,然后将流量发送到代理中,再由代理去固定源端口发送请求并返回结果。

Warning

因为都是走的这个端口去建立连接,一旦出现异常情况,那这个端口可能会长期保持TIME_WAIT状态从而导致无法正常使用。

python代码如下:

import http.server # 导入HTTP服务器相关的模块 import socketserver # 导入socket服务器相关的模块 import http.client # 导入HTTP客户端相关的模块 import urllib.parse # 导入URL解析相关的模块 import socket # 导入socket相关的模块 from loguru import logger # 导入日志库 LISTEN_PORT = 8080 # 本地监听端口 CONNECT_PORT = 22333 # 用于建立代理服务器与目标服务器连接的本地端口 # 继承http.server.BaseHTTPRequestHandler类,实现代理服务器的请求处理 class ProxyRequestHandler(http.server.BaseHTTPRequestHandler): # 处理CONNECT方法 def do_CONNECT(self): # 解析URL u = urllib.parse.urlparse('http://' + self.path) # 建立一个新的套接字 p_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 将该套接字绑定到本地端口 p_sock.bind(('0.0.0.0', CONNECT_PORT)) # 建立连接 p_sock.connect((u.hostname, u.port or 80)) # 返回200连接已建立响应 self.wfile.write(b'HTTP/1.1 200 Connection Established\r\n\r\n') # 将该套接字设置为非阻塞模式 p_sock.setblocking(False) self.connection.setblocking(False) while True: try: # 从代理服务器接收数据 data = self.connection.recv(1024) if not data: break # 将数据发送到目标服务器 p_sock.sendall(data) except: pass try: # 从目标服务器接收数据 data = p_sock.recv(1024) if not data: break # 将数据发送到代理服务器 self.connection.sendall(data) except: pass # 关闭连接 self.connection.close() p_sock.close() # 处理GET方法 def do_GET(self): # 解析URL u = urllib.parse.urlparse(self.path) # 创建一个HTTP连接 conn = http.client.HTTPConnection(u.hostname, port=u.port or 80, timeout=10, source_address=('0.0.0.0', CONNECT_PORT)) # 发送HTTP请求 conn.request(self.command, self.path, headers=self.headers) # 获取HTTP响应 resp = conn.getresponse() # 发送HTTP响应头 self.send_response(resp.status) for header, value in resp.getheaders(): self.send_header(header, value) self.end_headers() # 发送HTTP响应体 while True: data = resp.read(1024) if not data: break self.wfile.write(data) # 处理POST方法 def do_POST(self): # 解析URL u = urllib.parse.urlparse(self.path) # 获取请求体长度 content_len = int(self.headers.get('Content-Length', 0)) # 读取请求体 content_len = int(self.headers.get('Content-Length', 0)) # 获取请求体长度 body = self.rfile.read(content_len) # 读取请求体数据 conn = http.client.HTTPConnection(u.hostname, port=u.port or 80, timeout=10, source_address=('0.0.0.0', CONNECT_PORT)) # 创建 HTTP 连接对象 conn.request(self.command, self.path, body=body, headers=self.headers) # 发送 HTTP POST 请求 resp = conn.getresponse() # 获取响应对象 self.send_response(resp.status) # 发送 HTTP 响应状态码 for header, value in resp.getheaders(): # 遍历响应头部信息 self.send_header(header, value) # 发送响应头部信息 self.end_headers() # 结束响应头部信息的发送 while True: data = resp.read(1024) # 按照每次读取 1024 字节的方式获取响应数据 if not data: # 如果读取完毕,跳出循环 break self.wfile.write(data) # 将响应数据写入连接,响应给客户端 if __name__ == '__main__': try: # 创建一个 TCPServer 对象,绑定到 0.0.0.0:LISTEN_PORT 的地址,用于监听来自客户端的连接请求,当有连接请求时,将使用 ProxyRequestHandler 类进行处理。 httpd = socketserver.TCPServer(('0.0.0.0', LISTEN_PORT), ProxyRequestHandler) (f"Proxy server is listening on port {LISTEN_PORT}") # 开始监听并接受来自客户端的连接请求,直到出现 KeyboardInterrupt 异常为止 httpd.serve_forever() except KeyboardInterrupt: httpd.server_close()

效果如下,均为22333端口。

1.6. 尝试过的失败方法记录

  • Nginx反向代理
  • SSH动态代理 ssh -N -D 0.0.0.0:9999 ubuntu@hongkong
  • socat sudo socat TCP-LISTEN:<new_source_port>,fork,reuseaddr TCP:<destination_IP>:<destination_port>
    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/19883.html

    分享给朋友:

    “限定源端口访问目标” 的相关文章

    CN2中转:提高数据传输效率的最佳选择

    CN2中转概述 当我第一次接触CN2中转时,我就被它的高效和可靠性所吸引。CN2中转是一种通过中国电信的CN2线路进行数据传输的方式。这条线路不仅仅是简单的网络连接,它被誉为“二类全业务”数据专线,能够提供高速、低时延、低抖动和低丢包率的优质网络服务。帮助用户更好地访问境外数据,这一点让我感到它的重...

    如何以便宜价格注册com域名并降低续费成本

    在互联网的世界中,com域名是最为人熟知和广泛使用的顶级域名之一。当我第一次接触域名注册时,com域名吸引我的是它的简单性和易记性。每当有人提到网站地址,往往就是以.com结尾的,这使得它成为许多企业和个人建立在线存在的主流选择。 com域名的意义不仅仅在于一个简单的名称。它代表了商业形象、品牌价值...

    Zenlayer如何优化企业全球网络连接与数字化转型

    在当今数字化时代,企业对全球网络连接的需求呈现出爆炸式增长。Zenlayer作为一家基于SDN的全球网络及服务提供商,恰如其分地填补了这一市场空白。总部位于洛杉矶的Zenlayer,不仅连接着企业和用户与云端,还通过其高度灵活的裸机云、云连接以及边缘计算服务,帮助企业迅速部署和管理全球IT资源。我认...

    支付宝与PayPal充值攻略:如何选择适合的支付方式

    支付宝和PayPal是当今全球最受欢迎的支付平台之一,它们各自具有独特的特点和广泛的用户群体。支付宝成立于2004年,由阿里巴巴集团推出,最初是为了支持电子商务交易,逐渐发展成一个多功能的支付应用。用户不仅可以通过它进行在线支付,还可以进行转账、充值、理财等多种活动。随着移动支付的兴起,支付宝也积极...

    DNS服务器工作原理及其安全性详解

    DNS,或者称作域名系统,是互联网的基石之一。它的主要功能是将用户输入的域名转化为计算机能理解的IP地址,比如说,当我在浏览器中输入“www.example.com”时,DNS会帮助我找到这个网站所在的IP地址。想象一下,如果没有DNS系统,我们每次都得记住一串数字,那该有多麻烦呀。 DNS服务器是...

    如何选择便宜的海外服务器来提升业务效率

    什么是海外服务器 海外服务器简单来说,就是在国外数据中心托管的服务器。那些需要在国外提供服务和访问的企业或者个人,会选择这种类型的服务器。比起本地服务器,海外服务器往往能提供更好的网络速度和稳定性,尤其是对某些特定的地区来说。如果你有过在网上购物或者访问国际网站的经历,或许你会发现他们的响应速度比一...