本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com
这是 酒仙桥六号部队 的第 140 篇文章。
全文共计 1620 个字,预计阅读时长 6 分钟。
前言
当我们已经通过各种操作 getshell 之后想要进行内网横向渗透,但因为目标 ACL 策略设置的比较严格,只允许 HTTP 协议和对应端口通过。我们无法通过使用端口转发或者是端口映射的方法来从外网访问到内网的其他机器。这时我们就会想到 reGeorg 这款工具,通过该工具代理进入内网,通过 HTTP 协议转发请求。
这个工具创建之初本意并不是专门用来渗透内网,而是某些企业员工在外网的环境下想访问内网资源。所以这几个安全意识不太足的小哥们写了一个可以通过部署在边界上的网页来进行流量转发,从而访问内网的一个办公工具......
可以看到该工具的'斯搂梗'是说 "每个办公室都需要这样的工具"..
源码分析
那么如此厉害的工具究竟是怎么实现的呢?我们一起来看下源码:
从入口开始,就是标准的一套:LOGO + argparse 来进行参数的支持和解析,真正逻辑从 askGeorg 函数开始。这个函数是来测试远程代理服务器是否能够访问,我们来看下这个函数的具体内容:
可以看到内容基本就是判断是否为 HTTPS,然后使用哪个工具。用 GET 方法来请求,如果状态码为 200 且内容跟远程服务器中内容一样就认为是 OK 的。
比较的内容就是浏览器访问看到的那一句话:
Python 中:
php 中:
浏览器访问:
我们来继续往下看:
监听了客户端的端口,并设置 TCP 的排队上限为 1000,这样的对普通情况来说是足够了。
后边是创建循环不停的接收报文,并且将接收到的传入 session 线程中并启动。
session 的构造比较简单:
我们来看下线程最重要 run 中的内容:
内容不多,就是判断 Socks4 还是 5 并解析,之后是创建读写线程并 start。
判断 Socks4 还是 5:
Socks 代理至少三个字节的请求, 第一个字节一定为 5,如果是 Socks4,则第一个字节一定为 4。
parseSocks5 和 parseSocks4 为判断对应 Socks 的协议解析是否成功。
Reader:
Writer:
读写部分是一些转发的常规操作。
实战攻防
在实战中使用可能会碰到一些特殊问题。
比如在浏览器中访问可以出现熟悉的 "Georg says,'All seems fine'",说明可以正常访问。但是使用 reGeorgSocksProxy 客户端的时候会报'未准备好,请检查 url',这是为什么呢?
排查问题需要进行一些代码调试。
通过打印出的关键字搜索,可以看到是 askGeorg 这个函数返回了 False 导致了退出程序。
这时我们可以进行调试,使用 Debug 来跟进代码,一行一行看到底哪里出错了。当不具备调试环境时也可以使用打印的方法定位问题。
这里我们使用打印的方法来定位问题。
我们再尝试运行一下代码,看看哪里出错。
可以看到返回的状态码为 403,也就是说可能被 WAF 或者其他安全设备拦截掉了。我们通过代码可以获知只有当状态码为 200 的时候才可以正常使用,并且我们使用浏览器直接打开是可以正常访问的。也就是说我们的问题出现在了 Python 脚本跟浏览器的请求差异上,比如一些常见的请求头 User-Agent 、Accept-Language 等,这些我们需要一一补上。
我们需要将每一个请求都加入浏览器所包含的请求头,所以我们将该过程提取出来作为函数使用。
修改后的代码:
setupRemoteSession 中的 CONNECT:
closeRemoteSession 中的 DISCONNECT:
reader 中的 READ:
Writer 中的 FORWORD:
修改完代码后我们实际进行测试。
可以看到返回码已经变为 200 并且打印出了熟悉的'All seems fine',说明可以正常使用了。Happy~
总结
掌握调试 / 打印等方法不论是对代码审计和修改脚本都有很大的帮助和提升。我们在实战中会碰到各种各样的问题,这时候需要自己细心耐心以及编码修改能力来解决这些问题。这样我们才可以做到在这不断提升的攻防中稳步前行。