├── go.mod ├── go.sum ├── pkg ├── printing │ ├── banner.go │ └── version.go ├── model │ └── model.go ├── modules │ ├── file.go │ ├── check.go │ └── github.go └── transport │ └── transport.go ├── sample.lst ├── .github ├── FUNDING.yml └── workflows │ ├── contributors.yml │ ├── go.yml │ ├── codeql-analysis.yml │ └── docker-publish.yml ├── Dockerfile ├── .gitignore ├── LICENSE ├── main.go ├── .goreleaser.yml └── README.md /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/hahwul/gitls 2 | 3 | go 1.17 4 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/hahwul/dalfox v1.2.1 h1:ibYjabk5VlW7Pw69apeqFUyYXwLiSGWk3xoSuINE57A= 2 | -------------------------------------------------------------------------------- /pkg/printing/banner.go: -------------------------------------------------------------------------------- 1 | package printing 2 | 3 | // Banner is banner func 4 | func Banner() { 5 | 6 | } 7 | -------------------------------------------------------------------------------- /pkg/printing/version.go: -------------------------------------------------------------------------------- 1 | package printing 2 | 3 | // VERSION is version 4 | const VERSION = "v1.0.4" 5 | -------------------------------------------------------------------------------- /sample.lst: -------------------------------------------------------------------------------- 1 | https://github.com/hahwul 2 | https://github.com/tomnomnom/gron 3 | https://github.com/tomnomnom/httprobe 4 | https://github.com/s0md3v 5 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | custom: ['https://paypal.me/hahwul', 'https://www.buymeacoffee.com/hahwul'] 4 | -------------------------------------------------------------------------------- /pkg/model/model.go: -------------------------------------------------------------------------------- 1 | package model 2 | 3 | type Options struct { 4 | Proxy string 5 | UseTor bool 6 | Output string 7 | IncludeAccount bool 8 | } 9 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # BUILDER 2 | FROM golang:latest AS builder 3 | WORKDIR /go/src/app 4 | COPY . . 5 | 6 | RUN go get -d -v ./... 7 | RUN go build -o gitls 8 | 9 | # RUNNING 10 | FROM debian:buster 11 | RUN mkdir /app 12 | WORKDIR /app/ 13 | COPY --from=builder /go/src/app/gitls /app/gitls 14 | CMD ["/app/gitls"] 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | 14 | # Dependency directories (remove the comment below to include it) 15 | # vendor/ 16 | -------------------------------------------------------------------------------- /.github/workflows/contributors.yml: -------------------------------------------------------------------------------- 1 | name: Contributors 2 | on: 3 | schedule: 4 | - cron: '0 1 * * 0' # At 01:00 on Sunday. 5 | push: 6 | branches: 7 | - main 8 | workflow_dispatch: 9 | inputs: 10 | logLevel: 11 | description: 'manual run' 12 | required: false 13 | default: '' 14 | jobs: 15 | contributors: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - uses: bubkoo/contributors-list@v1 19 | with: 20 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 21 | round: true 22 | -------------------------------------------------------------------------------- /.github/workflows/go.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | 11 | build: 12 | runs-on: ubuntu-latest 13 | strategy: 14 | matrix: 15 | go: ["1.17", "1.18", "1.19", "1.20"] 16 | steps: 17 | - name: Set up Go ${{ matrix.go }} 18 | uses: actions/setup-go@v4 19 | with: 20 | go-version: ${{ matrix.go }} 21 | id: go 22 | 23 | - name: Check out code into the Go module directory 24 | uses: actions/checkout@v3 25 | 26 | - name: Build 27 | run: go build -v ./... 28 | 29 | - name: Test 30 | run: go test -v ./... 31 | -------------------------------------------------------------------------------- /pkg/modules/file.go: -------------------------------------------------------------------------------- 1 | package modules 2 | 3 | import ( 4 | "os" 5 | "bufio" 6 | ) 7 | 8 | func readLines(filename string) ([]string, error) { 9 | f, err := os.Open(filename) 10 | if err != nil { 11 | return []string{}, err 12 | } 13 | defer f.Close() 14 | 15 | lines := make([]string, 0) 16 | sc := bufio.NewScanner(f) 17 | for sc.Scan() { 18 | lines = append(lines, sc.Text()) 19 | } 20 | 21 | return lines, sc.Err() 22 | } 23 | 24 | // ReadLinesOrLiteral tries to read lines from a file, returning 25 | func ReadLinesOrLiteral(arg string) ([]string, error) { 26 | if isFile(arg) { 27 | return readLines(arg) 28 | } 29 | return []string{arg}, nil 30 | } 31 | 32 | // isFile returns true if its argument is a regular file 33 | func isFile(path string) bool { 34 | f, err := os.Stat(path) 35 | return err == nil && f.Mode().IsRegular() 36 | } 37 | -------------------------------------------------------------------------------- /pkg/modules/check.go: -------------------------------------------------------------------------------- 1 | package modules 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | 7 | "github.com/hahwul/gitls/pkg/model" 8 | ) 9 | 10 | // CheckAccount is repo list of accounts in target 11 | func CheckAccount(s string, options model.Options) { 12 | str := strings.Split(s, "/") 13 | size := len(str) // 4 is user/org , 5 is repository 14 | if size == 4 { 15 | if strings.Contains(str[2], "github") { 16 | GetRepoListFromIncludeAccount(str[3], str[2], options) 17 | } else if strings.Contains(str[2], "gitlab") { 18 | // TODO gitlab getting repos 19 | } 20 | } else if size == 5 { 21 | fmt.Println(s) 22 | } 23 | } 24 | 25 | // CheckURL is repo list of target 26 | func CheckURL(s string, options model.Options) { 27 | str := strings.Split(s, "/") 28 | size := len(str) // 4 is user/org , 5 is repository 29 | if size == 4 { 30 | if strings.Contains(str[2], "github") { 31 | GetRepoListFromUser(str[3], str[2], options) 32 | } else if strings.Contains(str[2], "gitlab") { 33 | // TODO gitlab getting repos 34 | } 35 | } else if size == 5 { 36 | fmt.Println(s) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 HAHWUL 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /pkg/transport/transport.go: -------------------------------------------------------------------------------- 1 | package transport 2 | 3 | import ( 4 | "crypto/tls" 5 | "fmt" 6 | "net" 7 | "net/http" 8 | "net/url" 9 | "time" 10 | 11 | "github.com/hahwul/gitls/pkg/model" 12 | ) 13 | 14 | // GetTransport is setting timetout and proxy on tranport 15 | func GetTransport(options model.Options) *http.Transport { 16 | // set timeout 17 | transport := &http.Transport{ 18 | TLSClientConfig: &tls.Config{ 19 | InsecureSkipVerify: true, 20 | Renegotiation: tls.RenegotiateOnceAsClient, 21 | }, 22 | DisableKeepAlives: true, 23 | DialContext: (&net.Dialer{ 24 | Timeout: 5 * time.Second, 25 | DualStack: true, 26 | }).DialContext, 27 | } 28 | // if use proxy mode , set proxy 29 | if options.Proxy != "" { 30 | proxyAddress, err := url.Parse(options.Proxy) 31 | if err != nil { 32 | msg := fmt.Sprintf("not running %v from proxy option", err) 33 | fmt.Println(msg) 34 | } 35 | transport.Proxy = http.ProxyURL(proxyAddress) 36 | } 37 | if options.UseTor { 38 | proxyAddress, err := url.Parse("http://localhost:9050") 39 | if err != nil { 40 | msg := fmt.Sprintf("not running %v from proxy option", err) 41 | fmt.Println(msg) 42 | } 43 | transport.Proxy = http.ProxyURL(proxyAddress) 44 | } 45 | return transport 46 | } 47 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "flag" 6 | "fmt" 7 | "os" 8 | "strings" 9 | 10 | model "github.com/hahwul/gitls/pkg/model" 11 | module "github.com/hahwul/gitls/pkg/modules" 12 | printing "github.com/hahwul/gitls/pkg/printing" 13 | ) 14 | 15 | func main() { 16 | list := flag.String("l", "", "List of targets (e.g -l sample.lst)") 17 | output := flag.String("o", "", "write output file (optional)") 18 | version := flag.Bool("version", false, "version of gitls") 19 | proxy := flag.String("proxy", "", "using custom proxy") 20 | useTor := flag.Bool("tor", false, "using tor proxy / localhost:9050") 21 | includeAccount := flag.Bool("include-users", false, "include repo of org users(member)") 22 | flag.Parse() 23 | options := model.Options{ 24 | Proxy: *proxy, 25 | UseTor: *useTor, 26 | Output: *output, 27 | IncludeAccount: *includeAccount, 28 | } 29 | if *version { 30 | fmt.Println(printing.VERSION) 31 | return 32 | } 33 | 34 | if *list == "" { 35 | sc := bufio.NewScanner(os.Stdin) 36 | for sc.Scan() { 37 | line := strings.ToLower(sc.Text()) 38 | if line != "" { 39 | module.CheckURL(line, options) 40 | } 41 | if *includeAccount { 42 | module.CheckAccount(line, options) 43 | } 44 | } 45 | } else { 46 | target, err := module.ReadLinesOrLiteral(*list) 47 | _ = err 48 | for i, v := range target { 49 | _ = i 50 | module.CheckURL(v, options) 51 | if *includeAccount { 52 | module.CheckAccount(v, options) 53 | } 54 | } 55 | 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | project_name: gitls 2 | 3 | before: 4 | hooks: 5 | - go mod download 6 | 7 | builds: 8 | - 9 | main: . 10 | binary: gitls 11 | goos: 12 | - windows 13 | - linux 14 | - darwin 15 | - freebsd 16 | goarch: 17 | - amd64 18 | - 386 19 | - arm 20 | - arm64 21 | goarm: 22 | - 6 23 | ignore: 24 | - goos: darwin 25 | goarch: 386 26 | - goos: darwin 27 | goarch: arm 28 | - goos: windows 29 | goarch: 386 30 | - goos: windows 31 | goarch: arm 32 | 33 | checksum: 34 | name_template: "{{ .ProjectName }}_checksums.txt" 35 | 36 | changelog: 37 | sort: desc 38 | filters: 39 | exclude: 40 | - '^MERGE' 41 | - "{{ .Tag }}" 42 | 43 | release: 44 | github: 45 | owner: hahwul 46 | name: gitls 47 | 48 | brews: 49 | - 50 | name: gitls 51 | tap: 52 | owner: hahwul 53 | name: homebrew-gitls 54 | url_template: "https://github.com/hahwul/gitls/releases/download/{{ .Tag }}/{{ .ArtifactName }}" 55 | commit_author: 56 | name: hahwul 57 | email: hahwul@gmail.com 58 | folder: Formula 59 | homepage: "https://github.com/hahwul/gitls" 60 | description: "Listing git repository from URL/User/Org" 61 | test: | 62 | system "#{bin}/gitls -version" 63 | install: | 64 | bin.install "gitls" 65 | snapcrafts: 66 | - 67 | name: gitls 68 | # Remember you need to `snapcraft login` first. 69 | publish: true 70 | summary: Listing git repository from URL/User/Org 71 | description: This tool is available when the repository, such as github, is included in the bugbounty scope. Sometimes specified as an org name or user name rather than a specific repository, you can use this tool to extract url from all public repositories included in the org/user. 72 | grade: stable 73 | confinement: strict 74 | license: MIT 75 | 76 | apps: 77 | gitls: 78 | plugs: ["home","network","network-bind"] 79 | -------------------------------------------------------------------------------- /pkg/modules/github.go: -------------------------------------------------------------------------------- 1 | package modules 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "io/ioutil" 7 | "net/http" 8 | "time" 9 | 10 | model "github.com/hahwul/gitls/pkg/model" 11 | transport "github.com/hahwul/gitls/pkg/transport" 12 | ) 13 | 14 | // GithubObject is json object of github api 15 | type GithubObject struct { 16 | URL string `json:"html_url"` 17 | Fork bool `json:"fork"` 18 | } 19 | 20 | // GetRepoListFromIncludeAccount is get repo list from account of org 21 | func GetRepoListFromIncludeAccount(user, repoHost string, options model.Options) { 22 | check := true 23 | for i := 1; check; i++ { 24 | apiAddress := fmt.Sprintf("https://api."+repoHost+"/orgs/%v/members?page=%v&per_page=100", user, i) 25 | req, err := http.NewRequest("GET", apiAddress, nil) 26 | transport := transport.GetTransport(options) 27 | client := &http.Client{ 28 | Timeout: 5 * time.Second, 29 | Transport: transport, 30 | } 31 | 32 | resp, err := client.Do(req) 33 | if err == nil { 34 | defer resp.Body.Close() 35 | data, err := ioutil.ReadAll(resp.Body) 36 | if err == nil { 37 | if string(data) == "[]" { 38 | check = false 39 | } 40 | var objects []GithubObject 41 | json.Unmarshal(data, &objects) 42 | for k, v := range objects { 43 | _ = k 44 | if !v.Fork { 45 | fmt.Println(v.URL) 46 | CheckURL(v.URL, options) 47 | } 48 | } 49 | } 50 | } 51 | } 52 | } 53 | 54 | // GetRepoListFromUser is gettting repo list from github 55 | func GetRepoListFromUser(user, repoHost string, options model.Options) { 56 | check := true 57 | for i := 1; check; i++ { 58 | apiAddress := fmt.Sprintf("https://api."+repoHost+"/users/%v/repos?page=%v&per_page=100", user, i) 59 | req, err := http.NewRequest("GET", apiAddress, nil) 60 | transport := transport.GetTransport(options) 61 | client := &http.Client{ 62 | Timeout: 5 * time.Second, 63 | Transport: transport, 64 | } 65 | 66 | resp, err := client.Do(req) 67 | if err == nil { 68 | defer resp.Body.Close() 69 | data, err := ioutil.ReadAll(resp.Body) 70 | if err == nil { 71 | if string(data) == "[]" { 72 | check = false 73 | } 74 | var objects []GithubObject 75 | json.Unmarshal(data, &objects) 76 | for k, v := range objects { 77 | _ = k 78 | if !v.Fork { 79 | fmt.Println(v.URL) 80 | } 81 | } 82 | } 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ main ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ main ] 20 | schedule: 21 | - cron: '32 7 * * 5' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | 28 | strategy: 29 | fail-fast: false 30 | matrix: 31 | language: [ 'go' ] 32 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] 33 | # Learn more: 34 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed 35 | 36 | steps: 37 | - name: Checkout repository 38 | uses: actions/checkout@v2 39 | 40 | # Initializes the CodeQL tools for scanning. 41 | - name: Initialize CodeQL 42 | uses: github/codeql-action/init@v1 43 | with: 44 | languages: ${{ matrix.language }} 45 | # If you wish to specify custom queries, you can do so here or in a config file. 46 | # By default, queries listed here will override any specified in a config file. 47 | # Prefix the list here with "+" to use these queries and those in the config file. 48 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 49 | 50 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 51 | # If this step fails, then you should remove it and run the build manually (see below) 52 | - name: Autobuild 53 | uses: github/codeql-action/autobuild@v1 54 | 55 | # ℹ️ Command-line programs to run using the OS shell. 56 | # 📚 https://git.io/JvXDl 57 | 58 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 59 | # and modify them (or add more) to build your code if your project 60 | # uses a compiled language 61 | 62 | #- run: | 63 | # make bootstrap 64 | # make release 65 | 66 | - name: Perform CodeQL Analysis 67 | uses: github/codeql-action/analyze@v1 68 | -------------------------------------------------------------------------------- /.github/workflows/docker-publish.yml: -------------------------------------------------------------------------------- 1 | name: Docker 2 | 3 | # This workflow uses actions that are not certified by GitHub. 4 | # They are provided by a third-party and are governed by 5 | # separate terms of service, privacy policy, and support 6 | # documentation. 7 | 8 | on: 9 | push: 10 | branches: [ main ] 11 | # Publish semver tags as releases. 12 | tags: [ 'v*.*.*' ] 13 | 14 | env: 15 | # Use docker.io for Docker Hub if empty 16 | REGISTRY: ghcr.io 17 | # github.repository as / 18 | IMAGE_NAME: ${{ github.repository }} 19 | 20 | 21 | jobs: 22 | build: 23 | 24 | runs-on: ubuntu-latest 25 | permissions: 26 | contents: read 27 | packages: write 28 | # This is used to complete the identity challenge 29 | # with sigstore/fulcio when running outside of PRs. 30 | id-token: write 31 | 32 | steps: 33 | - name: Checkout repository 34 | uses: actions/checkout@v3 35 | 36 | # Install the cosign tool except on PR 37 | # https://github.com/sigstore/cosign-installer 38 | - name: Install cosign 39 | if: github.event_name != 'pull_request' 40 | uses: sigstore/cosign-installer@d6a3abf1bdea83574e28d40543793018b6035605 41 | with: 42 | cosign-release: 'v1.7.1' 43 | 44 | 45 | # Workaround: https://github.com/docker/build-push-action/issues/461 46 | - name: Setup Docker buildx 47 | uses: docker/setup-buildx-action@79abd3f86f79a9d68a23c75a09a9a85889262adf 48 | 49 | # Login against a Docker registry except on PR 50 | # https://github.com/docker/login-action 51 | - name: Log into registry ${{ env.REGISTRY }} 52 | if: github.event_name != 'pull_request' 53 | uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c 54 | with: 55 | registry: ${{ env.REGISTRY }} 56 | username: ${{ github.actor }} 57 | password: ${{ secrets.GITHUB_TOKEN }} 58 | 59 | # Extract metadata (tags, labels) for Docker 60 | # https://github.com/docker/metadata-action 61 | - name: Extract Docker metadata 62 | id: meta 63 | uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 64 | with: 65 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 66 | 67 | # Build and push Docker image with Buildx (don't push on PR) 68 | # https://github.com/docker/build-push-action 69 | - name: Build and push Docker image 70 | id: build-and-push 71 | uses: docker/build-push-action@ac9327eae2b366085ac7f6a2d02df8aa8ead720a 72 | with: 73 | context: . 74 | platforms: linux/amd64,linux/arm64 75 | push: ${{ github.event_name != 'pull_request' }} 76 | tags: ${{ steps.meta.outputs.tags }} 77 | labels: ${{ steps.meta.outputs.labels }} 78 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 |
3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 |

11 | 12 | > Enumerate git repository URL from list of `URL` / `User` / `Org`. Friendly to pipeline 13 | 14 | This tool is available when the repository, such as github, is included in the bugbounty scope. Sometimes specified as an org name or user name rather than a specific repository, you can use this tool to extract url from all public repositories included in the org/user. 15 | 16 | This can be used for various actions such as scanning or cloning for multiple repositories. 17 | 18 | > 🚧 NOTICE
19 | For unauthenticated requests in github api, the rate limit allows for up to 60 requests per hour. Unauthenticated requests are associated with the originating IP address, and not the user making requests. 20 | [https://docs.github.com/en/rest/overview/resources-in-the-rest-api](https://docs.github.com/en/rest/overview/resources-in-the-rest-api)

21 | So too many tasks can be blocked by the API for a certain time from github. In this case, you can select the appropriate destination or access and use any IP using the torsocks(e.g `torsocks gitls -l user.list`) or `-tor` or `-proxy http://localhost:` options. 22 | 23 | ![](https://user-images.githubusercontent.com/13212227/190673282-5c0611dc-a594-4ed4-8b8c-e9be1a6257ac.png) 24 | 25 | ## Installation 26 | ### From go-get 27 | ``` 28 | ▶ go install -v github.com/hahwul/gitls@latest 29 | ``` 30 | ### Using homebres 31 | ``` 32 | ▶ brew tap hahwul/gitls 33 | ▶ brew install gitls 34 | ``` 35 | ### Using snapcraft 36 | ``` 37 | ▶ sudo snap install gitls 38 | ``` 39 | 40 | ## Usage 41 | ``` 42 | Usage of gitls: 43 | -include-users 44 | include repo of org users(member) 45 | -l string 46 | List of targets (e.g -l sample.lst) 47 | -o string 48 | write output file (optional) 49 | -proxy string 50 | using custom proxy 51 | -tor 52 | using tor proxy / localhost:9050 53 | -version 54 | version of gitls 55 | ``` 56 | 57 | ## Case Study 58 | ### Make all repo urls from repo/org/user urls 59 | sample.lst 60 | ``` 61 | https://github.com/hahwul 62 | https://github.com/tomnomnom/gron 63 | https://github.com/tomnomnom/httprobe 64 | https://github.com/s0md3v 65 | ``` 66 | 67 | make repo url list from sample file 68 | ``` 69 | ▶ gitls -l sample.lst 70 | https://github.com/hahwul/a2sv 71 | https://github.com/hahwul/action-dalfox 72 | https://github.com/hahwul/asset-of-hahwul.com 73 | https://github.com/hahwul/awesome-zap-extensions 74 | https://github.com/hahwul/backbomb 75 | https://github.com/hahwul/booungJS 76 | https://github.com/hahwul/buildpack-nmap 77 | https://github.com/hahwul/buildpack-zap-daemon 78 | https://github.com/hahwul/can-i-protect-xss 79 | https://github.com/hahwul/cyan-snake 80 | https://github.com/hahwul/dalfox 81 | https://github.com/hahwul/DevSecOps 82 | https://github.com/hahwul/droid-hunter 83 | https://github.com/hahwul/exploit-db_to_dokuwiki 84 | https://github.com/hahwul/ftc 85 | https://github.com/hahwul/gitls 86 | https://github.com/hahwul/go-github-selfupdate-patched 87 | https://github.com/hahwul/hack-pet 88 | ...snip... 89 | https://github.com/hahwul/zap-cloud-scan 90 | https://github.com/tomnomnom/gron 91 | https://github.com/tomnomnom/httprobe 92 | https://github.com/s0md3v/Arjun 93 | https://github.com/s0md3v/AwesomeXSS 94 | https://github.com/s0md3v/Blazy 95 | https://github.com/s0md3v/Bolt 96 | ...snip... 97 | https://github.com/s0md3v/velocity 98 | https://github.com/s0md3v/XSStrike 99 | https://github.com/s0md3v/Zen 100 | https://github.com/s0md3v/zetanize 101 | ``` 102 | 103 | ### Get all repository in org and included users(members) 104 | ``` 105 | ▶ echo https://github.com/paypal | ./gitls -include-users 106 | ``` 107 | 108 | ``` 109 | .... 110 | https://github.com/paypal/tech-talks 111 | https://github.com/paypal/TLS-update 112 | https://github.com/paypal/yurita 113 | https://github.com/ahunnargikar 114 | https://github.com/ahunnargikar/docker-chronos-image 115 | https://github.com/ahunnargikar/docker-tomcat7 116 | https://github.com/ahunnargikar/DockerConDemo 117 | https://github.com/ahunnargikar/elasticsearch-registry-backend 118 | https://github.com/ahunnargikar/elasticsearchindex 119 | https://github.com/ahunnargikar/jenkins-dind 120 | https://github.com/ahunnargikar/jenkins-standalone 121 | https://github.com/ahunnargikar/vagrant-mesos 122 | https://github.com/ahunnargikar/vagrant_docker_registry 123 | https://github.com/anandpalanisamy 124 | https://github.com/anilgursel 125 | https://github.com/anilgursel/squbs-sample 126 | https://github.com/bluepnume 127 | ``` 128 | 129 | ### Automated testing with [gitleaks](https://github.com/zricethezav/gitleaks) 130 | ``` 131 | ▶ gitls -l sample.lst | xargs -I % gitleaks --repo-url=% -v 132 | ``` 133 | 134 | ### All clone target's repo 135 | ``` 136 | ▶ echo "https://github.com/paypal" | gitls | xargs -I % git clone % 137 | ``` 138 | 139 | ## Contributors 140 | ![](/CONTRIBUTORS.svg) 141 | --------------------------------------------------------------------------------