reGeorg 工作流程分析(以 php 为例)

渗透中难免会遇到内网,有内网就会有代理,那么大概率就会用到 reGeorg 这个 socks 代理工具,那么在我们拿到的服务器不能有出网的流量的时候是不是也可以用这个工具呢?想到这个问题的时候其实我也不是很清楚,毕竟这个工具的实现我也不是很了解。那么如此厉害的工具究竟是怎么实现的,使用条件有没有必须要连接外网这一条呢?本文就是对这个工具源码的简单分析。

0X01 整体流程图

我这里以 PHP tunnel 为例,画了一个工具的流程图,我们先睹为快

PS:实际上这张图是一个特殊情况,因为 PHP dl() 函数被默认禁用,于是没法加载 socket 动态库,于是这里使用的是 fsocketopen 获取内网服务器的资源,另外数据也可能不会存储在文件中,直接保存变量然后 send 到服务器就好了,或者是直接从服务器 receive 到变量,然后直接返回

0X02 代码分析

1.reGeorgSocksProxy.py

这个运行起来就是本地的一个 socks 服务器,主要作用就是接受浏览器的 socks 请求,与远端代理服务器建立 session 连接,将数据从浏览器传递给远端代理服务器,或者是将代理服务器传回来的数据使用 socks 再传回到浏览器显示。

(1)检查远端代理服务器的连通性

会通过 requests 请求代理服务器,看看返回值是不是预定义的那句话,如果是的话就代表访问成功,远端代理服务器正常运行

(2)接收浏览器的连接并与远端代理服务器建立 session

入口函数

进行 socks 协商

与远端代理服务器建立 session 连接

(3)read 部分

从远端代理服务器获取数据并通过 socks 发送到浏览器

(4)write 部分

从 socks 中读取浏览器发送过来的数据,然后通过 POST 请求体发送给远端的代理服务器

2.tunnel.nosocket.php

(1)创建与内网服务器的 socket

(2)从内网服务器读取数据

使用 fgets 读取数据然后,写入 $_SESSION[‘readbuf’] 中(ps:那个 readbuff 是笔误嘛,hhh)

(3)将读到的数据返回到 webpage

(4)从本地socks服务器接收数据

通过 php://input 接收 post 数据然后存入 $_SESSION[‘writebuf’] 中

(5)从 session 中获取数据

通过 fwrite 写入到内网服务器

0X03 总结

其实看完代码,就可以发现整个过程其实并没有远端代理服务器访问外网的成分,另外其实我们可以发现,远端的代理服务器实际上就是一个中转数据的 api

0X04 补充

文章开头说了我们这里是用 php 的nosocket 版本进行的分析,对于可以使用 socket 的情况,远端的代理服务器就是作为 socket 的客户端向内网服务器发送 socket 请求,然后直接获取数据

0X04 扩展

虽然不需要访问外网就能实现代理功能,但是毕竟文件比较大,上传上去还是比较明显,那么有没有更加优雅的方法呢?有的, LCTF 2018 中 zsx 师傅,将这款工具的 php 部分进行了修改,实现了只要远端有一个 一句话木马就能直接运行(实际上本质就是将这个代理脚本作为数据传到小马里面 eval,其他语言的部分其实可以根据自己所需进行修改如下图)

这是读取代理脚本到变量

这里是将变量作为参数传入一句话

项目地址: https://github.com/zsxsoft/reGeorg