知识大全 raw

Posted

篇首语:敢说敢作敢为, 无怨无恨无悔。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 raw相关的知识,希望对你有一定的参考价值。

  socket( PF_INET SOCK_RAW IPPROTO_TCP );     在RedHat 下这两种socket都可以正常建立 内核支持了的 但是对于Solaris 如果以root身份truss跟踪这两个函数 发现第二个socket建立的时候 内核不支持这种情况下指定IPPROTO_TCP 库函数本身做了处理     so_socket( ) Err# EPROTOTYPE   stat( /dev/rawip xEFFFFAC ) =   so_socket( /dev/rawip ) =   setsockopt( xEFFFFBB ) =     从执行效果看 这样的处理和Linux下的意义不同了     如果考虑广泛兼容性 应该扔弃第二种socket 全部以IPPROTO_RAW方式出现 这样的话 理论上可以考虑不用TCP/UDP协议 但是涉及client/server模式 显然应该继   续使用TCP/UDP 从突破防火墙角度看 还是以鬼子的ACK方式为好 UDP通信被很多防火墙屏蔽 TCP也好不到哪里去 而且按照目前的设想 等于仅仅使用TCP的头部概 念 并没有使用TCP协议的超时 重传等机制 更没有有限状态机介入 为什么不使用UDP呢?还是应该从防火墙角度考虑这个设计选择 具体问题具体分析吧 现在的难点是完全使用IPPROTO_RAW 写没多大问题 读有了麻烦 又需要重翻UNP 此外 丢包是毫无疑问的 因此必须尽量设计成无状态方式(NFS Server就是一个例子) 这 个也仅仅是说说 技术问题尚未可知     关于内核传递IP报文到一个raw_socket 有几点需要注意 我们分别探讨之      ) TCP/UDP报文(IP报文负载为TCP/UDP) 永远 不会传递给raw_socket Stevens介绍   的时候以BSD家族为例     对于Linux显然已经不适用这个结论 socket( PF_INET SOCK_RAW IPPROTO_TCP )   就可以接收到TCP报文 Linux内核是给了这个机会的 此时正常的TCP协议层也会收到TCP报文(后面我们会写测试代码验证它) 于是造成潜在的安全隐患 在无需   数据链路层和网卡混杂模式介入的情况下 利用raw_socket监视发往本机的TCP报文 尽管只有root才可以创建raw_socket 但获得创建raw_socket的机会和获得完整root权限相比要大得多 对于Solaris系统 内核应该是没有支持   socket( PF_INET SOCK_RAW IPPROTO_TCP )方式 尽管以root身份执行库函数并没有报错(此时库函数自己做了其他处理)     对于Windows K 从backend拖回来的程序执行效果以及袁哥分析代码的结论看 K可能支持socket( PF_INET SOCK_RAW IPPROTO_TCP )这种方式 抓包分析   backdoor的client/server通信 发现除了预料中的ACK 还夹带有RST 只能说明 K内核传递IP报文到raw_socket的同时传递给了正常的TCP协议层 RST是由正常   TCP协议层发出的 NT/ x估计没戏     考虑我们要达到的目的 如果内核不给这个机会(传递TCP报文到raw_socket) 意味着ACK方式破产 UDP自然也不用想了 虽然Linux可以 但我们希望得到一个更广泛兼容的backdoor 可以从数据链路层考虑这个问题 牵扯的问题更多 没有太大必要      ) 对于伯克利实现而言 内核一般处理了几种常见ICMP报文( 种 回应请求 时间戳请求 地址掩码请求) 其余未处理ICMP报文交给raw_socket 注意内核并没有   处理上面三种请求报文的应答报文 想想ping c的实现 如果内核处理icmp echo reply 即使指定IPPROTO_ICMP 处于应用层的ping也没有机会得到应答报文 这里所说内核处理 都是指处理入IP报文 对于发送IP报文 基本上任   由应用程序处理的 所以ping可以发送自己的icmp echo request     Linux/Solaris的实现有差别 提供给应用层更多机会 内核处理了icmp echo request 同时会交给socket( PF_INET SOCK_RAW IPPROTO_ICMP ) 不同于BSD   实现 内核未处理的icmp报文依旧交给raw_socket 这给我们一个机会 编写自己的icmp daemon 利用被内核传递到raw_socket的icmp报文进行交互式通信 从突破防火墙角度考虑 比较现实 一般管理员会允许icmp echo request进入 管理员要是在防火墙上过滤了icmp echo request 估计我们也没有机会在这种敌人内部安装icmp daemon 走先      ) 所有的IGMP报文交给raw_socket     同上 可以利用 现在的操作系统好象已经开始在内核里处理igmp 那样的话 机会不大 而且防火墙对IGMP报文比较敏感     socket( AF_INET SOCK_RAW IPPROTO_IGMP ) Linux上可以接收到IGMP报文 Solaris上不行      ) 如果内核无法理解IP报文头中高层协议类型 传递该报文给raw_socket     内核无法理解的 对于防火墙也是无法理解的 除非不考虑突破防火墙的网络拓扑 否则暂时别想 此外从前面的测试中看到 Linux/Solaris下必须精确指定第   三个参数可以接收匹配IP报文 如果要利用内核无法理解之协议类型 必须确保该类型可以指定在第三个参数中      ) IP分片一定是在内核中重组完成了才会传递给raw_socket     换句话说 raw_socket无法分析IP分片 数据链路层可以 这里隐含着一个意思 IP分片重组永远在内核完成 一旦这部分的处理代码出了问题 就是内核的麻烦 所以死得快      ) 如果内核决定传递一个IP报文到raw_socket 则系统中所有进程创建的所有raw_socket都会收到这个IP报文 这是一个潜在的安全问题     我们在测试程序中创建socket( PF_INET SOCK_RAW   IPPROTO_ICMP ) 启动了两   个实例 然后从其他主机ping本机 两个实例都收到了icmp echo request      ) 创建socket( PF_INET SOCK_RAW ) 并且不调用bind connect 这样的   raw_socket接收所有内核传递上来的IP报文 第三个参数是指定匹配的 如果非   零 不匹配的IP报文不会被传递给该raw_socket 对于这种系统 企图监视本机   所有入IP报文 不需要数据链路层介入 也不要求网卡混杂模式 简单创建一个   raw_socket 指定第三个参数为 即可     遗憾的是 我们在Linux下测试 根本就不支持第三个参数指定为 指定成    (IPPROTO_RAW)也无法达到Stevens描述的效果 主要用于发送 Stevens介   绍的可能仅仅是BSD实现吧     关于这个 觉得看看Linux关于raw_socket的实现部分比较好 瞎猜也不是办法      ) 有些代码使用了raw_socket 并未指定IP_HDRINCL选项 年为了解决   traceroute问题引入了一个patch 创建SOCK_RAW时 指定第三个参数为   IPPROTO_RAW(值 ) 效果和指定IP_HDRINCL选项一样 还更方便些        /*   * For Solaris   * gcc O o raw raw c lsocket lnsl   *   * For Linux   * gcc O o raw raw c   */   #include   #include   #include   #include   #include   #include   #include   #include   #include   #include   #include     #define SUCCESS   #define FAILURE     int recvSocket;   u_char packet[ ];     void Close ( int fd )      if ( close( fd ) == )      perror( close );   exit( FAILURE );      return;    /* end of Close */     void outputBinary ( const unsigned char * byteArray const size_t byteArrayLen )      u_long offset;   int i j k;   fprintf( stderr byteArray [ %lu bytes ] > \\n byteArrayLen );   if ( byteArrayLen <= )      return;      i = ;   offset = ;   for ( k = byteArrayLen / ; k > ; k offset += )      fprintf( stderr % X offset );   for ( j = ; j < ; j++ i++ )      if ( j == )      fprintf( stderr % X byteArray[i] );      else      fprintf( stderr % X byteArray[i] );         fprintf( stderr );   i = ;   for ( j = ; j < 16; j++, i++ )      /* if ( isprint( (int)byteArray[i] ) ) */   if ( ( byteArray[i] >= ) && ( byteArray[i] <= 255 ) )      fprintf( stderr, "%c", byteArray[i] );      else      fprintf( stderr, "." );         fprintf( stderr, "\\n" );    /* end of for */   k = byteArrayLen - i;   if ( k <= 0 )      return;      fprintf( stderr, "%08X ", offset );   for ( j = 0 ; j < k; j++, i++ )      if ( j == 8 )      fprintf( stderr, "-%02X", byteArray[i] );      else      fprintf( stderr, " %02X", byteArray[i] );         i -= k;   for ( j = 16 - k; j > 0; j-- )      fprintf( stderr, " " );      fprintf( stderr, " " );   for ( j = 0; j < k; j++, i++ )      if ( ( byteArray[i] >= \' \' ) && ( byteArray[i] <= 255 cha138/Article/program/Oracle/201311/17939

相关参考

知识大全 Raw Socket编程实现网络封包监视

RawSocket编程实现网络封包监视  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  谈起soc

如何优化图像质量

数码单反相机的图像格式可以选择JPEG也可以选择RAW格式,RAW格式对于后期制作是非常有利的。另外,RAW格式的画面不会经过相机的自动调整,其质量会更优质一些。当然,摄影者可以通过设置饱和度、反差、

知识大全 请问我使用photoshop的camera raw中的调整画笔工具时,画笔和所选择的区域发生偏移,不是同一个位置

请问我使用photoshop的cameraraw中的调整画笔工具时,画笔和所选择的区域发生偏移,不是同一个位置?换一个画笔笔刷ps的修复画笔工具能调整画笔大小吗可以根据影象的特点、大小、位置来不断的变

知识大全 解决不同字符集数据库间的数据同步问题

  解决不同字符集数据库间的数据同步问题  首先在原数据库上做一个视图对保存汉字的字段加包函数utl_raw_cast_to_raw(保存汉字的字段)  在新数据库上做个数据库连接连接指向原数据库之后

知识大全 台电10s平板电脑双系统怎么删除安卓系统

台电10s平板电脑双系统怎么删除安卓系统手指长按开始按钮,选择右键菜单中的磁盘管理器。打开磁盘管理界面,这里会显示磁盘的格式、容量等。双系统平板中,安卓系统占据的磁盘会以RAW格式分区显示。3选择RA