オルタナティブ・ブログ > プログラマー社長のブログ >

プログラミングでメシが食えるか!?

TCPアタックツール自作

»

C言語によるネットワークプログラミングの話題です。

あるHTTPフィルターの前にさらにHTTPフィルターを開発してと依頼を受け、かなりトリッキーな仕組みでメンバーが何とか実現したところ、もともと存在していたフィルターが不調になる場合があることがわかりました。内部でiptablesを使っているようで、conntrakが溢れたのだろうと予想し、それを再現させるべく、アタックツールを作ってみました。

基本的には大量のTCPコネクションを張りっぱなしにしておけば良いだろうと考え、普通ならTCP/IPで大量にconnectするようなプログラムを作るところですが、その方法ですと1プロセスで同時に使えるディスクリプタ数の制限に引っかかり、setrlimitでRLIMIT_NOFILEを大きくしても限界があります。

そこで、プログラムでIPレイヤーからパケットを送信することにし、SYNパケットを自作して送信し、相手からSYN+ACKを受信したらACKを応答するプログラムを作ってみました。SOCK_RAWを使う感じです。すると・・・SYN+ACKを受信した時点で、そんなTCPポートはカーネルとしては知らないと、RSTを勝手に応答されてしまうことがわかりました。まあ、当たり前ですが。。

仕方ないので、iptablesでOUTPUTフィルターに、該当ポート番号をDROPするようにしてみたのですが、今度は自分自身がパケットを送出できません。これまた当たり前ですが。。

結局、リンクレイヤーで、イーサフレームからパケットを送信することにしました。この場合宛先のMACアドレスも自分で調べなければならないのですが、テスト用なので、パラメータ指定することにし、ARP自作はやめました(IntraGuardianとか作っているので、実はそんなに大変ではないのですが)。リンクレイヤーで送出すればiptablesでフィルターがかかっていても無関係に送出できますし、受信もフィルターには無関係にできます。

送信側のポート番号は大きめの番号を適当にインクリメントしながら使うことにしました。

無事に、SYNを送り、SYN+ACKを受信し、ACKを応答して3ウェイハンドシェークを確立し、そのまま何もしないので、TCP張りっぱなしを実現できました。

問題は、サーバ側もアクセプト数の制限があるので、結局そっちで引っかかるのですが、受けっぱなしダミープログラムも一応準備し、後は実機を間に挟んで実験するのを楽しみにしている状態です。

ネットワークプログラミングに興味がない方には、暗号のような内容になってしまいましたが、たまには技術的な話題もないと「プログラマー社長のブログ」として寂しいので。。

ちなみに、非常に危険なプログラムなので、ソースは公開しません。。また、iptablesのconntrakを使ってフィルターやルーターを構成している人は、nf_conntrak_maxを大きめにしておかないと溢れる可能性がありますので、一度調べてみると良いでしょう。

========

今日はゴルフ練習場機器関連の設置現場を訪問し、面白いブログのネタになると思ったのですが、まだ一般公開前で、情報をリークするのもNGとのことで、残念ながら書けませんでした。公開OKになったら面白い情報なのでお楽しみに!

Comment(1)