2010년 3월 3일 수요일

톰캣 '경고: Parameters: Invalid chunk ignored' 에러 해결 법

1. 증상

2010. 3. 4 오전 8:37:41 org.apache.tomcat.util.http.Parameters processParameters
경고: Parameters: Invalid chunk '' ignored.


2. 원인

Tomcat 에서 URL 주소에 '&&' 또는 '&=' 등이 들어가 있을 경우 발생되는 메시지이다.


3. 해결 방법

톰캣설치경로/conf/logging.properties 파일에서

org.apache.tomcat.util.http.Parameters.level = SEVERE
를 추가하고 tomcat을 재시작 한다.

※ 주의: SERVER(X)와 SEVERE(O) 를 혼돈하지 말것


위의 방법으로 해결되지 않을 경우

$JAVA_HOME/jre/lib/logging.properties 파일에 위의 내용을 추가한 후 tomcat을 재시작 한다.

2010년 2월 24일 수요일

새로운 네비게이션의 강자 엠피온 내비 라이브



세계 최초 스마트 하이웨이 적용 엠피온 내비 SEN-210



* 엠피온 내비 라이브, 고속도로 교통정보를 무료로 알려주는 내비게이션입니다. 제가 이거 만드는 곳에 다니고 있습니다.

2010년 1월 19일 화요일

서버 해킹 원리 이해

서버 해킹 원리 이해

1. 직접 대입
1) 사전 공격(Dictionary attack) : 사전에 있는 단어를 입력하여 패스워드를 알아내거나 암호를 해독하는데 사용되는 컴퓨터 공격 방법.

2) 무차별 공격(Brute forcing) : 사전적인 단어들로 구성된 아이디와 패스워드 리스트를 가지고 계속적으로 로그인을 시도하는 것. 크래커가 로그인에 성공하지 못하더라도 잦은 로그인 시도로 서버 부하를 발생시켜 차단하지 않으면 쓸데없는 시스템 자원이 낭비 된다.

2. 네트워크 공격 기법

1) spoofing : IP 주소 등의 정보를 속임으로써 권한을 획득하고 중요 정보를 가로채고 서비스 방해까지 행하는 공격.

- Session Hijacking : 웹 브라우징시 세션 관리를 위해 사용되는 Session ID를 스니핑이나 무작위 추측 공격(brute-force quessing)을 통해서 도용하는 기법.

- IP Spoofing : 말 그대로 IP 정보를 속여서 다른 시스템을 공격하는 것. IP 스푸핑을 통해 서비스 거부 공격(TCP Syn flooding, UDP flooding, ICMP flooding)을 수행할 수도 있으며, 공격 대상 컴퓨터와 서버 사이의 연결된 세션에 대해서 세션 끊기도 가능함.

- DNS Spoofing : 질의한 도메인 이름에 대해 잘못된 IP를 응답으로 보내 이용자가 잘못된 사이트에 접속하도록 하는 공격

- ARP Spoofing : 로컬 네트워크에 사용하는 ARP 프로토콜의 특징을 이용하여 자신의 MAC 주소를 다른 컴퓨터의 MAC 주소로 변조하여 로컬상의 데이터를 스니핑하는 공격.

- Mail Spoofing : mail 주소를 위장해서 전송하는 것.

2) sniffing : 네트워크 패킷이나 버스를 통해 전달되는 중요정보를 엿보고 가로채는 공격을 하는 행위

3) Denial of Service(서비스 거부공격)
- DoS(Denial of Service) : 시스템을 악의적으로 공격해 해당 시스템의 자원을 부족하게 하여 원래 의도된 용도로 사용하지 못하게 하는 공격이다. 특정 서버에게 수많은 접속 시도를 만들어 다른 이용자가 정상적으로 서비스 이용을 하지 못하게 하거나, 서버의 TCP 연결을 바닥내는 등의 공격이 이 범위에 포함.
- DDoS(Distributed DoS) : 다수의 시스템을 통해 공격을 시도하며 다양한 방법을 통해 동시에 공격

3. 해킹 기법 들

1) Race Condition : 경쟁 상태란 장치나 시스템이 두 개 이상의 동작을 동시에 수행하려고 시도했을 때 발생하는 바람직하지 않은 상태. 그러나 장치나 시스템의 속성 때문에 이러한 동작들은 적절한 순서에 따라 바르게 완료되어야만 함.
임시 파일을 생성하는 프로그램에서 자주 사용하고 임시 파일을 만들어 쓰고 일이 끝났으면 지우는 과정에서 쓰기 바로 직전 경쟁조건을 이용하여 원하는 파일에 원하는 내용을 집어넣는 방식.

2) 버퍼 오버플로 : 메모리의 스택영역을 흘러 넘치게 해서 리턴되는 주소지를 변경하여 원하는 임의의 명령어를 실행시킨다.
해결책 : setuid bit 제거, non-exec stack 옵션 사용.

3) IFS : 환경변수를 이용한다. Internal Field Separator의 약자로 외부프로그램을 실행할 때 입력되는 문자열을 나눌 때 기준이 되는 문자를 정의하는 변수.
기본적으로 IFS는 공란(Space)으로 정의된다 - IFS=” “ 이 IFS를 슬러쉬[/]로 바꾸고 싶다면 csh인 경우에는 setenv IFS / , bash인 경우에는 export IFS=”/” 로 하면 변경된다.

4) amed, imapd, smbp, mountd, smtp 등 데몬의 취약성 이용

4. 새로운 공격 기법의 특징

1) 에이전트 화 : 원격 조정이 가능한 Agent를 설치하고 이를 이용하여 다른 시스템을 공격한다. 원격 조정으로 자신의 흔적을 지우는 번거로움을 없애주며, 많은 시스템을 이용하여 분산공격을 수행할 깨 매우 효율적임.

2) 분산화 : 많은 수의 시스템에서 단일 혹은 다수의 시스템을 공격함.

3) 자동화 : 웜 및 윈도우용 공격도구, 그리고 최근 침해사고에서 발견되는 자동 공격 스크립트의 증가는 공격도구들이 자동화되고 있음을 의미함. 이러한 자동화는 분산 네트워크 공격을 가능하게 함.

4) 은닉성 : 에이전트를 이용한 분산 공격기번은 침입탐지시스템을 무력화시키는 가장 효과적인 공격기법으로 공격자의 위치를 은닉시킬 수 있는 공격 기법. 에이전트와 공격자간의 통신은 암호화 및 터널링 기법을 사용하여 탐지가 어렵도록 함.

유닉스 시스템 로그 설정과 관리

유닉스 시스템 로그 설정과 관리

1. acct/pacct : 사용자가 사용한 명령이나 프로세스 활동들을 기록한다. 바이너리 형태로 저장되며, 'lastcomm', 'acctcom', 'sa' 명령으로 확인할 수 있다.
# lastcomm

2. history : 사용자별 명령어를 기록하는 파일로 csh, tcsh, ksh, bash 등 사용자들이 사용하는 쉘에 따라 .history, .bash_history 파일 등으로 기록함. 이전 명령어 들을 찾기 쉽고 사용하기 보다 편하기 위해 만들어 졌기 때문에 로그 파일이라고 말하기 어렵다. 그래서 /var/log에 위치하지 않고 사용자의 홈 디렉토리에 사용자별로 존재한다.

3. lastlog : 각 사용자의 최종 로그인 정보. lastlog로 확인 가능함.

# lastlog
사용자명 포트 ~로부터 최근정보
root pts/3 23.30.31.139 목 12월 27 22:37:27 +0900 2007
bin **한번도 로그인한 적이 없습니다**
daemon **한번도 로그인한 적이 없습니다**
adm **한번도 로그인한 적이 없습니다**
lp **한번도 로그인한 적이 없습니다**
sync **한번도 로그인한 적이 없습니다**
shutdown **한번도 로그인한 적이 없습니다**......

4. loginlog

Solaris를 포함한 시스템 V계열의 유닉스에서 실패한 로그인 시도를 기록하는 파일기본적으로 존재하지않는파일, 수동생성해야함
실습

1) /var/adm/loginlog 파일을 생성
#touch /var/adm/loginlog

2) /etc/default/login 파일수정
RETRIES=5 부분의 주석 부분을 제거

5. messages : 부트 메시지 등 시스템의 콘솔에서 출력된 결과를 기록하고 syslogd에 의해 생성된 메시지도 기록. 로그 파일 중 가장 중요한 부분으로 로그인 기록부터 디바이스 정보, 시스템 설정오류, 파일 시스템, 네트워크 세션 기록 등 가장 다양한 정보를 가지고 있는 파일임. 침입자의 공격 형태가 어느 정도 기록되어 지기도 한다.

# cat messages

Jan 17 04:02:43 icscf syslogd 1.4.1: restart.
Jan 18 11:31:32 icscf ntpd[1825]: synchronized to 211.233.40.78, stratum 2
Jan 18 11:32:05 icscf ntpd[1825]: synchronized to 123.32.1.90, stratum 1
Jan 18 11:32:20 icscf ntpd[1825]: synchronized to 211.115.194.21, stratum 2
Jan 18 11:32:21 icscf ntpd[1825]: synchronized to 123.32.1.90, stratum 1
...

6. sulog : switch user(su 명령어) 관련 기록. 일반계정을 획득한 공격자는 su 명령을 이용하여 루트 권한으로 작업을 할 수 있다. 따라서 sulog를 조사하여 루트 권한으로 변환된 일반 사용자 계정이 있는지 살펴 보아야 함.

# cat sulog

SU 06/22 08:01 + pts/2 bbbb-aaaaa
SU 06/22 08:06 + pts/2 cccc-dddd.....

7. syslog : 메일 디버깅 정보.

8. utmp : 현재 로그인한 각 사용자의 기록, 바이너리 파일로 되어 있음.
(명령어 w., who, users, finger)

9. wtmp : 사용자의 로그인, 로그아웃 시간과 시스템의 종료 시간, 시스템 시작 시간 등을 기록, 바이너리 파일임. (last 명령으로 확인 가능)

10. Xferlog : FTP 서비스의 접근 기록

2009년 12월 22일 화요일

이클립스에서 C/C++ 개발

보통 이클립스는 자바 개발에 사용하지만 gcc, gdb와 연동해서 훌륭한 C/C++ 개발툴이 될수 있다.

이클립스는 C/C++을 플러그인 형태로 지원하는데 이를 CDT라고 한다.

1. 이클립스 다운로드

http://www.eclipse.org/downloads/ 에서 Eclipse IDE for C/C++ Developers (79 MB)을 다운로드 받는다. 별도의 설치과정 없이 적당한 경로에 압축을 풀면된다.

2. JRE(Java Runtime Environment) 설치

이클립스는 자바로 만들어 졌기 때문에 http://java.sun.com/javase/downloads/index.jsp 에서 JRE를 설치한다.

3. 툴체인 설치

이클립스는 순수 IDE이므로 컴파일러와 디버거를 포함하지 않는다.

1) 아래 링크에서 컴파일러를 다운로드 한다.
실행하면 자동으로 설치된다.


2) 아래 링크에서는 디버거(gdb)를 다운로드 한다.
에서 GDB를 다운로드 받고 적당한 위치에 압축을 푼다.

4. 환경 설정(PATH)

제어판 -> 시스템 -> 고급 탭 -> 환경변수에서 PATH 값을 수정해 준다.

예) C:\Program Files\Microsoft Visual Studio\Common\Tools;C:\Program Files\Microsoft Visual Studio\VC98\bin;;C:\Program Files\SSH Communications Security\SSH Secure Shell;C:\Program Files\SoftForum\XecureHSM\;C:\MinGW\bin

환경변수 뒤에 설치한 gcc, gdb가 설치된 경로를 추가해줘야 한다. 난 gdb, gcc를 동일한 경로에 설치해서 PATH에 하나만 추가해 주었다.

5. 이클립스 설정

이클립스를 실행한다.
Window->Preferences를 선택하면 다이얼로그 박스가 나온다. C/C++ 아래의 New CDT project wizard->Makefile Project 를 선택하고
Build command를 mingw32-make 로 바꿔준다.


2009년 12월 14일 월요일

책으로 표현하는 나 <유저스토리북>


유저 스토리북이란 서비스가 베타 오픈을 했습니다.

가까히 사는 분에게 책을 빌려주고 빌려 볼수 있는 그런 사이트입니다.

저두 가입해서 가진 책도 등록하고 했습니다.

그런데 누가 컴쟁이 아니랄까봐 집에 있는 책의 대부분이 IT 관련 서적 ㅠㅠ;;

그 이외에는 전부 재테크, 주식 서적 ㅠㅠ;;

열심히 활동하면서 마음의 양식을 쌓아보렵니다. 아래는 사이트 주소입니다.


사이트가 AJAX로 만들어 졌는지 깔끔하고 별도의 리프레쉬 하면서 발생하는 깜빡거림이 없네요. 이놈의 컴쟁이 본능 관심은 서비스가 아니라 웹페이지 기술 ㅠㅠ;;

Dtrace를 이용한 솔라리스 메모리 누수(memory leak) 잡기

참조 문헌

Dtrace를 이용한 메모리 누수 잡는 법을 소개하고자 한다.

아래 사용한 스크립트는 5번 항목 또는 위의 링크를 참조하도록 한다.


1. 메모리 leak을 유발하는 코드 작성

#include

int main(void)
{
char *test1;

while(1)
{
test1 = malloc(sizeof(char) * 256);

printf("memory leak\n");

sleep(1);
}
return 1;
}

2. 해당 프로그램 실행
# a.out

3. dtrace로 memory malloc과 free한 부분을 찾음
사용법
# ./memleak.d PID > output

사용 예
# su -
# pgrep a.out
5659
# ./memleak.d 5659 > leak.data
Ctrl+c

4. 스크립트로 malloc과 free를 매칭해서 제대로 free가 되지 않은 부분을 추출해 냄
사용법
./findleaks.pl output

사용예
./findleaks.pl leak.data
Ptr=0x22018 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c

---------
Ptr=0x21af0 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c

---------
Ptr=0x21e08 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c

---------
Ptr=0x21d00 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c

---------
Ptr=0x21bf8 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c

---------
Ptr=0x21f10 Size=256
libc.so.1`malloc+0x6c
a.out`main+0x8
a.out`_start+0x5c


5. 스크립트

1)
# cat ./memleak.d

-------------------------------------- cut --------------------------------------------
#!/usr/sbin/dtrace -s

pid$1:libc.so.1:malloc:entry
{
self->trace = 1;
self->size = arg0;
}
pid$1:libc.so.1:malloc:return
/self->trace == 1/
{
printf("Ptr=0x%p Size=%d", arg1, self->size);
ustack();
self->trace = 0;
self->size = 0;
}

pid$1:libc.so.1:realloc:entry
{
self->trace = 1;
self->size = arg1;
self->oldptr = arg0;
}

pid$1:libc.so.1:realloc:return
/self->trace == 1/
{
printf("Ptr=0x%p Oldptr=0x%p Size=%d", arg1, self->oldptr, self->size);
ustack();
self->trace = 0;
self->size = 0;
}

pid$1:libc.so.1:calloc:entry
/self->trace == 1/
{
self->trace = 1;
self->size = arg1;
}

pid$1:libc.so.1:calloc:return
/self->trace == 1/
{
printf("Ptr=0x%p Size=%d", arg1, self->size);
ustack();
self->trace = 0;
self->size = 0;
}

pid$1:libc.so.1:free:entry
{
printf("Ptr=0x%p ", arg0);
}
-------------------------------------- cut --------------------------------------------

2)
# cat findleaks.pl

-------------------------------------- cut --------------------------------------------
#!/usr/bin/perl

use Data::Dumper;

my %hash = ();

while (<>) {
if ((/malloc:return Ptr=([^ ]*) Size=(.*)/) ||
(/calloc:return Ptr=([^ ]*) Size=(.*)/)) {
$hash{$1} = { size => $2 };
while (<>) {
last if /^$/;
$hash{$1}->{stack} .= $_;
}
}
elsif (/free:entry Ptr=([^ ]*)/) {
if (exists $hash{$1} and $hash{$1}) {
$hash{$1} = '';
}
}
elsif (/realloc:entry Ptr=([^ ]*) Oldptr=([^ ]*) Size=(.*)/) {
if ($1 eq $2) {
if (exists $hash{$1} and $hash{$1}) {
$hash{$1} = { size => $3 };
$hash{$1}->{stack} = '';
while (<>) {
last if /^$/;
$hash{$1}->{stack} .= $_;
}
}
} else {
$hash{$1} = '';
$hash{$2}= { size => $3 };
$hash{$2}->{stack} = '';
while (<>) {
last if /^$/;
$hash{$2}->{stack} .= $_;
}
}
}

}

foreach my $key (keys %hash) {
next if not $hash{$key}->{size};
print "Ptr=$key Size=", $hash{$key}->{size}, "\n";
print $hash{$key}->{stack}, "\n---------\n";
}
-------------------------------------- cut --------------------------------------------