Command Injection [3]

DATE : 2023/10/01

OS Command Injection - Blind

앞에서 살펴봤던 Command Injection [2]에서는

whoami command의 결과를 response page에서 확인할 수 있었다.

하지만 이는 command injection에 대해 아무런 조치도 취하지 않은 상황으로

주입한 command의 결과는 실제 그 결과를 얻기 보다는 Blind로 처리될 때가 많다.

여기서 Blind는 말 그대로 실제 결과 값을 볼 수 없는 상태로

정확히 어떤 결과가 나왔는지 알 수 없기 때문에

"명령어의 결과가 무엇이냐"를 따지기 보다는 "명령어가 실행되었는가"의 여부를

확인하는 방향으로 공격이 이루어진다.

정확한 어떤 값을 response로 얻을 수 없는 상태를 Blind,

그런 상태에서 실행하는 command injection을 Blind Command Injection이라 한다.

이번 POST부터는 Blind Command Injection에 대해 다룰 예정!


[ LABs - Blind Command Injection ]

LAB에 들어가면 우측 상단에 "Submit feedback" 버튼을 볼 수 있다.

이 버튼을 누르면 사이트에 대한 피드백을 보낼 수 있는 form이 등장한다.

form에는 이름, 메일, 제목, 피드백 정도의 정보를 입력하게 되어있고

아무렇게나 form을 입력해서 "Submit feedback" 버튼을 누르면

성공적으로 피드백이 전달되었을 경우, "Thank you for submitting feedback!" 문구를 볼 수 있다.

위와 같이 form을 작성해 보냈을 때의 packet을 살펴보면

body 부분에 csrf, name, email, subject, message parameter 값이 들어있다.

각 parameter는

(1) csrf : csrf token

(2) name : form에 입력한 username

(3) email : form에 입력한 mail

(4) subject : form에 입력한 제목

(5) message : form에 입력한 피드백 내용

값을 의미한다.

즉 form에 작성한 내용이 각각의 parameter 값으로 전달되고

server는 이 parameter 값을 가져다가 mail command를 실행하는 것이다.

mail -s "feedback" -aFrom:sender's email receiver's email

server에서 실행하는 Command 내용이 위와 같을 때,

form의 정보를 바탕으로 실행될 명령어를 예측해보면

mail -s "this site very white..." -aFrom:mario@super.com feedback@vulnerable-website.com

이와 같을 수 있다.

즉, server는 parameter 중 message & email 값을 넣어 mail command를 실행시킨다는 것!!

우리의 목표는 ping command를 실행시켜 10초 동안의 delay를 만드는 것으로

parameter 값을 조작해 mail command 속에서 ping command가 실행되도록 해야 한다.

packet을 가져와 Repeater에서 확인해보면

message 뒤에 실행시킬 명령어를 이어 붙여도 response가 오기까지 delay가 발생하는 걸 볼 수 있다.

마찬가지로 email 뒤에 명령어를 주입해도 delay가 발생하는 걸 볼 수 있다!!

(response 부분이 백지라는 건 아직 request가 다 처리되지 않았다는 의미이다.)

여기서 확인하고 넘어가고자 하는 건

(1) email & message parameter 둘 다 명령어를 주입하기에 적합하다는 것과

(2) Command injection을 위해 $() or `` 을 사용한다는 것이다.

여기서 LAB을 해결할 방법을 고민해보자.

server는 request로 전달된 parameter를 가져다 mail command를 실행하다는 사실을 알고 있다.

작성된mail command에는 email & message parameter가 사용되므로

이 parameter 중 하나에 주입할 명령어를 이어 붙일 것이다.

문제는 주입한 명령어가 명령어로써 서버에 인식되어야 한다는 것인데

mail -s "feedback ping -c 10 127.0.0.1" -aFrom:mario@super.com ~~

message parameter에 명령어를 주입했다고 하면 위와 같이 피드백 내용으로 명령어가 들어갈 수 있고

mail -s "feedback" -aFrom:mario@super.comping -c 10 127.0.0.1 ~~~

email parameter에 명령어를 주입하면 -aFrom 부분에 그 내용이 들어갈 것이다.

이렇게 되면 독립적인 명령어로써 동작할 수 없기 때문에 separator를 사용해야 한다!

저번 LAB처럼 || or && or | or & 등을 사용할 수도 있지만 조금 색다르게

inline execution 기호인 $() or ``을 사용해보았다.

$() 기호 안에 실행시키고자 하는 명령어를 입력해 주면

10초 간의 delay 후에 성공적으로 LAB을 해결했다는 banner를 볼 수 있을 것이다!!


이처럼 명령어의 결과를 얻을 수 없는 경우,

주입한 명령어가 정상적으로 실행되었는 지의 유무를 알기 위해서 time delay를 발생 시키는 것이

하나의 blind command injection의 사례가 될 수 있다.

참고로 위에서 사용한 명령어, ping -c 10 127.0.0.1은 10개의 packet을 127.0.0.1로 보내라는 의미이다.

127.0.0.1은 보통 서버 자신이기 때문에 서버에서 time delay를 발생시키기 위해서

localhost로 packet을 보내도록 명령어를 입력한 것이다.

Last updated