如何解决网络监听?您有几中解决方案?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决网络监听?您有几中解决方案?相关的知识,希望对你有一定的参考价值。

如何解决网络监听?您有几中解决方案?关与网络监听的内容都可以,要有解方案哦.

参考技术A 在网络中,当信息进行传播的时候,可以利用工具,将网络接口设置在监听的模式,便可将网络
中正在传播的信息截获或者捕获到,从而进行攻击。网络监听在网络中的任何一个位置模式下都可实
施进行。而黑客一般都是利用网络监听来截取用户口令。比如当有人占领了一台主机之后,那么他要
再想将战果扩大到这个主机所在的整个局域网话,监听往往是他们选择的捷径。很多时候我在各类安
全论坛上看到一些初学的爱好者,在他们认为如果占领了某主机之后那么想进入它的内部网应该是很
简单的。其实非也,进入了某主机再想转入它的内部网络里的其它机器也都不是一件容易的事情。因
为你除了要拿到他们的口令之外还有就是他们共享的绝对路径,当然了,这个路径的尽头必须是有写
的权限了。在这个时候,运行已经被控制的主机上的监听程序就会有大收效。不过却是一件费神的事
情,而且还需要当事者有足够的耐心和应变能力。

█网络监听的原理

Ethernet(以太网,它是由施乐公司发明的一种比较流行的局域网技术,它包含一条所有计算机
都连接到其上的一条电缆,每台计算机需要一种叫接口板的硬件才能连接到以太网)协议的工作方式
是将要发送的数据包发往连接在一起的所有主机。在包头中包括有应该接收数据包的主机的正确地址,
因为只有与数据包中目标地址一致的那台主机才能接收到信息包,但是当主机工作在监听模式下的话
不管数据包中的目标物理地址是什么,主机都将可以接收到。许多局域网内有十几台甚至上百台主机
是通过一个电缆、一个集线器连接在一起的,在协议的高层或者用户来看,当同一网络中的两台主机
通信的时候,源主机将写有目的的主机地址的数据包直接发向目的主机,或者当网络中的一台主机同
外界的主机通信时,源主机将写有目的的主机IP地址的数据包发向网关。但这种数据包并不能在协议
栈的高层直接发送出去,要发送的数据包必须从TCP/IP协议的IP层交给网络接口,也就是所说的数据
链路层。网络接口不会识别IP地址的。在网络接口由IP层来的带有IP地址的数据包又增加了一部分以
太祯的祯头的信息。在祯头中,有两个域分别为只有网络接口才能识别的源主机和目的主机的物理地
址这是一个48位的地址,这个48位的地址是与IP地址相对应的,换句话说就是一个IP地址也会对应一
个物理地址。对于作为网关的主机,由于它连接了多个网络,它也就同时具备有很多个IP地址,在每
个网络中它都有一个。而发向网络外的祯中继携带的就是网关的物理地址。

Ethernet中填写了物理地址的祯从网络接口中,也就是从网卡中发送出去传送到物理的线路上。
如果局域网是由一条粗网或细网连接成的,那么数字信号在电缆上传输信号就能够到达线路上的每一
台主机。再当使用集线器的时候,发送出去的信号到达集线器,由集线器再发向连接在集线器上的每
一条线路。这样在物理线路上传输的数字信号也就能到达连接在集线器上的每个主机了。当数字信号
到达一台主机的网络接口时,正常状态下网络接口对读入数据祯进行检查,如果数据祯中携带的物理
地址是自己的或者物理地址是广播地址,那么就会将数据祯交给IP层软件。对于每个到达网络接口的
数据祯都要进行这个过程的。但是当主机工作在监听模式下的话,所有的数据祯都将被交给上层协议
软件处理。

当连接在同一条电缆或集线器上的主机被逻辑地分为几个子网的时候,那么要是有一台主机处于
监听模式,它还将可以接收到发向与自己不在同一个子网(使用了不同的掩码、IP地址和网关)的主
机的数据包,在同一个物理信道上传输的所有信息都可以被接收到。

在UNIX系统上,当拥有超级权限的用户要想使自己所控制的主机进入监听模式,只需要向
Interface(网络接口)发送I/O控制命令,就可以使主机设置成监听模式了。而在Windows9x的系统
中则不论用户是否有权限都将可以通过直接运行监听工具就可以实现了。

在网络监听时,常常要保存大量的信息(也包含很多的垃圾信息),并将对收集的信息进行大量
的整理,这样就会使正在监听的机器对其它用户的请求响应变的很慢。同时监听程序在运行的时候需
要消耗大量的处理器时间,如果在这个时候就详细的分析包中的内容,许多包就会来不及接收而被漏
走。所以监听程序很多时候就会将监听得到的包存放在文件中等待以后分析。分析监听到的数据包是
很头疼的事情。因为网络中的数据包都非常之复杂。两台主机之间连续发送和接收数据包,在监听到
的结果中必然会加一些别的主机交互的数据包。监听程序将同一TCP会话的包整理到一起就相当不容
易了,如果你还期望将用户详细信息整理出来就需要根据协议对包进行大量的分析。Internet上那么
多的协议,运行进起的话这个监听程序将会十分的大哦。

现在网络中所使用的协议都是较早前设计的,许多协议的实现都是基于一种非常友好的,通信的
双方充分信任的基础。在通常的网络环境之下,用户的信息包括口令都是以明文的方式在网上传输的,
因此进行网络监听从而获得用户信息并不是一件难点事情,只要掌握有初步的TCP/IP协议知识就可以
轻松的监听到你想要的信息的。前些时间美籍华人China-babble曾提出将望路监听从局域网延伸到广
域网中,但这个想法很快就被否定了。如果真是这样的话我想网络必将天下大乱了。而事实上现在在
广域网里也可以监听和截获到一些用户信息。只是还不够明显而已。在整个Internet中就更显得微不
足道了。

下面是一些系统中的著名的监听程序,你可以自己尝试一下的。

Windows9x/NT NetXRay http://semxa.kstar.com/hacking/netxray.zip

DECUnix/Linux Tcpdump http://semxa.kstar.com/hacking/management.zip

Solaris Nfswatch http://semxa.kstar.com/hacking/nfswatch.zip

SunOS Etherfind http://semxa.kstar.com/hacking/etherfind012.zip

█检测网络监听的方法

网络监听在上述中已经说明了。它是为了系统管理员管理网络,监视网络状态和数据流动而设计
的。但是由于它有着截获网络数据的功能所以也是黑客所惯用的伎俩之一。

一般检测网络监听的方法通过以下来进行:

►网络监听说真的,是很难被发现的。当运行监听程序的主机在进听的过程中只是被动的
接收在以太网中传输的信息,它不会跟其它的主机交换信息的,也不能修改在网络中传输的信息包。
这就说明了网络监听的检测是比较麻烦的事情。

一般情况下可以通过ps-ef或者ps-aux来检测。但大多实施监听程序的人都会通过修改ps的命令
来防止被ps-ef的。修改ps只需要几个shell把监听程序的名称过滤掉就OK了。一能做到启动监听程
序的人也绝对不是个菜的连这个都不懂的人了,除非是他懒。

上边提到过。当运行监听程序的时候主机响应一般会受到影响变的会慢,所以也就有人提出来通
过响应的速率来判断是否受到监听。如果真是这样判断的话我想世界真的会大乱了,说不准一个时间
段内会发现无数个监听程序在运行呢。呵呵。

如果说当你怀疑网内某太机器正在实施监听程序的话(怎么个怀疑?那要看你自己了),可以用
正确的IP地址和错误的物理地址去ping它,这样正在运行的监听程序就会做出响应的。这是因为正常
的机器一般不接收错误的物理地址的ping信息的。但正在进听的机器就可以接收,要是它的IPstack
不再次反向检查的话就会响应的。不过这种方法对很多系统是没效果的,因为它依赖于系统的IPstack。

另一种就是向网上发大量不存在的物理地址的包,而监听程序往往就会将这些包进行处理,这样
就会导致机器性能下降,你可以用icmpechodelay来判断和比较它。还可以通过搜索网内所有主机
上运行的程序,但这样做其的难度可想而知,因为这样不但是大的工作量,而且还不能完全同时检查
所有主机上的进程。可是如果管理员这样做也会有很大的必要性,那就是可以确定是否有一个进程是
从管理员机器上启动的。

在Unix中可以通过ps–aun或ps–augx命令产生一个包括所有进程的清单:进程的属主和这些
进程占用的处理器时间和内存等。这些以标准表的形式输出在STDOUT上。如果某一个进程正在运行,
那么它将会列在这张清单之中。但很多黑客在运行监听程序的时候会毫不客气的把ps或其它运行中的
程序修改成TrojanHorse程序,因为他完全可以做到这一点的。如果真是这样那么上述办法就不会有
结果的。但这样做在一定程度上还是有所作为的。在Unix和WindowsNT上很容易就能得到当前进程的
清单了。但DOS、Windows9x好象很难做到哦,具体是不是我没测试过不得而知。

还有一种方式,这种方式要靠足够的运气。因为往往黑客所用的监听程序大都是免费在网上得到
的,他并非专业监听。所以做为管理员用来搜索监听程序也可以检测。使用Unix可以写这么一个搜索
的小工具了,不然的话要累死人的。呵呵。

有个叫Ifstatus的运行在Unix下的工具,它可以识别出网络接口是否正处于调试状态下或者是在
进听装下。要是网络接口运行这样的模式之下,那么很有可能正在受到监听程序的攻击。Ifstatus一
般情况下不会产生任何输出的,当它检测到网络的接口处于监听模式下的时候才回输出。管理员可以
将系统的cron参数设置成定期运行Ifstatus,如果有好的cron进程的话可以将它产生的输出用mail发
送给正在执行cron任务的人,要实现可以在crontab目录下加****/usr/local/etc/ifstatus一行参数。
这样不行的话还可以用一个脚本程序在crontab下00****/usr/local/etc/run-ifstatus。

抵御监听其实要看哪个方面了。一般情况下监听只是对用户口令信息比较敏感一点(没有无聊的
黑客去监听两台机器间的聊天信息的那是个浪费时间的事情)。所以对用户信息和口令信息进行加密
是完全有必要的。防止以明文传输而被监听到。现代网络中,SSH(一种在应用环境中提供保密通信
的协议)通信协议一直都被沿用,SSH所使用的端口是22,它排除了在不安全信道上通信的信息,被
监听的可能性使用到了RAS算法,在授权过程结束后,所有的传输都用IDEA技术加密。但SSH并不就是
完全安全的。至少现在我们可以这么大胆评论了。

█著名的Sniffer监听工具

Sniffer之所以著名,权因它在很多方面都做的很好,它可以监听到(甚至是听、看到)网上传
输的所有信息。Sniffer可以是硬件也可以是软件。主要用来接收在网络上传输的信息。网络是可以
运行在各种协议之下的,包括以太网Ethernet、TCP/IP、ZPX等等,也可以是集中协议的联合体系。

Sniffer是个非常之危险的东西,它可以截获口令,可以截获到本来是秘密的或者专用信道内的
信息,截获到信用卡号,经济数据,E-mail等等。更加可以用来攻击与己相临的网络。

Sniffer可以使用在任何一种平台之中。而现在使用Sniffer也不可能别发现,这个足够是对网
络安全的最严重的挑战。

在Sniffer中,还有“热心人”编写了它的Plugin,称为TOD杀手,可以将TCP的连接完全切断。
总之Sniffer应该引起人们的重视,否则安全永远做不到最好。本回答被提问者采纳

用启发式实现回溯搜索?

【中文标题】用启发式实现回溯搜索?【英文标题】:Implementing a backtrack search with heuristic? 【发布时间】:2013-05-06 16:41:12 【问题描述】:

我对搜索算法和回溯编程越来越感兴趣。目前,我已经实现了算法 X(请参阅我的其他帖子:Determine conflict-free sets?)来解决精确覆盖问题。这很好用,但我现在有兴趣使用更基本的回溯变体来解决这个问题。我只是无法弄清楚如何做到这一点。问题描述和之前一样:

假设您有一堆集合,而每个集合都有几个子集。

Set1 = (香蕉、菠萝、橙子)、(苹果、羽衣甘蓝、黄瓜)、(洋葱、大蒜)

Set2 = (香蕉、黄瓜、大蒜)、(鳄梨、番茄)

...

SetN = ...

现在的目标是从每个集合中选择一个子集,而每个子集必须与任何其他选定的子集无冲突(一个元素不包含在任何其他选定的子集中)。

例如,我编写了两个 Java 类。集合由单个字符标识,元素是纯数字。

我具体有两个问题:

如何迭代所有集合/子集,以便可以使用启发式方法(选择具有最少元素、最低成本的子集...) 如何维护选定的集合+子集及其包含的元素。

我能找到的所有其他示例都是数独或 n-Queens,并且都使用固定的 for 循环。除此之外,我正在考虑一种相当通用的方法,其中可以使用函数“isPossiblePartialSolution”来检查所选路径/集是否可能与先前选择的子集/元素冲突。

这是两个 Java 类:

import java.util.ArrayList;

public class Main 

public static void main(String[] args) 

    ArrayList<Set> allSets = buildRandomTest();

    for(Set r : allSets) 
        System.out.print("Set with id: " + r.id + " is subset in collection: " + r.name + " and contains: ");
        for(Integer n : r.listOfElements) 
            System.out.print(" " + n + " ");
        
        System.out.println();
    



public static int myRandomRange(int low, int high) 
    return (int) (Math.random() * (++high - low) + low);


public static ArrayList<Set> buildRandomTest() 

    ArrayList<Set> mySet = new ArrayList<Set>();

    int numberOfSets = myRandomRange(10, 12);

    for(int i=0; i<numberOfSets; i++) 
        String nameOfSet = Character.toString((char) myRandomRange(65, 67));
        Set tmp = new Set(nameOfSet, i);

        ArrayList<Integer> listOfElements = new ArrayList<Integer>();
        int elementsInList = myRandomRange(2, 4);

        for(int j=0; j<elementsInList; j++) 
            listOfElements.add(myRandomRange(1,30));
        

        tmp.listOfElements = listOfElements;
        mySet.add(tmp);
    

    return mySet;



import java.util.ArrayList;

public class Set 

public String name;
public int id;
public ArrayList<Integer> listOfElements;

public Set(String name, int id) 
    this.name = name;
    this.id = id;
    listOfElements = new ArrayList<Integer>();



【问题讨论】:

【参考方案1】:

编辑:实际上听起来您已经实现了 Dancing Links(使用名称“算法 X”),所以我不确定您要的是什么。 “更基本的回溯变体”是指“更慢的变体”吗? Dancing Links 是你能得到的最基础的东西......

原始答案:如果我这样做,我会尝试将其简化为精确覆盖问题,这可以通过Dancing Links 解决。即,构造一个由 0 和 1 组成的矩阵,找到其行的子集,使得每列中恰好有一个 1,然后将该行集转换回原始问题的答案。

以下答案是用 C++(11) 编写的,但希望您能看到如何将其翻译成 Java。在 Java 中实现 Dancing Links 作为练习留给读者和/或您选择的搜索引擎。

enum Element 
    apple, avocado, banana, cucumber, garlic,
    kale, onion, orange, pineapple, NUM_ELEMENTS
;

std::vector<std::vector<std::set<Element>>> sets = 
     banana, pineapple, orange, apple, kale, cucumber, onion, garlic ,
     banana, cucumber, garlic, avocado, tomato ,
    ...
;

int rows, columns;

// One row per subset, obviously...
rows = 0;
for (auto &vs : sets) 
    rows += vs.size();

// ...plus N more rows for "vegetable X is not in any selected subset".
rows += NUM_ELEMENTS;

// One column per vegetable, obviously...
columns = NUM_ELEMENTS;
// ...plus N more columns for "we've chosen a subset from set X".
columns += sets.size();

Matrix M(rows, columns);

M.initialize_to_all_zeros();

int r = 0;
for (int i=0; i < sets.size(); ++i) 
    for (int j=0; j < sets[i].size(); ++j) 
        auto &subset = sets[i][j];
        M[r][NUM_ELEMENTS + i] = 1;  // the subset is a member of set i
        for (Element veg : subset) 
            M[r][veg] = 1;  // the subset contains this element
        
        ++r;
    

for (Element veg = apple; veg < NUM_ELEMENTS; ++veg) 
    M[r][veg] = 1;
    ++r;


// Now perform Dancing Links on the matrix to compute an exact cover.
std::set<int> row_indices = dancing_links(M);

// Now print out the subsets.
r = 0;
for (int i=0; i < sets.size(); ++i) 
    for (int j=0; j < sets[i].size(); ++j) 
        if (row_indices.find(r) != row_indices.end()) 
            print_set(sets[i][j]);
        
        ++r;
    

// And print the unused vegetables, just for kicks.
for (Element veg = apple; veg < NUM_ELEMENTS; ++veg) 
    if (row_indices.find(r) != row_indices.end()) 
        std::cout << "Vegetable " << veg << " was not mentioned above.\n";
    
    ++r;

【讨论】:

回溯的思想很笼统,可以应用于很多问题。 Dancing Links 只能应用于精确覆盖问题。应该可以使用“正常”回溯方法来实现这一点(我知道,这将比 DLX 慢!)。根据我的理解,我们需要一个函数 then 来告诉我们是否与之前的任何决定存在冲突。除此之外,这还允许使用不同的启发式方法! 使用不同的启发式是我想要实现的。想象一下,“购买”一套或另一套更便宜(因此与 Dancing Links 不同,我们会选择成本最低的一套,而不是元素最少的一套)。使用 Dancing Links 无法做到这一点。 @user26372 Dancing Links 通常使用启发式“首先检查具有最少 1 的列”(即,首先尝试满足最困难约束的行),但如果你不喜欢那个,你当然可以使用不同的启发式。请参阅my own Dancing Links implementation in C, here,并想象一下如何更改#if USE_HEURISTIC 下的代码以使用不同的启发式算法。 这行不通,因为列没有说明受影响的行。要使用某些自定义指标,您必须根据某些属性而不是列来选择行。我确实在寻找一种比 Dancing Links 慢的变体,因为我想使用一些定制的启发式方法。应该可以迭代所有集合,就像对数独、n-Queens 等所做的那样,而无需实际使用舞蹈链接。 查看算法描述(在框中)here。请注意,步骤 2 和 3 可以替换为单个步骤“选择一行 r(非确定性)”。在您的 Dancing Links 求解器中实现此功能(即,始终按照 第 1 行、第 2 行、第 3 行... 的顺序删除行,按您喜欢的任何“成本”函数排序)。

以上是关于如何解决网络监听?您有几中解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

fiddler怎么不监听本机的网络请求

Flutter-手机网络状态监听

设置 GPS 监听超时

oracle连接“监听程序当前无法识别连接描述符中请求的服务’怎么解决

Oracle只监听本机,网络其他计算机连不上

如何让 Quarkus 监听所有网络接口而不是 localhost?