
软件开发是一项复杂的任务。 它通常涉及过程,理想情况和软件,尽管这些过程,理想情况和软件不会以真正可量化的方式影响最终用户程序,但却使软件开发周期更加有效和可持续。 内部工具是软件的一部分,从非常粗糙的意义上讲,它们可以帮助任何优秀组织的日常运营。 同样在IMG,我们使用许多内部工具。 其中一些由我们开发和维护,而另一些则是开源或免费提供的软件。 无论是用于通信的Slack,用于跟踪的Sentry,用于协作设置实验室氛围的Stream,用于Git存储库管理器的GitLab还是用于服务器监视应用程序的Amon,所有这些对于顺利维护Channel i和IIT都是必不可少的Roorkee网站。
该博客介绍了名为Presence的内部工具的技术方面。 存在是我们用来查看实验室中当前人员姓名的工具。 在IMG的许多人的帮助下构建,在线状态背后的主要思想是,很多时候我们需要了解实验室中当前存在的成员,以便可以将查询重定向到他们。 因此,我们的Slack频道充满了诸如“ 实验室中的谁?”,“实验室中的任何人?”之类的查询。必须采取一些措施来纠正这些问题。 因此,有一天我们坐下来寻找解决方案。
众所周知,您可以使用nmap扫描网络内部当前正在使用的IP。 但是,鲜为人知的事实是,如果您以超级用户权限运行nmap,则可能会期望获得很多额外的信息,并且在许多情况下会得到不同的结果。 对于不知道nmap是什么的人们,nmap是一个开源且使用最广泛的网络扫描仪。 由于其庞大的开发人员社区,它是周围最好的网络映射器之一。 使用超级用户特权运行nmap时,结果的不同之处在于,它使nmap能够创建原始套接字。 那么,什么是原始套接字?它们如何帮助nmap提取额外的信息?

在解释什么是原始套接字之前,让我先从网络编程的角度介绍套接字的概念。 套接字是位于OS网络层实现之上的一种抽象,它可以帮助网络程序员对应用程序进行编码,而无需对TCP / IP,UDP或ICMP的内部知识有任何更深入的了解。 套接字在操作系统级别实现,并提供易于使用的端点来构造各种类型的数据包。 在没有任何超级用户权限的情况下,可以轻松创建某些类型的数据包,例如TCP或UDP数据包,但是对于ARP或ICMP等数据包,则需要创建原始套接字。 这些原始套接字只能由超级用户创建。 这些数据包使nmap可以收集有关当前正在扫描的主机的其他信息。

通过使用ARP数据包,nmap收集有关与IP地址相对应的系统的MAC地址(或网络地址)的信息。 ARP是一种网络层协议,用于查找特定IP的相应MAC地址。 通常,此协议用于路由数据包,因为MAC地址是唯一使网络上的一个设备与其他设备区别开的东西。 IP大多是动态分配的,因此不是区分网络上不同设备的可靠方法。 路由器还维护与MAC地址相对应的IP地址缓存,并定期刷新。 因此,nmap使用这些ARP数据包找出与当前连接到网络的IP对应的MAC地址。 由于MAC地址大部分都是唯一的,因此我们可以获得有关连接到网络的设备的确切信息。

现在,剩下的就是编写完成所有这些工作的脚本。 那是简单的部分,您只需要进行一个为您运行nmap并将其结果存储在文件中的系统调用即可。 然后可以为MAC地址解析该文件。 现在,到那时,每个活动用户的MAC地址都已连接到WiFi,我们现在不得不以某种方式将该MAC地址映射到相应的用户,并将其显示在可公开访问的位置。 那时我对Slackbots感兴趣很多,所以我想为此做一个类似的机器人。 通常,构建Slackbot是一件非常容易的事情。 您只需要设置一个激活短语,Slack就会以消息作为上下文请求一个预定义的URL,并获取结果。 因此,我们需要一个API。
那时我正在学习Django REST Framework,因此继续进行。 尽管轻得多的框架(例如Flask或Tornado)更适合于此任务。 但是我想学习新的东西,所以我继续使用Django。 我构建了API,该API首先在某个URL上侦听POST请求,我的计算机正在该URL上进行ARP扫描,并将报告存在的成员的名称。 在另一个URL上,它将响应传入的Slack请求。 通过这种方式可以更新成员表,并且只要IMG成员想要了解实验室中当前存在的成员,他们只需在空闲渠道中输入状态 , 瞧,您就可以得到实验室中当前人员的姓名。 。

存在解决方案旨在解决IMG成员所面临的一个小问题,并且只涉及一个晚上的编码,Presence已成为IMG内部工具潮流中必不可少的一部分。 在运行了将近两年的时间里,Presence已被许多IMG成员理解,开发和改进,同时仍然继续是每个IMGian使用最广泛的工具之一。