Skip to content

Commit 26a95c1

Browse files
committed
Update logo and minor refactor changes
1 parent 27ab868 commit 26a95c1

3 files changed

Lines changed: 82 additions & 18 deletions

File tree

README.md

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<p align="center">
2-
<img src="https://i.imgur.com/NtlwDVT.png" width="600" height="200" alt="logo">
2+
<img src="https://i.imgur.com/F4D1zhr.png" width="350" height="200" alt="logo">
33
</p>
44

55
<h1 align="center">NoMore403</h1>
@@ -8,10 +8,45 @@
88
<a href="https://github.com/devploit/nomore403/issues"><img alt="contributions welcome" src="https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat"></a>
99
</p>
1010

11+
## Table of Contents
12+
- [Introduction](#introduction)
13+
- [Features](#features)
14+
- [Implemented Bypass Techniques](#implemented-bypass-techniques)
15+
- [Prerequisites](#prerequisites)
16+
- [Installation](#installation)
17+
- [How It Works](#how-it-works)
18+
- [Customization](#customization)
19+
- [Usage](#usage)
20+
- [Options](#options)
21+
- [Common Use Cases](#common-use-cases)
22+
- [Contributing](#contributing)
23+
- [Security Considerations](#security-considerations)
24+
- [License](#license)
25+
- [Acknowledgments](#acknowledgments)
26+
- [Contact](#contact)
27+
1128
## Introduction
1229

1330
`nomore403` is an innovative tool designed to help cybersecurity professionals and enthusiasts bypass HTTP 40X errors encountered during web security assessments. Unlike other solutions, `nomore403` automates various techniques to seamlessly navigate past these access restrictions, offering a broad range of strategies from header manipulation to method tampering.
1431

32+
## Features
33+
34+
- **Auto-calibration**: Automatically detects server base responses to identify successful bypasses
35+
- **Multiple bypass techniques**: Implements 8 different techniques to bypass restrictions
36+
- **High concurrency**: Uses goroutines for fast and efficient testing
37+
- **Customizable**: Easily add new payloads and techniques
38+
39+
## Implemented Bypass Techniques
40+
41+
- **Verb Tampering**: Tests different HTTP methods to access protected resources
42+
- **Verb Case Switching**: Manipulates HTTP method capitalization to detect incorrect implementations
43+
- **Headers**: Injects headers designed for bypassing like X-Forwarded-For, X-Original-URL, etc.
44+
- **Custom Paths**: Tests alternative paths that can bypass access restrictions
45+
- **Path Traversal (midpaths)**: Inserts patterns in the middle of paths to confuse parsers
46+
- **Double-Encoding**: Uses double URL encoding to evade filters
47+
- **HTTP Versions**: Tests different HTTP versions (1.0, 1.1) to identify inconsistent behaviors
48+
- **Path Case Switching**: Manipulates uppercase/lowercase in paths to detect case-sensitive configurations
49+
1550
## Prerequisites
1651

1752
Before you install and run `nomore403`, make sure you have the following:
@@ -34,10 +69,27 @@ go get
3469
go build
3570
```
3671

72+
## How It Works
73+
74+
1. **Auto-calibration**: The tool makes a request to a non-existent path to determine the base response
75+
2. **Default request**: Makes a standard request to the target for comparison
76+
3. **Technique application**: Executes selected techniques in parallel
77+
4. **Result filtering**: Shows only responses that differ from the initial calibration (unless verbose mode is used)
78+
3779
## Customization
3880

3981
To edit or add new bypasses, modify the payloads directly in the [payloads](https://github.com/devploit/nomore403/tree/main/payloads) folder. nomore403 will automatically incorporate these changes.
4082

83+
### Payloads Folder Structure
84+
85+
- **headers**: Headers used for bypassing
86+
- **ips**: IP addresses to inject in specific headers
87+
- **httpmethods**: Alternative HTTP methods
88+
- **endpaths**: Custom paths to add at the end of the target URL
89+
- **midpaths**: Patterns to insert in the middle of paths
90+
- **simpleheaders**: Common simple headers
91+
- **useragents**: List of User-Agents for rotation
92+
4193
## Usage
4294

4395
### Output example
@@ -107,14 +159,19 @@ Verbose: false
107159
### Use custom header + specific IP address for bypasses
108160

109161
```bash
110-
./nomore403 -u https://domain.com/admin -H "Environment: Staging" -b 8.8.8.8
162+
./nomore403 -u https://domain.com/admin -H "Environment: Staging" -i 8.8.8.8
111163
```
112164

113165
### Set new max of goroutines + add delay between requests
114166
```bash
115167
./nomore403 -u https://domain.com/admin -m 10 -d 200
116168
```
117169

170+
### Filter by specific status codes
171+
```bash
172+
./nomore403 -u https://domain.com/admin --status 200,302
173+
```
174+
118175
## Options
119176

120177
```bash
@@ -148,12 +205,20 @@ Flags:
148205
-v, --verbose Enable verbose output for detailed request/response logging (not based on auto-calibrate).
149206
```
150207
208+
## Common Use Cases
209+
210+
- **Security Audits**: Identify misconfigurations in authentication systems
211+
- **Bug Bounty**: Discover bypasses in protected endpoints
212+
- **Penetration Testing**: Gain access to restricted areas during assessments
213+
- **Hardening**: Verify the robustness of implemented protections
214+
151215
## Contributing
152216
153217
We welcome contributions of all forms. Here's how you can help:
154218
155-
- Report bugs and suggest features.
156-
- Submit pull requests with bug fixes and new features.
219+
- Report bugs and suggest features
220+
- Submit pull requests with bug fixes and new features
221+
- Add new payloads to existing folders
157222
158223
## Security Considerations
159224
@@ -163,6 +228,13 @@ While nomore403 is designed for educational and ethical testing purposes, it's i
163228
164229
nomore403 is released under the MIT License. See the [LICENSE](https://github.com/devploit/dontgo403/blob/main/LICENSE) file for details.
165230
231+
## Acknowledgments
232+
233+
NoMore403 draws inspiration from several projects in the web security space:
234+
- [Dontgo403](https://github.com/devploit/dontgo403) - The predecessor to NoMore403
235+
- The cybersecurity community for documenting and sharing bypass techniques
236+
- All contributors who have helped improve this tool
237+
166238
## Contact
167239
168240
[![Twitter: devploit](https://img.shields.io/badge/-Twitter-blue?style=flat-square&logo=Twitter&logoColor=white&link=https://twitter.com/devploit/)](https://twitter.com/devploit/)

cmd/api.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ type header struct {
4949
}
5050

5151
// request makes an HTTP request using headers `headers` and proxy `proxy`.
52-
// If `method` is empty, it defaults to "GET".
5352
func request(method, uri string, headers []header, proxy *url.URL, rateLimit bool, timeout int, redirect bool) (int, []byte, error) {
5453
if method == "" {
5554
method = "GET"
@@ -84,7 +83,7 @@ func request(method, uri string, headers []header, proxy *url.URL, rateLimit boo
8483
}
8584
}
8685

87-
// Use raw URL parser instead
86+
// Use raw URL parser
8887
parsedURL, err := url.Parse(uri)
8988
if err != nil {
9089
log.Println(err)
@@ -134,7 +133,7 @@ func loadFlagsFromRequestFile(requestFile string, schema bool, verbose bool, tec
134133
if err != nil {
135134
log.Fatalf("Error reading request file: %v", err)
136135
}
137-
//Down HTTP/2 to HTTP/1/1
136+
//Down HTTP/2 to HTTP/1.1
138137
temp := strings.Split(string(content), "\n")
139138
fistLine := strings.Replace(temp[0], "HTTP/2", "HTTP/1.1", 1)
140139
content = []byte(strings.Join(append([]string{fistLine}, temp[1:]...), "\n"))

cmd/requester.go

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ type RequestOptions struct {
4444
}
4545

4646
var _verbose bool
47-
var defaultSc int
4847
var defaultCl int
4948
var uniqueResults = make(map[string]bool)
5049
var uniqueResultsByTechnique = make(map[string]map[string]bool)
@@ -153,13 +152,11 @@ func printResult(result Result) {
153152
func showInfo(options RequestOptions) {
154153
var statusCodeStrings []string
155154

156-
for _, code := range statusCodes {
157-
statusCodeStrings = append(statusCodeStrings, code)
158-
}
155+
statusCodeStrings = append(statusCodeStrings, statusCodes...)
159156
statusCodesString := strings.Join(statusCodeStrings, ", ")
160157

161158
if !nobanner {
162-
fmt.Printf(color.MagentaString("━━━━━━━━━━━━━━ NOMORE403 CONFIGURATION ━━━━━━━━━━━━━━━━━━\n"))
159+
fmt.Print(color.MagentaString("━━━━━━━━━━━━━━ NOMORE403 CONFIGURATION ━━━━━━━━━━━━━━━━━━\n"))
163160
fmt.Printf("%s \t\t%s\n", "Target:", options.uri)
164161
if len(options.reqHeaders) > 0 && len(options.reqHeaders[0]) != 0 {
165162
for _, header := range options.headers {
@@ -252,7 +249,6 @@ func requestDefault(options RequestOptions) {
252249

253250
uniqueResultsMutex.Lock()
254251
for _, result := range results {
255-
defaultSc = result.statusCode
256252
defaultCl = result.contentLength
257253
}
258254
uniqueResultsMutex.Unlock()
@@ -632,7 +628,7 @@ func requestDoubleEncoding(options RequestOptions) {
632628
}
633629

634630
result := Result{
635-
line: fmt.Sprintf("%s", encodedUri),
631+
line: encodedUri,
636632
statusCode: statusCode,
637633
contentLength: len(response),
638634
defaultReq: false,
@@ -794,10 +790,7 @@ func randomLine(filePath string) (string, error) {
794790
return "", err
795791
}
796792
defer func(file *os.File) {
797-
err := file.Close()
798-
if err != nil {
799-
800-
}
793+
_ = file.Close()
801794
}(file)
802795

803796
var lines []string

0 commit comments

Comments
 (0)