惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

博客园 - 朱燚:-)

[SuProxy]Ngnix+Lua 实现SSH2,LDAP,ORACLE,SQLSERVER等TCP/IP协议分析,劫持,代理,会话及负载 现场填坑系列:mongodb 复制集跨机房同步网络问题探查 现场填坑系列:使用bulk操作提高性能,解决mongoshake 向ES同步延迟。 Oracle TNS 协议分析——1、系列开篇:方法论及基础知识 Oracle TNS 314 协议分析——5、错误返回 Oracle TNS 314 协议分析——4、SQL执行流程与包分析 Oracle TNS 314 协议分析——3、连接认证流程与包分析 Oracle TNS 314 协议分析——2、基础包结构 要想让计划任务“坑”死你的系统,你一定要这样写 回归是一种进步 Linux日知录(常用问题笔记) [轻松一下]-笑话巨搞,饭后帮助消化 [转]用数据说话,看Google 怎样被陷害 [转]22条经典的编程引言 [转]UI设计好文--颜色与UI 博客专家和论坛专家--来自两个星球的生物 RUP_相关资源 求职vs招聘--交锋中的交流技巧 [转]Windbg的学习记录(一)
想用Nginx代理一切?行!
朱燚:-) · 2020-10-29 · via 博客园 - 朱燚:-)

Nginx能代理一切吗?

是的,Nginx可以作为一个优秀的http网关,但nginx能代理SSH2,MySQL,Oracle的连接吗?也算行吧,nginx有stream-module,专门处理TCP,UDP连接。不过即使忽略

  • stream-module反人类的使用方式、
  • nginx内部复杂的阶段划分、
  • 各个阶段对使用方式的限制、
  • 以及为了完成某个功能不得不重新编译下载的一系列缺点,

Stream-module的功能也远远不够。不信你可以试试修改一个包的内容,或者自动回复某种类型的包试试,更别提完成这样几个操作:修改一下客户端输入的sql语句,或者更进一步,加入一个身份验证。

如果你是一个nginx+lua或Openresty或KONG或APISix的网关重度依赖用户,那么你肯定急切的希望把网关的能力扩展到TCP/IP领域。

我们来看几个示例

修改Linux|Unix欢迎屏幕为所有男人的梦想

记录SQL或shell命令


防止删库跑路(命令过滤和禁止)


踢人下线

怎么做到的

上面的示例是怎么做到的?不要着急,我们的主人公就要出场了:SuProxy,一个纯Lua,事件驱动模型,基于包分析的开源代理库。

纯LUA意味着拷贝可用,事件驱动意味着使用方便,包分析意味着可以真正自由修改包内容

我们来看看怎么修改linux的欢迎屏幕

local function myWelcome(context,source)
	local digger={"\r\n",
	[[                                                     .-.   ]].."\r\n",
	[[                                                    /   \  ]].."\r\n",
	[[                                     _____.....-----|(o) | ]].."\r\n",
	[[                               _..--'          _..--|  .'' ]].."\r\n",
	[[                             .'  o      _..--''     |  | | ]].."\r\n",
	[[                            /  _/_..--''            |  | | ]].."\r\n",
	[[                   ________/  / /                   |  | | ]].."\r\n",
	[[                  | _  ____\ / /                    |  | | ]].."\r\n",
	[[ _.-----._________|| ||    \\ /                     |  | | ]].."\r\n",
	[[|=================||=||_____\\                      |__|-' ]].."\r\n",
	[[|   suproxy       ||_||_____//                      (o\ |  ]].."\r\n",
	[[|_________________|_________/                        |-\|  ]].."\r\n",
	[[ `-------------._______.----'                        /  `. ]].."\r\n",
	[[    .,.,.,.,.,.,.,.,.,.,.,.,.,                      /     \]].."\r\n",
	[[   ((O) o o o o ======= o o(O))                 ._.'      /]].."\r\n",
	[[    `-.,.,.,.,.,.,.,.,.,.,.,-'                   `.......' ]].."\r\n",
	[[                   scan me to login                        ]].."\r\n",
	"\r\n",
	}                      
	return table.concat(digger),false
end

local ssh=require("suproxy.ssh2"):new()
local cmd=require("suproxy.ssh2.commandCollector"):new()
cmd.BeforeWelcomeEvent:addHandler(ssh,myWelcome)
local channel=require("suproxy.channel"):new({{ip="127.0.0.1",port=2222}},ssh)
channel:run()

上面的例子里,通过处理commandCollector.BeforeWelcomeEvent事件,在事件中修改了默认的欢迎屏幕。

每个协议都有自己独特的事件,比如利用TNSProcessor.commandEntered事件,我们就能过滤用户输入的命令,使用OnAuthenticate事件就能够自行处理验证。事件的使用可参见https://www.cnblogs.com/yizhu2000/p/13885263.html或英文文档https://github.com/yizhu2000/suproxy

还想更进一步

除了上面这些直观的事件,在底层SuProxy还为高级用户提供了协议解析事件,这些事件把协议内部的包往来暴露出来,用户可以处理这些事件从而修改包的内容,实现更高级的逻辑,比如SSH2协议提供了如下事件(C2P意味着从Client到SuProxy,S2P意味着从SuProxy到Server)

C2PParser.events.KeyXInitEvent,C2PParser.events.AuthReqEvent,C2PParser.events.DHKeyXInitEvent,C2PParser.events.NewKeysEvent,C2PParser.events.ChannelDataEvent,S2PParser.events.KeyXInitEvent,S2PParser.events.DHKeyXReplyEvent,S2PParser.events.AuthSuccessEvent,S2PParser.events.AuthFailEvent,S2PParser.events.NewKeysEvent,S2PParser.events.ChannelDataEvent

熟悉SSH2协议的同学可以自行解析扩展。

实现方式

SuProxy自行处理了request socket的数据,并在上下游间建立通道,在通道中使用不同处理器处理协议相关的内容

Channel 负责管理连接,数据收发

Parser负责进行解析和打包

Processor 负责处理加解密及对解析后的包进行业务处理

其中processor和parser用户都可以自行扩展,增加processor可以扩展协议,增加parser可以扩展协议中某类特定包的解析

三个层次都会发出事件。具体可见下图

欢迎拍砖

看了上面的介绍,感兴趣的同学有问题可以在此留言,或直接在git上提交
https://github.com/yizhu2000/suproxy/issues

也可以通过邮件组suproxy@googlegroups.com,或直接发邮件到yizhu2000@hotmail.com进行沟通

当然SuProxy当前还在试验阶段,已经支持SSH2,LDAP,TNS,TDS协议,使用示例和文档将会陆续在博客园,CSDN博客,Git上发布,欢迎大家测试,并提出意见与建议,

项目Git地址:
https://github.com/yizhu2000/suproxy

文档地址(英文):
https://github.com/yizhu2000/suproxy/blob/main/readme.md