通过将 GUI 添加回容器,释放 Kali Linux 在 Docker 网络上的强大功能,并通过由 Python、Selenium 和 Tor 浏览器支持的匿名网络抓取来升级信息收集。
作为一名 DevOps 工程师,我已经运输了数十万个容器,并帮助其他工程师运输了数十万个容器。我使用持续交付和各种编排方法:Kubernetes、AWS 上的 Lambda 容器、由弹性计算云 (EC2) 和 Fargate 支持的弹性容器服务 (ECS)。容器对于自定义构建系统、自动化部署、漏洞扫描、研究目的、数据分析、机器学习、遗留软件归档、本地开发和网络抓取非常有用。
在本指南中,我将回顾使用 Xvfb 和 VNC 服务器从 DockerHub 将 GUI 添加到官方 Kali Linux 容器所经历的步骤。我在这里讨论的代码发布在kalilinux-xvfb开源存储库中,并持续交付到Docker Hub供一般使用。最后,在本系列的第 2 部分中,容器中的所有内容都将接受测试。我将使用自定义 Python 脚本、Pytest 和 Selenium 来自动化 Tor 浏览器实例并从网络收集数据。
在容器中使用 Kali Linux 的部分动机是为了了解主机为容器创建的专用网络空间。 Docker Desktop 的默认设置是使用 NAT 网络。除非端口绑定到主机,否则使用docker run -p ,该服务将无法从主机访问。
以下是添加的摘要部分,其中包含以下每个软件包的链接:
卡利Linux
Docker 桌面
Tor 浏览器
Tor 浏览器启动器
Xvfb
硒
我使用的软件的附加链接:
Kali Linux 是一个基于 Debian 的 Linux 发行版,旨在进行高级渗透测试和安全审计。 1
我选择 Kali Linux 是因为有大量可用的安全工具。 Kali Linux 团队提供了定期更新的 Docker 镜像。 Kali Linux Docker 镜像提供了许多必需的软件,我将使用包管理器来安装它们。
Docker Desktop是一个用于本地运行容器的框架。容器是将操作系统和应用程序状态打包在可重用操作系统映像中的一种方式。 Docker 网站上提供了其他资源。
容器和虚拟机具有类似的资源隔离和分配优势,但功能不同,因为容器虚拟化操作系统而不是硬件。 2
由于 Docker 容器比虚拟机更轻量,因此我在开发工作中非常喜欢它们。从长远来看,这种状态可以存储为一个小文本文件,并且使用 git 和类似工具更容易跟踪随时间的变化。从文本文件中再次导出图像的能力非常强大。然而,随着时间的推移,Dockerfile 完全有可能年久失修,并且可能在以后无法构建。就像任何其他操作系统和基础设施即代码一样,保持所有内容最新非常重要。
Docker 的替代方案是使用虚拟机或裸机安装。然而,我相信容器是运行临时网络爬虫的完美测试平台,因为它们很容易配置和清理。我可以在一台机器上并行运行许多容器,几乎可以立即启动和停止。然后,每当我需要额外的隔离时,整个设置也可以从虚拟机内部运行。
洋葱路由器 (Tor) 是一个全球计算机网络,通过一系列加密的跃点路由流量。这允许用户以某种程度匿名的方式浏览互联网,并且还允许用户访问仅在 Tor 网络上可用的网站。
Tor 浏览器是 Firefox 的重配置版本,重点关注隐私和安全。它可以立即使用 Tor 网络。
torbrowser-launcher包含在许多 Linux 操作系统中,使得在 Tor 网络上启动 Web 浏览器变得非常容易。
Selenium是一个用于自动化 Web 浏览器的工具。在本示例中我使用了 Python,但有许多语言和工具可用。
我将使用 Selenium 来自动化 Tor 网络上的 Tor 浏览器。我试图利用安全意识浏览器的现有配置来限制与目标的信息共享。我将能够通过停止容器来清理容器运行时状态。由此产生的 WebDriver 会话将具有通过 Tor 出售的随机 IP 地址,使其成为非常强大的网络抓取工具。
XOrg 组件Xvfb可用于模拟 X 窗口系统的屏幕。然后,我将使用此屏幕在容器中启动 X 服务器。这种模拟技术并不是特别快,图形密集型应用程序将受益于 GPU。
Dockerfile 应该构建在任何可以运行 Docker 的 Linux、macOS 或 Windows 发行版上。我已经使用 Intel 处理器在 Docker Desktop 上对此进行了测试。官方 Kalilinux 基础容器有一个 ARM 变体。我非常感谢任何尝试在 ARM 上运行此程序的人提供的反馈。
这是我用来构建基础镜像的 Dockerfile。我添加了一些注释来解释每一行的作用。
# From the official Kali Linux Docker image rolling release FROM kalilinux/kali-rolling # Leaving this here for now, but it's not needed ARG DISPLAY_NUMBER=1 ENV DISPLAY=:$DISPLAY_NUMBER # Install the packages we need # Got lucky with this one, there was a ticket about this: # https://github.com/dnschneid/crouton/issues/4461 `xfce4 dbus-launch not found` in this version of the image so installing dbus-x11 RUN apt-get update -y -q \ && apt-get install -y -q xvfb xfce4 xfce4-goodies tightvncserver net-tools curl openssh-server dbus-x11 # This line copies the shell scripts from the local directory to the container, and makes them executable. COPY *.sh /opt/ RUN chmod 755 /opt/*.sh # This line runs the shell scripts that start the X server, and generate the SSH keys. RUN /opt/startx-once.sh RUN /opt/ssh-keys.sh # This line sets the entrypoint to bash, so that we can run commands in the container. ENTRYPOINT /bin/bash
帮助启动 X 服务器。我正在使用 Xvfb 命令来启动 X 服务器。如果存在 PID,并且当 X 服务器出现问题时,我可以终止该进程并重新启动它。我尝试阻止来自网络的 X 会话,虽然可能没有必要,但我仍然添加它: -nolisten tcp Discussion on super user
#!/bin/bash FILE=/opt/.x.pid if [[ -f "$FILE" ]]; then echo "$FILE exist" echo "PID: " `cat $FILE` else Xvfb -nolisten tcp $DISPLAY & echo $? > $FILE fi
VNC 客户端不太适合复制和粘贴文本。可以通过向容器添加 SSH 密钥以帮助其他主机连接到它来解决此问题。这开启了使用 SSH 隧道连接到容器的可能性。
以下ssh-keygen
命令引用自此Stack Exchange 文章
#!/bin/bash # Generate SSH keys ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" cat ~/.ssh/id_rsa >> ~/.ssh/authorized_keys
如果我要使用这些密钥,我的工作站上需要私钥。我使用以下命令将私钥从 docker 复制到我的主机,但有多种方法可以做到这一点。 Stack Overflow上对此进行了很好的讨论。
使用ps 命令查找容器 ID:
docker ps
使用容器 ID 通过cp 命令复制:
# For root docker cp <containerId>:/root/.ssh/id_rsa /target/path/on/host # Otherwise for the user configured in the Dockerfile docker cp <containerId>:/home/username/.ssh/id_rsa /target/path/on/host
这需要复制到容器中,但这只是 Tor 项目在此处提供的样板配置中未注释的部分。
# /etc/tor/torrc ## Tor opens a SOCKS proxy on port 9050 by default -- even if you don't ## configure one below. Set "SOCKSPort 0" if you plan to run Tor only ## as a relay, and not make any local application connections yourself. SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections. #SOCKSPort 192.168.0.1:9100 # Bind to this address:port too. ## Uncomment this to start the process in the background... or use ## --runasdaemon 1 on the command line. This is ignored on Windows; ## see the FAQ entry if you want Tor to run as an NT service. RunAsDaemon 1 ## The port on which Tor will listen for local connections from Tor ## controller applications, as documented in control-spec.txt. ControlPort 9051 ## If you enable the controlport, be sure to enable one of these ## authentication methods, to prevent attackers from accessing it. #HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C CookieAuthentication 1
此 Dockerfile 构建于之前的 Dockerfile 之上,并添加了 Tor 浏览器和 Python。我正在使用torbrowser-launcher软件包来安装 Tor 浏览器。
# From the base Dockerfile: FROM excitingtheory/kalilinux-xvfb ARG DISPLAY_NUMBER=1 ENV DISPLAY=:$DISPLAY_NUMBER # More info about torbrowser-launcher: # https://github.com/micahflee/torbrowser-launcher RUN apt-get update -y -q \ && apt-get install -y -q torbrowser-launcher python3 python3-pip # Create a user and add them to the sudo group, sudo still TBD but leaving for now, will not be able to switch users in this container. RUN useradd -s /bin/bash -m username \ && usermod -aG sudo username # Install python packages RUN pip3 install selenium pytest COPY torrc /etc/tor/torrc # Set the user and home directory for the container USER username ENV USER=username ENV HOME=/home/username # Run the shell scripts that start the X server, and generate the SSH keys. RUN /opt/startx-once.sh RUN /opt/ssh-keys.sh # This line sets the entrypoint to bash, so that we can run commands in the container. ENTRYPOINT /bin/bash
就像以前一样,但配置更少。将使用root用户。
# From the base Dockerfile: FROM excitingtheory/kalilinux-xvfb ARG DISPLAY_NUMBER=1 ENV DISPLAY=:$DISPLAY_NUMBER # More info about torbrowser-launcher: # https://github.com/micahflee/torbrowser-launcher RUN apt-get update -y -q \ && apt-get install -y -q torbrowser-launcher python3 python3-pip # Install python packages RUN pip3 install selenium pytest # Copy the tor config file into the containera COPY torrc /etc/tor/torrc # Run the shell scripts that start the X server, and generate the SSH keys. RUN /opt/startx-once.sh RUN /opt/ssh-keys.sh # This line sets the entrypoint to bash, so that we can run commands in the container. ENTRYPOINT /bin/bash
Github Actions 工作流程文件构建 Docker 映像并将其推送到 Docker Hub。这是Docker 文档中的常用工作流程,并推送了其他标签。我添加了一个时间表,每天触发一次此操作。
name: docker build and push on: push: branches: - "main" schedule: - cron: '20 16 * * *' jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Build and push base image uses: docker/build-push-action@v4 with: context: . file: ./Dockerfile push: true tags: excitingtheory/kalilinux-xvfb:latest - name: Build and push torbrowser root image uses: docker/build-push-action@v4 with: context: . file: ./TorBrowser-root.Dockerfile push: true tags: excitingtheory/kalilinux-xvfb:torbrowser-root - name: Build and push torbrowser image uses: docker/build-push-action@v4 with: context: . file: ./TorBrowser.Dockerfile push: true tags: excitingtheory/kalilinux-xvfb:torbrowser
现在我可以测试这些容器并看看它们是否有效。我将在此示例中使用torbrowser
标签。
有关docker build
命令的更多信息,请参阅Docker CLI 构建文档。为了在本地构建容器,我使用以下命令,否则可以在后续步骤中按需从 Docker Hub 中提取它们。
docker build -t excitingtheory/kalilinux-xvfb . docker build -t excitingtheory/kalilinux:torbrowser -f TorBrowser.Dockerfile . docker build -t excitingtheory/kalilinux:torbrowser-root -f TorBrowser-root.Dockerfile .
我需要将一个卷安装到容器中,以便可以访问正在处理的文件。我使用${HOME}/src
目录作为卷。
下面包含有关我们使用的标志的一些简短说明,否则请参阅Docker CLI 运行文档以获取有关docker run
命令的更多信息。
-it
用于以交互模式运行容器。
--rm
用于退出时移除容器层。
-p
用于将容器的端口映射到主机。
-v
用于将卷从主机挂载到容器。
# Run the base container docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb # Run the container with the default user docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser # Run the container with the root user docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser-root
接下来,我想打开用户容器,通过 VNC 登录,然后运行 Tor 浏览器启动器以验证到目前为止一切正常。 Tor 浏览器启动器不适用于 root 用户。
使用默认用户启动容器:
docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser
在容器中启动VNC服务器,服务器会提示输入主密码,我正在设置一个附加的仅供查看的密码。
/opt/start-vnc-server-once.sh
下面是输出的示例。
连接到服务器对话框可以从查找器菜单中找到: Go
-> Connect to Server
。
对话框打开后,输入地址vnc://localhost:5901
并单击Connect
。我已将此地址保存为收藏夹以便于访问。
像 TightVNC 这样的 vnc 客户端可以连接到localhost:5901
。
连接后,我可以看到 xfce4 桌面。
现在我可以在 VNC 会话中从终端启动 Tor 浏览器启动器。
torbrowser-launcher
打开浏览器后,我可以通过转到Tor 项目连接检查器来检查它是否正常工作
这是我在开始使用 Selenium 和 Python 之前想要完成的操作系统设置。回顾一下,我做了以下事情:
现在已经有了一个可以工作的容器环境。查看本系列中关于隐蔽 Python 网络抓取的下一篇文章。