[PHP] 웹상에서 setuid 를 이용하여 시스템명령 사용하기

HYEONG HWAN, MUN/ 10월 18, 2014/ 미분류/ 0 comments

 

테스트 환경(Demonstration Environment) : Ubuntu Server 14.04 LTS

 

반복적인 단순한 쉘 작업을 함수로 만들어서 웹에서 관리하고 싶어졌다.

작업은 사용자의 추가, 삭제, 비밀번호 변경이다.

 

여러 시행 착오 끝에 잘 되는 경우를 발견하였고 이곳에 공유해 본다.

 

원하는 명령어는 root의 권한으로 실행되어야 하는데, Apache에 root permission 을 줄수도 없는 노릇이고..

방법을 찾아보다가 setuid 를 발견하였다.

 

이것은 리눅스의 특정 플래그 인데, 이 파일을 실행할 때 소유자의 권한으로 실행하라는 bit flag 이다.

 

먼저

test.php 작성

system("whoami");

 

결과화면은 www-data 이었다.

pv103

 

이번엔 쉘실행파일로 작성해 보았다.

test.sh

#!/bin/bash
whoami

 

이것 실행 역시 www-data 이었다.

 

setUID를 주고서 해보았다.

소유자변경과 setuid 비트 2가지를 주어야한다.

결과 변화가 없음.

 

test2.php 생성

system("./test.sh");
system("./test.php");

 

즉 test2.php 에서 호출하도록 해서 작성해보았는데 역시 결과는 변화가 없었다.

이론상으로는 owner 로 등록된 유저명이 나와야 하는데..

 

마지막으로 gcc를 이용해 보았다.

 

test.c 생성

void main(){
system("whoami");
}

 

#gcc -o test.o test.c
#chmod 4755 test.o
#chown root test.o

 

라고 하고 test3.php 를 다음과 같이 짰더니

system("./test.o");

root 권한이 되었다.

pv104

 

쉘스크립트나 PHP스크립트는 setuid 비트가 동작하지 않고 C 언어로 바이너리 컴파일을 해야 동작하더라.
실제 적용은 argv[] 를 받는 c 소스를 짠 후에 php 에서 파라미터로 넘겨서 실행하도록 짰다.

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*