-
Notifications
You must be signed in to change notification settings - Fork 66
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #189 from d-Rickyy-b/dev
fix: recognize ipv6 error messages
- Loading branch information
Showing
9 changed files
with
132 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
# Analyzers | ||
This directory contains all the analyzers for pastepwn. An analyzer is a class that extends the [BasicAnalyzer]() class (or any other subclass of that) and overrides at least the `match` function. | ||
|
||
The match function gets passed a paste object. | ||
The job of an analyzer is to check if a paste matches certain criteria. If it matches, pastepwn will execute the action(s), that is stored in the analyzer. | ||
|
||
|
||
## Example analyzers | ||
Analyzers can check for multiple things. | ||
A paste contains a certain, previously defined string. | ||
Or the paste matches a certain regex. | ||
Or the paste's syntax is set to `java`. | ||
And many other things. | ||
|
||
Check a few selected examples to get an idea: | ||
- [RegexAnalyzer](https://github.com/d-Rickyy-b/pastepwn/blob/master/pastepwn/analyzers/regexanalyzer.py) - Foundation for most other analyzers. Checks a | ||
paste against a regex | ||
- [SteamKeyAnalyzer](https://github.com/d-Rickyy-b/pastepwn/blob/master/pastepwn/analyzers/steamkeyanalyzer.py) - Checks if a paste contains a Steam Key | ||
- [IBANAnalyzer](https://github.com/d-Rickyy-b/pastepwn/blob/master/pastepwn/analyzers/ibananalyzer.py) - Checks if a paste contains an IBAN | ||
|
||
|
||
## Create own analyzer | ||
Check out the implementations of a few analyzers and you'll get an idea on how to get started. | ||
|
||
```python | ||
# -*- coding: utf-8 -*- | ||
from .basicanalyzer import BasicAnalyzer | ||
|
||
|
||
class MyAnalyzer(BasicAnalyzer): | ||
name = "MyAnalyzer" | ||
|
||
def __init__(self, actions, regex, flags=0, blacklist=None): | ||
# We need co call the init of super, to initialize some settings in the basicanalyzer | ||
super().__init__(actions, self.name) | ||
|
||
# We can do some custom setup stuff to initialize e.g. blacklists | ||
self.blacklist = blacklist or [] | ||
|
||
def match(self, paste): | ||
# Here our pastes get matched. We can access all fields of the paste object | ||
paste_title = paste.title or "" | ||
|
||
# We can for example check if the paste title contains a certain string | ||
return "Secret" in paste_title | ||
``` | ||
|
||
## Combining analyzers | ||
To combine multiple analyzers and hence multiple conditions, you can use bitwise operators. | ||
Those bitwise operators act as a logical operators by creating a new `MergedAnalyzer` class that handles the individual analyzers internally. | ||
|
||
`&` - bitwise AND for combining analyzers with a logical AND | ||
`|` - bitwise OR for combining analyzers with a logical OR | ||
|
||
```python | ||
analyzer1 = SomeAnalyzer(...) | ||
analyzer2 = SomeOtherAnalyzer(...) | ||
analyzer3 = ThirdAnalyzer(...) | ||
|
||
realAnalyzer = (analyzer1 & analyzer2) | analyzer3 | ||
``` | ||
|
||
The `realAnalyzer` only matches if either `analyzer1` and `analyzer2` both match, or if `analyzer3` matches. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
# -*- coding: utf-8 -*- | ||
import unittest | ||
from pastepwn.scraping.pastebin import PastebinScraper | ||
from pastepwn.scraping.pastebin.exceptions import IPNotRegisteredError, PasteDeletedException, PasteNotReadyException, PasteEmptyException | ||
|
||
|
||
class TestPastebinscraper(unittest.TestCase): | ||
|
||
def setUp(self) -> None: | ||
self.pastebinscraper = PastebinScraper() | ||
|
||
def test_empty(self): | ||
with self.assertRaises(PasteEmptyException): | ||
self.pastebinscraper._check_error("") | ||
|
||
def test_not_ready(self): | ||
with self.assertRaises(PasteNotReadyException): | ||
self.pastebinscraper._check_error("File is not ready for scraping yet. Try again in 1 minute.") | ||
|
||
def test_deleted(self): | ||
with self.assertRaises(PasteDeletedException): | ||
self.pastebinscraper._check_error("Error, we cannot find this paste.") | ||
|
||
def _check_ip_not_registered(self, ip_list): | ||
shell = "YOUR IP: {} DOES NOT HAVE ACCESS. VISIT: https://pastebin.com/doc_scraping_api TO GET ACCESS!" | ||
for ip in ip_list: | ||
with self.assertRaises(IPNotRegisteredError): | ||
self.pastebinscraper._check_error(shell.format(ip)) | ||
print("The following IP was not detected: {}".format(ip)) | ||
|
||
def test_ipv4_not_registered(self): | ||
"""Test if the _check_error method detects different IPv4 addresses. It's okay to also detect invalid addresses where an octed is > 255)""" | ||
ipv4_test = ["1.1.1.1", "10.1.5.6", "1.10.5.6", "1.1.50.6", "1.1.5.60", "1.1.50.60", "1.10.50.60", "10.10.50.60", "10.10.50.255", "10.10.255.255", | ||
"10.255.255.255", "255.255.255.255", "333.333.333.333"] | ||
|
||
self._check_ip_not_registered(ipv4_test) | ||
|
||
def test_ipv6_not_registered(self): | ||
ipv6_test = ["fe80::21d8:f50:c295:c4be", "2001:cdba:0000:0000:0000:0000:3257:9652", "2001:cdba:0:0:0:0:3257:9652", "2001:cdba::3257:9652", | ||
"2001:cdba::1222", "21DA:D3:0:2F3B:2AA:FF:FE28:9C5A", "2001:cdba::1:2:3:3257:9652", "FE80::8329", "FE80::FFFF:8329", | ||
"FE80::B3FF:FFFF:8329", "FE80::0202:B3FF:FFFF:8329", "FE80:0000:0000:0000:0202:B3FF:FFFF:8329"] | ||
# TODO: IPv6 addresses with double colon AND full zero groups (of 16 bits) are currently not recognized by the used regex. An example address would | ||
# be: `FE80::0000:0000:0202:B3FF:FFFF:8329` | ||
|
||
self._check_ip_not_registered(ipv6_test) | ||
|
||
|
||
if __name__ == '__main__': | ||
unittest.main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters