yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

Command injection 공격 실습 본문

웹/웹 해킹

Command injection 공격 실습

yehey 2020. 10. 1. 22:56
실습 환경: DVWA-Command injection, kali 리눅스

Command injection 공격 실습

 

다음과 같은 페이지에서 실습을 한다!

입력창에 IP 주소를 입력하면 해당 IP 주소로 ping 명령어를 실행한 후 그 결과를 출력해주는 페이지다.

한번 127.0.0.1을 입력하고 결과를 확인해보자 (127.0.0.1은 local IP 주소)

 

다음과 같이 ping 명령어를 실행한 결과가 출력된다.

 

view source를 눌러 해당 페이지의 소스코드를 보자

<?php

if( isset( $_POST[ 'Submit' ]  ) ) {
    // Get input
    $target = $_REQUEST[ 'ip' ];	//입력받은 IP주소가 target에 저장

    // Determine OS and execute the ping command.
    if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
        // Windows
        $cmd = shell_exec( 'ping  ' . $target );	//target을 포함해 시스템 명령어를 내림
        						//ex) ping 127.0.0.1 로 시스템 명령어 실행
    }
    else {
        // *nix
        $cmd = shell_exec( 'ping  -c 4 ' . $target );	//target을 포함해 시스템 명령어를 내림
    							//ex) ping -c 4 127.0.0.1  로 시스템 명령어 실행
    }	

    // Feedback for the end user
    echo "<pre>{$cmd}</pre>";
}

?> 

우리가 입력한 IP주소를 시스템 명령어의 일부로 포함해서 전달하는 것을 볼 수 있다.

우리는 리눅스이기 때문에 ping -c 4 127.0.0.1로 전달되어 실행되고 그 결과를 출력해준다.

그런데 시스템 명령어를 전달할 때 변수 target에 대한 검증과정이 없기 때문에 우리가 추가적으로 실행되길 원하는 명령어를 넣을 수 있다. 그렇게 되면 ping 명령어와 함께 실행된다!

 

우선 리눅스 터미널에서 ping 명령어와 ls 명령어를 ;를 사용해 한번에 실행되게 해보자

리눅스에서는 ; 을 사용하고 윈도우에서는 &&를 사용한다.

(일종의 테스트라고 생각하면 될 듯, php코드에서도 shell_exec를 이용해 시스템 상에서 실행하기 때문에 그 환경을 재현? 하는 듯)

 

두가지 방식으로 입력해 보았는데,

1번째는 IP 주소를 정확히 입력한 ping 명령어와 ls 명령어를 한번에 전달했고, ping의 결과 이후 ls의 결과가 출력되는 것을 볼 수 있다.

2번째는 IP 주소를 입력하지 않은 ping 명령어와 ls 명령어를 전달한 것인데 (입력창에 바로 ;ls 를 입력한 것과 같은 효과) ping의 경우 IP주소가 없어 실행에 실패했지만 그와 상관없이 ls는 실행되었다.

 

즉, IP주소가 틀리거나 입력되지 않아도 ;로 묶여 전달된 다른 명령어는 잘 실행되어 결과가 나온다는 뜻!

한번 DVWA에서 두가지 경우 다 실행해보겠음!!

127.0.0.1;ls 를 입력한 경우
;ls 만 입력한 경우

ls의 결과는 잘 실행된다!

사실 ping의 결과는 우리가 원하는 결과가 아니기 때문에 이제 IP주소는 입력하지 않을 것임

 

이제 호스트의 사용자 목록을 확인해보자 (;cat /etc/passwd   passwd 파일 확인)

;cat /etc/passwd 결과

이렇게 사용자 목록이 출력되었다.

 

우리가 command injection 공격을 하면서 시스템 명령어를 실행하기 때문에 해당 사용자가 가지고 있는 권한에 따라 실행할 수 있는 명령어가 있고 실행할 수 없는 명령어가 있다.

사용자 권한을 확인하기 위해 사용하는 명령어로는 id 가 있다.

;id 입력 결과

현재 명령어는 www-data 사용자 권한으로 실행되고 있다. (www-data에게 허용된 권한의 명령어만 사용할 수 있다.)

예를 들어 위에서 ls 명령어를 통해 얻은 파일 중 source 파일을 열려고 시도하면 (;cat source)

ping에 IP주소를 입력하지 않아 결과가 출력되지 않았던 것 처럼 cat source의 결과가 출력되지 않는다.

이 말은 www-data 권한이 source 파일을 열기에는 부족하다는 뜻이다.

 

그렇기 때문에 공격자는 대부분 root 권한을 얻길 원한다. 

그래서 여기서 추가적으로 '권한 상승(privilege escalation) 공격'을 시도한다.

 

 

' > 웹 해킹' 카테고리의 다른 글

Stored XSS 공격 실습  (0) 2020.10.08
Reflected XSS 공격 실습  (0) 2020.10.04
SQL injection 실습3 (Blind)  (0) 2020.09.30
SQL injection 실습2 (ORDER BY & UNION)  (0) 2020.09.30
SQL injection 실습1 (WHERE 구문 우회)  (0) 2020.09.29
Comments