Skip to content

Commit

Permalink
fix: also recognize ipv6 error messages
Browse files Browse the repository at this point in the history
Welp... I never actually got IPv6 error messages until recently, so I never thought about it being an issue in the first place. Also removed the length check, because it's not making things a lot faster anyway. Also tweaked the regex by capturing from the beginning of the string.
  • Loading branch information
d-Rickyy-b committed Jun 19, 2020
1 parent b5f75a3 commit 8f5f531
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
### Fixed
- The PastebinScraper could not recognize error messages with IPv6 addresses.

## [1.3.0] - 2020-03-03
### Added
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@


class IPNotRegisteredError(Exception):
"""Exception class indicating that your IP is not witelisted on pastebin"""

def __init__(self, body):
ip = re.search("YOUR IP: (.*?) DOES NOT HAVE ACCESS", body).group(1)
Expand Down
4 changes: 2 additions & 2 deletions pastepwn/scraping/pastebin/pastebinscraper.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ def __init__(self, paste_queue=None, exception_event=None, api_hit_rate=None):

def _check_error(self, body, key=None):
"""Checks if an error occurred and raises an exception if it did"""
pattern = r"YOUR IP: \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} DOES NOT HAVE ACCESS\.\s+VISIT: https:\/\/pastebin\.com\/doc_scraping_api TO GET ACCESS!"
pattern = r"^YOUR IP: ((\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})|((([0-9A-Fa-f]{1,4}:){7})([0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,6}:)(([0-9A-Fa-f]{1,4}:){0,4})([0-9A-Fa-f]{1,4}))) DOES NOT HAVE ACCESS\.\s+VISIT: https:\/\/pastebin\.com\/doc_scraping_api TO GET ACCESS!"

if 107 >= len(body) >= 99 and re.match(pattern, body):
if 131 >= len(body) and re.match(pattern, body):
self._exception_event.set()
raise IPNotRegisteredError(body)

Expand Down
49 changes: 49 additions & 0 deletions pastepwn/scraping/pastebin/tests/pastebinscraper_test.py
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()

0 comments on commit 8f5f531

Please sign in to comment.