socks协议详解

article/2025/9/27 8:38:59

0x01 socks协议简介

Socks(Socket Secure)协议是一种网络协议,处于会话层,用于管理网络连接并提供安全性和隐私保护。通过使用Socks代理服务器,客户端可以隐藏其真实IP地址和其他身份信息,从而匿名地访问互联网上的资源。

0x02 socks协议连接过程

socks建立连接的过程可以简单的分成四个步骤:

  1. 客户端向socks服务器发起请求,告诉服务器自己支持的认证方法。

  2. socks服务器选择一种支持的认证方式并告诉客户端,如果没有支持的则中断连接。

  3. 客户端发送请求,告诉socks服务器需要访问的目标服务器的IP和端口。

  4. socks服务器响应请求,告诉客户端连接状态码以及自己与目标服务器通信的IP和端口,此时建立连接完毕。

下面详细介绍一下socks连接的过程:

在这里插入图片描述

  1. socks客户端和服务端通过TCP三次握手建立连接。

  2. socks客户端向服务端发起协商请求,数据包格式如下:

VERNMETHODSMETHODS
111to255
  • VER(1字节):协议版本,socks5为0x05

  • NMETHODS(1字节):支持认证方法的数量。

  • METHODS(可变长度,NMETHODS字节):

    • X’00’ 不用认证

    • X’01’ GSSAPI认证

    • X’02’ 账号密码认证

    • X’03’ to X’7F’ IANA分配

    • X’80’ to X’FE’ 私有方法保留

    • X’FF’ 无支持的认证方法

  1. socks5服务器选中一个METHOD返回给客户端,数据包格式如下:
VERMETHOD
11
  • VER(1字节):协议版本,socks5为0x05

  • NMETHOD(1字节):选中的方法。

当客户端收到0x00时,会跳过认证阶段直接进入请求阶段,当收到0xFF时,直接断开连接,收到0x02则进入认证阶段,也叫子协商。

  1. 客户端发起认证请求,这里以0x02为例,数据包如下:
VERULENUNAMEPLENPASSWD
111to25511to255
  • VER(1字节): 版本号

  • ULEN(1字节): 用户名长度

  • UNAME(ULEN字节): 对应用户名的字节数据

  • PLEN(1字节): 密码长度

  • PASSWD(PLEN字节): 密码对应的数据

  1. socks服务器收到认证请求后判断账号密码是否正确,并返回响应结果,数据包格式如下:
VERSTATUS
11

VER(1字节):版本号

STATUS(1字节):状态码

状态码为0x00表示认证成功,否则认证失败。认证失败的响应后将会断开连接。

  1. 协商完毕后客户端向socks服务器发起请求,数据包格式如下:
VERCMDRSVATYPDST.ADDRDST.PORT
11X’00’1Variable2
  • VER(1字节): 版本号,socks5的值为0x05
  • CMD(1字节):连接方式
    • 0x01表示CONNECT请求
    • 0x02表示BIND请求
    • 0x03表示UDP转发
  • RSV(1字节):保留字段,值为0x00
  • ATYP(1字节):目标主机地址类型
    • 0x01表示IPv4地址,DST.ADDR为4个字节
    • 0x03表示域名,DST.ADDR第一个字节表示域名长度,后面的数据表示域名。(没写错,就是没有0x02
    • 0x04表示IPv6地址,DST.ADDR为16个字节长度
  • DST.ADDR(可变长度):表示主机地址
  • DST.PORT(2字节):表示目标主机端口
  1. CMD=0x01:TCP连接模式,socks服务器向目标服务器发起TCP三次握手,连接成功后向客户端发送确认数据包。

  2. CMD=0x02:BIND定模式,这种模式一般是双向监听,也就是说客户端也要开启一个端口监听来自目标服务器的数据。socks服务器开启监听端口并通过请求响应数据包告诉客户端,客户端把数据包中的地址和端口写在应用层协议的数据包里,当目标主机从数据包中取出IP和端口(socks服务器的IP和端口)就会向这个IP和端口发送数据。

  3. CMD=0x03:UPD模式,直接转发。

  1. 当socks服务器收到请求后,判断连接类型(CMD字段)后与目标服务器建立连接(TCP或BIND)或直接转发(UDP),然后向客户端返回一个响应,响应数据包格式如下:
VERREPRSVATYPBND.ADDRBND.PORT
11X’00’1Variable2
  • VER(1字节):socks版本号,socks为0x05
  • REP(1字节):返回状态码:
    • X’00’ 成功
    • X’01’ 代理服务器出错
    • X’02’ 连接不允许
    • X’03’ 网络不可达
    • X’04’ 主机不可达
    • X’05’ 连接被拒绝
    • X’06’ TTL 到期
    • X’07’ 命令 (CMD) 不支持
    • X’08’ 地址类型不支持
    • X’09’ to X’FF’ 目前没有分配
  • RSV(1字节):保留字段
  • ATYPE(1字节): 与请求的ATYPE相同
  • BND.ADDR(可变长度):服务器绑定的地址
  • BND.PORT(2字节):服务器绑定的端口DST.PORT
  • BND.ADDR和BND.PORT分别代表socks接收目标服务器数据的地址和端口。

  • BIND模式下socks服务器的响应包有两个,第一个数据包是在socks服务器建立并绑定后发送,此时socks服务器仅创建了套接字,还未与目标主机建立连接。第二个数据包是在目标主机到socks服务器连接建立完成后。

    • 第一个数据包:发送socks绑定的地址和端口。

    • 第二个数据包:发送目标服务器的地址和端口,目标服务器提供服务的IP和端口可能和请求时的IP和端口不同。

  1. 客户端收到服务器的响应后进入转发阶段。此时开始向socks服务器发送数据包,服务器收到数据包后转发到目标服务器上,收到目标服务器的数据也会转发到客户端。

总结

这篇文章介绍了Socks协议的基本概念和连接过程。Socks协议是一种网络协议,位于会话层,用于管理网络连接并提供安全性和隐私保护。文章详细介绍了Socks客户端和服务器之间建立连接的步骤。此外,文章还介绍了Socks协议中常用的数据包格式和状态码,以及Socks协议的应用场景和优势。

参考文章

  1. 理解socks5协议的工作过程和协议细节

  2. # Socks 5 协议解析

  3. Username/Password Authentication for SOCKS V5


http://chatgpt.dhexx.cn/article/TxSrvHjE.shtml

相关文章

socks代理实战

文章目录 Socks代理实战Socks代理简介Socks代理工具Socks代理实战-MSF渗透场景Target1Target2Target3 Socks代理实战-FRPTarget1Target2Target3 Socks代理实战-EWEW使用简介EW正反向Socks代理EW创建一层Socks代理二级级联本地SocksEW创建二层Socks代理三级级联的本地SocksEW创建…

Socket(四)

文章目录 1. 服务器Socket简介2. 使用ServerSocket3. 用Socket写入服务器4. 关闭服务器Socket 1. 服务器Socket简介 博客Socket(一)~Socket(二)从客户端的角度讨论了Socket,客户端就是向监听连接的服务器打…

CobaltStrike建立Socks4代理

目录 Socks4代理建立 ProxyChains的使用 Socks4代理建立 当我们的被控主机是位于公网和内网边界的服务器时,我们想利用该主机继续对内网的主机进行渗透,比如经过端口扫描我们发现被控机器的同一网段有一主机开放了80端口,我们想在本地访问…

Java常用工具类

学习内容 包装类型(基本数据类型的包装类型) String字符串常用方法 StringBuffer与Stringbuilder 日期和时间处理工具类 System,Math,Random,UUID等工具类 枚举类型 File类 递归算法 目录 1.包装类型 1.1.Integer的基本用法 1.2.包装类型的使用 1.3.自动装箱与自动…

Java——Collections工具类

Collections工具类 Collections 是一个操作 Set、List 和 Map 等集合的工具类 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。 排序操作:(均为…

Spring自带的工具类

最近发现同事写了不少重复的工具类,发现其中很多功能,Spring 自带的都有。于是整理了本文,希望能够帮助到大家! 目录 断言 对象、数组、集合 ObjectUtils StringUtils CollectionUtils 文件、资源、IO 流 FileCopyUtils R…

【常用工具类】Java控制台打印工具类LogUtil

文章目录 1 带分割线版2 不带分割线版3 终极版 1 带分割线版 import java.text.SimpleDateFormat; import java.util.Date;/*** W SKH 的输出工具类*/ public class LogUtil {private SimpleDateFormat simpleDateFormat new SimpleDateFormat("yyyy-MM-dd,HH:mm:ss.SSS&…

Java 对象拷贝工具类

目录 1. Spring 中的对象拷贝 2. 本工具类中的对象拷贝 2.1 拷贝对象本身(单个) 2.2 拷贝对象本身(批量) 2.3 拷贝对象属性至其他类(单个) 2.4 拷贝对象属性至其他类(批量) 4.…

Java表达式运算工具类

对于表达式的运算转换工具类,使用场景,例如前端文本框让用户输入了加减乘除运算,工具类智能转换。 资源下载:Java表达式工具类,用于加减乘除等智能转换-Java文档类资源-CSDN下载 例如: public static void…

阿里OSS工具类

参考博客:阿里OSS入门 bucket配置信息:alios.properties OSS配置文件:AliOSSConfig.java Data public class AliOSSConfig {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketNam…

Guava Lists工具类

文章目录 01 概述02 Lists工具类03 文末 01 概述 Guava 是 Google 开源的一个 Java 工具库&#xff0c;里面有很多工具类&#xff0c;本文要讲的是里面的Lists工具类。 注意&#xff0c;使用Guava工具类库&#xff0c;必须先添加依赖&#xff1a; <dependency><gro…

JAVA之常用的工具类

目录 1 集合工具类 1.1 java.util.Collections 1.1.1 基本操作 1.1.2 转换线程安全集合 1.2 org.springframework.util.CollectionUtils 1.3 org.apache.commons.collections.CollectionUtils 1.4 org.apache.commons.lang.ArrayUtils 1.5 org.apache.commons.lang3.Ar…

常用的Java开发工具类

前言 在java的庞大体系中&#xff0c;其实有很多不错的小工具&#xff0c;也就是我们平常说的&#xff1a;轮子。 如果在我们的日常工作当中&#xff0c;能够将这些轮子用户&#xff0c;再配合一下idea的快捷键&#xff0c;可以极大得提升我们的开发效率。 今天我决定把一些…

工具类的详解

工具类网站 1、工具类 1.1 定义 工具类是为了提供一些通用的、某一非业务领域内的公共方法&#xff0c;不需要配套的成员变量&#xff0c;仅仅是作为工具方法被使用。所以将它做成静态方法最合适&#xff0c;不需要实例化&#xff0c;能够获取到方法的定义并调用就行。 1.2…

学习日记-安卓Package Manager和Package Installer

安装和卸载APK&#xff08;安卓应用程序包文件&#xff09;&#xff0c;运作原理。 什么是Package Manager&#xff08;包管理器&#xff09;和Package Installer&#xff08;程序安装包&#xff09;&#xff1f; APK文件保存在Android的哪个地方&#xff1f; APK文件安装过…

PackageInstaller (tv 修改安装app界面按钮及自动获取焦点)附源码分析

\packages\apps\PackageInstaller 一、一条真实的修改记录 TVOS基于的是一套板卡厂商原有的源码(mstar android8.0版本&#xff09;原生的这个app安装界面&#xff0c;存在俩个比较严重的用户体验问题&#xff0c; 1’、下面那俩按钮太小了&#xff0c;而且…

android packages/apps 加入工程,深入安卓Package Manager和Package Installer

我们每天都在安装和卸载APK(安卓应用程序包文件)&#xff0c;或许一天会有好几次&#xff0c;但是你有想过下面问题吗&#xff1f;什么是Package Manager(包管理器)和Package Installer(程序安装包)&#xff1f; APK文件保存在Android的哪个地方&#xff1f; APK文件安装过程的…

RK3568平台开发系列讲解(安卓篇)PackageInstaller(应用安装)流程介绍

文章目录 <font color=#0990d9>一、PackageInstaller入口<font color=#0990d9>二、InstallStart<font color=#0990d9>三、InstallStaging<font color=#0990d9>四、PackageInstallerActivity<font color=#0990d9>五、InstallInstalling<font c…

Android9.0 PM机制系列(一)PackageInstaller初始化解析

前言 包管理机制是Android中的重要机制&#xff0c;是应用开发和系统开发需要掌握的知识点之一。 包指的是Apk、jar和so文件等等&#xff0c;它们被加载到Android内存中&#xff0c;由一个包转变成可执行的代码&#xff0c;这就需要一个机制来进行包的加载、解析、管理等操作&…

PackageInstaller源码分析(一)

本篇博客分析PackageInstaller源码目的是分析Android权限机制&#xff0c;Android App的权限在应用被安装时&#xff0c;用户选择授予或者拒绝。所以&#xff0c;分析Android权限机制源码的第一步分析应用程序安装时的行为。   此次阅读源码旨在解决的问题&#xff1a;Andro…