해킹

LFI, RFI

멧둥 2023. 2. 3. 09:22

* LFI와 RFI 공격의 취약점 발생 지점

→ LFI 공격과 RFI 공격은 include() 또는 require() 함수를 사용할 때 발생할 수 있는 취약점이다.

include() 또는 require() 함수는 다른 파일을 불러와 현재 파일의 일부인 것처럼 사용하는 함수이다.

주로 웹 페이지를 만들 때 웹 페이지의 각 부분을 나눠서 제작한 뒤 include 기능을 사용해서
각 부분들을 조합해 하나의 페이지를 만든다

 

 

 

* LFI (Local File Inclusion)

공격 대상 서버에 존재하는 파일을 include 함수의 입력값으로 전달해 파일을 열람할 수 있는 취약점

 

→ 현재 쿼리스트링으로 웹 서버의 어떤 파일을 웹 페이지에 포함시킬지 결정할 수 있는 상태이다. 

 

→ page 쿼리 스트링의 page 파라미터 값을 /etc/passwd로 변경해서 페이지를 요청하면 웹 서버에 존재하는 /etc/passwd(사용자 계정정보) 정보를 웹 페이지에 포함시켜 응답으로 받게 된다.

 

 

 

* RFI (Remote File Inclusion)

원격 서버(공격자 서버)에 존재하는 파일을 include 시켜서 공격자 서버에 존재하는 악성 파일을 실행

시킬 수 있는 취약점

 

→ 먼저 공격자 측의 /var/www/html(기본적으로 웹페이지들이 위치하는곳) 디렉터리에 RFI를 테스트하기 위한 test.html을 만든다. test.html의 내용은 "RFI Test" 문자열이다.

 

→ RFI 공격을 하기 위해 공격자 측의 ip 주소를 알아낸다

 

http://192.168.45.230/test.html 을 page 파라미터의 값으로 넘겨줘서 웹 서버에 페이지를 요청하면 공격자 측에 위치한 test.html 파일을 현재 페이지에 포함시켜 응답해준다. 현재 페이지에 "RFI Test" 문구가 포함된 모습이 보인다.

 

 

 

* RFI를 이용한 리버스쉘

→ RFI를 응용하면 공격자 측에 위치한 shell.php(리버스쉘을 포함하고있는 php파일)을 현재 페이지에 포함시켜 서버 측에서 공격자 측으로 연결 요청을 하도록해 서버에 임의의 명령을 내릴 수 있다, 이때 공격자는 미리 포트를 리스닝 상태로 둔다. 

 

→ 포함시킬 페이지(파일)은 기본적으로 /var/www/html 디렉터리에 찾으므로 /var/www/html 디렉터리에 shell.php를 생성해둔다. shell.php 파일은 공격자의 리스닝 포트로 연결 요청을 하는 동작을 담고 있다. 

 

→ 공격자는 리버스쉘을 위해 7777 포트를 리스닝 포트로 지정해둔다.

 

→ 공격대상 페이지에서 page 매개변수로 http://192.168.45.230/shell.php 를 지정해서 페이지를 요청함으로써 원격에 존재하는 공격자 측(192.168.45.230)의 shell.php 파일이 현재 페이지에 포함되어 실행되도록 한다.

 

→ 공격대상 웹서버가 공격자 측으로 연결 요청(리버스쉘)을 하고 공격자는 웹 서버의 제어권을 넘겨 받는다

여기서 id 명령어를 입력해봤을 때 www-data (웹 서버가 기본적으로 일반 작업에 사용하는 사용자) 사용자가 나오는 것으로 보아 웹서버의 권한을 획득한 것으로 볼 수 있다.

 

※ www-data 사용자를 따로 만들어 사용하는 이유

만약 파일의 소유자를 root로 지정한 경우 root의 권한 (uid=0, gid=0)으로 파일을 실행할 수 있을 것이다.

참고로 사용자의 권한을 체크할 때 uid와 gid 값 비교를 통해 체크한다.

root 사용자인 경우 많은 권한으로 시스템에 접근할 수 있기 때문에 권한을 제한하기 위해서 www-data라는 사용자를 만들 때 uid와 gid가 0이 아닌 값으로 사용자를 만들어 사용한다.