Padding_Oracle_Attack_by_laughfool (2).pdf

(laughfool님 문서)

http://linkc.tistory.com/164


이공격은 간단히 말하자면 cbc모드에서 intermediary value를 알아내는 공격이다. 

cbc모드의 암호화는 

첫번째 블록에서

(평문)---(어떤 암호알고리즘ex)3-des)--(1차 암호문-intermediary value)---(xor initialization vector)---(최종 암호문)

의 형태로 이루어져있다.(두번쨰 블록은 위에서 initialization vector대신 바로 이전 블록의 암호문과 xor한다)

암호문은 IV(initialization vector)-CyrptBlock1-CryptBlock2-...

이런식으로 결과가 나온다.

intermediary value를 알게되면 잘하면 평문에서 처음 사용한 알고리즘을 추측해 낼 수 있고 다양한 변형이 가능하다

공격하는 방법은 padding을 이용하는데

위의 문서에 잘 나와있다. 

padding이 실패하면 웹페이지에서는 500error를 주는데 이를 이용한다.

padding을 0x1~0x8까지 되어있다고 가정하면서 initial vector를 초기 00000000에서 뒤에서 부터 한바이트씩 브루트 포싱한다.

(brutefocing)IV+C1

같은 식으로 암호문 쿼리를 날려주면서 브루트 포싱한다


import http.client import base64 import binascii

def brute(cookie): con=http.client.HTTPConnection('wargame.kr:8080')

session='' head={'Cookie':'L0g1n='+cookie+';'+'ci_session=session} head['Upgrade-Insecure-Requests']=1 con.request('GET','/dun_worry_about_the_vase/index.php',headers=head) return b'error' in con.getresponse().read() def upack(_str): _list=[] for i in range(int(len(str)/2)): _list.append('0x'+str[i*2]+str[i*2+1]) return _list def pack(_l): arr=binascii.unhexlify(list(map(lambda x:hex(int(0x12))[2:],_l))) arr=base64.b64encode(c1) return arr c1=b'5mBvCT0sqhI=' c2=b'fE5wkGZreEs=' c1=upack(base64.b64decode(c1).hex()) c2=upack(base64.b64decode(c2).hex()) print(c1)#,c2) lv=[0,0,0,0,0,0,0,0] bf=list(x for i in range(0x100)) bf='\x01\x02\x03\x04\x05\x06\x07\x08\x09abcdefghijklmnopqrstuwvxyz' for i in range(7,0,-1): for j in bf: a=c1 lv[i]=j for l in range(8): a[i]^=lv[i] if(brute(pack(a)+pack(c2))): lv[i]=j print(lv) break print(lv) #lv='guest\x3\x3\x3' #admin=c1^lv^'adkmin\x3\x3\x3'+c2


'war game > wargame.kr' 카테고리의 다른 글

[wargame.kr]lonely_guys  (0) 2017.03.02
[wargame.kr]dmbs335  (0) 2017.02.25
[wargame.kr]simple board  (0) 2017.02.24
[wargame.kr]md5_password  (0) 2017.02.24
[wargame.kr]web_chatting - sql_injection  (0) 2017.02.20

+ Recent posts