2

Web サーバーを含むクローズド ソースの組み込みデバイス用のエミュレーターを開発しています。私は Python を使用して組み込みのオングストローム Linux 2.6.34 でエミュレーターを構築しています。これまでのところ、Web サーバーを機能的に実装して、ブラウザーから元のデバイスと視覚的に同一に見えるようにしました。現在、Nmap の OS とサービスのスキャンと同じに見えるようにしようとしていますが、これははるかに困難であることが判明しました。

Nmap スキャンは、最初は非常に異なっていることが判明しました (ソース デバイスは完全に一致せず、私のエミュレータは Linux 2.6.32 - 2.6.39 として機能しません)。エミュレーターでサービスをオフにしてポートを閉じるという明らかなことを行った後、IP ヘッダーと TCP ヘッダーを含む送信元デバイスと組み込みデバイスからの Wireshark パケットを比較して、必要なプロトコル レベルの変更を決定しました。Linux で sysctl.config ファイルを使用すると、TCP ウィンドウ スケーリングなどの一部のパラメーターは簡単でしたが、他のパラメーターは難しいことが証明されています。たとえば、送信元デバイスでパケットがフラグメント化されると、私のデバイスではなく TCP ヘッダーに PSH フラグが設定されます。ここでの目標は、単にデバイスを難読化することではなく、

私の探求では、有望と思われるいくつかの解決策に出くわしましたが、もっと簡単な解決策があることを知っているとき、うまく いくはずの解決策にもっと時間を浪費することを恐れています.

これが私が試したことのリストであり、別のアプローチを研究するきっかけとなったものです。それらのほとんどの問題は、ドキュメントの欠如です。特定のアプローチが機能することを誰かが知っていて、構成に役立つ適切なドキュメントを教えてくれる場合は、大いに感謝します。怠惰なエンジニアなので、最も簡単な解決策を探しています。私はCを恐れていませんが、Pythonを介して起動またはインターフェースできるプログラムまたはモジュールがある場合は、それを好みます。

  • IP パーソナリティ: 2.4 カーネル専用で、私のエミュレーター (組み込み ARM アーキテクチャー) には、そこまでさかのぼる移植されたカーネルがありません。

  • Ethercap フィルター: エミュレーター (mitm ではなくエミュレーターにインストールされている) でこれらを動作させましたが、TCP および IP ヘッダーでは動作しませんでした。 . マニュアルページはそれが機能する可能性があるという印象を与えますが、それを使用してヘッダーを変更する人を見つけていないため、実行できないと思います.

  • Divert Sockets: 明らかに 2.6 カーネル用に設計されたパッチにもかかわらず、これを機能させることができません。これは IPtables と連携して、ファイアウォールを通過する前に発信パケット (ヘッダーとすべて) を変更できるフィルターを作成します。ピースをまとめるのに十分なドキュメントが見つかりません。

  • TAP/TUN: これまでに学んだことから、このソフトウェア ベースのネットワーク インターフェイスは機能するはずですが、これが最も簡単な方法であるとは確信していません。私が見た例は、「後のカーネルは異なる動作をする」ため、2.6.36 未満のカーネル用です。これには私のエミュレーターのバージョンが含まれます。

  • libpcap: lippacp は raw パケットのみを提供し、パケットを変更することはできないと思います。パケットをコピーし、それらを殺し、コピーを変更し、送り返すことができると信じていますが、繰り返しになりますが、もっと簡単な方法があると思います。

  • ユーザーランド TCP/IP スタックの使用: Linux 2.4.34 の lwIP スタックなどの使用方法に関する適切なドキュメントや例が見つからず、ネイティブ カーネル スタックを無効にします。

  • カーネルを開き、ネイティブ TCP/IP スタックをいじる: これ機能することはわかっていますが、.c ファイル内のポインターの混乱を解読することは言うまでもなく、change-compile-test の開発サイクルに時間がかかるのではないかと心配しています。 . 私はこれを行ったことがなく、カーネル全体、特定のモジュール、またはopenembeddedを使用してARMデバイス用にコンパイルする方法をコンパイルする必要があるため、どこにいるのかわかりません。これを行うには他の方法があることを知っているので、まだやるべきことがたくさんあるのに、カーネルを開く方法を学ぶのに時間を費やすのは気が進まない.

これらすべての中で、私は ettercap を実行し、ソケットを最も遠くに迂回させました。これが最も簡単だと思ったからです。ヘッダーを任意に微調整するために機能するこれら (またはその他) の例はありますか? 助けてくれてありがとう!

4

1 に答える 1

1

最近のカーネルでは、NFQUEUEを使用して、カーネルパッチなしでパケットを変更できます。ユーザースペース部分にはPythonバインディングもあります。ここで確認できます:https : //www.wzdftpd.net/redmine/projects/nfqueue-bindings/wiki/Examples。これには、パケットを書き換えるrewrite.pyの例が含まれています。

iptablesの部分には、次のようなルールが必要です。

iptables -A OUTPUT -p tcp -m tcp --sport 80 -j NFQUEUE --queue-num 0

ここで、最後のパラメーターは、コード内のパラメーターと一致する必要があるキュー番号です。

単純なパケット編集では不十分な場合は、lwIPを試すこともできます。LinuxのタップデバイスのlwIPは、そのままで機能します。これを行うには、lwIPパッケージとcontribパッケージの両方を取得します。次に、contrib / Ports / unix / proj / unixsimに、lwIPを使用して、タップデバイスを介したWebサーバーなど、いくつかのものを実装する例があります。

実際のネットワークインターフェイスからlwIPスタックにアクセスできるようにする最も簡単な方法は、タップデバイスのNATを設定し、実際のインターフェイスからタップインターフェイスにポートを転送することです。それでもカーネルが関係するので、必要以上に明らかになる可能性があります。その周りのいくつかの可能なオプションは、これをNFQUEUEと組み合わせたり、tapインターフェイスの代わりにrawソケットを使用するようにlwIPを変更したりする可能性があります(私はそれが箱から出してそれを行うとは思わない)。

nmapフィンガープリントがどのように機能するかについては、http://nmap.org/book/osdetect-methods.htmlを参照してください。nmapから生の指紋を取得するには、「-vv」オプションを使用します。また、最新バージョンのnmapを使用することをお勧めします。これは、最新バージョンのフィンガープリントを備えているためです。

于 2012-09-25T06:10:48.667 に答える