Dreamhack/Dreamhack Wargame (Challenge)

[178] IT 비전공자 [dreamhack] baby bgp문제풀기

imaginefuture-1 2025. 3. 11. 20:56

첫 클라우드!!문제!!! 두근두근

Dockerfile.router01

Dockerfile.router02

dockerfile을 보면 iproute2랑 tcpdump 패키지가 설치되어있는 모습을 볼 수 있다.

문제가 baby bgp인걸 보아 bgp 패킷을 가로채거나 확인하는걸로 추정됨.

 

bgp는 bordergateway protocol로 pc가 스위치 -> 라우터를 통해서 인터넷을 하는데

라우터는 말그대로 라우터들 무리에서 외부 내부 그 경계에 있는 라우터다.

 

bgp는 포트 179번에서 동작하는 프로토콜.

 

 

 

router01.sh

#!/bin/bash

IP_ADDR=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

IFS='.' read -ra ADDR <<< "$IP_ADDR"
let "ADDR[3]+=1"
NEIGHBOR_IP="${ADDR[0]}.${ADDR[1]}.${ADDR[2]}.${ADDR[3]}"

cat > /etc/bird/bird.conf <<EOF
log syslog all;

router id $IP_ADDR;

protocol bgp dreamhack {
    local as 65001;
    source address $IP_ADDR;
    graceful restart on;
    neighbor $NEIGHBOR_IP as 65002;
    import all;
    export all;
}

protocol kernel {
        scan time 60;
        import none;
#       export all;   # Actually insert routes into the kernel routing table
}

protocol device {
        scan time 60;
}

EOF

bird -c /etc/bird/bird.conf &

while true; do python3 /send.py; sleep 5; done

router02.sh

#!/bin/bash

IP_ADDR=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

IFS='.' read -ra ADDR <<< "$IP_ADDR"
let "ADDR[3]-=1"
if [ ${ADDR[3]} -lt 0 ]; then
    ADDR[3]=255
fi
NEIGHBOR_IP="${ADDR[0]}.${ADDR[1]}.${ADDR[2]}.${ADDR[3]}"

cat > /etc/bird/bird.conf <<EOF
log syslog all;

router id $IP_ADDR;

protocol bgp dreamhack {
    local as 65002;
    source address $IP_ADDR;
    graceful restart on;
    neighbor $NEIGHBOR_IP as 65001;
    import all;
    export all;
}

protocol kernel {
        scan time 60;
        import none;
#       export all;   # Actually insert routes into the kernel routing table
}

protocol device {
        scan time 60;
}

EOF

bird -c /etc/bird/bird.conf -d &

exec /usr/sbin/sshd -D

send.py

from scapy.all import *
import netifaces as ni

def get_internal_ip(interface='eth0'):
    ni.ifaddresses(interface)
    ip = ni.ifaddresses(interface)[ni.AF_INET][0]['addr']
    return ip

def calculate_neighbor_ip(own_ip):
    ip_parts = own_ip.split('.')
    ip_parts[3] = str((int(ip_parts[3]) + 1) % 256) 
    return '.'.join(ip_parts)

own_ip = get_internal_ip('eth0') 
neighbor_ip = calculate_neighbor_ip(own_ip)

target_host = neighbor_ip
target_port = 179

flag = "DH{fakeflagfakeflagfakeflagfakeflagfakeflagfakeflag}"

ip = IP(dst=target_host)
tcp = TCP(sport=RandShort(), dport=target_port, flags="S")
malformed_syn = ip/tcp/Raw(load=flag)

send(malformed_syn)

 

 

neighbor ip, 포트는 179번을 통해서 flag 패킷을  보낸다.

우리는 tcpdump를 이용해서 그 패킷을 가로채보자.

 

찾았다 flag 패킷!

 

DH{w4s_Bgp_Nec35sarY?}

 

 

+ iproute2 명령어를 통해, 네트워크 상태를 확인가능하다

etho0 기본 주소는 192.168.0.4/24. arp 테이블을 확인해보면 192.168.0.3(bgp neightbor)과 192.168.0.254가 존재해있음(게이트웨이). 192.168.0.3이랑 established되어 있는 상태. 우리가 이 친구에게 받은 패킷을 낚아채서 본거다.