Bash脚本阻止所有Apple设备

时间:2014-01-02 15:01:25

标签: linux bash iptables nmap

我正在尝试创建一个shell脚本来阻止我网络上的所有Apple设备。我正在使用nmap进行os检测。到目前为止我所拥有的是:

while (true) do
    nmap -O -T4 -p 22,80 -v 172.20.0.0/24 | grep -B9 'OS details: Apple' | \
        grep 'Nmap scan report for' | cut -f4 -d'r' | cut -f2 -d' ' | \
        iptables -i wlan0 -A INPUT -j DROP -s
    sleep 10
done

有没有办法简化这一点,以减少涉及的掠过和切割? 此外,如果在网络上找到多个或零个苹果设备,则此脚本将遇到错误。是否可以为此添加逻辑?

3 个答案:

答案 0 :(得分:2)

是的,当然有可能。您可以使用perl / awk来简化脚本。

此外,我不确定您的脚本目前是否正确。 你有一个管道写地址到iptables,但iptables 不这样做。

如果您想为iptables生成的每个地址运行nmap, 您可以使用read向某个变量读取地址(在我的示例ADDR中) 然后使用iptables中的变量:

while (true) do
    nmap -O -T4 -p 22,80 -v 172.20.0.0/24 | grep -B9 'OS details: Apple' | \
        grep 'Nmap scan report for' | cut -f4 -d'r' | cut -f2 -d' ' | \
        while read ADDR
        do
          iptables -i wlan0 -A INPUT -j DROP -s $ADDR
        done
    sleep 10
done

答案 1 :(得分:2)

还有一些评论:

  • true周围不需要括号。这会启动一个新的子shell,效率很低。在这种情况下,您可能不会关心,但最好避免不必要的子壳。
  • Igor Chubin's answer中的$ADDR是危险的。如果$ADDR包含空格字符,则会将其拆分为单独的参数。网络上的某个人可能会影响NMap的输出,并修改iptables命令的结构。即使这不是这种情况,最好尽可能将参数置于双引号之间以防止这种情况发生:"$ADDR"
  • 出于类似原因,您通常希望使用read -r而不是read。如果没有-r参数,输入中的反斜杠字符将转义后续特殊字符(例如空格)。
  • NMap有自己的Lua脚本支持。这是解决此问题的另一种方法,可能会阻止您完全解析任何文本。
  • 如果您实际位于同一网络上,则可以通过根据设备的MAC地址阻止设备来阻止Apple设备,而无需任何NMAP。前三个字节标识发布MAC地址的组织。你可以查看它们here。它们可以在一个有根的设备上伪造,但是再一次,NMap指纹识别也是如此(虽然这可能会更难)。

答案 2 :(得分:1)

脚本编写的一个重要部分是了解您正在使用的程序以及如何从中获取适当的输出。看起来您对Nmap有一个很好的理解,因为您限制扫描的端口数(-p 22,80)并请求操作系统检测(-O),但是如果使用的话可以避免大量的文本处理appropriate output format

Nmap的“grepable”格式已被弃用,这意味着它不能用于获取更多近期功能的输出,但它适用于OS检测。您使用-oG申请。这是一个例子,借用@IgorChubin's excellent answer的一些循环帮助:

while (true) do
    nmap -O -T4 -p 22,80 -oG - 172.20.0.0/24 | awk '/OS: Apple/{print $2}' | \
        while read ADDR
        do
          iptables -i wlan0 -A INPUT -j DROP -s $ADDR
        done
    sleep 10
done

其他一些改进包括将sleep 10移动到最外层循环的while条件,以允许在其中一个睡眠期间使用Ctrl-C将其杀死。此外,请注意DHCP租约到期,并且您阻止的IP可能会在将来分配给其他系统。一般来说,这种方法似乎不是实现目标的最佳方式。