당황스런 문제점입니다. 도움좀 부탁드립니다.
안녕하세요 리눅스 왕초보 ㅡ.ㅡ;; 입니다.
리눅스 서버 계정의 비밀번호를 웹으로 관리하도록 test라는 쉘을 하나 만들었습니다.
환경: fedora core3
=======================================
쉘스크립트 제작내용
#!/bin/bash
uid=$1
pass=$2
echo $pass | /usr/bin/passwd --stdin $uid
=======================================
#ls -l test 의 내용
-rwsrwsrwx nobody nobody 어쩌구~
<서버에서 직접 실행해 보았습니다.>
서버에 터미널 이용 직접 접속해서 실행을 해보면 root계정으로는 명령어가 실행이 되어 변경이 됩니다.
#/usr/bin/test test 1234
Changing password for user test
passwd : all authentication tokens updated successfully.
그러나 기타 일반 계정으로는 변경 안됩니다.
test ~]$/usr/bin/test test 1234
Only root can do that.
욜케 됩니다.
그리고, 웹에서는 어떻게 해도 안됩니다.
그래서 주변에 다른분께 여쭤보니 그분이 제대로 아는지는 모르겠으나 본인이 아는 바로는 리눅스 7.2버젼이상부터는 root외엔 쉘을 사용못하게 한다는..;; 그런답변을 들었습니다. 그래서 혹시 쉘만 안되는 건가 싶어서 c로도 만들었습니다.
=======================================
test.c 내용
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char* argv[])
{
if(argc<3) //check argument
{
printf("insert argument please\n");
return 0;
}
char a[50];
sprintf(a,"echo %s | /usr/bin/passwd --stdin %s",argv[2],argv[1]);
int result=system(a); //execute command
printf("%d",result); //10진수로 결과값 보내줌
}
=======================================
물론 퍼미션 아까 쉘과 같이 모든것을 다 줬습니다.
웹에서 id:test pw:1234로 변경테스트
(test라는 계정의 비밀번호를 1234로 바꿔보겠습니다.)
결과값을 찍어보았습니다.
=======================================
php에서 실행함수
--------------inc.test.php ----------------------------------------
$pwfile=/etc/passwd문서
function test($pwfile, $id, $pass)
{
if(!$pwfile) $pwfile = "/etc/passwd";
// passwd 파일을 읽어온다
if( file_exists($pwfile) ) $array = file($pwfile);
else
{
$res = "passwd 파일의 경로가 잘못됨";
return $res;
}
for($i=0; $i<count($array); $i++)
{
$pos = strpos($array[$i], ":");
$pwid[] = substr($array[$i], 0, $pos);
}
//시스템에 등록된 아이디
if(in_array($id, $pwid))
{
$cmd = "/usr/sbin/test $id $pass";(=>요부분 $cmd = "/usr/sbin/test"." '".$id."' '".$pass;요렇게도 해보고 아이디/비번 작은땀표로 묵어두 봣씁니다.)
$res=system($cmd);
//$res=exec($cmd);
//print_r($res);
//exit;
return $res;
}
// 등록되지 않은 아이디
else
{
$res = "시스템 계정확인 실패 : 시스템에 등록되지 않은 사용자임";
return $res;
}
}
=======================================
-----------------------result.php----------------------------------
/* system 비밀번호 변경 */
include_once "inc.test.php";
$pwfile = "/etc/passwd";
$id = test
$pass = test
$testres = test($pwfile,$id,$pass);
print_r($testres); exit;
=======================================
testres에
65024 라는 결과값이 찍힙니다. 이게 실행됫다는 얘긴지 안됫다는 얘긴지도 모르겠습니다.
위험하니 쓰지마라~~ 머 이런 답변 하지 말아주십시요..
위험한줄 알면서도 꼭 해야하는 이유가 있어서 하는 거거등여..;;
참고로 test.c에 문구를 하나 넣어서 찍어봣습니다. 찍힙니다.
그러므로 그 실행문을 수행하긴 한다는 얘깁니다. 그러나 실제로 비밀번호가 바뀌지는 않습니다.
※ 어느부분이 틀린것인지..;; 왜 웹에서 실행하거나 일반사용자가 실행하면 실행이 안되는지..;; 원인이나 어떻게해야 될찌 아시는분
도움좀 부탁드립니다.
웹이나 일반사용자가 실행하기 위해서는 setuid 를 줘야 합니다.퍼
웹이나 일반사용자가 실행하기 위해서는 setuid 를 줘야 합니다.
퍼미션을 4777 로 한번 해보세요.
손님.. 답글 감사합니다.
setUID 당연히 4777줫찌용...
쉘에 퍼미션주기 제가 실행한 순서는 이렇습니다.
chown nobody:nobody test
chmod 4777 test
chmod +s test
여기까지 줫습니다...
...어떤 서적에서는 test 라는 이름의 파일은 가급적 피하라고
...
어떤 서적에서는 test 라는 이름의 파일은 가급적 피하라고 하더군요^^;;
Re: 손님.. 답글 감사합니다.
아마도 권한 문제일 듯 싶네요..
test의 권한을 nobody:nobody대신 root:nobody로 바꿔보세요.
chown root:nobody test
sudo 를 사용해서 하십시오.다만 웹기반이라는 경우에 소스를 읽
sudo 를 사용해서 하십시오.
다만 웹기반이라는 경우에 소스를 읽어서 실행해버리는 경우는 취약하므로 주의바랍니다.
------------------------------------------------------------------------------------------------
Life is in 다즐링
댓글 달기