CTF | wargame

bkp 2017 / prudentialv2 (sha1 해쉬 충돌 취약점)

nopdata 2017. 3. 9. 11:15
date : `17.02

Prudentialv2

50

We fixed our challenge from two years ago.

http://54.202.82.13/

조뚱띠가 푼 문제. 문제를 풀 때, 지문은 보지 않고 바로 문제로 가서 2년 전 문제는 보지 않고 바로 소스코드를 보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
require 'flag.php';
 
if (isset($_GET['name']) and isset($_GET['password'])) {
    $name = (string)$_GET['name'];
    $password = (string)$_GET['password'];
 
    if ($name == $password) {
        print 'Your password can not be your name.';
    } else if (sha1($name=== sha1($password)) {
      die('Flag: '.$flag);
    } else {
        print '<p class="alert">Invalid password.</p>';
    }
}
?>
cs

간단하다. get파라미터로 받는 name, password의 string형변환 값이 같지 않으면서 그 데이터의 sha1값은 같아야 하는 문제.
몇일 전 google에서 발표한 sha1 취약 발표가 있었기 때문에 sha1 충돌 문제라고 생각 하였으나, google에서 예시를 든 데이터는 pdf 파일이었기 때문에 get 파라미터로 보내기에는 너무 크다는 생각을 하였지만, 연구 내용을 잘 보면 sha1의 취약점 상 시작 header부분 조작을 통해 데이터는 다르지만 sha1의 값은 같도록 할 수 있다는 결과가 있었다.


SHA-1의 충돌쌍을 찾기위한 여정
2013년, Marc Stevenes 는 SHA-1의 충돌쌍을 찾는 이론적인(theoretical) 접근을 시도하여 이를 논문으로 발표하였습니다. 이에 착안하여, 먼저 특별히 설계된 PDF 헤더(prefix)를 제작하였습니다. 이 헤더를 통해 두 파일의 내용이 확연히 구분될 수 있도록 ...

기본 이론은 Marc Stevenes의 이론을 기반으로 한다고 하며 시작되는 pdf의 prefix가 동일하다는 전제가 있다고 한다.

예시로 shatter-1.pdf와 shatter-2.pdf를 주는데 두 pdf의 hex값을 비교해 보면 다음과 같다.


0x00C0 ~ 0x013F 영역을 제외한 모든 데이터는 동일하다. 두 pdf의 경우 배경 색상만 다르고 다른 내용은 똑같다. 결론적으로 위에서 차이나는 부분이 google에서 찾아낸 충돌 header의 경계이다.
python으로 해쉬값 비교를 해보면 같은 값을 얻을 수 있는 것을 알 수 있다.


두 sha1 해쉬값이 같기 때문에 문제의 조건을 통과할 수 있다.
대회 서버는 대회가 끝나고 바로 닫혔기 때문에 로컬에서 직접 만든 서버에 대해서 테스트를 해 보았다.


flag : FLAG{AfterThursdayWeHadToReduceThePointValue}