2016 hack festival igrus

82
IGRUS 2016 Hacking Cont

Upload: jinookawk

Post on 07-Jan-2017

3.829 views

Category:

Education


0 download

TRANSCRIPT

Page 1: 2016 hack festival igrus

IGRUS

2016 Hacking Cont

Page 2: 2016 hack festival igrus

Contents01 출제위원 & 참여자

02 해킹문제 & 풀이

03 해킹대회 결과

Page 3: 2016 hack festival igrus

출제 위원 & 참여자1

Page 4: 2016 hack festival igrus

출제위원 & 참여자

출제위원임준수 (12) – 서버 제작 및 관리김정현 (14) – 1, 3, 4 번 출제연준모 (14) – 2, 6, 7 번 출제곽진우 (15) – 12, 13, 14, 15 번 출제조은희 (15) – 8, 9 번 출제최정무 (15) – 5, 10, 11 번 출제

참여자최민석 (14)송시원 (15)한상우 (15)엄민식 (15)정치훈 (15)박제현 (15)김선필 (16)송승호 (16)이종원 (16)안형빈 (16)김형태 (16)이문형 (16)

Page 5: 2016 hack festival igrus

해킹대회 문제 & 풀이2

Page 6: 2016 hack festival igrus

Prob 1Made by JeongHyeon Kim

2

Page 7: 2016 hack festival igrus

PROB 1 Exp.

간단한 소스코드를 읽을 수 있는가 . 기본적인 html 속성을 아는가 . (또는 직감 유무 )

Page 8: 2016 hack festival igrus

PROB 1 Solv.

Page 9: 2016 hack festival igrus

PROB 1 Solv.

Welcome 이라 쓰여있는 버튼을 누르면 welcome( ) 함수가 호출된다 .문제를 풀려면 단순히 hello( ) 함수를 호출하면 되므로 ,

소스코드에서 onclick 시 호출되는 함수를 hello 함수로 바꿔주고 버튼을 클릭하면 된다 .

Page 10: 2016 hack festival igrus

PROB 1 Solv.

Welcome 이라 쓰여있는 버튼을 누르면 welcome( ) 함수가 호출된다 .문제를 풀려면 단순히 hello( ) 함수를 호출하면 되므로 ,

소스코드에서 onclick 시 호출되는 함수를 hello 함수로 바꿔주고 버튼을 클릭하면 된다 .

Page 11: 2016 hack festival igrus

Prob 2Made by Junmo Yeon

2

Page 12: 2016 hack festival igrus

PROB 2 Exp.

쿠키 값을 조작할 수 있는가 , 간단한 php 코드를 읽을 수 있는가지수 표현법을 알고 있는가

Page 13: 2016 hack festival igrus

PROB 2 Solv.

Solve 함수를 호출하려면 쿠키의 값이 4 자리보다 작으면서 값이 9999 보다커야 한다 . 툴 또는 자바스크립트로 쿠키의 값을 바꾸어 주면 된다 .

조건을 만족시키기 위해서는 1e5 와 같은 지수 표기법을 사용해야 한다 .1e5 라는 표기는 1*10^5 와 같은 표기이다 .

Page 14: 2016 hack festival igrus

Prob 3Made by JeongHyeon Kim

2

Page 15: 2016 hack festival igrus

PROB 3 Exp.

Steganography, File Signature, 구글 이미지 검색 , QR 코드의 간단한 규칙을 아는가

Page 16: 2016 hack festival igrus

PROB 3 Solv.

문제풀이 적어

Page 17: 2016 hack festival igrus

PROB 3 Solv.

문제풀이 적어

Page 18: 2016 hack festival igrus

PROB 3 Solv.

문제풀이 적어

Page 19: 2016 hack festival igrus

PROB 3 Solv.

문제풀이 적어

참 쉽죠 ?

Page 20: 2016 hack festival igrus

Prob 4Made by JeongHyeon Kim

2

Page 21: 2016 hack festival igrus

PROB 4 Exp.

Get, Post, Cookie 방식으로 전송할 수 있는가 . ip 주소 , md5 hash 에 대한 지식이 있는가

Page 22: 2016 hack festival igrus

PROB 4 Solv.

5 개의 작은 문제들이 결합된 문제이다 .모든 문제에 .txt 링크가 존재하고 ,

링크를 따라 들어가면 해당 문제의 소스코드를 볼 수 있게 되어있다 .

Page 23: 2016 hack festival igrus

PROB 4 Solv.

문제풀이 적어

Page 24: 2016 hack festival igrus

PROB 4 Solv.

문제풀이 적어

Page 25: 2016 hack festival igrus

PROB 4 Solv.

문제풀이 적어

Page 26: 2016 hack festival igrus

PROB 4 Solv.

5 개의 작은 문제들이 결합된 문제이다 .모든 문제에 .txt 링크가 존재하고 ,

링크를 따라 들어가면 해당 문제의 소스코드를 볼 수 있게 되어있다 .

Page 27: 2016 hack festival igrus

PROB 4 Solv.

5 개의 작은 문제들이 결합된 문제이다 .모든 문제에 .txt 링크가 존재하고 ,

링크를 따라 들어가면 해당 문제의 소스코드를 볼 수 있게 되어있다 .

Page 28: 2016 hack festival igrus

PROB 4 Solv.

5 개의 작은 문제들이 결합된 문제이다 .모든 문제에 .txt 링크가 존재하고 ,

링크를 따라 들어가면 해당 문제의 소스코드를 볼 수 있게 되어있다 .

Page 29: 2016 hack festival igrus

Prob 5Made by Jeongmoo Choi

2

Page 30: 2016 hack festival igrus

PROB 5 Exp.

Java Script 난독화 툴을 이용한 난독화 시 나타나는 현상과 이를 원래의 코드로 되돌리는 방법에 대한 지식이 있는지 확인 .

Page 31: 2016 hack festival igrus

PROB 5 Solv.문제 페이지에서는 아무것도 출력하지 않다가 키보드 입력 시 입력한 값을 화면에 연속해서 출력한다 .

문제 화면의 html 소스를 보면 다음과 같이 읽기 힘들게 난독화가 되어 있다 .몇몇 키워드가 보이기는 하지만 무슨 의미인지 정확히 알기 힘들다 .

Page 32: 2016 hack festival igrus

PROB 5 Solv.

구글에서 JavaScript 언패킹 사이트를 찾아난독화되어 있는 부분을 넣고 언패킹 하면다음 스크린샷과 같이 본래의 JavaScript코드가 나온다 .살펴보면 키보드 입력을 통해 화면에 출력했던 문자열을 홀수 번째에 있는 문자만 비교하여 “ IG1253” 과 같으면 solve() 함수를 실행하도록 되어 있다 . 문제 화면으로 돌아가“I G 1 2 5 3” 을 입력하면

문제 해결 페이지로 넘어가 다음과 같은Alert 창을 볼 수 있다 .

Page 33: 2016 hack festival igrus

Prob 6Made by Junmo Yeon

2

Page 34: 2016 hack festival igrus

PROB 6 Exp.

WireShark 의 export object 기능을 사용할 수 있는가파일 시그니처에 대해 알고 있는가

( 힌트는 3 시간 전에 추가 )

Page 35: 2016 hack festival igrus

PROB 6 Solv.

링크를 누르면 Shark.pcapng 파일이 다운받아지고해당 파일은 WireShark 로 열 수 있다 .

파일을 열면 패킷들이 아주 많은데 그 중 파일을 다운받은 흔적을 찾아야 한다 .WireShark 의 Export object 기능을 사용해 파일들을 저장하면 십여 개의

파일들이 저장된다 . 그 중 Broken_By_Shark 라는 이름의 파일을 발견할 수 있다 .

Page 36: 2016 hack festival igrus

PROB 6 Solv.

Broken_By_Shark 파일은 그냥 열리지 않는데 Hex Editor 를 사용해서 파일을 열어보면 파일의 앞부분에 있는 PNG 키워드로 해당 파일의 확장자가 PNG 임을

유추할 수 있다 . 하지만 PNG 로 확장자를 고치고 실행해도 깨진 파일이라 뜨는데 , PNG 파일의 시그니처를 검색하면 89 50 4E 47 0D 0A 1A 0A 임을 알

수 있다 .따라서 해당 파일의 첫 번째 바이트를 89 로 고치고 저장 후 실행하면 된다 .

Page 37: 2016 hack festival igrus

Prob 7Made by Junmo Yeon

2

Page 38: 2016 hack festival igrus

PROB 7 Exp.

기본적인 php 코드를 읽을 수 있는가MD5 에 대한 기본적인 지식이 있는가

문제 풀이를 위해 간단한 코드를 작성할 수 있는가

Page 39: 2016 hack festival igrus

PROB 7 Solv.

소스가 주어지고 , 데이터를 입력하고 submit 버튼을 누르면 아랫줄에 결과가나타난다 . Flag 변수의 값이 AuthKey 임을 알려 준다 .

소스를 분석해 보면 ,입력받은 데이터 +flag+”0” 을 하나의 문자열로 만든 뒤16 자리씩 끊어 MD5 해시한 후 그 결과를 이어 붙인다 .

Page 40: 2016 hack festival igrus

PROB 7 Solv.

먼저 flag 의 길이를 알아내기 위해 data 의 길이를 조정해보며 입력해 보면6 자리의 데이터를 입력했을 때 결과값이 64 자리로 나오는 것을 알아낼 수 있

다 .이는 data+flag+”0” 의 값이 16 자리를 넘어갔기 때문이고 , 데이터가 5

자리일 때합은 16 자리가 되는 것이다 . 따라서 flag 의 길이는 10 자리임을 알 수 있다 .

또한 6 자리를 입력했을 때의 결과값을 복호화해 보면 0 임을 알 수 있다 .플래그를 모두 알아내기 위해서는 한 자리씩 늘려가면서 뒷부분을 복호화하면

된다 .

Page 41: 2016 hack festival igrus

PROB 7 Solv.

툴이나 웹사이트에서 복호화를 하는 방식으로 하나하나 flag 를 알아내다 보면문제가 발생하는데 , 5 번째 정도부터 원 문자열이 길기 때문에 레인보우

테이블을이용하여 복호화하는 방식으로는 flag 를 알아낼 수 없다 . 따라서 플래그가 될 만한 문자들을 MD5 해시한 값이 입력 결과와 같은지 비교하는 방식으로

답을 알아내는 것이 가능하다 . 위 코드에서 flag 와 hashed 값을 바꾸어 가며모든 플래그를 찾아낼 수 있다 .

Page 42: 2016 hack festival igrus

PROB 7 Solv.

마지막 글자까지 전부 알아내면 AuthKey 는!evil_evol 임을 알아낼 수 있다 .

Page 43: 2016 hack festival igrus

Prob 8Made by Eunhee Cho

2

Page 44: 2016 hack festival igrus

PROB 8 Exp.

Sql injection 에 대한 기초적인 개념을 아는가 .로그인폼에서도 공격을 할 수 있다는 것을 아는가 .

Main 화면

Page 45: 2016 hack festival igrus

PROB 8 Solv.

Post 방식으로 id 와 pw 를 받아오며 id 만 admin 인지 아닌지 확인한다 .pw 부분은 확인 없이 넘어가야 하기 때문에 주석처리가 반드시 필요하다 .

PHP 소스코드

Page 46: 2016 hack festival igrus

Prob 9Made by Eunhee Cho

2

Page 47: 2016 hack festival igrus

PROB 9 Exp.

Blind sql injection 에 대하여 알고 있는가 .필터링을 우회하여 직접 공격해볼 수 있는가 .

Page 48: 2016 hack festival igrus

PROB 9 Exp.

pw 가 db 에 있는 pw 와 일치하면 auth key 를 띄운다 .Or, and, substr, mid, ascii, =, 스페이스바 , 탭 등을 필터링한다 .

소스코드

DB

Page 49: 2016 hack festival igrus

PROB 9 Solv.

id 를 admin 으로 가져오기 위하여 guest 를 concat 함수를 이용하여 제외한다 . ascii, or, space 가 필터링이 되어 있기 때문에 이를 우회하는 방식을 사용했다 .

and, =, mid 까지 우회하여 pw 를 찾는 sql 삽입문을 작성한다 . 이를 이용해 brute force 를 하여 pw 를 찾아낸다 .

Page 50: 2016 hack festival igrus

Prob 10Made by Jeongmoo Choi

2

Page 51: 2016 hack festival igrus

PROB 10 Exp.

리버스 엔지니어링 기법을 통해 코드를 분석하고 이를 통해 실행 파일에서 원하는 값을 얻어내는 능력

Page 52: 2016 hack festival igrus

PROB 10 Solv.프로그램 실행 시 Key 를 입력받고그 Key 값을 어떤 값과 비교하여 일치하지 않으면 이와 같은 문구를 출력하는 듯 하다 .정확한 Key 값을 알아내기 위해 OllyDbg 를 이용해 해당 실행파일을열어 보았다 .

해당 코드의 처음부분이다 . 무언가 여러 번 연산을 하고EBP-C 에 위치한 변수에 저장하고 있는것을 볼 수 있다 .

Page 53: 2016 hack festival igrus

PROB 10 Solv.

코드의 다음 부분이다 . cin 함수를 통해 받아온 값을 EBP-18 의 장소에저장하고 그 뒤 EBP-18 에 있는 값과 EBP-C 에 저장되어 있는 값을 비교한 뒤 다를 경우 “ No…. Try Again!” 구문을 출력하는 포인트로 이동하는 것을 볼 수 있다 . 일치할 경우 왠지 EAX 에 우리가 입력한 값이 저장되어 있는 EBP-18 에 있는 값을 넣은 뒤 cout 함수를 두 번 실행하고 있다 . 아마도 일치 시 출력하는 문자열과 함께 입력 받은 값을 같이 출력하는 듯 하다 .

Page 54: 2016 hack festival igrus

PROB 10 Solv.

정확한 Key 값을 얻어내기 위해 마지막으로 EBP-C 에 값을 넣기 직전의 EAX 값을 확인해 본 결과 위와 같은 값이 나왔다 . 이를 10 진수로 고치면 264523 이라는값이 나온다 . 이를 파일을 실행하여 입력해 보면

다음 화면과 같이 Auth 값을 얻어낼 수 있다 .

Page 55: 2016 hack festival igrus

Prob 11Made by Jeongmoo Choi

2

Page 56: 2016 hack festival igrus

PROB 11 Exp.

리버스 엔지니어링 기법을 통해 코드를 분석하고 특정 부분의 코드를 변조해 원하는 결과를 얻어내는 능력

Page 57: 2016 hack festival igrus

PROB 11 Solv.프로그램을 실행시켜 보면 많이본 듯한 게임이 실행된다 . 뱀은방향키로 입력 받은 방향대로 계속해서 움직이고 먹이를 먹으면 길이가 한 칸씩 증가한다 . 어림잡아 보아도 먹이 한 개당 100 점이 증가하고 총 500 칸이 안 돼 보이므로50000 점은 정상적인 방법으론 불가능 할 것 같다 . 해당 파일을OllyDbg 로 실행해 보았다 .

이 파일에선 특정 부분을 계속해서 반복하고 있으며 반복될 때 마다뱀이 지워졌다 한 칸 전진한 상태로 다시 그려지는 것을 확인할 수있다 .

Page 58: 2016 hack festival igrus

PROB 11 Solv.그러므로 JMP 하는 구문을 찾아 BP(Break Point) 를 걸어 놓으면 한 번 실행할때마다 뱀이 한 칸씩 이동하게 된다 . 방향키를 조작하며 실행해 뱀이 먹이를 먹기 직전까지 이동한 후 코드를 분석해 보았다 .

다음과 같이 의심스러운 부분을 찾을 수있다 . 무언가 연산을행한 뒤 값을 EBP-8에 넣고 0C350 과 비교하는데 이는 10 진수로 50000 이다 .JLE 구문은 비교한 값이 작거나 같으면

점프하는 구문이며 조건이 만족할 시 002D1438 에 있는 함수를 실행하는 듯하다 . JLE 구문을 JE 로 바꾸면 점수가 50000 보다 작아도 Call 을 시행하므로JLE 를 JE 로 변조한 뒤 프로그램을 실행해 보았다 .

Page 59: 2016 hack festival igrus

PROB 11 Solv.

그러자 Score 값이 50000 이 넘지 않아도 Auth 값이 밑에 표시되는 것을 확인할 수 있다 .002D1438 에 있던 함수는 Auth 값을 밑에 출력해 주는 함수였던 듯하다 .

Page 60: 2016 hack festival igrus

Prob 12Made by Jinwoo Kawk

2

Page 61: 2016 hack festival igrus

PROB 12 Exp.

지역변수 buffer 와 환경변수 전부를 초기화 시킬 경우 어떻게 다른 사용자의 로그인 쉘에 접근할 수 있는지를 알아보기 위함

Page 62: 2016 hack festival igrus

PROB 12 Solv.버퍼의 크기가 256 이나 마지막 코드 memset 함수를 통해 버퍼를 초기화하고 있다 . 그리고 환경변수들도 초기화하고 있어 쉘코드를 버퍼와 환경변수에 넣어 공격할 수 없다 . 또 , 스택의 주소를 꼭 사용하도록 확인하고 있어 스택에 쉘코드를 넣어 공격해야 된다 .

따라서 쉘코드를 넣을 공간을 찾아야 하는데 이 때는 argv[2]를 이용하면 된다 .그러기 위해서 argv[2] 의 주소를 구해야 하는데 c 파일에 코드 추가해서 argv[2] 의 주소를 쉽게 구할 수 있다 .

Page 63: 2016 hack festival igrus

PROB 12 Solv.printf(“%p\n”, argv[2]);

와 같은 코드를 추가하고 컴파일한다 .

스택은 들어가는 데이터의 양에 따라 주소값이 계속해서 변하므로 공격할 때와 같이 컴파일한 파일로 공격한다 .

그렇게 해서 알아낸 주소값이 0xbffffbfe 이다 . 이것이 argv[2] 의 주소로 igrus2 권한이 있는 igrus2 파일로 공격한다 .

Page 64: 2016 hack festival igrus

PROB 12 Solv.

알아낸 주소값으로 공격하면 성공적으로 igrus2 로그인 쉘에 접근할 수 있게 된다 . my-pass 명령어를 통해 auth 키를 알아내면 ‘ 1n$tack_make%@rgv2--!’ 임을 알 수 있다 .

Page 65: 2016 hack festival igrus

Prob 13Made by Jinwoo Kawk

2

Page 66: 2016 hack festival igrus

PROB 13 Exp.

스택을 사용하지 못하게 막아 대신 gets 함수의 임시버퍼를 이용하여 다른 사용자의 로그인 쉘에 접근할 수 있는지를 보기 위함

(힌트는 끝나기 3 시간 전에 공개함 )

Page 67: 2016 hack festival igrus

PROB 13 Solv.소스코드를 보게 되면 gets 함수로 입력을 받고 있는데 buffer[23] 의 값이 ‘ \xbf’ 이라면 , 즉 스택의 주소를 이용하면 프로그램이 종료되어 공격할 수 없게 된다 . 그래서 RTL 기법이나 gets 임시버퍼를 이용해야 하는데 RTL 기법은 마지막 코드 memset 함수로 초기화시키고 있어 막고 있다 .

gets 임시버퍼의 주소를 구하기 위해 igrus3 권한을 가진 파일을 컴파일한다 .

Page 68: 2016 hack festival igrus

PROB 13 Solv.

strace 명령어는 프로그램 디버깅하는 명령어로 쉽게 말해서 시스템 콜 함수들이 어떻게 호출되고 있는지를 보여준다 .

파란색 사각형으로 둘러싸인 부분이 gets 함수가 호출된 부분이며 빨간색 사각형으로 둘러싸인 부분이 gets 임시버퍼의 주소를 의미한다 .따라서 쉘코드를 넣고 return address 값을 임시버퍼의 주소로 덮어씌우면 공격에 성공할 것이다 .

Page 69: 2016 hack festival igrus

PROB 13 Solv.

gets 함수를 이용해 입력받으므로 cat 연산자와 파이프 연산자를 이용하여 buffer overflow 를 일으키면 igrus4 의 로그인 쉘에 성공적으로 접근할 수 있게 된다 .

Page 70: 2016 hack festival igrus

Prob 14Made by Jinwoo Kawk

2

Page 71: 2016 hack festival igrus

PROB 14 Exp.

Return to Library 기법에 대해 알고 있는지 그것을 이용해 공격할 수 있는지를 알아보기 위함

Page 72: 2016 hack festival igrus

PROB 14 Solv.

스택의 주소를 사용하지 못하게 막고 라이브러리 주소를 이용하게끔 코드가 작성되어져 있다 . 이 때는 RTL 기법으로 Return to Library 기법이다 .

즉 , 라이브러리 함수를 사용하는 기법인데 여기서는 system 함수를 사용할 것이다 . 그러기 위해서는 system 함수의 주소와 system 함수 내부에 존재하는 ‘ /bin/sh’ 라는 문자열이 저장된 공간의 주소를 알아야 한다 .

Page 73: 2016 hack festival igrus

PROB 14 Solv.

디버거를 통해 system 함수의 주소를 구할 수 있으므로 디버깅할 수 있도록 컴파일하고 gdb 디버거를 이용해 system 함수와 exit 함수의 주소값을 구한다 .

구한 결과 system 함수의 주소는 0x40058ae0 이며 , exit 함수의 주소는 0x400391e0 임을 알 수 있다 .

Page 74: 2016 hack festival igrus

PROB 14 Solv.왼쪽과 같이 코드를 작성해 문자열 ‘ /bin/sh’ 의 주소값을 구하도록 한다 .

코드 작성 후 컴파일하여 실행하면 ‘ /bin/sh’ 의 주소는 0x400fbff9 임을 알 수 있다 .

이 때까지 구한 주소값들을 이용해 공격한다면 성공적으로 igrus6 의 로그인 쉘에 접근할 수 있을 것이다 .

Page 75: 2016 hack festival igrus

Prob 15Made by Jinwoo Kawk

2

Page 76: 2016 hack festival igrus

PROB 15 Exp.

주소제한을 통해 스택의 특징을 알고 있는지 , argv 개념을 알고 있는지를 알아보기 위함

Page 77: 2016 hack festival igrus

PROB 15 Solv.

Return address 부분이 argv[3] 과 argv[4] 를 이용해 덮고 있으며 스택을 이용하되 주소가 0xbfff0000 이면 공격할 수 없게 된다 .

역시 버퍼와 환경변수도 초기화 하고 있어 방법은 argv[2] 로 해결한다 .

Page 78: 2016 hack festival igrus

PROB 15 Solv.printf(“%p\n”, argv[2]);코드를 추가하고 컴파일 한다 .

스택은 들어간 데이터의 양에 따라 주소가 바뀌는 특징이 있는데 데이터를 스택에 넣으면 주소가 작아진다 .

따라서 nop 를 엄청나게 많이 넣게 되면 주소가 작아질 것이다 . 80000개 정도 넣은 결과 주소가 0xbffec359 로 0xbfff0000 보다 작아지게 되었다 .

그리고 return address 부분은 흰색 사각형을 참고로 \xfe, \xc3, \x59, \xbf 순으로 덮어씌우면 argv[2] 의 주소가 들어가게 된다 .

Page 79: 2016 hack festival igrus

PROB 15 Solv.

이렇게 알아낸 것들을 이용해 igrus8 권한을 가진 파일로 공격하게 되면 igrus8의 로그인 쉘에 접근할 수 있게 된다 .

Page 80: 2016 hack festival igrus

해킹대회 결과3

Page 81: 2016 hack festival igrus

해킹대회 결과

한상우 (15) 학우분이 1116 점으로 1 위 , 박제현 (15) 학우분이 1111 점으로 2 위 , 엄민식 (15) 학우분이 911 점으로 3 위로 결정되었습니다 .

Page 82: 2016 hack festival igrus

해킹대회 결과

1 번 : 10 명2 번 : 6 명3 번 : 5 명4 번 : 7 명5 번 : 4 명6 번 : 0 명7 번 : 3 명8 번 : 3 명9 번 : 3 명

10 번 : 3 명11 번 : 1 명12 번 : 5 명13 번 : 1 명14 번 : 2 명15 번 : 2 명