登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
  立华软件园 - 安全技术中心 - 技术文档 - 破解专题 技术文章 | 相关下载 | 电子图书 | 攻防录像 | 安全网站 | 在线论坛 | QQ群组 | 搜索   
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
 其他安全技术资源
  · 攻防演示动画
  · 电子图书
  · QQ群组讨论区
  · 其他网站资源
最新招聘信息

Radmin服务端保持连接不断问题分析与解决
发表日期:2006-10-14作者:grassgrass (kityest_at_163.com)[转贴] 出处:安全焦点  

Radmin服务端保持连接不断问题分析与解决
作者:        grassgrass
Email:     kityest@163.com
1、问题描述
    Radmin是一个绝佳的远程控制软件,用来做跳板的后门再好不过了,不过每次连过跳板后,察看跳板连线,可以仍然看见我们和跳板上Radmin的连接,只不过显示为TIME_WAIT,且一直这样。
Proto  Local Address          Foreign Address        State
TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
TCP    0.0.0.0:1030           0.0.0.0:0              LISTENING
TCP    127.0.0.1:1031         0.0.0.0:0              LISTENING
TCP    192.168.11.1:139       0.0.0.0:0              LISTENING
TCP    192.168.72.1:139       0.0.0.0:0              LISTENING
TCP    192.168.168.220:1030   192.168.168.221:1034   TIME_WAIT
UDP    0.0.0.0:445            *:*
UDP    0.0.0.0:1026           *:*
UDP    127.0.0.1:123          *:*
UDP    127.0.0.1:1900         *:*
UDP    192.168.11.1:123       *:*
UDP    192.168.11.1:137       *:*
UDP    192.168.11.1:138       *:*
UDP    192.168.11.1:1900      *:*
UDP    192.168.72.1:123       *:*
UDP    192.168.72.1:137       *:*
UDP    192.168.72.1:138       *:*
UDP    192.168.72.1:1900      *:*
UDP    192.168.168.220:123    *:*
UDP    192.168.168.220:1900   *:*
2、问题分析
    初步猜测应该是setsocketopt设置超时有问题,可能是设置了无限超时?
    调试Radmin服务端,下断点在setsocketopt,结果如下:
第一次断下来
71A42E30 >  8BFF            MOV EDI,EDI
71A42E32    55              PUSH EBP
71A42E33    8BEC            MOV EBP,ESP
71A42E35    837D 0C 00      CMP DWORD PTR SS:[EBP+C],0
71A42E39    0F84 25010000   JE WSOCK32.71A42F64
71A42E3F    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]
71A42E42    837D 0C 06      CMP DWORD PTR SS:[EBP+C],6
71A42E46    8B4D 14         MOV ECX,DWORD PTR SS:[EBP+14]
71A42E49    74 75           JE SHORT WSOCK32.71A42EC0
71A42E4B    FF75 18         PUSH DWORD PTR SS:[EBP+18]
71A42E4E    51              PUSH ECX
71A42E4F    50              PUSH EAX
71A42E50    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
71A42E53    FF75 08         PUSH DWORD PTR SS:[EBP+8]
71A42E56    E8 09000000     CALL <JMP.&WS2_32.#21__setsockopt@20>
71A42E5B    5D              POP EBP
71A42E5C    C2 1400         RETN 14
71A42E5F    90              NOP
71A42E60    90              NOP
71A42E61    90              NOP
71A42E62    90              NOP
71A42E63    90              NOP
71A42E64  - FF25 0010A471   JMP DWORD PTR DS:[<&WS2_32.#21__setsocko>; WS2_32.setsockopt
察看堆栈:
0012F808   0096D367  /CALL 到 setsockopt 来自 0096D362
0012F80C   0000007C  |Socket = 7C
0012F810   0000FFFF  |Level = SOL_SOCKET
0012F814   00000080  |Option = SO_LINGER
0012F818   0012F844  |Data = 0012F844
0012F81C   00000004  \DataSize = 4
0012F820   0000FFFF
0012F824   0012F84C
0012F828  /0012F850
0012F82C  |009652F2  返回到 009652F2 来自 0096D340
0012F830  |00000080
0012F834  |0012F844
0012F838  |00000004
0012F83C  |0012F870
0012F840  |001D0406
0012F844  |00010001
0012F848  |0012F870
0012F84C  |0000007C
0012F850  ]0012F884
可以看到,它设置了SO_LINGER选项,值为0x00010001
第二次断点:
71A42E30 >  8BFF            MOV EDI,EDI
71A42E32    55              PUSH EBP
71A42E33    8BEC            MOV EBP,ESP
71A42E35    837D 0C 00      CMP DWORD PTR SS:[EBP+C],0
71A42E39    0F84 25010000   JE WSOCK32.71A42F64
71A42E3F    8B45 10         MOV EAX,DWORD PTR SS:[EBP+10]
71A42E42    837D 0C 06      CMP DWORD PTR SS:[EBP+C],6
71A42E46    8B4D 14         MOV ECX,DWORD PTR SS:[EBP+14]
71A42E49    74 75           JE SHORT WSOCK32.71A42EC0
71A42E4B    FF75 18         PUSH DWORD PTR SS:[EBP+18]
71A42E4E    51              PUSH ECX
71A42E4F    50              PUSH EAX
71A42E50    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
71A42E53    FF75 08         PUSH DWORD PTR SS:[EBP+8]
71A42E56    E8 09000000     CALL <JMP.&WS2_32.#21__setsockopt@20>
71A42E5B    5D              POP EBP
71A42E5C    C2 1400         RETN 14
堆栈:
0012F80C   0096D367  /CALL 到 setsockopt 来自 0096D362
0012F810   00000078  |Socket = 78
0012F814   0000FFFF  |Level = SOL_SOCKET
0012F818   00000080  |Option = SO_LINGER
0012F81C   0012F84C  |Data = 0012F84C
0012F820   00000004  \DataSize = 4
0012F824   0000FFFF
0012F828   0012F848
0012F82C  /0012F850
0012F830  |00965419  返回到 00965419 来自 0096D340
0012F834  |00000080
0012F838  |0012F84C
0012F83C  |00000004
0012F840  |0012F864
0012F844  |0012F870
0012F848  |00000078
0012F84C  |00010001
0012F850  ]0012F884
可见第一次与第二次相同
F9,没有下个断点,可见只有这两处,上网搜索SO_LINGER选项,其描述如下:

     /* 当连接中断时,需要延迟关闭(linger)以保证所有数据都
   * 被传输,所以需要打开SO_LINGER这个选项        //注:大致意思就是说SO_LINGER选项用来设置当调用closesocket时是否马上关闭socket
   * linger的结构在/usr/include/linux/socket.h中定义://注:这个结构就是SetSocketOpt中的Data的数据结构
   *  struct linger
   *  {
   *   int l_onoff;  /* Linger active */         //低字节,0和非0,用来表示是否延时关闭socket
   *   int l_linger; /* How long to linger */     //高字节,延时的时间数,单位为秒
   *  };
   *  如果l_onoff为0,则延迟关闭特性就被取消。如果非零,则允许套接口延迟关闭。
   *  l_linger字段则指明延迟关闭的时间
   */
更具体的描述如下:
若设置了SO_LINGER(亦即linger结构中的l_onoff域设为非零,参见2.4,4.1.7和4.1.21各节),并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的recv()调用将以WSAECONNRESET出错。

若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅的”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。

若在一个流类套接口上设置了SO_DONTLINGER(也就是说将linger结构的l_onoff域设为零;参见2.4,4.1.7,4.1.21节),则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。

这是网上的解释
主要是影响close socket时的动作
知道了问题的原因,我们就动手修改一下试试
0012F80C   0096D367  /CALL 到 setsockopt 来自 0096D362
0012F810   00000078  |Socket = 78
0012F814   0000FFFF  |Level = SOL_SOCKET
0012F818   00000080  |Option = SO_LINGER
0012F81C   0012F84C  |Data = 0012F84C
0012F820   00000004  \DataSize = 4
0012F824   0000FFFF
0012F828   0012F848
0012F82C  /0012F850
0012F830  |00965419  返回到 00965419 来自 0096D340
0012F834  |00000080
0012F838  |0012F84C
0012F83C  |00000004
0012F840  |0012F864
0012F844  |0012F870
0012F848  |00000078
0012F84C  |00010100      //原来的00010001表示延时256秒,将延时改为1秒
F9运行,用客户端连接,连上后再断开,察看服务端连线,发现以前总是显示为TIME_WAIT的连接,现在马上消失了,至此问题解决:)
3、Radmin修改
Radmin的保护措施做的还是很不错的,它的真正的执行程序是一个RES资源,主程序只负责将其解压缩到内存中并执行,如果要修改就需要自己解压缩,修改后再自己压缩了放回去,具体怎么做我就不说了:)
提示:如果要重复我一样步骤,直接下setsocketopt是断不下来的,先下jmp eax ,断下来后F8一次,再下setsoketopt断点,好了,就提示这么多了。
 
 
我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 Radmin服务端保持连接不断问题分析与解决

 ■ [欢迎对本文发表评论]
用  户:  匿名发出:
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接  
Copyright ©2001-2006 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00181