'코드게이트 문제풀이'에 해당되는 글 2건

  1. 2010.03.17 [ Codegate 2010 ] Chanllenge 1 풀이 (2)
  2. 2010.02.03 Code Gate 2009 본선 문제 stego_win 풀이

2010.03.17 18:51 WarGame


먼제 문제 설명은

beist likes drinking.
feel free to give a shot to him when you meet him.
this challenge doesn't need to give many hints to you guys.
just get to http://ctf7.codegate.org/31337/

YOU NEED TO GET A SHELL AND SEE A FILE THAT CONTAINS A FLAG OF THIS CHALLENGE. GOOD LUCK.

beist 님의 맥주 사랑을 여실히 느낄 수 있게 해 주는군요 :D




전형적인 웹 쪽 문제화면이로군요

메뉴 하나 하나 찔러보고 소스를 봤습니다만

그중에 의심가는건

Beer list 에 계산기 부분이었습니다

You need to pay 450000 KRW, thank you. You drank 150

대략 한병에 3천원씩 계산해서 보여주는데 이 숫자가 overflow 되는 현상이 

발생했기 때문인데요

cgi 파일이라 그쪽 취약점이 있나 싶어

인자를 다르게 집어 넣어봤는데 숫자만 허용합니다 -.-

한참 삽질해보다 다른 부분을 건드려보기로 했습니다

http://ctf7.codegate.org/31337/index.php?page=

page 인자를 공백으로 주니




Local and Remote File Inclusion , LFI 취약점이 있습니다

Wowhacker 의 Bobana 님이 번역 하신 문서를 보심이 좋겠군요

http://wowhacker.com/Translation/289072

일단 요청하는 페이지에 우리가 원하는 명령어를 실행시키도록 조작을 한 다음에

그 결과값을 서버의 로그 혹은 proc 폴더에서 확인하는 방법이 있습니다

로그 폴더를 찾는데 실패해서 고정 위치인 proc 폴더를 공략하기로 했습니다

proc 폴더는 각종 프로세스의 환경 변수 등을 담고 있는 폴더인데요

가장 쉽게 접근하는 방법은 최근 프로세스에 바로 접근토록 하는 

 /proc/self/environ 을 공략하는 것이죠

먼저 접근을 시도해보면..


퍼.미.션 이 없다는군요

그럼 우리가 실행하는 프로세스 ID , PID를 구해야 하는 작업이 추가되어버렸습니다

현재 실행중인 PID는 proc 폴더 내의 loadavg 를 참조하면 됩니다

그러니까

1. /proc/loadavg 에서 PID를 얻는다

2. /proc/{pid}/environ 의 내용을 얻어낸다

이를 소스로 구현하면




해당 pid 의 환경 변수 값을 얻지 못할 경우에 뜨는 메시지인 'Warning' 을 기준으로

성공/실패 여부를 판단합니다

자, PID를 구하고 그 프로세스에 해당하는 환경변수 값은 얻을 수 있게 되었습니다

그럼 이제 취약한 프로세스를 만들어 볼 차례로군요

pid 값을 지속적으로 출력시켜주도록 위 소스를 구현하여 실행하면

일반적인 요청은 pid 값을 증가시키지 못하는 것을 알 수 있습니다

한페이지씩 요청하면서 pid 값을 확인해보면

Server Side Script 중에서도 cgi 파일의 요청만 pid 값을 증가시키는 것을 볼 수 있고

이는 , ' cgi 요청은 프로세스를 생성한다 ' 라는 결론을 도출하게 합니다

그렇다면 이제 cgi 요청을 변조 하여 원하는 정보를 얻어 내는 일만 남았군요

LFI 문서를 보시면 알겠지만, 보내는 요청에 php 코드를 삽입하는 방식으로 이루어지게 됩니다

php에서 system 명령어가 실행하는 코드 <?php passthru('$cmd');?> 말이죠

이를 헤더에 추가시켜서 요청을 하고 이를 읽어내기만 하면

우리가 원하는 결과가 '쨘' 하고 나올 것이란건 의심할 바 없죠

자, 그럼 헤더를 추가해서 보내는 소스를 간단히 짜봅시다





자 그럼 답이 쨘?

.....

pid 값이 증가되서 프로세스가 생성되는 것을 확인한 것은 좋은데

환경변수 값이 뜨질 않습니다



네. 바로 프로세스가 생성되서 연산을 하고 응답을 하는건 좋은데

그 후엔 프로세스 정보가 삭제되고, 이 시간은 '매우' 짧다는 것입니다

몇번 실험을 해보니 잡아 내긴 합니다만 그게 언제가 될지 모르는 점이 큰 문제입니다

프로세스가 오래 남아있다면 캐치 하기 훨씬 쉽겠죠

계산을 하는 cgi 파일에서 프로세스가 오래 남도록 하고 싶다



숫자를 아주 크게 넣어줍시다

pid를 계속 읽어주면서 다른 창으로 헤더를 변조해서 보내면 됩니다

물론 이 헤더를 변조하는 작업은 proxy 툴이나 파폭을 이용하는 방법도 있겠습니다만..

아무튼

cgi 인자에 크으으으으게 넣어주고 인자를 변조해서 요청을 하고

 loadavg 에서 그 인자를 확인하게 됩니다




답이 뭔지는 다 보이시죠?

항상 좋은 문제 내주시는 beist lab 분들께 감사를!



P.S 소주 150병이면 당신도 엘리트!

'WarGame' 카테고리의 다른 글

[ Python Challenge ] level6 풀이  (0) 2010.03.25
[ CodeGate 2010 ] Challenge 11 풀이  (0) 2010.03.19
[ Codegate 2010 ] Chanllenge 1 풀이  (2) 2010.03.17
[ Padocon 2010 ] Warmup 100  (0) 2010.03.16
[Python Challenge] level5 풀이  (2) 2010.03.11
[Python Challenge] level4 풀이  (0) 2010.03.10
Posted by LinkC

2010.02.03 00:57 WarGame

먼저 문제는 http://mins4416.tistory.com/

beist lab 오시리스님의 블로그에 올라와있습니다

문제를 보면

out.bmp 와 stego_win.exe 가 있군요

일단 stego_win.exe를 실행시키면

파일 이름을 입력하라고 나옵니다

파일 이름을 올바르게 입력하면 hidden string을 입력하라고 나오는데

다음과 같이 아무렇게나 입력해보면



out.bmp에 결과가 저장되었다고 합니다

out.bmp를 열어보면 아무 변화도 없는것 같지만

hex editor로 두 파일을 열어보면

결과 파일과 처음 지정한 파일이 특정 부분이 1비트씩 달라져있음을 볼 수 있습니다




처음에 보면 굉장히 무질서 하게 달라진것 같은데

분명 어떤 규칙을 가지고 이렇게 바뀌었을 것입죠

그럼 이제 코드를 살펴봅시다

hidden string을 받고 나서

잡다한 준비 과정을 거치고 나면

파일에 기록하는 부분이 나오는군요



위압적인 길이로군요

일단 Hey ray로 뽑아봅시다



소스코드 만만치 않군요 -,.-

소스코드 뒤로 가면 & 연산  | 연산 >> 연산 등이 나오는걸 볼 수 있습니다

bit 연산이 이뤄지는거 같군요 

디버거로 차근차근 진행하면서 소스코드와 비교해봅시다

먼저 처음에 코드를 따라가며 실행한 부분만 보겠습니다



입력한 string의 첫번째 bit 값을 가지고 3번 돕니다

그다음 실행되는

SHR 명령어에 의해서 EDI 값이 오른쪽으로 shift 되고

즉 10000000 에서 01000000 이 되죠

여기서 다시 and 값으로 확인 후 반복문 실행

한 bit 또 shift 하고 and

이런식으로 하다가 and 값이 1이 되는 경우가 있다면

파일에 1씩 더해서 기록합니다



예를 들어 봅시다

hidden string으로 아스키 코드 값이 31인 숫자 '1'을 넣었다고 하면

2진수로 00110001 가 됩니다

가장 안쪽의 반복문은 한 bit당 무조건 3번씩 실행되니까

한 문자당 총 24 ( 8*3 ) 번 반복문을 돌겠군요

0일 경우는 그대로, 1일 경우는 1을 더해서 파일에 기록합니다

그렇다면 파일에는

0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0
0 0 0 0 0 1 1 1

이런식으로 기록됩니다

이를 쉽게 알아보는 방법으론

헤더를 제외하고 모조리 0으로 채운 bmp 파일을 대상 파일로 지정해주면 되겠죠

한번 맞는지 확인해봅시다




header가 맨 처음에 포함되는걸 감안하면 결과가 생각한대로 나온거 같군요

다만 여기서 주의할 점은 코드값이 0 일때와 짝수, 홀수 일때 각각 다르게 적용된다는 것입니다

먼저 BMP 파일 내용은 모조리 짝수 인걸 눈여겨 봅시다

헤더를 제외한 BMP 파일의 내용중 홀수는 문자열에 의해서 바뀌었다는 것을 보실수 있습니다

0이면 +1을 더해주고 비트가 1이면서 짝수면 하나 빼줍니다

비트가 0이면서 홀수 인경우는 하나 빼줘야 하구요

이를  소스로 짜보면



정도로 생각해볼수 있겠습니다

아직 python 에 익숙하지 않아서 좀 삽질좀 했습니다만.. 아무튼

일단 이 소스는 입력한 문자열 뒤에 BMP 내용은 손대지 않았으니

전에 입력했던 내용이 고스란히 남습니다

하지만 정답을 추출해내는데는 별 상관 없으니 이쯤 하고

거꾸로 파일에서 문자열을 추출해보도록 합시다

24바이트가 한 문자임을 고려하면 추출하는건 훨씬 간단합니다





이렇게 코드를 짜고 돌려보면 쨘~

어때요  참, 쉽죠?






너무 삽질을 많이해서 저런말은 못하겠네요 -,.-

아무튼 좋은 문제 내주신 beist lab 여러분 감사합니다 :D

'WarGame' 카테고리의 다른 글

Vortex level2 풀이  (0) 2010.02.16
Vortex level1 풀이  (0) 2010.02.10
Vortex level0 풀이  (0) 2010.02.04
Code Gate 2009 본선 문제 stego_win 풀이  (0) 2010.02.03
Crackme#15  (0) 2010.01.08
CrackMe#14  (0) 2010.01.06
Posted by LinkC
이전버튼 1 이전버튼

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday48
Today12
Total328,654

달력

 « |  » 2019.5
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

최근에 받은 트랙백

글 보관함


. .