Skip to content

Commit

Permalink
Add Adobe Key Analyzer (#117)
Browse files Browse the repository at this point in the history
Adds a new adobe key analyzer. Also adds tests for the md5 analyzer.
  • Loading branch information
jmmille authored and d-Rickyy-b committed Oct 7, 2019
1 parent f0af9cb commit 4e52345
Show file tree
Hide file tree
Showing 5 changed files with 141 additions and 3 deletions.
5 changes: 3 additions & 2 deletions pastepwn/analyzers/__init__.py
Expand Up @@ -25,7 +25,7 @@
from .ibananalyzer import IBANAnalyzer
from .dbconnstringanalyzer import DBConnAnalyzer
from .privatekeyanalyzer import PrivateKeyAnalyzer
from .emailpasswordpairanalyzer import EmailPasswordPairAnalyzer
from .adobekeyanalyzer import AdobeKeyAnalyzer

__all__ = (
'AlwaysTrueAnalyzer',
Expand All @@ -50,7 +50,8 @@
'UplayKeyAnalyzer',
'BattleNetKeyAnalyzer',
'MicrosoftKeyAnalyzer',
'AdobeKeyAnalyzer',
'DBConnAnalyzer',
'PrivateKeyAnalyzer',
'EmailPasswordPairAnalyzer',
'EmailPasswordPairAnalyzer'
)
16 changes: 16 additions & 0 deletions pastepwn/analyzers/adobekeyanalyzer.py
@@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
from .regexanalyzer import RegexAnalyzer


class AdobeKeyAnalyzer(RegexAnalyzer):
"""Analyzer to match Adobe License Keys"""

def __init__(self, action):
"""
Analyzer to match Adobe License Keys
:param action: Single action or list of actions to be executed when a paste matches
"""
# Tested Regex against https://pastebin.com/fxWBGf8t
regex = r"\b[0-9]{4}(-[0-9]{4}){5}\b"

super().__init__(action, regex)
2 changes: 1 addition & 1 deletion pastepwn/analyzers/md5hashanalyzer.py
Expand Up @@ -7,5 +7,5 @@ class MD5HashAnalyzer(RegexAnalyzer):
name = "MD5HashAnalyzer"

def __init__(self, actions):
regex = r"[a-f0-9]{32}"
regex = r"\b[a-f0-9]{32}\b"
super().__init__(actions, regex)
61 changes: 61 additions & 0 deletions pastepwn/analyzers/tests/adobekeyanalyzer_test.py
@@ -0,0 +1,61 @@
# -*- coding: utf-8 -*-
import unittest
from unittest import mock

from pastepwn.analyzers.adobekeyanalyzer import AdobeKeyAnalyzer


class TestAdobeKeyAnalyzer(unittest.TestCase):
def setUp(self):
self.analyzer = AdobeKeyAnalyzer(None)
self.paste = mock.Mock()

def test_match_positive(self):
"""Test if positives are recognized"""
# adobe key dump
self.paste.body = "1118-1993-2045-6322-6067-9110"
self.assertTrue(self.analyzer.match(self.paste))

# adobe key dump
self.paste.body = "1118-1551-7298-8490-8910-4435"
self.assertTrue(self.analyzer.match(self.paste))

# adobe key dump
self.paste.body = "1118-1088-9818-3636-2479-0297"
self.assertTrue(self.analyzer.match(self.paste))

# adobe key dump
self.paste.body = "1118-1194-1581-4556-8113-6593"
self.assertTrue(self.analyzer.match(self.paste))

# part of a sentence
self.paste.body = "Hey, I have your key right here: 1118-1470-8779-0264-4009-3244!"
self.assertTrue(self.analyzer.match(self.paste))

# Newline seperated microsoft key
self.paste.body = "1118-1993-2046-6322-6067-9110\n1118-1470-8779-0264-4009-3244"
self.assertTrue(self.analyzer.match(self.paste))

def test_match_negative(self):
"""Test if negatives are not recognized"""
self.paste.body = ""
self.assertFalse(self.analyzer.match(self.paste))

self.paste.body = None
self.assertFalse(self.analyzer.match(self.paste))

# Invalid length
self.paste.body = "1118-1470-8779-0264-4009-32445"
self.assertFalse(self.analyzer.match(self.paste))

# Invalid length
self.paste.body = "1118-1470-8779-0264-4009-324"
self.assertFalse(self.analyzer.match(self.paste))

# Invalid Characters
self.paste.body = "1118-1194-1581-4556-8113-659A"
self.assertFalse(self.analyzer.match(self.paste))


if __name__ == '__main__':
unittest.main()
60 changes: 60 additions & 0 deletions pastepwn/analyzers/tests/md5hashanalyzer_test.py
@@ -0,0 +1,60 @@
# -*- coding: utf-8 -*-
import unittest
from unittest import mock

from pastepwn.analyzers.md5hashanalyzer import MD5HashAnalyzer


class TestMD5HashAnalyzer(unittest.TestCase):
def setUp(self):
self.analyzer = MD5HashAnalyzer(None)
self.paste = mock.Mock()

def test_match_positive(self):
"""Test if positives are recognized"""
# md5 hash of 128 character string: ndq=S)t<5dgQhD7rCyAZ<?k,b&Zh-t^@'d=kaf:tK$PH\8HSzt%q9pX&RsGuYAcnmy9Rh!'(9sWt.d&\hS,LSA4>#Gn@sYn``5Tt6X`h'Hn_Y-"F>DkGr'\/:4kLF:D"
self.paste.body = "5812c57a01b5efa30af09d4f9388e50d"
self.assertTrue(self.analyzer.match(self.paste))

# md5 hash of 64 character string: sa.tpMvv#J{q)tZfz,W[5Hq*Yz%kN(,8j)p>'g["d^mSLHkD)gZLVxk/,}#aVxv*
self.paste.body = "372f202bdf0f16dfa41c101fc6a41695"
self.assertTrue(self.analyzer.match(self.paste))

# md5 hash of 32 character string: zw8hspDAZ(\w]K/v~yZaa_m$6awgF4rj
self.paste.body = "2287c6975240f865a9945ec9bcc0eead"
self.assertTrue(self.analyzer.match(self.paste))

# md5 hash of 16 character string: cY4>szK'>(?48tz=
self.paste.body = "f2195cea00cc796676f77b9d19473f7a"
self.assertTrue(self.analyzer.match(self.paste))

self.paste.body = "my super cool hash is 2287c6975240f865a9945ec9bcc0eead and here's some more text"
self.assertTrue(self.analyzer.match(self.paste))

# Newline-separated valid hashes
self.paste.body = "2287c6975240f865a9945ec9bcc0eead\n372f202bdf0f16dfa41c101fc6a41695"
self.assertTrue(self.analyzer.match(self.paste))

def test_match_negative(self):
"""Test if negatives are not recognized"""
self.paste.body = ""
self.assertFalse(self.analyzer.match(self.paste))

self.paste.body = None
self.assertFalse(self.analyzer.match(self.paste))

# Invalid character 'g'
self.paste.body = "f2195cea00cc796676f77b9d19473f7g"
self.assertFalse(self.analyzer.match(self.paste))

# SHA Hash
self.paste.body = "f1d2d2f924e986ac86fdf7b36c94bcdf32beec15"
self.assertFalse(self.analyzer.match(self.paste))

# Invalid MD5 hash length
self.paste.body = "f2195cea00cc796676f77b9d19473f7"
self.assertFalse(self.analyzer.match(self.paste))


if __name__ == '__main__':
unittest.main()

0 comments on commit 4e52345

Please sign in to comment.