R's Hacking Daily Log

OS Command Injection (2) & Lab (2) 본문

Port Swigger/Command Injection

OS Command Injection (2) & Lab (2)

hanhxx 2023. 6. 3. 13:03

Blind OS command injection vulnerabilities

앞에서 살펴본 command injection은 공격자가 입력한 Command 결과를 확인할 수 있었다.

Lab1에서와 같이 Check stock 버튼을 눌렀을 때 재고가 출력되는 부분에 Whoami command 결과가

나타나는 것을 확인했을 것이다. 

 

하지만 반대로 command 결과를 확인할 수 없는 Blind 취약점일 경우도 존재한다. 

Blind라는 개념을 이해하기 위해 다음과 같은 상황을 상상해 보자.

:) 사용자가 피드백을 작성할 수 있는 사이트

:) 사용자가 자신의 이메일과 피드백 내용을 입력

:) 서버에서는 피드백을 받으면 해당 내용으로 메일을 만들어 Administrator에게 전달

 

 

이때 서버에서는 다음과 같은 command를 실행한다고 한다.

mail -s "This site is great" -aFrom:peter@normal-user.net feedback@vulnerable-website.com

사용자가 입력한 This site is great라는 피드백을 메일을 전송하게 되는 데

이때 사용자는 mail command를 실행에 대한 그 어떤 결과도 받지 않는다. 

 

서버에서 실행된 command의 결과를 응답으로 받지 않는 경우, 결과가 어떤 지, 실행이 된 건지 알 수 없다. 

이런 경우를 blind라고 한다. 

 

공격자의 입장에서는 blind이기 때문에 command가 실행되었는 지 확인할 수 있는 대안이 필요하다..!

Blind 상황에서 활용할 수 있는 기술 중 첫 번째로 Time delay에 대해서 살펴보도록 하자.

 

 

 

Detecting blind OS command injection using time delays

Blind sql injection와 비슷하게 Time delay를 유도하는 command를 사용함으로써 서버가 응답하는 데 걸리는 시간을

기준으로 명령이 실행되었는 지 확인할 수 있다. 

 

이를 위해 ping command를 활용해보자.

ping command는 ICMP packet을 보내 응답이 오는 지의 여부로 상대가 network에 정상적으로 연결되어 있는지

확인하고자 할 때 사용한다. 

 

& ping -c 10 127.0.0.1 &

위의 명령은 127.0.0.1(→ping을 실행할 대상 주소)로 10개의 ICMP packet을 보내라는 의미이다. 

ping은 기본적으로 다음 packet을 보내기까지 1초 동안의 interval이 존재한다.

 

따라서 위의 명령을 실행은 10개 packet = 10초 동안의 실행 시간이 소비되도록 하는 것이다. 

 

 

 

Lab - Blind OS command injection with time delays

:) 피드백 기능에 blind os command injection 취약점이 존재하는 서버

:) 서버는 사용자가 입력한 정보를 바탕으로 shell command를 실행

:) 서버가 실행한 command에 대해서는 그 어떤 결과도 제공되지 않는 상황 

 

Blind os command injection attack으로 10초 간의 delay를 발생시키는 것이 이번 Lab의 목표이다. 

 

 

 

Lab에 들어가면 우측 상단에 "Submit feedback" 버튼이 위치해 있다.

 

 

feedback form을 입력해서 하단의 버튼을 클릭하면 

 

 

서버로 feedback이 제출되었음을 알 수 있는 문구가 출력된다. 

 

 

 

이때 만들어진 packet내용을 보니 csrf & name & eamil & subject & message parameter가 보인다.

이 packet이 서버로 날아가면 feedback form 내용을 기반으로 어떤 command가 실행될 것이다.

 

공격자는 10s delay를 유도하는 command를 form 내용에 주입해

서버의 command가 실행될 때 공격자의 command도 실행되도록 해야 한다. 

 

 

위와 같이  $() 안에 실행시키고자 하는 명령어를 입력하면 

서버에서 name 값을 가져다 command를 만들 때, command 속의 command로 들어가게 된다. 

 

 

mail -s "feedback" -aFrom: HH@abc.com ~~

본문의 예시처럼 mail command가 실행된다고 한다면 -s option에서는 subject 내용이,

email 내용은 -aFrom에 들어갈 것이다.

 

message, name 값도 서버의 command 어딘가에 사용이 될 텐데 이때 $(ping -c 10 127.0.0.1)이 

중간에 들어가게 되면 

 

mail -s "feedback" -aFrom: HH@abc.com ~~ HH$(ping -c 10 127.0.0.1) ~~

name 값이 HH가 들어가는 부분에 연이어 ping command 내용이 들어가게 된다. 

즉, 서버의 command 속에 command가 들어가게 되는 것이다. 

 

&, |, ||, &&, ; 와 같은 separator를 사용하면 mail command가 중간에 끊겨서 mail command가 실행되지 않을 수 있다. 

그렇기 때문에 $() or ` `을 사용해서 command 안에 들어갈 수 있는 형태로 만들어줘야 한다. 

 

** $() or ``을 사용해서 command 속에 command로 주입하는 것을 inline이라 표현한다. 

 

 

위에서 command를 주입한 packet을 보내면 10초 동안의 delay가 발생되고 그 이후에 response를 받게 된다. 

 

따라서 response에는 그 어떤 내용도 나타나지 않지만 response를 받는 시간을 조절함으로써 

Blind os command injection을 수행할 수 있었다. 

'Port Swigger > Command Injection' 카테고리의 다른 글

Access Control - Lab (2)  (0) 2023.06.13
OS Command Injection (3) & Lab (3)  (0) 2023.06.04
OS Command Injection (1) - Lab (1)  (0) 2023.06.02
OS Command Injection (1)  (0) 2023.06.01
Command Injection  (0) 2022.11.17
Comments