level 1


level 1의 비밀번호는 level1

우선 정보를 모으기 위해 ls -al을 해 보았더니 hint라는 파일이 있어서 cat명령어를 사용하여 출력해보았다.




이렇게 힌트가 떴다. setuid라고?

Set 이란 말은 "변경하다" 란 뜻을 가지고 있고, UID는 User ID의 약자이다.

설명하면 SetUID는 일시적으로 자신의 ID를 변경하는 것을 말한다.


자신의 암호를 변경하는 passwd 파일에 루트 권한의 SetUID가 걸려있어서

일반 사용자들이 그 passwd 파일을 실행하는 동안에는 "루트로의 일시적인 아이디 변경" 이 되는것이다.




SetUID가 걸린 파일을 찾는 명령어는

find / -user level2 -perm -4000 2> /dev/null 이다. 


2> /dev/null : 오류는 /dev/null 파일에 담으라는 뜻


/bin/ExcuteMe 라는 이름의 파일이 떠서 실행시켜보면



my-pass 는 현재 자신의 비밀번호를 볼 수 있는 명령어 이고

chmod는 디렉토리나 파일의 권한을 바꿔주는 명령어 이다.

아무런 제한이 없다면 저 두 명령어를 쓰는것이 젤 쉽겠지만 안된다고 하니 다른 방법을 찾아보자.


내가 약간 희한하게 푼 것같기는 한데 /etc/passwd 에 사용자의 비밀번호가 기록되어 있다고해서 찾아봤더니

많은 것들 중 level2의 쉘이 /bin/bash인 걸 알 수 있다.

그래서 level2의 권한으로 명령어를 하나 실행할 수 있을때 /bin/bash를 사용해서 level 2의 쉘을 열기로 했고

level2의 쉘을 따게 되었당!!!



level 2


level 2의 비밀번호는 hacker or cracker


hint에서는 텍스트 파일 도중 쉘 명령어를 실행 시킬 수 있다고 해서



 일단 level3의 setuid를 가진 파일을 찾아봤다.

find / -user level3 -perm -4000 2> /dev/null 명령어를 쳤더니 

/usr/bin/editor가 떠서 실행시켜 보았더니 vim파일이었다.




구글에서 파일 편집 도중 명령어를 사용하려면 !를 붙이고 실행시켜야 한다고 했다.

level3:x:3003:3003:Level 3:/home/level3:/bin/bash 

level3 또한 쉘의 종류가 bash여서 :! /bin/bash라고 했더니 level3을 들어가졌다.

/usr/bin/editor가 level3의 setuid를 갖고 있는 파일이었기 때문에 level3의 권한으로 level3의 쉘이 들어갈 수 있었다.


level3


level 3의 비밀번호는 can you fly?


힌트에는 autodig의 소스와 more hints 로 

1)동시에 여러 명령어를 사용하려면?

2) 문자열 형태로 명령어를 전달하려면?

이 있었다.

문제를 풀기 전에 저 more hints에 대한것을 찾아봤는데


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

    ; - 앞의 명령어가 실패해도 다음 명령어가 실행

    && - 앞의 명령어가 성공했을 때 다음 명령어가 실행

    & - 앞의 명령어를 백그라운드로 돌리고 동시에 뒤의 명령어를 실행


- 문자열 형태로 명령어를 전달하려면?

쉘 스크립트 : 쉘 명령어가 담긴 파일

"asdf asdf" <-이렇게


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(int argc, char **argv){
 
    char cmd[100];
 
    if( argc!=2 ){
        printf"Auto Digger Version 0.9\n" );
        printf"Usage : %s host\n", argv[0] );
        exit(0);
    }
 
    strcpy( cmd, "dig @" );
    strcat( cmd, argv[1] );
    strcat( cmd, " version.bind chaos txt");
 
    system( cmd );
 
 
cs


argc : 명령어 개수를 받는 변수
argv : 명령어 문자열을 저장하는 변수
이 소스의 핵심은 argv[1]로 넘어온 사용자가 적은 명령을 바로 실행시키는 것이다.

autodig라고해서 구글에 dig를 검색해 보았더니
dig는 Domain Information Groper의 약자로 네임서버로 부터 정보를 가져올 수 있는 툴이다.

dig 명령은 DNS 네임서버 구성과 도메인 설정이 완료된 후, 일반 사용자의 입장에서 설정한 도메인네임에 대한 DNS 질의응답이 정상적으로 이루어지는지를 확인 점검하는 경우에 많이 사용한다고 한다.

[root@web ~]# dig [@server] [domain] [query type]

server : 확인하고자할 네임서버를 지정하는 곳이며 지정하지 않을경우 리눅스 
/etc/resolv.conf에 등록된 네임서버를 이용하여 루트 서버를 조회하게 됩니다.
라고 해서 /etc/resolv.conf에 들어갔더니 192.168.203.2가 나왔는데 솔직히 이건 필요없고
 


이 문제의 핵심은 소스를해석해서 argv[1]로 넘어온 사용자가 적은 명령을 바로 실행시킨다는것.[system( cmd );]
그래서 이 문제를 해결하는 방법이 총 3개 있다.
1. /bin/autodig "192.168.203.2 && /bin/bash ;" 



2. /bin/autodig "192.168.203.2 && /bin/bash &&"


3. autodig의 소스를 복사해서 ./test라는 파일을 만들어서 "192.168.203.2 && /bin/bash"했더니 저렇게 나온다. 저 소스가 결과적으로 실행하는 명령어를 출력하게 만들어 놓음. /bin/bash는 뒤에 인자가 붙지 않으면 쉘을 실행시키고 뒤에 인자가 붙으면 그 파일을 쉘 스크립트로 실행한다. 그래서 저 뒤에 붙는 version.bind을 쉘스크립트로 만들어서 /bin/bash를 실행시키게 한다. 1번과 2번은 version.bind가 실행되지 않도록 /bin/bash까지만 실행하도록 만들어 놓은 것 이다.

<소스를 복사해서 실제로 소스가하는 일은 무엇인지 알아보았다.> 
[level3@ftz tmp]$ ./test "192.168.203.2 && /bin/bash"
===================
dig @192.168.203.2 && /bin/bash version.bind chaos txt
===================
[level3@ftz tmp]$ /bin/autodig "192.168.203.2 && /bin/bash"

























'@C언어 : Layer7' 카테고리의 다른 글

2018년에 한것..(?)  (0) 2018.12.24
PLT,GOT와 동적 라이브러리  (0) 2018.10.23
Git 사용 보고서  (1) 2018.06.08
너의 타자소리가 들려  (0) 2018.05.23
구조체 예제  (0) 2018.05.15

+ Recent posts