Linux Bash脚本阻止所有Apple设备

Linux Bash脚本阻止所有Apple设备,linux,bash,iptables,nmap,Linux,Bash,Iptables,Nmap,我正在尝试创建一个shell脚本来阻止我网络上的所有苹果设备。我正在使用nmap进行操作系统检测。到目前为止,我得到的是: 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 wla

我正在尝试创建一个shell脚本来阻止我网络上的所有苹果设备。我正在使用
nmap
进行操作系统检测。到目前为止,我得到的是:

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
有没有一种方法可以简化这一过程,从而减少所涉及的渲染和剪切?
此外,如果在网络上找到多个或零个apple设备,则此脚本将出错。是否可以为此添加逻辑?

是的,当然可以。可以使用perl/awk大大简化脚本

另外,我现在不确定你的脚本是否正确。 您有一个将地址写入iptables的管道,但是
iptables
这样不行

如果要为
nmap
生成的每个地址运行
iptables
, 您可以使用
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

脚本编写的一个重要部分是了解您正在使用的程序以及如何从中获得适当的输出。看起来您对Nmap有了相当的了解,因为您限制了扫描的端口数(
-p 22,80
)和请求操作系统检测(
-O
),但是如果您使用

Nmap的“grepable”格式已被弃用,这意味着它不能用于获取更多最新功能的输出,但对于操作系统检测来说,它工作得很好。您可以使用
-oG
请求它。下面是一个示例,从以下位置借用一些循环帮助:

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

还有几点需要说明:

  • true
    周围不需要括号。这将启动一个新的子shell,这是低效的。在这种情况下,您可能不会在意,但最好避免不必要的子shell
  • 中的
    $ADDR
    是危险的。如果
    $ADDR
    包含一个空格字符,它将被拆分为单独的参数。网络上的某个人可能会影响NMap的输出,并修改iptables命令的结构。即使这里不是这样,最好尽可能将参数放在双引号之间,以防止出现这种情况:
    “$ADDR”
  • 出于类似的原因,您通常希望使用
    read-r
    ,而不仅仅是
    read
    。如果没有
    -r
    参数,输入中的反斜杠字符将转义后续特殊字符(如空格)
  • NMap有自己的Lua脚本支持。这是解决这个问题的另一种方法,它可以防止您解析任何文本
  • 如果您物理上在同一网络上,则可以根据设备的MAC地址阻止设备,从而在没有任何NMap的情况下阻止Apple设备。前三个字节标识发布MAC地址的组织。你可以查一下。它们可以在根设备上伪造,但NMap指纹也可以伪造(尽管这可能更难)

iptables是否从stdin读取地址?这不是离题,只是因为出现了“网络”一词。关于bash编程/逻辑,这仍然是一个合理的问题。这是一个很棒的想法。我想我会用这个把戏对付我的非科技朋友。然后我可以炫耀我的安卓设备。(邪恶的笑声):“它必须在一个网关上运行,或者在某种程度上成为中间人的设备上运行。”代码>iptables只会影响通过设备的流量。你可以使用arp缓存中毒或dhcp欺骗(请参阅android的dsploit)让他们的流量通过你,但我想这更像是信息安全论坛的一个主题:)如果我把地址用“符号”括起来怎么办?@735Tesla:在这种情况下,最好使用
while/read
。请看我的update@735Tesla:
ADDR
不能为空,因为在这种情况下,do/done内的循环体将不会执行。在这种情况下,Read将重新运行false。好的,谢谢您的帮助!你能告诉我一个资源,可以帮助我学习我需要的技能来简化这一点吗?是的。我推荐这个:谢谢,反正我也不会经常用这个。更多用于烦人的朋友和家人等
-oG
非常有用,谢谢你的提示+1.
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