跳转至

result

推荐 youtube 这个简单介绍让我入门了 Ethernet packet

解题报告之Network Configuration

题目描述

Configure your network interface. The remote host at 10.0.0.2 is trying to communicate with the remote host at 10.0.0.3 on port 31337.

一开始看到这道题,我还有点迷惑,为什么还会有10.0.0.3的?因为,我尝试ping,发现ping不通.后来我看了下代码,发现了思路.

说到这里要吐槽一下,因为之前的题目都是简单的可以从题目描述中可以看出思路,一些还会有hint. 因为是直接简单粗暴的,所以直接操作敲命令就行.

但是,在这道题目,我一开始没有思考/challenge/run的代码细节,就是简单认为它知识一个简单的网络环境配置脚本罢了. 结果,我是捣鼓了很久才知晓我应该看看这个实现细节都是怎么样的,可能hint藏在这里

代码分析

#!/usr/bin/exec-suid --real -- /usr/local/bin/python -I

import os
import socket
import time

import psutil
from dojjail import Host, Network

flag = open("/flag").read()
parent_process = psutil.Process(os.getppid())

class ClientHost(Host):
    def entrypoint(self):
        while True:
            time.sleep(1)
            try:
                client_socket = socket.socket()
                client_socket.connect(("10.0.0.3", 31337))
                client_socket.sendall(flag.encode())
                client_socket.close()
            except (OSError, ConnectionError, TimeoutError):
                continue

user_host = Host("ip-10-0-0-1", privileged_uid=parent_process.uids().effective)
client_host = ClientHost("ip-10-0-0-2")
network = Network(hosts={user_host: "10.0.0.1", client_host: "10.0.0.2"}, subnet="10.0.0.0/24")
network.run()

user_host.interactive(environ=parent_process.environ())
  1. Flag在哪里?
flag = open("/flag").read()

Flag已经被读入内存中。

  1. 谁持有Flag?
class ClientHost(Host):
    def entrypoint(self):
        # ...
            client_socket.sendall(flag.encode())

ClientHost 这个类持有Flag,并且会不断尝试发送它。

  1. 发送给谁?
client_socket.connect(("10.0.0.3", 31337))

ClientHost(IP是 10.0.0.2)正在疯狂尝试连接 IP 10.0.0.331337 端口,把 Flag 发过去。

  1. 我是谁?
user_host = Host("ip-10-0-0-1", ...)
user_host.interactive(...)

我是 user_host,初始 IP 是 10.0.0.1

  1. bug点
network = Network(hosts={user_host: "10.0.0.1", client_host: "10.0.0.2"}, subnet="10.0.0.0/24")

网络中只有 10.0.0.110.0.0.2根本不存在 10.0.0.3 这个主机!

开始解题

既然 10.0.0.2 想要把 Flag 发给 10.0.0.3,但 10.0.0.3 不存在,而我们又在同一个局域网内(10.0.0.0/24),我们可以把自己伪装成 10.0.0.3

只要我们的网卡上有了 10.0.0.3 这个 IP,对方就会连接我们,把 Flag 发给我们。

查看网卡信息

首先,我们需要知道我们的网卡名称是什么。 输入:

ip a
3: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 06:3b:f0:75:6b:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.0.1/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::43b:f0ff:fe75:6b93/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

可以看到 eth0 或者类似的名字,且它目前的 IP 是 10.0.0.1

添加目标 IP 地址 (伪装身份)

给这个网卡追加一个 IP 地址 10.0.0.3。这样,当10.0.0.2寻找 10.0.0.3 时,就会发送给我。

ip addr add 10.0.0.3/24 dev eth0

解释:就是添加一个别名

监听端口 (接收 Flag)

现在我们已经是 10.0.0.3 了,我们需要打开 31337 端口来接收数据。我们将使用 nc (netcat) 来监听。

输入:

nc -lp 31337

获取 Flag

pwn.college{ogNLY37pzwGm06RX2DMZK9-UJVd.QX1YzMzwCOwEzNxEzW}