您当前的位置:首页 > 电脑百科 > 安全防护 > 黑客技术

黑客教程——Padding Oracle Attack&CBC字节翻转攻击详解

时间:2020-06-10 17:56:34  来源:  作者:

先来讲一讲CBC模式加密原理:

加密过程:

黑客教程——Padding Oracle Attack&CBC字节翻转攻击详解

 

1.首先将明文(Plaintext)分组(常见的以16或8字节为一组),位数不足的使用特殊字符填充。

2.生成一个随机的初始化向量(IV)和一个密钥。

3.将IV和第一组明文异或(xor运算)。

4.用密钥对3中xor后产生的密文加密。

5.用4中产生的密文对第二组明文进行xor操作。

6.用密钥对5中产生的密文加密。

7.重复4-7,到最后一组明文。

8.将IV和加密后的密文拼接在一起,得到最终的密文

解密过程:

黑客教程——Padding Oracle Attack&CBC字节翻转攻击详解

 

1.先从密文中取出IV,然后对剩下的密文分组(16或8字节为一组)

2.使用秘钥解密第一组密文,将解密结果与IV做异或运算,得到明文1

3.然后使用秘钥解第二组密文,将解密的结果与上一组密文进行异或运算,得出明文2

4.重复2-3,直至所有密文解密完毕

以上就是CBC模式的加密解密过程,接下来讲两种手段:

Padding Oracle Attack

直译为 "填充Oracle攻击" ,这里主要关注一下解密过程:

黑客教程——Padding Oracle Attack&CBC字节翻转攻击详解

 

密文cipher首先进行一系列处理,如图中的Block Cipher Decryption

我们将处理后的值称为 middle 中间值

然后 middle 与我们输入的iv进行异或操作

得到的即为明文

但这里有一个规则叫做Padding填充:

因为加密是按照16位一组分组进行的

而如果不足16位,就需要进行填充

黑客教程——Padding Oracle Attack&CBC字节翻转攻击详解

 

有几个空,就要填充几个"几"

比如明文为admin,那么需要填充的就是

admin\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b (11个\x0b)

如果我们输入一个错误的IV(初始向量),依旧是可以解密的,但是 middle 和我们输入的IV经过异或后得到的填充值可能出现错误

比如本来应该是 admin\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b

而我们错误的得到 admin\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x3b\x2c

这样解密程序往往会抛出异常(Padding Error)

当这个CBC解密模式应用在web程序里的时候,往往是302或是500报错

而正常解密的时候是200。

所以这时,我们可以根据服务器的反应来判断我们输入的IV

一个例子

我们假设middle中间值为:

0x39 0x73 0x23 0x22 0x07 0x6a 0x26 0x3d

正确的解密IV应该为

0x6d 0x36 0x70 0x76 0x03 0x6e 0x22 0x39

解密后正确的明文为:

T E S T 0x04 0x04 0x04 0x04

但是关键点在于,我们可以知道iv的值,却不能得到中间值和解密后明文的值

而我们的目标是只根据我们输入的iv值和服务器的状态去判断出解密后明文的值

这里的攻击即叫做 Padding Oracle Attack 攻击

是一种根据页面回显来爆破密文的攻击

如果我们构造一个IV为:

0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

那么 middle 的值和这个iv异或将会得到原封不动的 middle 的值

0x39 0x73 0x23 0x22 0x07 0x6a 0x26 0x3d

现在这个解密结果是不对的,web程序抛出错误。

黑客教程——Padding Oracle Attack&CBC字节翻转攻击详解

 

正确的 padding 值只可能是:

1个字节的padding为0x01

2个字节的padding为0x02,0x02

3个字节的padding为0x03,0x03,0x03

4个字节的padding为0x04,0x04,0x04,0x04

……

因此我们希望慢慢调整IV的值,并且希望解密后最后一个值为正确的 padding 比如一个0x01,我们于是遍历最后一位IV:

黑客教程——Padding Oracle Attack&CBC字节翻转攻击详解

 

那么最后一位中间密文就是: 0x01^0x3C=0x3D (这个一定成立,看图),原来的明文就是 0x3D^0x0F=0x32(中间密文^原来的iv)

知道了最后一位的中间密文,就可以遍历倒数第二位iv了,这个时候应该为 0x02 而非 0x01 了。看图就懂:

黑客教程——Padding Oracle Attack&CBC字节翻转攻击详解

 

以此类推,我们可以就能推算所有中间密文,再用 中间密文^原来的iv 就能算出明文了

CBC字节翻转攻击

有了上面的CBC加密解密过程的基础,这个手段其实很容易理解;

黑客教程——Padding Oracle Attack&CBC字节翻转攻击详解

 

由解密算法可知:

A=B^C

由 ^ 运算的性质我们可以知道:

A=B^C、B=A^C、C=A^B

这是最关键的一点,我们可以推导出三者做异或运算的结果是0

C=A^B

C^C=A^B^C=0

也就是说,我们修改了B的值,就一定会影响到A

B^X^C=A^X

换句话说,我们只要给B异或了X,A的值也会改变为他之前的值异或X的结果

一 道CTF的例子

NPUCTF2020_web

源码:

<?php

error_reporting(0);

include('config.php'); # $key,********$file1*********

define("METHOD", "aes-128-cbc"); //定义加密方式

define("SECRET_KEY", $key); //定义密钥

define("IV","6666666666666666"); //定义初始向量 16个6

define("BR",'<br>');

if(!isset($_GET['source']))header('location:./index.php?source=1');

#var_dump($GLOBALS); //听说你想看这个?

function aes_encrypt($iv,$data)

{

echo "--------encrypt---------".BR;

echo 'IV:'.$iv.BR;

return base64_encode(openssl_encrypt($data, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $iv)).BR;

}

function aes_decrypt($iv,$data)

{

return openssl_decrypt(base64_decode($data),METHOD,SECRET_KEY,OPENSSL_RAW_DATA,$iv) or die('False'); #不返回密文,解密成功返回1,解密失败返回False

}

if($_GET['method']=='encrypt')

{

$iv = IV;

$data = $file1;

echo aes_encrypt($iv,$data);

} else if($_GET['method']=="decrypt")

{

$iv = @$_POST['iv'];

$data = @$_POST['data'];

echo aes_decrypt($iv,$data);

}

echo "我摊牌了,就是懒得写前端".BR;

if($_GET['source']==1)highlight_file(__FILE__);

?>

exp:

# coding:utf-8

import requests

import base64

# b'\x97.\xda\xb8\xa5Pt\x95\xae\x9b\xf5\xbf\xe2\x8b.<'

CYPHERTEXT = base64.b64decode("ly7auKVQCZWum/W/4osuPA==")

# initialization vector

IV = "6666666666666666"

# PKCS7 16个字节为1组

N = 16

# intermediaryValue ^ IV = plainText

inermediaryValue = ""

plainText = ""

# 爆破时不断需要更改的iv

iv = ""

URL = "http://webdog.popscat.top/index.php?method=decrypt&source=1"

def xor(a, b):

"""

用于输出两个字符串对位异或的结果

"""

return "".join([chr(ord(a[i]) ^ ord(b[i])) for i in range(len(a))])

for step in range(1, N + 1):

padding = chr(step) * (step - 1)

print(step,end=",")

for i in range(0, 256):

print(i)

"""

iv由三部分组成:

待爆破位置 chr(0)*(N-step)

正在爆破位置 chr(i)

使 iv[N-step+1:] ^ inermediaryValue = padding 的 xor(padding,inermediaryValue)

"""

iv = chr(0)*(N-step)+chr(i)+xor(padding,inermediaryValue)

data = {

"data": "ly7auKVQCZWum/W/4osuPA==",

"iv": iv

}

r = requests.post(URL,data = data)

if r.text !="False":

inermediaryValue = xor(chr(i),chr(step)) + inermediaryValue

print(inermediaryValue)

break

plainText = xor(inermediaryValue,IV)

print(plainText)

得到 FlagIsHere.php,访问之:

F7LMTk/3nKSVUoSQuOS/dA==

<?php

#error_reporting(0);

include('config.php'); //**************$file2********last step!!

define("METHOD", "aes-128-cbc");

define("SECRET_KEY", "6666666");

session_start();

function get_iv(){ //生成随机初始向量IV

$random_iv='';

for($i=0;$i<16;$i++){

$random_iv.=chr(rand(1,255));

}

return $random_iv;

}

$lalala = 'piapiapiapia';

 

if(!isset($_SESSION['Identity'])){

$_SESSION['iv'] = get_iv();

$_SESSION['Identity'] = base64_encode(openssl_encrypt($lalala, METHOD, SECRET_KEY, OPENSSL_RAW_DATA, $_SESSION['iv']));

}

echo base64_encode($_SESSION['iv'])."<br>";

if(isset($_POST['iv'])){

$tmp_id = openssl_decrypt(base64_decode($_SESSION['Identity']), METHOD, SECRET_KEY, OPENSSL_RAW_DATA, base64_decode($_POST['iv']));

echo $tmp_id."<br>";

if($tmp_id ==='weber')die($file2);

}

highlight_file(__FILE__);

?>

整理一下已知信息:

iv=

F7LMTk/3nKSVUoSQuOS/dA==

\x17 \xb2 \xcc \x4e \x4f \xf7 \x9c \xa4 \x95 \x52 \x84 \x90 \xb8 \xe4 \xbf \x74

加密后:

$Identity='MLvuYeH07rhiAa5NJ1p75A=='

$Identity='\x30 \xbb \xee \x61 \xe1 \xf4 \xee \xb8 \x62 \x01 \xae \x4d \x27 \x5a \x7b \xe4 '

目的就是传入新的iv对identity进行解密,如果解密结果为'weber'那么就爽歪歪,这里考察的就是CBC字节翻转攻击

和Padding Oracle Attack不一样,这里不需要推测中间密文,根据我上面说的

B^X^C=A^X

本来是 piapiapiapia\x04\x04\x04\x04 现在我们需要改为 weber\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B\x0B ,就拿第一位来说:

我们想要把 p 改为 w ,那么我就要找出 X 的值, 'p'^X='w' 很容易算出 X='p'^'w' 那么我们只需要在将B异或一个 ('p'^'w') ,就可以达到目的。

exp:

import base64

def bxor(b1, b2): # use xor for bytes

parts = []

for b1, b2 in zip(b1, b2):

parts.Append(bytes([b1 ^ b2]))

return b''.join(parts)

iv = base64.b64decode("h34HL5RbMPw8oTaQ+P58nw==")

text = b"piapiapiapia\x04\x04\x04\x04"

result = b"weber\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"

middle = bxor(iv,text)

iv = bxor(middle,result)

print(base64.b64encode(iv))

跑出来POST一个iv过去得到一个网址: https://c-t.work/s/034d3b3bf3fb48||verification code:2q2hwm

有个附件,下载来是一个xxx.class文件考的JAVA反编译,用工具 jd-gui-1.4.0 一下就跑出来。

得到数组,就是flag的ASCII码

q = [102, 108, 97, 103, 123, 119, 101, 54, 95, 52, 111, 103,

95, 49, 115, 95, 101, 52, 115, 121, 103, 48, 105, 110, 103, 125]

for i in q:

print(chr(i), end='')

flag{we6_4og_1s_e4syg0ing}

以上就是一次对于Padding Oracle Attack和CBC字节翻转攻击的一次初步学习,欢迎各位指正。

文章来自我们内部小组成员:低语



Tags:黑客教程   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
先来讲一讲CBC模式加密原理:加密过程: 1.首先将明文(Plaintext)分组(常见的以16或8字节为一组),位数不足的使用特殊字符填充。2.生成一个随机的初始化向量(IV)和一个密钥。3.将IV...【详细内容】
2020-06-10  Tags: 黑客教程  点击:(424)  评论:(0)  加入收藏
首先,我们简单的看一下什么是Whois。 针对更多知识,请大家移步百度百科中的关键词-Whois而今天我们介绍的,是Whois反查的对比。通过对比,我发现某在线工具比很多别的工具好用的...【详细内容】
2019-10-28  Tags: 黑客教程  点击:(672)  评论:(0)  加入收藏
说起端口扫描,不少人不免想起诸多工具。确实,近几年端口扫描越来越大众、便利化。哪怕是当年的一些小工具,虽然现在已经不是很好用,但是依旧很多人(小白)下载到欣喜。比如当年知名...【详细内容】
2019-10-28  Tags: 黑客教程  点击:(190)  评论:(0)  加入收藏
▌简易百科推荐
一、背景介绍作为一名渗透测试工作人员(或者小白),在我们的日常工作或者学习中,我们不可能时时刻刻将自己的个人电脑(安装好Kali Linux的个人主机)带在身边,当我们没有带自己的个人...【详细内容】
2021-12-27  Kali与编程    Tags:Kali Linux   点击:(3)  评论:(0)  加入收藏
我们都知道公司网络中开放的端口越多,遭受网络攻击的可能性就越大,就越容易发生数据泄露事件。 在这篇文章中,我们将讨论与开放端口相关的网络安全隐患。 网络中的端口 据统计...【详细内容】
2021-12-10  诺必达云服务    Tags:端口扫描   点击:(33)  评论:(0)  加入收藏
一、背景介绍DirBuster是用来探测web服务器上的目录和隐藏文件的。因为DirBuster是采用java编写的,所以运行前要安装上java的环境。 来看一下基本的使用: ①:TargetURL下输入要...【详细内容】
2021-12-07  Kali与编程    Tags:Dirbuster   点击:(28)  评论:(0)  加入收藏
#本文仅用于网络安全研究学习任何未经授权的入侵都是违法行为dir 浏览 创建文件 echo 文件内容 > 文件名字.扩展名 浏览文件内容 type 文件名 分页浏...【详细内容】
2021-12-07  WHOAMI    Tags:黑客   点击:(22)  评论:(0)  加入收藏
上一节中我们学了如何实现ARP断网攻击,本节中我们将利用ARP欺骗的原理实现截取目标计算机图片流量,内容包括:&uuml;如何开启ip转发&uuml;怎样截取受害机图片流量 一、开启ip转...【详细内容】
2021-11-23  Kali与编程    Tags:黑客   点击:(23)  评论:(0)  加入收藏
一、背景介绍大家在Linux的日常使用中都晓得如何通过命令行去配置Linux的端口开放规则,但是大家知道如何配置Windows入站出站规则吗?有哪些常见的危险端口呢?如何解决上述问题...【详细内容】
2021-11-15  Kali与编程    Tags:端口   点击:(39)  评论:(0)  加入收藏
1.背景介绍几乎每一个玩渗透的人都会接触到metasploit framework,简称msf。这是一个渗透测试框架,用ruby语言编写的,该框架集成了很多可用的exploit,比如著名的ms08_067等。你可...【详细内容】
2021-11-15  Kali与编程    Tags:服务扫描   点击:(37)  评论:(0)  加入收藏
在前面的课程中,我们学习了ARP攻击的理论和实践知识,知道了怎么进行攻击,这节中我们将学习如何进行防御,内容包括:&uuml;借助第三方软件防御(360安全卫士,腾讯管家等)&uuml;使用arp...【详细内容】
2021-11-13  Kali与编程    Tags:白帽   点击:(32)  评论:(0)  加入收藏
简介在sqlmap基础上增加了目录扫描、hash爆破等功能运行环境 linux 在云服务器上还是蛮不错的项目连接如下https://github.com/s0md3v/sqlmat usage: sqlmate [-h] [--dor...【详细内容】
2021-11-10  暗网视界    Tags:sqlmate   点击:(44)  评论:(0)  加入收藏
一、背景介绍在网上冲浪少不了用到搜索引擎,而很多朋友都习惯把Google视为第一个选择对象。当然Google无论在搜索速度还是结果关联性方面都是十分优秀的。但百度(http://www.b...【详细内容】
2021-11-05  Kali与编程    Tags:白帽黑客   点击:(31)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条