1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ろうとるがPythonを扱う、、(その20:Scapyで改ざん)

Posted at

Scapyでデータを改ざんしてみる

「ろうとるがPythonを扱う、、(その19:Scapy Bridgeで遅延やパケットDrop)」の続きである。ネットワークブリッジをもうけて、そのブリッジでデータを改ざんする。

ネットワーク構成

下記のようなもの。
image.png
VirtualBoxの3つのVMを利用。中央のVM(Lubuntu)ネットワークブリッジ、両端は同一ネットワークセグメントに属する。

ソースコード

出だし

from scapy.all import *
import select

sub_data = '1234567890'
  • 改ざん後のデータ(置き換えるもの)

Ethernetフレーム生成

def recreate_frame(eth_header, ip_packet):
    # Removal Check-Sum
    if ip_packet.haslayer(TCP):
        del ip_packet.getlayer(TCP).chksum
    if ip_packet.haslayer(UDP):
        del ip_packet.getlayer(UDP).chksum
    if ip_packet.haslayer(ICMP):
        del ip_packet.getlayer(ICMP).chksum
    del ip_packet.chksum

    # Recreation Ethernet
    result = Ether(dst=eth_header.dst, src=eth_header.src, type=eth_header.type)/IP(ip_packet.build())
    return result

メイン

前回利用した”bridge_and_sniff”ではなく、下記サイトの”select”実装を利用した。

### Main ###
# Layer2 socket
eth0_socket = conf.L2socket(iface='enp0s3')
eth1_socket = conf.L2socket(iface='enp0s8')

# Socket Dictionary
next_socket = {
    eth0_socket: eth1_socket,
    eth1_socket: eth0_socket,
}
while True:
    # select()
    readable_sockets, _, _ = select.select([eth0_socket, eth1_socket], [], [])

    for s in readable_sockets:
        # Data receive
        p = s.recv()

        if p:
            if p.haslayer(Raw):
                p.show()
                eth_frame = p.getlayer(Ether)
                ip_pkt = p.getlayer(IP)
                length = len(p['Raw'].load)
                m = length%10
                n = int(length/10)
                data = ''
                for i in range(n):
                    data += sub_data
                data += sub_data[0:m-1]
                data += '\n'
                p['Raw'].load = data.encode('ascii')
                ip_pkt = p.getlayer(IP)
                new_frame = recreate_frame(eth_frame, ip_pkt)
                next_socket[s].send(new_frame)
            else:
                next_socket[s].send(p.original) # そのまま送信
  • L2ソケットの定義(eth0_socket、eth1_socket)
  • ブリッジの定義(L2ソケットどうしをつなげる)
  • 待受け(select)
  • データ受信(p)
  • 改ざん対象は、TCP/UDP/ICMPなどでデータを持つもの(p.haslayer(Raw)がTrue)
  • EthernetヘッダおよびIPデータの取得
  • 置き換えるデータは、出だしで定義した”sub_data”の内容
    • 同じ文字数分置き換える(TCPシーケンス維持のため)
    • 上述した”recreate_frame()”により、Ethernetフレーム作成
    • データ送信

検証

両端VM間で、netcat(nc)を実行。上述したネットワーク構成では、ncのClientが”10.1.1.1”、ncのServerが”10.1.1.2”とになる。

コマンド実行結果

Clientでのnc実行。

$ echo alfjlakdflak | nc 10.1.1.2 1111

Serverでのnc待受け。

$ nc -l -p 1111
123456789012

改ざんされている(置き換わっている)のがわかる。

ネットワークキャプチャデータ

Clientの結果。
Client.png
Serverの結果。
Server.png
こちらでも、改ざんされている(置き換わっている)のがわかる。

最後に

おそらく、改ざんとしては、初歩の初歩の初歩の初歩レベルであろう。

EOF

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?