Intro
사용자가 입력 값 조작을 통해 원하는 시스템 명령어를 실행 시킬 수 있는 취약점으로 시스템을 조작할 수 있기에 매우 취약하다.
Detect & Exploit
Detect
서버측 코드에서 아래와 같은 함수를 사용하면 사용자 입력 값이 시스템 명령어로 활용될 수 있다.
언어 | 함수 |
---|---|
Java | System.*, 특히 System.runtime 취약, Runtime.exec() |
C/C++ | system(), exec(), ShellExecute() |
python | exec(), eval(), os.system(), os.popen(), subprocess.popen(), subprocess.call() |
Perl | open(), sysopen(), system(), glob() |
php | exec(), system(), passthru(), popen(), rquire(), include(), eval(), preg_replace(), shell_exec(), proc_open(), eval() |
사용자 입력 값이 들어가는 부분이 명령어 뒷 부분이라면 아래 메터문자를 통해 체인을 만들어 한 줄로 여러 명령어를 실행할 수 있다.
메타문자 | 설명 |
---|---|
` | 명령어 치환 ` 안에 들어있는 명령어를 실행한 결과로 치환 | |
$() |
명령어 치환 $() 안에 들어있는 명령어를 실행한 결과로 치환, 중복 사용 가능 |
&& | 명령어 연속 실행 한 줄에 여러 명령어를 사용하고 싶을 때 사용. 앞 명령어에서 에러가 발생하지 않아야 뒷 명령어 실행 |
; |
명령어 구분자 한 줄에 여러 명령어를 사용하고 싶을 때 사용. ; 은 단순히 명령어 구분을 위해 사용하며, 앞 명령어의 에러 유무와 관계 없이 뒷 명령어 실행 |
그 외 |
. , >, », &>, >&, <, {}, ?, *, ~ |
Exploit
가령 핑을 날리는 기능이 있다고 가정했을 때,
이와 같이 체인을 만들어 원하는 명령어를 실행 시킬 수 있다
Bypass - 인수 주입 벡터
GTFOBins의 경우 잘못된 구성을 가진 시스템에서의 우회(주로 권한 상승에 사용)이고, 해당 인수 주입 벡터의 경우 기존의 인수를 활용하여 명령어를 주입하는 우회 방안이다.
인수 주입 벡터로 만약 서버측에서 보안조치를 & # ; ' | * ? ~ < > ^ ( ) [ ] { } $ \ , \x0A \xFF
와 같은 특수문자로만 했다면, 명령어 옵션을 활용하여 우회할 수 있는 기법이다.
인수주입벡터 참조
Security Measures
근본적인 문제를 해결하기 위해 취약한 함수 ( system(), exec() 등 )를 사용하지 않고 개발을 하는 방법이 가장 좋다.
부득이하게 시스템 명령을 사용할 수 있는 함수를 사용해야 한다면 입력값을 검증할 수 있는 로직을 구현하여 부적절한 입력값을 제한한다.
최소 권한의 원칙을 적용하여 각 시스템 계정마다 적절한 권한을 부여함으로써 공격에 당하더라도 피해가 최소화될 수 있도록 한다.