7

I have a question for the Low-level networking/Linux gurus,

I have to build two tools for a security project at my university. The first tool is an ARP Poisonning attacker which will poison the ARP cache from a remote host in order to retrieve the data he is sending to another host. I wrote this tool in C using RAW sockets and it works perfectly, i am able to intercept the data transmitted from a host A to a host B and from the host B back to the host A.

The problem comes when writing the second tool which is a sniffer whose purpose is to read/edit/drop packets coming from host A or host B. I imagined a system where when I spot a packet coming from one of those hosts, my program will ask me if I want to let this packet pass, if I want to modify it or if I simply want to drop it. I activated the IP forwarding in linux using

sysctl -w net.ipv4.ip_forward=1

and i am able to read all the data travelling between the two hosts. But i don't know how to edit/drop those packets since it is the role of linux's network stack to manage the input and the output of the packets coming from my network interface. I'm acting only as a passive attacker if you want.

My first idea was to disable the ip forwarding and manage the routing of the packets myself. But when I disable the ip forwarding, I am simply not able to get any data coming from A or B, this is because the linux's network stack drops automatically the packets in kernel mode which IP address is not destined to my computer.

I tried then to activate the promiscuous mode, but this was unecessary since this mode only operates on the physical layer (sees if the target MAC address in the Ethernet received packet matches the MAC address on the local interface). So basically, promiscuous mode helps us to avoid the physical filter of the linux's stack but not the logical one (the target IP address in the packet I am receiving is B's IP address and not mine, so linux's network stack simply drops the packet).

So my question is, how can I manage to edit the packets I am receiving and send them back or simply dropping them if I want to. I know this is a tricky question, I have made some research to find the solution on my own but I didn't find a satisfying answer.

I know there is a solution with iptables, we can ask him to let pass some packets from a certain IP address, but I don't want a solution involving a third-party tool, I want to encapsulate everything in my program.

For information, the development environment is Linux/Ubuntu Kernel 3.0.0-16, and everything is made using the C language.

4

3 に答える 3

1

カーネルで必要な動作を処理するか、処理のためにユーザー空間に渡すかのいずれかを行う、独自の Netfilter モジュールを作成する必要があるようです。

このトピックの詳細については、次のリソースを参照してください。

于 2012-03-17T21:34:48.763 に答える
1

ip_forwarding を無効にしたときにパケットを受信しなかった理由がわかりました。ここに質問を投稿した後、多くのテストを実行しましたが、ip_forwarding が無効になっていると、リモート ホストが約 10 秒ごとに非常に奇妙な TCP パケットを送信していることに気付きました。

実際、これらの TCP パケットは、Wireshark によって「TCP 再送信」パケットとしてフラグが立てられました。これは、リモート ホストが最初の TCP パケットを送信してきたためであり、適切なゲートウェイに再ルーティングしなかったため、彼は何も取得しませんでした。応答。

この場合のリモート ホストのデフォルトの動作は、このパケットを異なる時間間隔で再送信することでした。これは、実際には TCP スタックが動作する通常の方法です。しかし、私が知らなかったのは、リモート ホストが最初の TCP パケットへの応答を取得しない限り、他のものを送信しないということです (同じアプリケーションの場合のみ)。したがって、リモートホストのブラウザで「F5」を押したとき、応答はありませんが、TCPトラフィックを生成すると思いました.TCPスタックのこの特定の動作に気づいていなかったので、取得していないと単純に考えました.任意の答え。もう一方のホスト (ゲートウェイ) もまったく同じように動作していたので、Linux のスタックがリモート ホストのパケットをブロックしていると考えていたのは間違っていたと言えます。

私が今しなければならないことは、通過させたいデータをゲートウェイに適切に再ルーティングし、他のデータを無視することです. 助けてくれてありがとう、これがいつか誰かを助けることを願っています。

于 2012-03-17T21:25:22.910 に答える
0

libpcapをまったく使用していますか?あなたの質問からは、あなたがしていることに関連するもののための最もよく知られ、使用されているライブラリであるため、興味深いことに、あなたのようには聞こえませんか? 使わないのは課題の条件の一部だから使わないのですか?

使用できる場合は、ライブ パケットの書き換えをサポートしているプロジェクト ettercap をチェックします。

http://ettercap.sourceforge.net/

編集: ettercap のフィルター モジュールをチェックアウトします。

https://github.com/drizztbsd/ettercap/blob/master/src/ec_filter.c

特に見てfunc_inject

于 2012-03-17T18:41:09.933 に答える