Nginx越界讀取緩存漏洞(CVE-2017-7529)—— vulhub漏洞復現 005

前言

Vulhub是一個基於docker和docker-compose的漏洞環境集合,進入對應目錄並執行一條語句即可啓動一個全新的漏洞環境,讓漏洞復現變得更加簡單,讓安全研究者更加專注於漏洞原理本身

Voulhub靶機平臺環境搭建和使用:

https://blog.csdn.net/qq_41832837/article/details/103948358

目錄:

漏洞原理

Nginx在反向代理站點的時候,通常會將一些文件進行緩存,特別是靜態文件。緩存的部分存儲在文件中,每個緩存文件包括“文件頭”+“HTTP返回包頭”+“HTTP返回包體”。如果二次請求命中了該緩存文件,則Nginx會直接將該文件中的“HTTP返回包體”返回給用戶。
如果我的請求中包含Range頭,Nginx將會根據我指定的start和end位置,返回指定長度的內容。而如果我構造了兩個負的位置,如(-600, -9223372036854774591),將可能讀取到負位置的數據。如果這次請求又命中了緩存文件,則可能就可以讀取到緩存文件中位於“HTTP返回包體”前的“文件頭”、“HTTP返回包頭”等內容。當Nginx服務器使用代理緩存的情況下,攻擊者通過利用該漏洞可以拿到服務器的後端真實IP或其他敏感信息。

漏洞詳情

影響版本:Nginx version 0.5.6 - 1.13.2
漏洞原因:是由於對http header中range域處理不當造成。主要代碼是ngx_http_range_parse函數中的循環:

for(;;) {
start = 0;
end = 0;
suffix = 0:
while (*p == '') { p++;}
if (*p !='-'){
if(*p<'0'||*p>'9'){
return NGX_HTTP_RANGE_ NOT_ SATISFIABLE;
while(*p>='0'&&*p<='9'){
if (start >= cutoff && (start > cutoff II *p - '0' > cutlim)) {
return NGX_ HTTP_ RANGE_ NOT_ SATISFIABLE;
start = start *10 + *p++ -'0';
}
while (*p == '') { p++; }
if (*p++ != '-') {
return NGX_ HTTP_ RANGE_ NOT_ SATISFIABLE ;
}
while(*p==' '){p++;}
if(*p==','|| *p=='\0'){
end = content_ length; 
goto found;
}
} else {
suffix = 1;
p++;
}
if (*p<'0'll*p>'9') {
return NGX_ HTTP RANGE NOT_ SATISFIABLE;
}
while(*p>='0'&&*p<='9'){
if (end >= cutoff && (end > cutoff II *p - '0' > cutlim)) {
return NGX_ HTTP_ RANGE_ NOT_ SATISFIABLE;
}
end=end*10+*p++-'0';
}
while(*p==' '){p++;}
if(*p!=','&&*p!='0'){
return NGX_ HTTP_ RANGE_ NOT_ SATISFIABLE;
}
if (suffix) {
start = content_ length - end;
end = content_ length - 1;
}
if (end >= content_ _length) {
end = content_ length;
} else {
end++ ;
}
found : 
if (start < end) {
range = ngx_ array_ push( &ctx- >ranges);
if (range == NULL) {
return NGX_ ERROR;
}
range- >start = start;
range- >end = end;
size += end - start;
if (ranges-- ==0) {
return NGX_ DECLINED;
}
if (*p++ != ',') {
break ;
}
}

瞭解到HTTP頭部range域的表示方式是:bytes=<start>-<end> 範圍大概是: bytes=4096-8192,字符串指針p的內容即爲bytes的範圍。

這段代碼是要把“-”兩邊的數字取出分別賦值給start和end變量,標記讀取文件的偏移和結束位置。

也就是說bytes=<start>-<end>這個範圍內讀取到的是緩存文件內容本身。假如這個緩存文件是有文件頭,把start設置成負數呢?很好理解,那麼它讀取的位置就會往前面移動,導致文件頭的信息也會被讀取出來。

好啦知道原理後開始我們復現過程,在此感謝大牛們提供的poc。

漏洞復現

找到該路徑下的poc.py直接利用即可

在這裏插入圖片描述

python ./poc.py http://192.168.232.135:8080

讀取返回結果:
在這裏插入圖片描述
可見,越界讀取到了位於“HTTP返回包體”前的“文件頭”、“HTTP返回包頭”等內容。
如果讀取有誤,請調整poc.py中的偏移地址

在這裏插入圖片描述

也可以用github上的另一個腳本:
https://github.com/en0f/CVE-2017-7529_PoC

在這裏插入圖片描述

END

每天積累一點點,終究有一天爆發出來強大的力量。我是jammny,喜歡的點個贊!加個關注吧!持續更新vulhub漏洞復現系列。

發佈了25 篇原創文章 · 獲贊 67 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章