본문 바로가기
' 하는 것/삽질

PHP에서 돌아가는 루트 권한 쉘

by 핀펫 2021. 5. 5.
반응형



현재 하고 있는 프로젝트 중 PHP를 통해 쉘을 직접 건드리는 내용을 다루는 것이 하나 있다.

네트워크를 직접 만지는 내용이라 당연하게도 리눅스 문법에 익숙해져야 할 것이고

나름 캡스톤 프로젝트라서 상품성을 생각한다면 GUI를 위해서라도 HTML, 자바, PHP 모두에 익숙해져야 하나

어차피 이 세가지는 아파치 웹서버와 PHP만 연동이 되는 상황에서 <? php    ?> 이 하나면 끝날 문제이다.


다만 이번에 PHP를 다루다보니 삽질을 하나 하게 됐던 것이 있는데

바로 쉘 명령어를 돌리게 됐다고 해도 이새끼가 가려서 받는다는 것이다.


PHP에서 기본적으로 System() 함수로 돌아가는 쉘 명령어는 루트 권한이 아니다.

당장 system 함수로 whoami를 돌리면 현재 세션이나 root가 아니라 www-data 라는 계정이 튀어나오고

sudo를 먹여준다고 해도 sudoer에 포함되어있지 않기에 요청을 할 수도 없으며

그나마도 interactive한 UI를 짜지 않았다면 요청이 들어와도 크게 할 수 있는 일은 없다.

그래서인지 ls, whoami, uname -a같이 결과를 출력하는 것들은 (에러 리턴 빼고) 모두 잘 보여주는데

정작 시스템을 건드려야 돌아가는 네트워크나 셧다운같은 명령어는 전혀 먹히지 않았다.


그러다가 막상 든 생각이 "아 씨팔 이게 루트가 아니라서 안돌아가나" 라는 생각이었는데

이는 똑같은 바이너리를 참조해서 돌려도 시스템을 직접 다루지 않는 명령어는 모두 정상적으로 돌아갔기 때문이다.

그래서 막상 찾아보니 정말 문제는 루트 권한이 www-data 라는 계정에 주어지지 않아서 생겼던 일이었다.


따라서 이걸 해결하려면

위에 나온 화면처럼 sudoers 파일을 수정해줘야 하는데

vi를 다룰 수 있다면 visudo로 수정해도 될 것이고

아니라면 그냥 nano를 써서 수정해도 될 것이다.


할 일은 그냥 존나 간단하다.

sudoers 파일의 가장 맨 마지막 줄에

"www-data ALL=NOPASSWD:ALL"를 넣어주고 재부팅을 하면 되며

이렇게 한 이후에 sudo를 요청하면 rm -rf /까지 완벽하게 지원되는 무소불위의 권력을 휘두르는 어마어마한 PHP가 되어 그대 앞에 나타날 것이다.


물론 웹서버로서 돌아가는 녀석인지라

sudoers에서 명령어를 따로 제한해두거나 위의 PHP 쉘 접근을 제한하지 않는다면

언제 어느 순간 들어온지도 모를 브루트포싱 짱깨한테 후장까지 털려 커널까지 날아가는 일이 생길 수도 있다.


어우 시발 속 시원해

728x90

댓글