공유메모리를 사용해 대화를 도청하라는 힌트가 주어졌다. key_t의 값은 7530이라고 한다. 7530을 이용해 둘의 공유 메모리를 같이 공유하라는 의미 같다.


공유메모리에 대해 먼저 알아봤다.


공유 메모리

공유메모리는 여러 프로그램이 동시에 접근할 수 있는 메모리라고 한다.

프로세스는 자신만의 메모리 영역을 가지고 있기 때문에 다른 프로세스에서 메모리 영역을 침범하려고 하면 커널은 침범 프로세스에 SIGSEGV 경고 시그널을 보낸다고 한다.

하지만 메모리 영역에 있는 데이터를 다른 프로세스에서 사용할 수 있어야 할 때가 있을 때를 위해 메모리 영역을 공유할 수 있다.

이 공유메모리를 이용해 프로세스끼리 통신도 할 수 있으며 같은 데이터를 공유할 수 있다.  

다시말해 공유메모리를 사용하는 방법은 공유메모리를 생성한 후 이 메모리가 필요한 프로세스는 필요할 때 자신의 프로세스에 첨부를 한 후 다른 메모리를 사용하듯 사용하면 된다.


아래는 공유메모리 함수들에 대한 설명이다.


shmget

공유메모리 생성

 헤더

 #include <sys/ipc.h>

 #include <sys/shm.h>

 형태

 int shmget(key_t key, int size, int shmflg);

 인수

 key_t key : 공유 메모리를 구별하는 식별 번호 

 int size : 공유 메모리 크기

 int shmflg : 동작 옵션

                1. IPC_CREATE : key에 해당하는 공유 메모리가 없다면 새로 생성한다.                      만약 있다면 무시하며 생성을 위해 접근 권한을 지정해 주어야 한다.

                2.IPC_EXCL : 공유 메모리가 이미 있다면 실패로 반환하며 공유 메모리에                   접근하지 못한다.

 반환

 -1 : 실패

 -1 이외 : 공유 메모리 생성 성공, 공유 메모리 식별자



shmat

공유메모리 연결

 헤더 

 #include <sys/ipc.h>

 #include <sys/shm.h>

 형태

 void *shmat(int shmid, const void *shmaddr, int shmflg)

 인수

 int shmid : 공유메모리를 구별하는 식별 번호

 void *shmaddr : 첨부되는 어드레스 주소, 일반적으로 NULL 지정

 int shmflg : 동작 옵션

                 1. SHM_RDONLY : 공유 메모리를 읽기 전용으로

                 2. SHM_RND : shmaddr이 NULL이 아닌 경우일 때 사용되며, shmaddr                    을 반올림하여 메모리 페이지 경계에 맞춘다. 

 반환

 (void *)-1 이외 : 프로세스에 첨부된 프로세스에서의 공유 메모리 주소(성공 시 해당  공유 메모리의 첫 번째 바이트에 대한 포인터를 반환)

 (void *) -1 : 실패



shmdt

공유 메모리 분리


 헤더

 #include <sys/type.h>

 #include <sys.shm.h>

 형태

 int shmdt(const void *shmaddr);

 인수

 void * shmaddr : 분리할 공유 메모리 주소

 반환

-1 : 실패

0 : 공유 메모리 분리 성공 



이제 위 설명 대로 공유 메모리를 생성해 답을 훔쳐보는 코드를 작성한다.


해당 코드를 컴파일 하여 실행하면 답이 나온다.













'Wargame > FTZ' 카테고리의 다른 글

[FTZ] level12@ftz  (0) 2017.11.10
[FTZ] level11@ftz  (0) 2017.11.10
[FTZ] level9@ftz  (0) 2017.11.09
[FTZ] level8@ftz  (0) 2017.11.09
[FTZ] level7@ftz  (0) 2017.11.09

버퍼오버플로우 문제다. 일단 스택의 구조는 먼저 선언된 변수가 스택의 아래, 다시말해 스택의 높은 주소에 위치하게 된다.


buf[10]

buf2[10]


구조는 이렇다.

소스를 보면 buf2의 2바이트가 go면 setreuid를 level10으로 설정하고 bash 쉘을 실행한다.

일단 소스대로 10바이트까지 무작위로 buf에 넣고 나머지 2바이트를 go로 하고 푸니 안됐다.


아마 더미값이 있는 것 같다.


더미값이 얼마나 있는지 추측이 어려워 go라는 문자열을 20바이트를 보냈고 쉘을 얻었다.



'Wargame > FTZ' 카테고리의 다른 글

[FTZ] level11@ftz  (0) 2017.11.10
[FTZ] level10@ftz  (0) 2017.11.10
[FTZ] level8@ftz  (0) 2017.11.09
[FTZ] level7@ftz  (0) 2017.11.09
[FTZ] level6@ftz  (0) 2017.11.09

용량이 2700인 shadow 파일이 숨겨져 있다고 한다.

간단하게 find 명령어를 이용해 찾으면 된다.


이전 문제와는 다르게 용량을 찾는 옵션을 추가해줘야한다. 

해당 옵션은 -size 이며 추가적으로 원하는 용량을 인자로 줘야한다. 찾는 용량은 2700이므로 2700을 준다.

find / -size 2700c 2> /dev/null

2700옆의 c는 찾고자 하는 용량의 단위가 byte라는 표시다. 만약 아무것도 안붙이면 b를 붙인것과 동일한 한블록인 512kb단위로 찾는다.

/etc/rc.d/found.txt라는 파일이 의심스럽다. 


cat으로 확인해보니 shadow 파일이 맞다.


브루트포싱을 돌려 비밀번호를 찾아내기 위해 일단 found.txt파일을 내 로컬 pc로 옮긴다.

명령은 scp를 사용해 옮겼다. scp 명령은 로컬파일을 원격지로, 원격파일을 로컬로 안전하게 복사해가는 명령이다.

사용 예

scp -P 22 <username@원격서버주소:파일주소/파일명> <로컬저장위치>
위 명령은 원격파일을 로컬로 복사하는 방법이다. P옵션은 ssh 포트가 22를 사용하면 생략해도 무관하다.


그리고 존더리퍼를 사용해 크랙을 했다. password가 잘 나온다.



'Wargame > FTZ' 카테고리의 다른 글

[FTZ] level10@ftz  (0) 2017.11.10
[FTZ] level9@ftz  (0) 2017.11.09
[FTZ] level7@ftz  (0) 2017.11.09
[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09

문제 hint는 /bin/level7을 실행하면 패스워드 입력을 요청한다고 한다.

패스워드 힌트가 가까이 있다고 한다.


또 다른 hint로 --_- 같은 부호가 있다.

일반적으로 이런 기호는 1과 0을 나타내는데 많이 사용하니까 1, 0으로 비교해봤다.


처음에는 전체 값을 2진수에서 10진수로 변환해서 정수를 입력했는데 답이 틀렸다고 한다.

그래서 8비트씩 끊어서 10진수로 변환하니 아스키 코드 같은 느낌이 오는 숫자가 나왔다.


python으로 변환해서 보니 mate라는 문자열이 나온다.


mate를 입력하니 문제가 풀렸다.





'Wargame > FTZ' 카테고리의 다른 글

[FTZ] level9@ftz  (0) 2017.11.09
[FTZ] level8@ftz  (0) 2017.11.09
[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09
[FTZ] level4@ftz  (0) 2017.11.09

문제에 접속하면 인포샵 bbs의 텔넷 접속 메뉴에서 많이 사용되던 해킹 방법이다. 라고 적혀있다.

쉘도 없어서 당황했지만 ctrl+c를 누르면 쉘이 나온다.


디렉터리의 리스트를 확인해보니 password라는 파일이 있다. 이걸 열어보니 다음 레벨의 비밀번호가 나왔다.


'Wargame > FTZ' 카테고리의 다른 글

[FTZ] level8@ftz  (0) 2017.11.09
[FTZ] level7@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09
[FTZ] level4@ftz  (0) 2017.11.09
[FTZ] level3@ftz  (0) 2017.11.08

문제 hint를 보면 /usr/bin/leve5를 실행하면 /tmp디렉터리에 level5.tmp라는 임시파일을 생성한다고 한다.


/usr/bin/level5를 실행하고 /tmp/leve5.tmp내용을 확인하려고 보니 사라졌다.

아마 생성하고 바로 삭제하는 것 같다.


일단 /tmp에 level5.tmp를 내 임의로 만들어 놓고 /usr/bin/level5를 실행한다.


/tmp/level5.tmp에 임시파일 내용이 덮어 씌워졌다.

아마 임시파일로 덮어 쓴 다음 권한이 level5가 아니라서 삭제가 안된 것 같다.



'Wargame > FTZ' 카테고리의 다른 글

[FTZ] level7@ftz  (0) 2017.11.09
[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level4@ftz  (0) 2017.11.09
[FTZ] level3@ftz  (0) 2017.11.08
[FTZ] level2@ftz  (0) 2017.11.08

힌트를 보면 /etc/xinetd.d에 백도어를 심었다고 한다.

일단 해당 디렉터리 리스트를 보면 backdoor라는 텍스트 파일이 있다.


이 파일을 cat명령으로 열어보면 xinetd 설정파일이 나온다.

service명은 finger다. finger 명령은 사용자 계정 정보와 최근 로그인 정보, 이메일, 예약 작업 정보 등을 볼 수 있는 명령어이다. 

이 명령을 실행하면 level5라는 user로 /home/level4/tmp/backdoor라는 파일을 실행하도록 설정하는 xinetd 설정파일이다.

finger 명령을 실행하면 level5의 권한으로 해당 파일을 실행한다는 의미다.


위와 같은 c언어로 my-pass명령을 실행하는 소스를 짜서 /home/level4/tmp/backdoor라는 이름으로 컴파일한다.


그리고 위와 같이 finger 명령을 실행한다.

사용 예:

finger [옵션]... [사용자명 ...] [user@host ...]

host 부분에 ftz를 썼다가 아무런 반응이 없어 localhost를 쓰니 문제가 풀린다.

'Wargame > FTZ' 카테고리의 다른 글

[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09
[FTZ] level3@ftz  (0) 2017.11.08
[FTZ] level2@ftz  (0) 2017.11.08
[FTZ] level1@ftz  (0) 2017.11.08

hint를 보면 동시에 여러 명령어를 사용하려면?

문자열 형태로 명령어를 전달하려면? 이라고 나와있다.

일단 level4의 setuid를 가지고 있는 파일을 찾는다.

$ find / -user level4 -perm -4000 2> /dev/null

/bin/autodig라는 파일이 나온다. hint에 있던 소스를 사용하는 파일인것 같다.

여러 명령어를 동시에 사용하는 방법은 ;를 사용하는 방법이 있다.

;는 명령1;명령2;명령3 이런 식으로 사용하는데 명령1이 없는 명령이더라도 명령2를 실행한다.

이를 이용하면 쉽게 풀 수 있다.

그리고 문자열 형태로 명령어를 전달하려면? 이라는 부분은 ""(더블쿼터)를 이용하면 된다.


첫번째 인자가 가운데 명령어로 들어가는 점을 파악했으니 ";id;"를 주면 명령1;id;명령3을 실행해서

id를 실행시켜준다. 같은 방법으로 ";my-pass;"를 인자로 주면 level4의 권한으로 my-pass를 실행해 password를 출력하면서 문제를 클리어할 수 있다.


'Wargame > FTZ' 카테고리의 다른 글

[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09
[FTZ] level4@ftz  (0) 2017.11.09
[FTZ] level2@ftz  (0) 2017.11.08
[FTZ] level1@ftz  (0) 2017.11.08

hint를 보면 텍스트 파일 편집 중 쉘의 명령을 실행 시킬 수 있다고 한다.

아마 vi 편집기 실행 중 esc 후 !로 한개의 명령을 실행하는 방법을 이용하는 것 같다.


일단 level3의 권한을 가지고 있는 파일을 찾는다.

$ find / -user level3 -perm -4000 2> /dev/null

/usr/bin/editor 라는 파일이 나왔다.

vi편집기로 실행한다.


vi 편집기로 실행하면 빈 화면이 나온다.

이제 !sh을 실행한다.


쉘을 얻었다.

권한은 level3의 권한이다.

my-pass를 입력해 password를 출력해서 문제를 클리어 했다.



'Wargame > FTZ' 카테고리의 다른 글

[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09
[FTZ] level4@ftz  (0) 2017.11.09
[FTZ] level3@ftz  (0) 2017.11.08
[FTZ] level1@ftz  (0) 2017.11.08

hint를 보면 level2 권한으로 setuid가 걸린 파일을 찾으라고 한다.

find 명령어로 level2로 setuid가 걸린 파일을 찾는 명령을 실행한다.


$ find / -user level2 -perm -4000 2> /dev/null

/bin/ExecuteMe 라는 파일을 찾았다.


파일을 실행하면 my-pass와 chmod는 제외하고 한가지 명령을 실행시켜준다고 한다.

sh명령으로 쉘을 변경해주는 명령을 실행하면 쉘을 얻을 수 있다.

쉘로 my-pass를 실행하면 level2의 password를 출력한다.



'Wargame > FTZ' 카테고리의 다른 글

[FTZ] level6@ftz  (0) 2017.11.09
[FTZ] level5@ftz  (0) 2017.11.09
[FTZ] level4@ftz  (0) 2017.11.09
[FTZ] level3@ftz  (0) 2017.11.08
[FTZ] level2@ftz  (0) 2017.11.08

+ Recent posts