/etc/passwd 파일은 여러 가지로 보안의 문제점을 가지고 있습니다. 패스워드를 변경하기 위해 사용하는 명령어인 passwd라는 명령어는 /bin/passwd에 명령어 형태로 존재합니다. 물론 이 명령어는 계정을 가지 사용자이면 누구나 사용가능합니다. 다음의 퍼미션을 확인해 보도록 하겠습니다.

 

패스워드 보관파일

[root@host /root]# ls -l /etc/passwd

-rw-r--r--   1 root   root  1251 Nov 29 14:55 /etc/passwd

 

패스워드변경 명령어

[root@host /root]# ls -l /usr/bin/passwd

-r-s--x--x  1 root  root  10704 Apr 15  1999 /usr/bin/passwd

 

위의 예에서 알수 있듯이 계정사용자의 정보를 보관하고 있는 파일인 passwd파일은 거의 대부분 /etc/passwd에 존재하며, 이 파일의 퍼미션은 644입니다. 즉, 누구나 읽어 볼 수는 있습니다. 단 수정가능한 사용자는 이 파일의 소유자인 root만이 가능하지만, 흔히 계정을 가진 사용자라면 누구나 이파일에 있는 자신의 패스워드를 변경가능하지 않은가? 이상하지 않습니까?

이것의 비밀은 setuid라는 것에 있습니다.

setuid를 설명하기 전에 유닉스시스템에서 명령어가 실행되는 절차를 확인해 보겠습니다.

 

2. 명령어 실행절차

일반적으로 시스템사용자가 명령어를 실행시켰을 때 명령어를 찾아서 실행시키는 경로와 절차는 다음과 같습니다.

  1. 현재 작업디렉토리에서 찾음.
  2. $PATH에서 찾음
  3. 찾은후에 실행권한 체크
  4. 권한이 있다면 실행시킨 사용자의 UID로 실행
  5. 권한이없다면 이 파일이 Setuid bit가 있는가를 확인
  6. Setuid bit가 있다면 명령어 소유주의 UID(Effective UID)로 실행

 

3. SetUID 파일 찾기

일반적으로 시스템에서 SetUID로 실행가능한 명령어는 몇 개로 제한이 되어있습니다. 이미 설정되어있는 명령어외에 새롭게 생성된 SetUID파일(명령어)가 있나를 정기적으로 체크해보셔야합니다.

다음과 같은 find 명령어로 SetUID파일을 찾아보시기 바랍니다.

[root@host /root]# find / -user root -perm -4000 -print -xdev

/bin/login
/bin/su
/bin/mount
/bin/umount
/bin/ping
/sbin/pwdb_chkpwd
/sbin/dump
/sbin/restore

그리고 /usr/bin/passwd라는 명령어의 퍼미션정보를 보면 s라는 것이 있습니다. 이것이 setuid bit입니다.

일반사용자가 자기의 패스워드를 변경하기 위해 "passwd"라는 명령어를 사용했을 때는 s라는 퍼미션(SetUID 퍼미션) 때문에 root권한으로 실행이 되는 것입니다. 따라서 /etc/passwd파일이 root소유임에도 불구하고 일반사용자가 변경이 가능하게 되는 것입니다.

그런데, 해커들은 바로 이런 SetUID퍼미션이 설정되어 있으면서 root소유로 되어있는 명령어들을 해킹에 이용하게되며 가장 대표적인 명령어가 passwd라는 명령어입니다.

즉, 다시말씀드려서 passwd라는 명령어가 실행이 될 때 root 권한으로 /etc/passwd내용을 변경하게되는데 바로 이싯점에 즉 root권한으로 실행이 되고 있을 때에 정규적인 작업만을 하게하는 것이 아니라 자기가 목적하는 악의적인 작업까지 하게 만드는 것입니다.

 

4. SetUID 파일 설정하기

일반적으로 파일퍼미션은 "chmod 777 파일이름"등과 같이 숫자로 지정하는 것이 일반적입니다.

하지만 SetUID를 지정할 때에는 이 3자리숫자앞에 SetUID퍼미션을 하나더 사용하면 됩니다.

[root@hlxsvr /imsi]# ls -l
-rw-r--r--  1 root   root        0 Oct 27 14:06 testfile

[root@hlxsvr /imsi]# chmod 4755 testfile
[root@hlxsvr /imsi]# ls -l
-rwsr-xr-x    1 root     root            0 Oct 27 14:06 testfile*

 

5. SetUID, SetGID, Sticky-bit

SetUID설정을 할 때와 마찬가지로 퍼미션의 3자리숫자앞에 2또는 1을 함께입력하면 SetGID와 Sticky-bit을 설정할 수 있습니다.

4000 : SetUID설정

2000 : SetGID설정

1000 : Sticky-bit설정

참고로 Sticky-bit설정은 대부분 /tmp 디렉토리에 설정되어 있는데, 가장 흔한 용도는 공용디렉토리로 사용하기 위한 것입니다.  즉, Sticky-bit로 설정된 디렉토리는 모든 사용자가 write가능하며 write된 파일은 그 사용자의 소유되 됩니다. Sticky-bit 때문에 가능한 것이지요. 물론 삭제할 수 있는 권한또한 root와 해당사용자만이 가능합니다.

따라서 사용자들에게 공용으로 사용될 디렉토리를 Sticky-bit로 설정해두면 이런 것들이 가능하게 됩니다.


// cafe.naver.com/bestreal/170

'Server' 카테고리의 다른 글

Linux 사용자 계정  (0) 2017.01.08
이메일 오픈릴레이 테스트  (0) 2017.01.08
iptables  (0) 2017.01.08
아파치 인증창 띄우기  (0) 2017.01.07
CentOS/Apache SSL 설정  (0) 2017.01.06
이번시간에는 Iptables사용법과 기본적인 firewall구성법에 대해서 알아보도록 하겠다. 

이제 Iptables를 사용하기 위한 기본적인 설정에 대해서 알아보자. Iptables는 Kernel 2.4.x 기반의 리눅스 설치시에 기본으로 설치되어있고 /sbin 디렉토리 아래에 있다. 그리고 iptables와 ipchains는 동시에 사용할 수 없으므로 우선 ipchains의 모듈을 내려줘야 한다. 

아래의 그림처럼 lsmod를 해보고 만약 ipchains 모듈이 올라와 있다면 rmmod ipchains 명령으로 모듈을 내려줘야 iptables 사용이 가능하다. 


이제 Iptables에 대해서 본격적으로 알아보도록 하자. 

기본적으로 Iptables에는 세가지 chain이 있고 모든 패킷은 이 세가지 chain중 하나를 통과하게 된다. 이 세가지 chain은 INPUT, OUTPUT, FORWARD chain인데 우선 여러분의 컴퓨터로 들어가는 모든 패킷은 INPUT chain을 통과한다. 그리고 여러분의 컴퓨터에서 나가는 모든 패킷은 OUTPUT chain을 통과한다. 그리고 하나의 네트워크에서 다른 곳으로 보내는 모든 패킷은 FORWARD chain을 통과한다.


Iptables가 작동하는 방식은 이들 각각의 INPUT, OUTPUT, FORWARD chain에 당신이 어떠한 rule을 세우는 지에 따라 달라진다. 
예를 들어 당신이 HTML 페이지를 요청하기 위해 www.yahoo.com에 패킷을 보낸다면 이 패킷은 우선 당신 컴퓨터의 OUTPUT chain을 통과하게 된다. 
그러면 kernel에서 OUTPUT chain의 rule을 확인하고 rule과 match가 되는지 확인을 하게된다. rule중에서 최초로 match되는 것에 의해 당신이 보낸 패킷의 운명이 결정되는 것이다. 
만약 어떤 rule과도 match되지 않는다면 전체 chain의 정책이 ACCEPT냐 DROP이냐에 따라 패킷의 운명이 결정될 것이다. 그러고 나서 Yahoo! 에서 응답하는 패킷은 당신의 INPUT chain을 통과하게 될 것이다. 

IP 주소 막기 

이제 기초적인 개념에 대해서 알아봤으니 실제로 사용해 보도록 하겠다. 

Iptable을 사용할 때에는 기억해야 할 많은 옵션들이 있으므로 man 페이지(man iptables)를 잘 활용하는 것이 중요하다. 이제 특정 IP를 조종하는 법에 대해서 알아보자. 우선 당신이 200.200.200.1 이라는 IP로부터 오는 모든 패킷을 막고 싶어한다고 가정하자. 우선 -s 옵션이 사용되는데 여기에서 source IP나 DNS name을 지칭할 수 있다. 그러므로 다음과 같이 함으로써 이 IP를 지칭할 수 있다. 


./iptables -s 200.200.200.1 


하지만 위처럼만 명령을 내리면 kernel은 위의 주소에서 오는 패킷을 어떻게 처리해야 할 지를 알 수가 없다. 그러므로 -j 옵션으로 그 패킷을 어떻게 처리해야 하는지 결정해야 한다. 일반적으로 3가지 옵션이 있는데 ACCEPT, DENY, DROP이다. 

ACCEPT는 대충 예상할 수 있듯이 패킷을 허용하는 옵션이다. DENY 옵션은 컴퓨터가 연결을 허용하지 않는다고 메시지를 돌려 보내는 옵션이다. 그리고 DROP 옵션은 패킷을 완전히 무시해 버린다. 만약 우리가 이 IP에 대해 확실히 의심이 간다면 우리는 DENY 대신에 DROP을 사용해야 할 것이다. 
그러므로 결과적으론 다음과같이 옵션을 주면 된다. 


./iptables -s 200.200.200.1 -j DROP 


하지만 이 명령만으로는 아직 컴퓨터가 명령을 이해할 수가 없다. 우리는 한가지를 더 추가해야 되는데 바로 어떤 chain의 rule로 적용시킬지 결정해야 하는 것이다. 
여러분은 -A 옵션을 사용해서 이를 결정할 수 있다. 즉 아까 위에서 본 INPUT, OUTPUT, FORWARD 옵션 중에서 하나를 선택해야 하는 것이다. 이 옵션을 줌으로써 당신이 선택한 chain의 맨 아래부분에 새로운 rule이 추가될 것이다. 
따라서 우리는 우리에게 들어오는 패킷을 차단하고 싶으므로 INPUT 옵션을 주면 되는 것이다. 그러므로 전체 명령은 다음과 같다. 


./iptables -A INPUT -s 200.200.200.1 -j DROP 



이 한 줄의 명령으로 200.200.200.1로부터 오는 모든 패킷을 무시할 수 있다. 옵션의 순서는 바뀌어도 상관이 없다. 즉 -j DROP이 -s 200.200.200.1 보다 앞에 가도 상관이 없다. 만약 그 반대로 200.200.200.1로 패킷이 못가도록 하려면 INPUT 대신에 OUTPUT을, -s 대신에 -d(destination) 옵션을 주면된다.

 

  • Service 차단하기


  • 만약 우리가 해당 컴퓨터로부터 telnet 요청만 무시하고싶다면 어떻게 해야 하는가? 이것도 그다지 어렵지 않다. 일단 큰 범주로 나누어 봤을 때 적어도 3가지의 프로토콜 - TCP, UDP, ICMP - 가 있다. 다른 대부분의 서비스와 마찬가지로 telnet은 TCP 프로토콜로 작동한다. -p 옵션으로 우리는 프로토콜을 결정할 수 있다. 하지만 TCP라고만 옵션을 줘서는 컴퓨터가 인식하지를 못한다. telnet은 TCP프로토콜로 작동하는 특정 서비스에 불과하기 때문이다. 우선 우리가 프로토콜을 TCP로 설정한 다음에는 --destination-port 옵션으로 해당하는 port를 설정해 줘야한다. 
    우선 telnet의 포트번호는 23번이다. 포트번호 대신에 telnet이라 써도 상관없다. 
    여기서 source port 와 destination port를 혼동하면 안된다. 즉 클라이언트는 어떤 포트로도 작동할 수 있는 반면에 서버는 23번 포트로 작동하기 때문이다. 즉 특정 서비스를 차단하기 위해서는 -destination-port를 이용하면 되고, 그 반대는 -source-port를 이용하면 된다. 이제 이들 옵션을 합쳐서 아래와 같이 명령을 주면 된다. 

    ./iptables –A INPUT –s 200.200.200.1 –p tcp --destination-port telnet –j DROP 


    그리고 IP의 영역을 선택하고 싶다면 200.200.200.0/24 와 같이 설정하면 된다. 이것은 200.200.200.* 에 해당하는 모든 IP를 선택하는 것과 같다. 

    선택적인 차단 

    이제 좀더 심화된 내용에 대해서 알아보자. 우선 여러분의 컴퓨터가 local area network(LAN)에 있고, Internet에 접속 가능하다고 가정한다. 알다시피 LAN은 eth0으로 Internet 연결은 ppp0으로 구분할 수 있다. 이제 다시 다음과 같이 가정해 보자. 우리는 telnet 서비스를 LAN상의 컴퓨터에게는 서비스하고 보안상 Internet상에서는 접근하지 못하도록 하고 싶다. 이것 역시 쉽게 구성할 수 있다. 우리는 input interface에 대해서는 -i 옵션을 output interface에 대해서는 -o 옵션을 사용할 수 있다. 즉 다음처럼 명령을 주면 된다. 

    ./iptables –A INPUT –p tcp --destination-port telnet –i ppp0 –j DROP 



    이렇게 함으로써 우리는 LAN상의 사용자는 telnet을 사용하고 그밖에 Internet상의 사용자는 telnet 을 사용하지 못하도록 할 수 있다. 

    Rule 순서에 관하여 
    이제 다음 단계로 들어가기에 앞서서 rule을 조종하는 다른 방법에 대해서 간단히 알아보자. 
    Iptables의 chain에서는 먼저 등록 된 rule이 효력을 발생하기때문에 등록을 하는 순서가 중요하다. 모든 것을 거부하는 설정이 먼저오게 되면 그 이후에 포트를 열어주는 설정이 와도 효과가 없다. 그러므로 허용하는 정책이 먼저오고 나서 거부하는 정책이 와야한다. 

    –A 옵션을 줌으로써 우리는 새로운 규칙을 chain의 맨 아래에 추가하게 된다. 즉 chain상의 상위 rule이 먼저 작동하기 때문에, 만일 새로 추가하는 rule을 먼저 작동시키기 위해서는 -I 옵션을 줌으로써 새로운 rule을 원하는 위치에 놓을 수 있다. 예를 들어 INPUT chain의 가장 위에 어떤 rule을 놓고 싶다면 “-I INPUT 1” 이라 명령하면 된다. 그리고 다른 위치로 놓고 싶다면 1을 다른 숫자로 바꿔주면 된다. 

    그리고 이미 위치된 rule을 다른 위치로 바꾸고 싶다면 -R 옵션을 주면 된다. -I 옵션을 주는 것과 마찬가지로 사용할 수 있는데 다만 -I옵션을 사용해서 1의 위치에 놓으면 다른 rule들이 밑으로 한칸씩 내려가는 반면 -R옵션을 사용해서 1의 위치에 놓으면 그 위치의 rule은 삭제된다. 

    그리고 끝으로 rule을 삭제하고 싶다면 -D옵션과 숫자를 사용하면 되고, -L 옵션을 사용하면 작성된 모든 rule의 목록을 보여주고, -F 옵션을 주면 해당 chain의 모든 rule을 삭제한다. 그리고 만약 chain을 명시하지 않았다면 모든 것을 flush할 것이다.

     

  • SYN Packets

  • 좀더 심화된 내용에 대해서 알아보자. 우선 패킷들은 특정 프로토콜을 사용한다. 그리고 프로토콜이 TCP라면 역시 특정 port를 사용한다. 그러므로 여러분 컴퓨터의 모든 포트를 막음으로써 보안을 할 수 있을 것이다. 
    하지만 당신이 다른 컴퓨터에 패킷을 보내면 그 컴퓨터는 당신에게 다시 응답을 해야한다. 그러므로 만약 당신에게 들어오는 모든 포트를 막아버린다면 당신에게 응답하는 패킷도 결국 못 들어오므로 connection을 하는 의미가 없을 것이다. 

    하지만 다른 방법이 있다. 두 컴퓨터가 TCP connection으로 패킷을 주고 받는다면 그 connection은 우선 초기화가 되어야 한다. 

    이것은 바로 SYN packet이 담당한다. SYN packet은 단순히 다른 컴퓨터에게 주고 받을 준비가 되었다는 것만 알려주는 초기화 기능만을 한다. 이제 서비스를 요청하는 컴퓨터는 우선적으로 SYN packet을 보낸다는 것을 알게 되었다. 그러므로 들어오는 SYN packet만 막기만 하면 다른 컴퓨터가 당신 컴퓨터의 서비스를 이용하지 못하게 할 수 있고, 하지만 당신은 그들과 통신할 수 있는 것이다. 

    즉 이와 같이 하면 당신이 먼저 패킷을 보내서 요청이 들어오는 것이 아니면 모두 무시해 버리게 된다. 
    이 옵션을 사용하기 위해서는 선택한 프로토콜 뒤에 --syn이라고 명령을 넣으면 된다. 이제 인터넷으로부터 오는 모든 연결을 막기위해서는 다음과 같이 rule을 정하면 된다. 

    ./iptables –A INPUT –i ppp0 –p tcp --syn –j DROP 


    당신이 만약 웹 서비스를 운영하는 것이 아니라면 이것은 유용한 rule이 될 것이다. 

    만약 당신이 웹서비스를 위해 하나의 포트(예를들어 80번-HTTP)만 열어두고 싶다면 역시 한가지 방법이 있다. 
    바로 “!” 마크를 사용하면 되는데 많은 프로그래밍 언어에서처럼 “!”은 “not”을 의미한다. 

    예를들어 80번 포트만 제외하고 모든 SYN packet들을 막고싶다면 다음과 같이 하면 된다. 


    ./iptables –A INPUT –i ppp0 –p tcp --syn --destination-port ! 80 –j DROP 


    다소 복잡한듯해도 간단한 rule이다. 

    Chain 정책 

    마지막으로 한가지 남은 것이 있다. 이것은 chain의 정책을 바꾸는 것으로 INPUT과 OUTPUT chain은 디폴트로 ACCEPT로 정해져 있고, FORWARD chain은 DENY로 정해져 있다. 
    만약 당신의 컴퓨터를 라우터로 사용하려면 당신은 FORWARD chain의 정책을 ACCEPT로 설정하고 싶을 것이다. 

    이럴때 어떻게 해야하는가? 이것은 매우 간단하다. -P 옵션을 사용하면 된다. 즉 FORWARD chain을 ACCEPT로 정하기 위해선 다음과 같이 명령을 내리면 된다. 


    ./iptables -P FORWARD ACCEPT 

     

     


  • iptables, 스크립트로 만들어 사용하기

  • 이번에는 iptable 명령어를 편리하게 스크립트로 만들어서 사용해 보자 
    일단 iptables라는 파일을 다음처럼 작성해 보자. 파일의 위치는 /etc/sysconfig/ 아래에 두도록 하겠다. 



    --begin script-- 
    #!/bin/sh 

    # 우선 모든 Rule을 정리한다. 

    /sbin/iptables -F 

    # 다음으로 각각에 대한 정책을 세운다. 

    /sbin/iptables -P INPUT DROP 
    /sbin/iptables -P OUTPUT ACCEPT 
    /sbin/iptables -P FORWARD DROP 

    # localhost에서의 traffic을 받아들인다. 

    /sbin/iptables -A INPUT -i lo -j ACCEPT 

    # 확립된 연결에 대한 Packet을 받아들인다. 

    /sbin/iptables -A INPUT -i eth0 -p tcp ! --syn -j ACCEPT 

    # DNS 응답을 받아들인다. 

    /sbin/iptables -A INPUT -i eth0 -p tcp --source-port 53 -j ACCEPT 
    /sbin/iptables -A INPUT -i eth0 -p udp --source-port 53 -j ACCEPT 

    # 인증 연결을 거부한다(그렇지 않을 경우 메일서버가 오랫동안 타임아웃 상태가 될 것이다.) 
    /sbin/iptables -A INPUT -i eth0 -p tcp --destination-port 113 -j REJECT 

    # echo나 목적지에 도착 못하거나 시간 초과된 icmp packet들을 받아들인다. 

    /sbin/iptables -A INPUT -i eth0 -p icmp --icmp-type 0 -j ACCEPT 
    /sbin/iptables -A INPUT -i eth0 -p icmp --icmp-type 3 -j ACCEPT 
    /sbin/iptables -A INPUT -i eth0 -p icmp --icmp-type 11 -j ACCEPT 

    --end script— 



    위의 스크립트는 하나의 예에 불과하고 기타 ssh나 ftp, samba등을 이용하기 위한 설정사항을 직접 작성해야 한다. 
    파일 작성이 끝났으면 파일에 실행권한을 줘야한다. 보안상 root만 실행할 수 있도록 권한을 변경한 후 위의 스크립트를 실행하면 된다. 

    확인을 하려면 /sbin/iptables –L 이라고 하면 방금 실행시킨 스크립트가 나올 것이다. 

    그리고 부팅시마다 실행을 시키려면 /etc/rc.d/rc.local 파일 맨 아래 부분에 다음처럼 넣으면 된다. 

    if [ -f /etc/sysconfig/iptables ]; then 
    /etc/sysconfig/iptables 
    fi


    <!--StartFragment-->// 현재 세션을 확인한다.
    c:\>net session

    // 네트웍으로 로그인
    // 암호입력후 로그인하게 되면 현상태가 네트웍으로 
    // 연결된 두대의 서버가 네트웍인증으로 연결된 상태이다.
    c:\>net use \\218.154.92.*** /user:administrator *

    // 네트웍으로 연결된 네트웍인증 제거
    c:\>net use /delete \\218.154.92.***\ipc$

    // 네트웍으로 연결된 상황 확인
    c:\>net use

    // start 명령으로 GUI로 드라이브보기
    c:\>start c:\

    // 특정시간에 명령수행
    c:\>at 12:03 c:\DMLog.com

    // 명령리스트 확인
    c:\>at

    // 현재 프로세스의 계층구조를 보여주는 명령어
    c:\>rkill /view \\218.154.92.***

    // 로컬 로그온 및 네트웍 로그온된 상황을 알수있다
    c:\>rkill /token \\218.154.92.***

    // 실행중인 프로세스의 실제 실행계정명이 나타난다.
    C:\Program Files\Resource Kit>pulist

    azman.msc       권한부여관리자
    compmgmt.msc  컴퓨터관리
    dcpol.msc         기본도메인컨트롤 보안설정
    devmgmt.msc     장치관리자
    dfrg.msc            디스크 조각모음
    dfsgui.msc        분산파일시스템
    diskmgmt.msc    디스크 관리
    eventvwr.msc    이벤트로그
    filesvr.msc        파일서버관리
    fsmgmt.msc       공유폴더관리
    gpedit.msc        그룹정책관리
    lusrmgr.msc      로컬사용자그룹관리
    tscc.msc          터미널서비스관리
    inetmgr             인터넷(iis)서비스
    iis.msc             IIS 서비스
    services.msc    윈도우 서비스
    lusrmgr.msc      사용자 권한
    secpol.msc       로컬보안정책

    'Server' 카테고리의 다른 글

    FTP 정리 Active/Passive 그리고 TFTP  (0) 2017.01.06
    윈도우 net user 커맨드  (0) 2017.01.06
    윈도우 CMD 명령어  (0) 2017.01.06
    HTTP Method  (0) 2017.01.06
    윈도우 제어판/관리콘솔실행명령어  (0) 2017.01.06

    nmap은 열린 포트를 확인하여 보안 점검을 위한 대표적인 툴이면서
    원치 않는 서버를 대상으로 포트 스캐닝과 시스템의 OS 종류와 버전을 알아내는데 사용되기도 한다.
    최근에 나온 nmap 3.45버전은 오픈된 서비스의 버전 정보까지도 확인시켜준다.

    -------------------------------------------------------------- 
    # nmap -A -T4 -F localhost

    Starting nmap 3.45 ( http://www.insecure.org/nmap/ ) at 2003-09-16 22:45 KST
    Interesting ports on truefeel (127.0.0.1):
    (The 1203 ports scanned but not shown below are in state: closed)
    PORT   STATE SERVICE  VERSION
    21/tcp  open ftp    vsFTPd 1.2.0
    25/tcp  open smtp    Sendmail smtpd Securing..214-2.0.0 This is sendmail version 8.12.
    80/tcp  open http    Apache httpd 2.0.44 ((Unix) DAV/2 PHP/4.3.2)
    ... 중략 ...
    Running: Linux 2.4.X|2.5.X
    OS details: Linux Kernel 2.4.0 - 2.5.20, Linux kernel 2.4.20
    Uptime 0.505 days (since Tue Sep 16 10:38:25 2003)

    Nmap run completed -- 1 IP address (1 host up) scanned in 16.859 seconds
    -------------------------------------------------------------- 

    위에서 보는 것처럼 nmap의 뛰어난 기능으로 어느 OS를 사용하는지 쉽게 알 수 있다.

    이러한 nmap의 OS를 알아내는 기능은 7단계(T1~T7)를 거치게 된다.
    T1 단계에서 열린 포트로 SYN 패킷을 보내고, T2에서 열린 포트로 null 패킷 전송,
    T3에서 열린 포트로 SYN, FIN, URG, PSH 패킷을 전송
    T5 부터는 닫혀진 포트로 비슷한 과정을 거치게 된다.

    자~ 이제 nmap OS fingerprinting을 막는 방법을 알아보자.

    1. iplog 툴

    iplog는 포트 스캐닝으 로깅하는 툴이다. TCP 포트, UDP 포트 스캐닝, TCP null 스캔, FIN 스캔,
    smurf 공격, Xmas 스캔, ping 플러딩, IP fragment 공격 등을 감지할 수 있다.
    procmisc 모드를 지원하여 같은 서브넷으로 들어오는 스캐닝을 감지할 수 있다.
    또한 OS 정보를 숨기기한 목적으로도 사용할 수 있다.

    1) 설치

    http://ojnk.sourceforge.net/ 에서 iplog-2.2.3.tar.gz 을 받아온다.

    -------------------------------------------------------------- 
    # tar xvfz iplog-2.2.3.tar.gz
    # cd iplog-2.2.3
    # ./configure
    # make
    # make install
    # cp example-iplog.conf /etc/iplog.conf
    --------------------------------------------------------------

    iplog.conf에서 다음 2가지를 수정한다.

    -------------------------------------------------------------- 
    user nobody          # default는 iplog 사용자로 실행함
    pid-file /var/run/iplog.pid  # default는 /var/run/iplog/iplog.pid 임
    -------------------------------------------------------------- 

    소스 설치가 귀찮은 분 중
    레드햇 사용자는 http://www.rpmfind.net/ 에서 iplog-2.2.3-fr2.i386.rpm 받아 설치한다.

    FreeBSD 사용자는 포트 시스템을 이용해서 설치한다.
    실행 파일은 /usr/local/sbin에, 설정파일은 /usr/local/etc에 설치된다.

    -------------------------------------------------------------- 
    # cd /usr/ports/net/iplog/
    # make install
    # make clean
    -------------------------------------------------------------- 

    '포트시스템이 뭐에요?' 하는 분은 최준호님이 쓴 글을 참고하기 바란다.
    http://www.bsdnet.co.kr/articles/article.qsp?no=14

    2) 실행

    -------------------------------------------------------------- 
    # iplog -o -z -i lo (테스트를 위해 lo interface를 지정함)
    -------------------------------------------------------------- 

    -o 등의 옵션의 의미는 nmap 테스트 후에 알아본다.

    -------------------------------------------------------------- 
    # nmap -sS -O localhost

    Starting nmap 3.45 ( http://www.insecure.org/nmap/ ) at 2003-10-29 23:37 KST
    Insufficient responses for TCP sequencing (2), OS detection may be less accurate
    Insufficient responses for TCP sequencing (3), OS detection may be less accurate
    Interesting ports on truefeel (127.0.0.1):
    (The 1651 ports scanned but not shown below are in state: closed)
    PORT   STATE SERVICE
    25/tcp  open smtp
    80/tcp  open http
    ... 중략 ...
    No exact OS matches for host (If you know what OS is running on it, see
    http://www.insecure.org/cgi-bin/nmap-submit.cgi).
    TCP/IP fingerprint:
    SInfo(V=3.45%P=i686-pc-linux-gnu%D=10/29%Time=3F9FD0B9%O=25%C=1)
    T1(Resp=Y%DF=Y%W=7FFF%ACK=S++%Flags=AS%Ops=MNNTNW)
    T2(Resp=Y%DF=Y%W=100%ACK=O%Flags=BAPRSF%Ops=)
    T2(Resp=Y%DF=N%W=0%ACK=O%Flags=BARS%Ops=)
    T2(Resp=Y%DF=Y%W=100%ACK=O%Flags=BPRF%Ops=)
    T3(Resp=Y%DF=Y%W=7FFF%ACK=S++%Flags=AS%Ops=MNNTNW)
    T4(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
    T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
    T6(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
    T7(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
    PU(Resp=N)


    Uptime 0.303 days (since Wed Oct 29 16:21:04 2003)

    Nmap run completed -- 1 IP address (1 host up) scanned in 21.301 seconds
    -------------------------------------------------------------- 

    nmap은 T1~T7까지 OS 탐지 테스트 과정을 거쳤지만 OS 종류는 알아내지 못했음을 확인했다.
    그럼 도대체 스캐닝 로그는 어디에 있는건가? /etc/iplog.conf 설정에 따라 /var/log/iplog에 저장된다.

    -------------------------------------------------------------- 
    ... 생략 ...
    Oct 29 23:37:09 ICMP: echo from truefeel (127.0.0.1) (8 bytes)
    Oct 29 23:37:09 TCP: port 5901 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 516 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 657 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 32 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 2044 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 737 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: pop2 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 872 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 670 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: SYN scan detected [ports 5901,516,657,32,2044,737,109,872,670,374,...] from
    truefeel (127.0.0.1) [port 49574]
    Oct 29 23:37:12 TCP: Bogus TCP flags set by truefeel (127.0.0.1):49581 (dest port 25)
    Oct 29 23:37:14 TCP: ipp connection attempt from truefeel (127.0.0.1):40509
    ... 생략 ...
    -------------------------------------------------------------- 

    3) 옵션과 설정은?

    -o : 백그라운드로 실행하지 않는다. (기본 백그라운드)
    -z : 이게 바로 핵심이다. nmap로 OS 정보 알아내는 것을 막는다.
    -L : log를 화면으로 출력한다.
    -i : interface를 지정한다. (기본 eth0)
    -u : iplog 실행 사용자 또는 UID를 지정한다. (기본 nobody)
    -g : iplog 실행 그룹명 또는 GID를 지정한다. (기본 nobody)
    -l : 로그파일을 지정한다. (기본 /var/log/iplog)
    -a : promisc 모드로 전환하여 지정한 네트워크 내의 스캐닝을 로깅한다. (예. -a 192.168.123.0/24)
    -k : iplog 프로세스를 kill한다. 백그라운드, 포그라운드 실행중인 것과 상관없이 kill.
    -R : iplog를 재실행한다.

    이 많은 옵션을 어떻게 사용하면 좋을까?

    화면으로 모니터링한다면

    # iplog -o -z -L

    파일로 로깅을 한다면 (부팅시 실행되도록 하려면 /etc/rc.d/rc.local 등에 추가)

    # iplog -z

    /etc/iplog.conf 설정 파일에서는 옵션으로 사용할 것을 미리 지정해 둘 수 있다.
    실행 사용자, interface, 감지에서 제외할 포트 등

    2. iptables 이용하는 방법

    iptables를 이용하는 방법이 있으나 커널 패치+iptables 패치를 해야하는 과정이 필요하며
    커널 2.4.19 이후의 버전에 대해서는 더이상의 발표도 있지 않아 간단하게 설명한다.

    http://ippersonality.sourceforge.net/ 에서 ippersonality-20020819-2.4.19.tar.gz 를
    받아 커널과 iptables 각각 패치를 한 후 컴파일을 한다.

    ippersonality-20020819-2.4.19/samples 디렉토리에는 OS를 속이기 위한 총 10개의 파일이 있다.
    AmigaOS, Dreamcast, FreeBSD, Linux 2.0x, Linux 2.2, MacOS 9, Solaris 8, Tru64 UNIX,
    Win Me 또는 Win 2000, Win 9x 이렇게 10개.

    Windows를 사용하는 것 처럼 속이려면 어떻게 해야 하는가?

    패치된 iptables를 이용해서

    -------------------------------------------------------------- 
    # insmod ipt_PERS (모듈을 로딩, 커널 컴파일시에 CONFIG_IP_NF_PERS=m로 했을 때)
    # /usr/local/sbin/iptables -t mangle -A PREROUTING -s ! 서버IP -d 서버IP -j PERS --tweak dst --local --conf win2k.conf
    # /usr/local/sbin/iptables -t mangle -A OUTPUT   -s 서버IP -d ! 서버IP -j PERS --tweak src --local --conf win2k.conf
    -------------------------------------------------------------- 

    3. 참고 자료

    * A practical approach for defeating Nmap OS-Fingerprinting
     http://coffeenix.net/doc/security/nmap_os_fingerprinting.html
    * IP Personality 프로젝트
     http://ippersonality.sourceforge.net/
    * iplog
     http://ojnk.sourceforge.net/
    * nmap 3.45의 새기능, 버전 스캐닝 (글 좋은진호)
     http://coffeenix.net/board_view.php?bd_code=71 

    // coffeenix.net

    'Security' 카테고리의 다른 글

    FTP Active/Passive 정리  (0) 2017.01.06
    ubuntu 환경에 SNORT & BASE & Metasploit 설치  (0) 2017.01.06
    R.U.D.Y DDoS  (0) 2017.01.05
    slowloris 분석/대응방안  (0) 2017.01.05
    윈도우 로그온 유형  (0) 2016.12.29

    로컬에서 백업하여 원격으로 바로 옮기는 경우
    tar cvfzp - /home | ssh taejun "cat > home.tgz"
    tar cvfzp - /home | ssh taejun "cat > /dev/tape"

    tar cvfzp - apache | ssh taejun "cd /usr/local; mv apache apache.bak; tar xvfzp -"

    ssh taejun "cd /usr/local/test; tar xvfzp -" < my.tgz
    ssh taejun" cat my.tgz" | tar xvfzp -

    'Server' 카테고리의 다른 글

    HTTP Error Code  (0) 2017.01.06
    FTP vs NTFS  (0) 2017.01.06
    ftp를 이용한 Network 백업  (0) 2017.01.06
    쉘에서 PATH 보이기  (0) 2017.01.06
    Telnet, Ssh 특정 계정 접속 못하게 하기  (0) 2017.01.06

    vi 에디터 사용시 윈도우에서 작업한 파일에 ^M 문자가 붙는경우가 있습니다.
    정말 귀찮기 짝이 없죠. 아래 방법을 참고하시기 바랍니다. KLDP에서 퍼왔습니다.

    1. vi(m)이 열린 상태 
    1.1 문자 치환 명령 이용
    다음과 같이 문자 치환 명령으로 이 문자를 없애도록 합니다. 
    :1,$s/^M//g

    물론 이것의 입력은 다음과 같이 하도록 합니다.
    :1,$s/[Control]+v+m을 누른다.//g

    1.2 파일포맷 변경 
    vim 5.0 이상에서는 다음과 같이 명령을 내리도록 합니다

    :set fileformat=unix
    혹은
    :set ff=unix
    그리고, 저장하고 종료합니다.
    :wq

    이와 반대로 끝에 ^M붙이려면 다음과 같이 합니다.
    :set fileformat=dos

    이전버전에서는 다음과 같이 합니다.
    :set textmode 


    2. 프롬프트 상에서
    2.1 dos2unix 이용
    dos2unix와 unix2dos를 이용하여 변환할 수 있습니다.

    다음과 같이 하면 ^M 문자가 없어집니다.
    $ dos2unix [문서명](여러 파일의 경우 *.확장자)

    그리고 다음과 같이 하면 ^M 문자가 생기죠.
    $ unix2dos [문서명]

    2.2 cat과 tr을 이용한 방법
    다음과 같이 하면 해당 파일의 ^M 문자가 없어집니다.
    $ cat dos-file | tr -d ^M > unix-file

    2.3 perl 스크립트 
    다음과 같이 하면 여러파일을 한번에 바꾸게 됩니다.

    # perl -i -pe 's/\015//g' *.html

    3. 다른 에디터의 사용 
    pico 라는 에디터 아실겁니다. 기능은 별로 없지만 빠르고 간편하죠.
    vi나 emacs에서 ^M으로 잡히는 것이 pico에서는 안 잡히는데,
    파일을 pico로 열어서 다시 이 문서를 저장합니다. 
    그리고 vi나 emacs로 읽으면 ^M이 모두 없어진 것을 알 수 있습니다.

    4. man 페이지의 ^M, ^H 문자 
    man 페이지를 일반 화일로 바꾸면 ^M, ^H 등이 생기는데(예, 한컴리눅스 ^H)
    다음과 같이 하면 이 문자를 없애고 볼 수 있습니다. 
    다음은 ls의 예입니다.

    4.1 ps 또는 pdf로 변환하기
    man -t 변경 시킬 화일 > 변경후 화일명.ps
    man -t 변경 시킬 화일 > 변경후 화일명.pdf
    예)
    man -t ls > ls.ps 또는 ls.pdf로 보시면 됩니다.

    4.2 텍스로 변환하기
    man 변환시킬화일 | col -b> 변환후 화일명.txt
    예)
    man ls | col -b > ls.txt

    'Coding' 카테고리의 다른 글

    색을 랜덤하게 뽑아서 출력합니다.  (0) 2017.01.07
    php predefined variables  (0) 2017.01.06
    주민번호 생성원리  (0) 2017.01.06
    CGI Setting  (0) 2017.01.06
    쉘프로그래밍 문법  (0) 2017.01.06

    #!/bin/sh

    ################# 개요 ##################
    # 인자로 들어온 server1의 특정 db를 백업한다
    # 인자가 생략되면 db1 이다.
    # split로 분할 압축후 server2의 /home/myid/db_backup 에 ftp로 전송한다
    # 파일명 : "db명"_"날짜"_"aa" , "ab" ...
    ######################################

    ############### 필요한 변수들 #############
    # host : 백업될 서버
    # username : ftp로 접속할 id
    # password : 비번
    # db_name : server1의 db명
    # mysql_dir : mysql 데이터 디렉토리
    # backup_dir : server1의 분할압축된 파일이 놓일 임시 디렉토리
    # today_date : 오늘날짜 (파일명에 사용됨)
    # size : 한 조각의 크기
    #####################################
    host="server2.test.com"
    username="myid"
    password="mypasswd"
    db_name=${1:-db1}
    mysql_dir="/home/mysql/data/"
    backup_dir="/tmp/pieces/"
    today_date=`date +%Y%m%d`
    size="650m"

    # 기존에 만들어진 파일들을 없앤다
    # /tmp/pieces 로 이동후 원하는 db 디렉토리를 분할압축 한다.
    # ftp로 server2 의 /home/foremost/db_backup 으로 옮긴다.

    echo "[`date +%Y-%m-%d\ %T`] $db_name backup Start !!!"
    if [ -d "$backup_dir" ]; then
    rm -f ${backup_dir}*
    fi

    cd $backup_dir
    tar cf - ${mysql_dir}${db_name} | bzip2 -c | split -b $size - ${db_name}_${today_date}_

    {
    echo user $username $password
    echo cd /home/myid/db_backup
    echo lcd /tmp/pieces
    echo prompt
    echo mput *
    echo quit
    } | ftp -n $host 21

    echo "[`date +%Y-%m-%d\ %T`] $db_name backup End !!!"
    exit 0


    # 1G 용량의 db를 백업하는데 약 20여분이 소요되더군요.
    # bzip2 대신 gzip을 사용하면 좀더 빨라지지 않을까 싶습니다.

    // kltp.kldp.org

    'Server' 카테고리의 다른 글

    FTP vs NTFS  (0) 2017.01.06
    ssh 이용하여 tar 로 원격 백업하기  (0) 2017.01.06
    쉘에서 PATH 보이기  (0) 2017.01.06
    Telnet, Ssh 특정 계정 접속 못하게 하기  (0) 2017.01.06
    쉘다루기/쉘의 종류  (0) 2017.01.06

    /root아래에 backup.sh 이라는 파일을 만들어 놓고 백업 명령어를 다음과 같이 주었다.

    #!/bin/bash
    /usr/local/mysql/bin/mysqldump -uroot -p***** mysql > mysql_db_bak_$(date +%Y%m%d).sql
    /usr/local/mysql/bin/mysqldump -uyanemone -p***** yanemone > yanemone_db_bak_$(date +%Y%m%d).sql
    mv *.sql /backup
    tar cvfpz /backup/html_bak.tar.gz /var/www/html
    tar cvfpz /backup/yanemone_html_bak.tar.gz /home/yanemone/public_html
    tar cvfpz /backup/dichang_html_bak.tar.gz /home/dichang/public_html

    백업할 내용이라던지 파일 이름은 자신의 상황에 맞게 주면 되겠다.

    이렇게 하고 나면 backup.sh파일을 chmod 100 backup.sh로 단단히 무장하라.

    그리고 crontab -e 명령으로 cron 작업을 명시하자
    그럼 vi가 열리면서 편집이 가능하다

    00 06 * * * /root/backup.sh

    를 추가하고 :x 로 저장하고 나오자.
    위의 작업은 매일 새벽 6시에 /root/backup.sh을 실행하라 라는 말이다.

    그리고 /var/spool/cron/root가 있는지 확인해보자. 있다면 정상적으로 수행할 것이다.

    *************************************************************************************
    팁팁팁
    이렇게 하면 cron의 결과를 cron 데몬이 root에게 친절하게도 메일을 자꾸 날려준다. (x10)
    정말 귀찮고 용량도 만만치 않다.
    안오게 할 수 있다.

    /etc/crontab이라는 파일을 열어보자
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=ROOT
    HOME=/

    부분이 있다. MAILTO=ROOT를 다음과 같이 고쳐보자
    MAILTO=""
    ************************************************************************************

    크론에 등록시 아래와 같이 하면 메일이 날아오지 않는다.
    위에꺼는 전체 메일이 다 날아오지 않으므로 주의 해야 한다.
    그러므로 아래꺼 사용하믄 된당...
    00 06 * * * /root/backup.sh >/dev/null 2>&1 


    ************************************************************************************
    추가팁 저장할 파일의 크기가 클경우 분할하여 압축할수 있다.
    백업을 하다보면 기가단위가 넘을때가 많습니다.
    그때는 분할백업(CD 1장 단위가 좋겠죠...)
    tar -zcvpf - /압축할dir | split -b 670mb - 압축파일.tar.gz 

    그러면 압축파일.tar.gzaa 
    압축파일.tar.gzab순으로 파일이 생깁니다. 

    -b 670mb는 압축파일을 670mb단위로 분할 하라는 옵션입니다. 

    압축풀라고 할때는 (쿠쿠 바로 답해 주셔서 캄솨함다.)
    cat test.tar.gza* > test.tar.gz
    로 하여 tar.gz파일로 만들어서 풀면 된다.
    ***********************************************************************************

    ***********************************************************************************
    삼바로 마우트한 윈도우즈 백업서버에 데이터 저장
    mount -t smbfs -o username=윈도우계정아이디,password=윈도우패스워드 //서버이름/backup /backup
    ***********************************************************************************

    #!/bin/bash 
    BACKUP_DIR=/var/backup 
    FILE_PFX =MY_DB 

    DATE=$(date +%Y%m%d) 
    OF = $FILE_PFX-$DATE.sql 
    rm -rf $BACKUP_DIR/$FILE_PFX-*.sql 

    mysqldump -uUSER -pPASS DB_NAME > $BACKUP_DIR/$OF 

    'Tip' 카테고리의 다른 글

    이메일 체크 함수  (0) 2017.01.06
    ubuntu 메일 보내기  (0) 2017.01.06
    host 커맨드를 이용해 특정 도메인의 메일서버 알아내기  (0) 2017.01.06
    Linux cpu, mem 등 확인하기  (0) 2017.01.06
    mutt 메일 보내기  (0) 2017.01.06

    [iz4u@junghyun ~]$cat .bash_profile 
    # .bash_profile 

    # Get the aliases and functions 
    if [ -f ~/.bashrc ]; then 
    . ~/.bashrc 
    fi 

    # User specific environment and startup programs 

    export PS1='[\h@\u \w]$' <--이 부분을 추가 
    PATH=$PATH:$HOME/bin 

    export PATH 
    unset USERNAME 
    [iz4u@junghyun ~]$ 

    \h : 호스트 
    \u : 계정아이디 
    \w : 경로명 

    pwd 처도 볼수 있지만...... 
    [iz4u@junghyun ~]$cd public_html/ 
    [iz4u@junghyun ~/public_html]$cd board/ 
    [iz4u@junghyun ~/public_html/board]$cd include/ 
    [iz4u@junghyun ~/public_html/board/include]$

    참고 1 :
    # .bash_profile 
    # 제 .bash_profile 입니다. 
    # 주석을 달아 놓았으니 튜닝해서 쓰세요. 

    # Get the aliases and functions 
    # 사용자 정의 알리어스와 함수 정의 포함 
    #if [ -f ~/.bashrc ]; then 
    . ~/.bashrc 
    #fi 

    # User specific environment and startup programs 
    # 사용자별 환경 변수, 시작 프로그램 설정 

    PATH=$PATH:$HOME/bin 
    BASH_ENV=$HOME/.bashrc 
    USERNAME="Christian Junguhn Hwang" 


    # PS1##################################################################### 
    # These comments are for the environmental variables of PS1 
    # a: idk s: show the name of this shell 
    # d: show date informations t: show time as 24 hours 
    # e: hostname u: show id 
    # j: idk v: show the version of this shell maybe 
    # l: show the number of the konsoles w: show the absolutely path 
    # n: idk 
    # H: show the name of host and domain V: show the version 
    # T: show time as 12 hours W: show the name of current path 
    # this is my shell program for PS1 from here ############################# 
    hour=`date | cut -f4 -d' ' | cut -f1 -d:` 
    #time=`date | cut -f4 -d' ' 
    if [ $hour -gt 12 ]; then 
    PS1='[Joobaragy@\u \t PM] ' 
    else 
    PS1='[Joobaragy@\u \t AM] ' 
    fi ############################# this is the end of my shell program for PS1 

    export USERNAME BASH_ENV PATH PS1

    // 해커즈뉴스

    'Server' 카테고리의 다른 글

    ssh 이용하여 tar 로 원격 백업하기  (0) 2017.01.06
    ftp를 이용한 Network 백업  (0) 2017.01.06
    Telnet, Ssh 특정 계정 접속 못하게 하기  (0) 2017.01.06
    쉘다루기/쉘의 종류  (0) 2017.01.06
    DISK Quota 설정하기  (0) 2017.01.06

    + Recent posts